diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 0c880342c7..fecd3e9ac2 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -10,91 +10,79 @@ for the change: they are accountable for reviewing, testing, and standing behind they are the only committer/author of record. An AI byline would blur that — it reads as a second party sharing responsibility for a change only one person actually owns. -## Architecture (Nuxt-first, 11ty being phased out) +## Architecture -The site is migrating from Eleventy (11ty) to Nuxt 3. Nuxt is the primary framework going forward; 11ty is being phased out section by section using a strangler-fig pattern. +One Nuxt application serves the whole site. It was generated by Eleventy (11ty) until +September 2026, and page groups were moved across one at a time using a strangler-fig +pattern; that migration is finished and Eleventy is gone. A `.njk` filename or a `src/` +path in a comment names what a page used to be, not a file that still exists. -- **Primary framework**: Nuxt 3 (`nuxt/`) with `@nuxt/content` v3 for content-driven pages -- **Legacy SSG**: Eleventy (11ty) v3, source in `src/`, output to `_site/` — being phased out -- **Strategy**: Nuxt is the front door. In dev, Nuxt proxies un-migrated routes to 11ty (port 8080). In production, `nuxt generate` produces the final output. -- **CSS**: Tailwind v3 via PostCSS → `_site/css/style.css` (shared between both) -- **Templates (legacy)**: Nunjucks (`.njk`) + Markdown (11ty only) -- **Search**: Algolia (`scripts/index-algolia.js`) -- **Hosting**: Netlify; final output from `nuxt generate` - -### Migration status - -| Section | Status | -|---------|--------| -| `/handbook/**` | **Migrated** — served by Nuxt (`nuxt/content/handbook/`) | -| `/docs/**` | **Migrated** — served by Nuxt; source resolved from `flowfuse/flowfuse` at build time | -| All other routes | Still on 11ty, proxied through Nuxt in dev | - -### New pages belong in Nuxt - -Never create a new `.njk` page under `src/` — even a landing/marketing page that looks like the fastest way to match an existing 11ty page's pattern. Build it in Nuxt (`nuxt/pages/`, `.vue`/`.md`) instead; only edits to already-existing 11ty pages belong in `src/`. `nuxt/lib/legacy-pages.test.mjs` enforces this with no allowlist to maintain: it fetches main and fails `npm test` (and therefore the required `test_website / Build and check` PR check) if any `.njk` file under `src/` didn't already exist there — i.e. a brand-new `.njk` file, anywhere in `src/`, on any route. Editing an existing `.njk` file is unaffected. - -This is scoped to `.njk` on purpose and does not extend to `.md`: new content in `src/blog/`, `src/changelog/`, `src/customer-stories/`, `src/webinars/`, and `src/blueprints/` (new posts, entries, blueprints) is expected routine work and must keep landing there unchanged, no matter how this section reads out of context. The gap this leaves — a brand-new page built as a bare `.md` file against an *existing* layout, with no new `.njk` involved — is real and not caught by the test; avoiding that is a matter of following this rule, not something enforced automatically. See `/handbook/marketing/website#new-pages-must-be-built-in-nuxt` for the non-engineer-facing explanation. +- **Framework**: Nuxt 4 (`nuxt/`) with `@nuxt/content` v3 for content-driven pages +- **Content**: markdown and YAML in `nuxt/content/`; two collections are synced in from + other repositories at build time (product docs, the Blueprint Library) +- **Files served as-is**: `nuxt/public/`, a tracked asset tree rather than build output +- **CSS**: two Tailwind v4 builds on every page: `nuxt/assets/css/style.css`, compiled by PostCSS to `nuxt/public/css/style.css`, and `nuxt/assets/css/theme.css`, bundled by Nuxt and loaded second +- **Search**: Algolia (`scripts/index-algolia.js`), indexed from the built output +- **Hosting**: Netlify, from `nuxt/dist` ### Production build order ``` -clean:nuxt → build:js:nuxt → blueprints → prod:postcss-nuxt → prod:eleventy-nuxt → prod:nuxt +clean:nuxt → build:js:nuxt → prod:postcss-nuxt → prod:nuxt ``` -The `docs-source` Nuxt module runs automatically during `prod:nuxt` and calls `nuxt/lib/docs-sync.mjs` to resolve `docs/` from `flowfuse/flowfuse` (see **Local docs development** below). 11ty outputs to `nuxt/public/` so Nuxt can serve 11ty-generated assets. `nuxt/public/` is gitignored (fully build-generated). - -The `blueprints` step resolves `src/blueprints/` from `FlowFuse/blueprint-library` (private) via `nuxt/lib/blueprints-sync.mjs` — same local → sibling → clone precedence as docs, but the clone step authenticates with a minted GitHub App installation token (`GH_BOT_APP_ID`/`GH_BOT_APP_KEY`) since that repo isn't public. Netlify deploys straight from `main`; there is no `live` branch anymore. - -`GH_BOT_APP_KEY` is stored in Netlify as the PEM private key **Base64-encoded** (Netlify's env var UI rejects multiline values) — `nuxt/lib/github-app-token.mjs` decodes it before use. Rotating the key means re-encoding the new PEM to Base64 before saving it, not pasting the PEM in directly. +Two Nuxt modules run during `prod:nuxt` and resolve content that does not live here: +`docs-source` calls `nuxt/lib/docs-sync.mjs` for the product docs from `flowfuse/flowfuse` +(see **Local docs development** below), and `blueprints-source` calls +`nuxt/lib/blueprints-sync.mjs` for the Blueprint Library from `FlowFuse/blueprint-library`. +Both write into `nuxt/content/
` and `nuxt/public/
`, and both of those +pairs are gitignored: never edit them, a sync overwrites them. ## Dev commands ```bash -npm start # all watchers in parallel (11ty + nuxt + postcss + blueprints) -npm run dev # eleventy + postcss + nuxt only -npm run dev:eleventy # 11ty only, port 8080 (legacy; most work doesn't need this) -npm run dev:nuxt # Nuxt only, port 3000 — use this for handbook, docs, and migrated pages +npm run dev # everything: Nuxt on port 3000, plus the postcss, docs and blueprint watchers +npm run dev:nuxt # Nuxt only, without the watchers npm run docs # resolve product docs into nuxt/content/docs, no build -npm run build # production build +npm run blueprints # resolve the Blueprint Library, no build +npm run build:nuxt # full build (Netlify production runs build:nuxt:skip-images, then index:algolia) ``` -> When working on the handbook, docs, or other migrated sections, `npm run dev:nuxt` is sufficient. `npm start` is only needed when also touching 11ty-served pages. For product docs, add `npm run dev:docs` beside it: that watcher re-syncs each edited page, and without it a docs edit only appears after a restart. `npm run dev` and `npm start` already include it. +> `npm run dev` is the normal entry point. For product docs its `dev:docs` watcher re-syncs +> each edited page; `npm run dev:nuxt` on its own does not include it, and without it a docs +> edit only appears after a restart. > > **Local docs development:** a checkout of `flowfuse/flowfuse` sitting next to this repo (`../flowfuse`) is picked up automatically, with no configuration. Full resolution order, which every build logs: `FLOWFUSE_DOCS_LOCAL` (explicit path, and a path that does not exist is an error), then a sibling checkout, then a clone of `FLOWFUSE_DOCS_REF` (default `main`) — this is what Netlify production deploys use. CI relies on the sibling rule: `FlowFuse/flowfuse`'s `Publish Documentation` workflow checks itself out next to the website so a docs PR is validated against its own changes. ## Directory layout ``` -src/ -├── _data/ # Global data files (authors, tags, site config, etc.) -├── _includes/ -│ ├── layouts/ # Nunjucks layout templates -│ └── components/ # Reusable partials -├── blog/ # Blog posts → /blog/YYYY/MM/slug/ -├── changelog/ # Changelog entries → /changelog/YYYY/MM/slug/ -├── customer-stories/ # Case studies → /customer-stories/slug/ -├── css/ # Tailwind + custom CSS -├── images/ # Static images -└── public/ # Pass-through static files nuxt/ -├── content/ +├── content/ # @nuxt/content sources (see content.config.ts for the collections) +│ ├── blog/ # Blog posts → /blog/YYYY/MM/slug/ +│ ├── changelog/ # Changelog entries → /changelog/YYYY/MM/slug/ +│ ├── customer-stories/ +│ ├── webinars/ │ ├── handbook/ # Handbook pages (edit here) -│ └── docs/ # Product docs (build-generated, gitignored — do not edit) -├── modules/ -│ └── docs-source.ts # Wires docs into Nuxt; resolution lives in nuxt/lib/docs-sync.mjs -├── composables/ -│ ├── useHandbookNav.ts -│ └── useDocsNav.ts +│ ├── docs/ # Product docs (synced, gitignored, do not edit) +│ └── blueprints/ # Blueprint Library (synced, gitignored, do not edit) +├── content-guides/ # This repo's own /docs pages, overlaid onto the synced docs tree +├── data/ # JSON/YAML the app imports directly (site, nav, team, guests) +├── assets/ +│ ├── css/ # Tailwind entry point and the stylesheets it imports +│ ├── icons/ # The `ff` icon collection (i-ff-* names), complete SVG files only +│ ├── nav-icons/ # FlowFuse's own icon art behind and the nav, some of it bare fragments +│ └── js/ # cookieconsent-config.js, bundled by build:js:nuxt +├── public/ # Served as-is: images, downloads, favicons (tracked) +├── modules/ # docs-source.ts, blueprints-source.ts +├── lib/ # Plain-JS helpers with node --test unit tests +├── server/ # Nitro: api/, routes/, plugins/, lib/, assets/ ├── components/ -│ ├── HandbookLeftNav.vue -│ └── DocsLeftNav.vue +├── composables/ +├── utils/ └── pages/ - ├── handbook/[...slug].vue - └── docs/[...slug].vue -scripts/ # Build-time scripts (copy_blueprints.js, etc.) -lib/ # Shared helpers used by .eleventy.js and scripts -.eleventy.js # Main Eleventy config +scripts/ # sync_docs.mjs, sync_blueprints.mjs, their watchers, index-algolia.js +lib/ # search-index.js, shared with scripts/index-algolia.js ``` --- @@ -103,9 +91,9 @@ lib/ # Shared helpers used by .eleventy.js and scripts ### Blog posts -**Source:** `src/blog/YYYY/MM/{slug}.md` +**Source:** `nuxt/content/blog/YYYY/MM/{slug}.md` **URL:** `/blog/YYYY/MM/{slug}/` -**Layout:** `layouts/post.njk` +**Rendered by:** `nuxt/pages/blog/[...slug].vue` ```yaml --- @@ -113,7 +101,7 @@ title: "Post title" subtitle: "Optional subtitle" description: "SEO meta description" date: 2026-04-09 -authors: ["username"] # must match an entry in src/_data/team/ or guests/ +authors: ["username"] # must match an entry in nuxt/data/team/ or guests/ image: /blog/YYYY/MM/images/hero.png video: "youtube_id" # optional tags: @@ -131,7 +119,7 @@ cta: # optional call-to-action block --- ``` -Tag options are defined in `src/_data/blogTags.json`. Future-dated posts are excluded from collections until their date arrives. +Tag options are defined in `nuxt/data/blogTags.json`. Future-dated posts are excluded from collections until their date arrives, in production builds only; deploy previews and dev show them. #### Inline Image CTAs (`CtaImage`) @@ -146,9 +134,9 @@ Tag options are defined in `src/_data/blogTags.json`. Future-dated posts are exc ### Changelog entries -**Source:** `src/changelog/YYYY/MM/{slug}.md` +**Source:** `nuxt/content/changelog/YYYY/MM/{slug}.md` **URL:** `/changelog/YYYY/MM/{slug}/` -**Layout:** `layouts/post-changelog.njk` +**Rendered by:** `nuxt/pages/changelog/[...slug].vue` ```yaml --- @@ -163,7 +151,7 @@ issues: # optional GitHub issue links --- ``` -Each year has a `src/changelog/YYYY/YYYY.json` that tags the collection. +Collection config: `nuxt/content.config.ts` (defines the `changelog` collection). --- @@ -248,9 +236,9 @@ layout: redirect ### Customer stories -**Source:** `src/customer-stories/{slug}.md` +**Source:** `nuxt/content/customer-stories/{slug}.md` **URL:** `/customer-stories/{slug}/` -**Layout:** `layouts/story.njk` +**Rendered by:** `nuxt/pages/customer-stories/[slug].vue` ```yaml --- @@ -276,45 +264,58 @@ story: --- ``` -Collection config: `src/customer-stories/customer-stories.json` +Collection config: `nuxt/content.config.ts` (defines the `stories` collection) + +--- + +### Blueprints + +**Source:** `FlowFuse/blueprint-library`, one `//README.md` per blueprint. +Not editable here: a blueprint change is a PR to that repository. +**URL:** `/blueprints/{category}/{slug}/` +**Rendered by:** `nuxt/pages/blueprints/[category]/[slug].vue`; listed, 12 per page, by +`nuxt/pages/blueprints/index.vue` and `[page].vue` through `BlueprintListing.vue` + +`nuxt/modules/blueprints-source.ts` resolves the library and `nuxt/lib/blueprints-sync.mjs` +copies it in: the markdown into `nuxt/content/blueprints//.md` (image paths +rewritten, the git date recorded as `updated`), the screenshots and `flow.json` into +`nuxt/public/blueprints///`. Both are gitignored here. + +Resolution order, the same precedence as the docs: `FLOWFUSE_BLUEPRINTS_LOCAL`, then a +sibling `../blueprint-library` checkout, then a clone of `BLUEPRINTS_REF` (default `main`). The library is private, so the clone +authenticates with a minted GitHub App installation token (`GH_BOT_APP_ID`/`GH_BOT_APP_KEY`, +see `nuxt/lib/github-app-token.mjs`), and a build without those credentials skips it and +keeps whatever is already in `nuxt/content/blueprints`. The clone is what Netlify production +deploys use: Netlify deploys straight from `main`, and there is no `live` branch anymore. + +`GH_BOT_APP_KEY` is stored in Netlify as the PEM private key **Base64-encoded** (Netlify's env var UI rejects multiline values) — `nuxt/lib/github-app-token.mjs` decodes it before use. Rotating the key means re-encoding the new PEM to Base64 before saving it, not pasting the PEM in directly. --- -## Global data (`src/_data/`) +## Global data (`nuxt/data/`) + +Imported directly by components and by `nuxt.config.ts`, rather than queried as content. | File | Purpose | |------|---------| -| `site.json` | Global site config (URL, name, etc.) | +| `site.json` | Global site config (URL, app URL, messaging) | +| `chrome.json` | The mega nav and the footer link lists | +| `navHighlights.json` | The promoted cards in the nav dropdowns | | `blogTags.json` | Valid blog tag values | | `team/` | Staff author profiles | | `guests/` | Guest author profiles | -| `companies/` | Customer company records | | `testimonials.json` | Pull-quote testimonials | -| `events.yaml` | Event calendar | -| `features.json` | Product feature catalog | -| `integrations.js` | Integration listings | -| `eleventyComputed.js` | Dynamic computed properties | - -## Layouts - -| Layout | Used by | -|--------|---------| -| `layouts/base.njk` | HTML shell | -| `layouts/post.njk` | Blog posts | -| `layouts/post-changelog.njk` | Changelog entries | -| `layouts/documentation.njk` | Node-RED learning resources (with sidebar nav) | -| `layouts/story.njk` | Customer stories | -| `layouts/nohero.njk` | General pages without hero | +| `events.yaml` | Event banner calendar | ## Redirects -**Add new redirects to `nuxt/redirects.ts`, not `netlify.toml`.** Nuxt is the front door for every route now, so retired-route redirects are handled as native Nitro route rules (`{ redirect: { to, statusCode: 301 } }`) keyed by the old path. `netlify.toml`'s `[[redirects]]` blocks are legacy and reserved for edge-level concerns that predate Nuxt (domain aliasing: `flowforge.com`/`flowfuze.com`/`flowfuse.io` → `flowfuse.com`) — don't add page-to-page redirects there. +**Add new redirects to `nuxt/redirects.ts`, not `netlify.toml`.** Nuxt is the front door for every route now, so retired-route redirects are handled as native Nitro route rules (`{ redirect: { to, statusCode: 301 } }`) keyed by the old path. `netlify.toml`'s `[[redirects]]` blocks are reserved for the cases Nitro's route rules cannot express: domain aliasing (`flowforge.com`/`flowfuze.com`/`flowfuse.io` → `flowfuse.com`), old URLs that differ from the canonical one only in case (a Nitro rule matches case-insensitively and would redirect the canonical URL to itself), and one URL that differs only by a percent-encoded space (Nitro matches the decoded path). Don't add ordinary page-to-page redirects there. This also covers old `/docs/**` paths left behind by a rename in `flowfuse/flowfuse`'s `docs/` tree (e.g. a doc file renamed to fix a `nuxt-link-checker` `no-underscores` warning) — add the old path here so bookmarks/indexed links 301 instead of 404ing once the rename ships. ## Call-to-Action components -Both frameworks have their own implementation of the same system — Vue components on Nuxt, Nunjucks macros on 11ty (see **11ty equivalent** below). The rendering/styling code itself is kept in sync by hand (Vue and Nunjucks share nothing at that level), but the *data* — event name, href, and fixed label per destination — lives in one file, `src/_data/ctaDestinations.json`, imported by both the Vue components and the Nunjucks macros (via a Nunjucks global, see below) so the two can't drift apart on copy or event names without both sides being touched. `site.json`'s `appURL` is combined with `ctaDestinations`' `hrefSuffix` for `signUp`/`signIn`, since the base URL differs per environment and doesn't belong duplicated a third time in `ctaDestinations.json`. +The *data* (event name, href, and fixed label per destination) lives in one file, `nuxt/lib/cta-destinations.ts`, read by every `Cta*.vue` component and by `CtaCustom.vue`, so no call site carries its own copy of the copy or the event name. `site.json`'s `appURL` supplies the base URL for `signUp`/`signIn`, since it differs per environment. There are exactly five CTA destinations, each with its own component with **fixed copy and href** (a PostHog audit found dozens of different button texts pointing at the same handful of URLs, which made it impossible to tell which copy converted best — see `/handbook/marketing/website#call-to-action-buttons` for the non-engineer-facing explanation and a live gallery of every variant): @@ -345,7 +346,7 @@ This exists because a raw `event` prop would let two different `CtaCustom` insta There's no `size` prop — every real-button variant's padding/font-size is hardcoded to match `.ff-btn` exactly (see the Computed-tab note in the gotchas below), so a size knob would only ever have affected icon dimensions. It was removed once confirmed nothing used a non-default value. -Click tracking: `capture(event, { position, variant, plan? })` via `nuxt/composables/useCapture.ts`, which wraps the global `window.capture()` from `src/_includes/analytics/body.html` (shared with 11ty, no-ops without analytics consent). Event names: `cta-sign-up`, `cta-sign-in`, `cta-contact-us`, `cta-book-demo`, `cta-pricing`. +Click tracking: `capture(event, { position, variant, plan? })` via `nuxt/composables/useCapture.ts`, which wraps the global `window.capture()` from `nuxt/server/assets/analytics/body.html` (a Nitro server asset injected by `nuxt/server/plugins/analytics.ts` in production builds only, so `capture()` is absent in dev and deploy previews; it no-ops without analytics consent). Event names: `cta-sign-up`, `cta-sign-in`, `cta-contact-us`, `cta-book-demo`, `cta-pricing`. ### Gotchas already solved here (don't re-discover them) @@ -355,17 +356,7 @@ Click tracking: `capture(event, { position, variant, plan? })` via `nuxt/composa - **`.handbook-content a` must exclude Nuxt UI components, or use `:where()`.** A plain `.handbook-content a { color: ... }` rule (even layered) beats a `UButton`'s own utility classes if it has higher specificity, flattening any Cta* button rendered inside handbook markdown to a plain link color. Fixed by moving the rule into `@layer base` and using `:where(a)` to zero out its added specificity, so any component's own classes win normally (same file as above). - **`not-prose` on a wrapper also strips Tailwind Typography's code-block styling** (the dark background on `
`) for anything nested inside it, not just its own prose text styling. `nuxt/components/content/CtaExample.vue` (the handbook's live example gallery) doesn't use `not-prose` for this reason, even though it also renders non-prose button/grid markup.
 - **The `ui` prop override doesn't reach compoundVariants-driven classes.** The gotcha above (full-string replacement) only applies to the app.config-level base extension; UButton's own `variant`/`color`-driven classes (e.g. `ghost`'s `hover:bg-{color}/10`) are computed separately and still get merged in via `tv()` regardless of what `ui.base` says. `CtaButton.vue`'s ghost color classes explicitly add `hover:bg-transparent` to cancel that default hover background, since a ghost CTA should have none at all.
-- **UButton's `to` prop treats any same-origin-looking path as a Nuxt route, even if Nuxt doesn't serve it.** `CtaButton.vue` takes a fixed (non-caller-configurable) `external` prop per destination, set by each `Cta*` wrapper — `true` when the href still points at an 11ty-served route (would otherwise 404 via client-side Vue Router instead of reaching the 11ty proxy), `false` once that route is served by Nuxt. `CtaContactUs`/`CtaBookDemo` now set `false` — `/contact-us` and `/book-demo` are Nuxt routes (`nuxt/pages/contact-us/index.vue`, `nuxt/pages/book-demo/index.vue`). `CtaSignUp`/`CtaSignIn` set `false` too, moot since those hrefs are already cross-origin.
-
-### 11ty equivalent
-
-`src/_includes/components/cta/` holds five Nunjucks macros (`ctaSignUp`, `ctaSignIn`, `ctaContactUs`, `ctaBookDemo`, `ctaPricing`) mirroring the Vue components above — same fixed copy/href/event per destination, same `{ position, variant }` capture payload (no `preview` or `external` prop: 11ty has no handbook gallery to guard against, and every `` is a real page load already, no Vue Router to fight). All five delegate to a shared `ctaButton` macro in the same folder (`cta-button.njk`) for the actual class-building/tracking, same relationship as `CtaButton.vue` to its wrappers.
-
-No `plan` param on the 11ty side — that's only used on the pricing table, which is Nuxt-only (there's no 11ty pricing page to call it from). If 11ty ever grows a caller that needs it, add it back rather than passing it unused today.
-
-`ctaSignUp`/`ctaSignIn` take `site` as their first argument (`site.appURL` for the href) instead of reading it from the calling template's context — Nunjucks macros don't inherit the caller's context unless explicitly imported `with context`, and passing `site` explicitly avoids relying on that import mode everywhere the macro is used.
-
-Every hand-written `` pointing at one of the five destinations has been migrated to these macros — there should be no new ones. A link to a URL outside the five fixed destinations (e.g. `/ai/`) is not part of this system and stays hand-written.
+- **UButton's `to` prop treats any same-origin-looking path as a Nuxt route, even if Nuxt doesn't serve it.** `CtaButton.vue` takes a fixed (non-caller-configurable) `external` prop per destination, set by each `Cta*` wrapper. Every one of the five is `false` now that Nuxt serves every route; the prop exists because `CtaCustom` links off-site, and because a path Nuxt does not serve would 404 through client-side Vue Router rather than reaching the server.
 
 ## Icons
 
@@ -373,7 +364,7 @@ Every hand-written `` pointing at one of the five destinat
 
 `` renders as a masked ``, not an `` — no intrinsic aspect ratio, so give it an explicit size (`w-6 h-6`) rather than `w-full h-full`.
 
-**FlowFuse's own custom icon art** lives as raw SVGs in `src/_includes/components/icons/*.svg`:
+**FlowFuse's own custom icon art** lives as raw SVGs in `nuxt/assets/nav-icons/*.svg`:
 - **Header/nav:** `nuxt/utils/navIcons.ts` + `NavIcon.vue`, which renders a real inline `` — needed because the header's CSS targets `` elements directly, which a `` span doesn't have.
 - **Everywhere else:** a one-off SFC under `nuxt/components/icons/` (e.g. `GithubIcon.vue`) with the SVG pasted into the template:
   ```vue
@@ -384,9 +375,16 @@ Every hand-written `` pointing at one of the five destinat
   ```
   Nuxt auto-imports it by folder + filename, used directly like any other component: `` (see `AppFooter.vue`).
 
+`NavIcon` also draws icons that page content names, such as a hero's `eyebrowIcon`. Eight glyphs exist in both folders (arrows, layers, pin, pin-slash, pulse, snowflake, target-view, uns); four of them differ only in sizing attributes, so an art change needs making in both.
+
+Keep that art out of `nuxt/assets/icons/`. That directory is the `ff` Nuxt Icon collection (``), which parses every file in it at build time and fails the build on a bare `` fragment, which several of the nav icons are.
+
 ## Naming conventions
 
 - All slugs: **kebab-case**
 - Blog/changelog: folder path mirrors publish date (`YYYY/MM/`)
-- Images for a post live alongside it: `src/blog/YYYY/MM/images/`
-- Author usernames must match a file in `src/_data/team/` or `src/_data/guests/`
+- Images for a post live at the matching path under `nuxt/public/`: a post at
+  `nuxt/content/blog/YYYY/MM/{slug}.md` references `./images/x.png`, which
+  `nuxt/utils/remark-handbook-links.ts` resolves against the post's own path, so the file goes in
+  `nuxt/public/blog/YYYY/MM/images/x.png`
+- Author usernames must match a file in `nuxt/data/team/` or `nuxt/data/guests/`
diff --git a/.claude/launch.json b/.claude/launch.json
index 3de9d180de..09dc658308 100644
--- a/.claude/launch.json
+++ b/.claude/launch.json
@@ -1,13 +1,6 @@
 {
   "version": "0.0.1",
   "configurations": [
-    {
-      "name": "eleventy",
-      "runtimeExecutable": "npm",
-      "runtimeArgs": ["run", "dev:eleventy"],
-      "port": 8080,
-      "autoPort": true
-    },
     {
       "name": "nuxt",
       "runtimeExecutable": "npm",
diff --git a/.eleventy.js b/.eleventy.js
deleted file mode 100644
index b63b3ce151..0000000000
--- a/.eleventy.js
+++ /dev/null
@@ -1,871 +0,0 @@
-const path = require("path");
-const util = require("util");
-const fs = require("fs");
-
-const { EleventyRenderPlugin } = require("@11ty/eleventy");
-
-const pluginRSS = require("@11ty/eleventy-plugin-rss");
-const syntaxHighlight = require("@11ty/eleventy-plugin-syntaxhighlight");
-const pluginMermaid = require("@kevingimbel/eleventy-plugin-mermaid");
-const codeClipboard = require("eleventy-plugin-code-clipboard");
-const htmlmin = require("html-minifier-terser");
-const markdownIt = require("markdown-it");
-const markdownItAnchor = require("markdown-it-anchor");
-const markdownItFootnote = require("markdown-it-footnote");
-const markdownItAttrs = require('markdown-it-attrs');
-const spacetime = require("spacetime");
-const { minify } = require("terser");
-const codeowners = require('codeowners');
-const pluginTOC = require('eleventy-plugin-toc');
-const { decodeHTML } = require('entities');
-const imageHandler = require('./lib/image-handler.js')
-const site = require("./src/_data/site");
-const { isSearchPage, isSearchUrl, extractHeadingRecords } = require("./lib/search-index.js");
-const yaml = require("js-yaml");
-const eleventyNavigationPlugin = require("@11ty/eleventy-navigation");
-
-// Documentation alert boxes
-const shortcodeMarkdown = new markdownIt()
-
-const CALLOUT_ICONS = {
-    note: ``,
-    warning: ``,
-    caution: ``,
-}
-
-function renderDocsAlertBox(content, tone = 'note') {
-    const normalizedTone = tone.toLowerCase();
-    const icon = CALLOUT_ICONS[normalizedTone] || CALLOUT_ICONS.note
-    const markdownContent = shortcodeMarkdown.render(content)
-    const contentWithIcon = markdownContent.replace(/^(<\w[^>]*>)/, `$1${icon}`)
-    return `
${contentWithIcon}
` -} - -// Skip slow optimizations when developing i.e. serve/watch or Netlify deploy preview -const DEV_MODE = process.env.ELEVENTY_RUN_MODE !== "build" || process.env.CONTEXT === "deploy-preview" -// Image processing is skipped in dev mode or when explicitly requested via SKIP_IMAGES. -// Kept separate from DEV_MODE so build-time image flags never affect analytics/consent script inclusion. -const SKIP_IMAGES = DEV_MODE || process.env.SKIP_IMAGES === 'true' -const DEPLOY_PREVIEW = process.env.CONTEXT === "deploy-preview"; -const IMAGE_BUILD_PROFILE = process.env.IMAGE_BUILD_PROFILE || "full"; - -console.info(`[11ty] Image build profile: ${IMAGE_BUILD_PROFILE}`) - -module.exports = function(eleventyConfig) { - - eleventyConfig.addDataExtension("yaml", contents => yaml.load(contents)); // Add support for YAML data files - eleventyConfig.setUseGitIgnore(false); // Nothing generated into src/ is gitignored any more; kept until 11ty itself is retired - eleventyConfig.setWatchThrottleWaitTime(500); // in milliseconds - eleventyConfig.setFrontMatterParsingOptions({ - excerpt: true, - excerpt_separator: "", - excerpt_alias: "excerpt" - }); - - // Set DEV_MODE_POSTS to true if the context is not 'production' - const DEV_MODE_POSTS = process.env.CONTEXT !== "production"; - - // The filter excludes blog posts with a date in the future for the production website. - let processedPosts = {}; - eleventyConfig.addFilter('isFuturePost', (post) => { - const isFuturePost = post.date && post.date > new Date(); - if (isFuturePost && !processedPosts[post.title]) { - let text = DEV_MODE_POSTS ? 'Including' : 'Excluding'; - let formattedDate = eleventyConfig.getFilter('shortDate')(post.date); - console.log(`[11ty/eleventy-base-blog] ${text} ${post.title} scheduled for ${formattedDate}`); - processedPosts[post.title] = true; - } - return isFuturePost && !DEV_MODE_POSTS; - }); - - // Define a filter named 'isFutureDate' - eleventyConfig.addFilter('isFutureDate', (dateString) => { - const date = new Date(dateString); - return date && date > new Date(); - }); - - eleventyConfig.addFilter('extractH1Content', (content) => { - if (!content) return ''; - - const match = content.match(/]*>([\s\S]*?)<\/h1>/); - - if (match) { - const textContent = match[1].replace(/<\/?[^>]+>/gi, '').trim(); - return textContent; - } - - return null; - }); - - eleventyConfig.addFilter("excludeCurrent", (items, currentUrl) => { - return items.filter(item => item.url !== currentUrl); - }); - - eleventyConfig.addFilter("shuffle", (array) => { - const shuffled = [...array]; - for (let i = shuffled.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; - } - return shuffled; - }); - - // Add a global data variable for the current date - eleventyConfig.addGlobalData("currentDateISO", new Date().toISOString()); - - // Make filters globally accessible - global.isFuturePost = eleventyConfig.getFilter('isFuturePost'); - global.isFutureDate = eleventyConfig.getFilter('isFutureDate'); - global.extractH1Content = eleventyConfig.getFilter('extractH1Content'); - - // Layout aliases - eleventyConfig.addLayoutAlias('default', 'layouts/base.njk'); - eleventyConfig.addLayoutAlias('page', 'layouts/page.njk'); - eleventyConfig.addLayoutAlias('nohero', 'layouts/nohero.njk'); - eleventyConfig.addLayoutAlias('catalog', 'layouts/catalog.njk'); - eleventyConfig.addLayoutAlias('redirect', 'layouts/redirect.njk'); - - // Copy the contents of the `public` folder to the output folder - eleventyConfig.addPassthroughCopy({ - "src/public/": "/", - }); - - // Naive copy of images for backwards compatibility of non short-code image handling (use of { - delete require.cache[ctaDestinationsPath] - const fresh = require(ctaDestinationsPath) - Object.keys(ctaDestinations).forEach(key => delete ctaDestinations[key]) - Object.assign(ctaDestinations, fresh) - }) - - // make global accessible in src/_includes/layouts/base.njk for loading of PH scripts - eleventyConfig.addGlobalData('POSTHOG_APIKEY', () => process.env.POSTHOG_APIKEY || '' ) - eleventyConfig.addGlobalData('DEV_MODE', () => DEV_MODE || DEV_MODE_POSTS) - eleventyConfig.addGlobalData('deployPreview', DEPLOY_PREVIEW) - - // Custom Tooltip "Component" - eleventyConfig.addPairedShortcode("tooltip", function (content, text) { - return `${content}` - }); - - eleventyConfig.addPairedShortcode("blueCard", function(content) { - const md = new markdownIt(); - let markdownContent = md.render(content); - return `
${markdownContent}
`; - }); - - // Documentation alert boxes - eleventyConfig.addPairedLiquidShortcode('note', function (content) { - return renderDocsAlertBox(content, 'note') - }) - - eleventyConfig.addPairedLiquidShortcode('warning', function (content) { - return renderDocsAlertBox(content, 'warning') - }) - - eleventyConfig.addPairedLiquidShortcode('caution', function (content) { - return renderDocsAlertBox(content, 'caution') - }) - - - let flowId = 0; // Keep a global counter to allow more than one - eleventyConfig.addPairedShortcode("renderFlow", function (flow, height = 200) { - flowId++; // Increment the flowId to allow multiple flows on the same page - - return `
- ` - }); - - eleventyConfig.addFilter("filterNodeCategory", function(nodes, category) { - if (category === "all") { - return nodes; - } else { - return nodes.filter(node => node.tags.includes(category)); - } - }); - - // Custom filters - eleventyConfig.addFilter("json", (content) => { - return JSON.stringify(content) - }); - - // Resolves a chrome.json href of the form "site:" against site.json, - // so single-sourced values (e.g. the job board URL) aren't duplicated as - // literal strings in the shared nav/footer data. Anything else passes through. - eleventyConfig.addFilter("resolveHref", (href, site) => { - if (typeof href === "string" && href.startsWith("site:")) { - return site[href.slice("site:".length)] - } - return href - }); - - eleventyConfig.addFilter("fromJson", (content) => { - try { - return JSON.parse(content); - } catch (e) { - console.error("Error parsing JSON:", e); - return content; - } - }); - - eleventyConfig.addFilter("head", (array, n) => { - if( n < 0 ) { - return array.slice(n); - } - return array.slice(0, n); - }); - - eleventyConfig.addFilter("limit", (arr, limit) => arr.slice(0, limit )); - - // Marketing image for a nav highlight card: the linked page's image front matter - eleventyConfig.addFilter("pageImageForUrl", (collection, url) => { - const normalized = url && !url.endsWith("/") ? `${url}/` : url; - const match = (collection || []).find((p) => p.url === normalized); - return (match && match.data && match.data.image) || null; - }); - - eleventyConfig.addFilter('console', function (value) { - const str = util.inspect(value, { showHidden: false, depth: null }); - return `
${unescape(str)}
;` - }); - - - eleventyConfig.addFilter('dictsortBy', function(val, reverse, attr) { - let array = []; - for (let k in val) { - // Preserve the key (slug) by adding it to the object - array.push({...val[k], _key: k}); - } - - array.sort((t1, t2) => { - var a = t1[attr]; - var b = t2[attr]; - - return a > b ? 1 : (a === b ? 0 : -1); // eslint-disable-line no-nested-ternary - }); - - return array - }); - - eleventyConfig.addFilter('shortDate', dateObj => { - return spacetime(new Date(dateObj)).format('{date} {month-short}, {year}') - }); - - // Filter to safely convert values to Date objects - eleventyConfig.addFilter('toDate', value => { - if (!value) return new Date(); - if (value instanceof Date) return value; - return new Date(value); - }); - - eleventyConfig.addFilter('formatNumber', num => { - if (num === undefined || num === null) return '0'; - return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); - }); - - eleventyConfig.addFilter('md', (content) => { - if (!content) return ''; - const md = new markdownIt({ - html: true, - }) - .use(markdownItAnchor, { - permalink: markdownItAnchor.permalink.headerLink() - }); - return md.render(content); - }); - - eleventyConfig.addFilter('stripFirstH1', (str) => { - if (!str) return str; - - // Remove the first h1 heading from the content to avoid duplicate h1 tags - // This is typically the package name which is already shown in the page header - return str.replace(/]*>.*?<\/h1>/, ''); - }); - - eleventyConfig.addFilter('rewriteIntegrationLinks', (str, integration) => { - if (!str) return str; - - // First pass: collect all actual anchor IDs from the HTML - const anchorIds = new Set(); - const anchorIdRegex = /id="([^"]+)"/g; - let anchorMatch; - while ((anchorMatch = anchorIdRegex.exec(str)) !== null) { - anchorIds.add(anchorMatch[1]); - } - - // Convert relative links in README to absolute links - const matcher = /((href|src)="([^"]*))"/g; - let match; - const result = str.replace(matcher, (fullMatch, group1, attr, url) => { - // Skip absolute URLs and mailto links - if (/^(http|https|mailto:)/.test(url)) { - return fullMatch; - } - - // Handle same-page anchor links - try to fix broken anchors - if (url.startsWith('#')) { - const targetAnchor = url.substring(1); - - // If the anchor doesn't exist, try to find a close match - if (!anchorIds.has(targetAnchor)) { - // Try to find anchors that match if we add periods back - // e.g., "migration-from-012-or-earlier" -> "migration-from-0.1.2-or-earlier" - for (const existingAnchor of anchorIds) { - // Remove all periods from existing anchor and compare - const normalizedExisting = existingAnchor.replace(/\./g, ''); - if (normalizedExisting === targetAnchor) { - // Found a match! Use the correct anchor - return `${attr}="#${existingAnchor}"`; - } - } - } - - return fullMatch; - } - - // Convert relative links to repository links if available - if (integration.repository && integration.repository.url) { - const repoUrl = integration.repository.url - .replace('git+', '') - .replace('.git', '') - .replace('git://', 'https://'); - - // Handle different types of relative paths - if (url.startsWith('./') || url.startsWith('../')) { - const cleanUrl = url.replace(/^\.\.?\//, ''); - return `${attr}="${repoUrl}/blob/master/${cleanUrl}"`; - } else if (url.startsWith('/')) { - // Repository-relative paths (e.g., /CHANGELOG.md) - const cleanUrl = url.replace(/^\//, ''); - return `${attr}="${repoUrl}/blob/master/${cleanUrl}"`; - } else if (!url.startsWith('#')) { - // Simple relative paths without prefix - return `${attr}="${repoUrl}/blob/master/${url}"`; - } - } - - return fullMatch; - }); - - return result; - }); - - - eleventyConfig.addFilter('duration', mins => { - if (mins > 60) { - const hrs = Math.floor(mins/60) - return `${hrs}h ${mins%60}m` - } - else { - return `${mins} mins` - } - }); - - eleventyConfig.addFilter('inFuture', (posts) => { - // filter posts/webinars that only occurred in the past - if (posts) { - return posts.filter((post) => { - const postDate = spacetime(post.data.date) - return postDate.isAfter(spacetime.today()) || postDate.isSame(spacetime.today(), 'day') - }) - } else { - return null - } - }); - - eleventyConfig.addFilter('inPast', (posts) => { - // filter posts/webinars that only occured in the past - return posts.filter((post) => { - const postDate = spacetime(post.data.date) - return postDate.isBefore(spacetime.today()) - }) - }); - - eleventyConfig.addFilter('dateInFuture', (date) => { - // return true is the provided date is in the past, otherwise, return false - const postDate = spacetime(date) - return postDate.isAfter(spacetime.today()) || postDate.isSame(spacetime.today(), 'day') - }); - - eleventyConfig.addFilter('countDays', (date) => { - // return true is the provided date is in the past, otherwise, return false - const postDate = spacetime(date) - const now = spacetime.now().startOf('day') - const days = now.diff(postDate, 'day') + 1 - if (days === 0) { - return { value: 0, text: 'Today'} - } else if (days === 1) { - return { value: 1, text: 'Tomorrow'} - } else { - return { value: days, text: `${days} Days Away`} - } - }); - - eleventyConfig.addFilter("truncate", function(text, maxWordCount) { - if (text === undefined || text === null || text === "") { - return ""; - } - - text = String(text); - const split = text.split(" "); - if (split.length <= maxWordCount) { - return text; - } - return text.split(" ").splice(0, maxWordCount).join(" ") + "..." - }); - - - eleventyConfig.addFilter("striptags", function(text) { - return decodeHTML(String(text).replace(/<[^>]+>/g, "")); - }); - - eleventyConfig.addFilter("readingTime", function(content) { - if (!content) { - return 1; - } - const words = String(content).replace(/<[^>]+>/g, " ").split(/\s+/).filter(Boolean).length; - return Math.max(1, Math.ceil(words / 200)); - }); - - eleventyConfig.addFilter("restoreParagraphs", function(str) { - const content = new String(str); - return "

"+content.split(/\.\n/).join(".

")+"

" - }); - - eleventyConfig.addFilter("toAbsoluteUrl", function(url) { - return new URL(url, site.baseURL).href; - }) - - eleventyConfig.addFilter("stripLinks", function(text) { - return String(text).replace(/]*>([\s\S]*?)<\/a>/gi, '$1'); - }); - - eleventyConfig.addFilter("handbookBreadcrumbs", (url) => { - let parts = url.split("/").filter(e => e !== ''); - if (parts[parts.length-1] === "index") { - parts.pop(); - } - - let path = ""; - return "/"+parts.map(p => { - let url = `${path}/${p}`; - path = url; - return `
${p}` - }).join("/") - }); - - eleventyConfig.addFilter("rewriteHandbookLinks", (str, page) => { - const isIndexPage = /(README.md|index.md)$/i.test(page.inputPath) - - return str.replace(/(href|src)="([^"]*)"/g, (full, attr, url) => { - if (/^(http|#|mailto:)/.test(url)) { - return full - } - url = url.replace(/.md(#.*)?$/, '$1') - url = url.replace(/README(#.*)?$/, '$1') - if (url[0] !== '/' && !isIndexPage) { - url = '../'+url - } - - return `${attr}="${url}"` - }) - }) - - eleventyConfig.addFilter("handbookEditLink", (page) => { - let baseUrl = 'https://github.com/FlowFuse/website/edit/main/' - let filePath = page.inputPath - - if (/^\/docs/.test(page.url)) { - pathElements = page.inputPath.split(path.sep) - - if (pathElements[pathElements.length - 1] === "index.md") { - pathElements[pathElements.length - 1] = "README.md" - } - - filePath = path.join(...pathElements.slice(2)) - baseUrl = 'https://github.com/FlowFuse/flowfuse/edit/main/' - } - - return baseUrl+filePath.replace(/^.\//,'') - }) - - eleventyConfig.addFilter("pageOwners", (page) => { - // Eleventy's inputPath is relative, we need to drop the './' in front - return new codeowners().getOwner(page.inputPath.substring(2)) - }); - - eleventyConfig.addFilter("ghUsersToTeamMembers", (ghUsers, team) => { - let teamMembers = []; - for (let i = 0; i < ghUsers.length; i++) { - const ghUser = ghUsers[i]; - - Object.keys(team).forEach(function (member) { - if (team[member].github === ghUser.substring(1)) { - teamMembers.push(team[member]) - } - }) - } - - return teamMembers - }); - - eleventyConfig.addFilter("relatedPosts", function (collection = []) { - const { tags: requiredTags, page } = this.ctx; - return collection - .map(post => { - const commonTags = requiredTags?.reduce((count, tag) => count + (post.data.tags?.includes(tag) ? 1 : 0), 0); - return { ...post, commonTags }; - }) - .filter(post => post.url !== page.url && post.commonTags >= requiredTags.length - 1) - .sort((a, b) => b.commonTags - a.commonTags || b.date - a.date) - .slice(0, 5); - }); - - // Custom async filters - eleventyConfig.addNunjucksAsyncFilter("jsmin", async function (code, callback) { - try { - const minified = await minify(code); - callback(null, minified.code); - } catch (err) { - console.error("Terser error: ", err); - // Fail gracefully. - callback(null, code); - } - }); - - eleventyConfig.addShortcode("renderTeamMember", function (teamMember) { - // When the author is no longer at FlowFuse - if (typeof teamMember === "undefined" || teamMember === null) { - return `
-
-
- -
-
` - } - - return `
-
-
- - ${teamMember.title} -
-
` - }); - - eleventyConfig.addShortcode("renderIntegration", function (integration) { - return `
- - -
` - }); - - eleventyConfig.addShortcode("year", () => `${new Date().getFullYear()}`); - - function loadSVG (file) { - let relativeFilePath = `./src/_includes/components/icons/${file}.svg`; - let data = fs.readFileSync(relativeFilePath, function(err, contents) { - if (err) return err - return contents - }); - return data.toString('utf8'); - } - - eleventyConfig.addFilter("templateExists", function(name){ - return fs.existsSync(name) - }) - - eleventyConfig.addShortcode("ffIconLg", function(icon, isSolid) { - const svg = loadSVG(icon) - if (!isSolid) { - return `${svg}` - } else { - return `${svg}` - } - }); - - eleventyConfig.addPairedShortcode("navoption", function(content, label, link, depth, icon, iconSolid, addClasses) { - let svg, iconSvg = '', classes, chevron - if (icon) { - svg = loadSVG(icon) - if (!iconSolid) { - iconSvg = `${svg}` - } else { - iconSvg = `${svg}` - } - } - if (content) { - classes = "ff-nav-dropdown relative hover:cursor-pointer " + (addClasses || '') - } else { - classes= (addClasses || '') - } - - if (content) { - const chevronDown = loadSVG('chevron-down') - // data-nav-section labels every link inside this panel for nav-click - // tracking (src/js/nav-tracking.js), independent of styling classes. - return `
  • ${iconSvg}${label}${chevronDown}${content}
  • ` - } else if (link) { - return `
  • ${iconSvg}${label}
  • ` - } else { - return `
  • ${iconSvg}${label}
  • ` - } - }); - - // Eleventy Image shortcode - // https://www.11ty.dev/docs/plugins/image/ - if (SKIP_IMAGES) { - console.info(`[11ty] Image pipeline is enabled in dev mode, copying images without any conversion or resizing`) - } else { - console.info(`[11ty] Image pipeline is enabled in prod mode, expect a wait for first build while images are converted and resized`) - } - - eleventyConfig.addAsyncShortcode("image", async function imageShortcode(src, alt, widths, sizes) { - const title = null - const currentWorkingFilePath = this.page.inputPath - - return await imageHandler(src, alt, title, widths, sizes, currentWorkingFilePath, eleventyConfig, async=true, SKIP_IMAGES) - }); - - /* - Window chrome around a recording of a terminal session. Shared by the Device - Agent page and release posts so every frame looks the same; the frame's own - padding scales with the viewport, see .ff-terminal-frame in style.css. - The recording is deliberately not zoomable: the frame is the point, and a - zoom overlay on an animated GIF restarts it out of context. - */ - eleventyConfig.addAsyncShortcode("terminalFrame", async function terminalFrameShortcode(src, alt, width) { - const maxWidth = Number(width) || 1000 - const currentWorkingFilePath = this.page.inputPath - - const image = await imageHandler(src, alt, null, [maxWidth], null, currentWorkingFilePath, eleventyConfig, async=true, SKIP_IMAGES) - - return `
    -
    - - - -
    -
    ${image}
    -
    ` - }); - - eleventyConfig.addAsyncShortcode("tileImage", async function(item, image, defaultImage, defaultDescription, imageSize, title = null, priority = false) { - let imageSrc, imageDescription; - - if (item && item.data && item.data.image) { - // item.data.image exists - imageSrc = `./${item.data.image}`; - imageDescription = `Image representing ${item.data.title}`; - } else if (image) { - // image exists - imageSrc = `./${image}`; - imageDescription = `Image representing ${title}`; - } else { - // use default values - imageSrc = defaultImage; - imageDescription = defaultDescription; - } - - const currentWorkingFilePath = this.page.inputPath; - - return await imageHandler(imageSrc, imageDescription, title, [imageSize], null, currentWorkingFilePath, eleventyConfig, async=true, SKIP_IMAGES, priority); - }); - - // Placeholder: docs nav collection removed (docs served by Nuxt) - // Docs nav moved to Nuxt; this empty collection keeps left-nav.njk from erroring - eleventyConfig.addCollection('nav', function() { return {} }); - - eleventyConfig.addCollection("aiBlog", function(collectionApi) { - return collectionApi.getFilteredByTag("ai").filter(item => { - return !item.data.tags || !item.data.tags.includes("blueprints"); - }); - }); - - eleventyConfig.addCollection("homeLogos", function () { - const logosDir = path.join(__dirname, "src/images/home-logos"); - const logos = fs.readdirSync(logosDir) - .filter(file => file.endsWith(".svg") || file.endsWith(".png")) - .map(file => path.join("images/home-logos", file)); - - return logos; - }); - - eleventyConfig.addCollection("publications", function(collectionApi) { - return collectionApi.getAll().filter(item => { - return item.data.tags && (item.data.tags.includes("whitepaper") || item.data.tags.includes("ebook")); - }).map(item => { - item.data.tags = item.data.tags.map(tag => { - if (tag.toLowerCase() === 'whitepaper') { - return 'Whitepaper'; - } else if (tag.toLowerCase() === 'ebook') { - return 'eBook'; - } - return tag; - }); - return item; - }); - }); - - - - // Plugins - eleventyConfig.addPlugin(EleventyRenderPlugin) - eleventyConfig.addPlugin(pluginRSS) - eleventyConfig.addPlugin(syntaxHighlight) - eleventyConfig.addPlugin(codeClipboard) - eleventyConfig.addPlugin(pluginMermaid) - eleventyConfig.addPlugin(eleventyNavigationPlugin); - - eleventyConfig.addPlugin(pluginTOC, { - tags: ['h2', 'h3', 'h4'], - wrapper: 'div', - wrapperClass: 'toc', - ul: true, - }); - - const markdownItOptions = { - html: true, - } - - const markdownItAnchorOptions = { - permalink: markdownItAnchor.permalink.headerLink() - } - - const markdownLib = markdownIt(markdownItOptions) - .use(markdownItAnchor, markdownItAnchorOptions) - .use(markdownItFootnote) - .use(markdownItAttrs) - .use(codeClipboard.markdownItCopyButton, { - iconifyUrl: '', - additionalButtonClass: 'mdi mdi-content-copy', - iconStyle: 'background: initial', - }) - - markdownLib.renderer.rules.image = function (tokens, idx, options, env, self) { - const token = tokens[idx] - - const imgSrc = token.attrGet('src') - const imgAlt = token.content - const imgTitle = token.attrGet('title') - - // Get all the attributes of the image - const attributes = token.attrs.reduce((acc, attr) => { - acc[attr[0]] = attr[1]; - return acc; - }, {}); - - const folderPath = env.page.inputPath - - // Check if the image has the 'data-zoomable' attribute - const widths = 'data-zoomable' in attributes ? [1920] : [650]; // maximum width an image can be displayed at as part of blog prose - - const htmlSizes = null - - const async = false // cannot run async inside markdown - - try { - let imageHtml = imageHandler(imgSrc, imgAlt, imgTitle, widths, htmlSizes, folderPath, eleventyConfig, async, SKIP_IMAGES) - - // Add the additional attributes to the image - for (let attr in attributes) { - if (attr !== 'src' && attr !== 'alt' && attr !== 'title') { - imageHtml = imageHtml.replace(' { - const hrefIndex = tokens[idx].attrIndex('href'); - if (hrefIndex >= 0) { - let href = tokens[idx].attrs[hrefIndex][1]; - const classIndex = tokens[idx].attrIndex('class'); - - // Exclude the link if it has the class 'header-anchor' - if (classIndex >= 0 && tokens[idx].attrs[classIndex][1] === 'header-anchor') { - return self.renderToken(tokens, idx, options); - } - - // Ensure the URL has a trailing slash, but do not update if it contains a '#' or ends with '.md' or https - if (!href.endsWith('/') && !href.includes('#') && !href.endsWith('.md') && !href.endsWith('.zip') && !href.includes('https')) { - href += '/'; - } - - tokens[idx].attrs[hrefIndex][1] = href; - } - return self.renderToken(tokens, idx, options); - }; - - - eleventyConfig.setLibrary("md", markdownLib) - - if (!DEV_MODE) { - console.info(`[11ty] Output HTML will be minified, expect a short wait`) - eleventyConfig.addTransform("htmlmin", async function (content) { - if (this.page.outputPath && this.page.outputPath.endsWith(".html")) { - let minified = await htmlmin.minify(content, { - collapseBooleanAttributes: true, - collapseWhitespace: true, - conservativeCollapse: true, - preserveLineBreaks: true, - removeComments: true, - - removeEmptyAttributes: true, - removeRedundantAttributes: true, - useShortDoctype: true, - }) - - return minified - } - - return content - }) - } - - return { - dir: { - input: "src" - } - } -}; diff --git a/.eleventyignore b/.eleventyignore deleted file mode 100644 index ee51ade6ad..0000000000 --- a/.eleventyignore +++ /dev/null @@ -1,15 +0,0 @@ -# Changelog and blog are served by Nuxt (nuxt/content.config.ts sources these files -# directly); 11ty must not also render them. -src/changelog/**/*.md -src/blog/**/*.md - -# Customer stories listing page is served by Nuxt (nuxt/pages/customer-stories/index.vue). -# The individual story markdown files are NOT ignored here - they keep `permalink: false` -# (src/customer-stories/customer-stories.json) instead, so `collections.stories` stays -# populated for the few live 11ty pages that still read it (src/landing/tulip.njk, -# src/node-red/index.njk, src/_includes/stories-block.njk) without 11ty writing output files. -src/customer-stories.njk - -# Webinars are served by Nuxt (pages/webinars/, sourced from these files via the -# `webinars` collection in nuxt/content.config.ts); 11ty must not also render them. -src/webinars/**/*.md \ No newline at end of file diff --git a/.gitignore b/.gitignore index ec3c5c932c..f878a98dc9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,19 @@ .DS_Store -_site node_modules -src/handbook/media nuxt/content/docs/ -# Synced from FlowFuse/blueprint-library by nuxt/modules/blueprints-source.ts. The -# Build Site workflow force-adds this tree to the `live` branch that Netlify deploys, -# because the library is private and cannot be cloned from a build. +# Synced from FlowFuse/blueprint-library by nuxt/modules/blueprints-source.ts. nuxt/content/blueprints/ +# Left in existing checkouts by the retired Eleventy build: its output and its +# eleventy-fetch cache. Nothing writes these any more. +_site +.cache + # Local development config .vscode/ .env -# Cache for assets -.cache - # Local Netlify folder .netlify diff --git a/CODEOWNERS b/CODEOWNERS index b0fb377d94..73b91436da 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,26 +1,26 @@ # Please note the _last matching rule_ is used # Start with a catch all for the handbook -/src/handbook/ @ZJvandeWeg -/src/handbook/design @Yndira-E -/src/handbook/development @knolleary -/src/handbook/marketing @FlowFuse/marketing -/src/handbook/sales @MichaelBDavis +/nuxt/content/handbook/ @ZJvandeWeg +/nuxt/content/handbook/design @Yndira-E +/nuxt/content/handbook/development @knolleary +/nuxt/content/handbook/marketing @FlowFuse/marketing +/nuxt/content/handbook/sales @MichaelBDavis # Customer department -/src/handbook/customer-success.md @Esmewieringa +/nuxt/content/handbook/customer-success.md @Esmewieringa # Security Polices -/src/handbook/company/security/information-security.md @ZJvandeWeg -/src/handbook/company/security/access-control.md @knolleary -/src/handbook/company/security/data-management.md @ZJvandeWeg -/src/handbook/company/security/secure-development.md @knolleary +/nuxt/content/handbook/company/security/information-security.md @ZJvandeWeg +/nuxt/content/handbook/company/security/access-control.md @knolleary +/nuxt/content/handbook/company/security/data-management.md @ZJvandeWeg +/nuxt/content/handbook/company/security/secure-development.md @knolleary # Change in values need sign off from both the CEO and CTO -/src/handbook/company/values.md @knolleary @ZJvandeWeg +/nuxt/content/handbook/company/values.md @knolleary @ZJvandeWeg # Package-lock.json (engineering team) /package-lock.json @FlowFuse/engineering @Yndira-E # Changelog posts (tech writer required, product as backup) -/handbook/engineering/releases/writing-changelog @FlowFuse/marketing @FlowFuse/product @FlowFuse/engineering +/nuxt/content/handbook/engineering/releases/writing-changelog.md @FlowFuse/marketing @FlowFuse/product @FlowFuse/engineering diff --git a/README.md b/README.md index ab65105e25..cde9818cfd 100644 --- a/README.md +++ b/README.md @@ -17,16 +17,23 @@ schedule to pick up blueprint-library changes — either way it just calls a Net ## Repository structure -This repository is an **npm workspace** containing two projects: +This repository is an **npm workspace**. The whole site is one [Nuxt 4](https://nuxt.com/) application in `nuxt/`: | Directory | Purpose | |-----------|---------| -| *(root)* | Legacy [Eleventy](https://www.11ty.dev/) site — all existing content lives here | -| `nuxt/` | New [Nuxt 3](https://nuxt.com/) frontend — pages are migrated here incrementally | - -### Nuxt migration - -The site is being migrated from Eleventy (11ty) to Nuxt 3 using the [Strangler Fig pattern](https://martinfowler.com/bliki/StranglerFigApplication.html). Nuxt acts as the front door on port 3000: pages that have been migrated are served directly by Nuxt; all other routes are transparently proxied to the legacy 11ty server on port 8080. +| `nuxt/pages`, `nuxt/components` | Routes and the components they render | +| `nuxt/content` | Markdown and YAML content, read through [`@nuxt/content`](https://content.nuxt.com/) | +| `nuxt/public` | Everything served as a file: images, downloads, favicons | +| `nuxt/data` | JSON and YAML that components import directly (the nav, the team, site config) | +| `nuxt/assets` | Stylesheets, the two icon sets (`icons/` for ``, `nav-icons/` for ``), the cookie-consent source | +| `nuxt/lib`, `nuxt/server/lib` | Plain-JS helpers with `node --test` unit tests | +| `scripts/` | Build-time syncs for the two external content sources, and the Algolia indexer | +| *(root)* | The workspace: npm scripts, Tailwind and PostCSS config, Netlify config | + +The site was previously generated by [Eleventy](https://www.11ty.dev/) and was migrated to Nuxt +page group by page group, using the [Strangler Fig pattern](https://martinfowler.com/bliki/StranglerFigApplication.html). +That migration is complete and Eleventy is gone; a `.njk` file or a `src/` path in a comment +is a reference to what a page used to be. ## Prerequisites @@ -54,23 +61,22 @@ Clone the repository, then install all dependencies (workspace packages are incl npm install ``` -### Start both servers (recommended) +### Start the dev server ```bash npm run dev ``` -This starts three watchers concurrently: - -| Process | URL | Description | -|---------|-----|-------------| -| Nuxt dev server | http://localhost:3000 | Front door — serves migrated pages and proxies everything else | -| 11ty dev server | http://localhost:8080 | Legacy site (proxied through Nuxt) | -| PostCSS watcher | — | Compiles Tailwind CSS for the legacy site | +The site is then on **http://localhost:3000**. That one command starts everything: -**Use http://localhost:3000** as your development URL. The legacy 11ty server on port 8080 is also accessible directly if needed. +| Process | Description | +|---------|-------------| +| Nuxt dev server | The site, on port 3000 | +| PostCSS watcher | Compiles Tailwind CSS into `nuxt/public/css` | +| Docs watcher | Re-syncs a product-docs page as it changes (see below) | +| Blueprints watcher | Re-syncs the Blueprint Library when the sibling checkout changes | -**Note**: the first time running this, 11ty may take a little while to process all images in the `/docs` and `/handbook` folders. +`npm run dev:nuxt` runs the Nuxt server on its own, without the watchers. **Note**: if you have previously run `npm run build:nuxt`, clean the generated directories before starting dev or you will get a `spawn EBADF` error: @@ -78,16 +84,6 @@ This starts three watchers concurrently: npm run clean:nuxt ``` -### Legacy-only mode - -To run just the legacy 11ty stack (equivalent to the old `npm start`): - -```bash -npm start -``` - -This starts the full legacy stack on http://localhost:8080 including docs, blueprints, and PostCSS. - ### Running FlowFuse Documentation The documentation for FlowFuse is maintained in the core [FlowFuse repo](https://github.com/FlowFuse/flowfuse). To run a local version of the documentation, clone that repository alongside this one: @@ -98,7 +94,7 @@ The documentation for FlowFuse is maintained in the core [FlowFuse repo](https:/ /flowfuse ``` -The `npm run dev` (and `npm start`) commands will retrieve the documentation from that folder and inject them into the site automatically. The docs will be available at http://localhost:3000/docs. +`npm run dev` will retrieve the documentation from that folder and inject it into the site automatically. The docs will be available at http://localhost:3000/docs. Nothing needs configuring for that to happen. Every build resolves the docs in this order, and logs which one it used: @@ -110,7 +106,7 @@ Nothing needs configuring for that to happen. Every build resolves the docs in t `npm run docs` runs that resolution on its own, without a full build, writing `nuxt/content/docs` and `nuxt/public/docs`. Both are generated, and neither is committed on `main`. -`npm run dev` and `npm start` also watch the resolved docs and re-sync each file as it changes, so an edit appears without restarting. `npm run dev:nuxt` on its own does not include that watcher; run `npm run dev:docs` beside it if you want one. +`npm run dev` also watches the resolved docs and re-syncs each file as it changes, so an edit appears without restarting. `npm run dev:nuxt` on its own does not include that watcher; run `npm run dev:docs` beside it if you want one. ### Running Blueprints @@ -126,18 +122,18 @@ Every build resolves blueprints in this order, and logs which one it used: | Order | Source | Used when | |-------|--------|-----------| -| 1 | `BLUEPRINTS_LOCAL=/path/to/blueprint-library` | The env var is set. A path that does not exist is an error, not a fallback. | +| 1 | `FLOWFUSE_BLUEPRINTS_LOCAL=/path/to/blueprint-library` | The env var is set. A path that does not exist is an error, not a fallback. | | 2 | A sibling checkout: `../blueprint-library` | It exists. This is what local development relies on. | | 3 | A clone, authenticated with a minted GitHub App installation token (`GH_BOT_APP_ID`/`GH_BOT_APP_KEY`) | Nothing above applied, and those env vars are set. This is what Netlify production deploys use — `blueprint-library` is private, so this can't clone anonymously the way docs does. | | 4 | Skipped | Nothing above applied. Matches the previous behaviour for contributors without access to the private repo. | -`npm run blueprints` runs that resolution on its own, writing `src/blueprints`, which is gitignored. `npm start` re-runs it whenever the resolved source changes (`scripts/watch_blueprints.js`), but only when it found a source to watch in the first place — no sibling checkout means no watching. +`npm run blueprints` runs that resolution on its own, writing `nuxt/content/blueprints` and `nuxt/public/blueprints`, both gitignored. `npm run dev` re-runs it whenever the resolved source changes (`scripts/watch_blueprints.js`), but only when it found a source to watch in the first place — no sibling checkout means no watching. ## llms.txt `/llms.txt` (and `/llms-full.txt`) are generated by the [`nuxt-llms`](https://github.com/nuxtlabs/nuxt-llms) module, configured in `nuxt/nuxt.config.ts` under the `llms` key. Sections are built from `@nuxt/content` collections (`docs`, `blog`, `changelog`, `ebooks`, `whitepapers`) plus a small hardcoded list of standalone Nuxt routes (pricing, integrations, etc.) that aren't backed by a collection. -The `handbook` collection is deliberately excluded — it's internal company documentation, not product content, so it has no `contentCollection` section here. Content still served by the legacy Eleventy site (customer-stories, use-cases, platform, etc.) is invisible to `@nuxt/content` and so is also absent from `llms.txt` until those pages are migrated to Nuxt. +The `handbook` collection is deliberately excluded: it's internal company documentation, not product content, so it has no `contentCollection` section here. ## How to add blog posts @@ -162,5 +158,4 @@ triggers a website rebuild once it lands. A rebuild can also be started by hand This setup was inspired by: - - [Eleventy Base Blog starter repository](https://github.com/11ty/eleventy-base-blog) - [Oxide.Computer's website setup](https://github.com/oxidecomputer/website) diff --git a/lib/image-handler.js b/lib/image-handler.js deleted file mode 100644 index da3ab85c7d..0000000000 --- a/lib/image-handler.js +++ /dev/null @@ -1,295 +0,0 @@ -const path = require("path") -const fs = require("fs") - -const eleventyImage = require("@11ty/eleventy-img") - -const processedImages = new Set() -const IMAGE_BUILD_PROFILE = process.env.IMAGE_BUILD_PROFILE || "full" - -/** - * Is a particular string a URL - * @param {string} url - * @returns boolean - */ -function isURL(url) { - try { - new URL(url) - return true - } catch { - return false - } -} - -/** - * Resolve a file path relative to the input path or eleventy root - * @param {string} filePath File to try and find - * @param {string} workingFilePath File that is currently being parsed - * @param {string} inputFolderPath Input folder directory - * @returns - */ -function resolvedImagePath(filePath, workingFilePath, inputFolderPath) { - // Skip URLs - if (isURL(filePath)) { - return filePath - } - - // Handle both relative to current file and relative to input folder - try { - const resolvedRelativePath = path.resolve( - path.dirname(workingFilePath), - filePath - ) - if (fs.existsSync(resolvedRelativePath)) { - return resolvedRelativePath - } - - const resolvedAbsolutePath = path.resolve(inputFolderPath, filePath) - if (fs.existsSync(resolvedAbsolutePath)) { - return resolvedAbsolutePath - } - } catch {} - - return filePath -} - -/** - * Only copy across file if it is newer than the destination file - * @param {*} srcPath - * @param {*} destPath - * @returns boolean True if file was copiedo - */ -async function copyNewerFile( - srcPath, - destPath, - { verbose, interval } = { verbose: false, interval: 1000 } -) { - const stat = fs.statSync(srcPath) - if (!stat.isFile()) { - // Not a file. - throw new Error(`Not supported ${srcPath}`) - } - - const srcMTime = stat.mtime - let destMTime - try { - destMTime = (await fs.statSync(destPath)).mtime - } catch (err) { - // path does not exist - } - - if (destMTime !== undefined && srcMTime - destMTime <= interval) { - // destPath does not exist or mtime is equal, return. - if (verbose) { - console.log(`${srcPath} == ${destPath}`) - } - return false - } - - // Commence copying. - let rs = fs.createReadStream(srcPath) - let ws = fs.createWriteStream(destPath) - rs.pipe(ws) - await waitForStreamEnd(ws) - - // Set mtime to be equal to the source file. - fs.utimesSync(destPath, new Date(), stat.mtime) - - if (verbose) { - console.log(`${srcPath} -> ${destPath}`) - } - return true -} - -async function waitForStreamEnd(stream) { - await new Promise((resolve, reject) => { - stream.on("error", reject) - stream.on("finish", resolve) - }) -} - -/** - * Converts an image into multiple formats and returns a Picture tag containing those formats] - * Automatically: - * - Generates retina and non-retina size images for use on supported screens - * - Converts files to avif and webp - * - Converts gifs to webp - * @param {string} imgSrc Relative path (from folder or input directory) to - * @param {string} imgAlt Required alt tag describing the image - * @param {string} imgTitle Title of the image tag - * @param {array} widths Array of widths (in px) to resize image to - * @param {array} sizes Picture tag sizes - * @param {string} currentFilePath Will search for image relative to this path - * @param {boolean} async Set false to ryn synchronously - * @returns {string} HTML Tag - */ -module.exports = function imageHandler( - imgSrc, - imgAlt, - imgTitle = null, - widths = ["auto"], - sizes = null, - currentFilePath = null, - eleventyConfig = null, - async = true, - DEV_MODE = false, - priority = false -) { - const eleventyInputFolderPath = eleventyConfig.directories?.input || eleventyConfig.dir.input - const eleventyOutputFolderPath = eleventyConfig.directories?.output || eleventyConfig.dir.output - - // Image formats to generate - // Full list of formats here: https://www.11ty.dev/docs/plugins/image/#output-formats - // Warning: Avif can be resource-intensive so take care! - let formats = ["avif", "webp", "jpeg"] - let extraOpts = {} - if (imgSrc.includes(".gif")) { - formats = ["webp", "gif"] - extraOpts = { - sharpOptions: { - animated: true, - limitInputPixels: false - }, - } - } - - // Warm profile for first cold builds: fewer variants, faster completion, cache still populated. - const warmBuild = IMAGE_BUILD_PROFILE === "warm" - if (warmBuild && !imgSrc.includes(".gif")) { - formats = ["webp", "jpeg"] - } - - // Generate retina images in full profile only - const imgWidths = warmBuild - ? widths - : widths.concat(widths.map((w) => (isNaN(w) ? w : w * 2))) // generate 2x sizes (retina) - const htmlSizes = - sizes || - widths - .filter((w) => !isNaN(w)) - .map( - (width) => - `(min-device-pixel-ratio: 1.25) ${width * 2}px, (min-resolution: 120dpi) ${width * 2}px, ${width}px` - ) - - // Skip image parsing if flag is set (@skip in title) - const parsedTitle = (imgTitle || '').match( - /^(?@skip ?)?(?.*)/ - ).groups - - const htmlOpts = { - ...(parsedTitle.title && { title: parsedTitle.title }), // skip if null - alt: imgAlt, - sizes: htmlSizes.join(", "), - loading: priority ? "eager" : "lazy", - decoding: "async", - ...(priority && { fetchpriority: "high" }), - } - - if (parsedTitle.skip || imgSrc.startsWith('http')) { - const options = { ...htmlOpts } - const metadata = { img: [{ url: imgSrc }] } - - return eleventyImage.generateHTML(metadata, options) - } - - // Options for conversion - const imgPath = resolvedImagePath( - imgSrc, - currentFilePath, - eleventyInputFolderPath - ) - const imgOpts = { - widths: imgWidths, - formats, - outputDir: path.join(eleventyOutputFolderPath, "img"), - cacheOptions: { - directory: ".cache/images", - }, - filenameFormat: function (hash, src, width, format, options) { - const { name } = path.parse(src) - return `${name}-${hash}-${width}.${format}` - }, - svgShortCircuit: true, - ...extraOpts, - } - - // In dev mode the image pipeline doesn't actually run - // Instead it generates HTML picture tags are equivalent of how the pipeline would work - // But containing only one, non-converted, resized or compressed, image - if (DEV_MODE) { - // Naive copy of the image to the output folder. - // Disambiguate the output filename with a short hash of the resolved - // source path so two different source images that share a basename - // (e.g. a hero foreground "industries/food-beverage.jpg" and a hero - // video poster "industries/hero-video/food-beverage.jpg") don't - // overwrite each other at /img/<basename>. Production is unaffected: - // its pipeline already hashes by content via filenameFormat above. - const parsedName = path.parse(imgPath) - const srcHash = require("crypto") - .createHash("sha1") - .update(imgPath) - .digest("hex") - .slice(0, 8) - const imgOutputPath = path.join( - imgOpts.outputDir, - `${parsedName.name}-${srcHash}${parsedName.ext}` - ) - const imgOutputURL = path.join( - "/", - path.relative(eleventyOutputFolderPath, imgOutputPath) - ) - - // Copy image if it hasn't been copied already - if (!processedImages.has(imgOutputPath)) { - processedImages.add(imgOutputPath) - - // Copying can all happen async, build doesn't need to wait for it to complete - new Promise(async (resolve, reject) => { - if (!fs.existsSync(imgOpts.outputDir)) { - fs.mkdirSync(imgOpts.outputDir) - } - - await copyNewerFile(imgPath, imgOutputPath) - - resolve() - }).catch((e) => { - console.warn(`Failed copying ${imgPath} to ${imgOutputPath}`) - }) - } - - const singleImageMetadata = { - url: imgOutputURL, - sourceType: "image/jpeg", // sourceType is not important for us, but it is for eleventyImage - } - - const htmlMetadata = { - jpeg: [singleImageMetadata], // tag name must be one of the format understood by eleventyImage - img: [singleImageMetadata], // tag name is not important, this is faking a second source - } - - htmlOpts.sizes = "100vw, 100vw" // use any source (all have src as undefined so will use IMG tag only) - - return eleventyImage.generateHTML(htmlMetadata, htmlOpts) - } - - // In async mode, image is generated, then stats are read and used to generate HTML - if (async) { - return eleventyImage(imgPath, imgOpts).then((htmlMetadata) => { - return eleventyImage.generateHTML(htmlMetadata, htmlOpts) - }) - } - - // In sync mode, while image is generating in a separate thread, stats are estimated synchronously - eleventyImage(imgPath, imgOpts) - - let htmlMetadata - if (isURL(imgSrc)) { - throw new Error( - `Currently remote images are not supported as they cannot be loaded synchronously, please copy ${imgPath} to the local file system` - ) - } else { - htmlMetadata = eleventyImage.statsSync(imgPath, imgOpts) - } - - return eleventyImage.generateHTML(htmlMetadata, htmlOpts) -} diff --git a/nuxt/.gitignore b/nuxt/.gitignore index c28ac89f94..8163279d33 100644 --- a/nuxt/.gitignore +++ b/nuxt/.gitignore @@ -3,10 +3,21 @@ .output/ dist/ -# Generated by 11ty during unified build (some asset folders are tracked separately) -/public/* -!/public/handbook/ -!/public/images/ +# public/ is a tracked asset tree. Only these parts of it are generated during a build: +/public/css/ +/public/js/cc.min.js +/public/js/flowrenderer.min.js +# Synced from FlowFuse/flowfuse by modules/docs-source.ts +/public/docs/ +# Synced from FlowFuse/blueprint-library by modules/blueprints-source.ts +/public/blueprints/ +# Left in existing checkouts by the retired Eleventy build, which wrote its output into +# public/. Nothing writes these any more. +/public/img/ +/public/_includes/ +/public/sitemap-legacy.xml +/public/js/ai-expert-modal.js +/public/js/hm-promo-banner.js # Dependencies (hoisted to workspace root) node_modules/ diff --git a/src/css/algolia-theme.css b/nuxt/assets/css/algolia-theme.css similarity index 100% rename from src/css/algolia-theme.css rename to nuxt/assets/css/algolia-theme.css diff --git a/src/css/node-red-style.css b/nuxt/assets/css/node-red-style.css similarity index 100% rename from src/css/node-red-style.css rename to nuxt/assets/css/node-red-style.css diff --git a/src/css/roadmap.css b/nuxt/assets/css/roadmap.css similarity index 100% rename from src/css/roadmap.css rename to nuxt/assets/css/roadmap.css diff --git a/src/css/style.animations.css b/nuxt/assets/css/style.animations.css similarity index 100% rename from src/css/style.animations.css rename to nuxt/assets/css/style.animations.css diff --git a/src/css/style.catalog.css b/nuxt/assets/css/style.catalog.css similarity index 100% rename from src/css/style.catalog.css rename to nuxt/assets/css/style.catalog.css diff --git a/src/css/style.components.css b/nuxt/assets/css/style.components.css similarity index 100% rename from src/css/style.components.css rename to nuxt/assets/css/style.components.css diff --git a/src/css/style.css b/nuxt/assets/css/style.css similarity index 98% rename from src/css/style.css rename to nuxt/assets/css/style.css index 19d9c78aaa..1d9a7e259d 100644 --- a/src/css/style.css +++ b/nuxt/assets/css/style.css @@ -1,10 +1,10 @@ @layer vendor, theme, base, components, utilities; -@config "../../tailwind.config.js"; +@config "../../../tailwind.config.js"; @import "tailwindcss"; /* Utility classes for the nav and footer live in this data file rather than in a template, so name it explicitly: automatic source detection skips JSON. */ -@source "../_data/chrome.json"; +@source "../../data/chrome.json"; @plugin "@tailwindcss/typography"; @theme { @@ -86,8 +86,8 @@ @source inline("ml-4 ml-8 ml-6 mt-3 max-w-[90%] py-4 py-2 bg-indigo-600 text-white rounded-br-sm bg-gray-100 text-gray-800 rounded-bl-sm justify-end justify-start max-w-xs lg:max-w-md overflow-auto rounded-lg px-4 mb-4 flex hover:border-indigo-400 hover:bg-indigo-50 hover:bg-indigo-100 active:bg-indigo-100 active:border-indigo-500 transition-all duration-200 text-gray-600 hover:text-indigo-600 transition-colors"); -@source not "../../nuxt/.netlify/**"; -@source "../../nuxt/**"; +@source not "../../.netlify/**"; +@source "../../**"; .prose { --tw-prose-body: var(--color-gray-700); @@ -110,7 +110,6 @@ @import "./style.dashboard.css"; @import "./style.handbook.css"; @import "./style.catalog.css"; -@import "./style.eleventy.nav.css"; @import "./style.components.css"; @import "./style.animations.css"; @import "./style.docs.css"; @@ -118,8 +117,8 @@ @import "./roadmap.css"; @import "./zoom-style.css"; @import "./node-red-style.css"; -@import "../../node_modules/@flowforge/forge-ui-components/dist/forge-ui-components.css" layer(vendor); -@import "../../node_modules/vanilla-cookieconsent/dist/cookieconsent.css" layer(components); +@import "../../../node_modules/@flowforge/forge-ui-components/dist/forge-ui-components.css" layer(vendor); +@import "../../../node_modules/vanilla-cookieconsent/dist/cookieconsent.css" layer(components); /* forge-ui-components resets bare h1-h3 for its own standalone docs site. Neutralize within the vendor layer itself (source order wins ties inside @@ -1007,11 +1006,9 @@ h4:hover .header-anchor::before { stops shift colour in staggered sequence, so the colour flows across the letterforms rather than a block passing over them. - Both front ends are driven from here. The 11ty includes - (components/flowfuse-wordmark*.njk, components/flowfuse-square.svg) and the - Nuxt components (AppHeader.vue, AppFooter.vue) each carry the gradient, and - Nuxt links this same stylesheet via nuxt.config.ts, so one rule set covers - both. Keep the gradients at five stops or the stagger below goes uneven. + AppHeader.vue and AppFooter.vue each carry the gradient, and nuxt.config.ts + links this stylesheet, so one rule set covers both. Keep the gradients at five + stops or the stagger below goes uneven. The colours are custom properties because the three marks rest on different fills: brand orange for the wordmark, a lighter red for the tablet square @@ -2800,7 +2797,7 @@ lite-youtube::before { } /* Mega highlight card: an image-only promo slot at the left of every mega - dropdown (configured in src/_data/navHighlights.json). From 860px up the panel + dropdown (configured in nuxt/data/navHighlights.json). From 860px up the panel gains a leading track for the card and the three category columns shift one track to the right, so the card always owns a column of its own and can never squash or collide with the links. Three bands, each with the widest card its @@ -2824,8 +2821,7 @@ lite-youtube::before { track 1 now belongs to the card, which would otherwise push group 1 into the first free cell of an already occupied column. Keyed on DOM order (the card, then a title plus a link list per group) rather than on those utility classes, - because the 11ty header and the Vue header share the DOM shape and this one - stylesheet drives both: no markup change on either side. Only grid-row-START is + so the rule needs no markup change in the header. Only grid-row-START is set on the link lists, never the grid-row shorthand, because their row-span-* and grid-rows-subgrid come from the markup and must survive. */ @media (min-width: 860px) { @@ -3146,8 +3142,7 @@ lite-youtube::before { } /* De-emphasize "See all ..." index links in the mega panels and footer. - Keyed on the index-page hrefs so the shared stylesheet covers both the - 11ty and Vue headers without markup changes. */ + Keyed on the index-page hrefs so it needs no markup changes. */ /* Rest colour is carried by the inner .ff-nav-label span (the arrow icon uses the anchor's currentColor), so both must be de-emphasized. */ .ff-website header .ff-nav-dropdown > ul.mega ul.sub-menu a[href="/use-cases/"], @@ -3680,12 +3675,11 @@ lite-youtube::before { border-radius: 0.5rem; } -/* Top utility bar. Shared by the Eleventy include (top-utility-bar.njk) and the - Nuxt component (AppUtilityBar.vue) so the two cannot drift: these rules used - to live in an inline <style> in the Eleventy include only, which left the - Nuxt bar without the hover underline. Deliberately unlayered, so the hover - rule outranks the hover:no-underline utility on the links. The announce rules - set the initial rotation state before the rotation script runs. */ +/* Top utility bar (AppUtilityBar.vue). These rules once lived in an inline <style> + in the Eleventy include only, which left the Nuxt bar without the hover underline. + Deliberately unlayered, so the hover rule outranks the hover:no-underline utility + on the links. The announce rules set the initial rotation state before the rotation + script runs. */ .ff-utility-announce > .ff-utility-item { display: none; } .ff-utility-announce > .ff-utility-item:first-child { display: inline-flex; } .ff-utility-bar a:hover { text-decoration: underline; text-underline-offset: 2px; } diff --git a/src/css/style.dashboard.css b/nuxt/assets/css/style.dashboard.css similarity index 100% rename from src/css/style.dashboard.css rename to nuxt/assets/css/style.dashboard.css diff --git a/src/css/style.docs.css b/nuxt/assets/css/style.docs.css similarity index 100% rename from src/css/style.docs.css rename to nuxt/assets/css/style.docs.css diff --git a/src/css/style.handbook.css b/nuxt/assets/css/style.handbook.css similarity index 100% rename from src/css/style.handbook.css rename to nuxt/assets/css/style.handbook.css diff --git a/src/css/style.nohero.css b/nuxt/assets/css/style.nohero.css similarity index 100% rename from src/css/style.nohero.css rename to nuxt/assets/css/style.nohero.css diff --git a/src/css/style.page.css b/nuxt/assets/css/style.page.css similarity index 100% rename from src/css/style.page.css rename to nuxt/assets/css/style.page.css diff --git a/nuxt/assets/css/theme.css b/nuxt/assets/css/theme.css index a9f08b0f2b..4b7d0120f8 100644 --- a/nuxt/assets/css/theme.css +++ b/nuxt/assets/css/theme.css @@ -1,12 +1,12 @@ /* Skips the preflight reset (unlike the "tailwindcss" shorthand) — it would - duplicate the one src/css/style.css already serves for both 11ty and Nuxt. */ + duplicate the one assets/css/style.css already serves as /css/style.css. */ @import "tailwindcss/theme.css" layer(theme); @import "tailwindcss/utilities.css" layer(utilities); @import "@nuxt/ui"; /* Utility classes for the nav and footer live in this data file rather than in a template, so name it explicitly: automatic source detection skips JSON. */ -@source "../../../src/_data/chrome.json"; +@source "../../data/chrome.json"; /* FlowFuse brand red scale — overrides Tailwind's default so Nuxt UI's primary color tokens match the palette from the branding handbook. */ @@ -28,7 +28,7 @@ --ui-text-highlighted: var(--color-gray-700); } -/* Same base heading sizes as src/css/style.css (11ty). Declared here, not just +/* Same base heading sizes as assets/css/style.css. Declared here, not just there, because Tailwind v4's Preflight (imported above) loads after that legacy stylesheet in <head> and wins equal-specificity ties on h1-h5. Wrapped in @layer base so inline inline classes (which diff --git a/src/css/zoom-style.css b/nuxt/assets/css/zoom-style.css similarity index 100% rename from src/css/zoom-style.css rename to nuxt/assets/css/zoom-style.css diff --git a/src/js/cookieconsent-config.js b/nuxt/assets/js/cookieconsent-config.js similarity index 100% rename from src/js/cookieconsent-config.js rename to nuxt/assets/js/cookieconsent-config.js diff --git a/src/_includes/components/icons/academic-cap.svg b/nuxt/assets/nav-icons/academic-cap.svg similarity index 100% rename from src/_includes/components/icons/academic-cap.svg rename to nuxt/assets/nav-icons/academic-cap.svg diff --git a/src/_includes/components/icons/adjustments-horizontal.svg b/nuxt/assets/nav-icons/adjustments-horizontal.svg similarity index 100% rename from src/_includes/components/icons/adjustments-horizontal.svg rename to nuxt/assets/nav-icons/adjustments-horizontal.svg diff --git a/src/_includes/components/icons/adjustments-vertical.svg b/nuxt/assets/nav-icons/adjustments-vertical.svg similarity index 100% rename from src/_includes/components/icons/adjustments-vertical.svg rename to nuxt/assets/nav-icons/adjustments-vertical.svg diff --git a/src/_includes/components/icons/air-gapped-deployment.svg b/nuxt/assets/nav-icons/air-gapped-deployment.svg similarity index 100% rename from src/_includes/components/icons/air-gapped-deployment.svg rename to nuxt/assets/nav-icons/air-gapped-deployment.svg diff --git a/src/_includes/components/icons/airplane.svg b/nuxt/assets/nav-icons/airplane.svg similarity index 100% rename from src/_includes/components/icons/airplane.svg rename to nuxt/assets/nav-icons/airplane.svg diff --git a/src/_includes/components/icons/archive-box-x-mark.svg b/nuxt/assets/nav-icons/archive-box-x-mark.svg similarity index 100% rename from src/_includes/components/icons/archive-box-x-mark.svg rename to nuxt/assets/nav-icons/archive-box-x-mark.svg diff --git a/src/_includes/components/icons/arrow-long-right.svg b/nuxt/assets/nav-icons/arrow-long-right.svg similarity index 100% rename from src/_includes/components/icons/arrow-long-right.svg rename to nuxt/assets/nav-icons/arrow-long-right.svg diff --git a/src/_includes/components/icons/arrow-path-rounded-square.svg b/nuxt/assets/nav-icons/arrow-path-rounded-square.svg similarity index 100% rename from src/_includes/components/icons/arrow-path-rounded-square.svg rename to nuxt/assets/nav-icons/arrow-path-rounded-square.svg diff --git a/src/_includes/components/icons/arrow-path.svg b/nuxt/assets/nav-icons/arrow-path.svg similarity index 100% rename from src/_includes/components/icons/arrow-path.svg rename to nuxt/assets/nav-icons/arrow-path.svg diff --git a/src/_includes/components/icons/arrow-right.svg b/nuxt/assets/nav-icons/arrow-right.svg similarity index 100% rename from src/_includes/components/icons/arrow-right.svg rename to nuxt/assets/nav-icons/arrow-right.svg diff --git a/src/_includes/components/icons/arrow-small-down.svg b/nuxt/assets/nav-icons/arrow-small-down.svg similarity index 100% rename from src/_includes/components/icons/arrow-small-down.svg rename to nuxt/assets/nav-icons/arrow-small-down.svg diff --git a/src/_includes/components/icons/arrow-top-right-on-square.svg b/nuxt/assets/nav-icons/arrow-top-right-on-square.svg similarity index 100% rename from src/_includes/components/icons/arrow-top-right-on-square.svg rename to nuxt/assets/nav-icons/arrow-top-right-on-square.svg diff --git a/src/_includes/components/icons/arrow-trending-up.svg b/nuxt/assets/nav-icons/arrow-trending-up.svg similarity index 100% rename from src/_includes/components/icons/arrow-trending-up.svg rename to nuxt/assets/nav-icons/arrow-trending-up.svg diff --git a/src/_includes/components/icons/arrow-up-on-square-stack.svg b/nuxt/assets/nav-icons/arrow-up-on-square-stack.svg similarity index 100% rename from src/_includes/components/icons/arrow-up-on-square-stack.svg rename to nuxt/assets/nav-icons/arrow-up-on-square-stack.svg diff --git a/src/_includes/components/icons/arrows-pointing-out.svg b/nuxt/assets/nav-icons/arrows-pointing-out.svg similarity index 100% rename from src/_includes/components/icons/arrows-pointing-out.svg rename to nuxt/assets/nav-icons/arrows-pointing-out.svg diff --git a/src/_includes/components/icons/arrows-right-left.svg b/nuxt/assets/nav-icons/arrows-right-left.svg similarity index 100% rename from src/_includes/components/icons/arrows-right-left.svg rename to nuxt/assets/nav-icons/arrows-right-left.svg diff --git a/src/_includes/components/icons/arrows.svg b/nuxt/assets/nav-icons/arrows.svg similarity index 100% rename from src/_includes/components/icons/arrows.svg rename to nuxt/assets/nav-icons/arrows.svg diff --git a/src/_includes/components/icons/audit-logs.svg b/nuxt/assets/nav-icons/audit-logs.svg similarity index 100% rename from src/_includes/components/icons/audit-logs.svg rename to nuxt/assets/nav-icons/audit-logs.svg diff --git a/src/_includes/components/icons/bell-alert.svg b/nuxt/assets/nav-icons/bell-alert.svg similarity index 100% rename from src/_includes/components/icons/bell-alert.svg rename to nuxt/assets/nav-icons/bell-alert.svg diff --git a/src/_includes/components/icons/bolt.svg b/nuxt/assets/nav-icons/bolt.svg similarity index 100% rename from src/_includes/components/icons/bolt.svg rename to nuxt/assets/nav-icons/bolt.svg diff --git a/src/_includes/components/icons/book-open.svg b/nuxt/assets/nav-icons/book-open.svg similarity index 100% rename from src/_includes/components/icons/book-open.svg rename to nuxt/assets/nav-icons/book-open.svg diff --git a/src/_includes/components/icons/bug.svg b/nuxt/assets/nav-icons/bug.svg similarity index 100% rename from src/_includes/components/icons/bug.svg rename to nuxt/assets/nav-icons/bug.svg diff --git a/src/_includes/components/icons/building-library.svg b/nuxt/assets/nav-icons/building-library.svg similarity index 100% rename from src/_includes/components/icons/building-library.svg rename to nuxt/assets/nav-icons/building-library.svg diff --git a/src/_includes/components/icons/building-office-2.svg b/nuxt/assets/nav-icons/building-office-2.svg similarity index 100% rename from src/_includes/components/icons/building-office-2.svg rename to nuxt/assets/nav-icons/building-office-2.svg diff --git a/src/_includes/components/icons/calendar.svg b/nuxt/assets/nav-icons/calendar.svg similarity index 100% rename from src/_includes/components/icons/calendar.svg rename to nuxt/assets/nav-icons/calendar.svg diff --git a/src/_includes/components/icons/camera.svg b/nuxt/assets/nav-icons/camera.svg similarity index 100% rename from src/_includes/components/icons/camera.svg rename to nuxt/assets/nav-icons/camera.svg diff --git a/src/_includes/components/icons/car.svg b/nuxt/assets/nav-icons/car.svg similarity index 100% rename from src/_includes/components/icons/car.svg rename to nuxt/assets/nav-icons/car.svg diff --git a/src/_includes/components/icons/case.svg b/nuxt/assets/nav-icons/case.svg similarity index 100% rename from src/_includes/components/icons/case.svg rename to nuxt/assets/nav-icons/case.svg diff --git a/src/_includes/components/icons/certificate.svg b/nuxt/assets/nav-icons/certificate.svg similarity index 100% rename from src/_includes/components/icons/certificate.svg rename to nuxt/assets/nav-icons/certificate.svg diff --git a/src/_includes/components/icons/certified-node.svg b/nuxt/assets/nav-icons/certified-node.svg similarity index 100% rename from src/_includes/components/icons/certified-node.svg rename to nuxt/assets/nav-icons/certified-node.svg diff --git a/src/_includes/components/icons/chart.svg b/nuxt/assets/nav-icons/chart.svg similarity index 100% rename from src/_includes/components/icons/chart.svg rename to nuxt/assets/nav-icons/chart.svg diff --git a/src/_includes/components/icons/chat-bubble-bottom-center-text.svg b/nuxt/assets/nav-icons/chat-bubble-bottom-center-text.svg similarity index 100% rename from src/_includes/components/icons/chat-bubble-bottom-center-text.svg rename to nuxt/assets/nav-icons/chat-bubble-bottom-center-text.svg diff --git a/src/_includes/components/icons/chat-bubble-left-right-sm.svg b/nuxt/assets/nav-icons/chat-bubble-left-right-sm.svg similarity index 100% rename from src/_includes/components/icons/chat-bubble-left-right-sm.svg rename to nuxt/assets/nav-icons/chat-bubble-left-right-sm.svg diff --git a/src/_includes/components/icons/chat-bubble-left-right.svg b/nuxt/assets/nav-icons/chat-bubble-left-right.svg similarity index 100% rename from src/_includes/components/icons/chat-bubble-left-right.svg rename to nuxt/assets/nav-icons/chat-bubble-left-right.svg diff --git a/src/_includes/components/icons/chat.svg b/nuxt/assets/nav-icons/chat.svg similarity index 100% rename from src/_includes/components/icons/chat.svg rename to nuxt/assets/nav-icons/chat.svg diff --git a/src/_includes/components/icons/check-badge.svg b/nuxt/assets/nav-icons/check-badge.svg similarity index 100% rename from src/_includes/components/icons/check-badge.svg rename to nuxt/assets/nav-icons/check-badge.svg diff --git a/src/_includes/components/icons/check-circle.svg b/nuxt/assets/nav-icons/check-circle.svg similarity index 100% rename from src/_includes/components/icons/check-circle.svg rename to nuxt/assets/nav-icons/check-circle.svg diff --git a/src/_includes/components/icons/check.svg b/nuxt/assets/nav-icons/check.svg similarity index 100% rename from src/_includes/components/icons/check.svg rename to nuxt/assets/nav-icons/check.svg diff --git a/src/_includes/components/icons/chevron-down.svg b/nuxt/assets/nav-icons/chevron-down.svg similarity index 100% rename from src/_includes/components/icons/chevron-down.svg rename to nuxt/assets/nav-icons/chevron-down.svg diff --git a/src/_includes/components/icons/chevron-left.svg b/nuxt/assets/nav-icons/chevron-left.svg similarity index 100% rename from src/_includes/components/icons/chevron-left.svg rename to nuxt/assets/nav-icons/chevron-left.svg diff --git a/src/_includes/components/icons/chevron-right-sm.svg b/nuxt/assets/nav-icons/chevron-right-sm.svg similarity index 100% rename from src/_includes/components/icons/chevron-right-sm.svg rename to nuxt/assets/nav-icons/chevron-right-sm.svg diff --git a/src/_includes/components/icons/chevron-right.svg b/nuxt/assets/nav-icons/chevron-right.svg similarity index 100% rename from src/_includes/components/icons/chevron-right.svg rename to nuxt/assets/nav-icons/chevron-right.svg diff --git a/src/_includes/components/icons/chevron-up.svg b/nuxt/assets/nav-icons/chevron-up.svg similarity index 100% rename from src/_includes/components/icons/chevron-up.svg rename to nuxt/assets/nav-icons/chevron-up.svg diff --git a/src/_includes/components/icons/chip.svg b/nuxt/assets/nav-icons/chip.svg similarity index 100% rename from src/_includes/components/icons/chip.svg rename to nuxt/assets/nav-icons/chip.svg diff --git a/src/_includes/components/icons/circle-stack.svg b/nuxt/assets/nav-icons/circle-stack.svg similarity index 100% rename from src/_includes/components/icons/circle-stack.svg rename to nuxt/assets/nav-icons/circle-stack.svg diff --git a/src/_includes/components/icons/clip-list.svg b/nuxt/assets/nav-icons/clip-list.svg similarity index 100% rename from src/_includes/components/icons/clip-list.svg rename to nuxt/assets/nav-icons/clip-list.svg diff --git a/src/_includes/components/icons/clipboard-copy.svg b/nuxt/assets/nav-icons/clipboard-copy.svg similarity index 100% rename from src/_includes/components/icons/clipboard-copy.svg rename to nuxt/assets/nav-icons/clipboard-copy.svg diff --git a/src/_includes/components/icons/clipboard-document-check.svg b/nuxt/assets/nav-icons/clipboard-document-check.svg similarity index 100% rename from src/_includes/components/icons/clipboard-document-check.svg rename to nuxt/assets/nav-icons/clipboard-document-check.svg diff --git a/src/_includes/components/icons/clock.svg b/nuxt/assets/nav-icons/clock.svg similarity index 100% rename from src/_includes/components/icons/clock.svg rename to nuxt/assets/nav-icons/clock.svg diff --git a/src/_includes/components/icons/close.svg b/nuxt/assets/nav-icons/close.svg similarity index 100% rename from src/_includes/components/icons/close.svg rename to nuxt/assets/nav-icons/close.svg diff --git a/src/_includes/components/icons/cloud.svg b/nuxt/assets/nav-icons/cloud.svg similarity index 100% rename from src/_includes/components/icons/cloud.svg rename to nuxt/assets/nav-icons/cloud.svg diff --git a/src/_includes/components/icons/cmdline.svg b/nuxt/assets/nav-icons/cmdline.svg similarity index 100% rename from src/_includes/components/icons/cmdline.svg rename to nuxt/assets/nav-icons/cmdline.svg diff --git a/src/_includes/components/icons/code-bracket.svg b/nuxt/assets/nav-icons/code-bracket.svg similarity index 100% rename from src/_includes/components/icons/code-bracket.svg rename to nuxt/assets/nav-icons/code-bracket.svg diff --git a/src/_includes/components/icons/codeblock.svg b/nuxt/assets/nav-icons/codeblock.svg similarity index 100% rename from src/_includes/components/icons/codeblock.svg rename to nuxt/assets/nav-icons/codeblock.svg diff --git a/src/_includes/components/icons/cog-6-tooth.svg b/nuxt/assets/nav-icons/cog-6-tooth.svg similarity index 100% rename from src/_includes/components/icons/cog-6-tooth.svg rename to nuxt/assets/nav-icons/cog-6-tooth.svg diff --git a/src/_includes/components/icons/cog.svg b/nuxt/assets/nav-icons/cog.svg similarity index 100% rename from src/_includes/components/icons/cog.svg rename to nuxt/assets/nav-icons/cog.svg diff --git a/src/_includes/components/icons/computer-desktop.svg b/nuxt/assets/nav-icons/computer-desktop.svg similarity index 100% rename from src/_includes/components/icons/computer-desktop.svg rename to nuxt/assets/nav-icons/computer-desktop.svg diff --git a/src/_includes/components/icons/cube-transparent.svg b/nuxt/assets/nav-icons/cube-transparent.svg similarity index 100% rename from src/_includes/components/icons/cube-transparent.svg rename to nuxt/assets/nav-icons/cube-transparent.svg diff --git a/src/_includes/components/icons/cursor-arrow-rays.svg b/nuxt/assets/nav-icons/cursor-arrow-rays.svg similarity index 100% rename from src/_includes/components/icons/cursor-arrow-rays.svg rename to nuxt/assets/nav-icons/cursor-arrow-rays.svg diff --git a/src/_includes/components/icons/dashboard.svg b/nuxt/assets/nav-icons/dashboard.svg similarity index 100% rename from src/_includes/components/icons/dashboard.svg rename to nuxt/assets/nav-icons/dashboard.svg diff --git a/src/_includes/components/icons/data-block.svg b/nuxt/assets/nav-icons/data-block.svg similarity index 100% rename from src/_includes/components/icons/data-block.svg rename to nuxt/assets/nav-icons/data-block.svg diff --git a/src/_includes/components/icons/data.svg b/nuxt/assets/nav-icons/data.svg similarity index 100% rename from src/_includes/components/icons/data.svg rename to nuxt/assets/nav-icons/data.svg diff --git a/src/_includes/components/icons/database.svg b/nuxt/assets/nav-icons/database.svg similarity index 100% rename from src/_includes/components/icons/database.svg rename to nuxt/assets/nav-icons/database.svg diff --git a/src/_includes/components/icons/db.svg b/nuxt/assets/nav-icons/db.svg similarity index 100% rename from src/_includes/components/icons/db.svg rename to nuxt/assets/nav-icons/db.svg diff --git a/src/_includes/components/icons/device-agent.svg b/nuxt/assets/nav-icons/device-agent.svg similarity index 100% rename from src/_includes/components/icons/device-agent.svg rename to nuxt/assets/nav-icons/device-agent.svg diff --git a/src/_includes/components/icons/document-arrow-up.svg b/nuxt/assets/nav-icons/document-arrow-up.svg similarity index 100% rename from src/_includes/components/icons/document-arrow-up.svg rename to nuxt/assets/nav-icons/document-arrow-up.svg diff --git a/src/_includes/components/icons/document-chart-bar.svg b/nuxt/assets/nav-icons/document-chart-bar.svg similarity index 100% rename from src/_includes/components/icons/document-chart-bar.svg rename to nuxt/assets/nav-icons/document-chart-bar.svg diff --git a/src/_includes/components/icons/document-check.svg b/nuxt/assets/nav-icons/document-check.svg similarity index 100% rename from src/_includes/components/icons/document-check.svg rename to nuxt/assets/nav-icons/document-check.svg diff --git a/src/_includes/components/icons/document-text.svg b/nuxt/assets/nav-icons/document-text.svg similarity index 100% rename from src/_includes/components/icons/document-text.svg rename to nuxt/assets/nav-icons/document-text.svg diff --git a/src/_includes/components/icons/dollar.svg b/nuxt/assets/nav-icons/dollar.svg similarity index 100% rename from src/_includes/components/icons/dollar.svg rename to nuxt/assets/nav-icons/dollar.svg diff --git a/src/_includes/components/icons/edit.svg b/nuxt/assets/nav-icons/edit.svg similarity index 100% rename from src/_includes/components/icons/edit.svg rename to nuxt/assets/nav-icons/edit.svg diff --git a/src/_includes/components/icons/exclamation-triangle.svg b/nuxt/assets/nav-icons/exclamation-triangle.svg similarity index 100% rename from src/_includes/components/icons/exclamation-triangle.svg rename to nuxt/assets/nav-icons/exclamation-triangle.svg diff --git a/src/_includes/components/icons/eye-slash.svg b/nuxt/assets/nav-icons/eye-slash.svg similarity index 100% rename from src/_includes/components/icons/eye-slash.svg rename to nuxt/assets/nav-icons/eye-slash.svg diff --git a/src/_includes/components/icons/eye.svg b/nuxt/assets/nav-icons/eye.svg similarity index 100% rename from src/_includes/components/icons/eye.svg rename to nuxt/assets/nav-icons/eye.svg diff --git a/src/_includes/components/icons/factory.svg b/nuxt/assets/nav-icons/factory.svg similarity index 100% rename from src/_includes/components/icons/factory.svg rename to nuxt/assets/nav-icons/factory.svg diff --git a/src/_includes/components/icons/flowfuse.svg b/nuxt/assets/nav-icons/flowfuse.svg similarity index 100% rename from src/_includes/components/icons/flowfuse.svg rename to nuxt/assets/nav-icons/flowfuse.svg diff --git a/src/_includes/components/icons/food-beverage.svg b/nuxt/assets/nav-icons/food-beverage.svg similarity index 100% rename from src/_includes/components/icons/food-beverage.svg rename to nuxt/assets/nav-icons/food-beverage.svg diff --git a/src/_includes/components/icons/funnel.svg b/nuxt/assets/nav-icons/funnel.svg similarity index 100% rename from src/_includes/components/icons/funnel.svg rename to nuxt/assets/nav-icons/funnel.svg diff --git a/src/_includes/components/icons/github.svg b/nuxt/assets/nav-icons/github.svg similarity index 100% rename from src/_includes/components/icons/github.svg rename to nuxt/assets/nav-icons/github.svg diff --git a/src/_includes/components/icons/globe-alt.svg b/nuxt/assets/nav-icons/globe-alt.svg similarity index 100% rename from src/_includes/components/icons/globe-alt.svg rename to nuxt/assets/nav-icons/globe-alt.svg diff --git a/src/_includes/components/icons/hand-raised.svg b/nuxt/assets/nav-icons/hand-raised.svg similarity index 100% rename from src/_includes/components/icons/hand-raised.svg rename to nuxt/assets/nav-icons/hand-raised.svg diff --git a/src/_includes/components/icons/info.svg b/nuxt/assets/nav-icons/info.svg similarity index 100% rename from src/_includes/components/icons/info.svg rename to nuxt/assets/nav-icons/info.svg diff --git a/src/_includes/components/icons/large/centralized.svg b/nuxt/assets/nav-icons/large/centralized.svg similarity index 100% rename from src/_includes/components/icons/large/centralized.svg rename to nuxt/assets/nav-icons/large/centralized.svg diff --git a/src/_includes/components/icons/large/connect.svg b/nuxt/assets/nav-icons/large/connect.svg similarity index 100% rename from src/_includes/components/icons/large/connect.svg rename to nuxt/assets/nav-icons/large/connect.svg diff --git a/src/_includes/components/icons/large/data-silos.svg b/nuxt/assets/nav-icons/large/data-silos.svg similarity index 100% rename from src/_includes/components/icons/large/data-silos.svg rename to nuxt/assets/nav-icons/large/data-silos.svg diff --git a/src/_includes/components/icons/large/disconnected.svg b/nuxt/assets/nav-icons/large/disconnected.svg similarity index 100% rename from src/_includes/components/icons/large/disconnected.svg rename to nuxt/assets/nav-icons/large/disconnected.svg diff --git a/src/_includes/components/icons/large/expensive.svg b/nuxt/assets/nav-icons/large/expensive.svg similarity index 100% rename from src/_includes/components/icons/large/expensive.svg rename to nuxt/assets/nav-icons/large/expensive.svg diff --git a/src/_includes/components/icons/large/incomplete.svg b/nuxt/assets/nav-icons/large/incomplete.svg similarity index 100% rename from src/_includes/components/icons/large/incomplete.svg rename to nuxt/assets/nav-icons/large/incomplete.svg diff --git a/src/_includes/components/icons/large/launch.svg b/nuxt/assets/nav-icons/large/launch.svg similarity index 100% rename from src/_includes/components/icons/large/launch.svg rename to nuxt/assets/nav-icons/large/launch.svg diff --git a/src/_includes/components/icons/large/reduce.svg b/nuxt/assets/nav-icons/large/reduce.svg similarity index 100% rename from src/_includes/components/icons/large/reduce.svg rename to nuxt/assets/nav-icons/large/reduce.svg diff --git a/src/_includes/components/icons/layers.svg b/nuxt/assets/nav-icons/layers.svg similarity index 100% rename from src/_includes/components/icons/layers.svg rename to nuxt/assets/nav-icons/layers.svg diff --git a/src/_includes/components/icons/lifebuoy.svg b/nuxt/assets/nav-icons/lifebuoy.svg similarity index 100% rename from src/_includes/components/icons/lifebuoy.svg rename to nuxt/assets/nav-icons/lifebuoy.svg diff --git a/src/_includes/components/icons/light-bulb.svg b/nuxt/assets/nav-icons/light-bulb.svg similarity index 100% rename from src/_includes/components/icons/light-bulb.svg rename to nuxt/assets/nav-icons/light-bulb.svg diff --git a/src/_includes/components/icons/link-slash.svg b/nuxt/assets/nav-icons/link-slash.svg similarity index 100% rename from src/_includes/components/icons/link-slash.svg rename to nuxt/assets/nav-icons/link-slash.svg diff --git a/src/_includes/components/icons/link.svg b/nuxt/assets/nav-icons/link.svg similarity index 100% rename from src/_includes/components/icons/link.svg rename to nuxt/assets/nav-icons/link.svg diff --git a/src/_includes/components/icons/lock-closed.svg b/nuxt/assets/nav-icons/lock-closed.svg similarity index 100% rename from src/_includes/components/icons/lock-closed.svg rename to nuxt/assets/nav-icons/lock-closed.svg diff --git a/src/_includes/components/icons/lock-open.svg b/nuxt/assets/nav-icons/lock-open.svg similarity index 100% rename from src/_includes/components/icons/lock-open.svg rename to nuxt/assets/nav-icons/lock-open.svg diff --git a/src/_includes/components/icons/lock.svg b/nuxt/assets/nav-icons/lock.svg similarity index 100% rename from src/_includes/components/icons/lock.svg rename to nuxt/assets/nav-icons/lock.svg diff --git a/src/_includes/components/icons/mail.svg b/nuxt/assets/nav-icons/mail.svg similarity index 100% rename from src/_includes/components/icons/mail.svg rename to nuxt/assets/nav-icons/mail.svg diff --git a/src/_includes/components/icons/map.svg b/nuxt/assets/nav-icons/map.svg similarity index 100% rename from src/_includes/components/icons/map.svg rename to nuxt/assets/nav-icons/map.svg diff --git a/src/_includes/components/icons/newspaper.svg b/nuxt/assets/nav-icons/newspaper.svg similarity index 100% rename from src/_includes/components/icons/newspaper.svg rename to nuxt/assets/nav-icons/newspaper.svg diff --git a/src/_includes/components/icons/nodered.svg b/nuxt/assets/nav-icons/nodered.svg similarity index 100% rename from src/_includes/components/icons/nodered.svg rename to nuxt/assets/nav-icons/nodered.svg diff --git a/src/_includes/components/icons/nr-icon.svg b/nuxt/assets/nav-icons/nr-icon.svg similarity index 100% rename from src/_includes/components/icons/nr-icon.svg rename to nuxt/assets/nav-icons/nr-icon.svg diff --git a/src/_includes/components/icons/pin-slash.svg b/nuxt/assets/nav-icons/pin-slash.svg similarity index 100% rename from src/_includes/components/icons/pin-slash.svg rename to nuxt/assets/nav-icons/pin-slash.svg diff --git a/src/_includes/components/icons/pin.svg b/nuxt/assets/nav-icons/pin.svg similarity index 100% rename from src/_includes/components/icons/pin.svg rename to nuxt/assets/nav-icons/pin.svg diff --git a/src/_includes/components/icons/play.svg b/nuxt/assets/nav-icons/play.svg similarity index 100% rename from src/_includes/components/icons/play.svg rename to nuxt/assets/nav-icons/play.svg diff --git a/src/_includes/components/icons/point-to-point.svg b/nuxt/assets/nav-icons/point-to-point.svg similarity index 100% rename from src/_includes/components/icons/point-to-point.svg rename to nuxt/assets/nav-icons/point-to-point.svg diff --git a/src/_includes/components/icons/power.svg b/nuxt/assets/nav-icons/power.svg similarity index 100% rename from src/_includes/components/icons/power.svg rename to nuxt/assets/nav-icons/power.svg diff --git a/src/_includes/components/icons/presentation.svg b/nuxt/assets/nav-icons/presentation.svg similarity index 100% rename from src/_includes/components/icons/presentation.svg rename to nuxt/assets/nav-icons/presentation.svg diff --git a/src/_includes/components/icons/privacy.svg b/nuxt/assets/nav-icons/privacy.svg similarity index 100% rename from src/_includes/components/icons/privacy.svg rename to nuxt/assets/nav-icons/privacy.svg diff --git a/src/_includes/components/icons/product-icons/ff-dashboard.svg b/nuxt/assets/nav-icons/product-icons/ff-dashboard.svg similarity index 100% rename from src/_includes/components/icons/product-icons/ff-dashboard.svg rename to nuxt/assets/nav-icons/product-icons/ff-dashboard.svg diff --git a/src/_includes/components/icons/product-icons/ff-device-agent.svg b/nuxt/assets/nav-icons/product-icons/ff-device-agent.svg similarity index 100% rename from src/_includes/components/icons/product-icons/ff-device-agent.svg rename to nuxt/assets/nav-icons/product-icons/ff-device-agent.svg diff --git a/src/_includes/components/icons/product-icons/ff-icon.svg b/nuxt/assets/nav-icons/product-icons/ff-icon.svg similarity index 100% rename from src/_includes/components/icons/product-icons/ff-icon.svg rename to nuxt/assets/nav-icons/product-icons/ff-icon.svg diff --git a/src/_includes/components/icons/product-icons/ff-project-nodes.svg b/nuxt/assets/nav-icons/product-icons/ff-project-nodes.svg similarity index 100% rename from src/_includes/components/icons/product-icons/ff-project-nodes.svg rename to nuxt/assets/nav-icons/product-icons/ff-project-nodes.svg diff --git a/src/_includes/components/icons/product-icons/node-red.svg b/nuxt/assets/nav-icons/product-icons/node-red.svg similarity index 100% rename from src/_includes/components/icons/product-icons/node-red.svg rename to nuxt/assets/nav-icons/product-icons/node-red.svg diff --git a/src/_includes/components/icons/project-nodes.svg b/nuxt/assets/nav-icons/project-nodes.svg similarity index 100% rename from src/_includes/components/icons/project-nodes.svg rename to nuxt/assets/nav-icons/project-nodes.svg diff --git a/src/_includes/components/icons/pulse.svg b/nuxt/assets/nav-icons/pulse.svg similarity index 100% rename from src/_includes/components/icons/pulse.svg rename to nuxt/assets/nav-icons/pulse.svg diff --git a/src/_includes/components/icons/puzzle-piece.svg b/nuxt/assets/nav-icons/puzzle-piece.svg similarity index 100% rename from src/_includes/components/icons/puzzle-piece.svg rename to nuxt/assets/nav-icons/puzzle-piece.svg diff --git a/src/_includes/components/icons/queue-list.svg b/nuxt/assets/nav-icons/queue-list.svg similarity index 100% rename from src/_includes/components/icons/queue-list.svg rename to nuxt/assets/nav-icons/queue-list.svg diff --git a/src/_includes/components/icons/rectangle-stack.svg b/nuxt/assets/nav-icons/rectangle-stack.svg similarity index 100% rename from src/_includes/components/icons/rectangle-stack.svg rename to nuxt/assets/nav-icons/rectangle-stack.svg diff --git a/src/_includes/components/icons/rocket-launch.svg b/nuxt/assets/nav-icons/rocket-launch.svg similarity index 100% rename from src/_includes/components/icons/rocket-launch.svg rename to nuxt/assets/nav-icons/rocket-launch.svg diff --git a/src/_includes/components/icons/role-based-access.svg b/nuxt/assets/nav-icons/role-based-access.svg similarity index 100% rename from src/_includes/components/icons/role-based-access.svg rename to nuxt/assets/nav-icons/role-based-access.svg diff --git a/src/_includes/components/icons/screen.svg b/nuxt/assets/nav-icons/screen.svg similarity index 100% rename from src/_includes/components/icons/screen.svg rename to nuxt/assets/nav-icons/screen.svg diff --git a/src/_includes/components/icons/server-stack.svg b/nuxt/assets/nav-icons/server-stack.svg similarity index 100% rename from src/_includes/components/icons/server-stack.svg rename to nuxt/assets/nav-icons/server-stack.svg diff --git a/src/_includes/components/icons/share.svg b/nuxt/assets/nav-icons/share.svg similarity index 100% rename from src/_includes/components/icons/share.svg rename to nuxt/assets/nav-icons/share.svg diff --git a/src/_includes/components/icons/shield-check.svg b/nuxt/assets/nav-icons/shield-check.svg similarity index 100% rename from src/_includes/components/icons/shield-check.svg rename to nuxt/assets/nav-icons/shield-check.svg diff --git a/src/_includes/components/icons/shield-exclamation.svg b/nuxt/assets/nav-icons/shield-exclamation.svg similarity index 100% rename from src/_includes/components/icons/shield-exclamation.svg rename to nuxt/assets/nav-icons/shield-exclamation.svg diff --git a/src/_includes/components/icons/single-sign-on.svg b/nuxt/assets/nav-icons/single-sign-on.svg similarity index 100% rename from src/_includes/components/icons/single-sign-on.svg rename to nuxt/assets/nav-icons/single-sign-on.svg diff --git a/src/_includes/components/icons/smooth.svg b/nuxt/assets/nav-icons/smooth.svg similarity index 100% rename from src/_includes/components/icons/smooth.svg rename to nuxt/assets/nav-icons/smooth.svg diff --git a/src/_includes/components/icons/snowflake.svg b/nuxt/assets/nav-icons/snowflake.svg similarity index 100% rename from src/_includes/components/icons/snowflake.svg rename to nuxt/assets/nav-icons/snowflake.svg diff --git a/src/_includes/components/icons/soc-2-badge.svg b/nuxt/assets/nav-icons/soc-2-badge.svg similarity index 100% rename from src/_includes/components/icons/soc-2-badge.svg rename to nuxt/assets/nav-icons/soc-2-badge.svg diff --git a/src/_includes/components/icons/sparkles.svg b/nuxt/assets/nav-icons/sparkles.svg similarity index 100% rename from src/_includes/components/icons/sparkles.svg rename to nuxt/assets/nav-icons/sparkles.svg diff --git a/src/_includes/components/icons/squares-2x2.svg b/nuxt/assets/nav-icons/squares-2x2.svg similarity index 100% rename from src/_includes/components/icons/squares-2x2.svg rename to nuxt/assets/nav-icons/squares-2x2.svg diff --git a/src/_includes/components/icons/squares-plus.svg b/nuxt/assets/nav-icons/squares-plus.svg similarity index 100% rename from src/_includes/components/icons/squares-plus.svg rename to nuxt/assets/nav-icons/squares-plus.svg diff --git a/src/_includes/components/icons/star.svg b/nuxt/assets/nav-icons/star.svg similarity index 100% rename from src/_includes/components/icons/star.svg rename to nuxt/assets/nav-icons/star.svg diff --git a/src/_includes/components/icons/target-view.svg b/nuxt/assets/nav-icons/target-view.svg similarity index 100% rename from src/_includes/components/icons/target-view.svg rename to nuxt/assets/nav-icons/target-view.svg diff --git a/src/_includes/components/icons/uns.svg b/nuxt/assets/nav-icons/uns.svg similarity index 100% rename from src/_includes/components/icons/uns.svg rename to nuxt/assets/nav-icons/uns.svg diff --git a/src/_includes/components/icons/upload.svg b/nuxt/assets/nav-icons/upload.svg similarity index 100% rename from src/_includes/components/icons/upload.svg rename to nuxt/assets/nav-icons/upload.svg diff --git a/src/_includes/components/icons/user-group.svg b/nuxt/assets/nav-icons/user-group.svg similarity index 100% rename from src/_includes/components/icons/user-group.svg rename to nuxt/assets/nav-icons/user-group.svg diff --git a/src/_includes/components/icons/users.svg b/nuxt/assets/nav-icons/users.svg similarity index 100% rename from src/_includes/components/icons/users.svg rename to nuxt/assets/nav-icons/users.svg diff --git a/src/_includes/components/icons/wifi.svg b/nuxt/assets/nav-icons/wifi.svg similarity index 100% rename from src/_includes/components/icons/wifi.svg rename to nuxt/assets/nav-icons/wifi.svg diff --git a/src/_includes/components/icons/wind-turbine.svg b/nuxt/assets/nav-icons/wind-turbine.svg similarity index 100% rename from src/_includes/components/icons/wind-turbine.svg rename to nuxt/assets/nav-icons/wind-turbine.svg diff --git a/src/_includes/components/icons/wrench-screwdriver.svg b/nuxt/assets/nav-icons/wrench-screwdriver.svg similarity index 100% rename from src/_includes/components/icons/wrench-screwdriver.svg rename to nuxt/assets/nav-icons/wrench-screwdriver.svg diff --git a/src/_includes/components/icons/x-circle.svg b/nuxt/assets/nav-icons/x-circle.svg similarity index 100% rename from src/_includes/components/icons/x-circle.svg rename to nuxt/assets/nav-icons/x-circle.svg diff --git a/src/_includes/components/icons/x-mark.svg b/nuxt/assets/nav-icons/x-mark.svg similarity index 100% rename from src/_includes/components/icons/x-mark.svg rename to nuxt/assets/nav-icons/x-mark.svg diff --git a/nuxt/components/AppFooter.vue b/nuxt/components/AppFooter.vue index ec90817249..be45a8629b 100644 --- a/nuxt/components/AppFooter.vue +++ b/nuxt/components/AppFooter.vue @@ -1,7 +1,6 @@ <script setup> -// Shared with the Eleventy layout, which reads the same file as an 11ty _data -// global. Edit the nav or footer there and both renderers follow. -import chrome from '../../src/_data/chrome.json' +// The nav and footer links live in nuxt/data/chrome.json; edit them there. +import chrome from '../data/chrome.json' const resolveHref = useResolveHref() diff --git a/nuxt/components/AppHeader.vue b/nuxt/components/AppHeader.vue index ad67dcef2d..d9b297485f 100644 --- a/nuxt/components/AppHeader.vue +++ b/nuxt/components/AppHeader.vue @@ -1,9 +1,8 @@ <script setup> import { onMounted } from 'vue' -import navHighlights from '../../src/_data/navHighlights.json' -// Shared with the Eleventy layout, which reads the same file as an 11ty _data -// global. Edit the nav or footer there and both renderers follow. -import chrome from '../../src/_data/chrome.json' +import navHighlights from '../data/navHighlights.json' +// The nav and footer links live in nuxt/data/chrome.json; edit them there. +import chrome from '../data/chrome.json' const hl = (key) => { const entry = navHighlights[key] diff --git a/nuxt/components/AppUtilityBar.vue b/nuxt/components/AppUtilityBar.vue index 3a2576a992..9035a7d6db 100644 --- a/nuxt/components/AppUtilityBar.vue +++ b/nuxt/components/AppUtilityBar.vue @@ -2,8 +2,7 @@ import { onMounted } from 'vue' import { useEvents } from '~/composables/useEvents' -// Mirrors src/_includes/components/top-utility-bar.njk (11ty); keep both -// files in sync when editing. +// Ported from src/_includes/components/top-utility-bar.njk (11ty). const events = useEvents() onMounted(() => { diff --git a/nuxt/components/BlogTagNav.vue b/nuxt/components/BlogTagNav.vue index ffe6f3745f..84b9cd0ed8 100644 --- a/nuxt/components/BlogTagNav.vue +++ b/nuxt/components/BlogTagNav.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import blogTags from '../../src/_data/blogTags.json' +import blogTags from '../data/blogTags.json' defineProps<{ activeTag?: string | null diff --git a/nuxt/components/BlueprintCompanyTile.vue b/nuxt/components/BlueprintCompanyTile.vue index 1af10198ca..496ae29b82 100644 --- a/nuxt/components/BlueprintCompanyTile.vue +++ b/nuxt/components/BlueprintCompanyTile.vue @@ -1,7 +1,7 @@ <script setup lang="ts"> // src/_includes/blueprints/ - the `renderCompanyTile` shortcode from .eleventy.js, whose // only two callers were the blueprint card and the blueprint layout. The .company-tile -// classes it emitted are still styled by src/css/style.css. +// classes it emitted are still styled by nuxt/assets/css/style.css. // // The shortcode interpolated the company's fields straight into an HTML string. These come // from a data file rather than page content, but they are still values from another diff --git a/nuxt/components/CtaCustom.vue b/nuxt/components/CtaCustom.vue index e48678af6a..504a160f75 100644 --- a/nuxt/components/CtaCustom.vue +++ b/nuxt/components/CtaCustom.vue @@ -47,7 +47,7 @@ const props = withDefaults(defineProps<{ // `external` prop. Unlike the five reserved components (which each know // their own destination), CtaCustom can't infer this, so it defaults to // the safer choice: a full page load always works, while defaulting to - // `false` could 404 a link to a still-11ty page via client-side routing. + // `false` could 404 a link to a path Nuxt has no page for via client-side routing. external?: boolean // For a link to an actual external site, where opening in the current // tab would navigate the visitor away - not needed for `external`, which diff --git a/nuxt/components/DifferentiatorCards.vue b/nuxt/components/DifferentiatorCards.vue index 62fe5985c4..ae26f7c8b5 100644 --- a/nuxt/components/DifferentiatorCards.vue +++ b/nuxt/components/DifferentiatorCards.vue @@ -16,7 +16,7 @@ withDefaults(defineProps<{ // book-demo) rely on the default size; the ROI calculator's descriptions run much // longer and need a smaller size, which a parent-level class can't reach — Vue's // attrs fallthrough only lands on this component's root, not this nested <p>, and - // a legacy global `p { font-size: 1rem }` rule (src/css/style.css) blocks simple + // a legacy global `p { font-size: 1rem }` rule (nuxt/assets/css/style.css) blocks simple // inheritance from an ancestor too. descriptionClass?: string }>(), { diff --git a/nuxt/components/HomeHeroSlides.vue b/nuxt/components/HomeHeroSlides.vue index 5ffb53d6d9..0654a03992 100644 --- a/nuxt/components/HomeHeroSlides.vue +++ b/nuxt/components/HomeHeroSlides.vue @@ -10,7 +10,7 @@ // The .njk's inline script queried .hero-slide and ran two timers with no teardown. This // is one interval, cleared on unmount, and it still honours prefers-reduced-motion by // never starting. -import slides from '../../src/images/home/hero/config.json' +import slides from '../public/images/home/hero/config.json' const FIRST_ADVANCE_MS = 3200 const INTERVAL_MS = 4400 diff --git a/nuxt/components/HubSpotMeetings.vue b/nuxt/components/HubSpotMeetings.vue index 6a50507ea9..f1d377f2b9 100644 --- a/nuxt/components/HubSpotMeetings.vue +++ b/nuxt/components/HubSpotMeetings.vue @@ -4,7 +4,7 @@ // panel that stands in for it. // // The embed is gated on analytics consent and MUST STAY THAT WAY. The .njk defined -// `window._ffLoadMeetings`, and src/js/cookieconsent-config.js calls it only once the +// `window._ffLoadMeetings`, and nuxt/assets/js/cookieconsent-config.js calls it only once the // visitor accepts; until then the embed is never injected. This registers the same global // rather than loading on mount, so declining analytics still means no third-party // scheduler script. diff --git a/nuxt/components/NavIcon.vue b/nuxt/components/NavIcon.vue index fe775da98a..b9de1a4aa9 100644 --- a/nuxt/components/NavIcon.vue +++ b/nuxt/components/NavIcon.vue @@ -1,10 +1,10 @@ <script setup lang="ts"> -// Nav and footer icons, drawn from the same SVG files Eleventy renders. +// Nav and footer icons, drawn from the SVG files in nuxt/assets/nav-icons/. // -// Eleventy's `navoption` shortcode wraps each icon file in an outer <svg> that -// carries the sizing class, leaving the file's own <svg> nested inside. This -// reproduces that exactly, so a given icon key renders identically whichever -// renderer served the page. +// Each icon file is wrapped in an outer <svg> that carries the sizing class. Most files +// are complete SVGs and end up nested inside it; a few are bare <path> fragments that +// rely on the outer viewBox. That is the markup Eleventy's `navoption` shortcode +// produced, kept so the icons render as they always have. const props = withDefaults(defineProps<{ name?: string, solid?: boolean, size?: 'sm' | 'lg' }>(), { name: '', solid: false, diff --git a/nuxt/components/RoiCalculator.vue b/nuxt/components/RoiCalculator.vue index 4ed61a2513..5dbbdf43aa 100644 --- a/nuxt/components/RoiCalculator.vue +++ b/nuxt/components/RoiCalculator.vue @@ -60,7 +60,7 @@ const categories = computed(() => [ ]) const maxCat = computed(() => Math.max(1, ...categories.value.map(c => c.value))) -// The site-wide range-input reset (src/css/style.css) paints the whole track one flat +// The site-wide range-input reset (nuxt/assets/css/style.css) paints the whole track one flat // color, so `accent-color` has no effect once -webkit-appearance is stripped. Building // the "traveled vs remaining" look needs an explicit two-stop gradient instead, split at // the field's current percentage. Colors are the theme's own CSS variables (Tailwind v4 @@ -267,7 +267,7 @@ const faultFields = [ .badge { @apply inline-grid place-items-center w-6 h-6 rounded-full text-xs mr-2 align-middle font-semibold; } .chip { @apply text-xs bg-white/15 text-white rounded-full py-1 px-3 font-semibold; } -/* Per-category thumb color, overriding the site-wide indigo reset (src/css/style.css). +/* Per-category thumb color, overriding the site-wide indigo reset (nuxt/assets/css/style.css). Tailwind has no utility for vendor pseudo-elements, so this is the one part of this component that can't move to a class. Hover variants are needed too: the global rule's `input[type="range"]::-webkit-slider-thumb:hover` selector is otherwise more specific diff --git a/nuxt/components/TestimonialCarousel.vue b/nuxt/components/TestimonialCarousel.vue index 3b6a90cddc..14d7754d27 100644 --- a/nuxt/components/TestimonialCarousel.vue +++ b/nuxt/components/TestimonialCarousel.vue @@ -5,7 +5,7 @@ // // The auto-advance stops on interaction, as it did, and also stops when the component // unmounts - the .njk's setInterval had no teardown because 11ty pages never unmount. -import testimonials from '../../src/_data/testimonials.json' +import testimonials from '../data/testimonials.json' withDefaults(defineProps<{ hideReadMore?: boolean diff --git a/nuxt/components/certified/NodeTile.vue b/nuxt/components/certified/NodeTile.vue index beaecfb548..0c9e35125e 100644 --- a/nuxt/components/certified/NodeTile.vue +++ b/nuxt/components/certified/NodeTile.vue @@ -2,11 +2,11 @@ /* Certified connector tile, shared by the /pricing/ and /integrations/ showcases. - `href` is the node's documentation page, which lives under /node-red/ and is - served by Eleventy, not by Nuxt. That is why this is a plain <a> and not a - <NuxtLink>: vue-router would resolve the path against the Nuxt route table, - find nothing, and render the Nuxt 404 instead of requesting the page. A tile - with no target stays a <div> rather than becoming a link that goes nowhere. + `href` is the node's documentation page (certifiedHref in utils/integrations-ui.ts): + the publisher's docs URL, which can be on another site, or else the collection + index under /docs/flowfuse-nodes/. That is why this is a plain <a> and not a + <NuxtLink>. A tile with no target stays a <div> rather than becoming a link that + goes nowhere. Callers attach their own click handler (for analytics); with a single root element it lands on the tile itself. diff --git a/nuxt/components/content/AgentSetupTabs.vue b/nuxt/components/content/AgentSetupTabs.vue index a86913a256..2947f6b4af 100644 --- a/nuxt/components/content/AgentSetupTabs.vue +++ b/nuxt/components/content/AgentSetupTabs.vue @@ -5,7 +5,7 @@ // changelog entry and the third-party-agents docs page need the same steps /ai has, // and hand-copying them into each surface is how they drift apart. // -// Styling comes from the .ff-agent-* rules in src/css/style.css, which nuxt.config.ts +// Styling comes from the .ff-agent-* rules in nuxt/assets/css/style.css, which nuxt.config.ts // links on every Nuxt page, rather than from utility classes on the elements. That is // forced: this renders inside .prose on the changelog and docs pages, and the site's // prose rules are unlayered, which outranks Tailwind's @layer utilities whatever the diff --git a/nuxt/components/content/CtaImage.vue b/nuxt/components/content/CtaImage.vue index 38cd998443..86e731bdca 100644 --- a/nuxt/components/content/CtaImage.vue +++ b/nuxt/components/content/CtaImage.vue @@ -2,7 +2,7 @@ // Inline image-as-CTA for blog markdown: ::cta-image{...} // `cta` is separate from the frontmatter `cta` (only used by BlogPostCta). import { useCapture } from '../../composables/useCapture' -import site from '../../../src/_data/site.json' +import site from '../../data/site.json' const props = defineProps<{ src: string diff --git a/nuxt/components/content/FeatureTierBadges.vue b/nuxt/components/content/FeatureTierBadges.vue index bc52acd6a1..adb4f762d2 100644 --- a/nuxt/components/content/FeatureTierBadges.vue +++ b/nuxt/components/content/FeatureTierBadges.vue @@ -24,7 +24,7 @@ const planList = computed(() => Array.isArray(props.plans) const badges = computed(() => planBadges(planList.value)) // window.capture is injected by the site's analytics script (see -// src/_includes/analytics/body.html) and is a no-op wrapper around +// nuxt/server/assets/analytics/body.html) and is a no-op wrapper around // posthog.capture - it's absent outside production, hence the guard. function onBadgeClick (plan: string) { if (typeof (window as any).capture === 'function') { diff --git a/nuxt/components/content/FfCommand.vue b/nuxt/components/content/FfCommand.vue index 12e80b60a2..69c3413a12 100644 --- a/nuxt/components/content/FfCommand.vue +++ b/nuxt/components/content/FfCommand.vue @@ -4,7 +4,7 @@ // is the point: before this, the markup was hand-copied into every 11ty page that // wanted one (src/platform/device-agent.njk, and /ai) with a per-page copy script. // -// Styling comes from .ff-command in src/css/style.css, which nuxt.config.ts already +// Styling comes from .ff-command in nuxt/assets/css/style.css, which nuxt.config.ts already // links on every Nuxt page, so there is no duplicated CSS here either. const props = withDefaults(defineProps<{ command: string diff --git a/nuxt/components/content/OrgChartDiagram.vue b/nuxt/components/content/OrgChartDiagram.vue index a1d2317fda..2862bd2a29 100644 --- a/nuxt/components/content/OrgChartDiagram.vue +++ b/nuxt/components/content/OrgChartDiagram.vue @@ -3,8 +3,8 @@ </template> <script setup> -// TODO: replace with queryCollection('team').order('order', 'ASC').all() once src/_data/team/ is migrated to a Nuxt content collection -const teamModules = import.meta.glob('../../../src/_data/team/*.json', { eager: true, import: 'default' }) +// TODO: replace with queryCollection('team').order('order', 'ASC').all() once nuxt/data/team/ is migrated to a Nuxt content collection +const teamModules = import.meta.glob('../../data/team/*.json', { eager: true, import: 'default' }) const team = Object.values(teamModules).sort((a, b) => a.order - b.order) const headTitles = new Set(['CTO', 'Engineering Manager', 'VP of Sales', 'Product Marketing Manager', 'Director of Product']) diff --git a/nuxt/components/content/OrgChartReports.vue b/nuxt/components/content/OrgChartReports.vue index 418a06d9b3..bcc1709822 100644 --- a/nuxt/components/content/OrgChartReports.vue +++ b/nuxt/components/content/OrgChartReports.vue @@ -22,8 +22,8 @@ </template> <script setup> -// TODO: replace with queryCollection('team').order('order', 'ASC').all() once src/_data/team/ is migrated to a Nuxt content collection -const teamModules = import.meta.glob('../../../src/_data/team/*.json', { eager: true, import: 'default' }) +// TODO: replace with queryCollection('team').order('order', 'ASC').all() once nuxt/data/team/ is migrated to a Nuxt content collection +const teamModules = import.meta.glob('../../data/team/*.json', { eager: true, import: 'default' }) const team = Object.values(teamModules).sort((a, b) => a.order - b.order) const ceo = team.find(m => !m.reports_to) diff --git a/nuxt/components/content/PromptCarousel.vue b/nuxt/components/content/PromptCarousel.vue index fdacade7c7..08264faa51 100644 --- a/nuxt/components/content/PromptCarousel.vue +++ b/nuxt/components/content/PromptCarousel.vue @@ -9,7 +9,7 @@ // wall of near-identical paragraphs that a reader scrolls past; one at a time, with // the next one's edge visible, is something they read and copy. // -// Styling comes from the .ff-prompts-* rules in src/css/style.css, not from utility +// Styling comes from the .ff-prompts-* rules in nuxt/assets/css/style.css, not from utility // classes on the elements. That is forced, same as AgentSetupTabs: this renders // inside .prose on the blog post, and the site's prose rules are unlayered, which // outranks Tailwind's @layer utilities whatever the specificity. As utilities, diff --git a/nuxt/components/content/SiteValue.vue b/nuxt/components/content/SiteValue.vue index 5dbbf7f7fd..3606b0f485 100644 --- a/nuxt/components/content/SiteValue.vue +++ b/nuxt/components/content/SiteValue.vue @@ -1,7 +1,7 @@ <template>{{ value }}</template> <script setup> -import site from '../../../src/_data/site.json' +import site from '../../data/site.json' const props = defineProps({ path: { type: String, required: true } diff --git a/nuxt/components/content/TerminalFrame.vue b/nuxt/components/content/TerminalFrame.vue index fa130fdf5f..f6b0a1d41f 100644 --- a/nuxt/components/content/TerminalFrame.vue +++ b/nuxt/components/content/TerminalFrame.vue @@ -26,7 +26,7 @@ /* MDC counterpart of the `terminalFrame` 11ty shortcode. Blog and changelog posts render through @nuxt/content, which does not process Nunjucks, so a shortcode - used there ships as literal text. Both renderers link the same compiled + used there ships as literal text. Every page links the same compiled /css/style.css, so .ff-terminal-frame gives identical chrome either way. A plain <img> rather than <NuxtImg>: the image CDN re-encodes what it is given diff --git a/nuxt/components/cta/CtaButton.vue b/nuxt/components/cta/CtaButton.vue index 9ae9743555..48bd48b9b2 100644 --- a/nuxt/components/cta/CtaButton.vue +++ b/nuxt/components/cta/CtaButton.vue @@ -10,10 +10,10 @@ const props = withDefaults(defineProps<{ href: string // Whether `href` points at a route Nuxt actually serves. NuxtLink/UButton's // `to` otherwise treats any same-origin-looking path as an internal Vue - // Router route, so a destination still on 11ty (e.g. /contact-us/, - // /book-demo/) 404s on click instead of navigating - it never reaches the - // server-side proxy that would have served it. Fixed per destination by - // each Cta* wrapper, not caller-configurable. + // Router route, so a path Nuxt has no page for 404s on click instead of + // reaching the server. All five Cta* wrappers pass false, since Nuxt serves + // every one of their destinations; CtaCustom is what links off-site. Fixed + // per destination by each wrapper, not caller-configurable. external: boolean label: string variant: 'primary' | 'primary-outlined' | 'highlight' | 'highlight-outlined' | 'nav-text' | 'ghost' @@ -157,7 +157,7 @@ function onClick () { > <!-- The main nav's "Free Trial" (.ff-nav-freetrial) keys its rest color and animated hover underline off a `.ff-nav-label` child span - see - src/css/style.css's `.ff-website header .ff-nav-freetrial .ff-nav-label` + nuxt/assets/css/style.css's `.ff-website header .ff-nav-freetrial .ff-nav-label` rules. UButton's default slot would otherwise render the label as a bare text node, so those rules silently never match. Scoped to nav-text since it's the only variant `.ff-nav-label` styling reaches. --> diff --git a/nuxt/composables/useBlogList.ts b/nuxt/composables/useBlogList.ts index 6576d55284..50ff927b42 100644 --- a/nuxt/composables/useBlogList.ts +++ b/nuxt/composables/useBlogList.ts @@ -22,7 +22,7 @@ export const BLOG_TAG_TOPICS: Record<string, string> = { tips: 'Node-RED tips', } -// Mirrors .eleventy.js's DEV_MODE_POSTS: future-dated posts are hidden outside production, +// Mirrors what .eleventy.js's DEV_MODE_POSTS did: future-dated posts are hidden in production only, // so deploy previews and dev can still preview scheduled posts. The flag is baked at build // time (see nuxt.config.ts) rather than read from process.env here: a scheduled post gets no // prerendered file, so its URL is served by the Netlify function, where process.env.CONTEXT diff --git a/nuxt/composables/useCapture.ts b/nuxt/composables/useCapture.ts index 8ac1e22fed..70f4d4139e 100644 --- a/nuxt/composables/useCapture.ts +++ b/nuxt/composables/useCapture.ts @@ -1,5 +1,5 @@ // Thin wrapper around the global `capture()` injected by the site's analytics -// script (see src/_includes/analytics/body.html), which itself no-ops when +// script (see nuxt/server/assets/analytics/body.html), which itself no-ops when // PostHog isn't loaded (no analytics consent). Guarded here too so components // can call this during SSR/tests without a `window`. export function useCapture () { diff --git a/nuxt/composables/useEvents.ts b/nuxt/composables/useEvents.ts index 648e22aaef..03a5631449 100644 --- a/nuxt/composables/useEvents.ts +++ b/nuxt/composables/useEvents.ts @@ -1,5 +1,5 @@ import { parse as parseYaml } from 'yaml' -import eventsRaw from '../../src/_data/events.yaml?raw' +import eventsRaw from '../data/events.yaml?raw' export interface SiteEvent { type: string @@ -12,9 +12,8 @@ export interface SiteEvent { // `yaml`'s parse() is a pure parser (no arbitrary type construction); events.yaml is trusted in-repo data. const events: SiteEvent[] = parseYaml(eventsRaw) || [] -// Mirrors the `isFutureDate` Eleventy filter (.eleventy.js) so the same events.yaml -// entries surface here as on the 11ty-rendered pages. Entries with no `expire` -// (standing promos) are always shown. +// The same rule as Eleventy's `isFutureDate` filter, which this replaced: an event shows +// until its `expire` date. Entries with no `expire` (standing promos) are always shown. export function useEvents(): SiteEvent[] { return events.filter(event => !event.expire || new Date(event.expire) > new Date()) } diff --git a/nuxt/composables/useHomeLogos.ts b/nuxt/composables/useHomeLogos.ts index c739d59fab..b7d9958b3d 100644 --- a/nuxt/composables/useHomeLogos.ts +++ b/nuxt/composables/useHomeLogos.ts @@ -1,7 +1,7 @@ // Logo filenames for the social-proof carousel, mirroring the `homeLogos` // Eleventy collection. Uses import.meta.glob (like useTeam.ts) instead of a -// runtime readdirSync, which fails once deployed (no src/ in the function bundle). -const logoModules = import.meta.glob('../../src/images/home-logos/*.{png,svg}') +// runtime readdirSync, which fails once deployed (nuxt/public/ is not in the function bundle). +const logoModules = import.meta.glob('../public/images/home-logos/*.{png,svg}') const logoFiles = Object.keys(logoModules).map(path => path.split('/').pop() as string) diff --git a/nuxt/composables/useResolveHref.ts b/nuxt/composables/useResolveHref.ts index 03af1327ee..eeb21721b8 100644 --- a/nuxt/composables/useResolveHref.ts +++ b/nuxt/composables/useResolveHref.ts @@ -1,4 +1,4 @@ -import site from '../../src/_data/site.json' +import site from '../data/site.json' // Mirrors the "resolveHref" Eleventy filter: an href of "site:<key>" is a // pointer into site.json rather than a literal URL, so values like the job diff --git a/nuxt/composables/useTeam.ts b/nuxt/composables/useTeam.ts index 10d1a132ac..fc84d73b57 100644 --- a/nuxt/composables/useTeam.ts +++ b/nuxt/composables/useTeam.ts @@ -17,8 +17,8 @@ interface TeamMember { blog?: string } -const teamModules = import.meta.glob('../../src/_data/team/*.json', { eager: true, import: 'default' }) -const guestModules = import.meta.glob('../../src/_data/guests/*.json', { eager: true, import: 'default' }) +const teamModules = import.meta.glob('../data/team/*.json', { eager: true, import: 'default' }) +const guestModules = import.meta.glob('../data/guests/*.json', { eager: true, import: 'default' }) function keyFor(path: string): string { return path.split('/').pop()!.replace(/\.json$/, '') diff --git a/nuxt/content.config.ts b/nuxt/content.config.ts index 1b17fecc69..8ff188f8e9 100644 --- a/nuxt/content.config.ts +++ b/nuxt/content.config.ts @@ -1,4 +1,3 @@ -import { join } from 'node:path' import { defineContentConfig, defineCollection, z } from '@nuxt/content' const tierValue = z.object({ @@ -76,14 +75,9 @@ export default defineContentConfig({ }).optional(), }) }), - // Source files stay at src/changelog/ (11ty's historical location) rather than - // being copied into nuxt/content/ - keeps this migration a content-config-only change. changelog: defineCollection({ type: 'page', - source: { - cwd: join(__dirname, '../src'), - include: 'changelog/**/*.md', - }, + source: 'changelog/**/*.md', schema: z.object({ description: z.string().optional(), subtitle: z.string().optional(), @@ -98,14 +92,9 @@ export default defineContentConfig({ release: z.string().regex(/^\d+\.\d+$/), }) }), - // Source files stay at src/blog/ (11ty's historical location) rather than - // being copied into nuxt/content/ - keeps this migration a content-config-only change. blog: defineCollection({ type: 'page', - source: { - cwd: join(__dirname, '../src'), - include: 'blog/**/*.md', - }, + source: 'blog/**/*.md', schema: z.object({ subtitle: z.string().optional(), description: z.string().optional(), @@ -180,18 +169,11 @@ export default defineContentConfig({ updated: z.string().optional(), }) }), - // Source files stay at src/customer-stories/ (11ty's historical location) rather than - // being copied into nuxt/content/ - keeps this migration a content-config-only change. - // The directory data file (src/customer-stories/customer-stories.json) sets - // `permalink: false` so 11ty keeps these in `collections.stories` (still read by a - // few live 11ty pages - src/landing/tulip.njk, src/node-red/index.njk, - // src/_includes/stories-block.njk) without also writing output files for them. + // Named `stories` rather than `customer-stories`: several pages query it by that + // name (the listing, the landing pages, ExploreMoreStories.vue). stories: defineCollection({ type: 'page', - source: { - cwd: join(__dirname, '../src'), - include: 'customer-stories/**/*.md', - }, + source: 'customer-stories/**/*.md', schema: z.object({ description: z.string().optional(), image: z.string().optional(), @@ -228,7 +210,7 @@ export default defineContentConfig({ logo: z.string().optional(), quote: z.string().optional(), // Byline for `quote`. Preferred: `quoteAuthorSlug` names a file in - // src/_data/team/ or src/_data/guests/ (resolved via useTeamMember) so + // nuxt/data/team/ or nuxt/data/guests/ (resolved via useTeamMember) so // name/title/headshot come from that JSON. Not every quoted person has // one, so quoteAuthor/quoteRole/quoteAvatar remain as a manual fallback - // quoteRole is job title only, `brand` above supplies the company name @@ -245,18 +227,10 @@ export default defineContentConfig({ }) }), // ExploreMoreStories.vue also queries this `stories` collection - no separate one needed. - // Source files stay at src/webinars/ (still served by 11ty, see LEGACY_PREFIXES - // in nuxt/server/middleware/legacy.ts) - only queried for the "Latest/Upcoming - // Webinar" tile on the thank-you pages, so no `sitemap` field either. - // Source files stay at src/webinars/ (11ty's historical location) rather than being - // copied into nuxt/content/, same as blog/changelog/customer-stories above. // Rendered by pages/webinars/[...slug].vue; listed by pages/webinars/index.vue. webinars: defineCollection({ type: 'page', - source: { - cwd: join(__dirname, '../src'), - include: 'webinars/**/*.md', - }, + source: 'webinars/**/*.md', schema: z.object({ subtitle: z.string().optional(), description: z.string().optional(), @@ -269,7 +243,7 @@ export default defineContentConfig({ image: z.string().optional(), // YouTube id. When set it replaces the hero image with the embed. video: z.string().optional(), - // src/_data/{team,guests} basenames, resolved through useAuthorMembers. + // nuxt/data/{team,guests} basenames, resolved through useAuthorMembers. hosts: z.array(z.string()).optional(), hubspot: z.object({ // Registration form, shown only while the webinar is still upcoming. @@ -663,7 +637,7 @@ export default defineContentConfig({ hero: z.object({ eyebrow: z.string().optional(), // A NavIcon registry key. The .njk named an SVG path under - // src/_includes/; the lift rewrote those to keys. + // 11ty's include tree; the lift rewrote those to keys. eyebrowIcon: z.string().optional(), heading: z.string(), description: z.string().optional(), diff --git a/src/blog/2021/04/first-deploy.md b/nuxt/content/blog/2021/04/first-deploy.md similarity index 100% rename from src/blog/2021/04/first-deploy.md rename to nuxt/content/blog/2021/04/first-deploy.md diff --git a/src/blog/2021/05/welcome-ben.md b/nuxt/content/blog/2021/05/welcome-ben.md similarity index 100% rename from src/blog/2021/05/welcome-ben.md rename to nuxt/content/blog/2021/05/welcome-ben.md diff --git a/src/blog/2022/01/community-news-01.md b/nuxt/content/blog/2022/01/community-news-01.md similarity index 100% rename from src/blog/2022/01/community-news-01.md rename to nuxt/content/blog/2022/01/community-news-01.md diff --git a/src/blog/2022/01/flowforge-01-released.md b/nuxt/content/blog/2022/01/flowforge-01-released.md similarity index 100% rename from src/blog/2022/01/flowforge-01-released.md rename to nuxt/content/blog/2022/01/flowforge-01-released.md diff --git a/src/blog/2022/01/welcome-steve.md b/nuxt/content/blog/2022/01/welcome-steve.md similarity index 100% rename from src/blog/2022/01/welcome-steve.md rename to nuxt/content/blog/2022/01/welcome-steve.md diff --git a/src/blog/2022/01/welcome-zj.md b/nuxt/content/blog/2022/01/welcome-zj.md similarity index 100% rename from src/blog/2022/01/welcome-zj.md rename to nuxt/content/blog/2022/01/welcome-zj.md diff --git a/src/blog/2022/02/announcing-flowforge-cloud.md b/nuxt/content/blog/2022/02/announcing-flowforge-cloud.md similarity index 100% rename from src/blog/2022/02/announcing-flowforge-cloud.md rename to nuxt/content/blog/2022/02/announcing-flowforge-cloud.md diff --git a/src/blog/2022/02/flowforge-02-released.md b/nuxt/content/blog/2022/02/flowforge-02-released.md similarity index 100% rename from src/blog/2022/02/flowforge-02-released.md rename to nuxt/content/blog/2022/02/flowforge-02-released.md diff --git a/src/blog/2022/02/use-case-solar-afloat.md b/nuxt/content/blog/2022/02/use-case-solar-afloat.md similarity index 100% rename from src/blog/2022/02/use-case-solar-afloat.md rename to nuxt/content/blog/2022/02/use-case-solar-afloat.md diff --git a/src/blog/2022/02/welcome-joe.md b/nuxt/content/blog/2022/02/welcome-joe.md similarity index 100% rename from src/blog/2022/02/welcome-joe.md rename to nuxt/content/blog/2022/02/welcome-joe.md diff --git a/src/blog/2022/03/community-news-02.md b/nuxt/content/blog/2022/03/community-news-02.md similarity index 100% rename from src/blog/2022/03/community-news-02.md rename to nuxt/content/blog/2022/03/community-news-02.md diff --git a/src/blog/2022/03/flowforge-03-released.md b/nuxt/content/blog/2022/03/flowforge-03-released.md similarity index 100% rename from src/blog/2022/03/flowforge-03-released.md rename to nuxt/content/blog/2022/03/flowforge-03-released.md diff --git a/src/blog/2022/04/community-news-03.md b/nuxt/content/blog/2022/04/community-news-03.md similarity index 100% rename from src/blog/2022/04/community-news-03.md rename to nuxt/content/blog/2022/04/community-news-03.md diff --git a/src/blog/2022/04/flowforge-04-released.md b/nuxt/content/blog/2022/04/flowforge-04-released.md similarity index 100% rename from src/blog/2022/04/flowforge-04-released.md rename to nuxt/content/blog/2022/04/flowforge-04-released.md diff --git a/src/blog/2022/04/flowforge-accepting-customers.md b/nuxt/content/blog/2022/04/flowforge-accepting-customers.md similarity index 100% rename from src/blog/2022/04/flowforge-accepting-customers.md rename to nuxt/content/blog/2022/04/flowforge-accepting-customers.md diff --git a/src/blog/2022/05/community-news-04.md b/nuxt/content/blog/2022/05/community-news-04.md similarity index 100% rename from src/blog/2022/05/community-news-04.md rename to nuxt/content/blog/2022/05/community-news-04.md diff --git a/src/blog/2022/05/flowforge-05-released.md b/nuxt/content/blog/2022/05/flowforge-05-released.md similarity index 100% rename from src/blog/2022/05/flowforge-05-released.md rename to nuxt/content/blog/2022/05/flowforge-05-released.md diff --git a/src/blog/2022/05/node-red-3-beta-stack.md b/nuxt/content/blog/2022/05/node-red-3-beta-stack.md similarity index 100% rename from src/blog/2022/05/node-red-3-beta-stack.md rename to nuxt/content/blog/2022/05/node-red-3-beta-stack.md diff --git a/src/blog/2022/05/sign-up-for-flowforge-cloud.md b/nuxt/content/blog/2022/05/sign-up-for-flowforge-cloud.md similarity index 100% rename from src/blog/2022/05/sign-up-for-flowforge-cloud.md rename to nuxt/content/blog/2022/05/sign-up-for-flowforge-cloud.md diff --git a/src/blog/2022/06/community-news-05.md b/nuxt/content/blog/2022/06/community-news-05.md similarity index 100% rename from src/blog/2022/06/community-news-05.md rename to nuxt/content/blog/2022/06/community-news-05.md diff --git a/src/blog/2022/06/flowforge-06-released.md b/nuxt/content/blog/2022/06/flowforge-06-released.md similarity index 100% rename from src/blog/2022/06/flowforge-06-released.md rename to nuxt/content/blog/2022/06/flowforge-06-released.md diff --git a/src/blog/2022/07/community-news-06.md b/nuxt/content/blog/2022/07/community-news-06.md similarity index 100% rename from src/blog/2022/07/community-news-06.md rename to nuxt/content/blog/2022/07/community-news-06.md diff --git a/src/blog/2022/07/flowforge-07-released.md b/nuxt/content/blog/2022/07/flowforge-07-released.md similarity index 100% rename from src/blog/2022/07/flowforge-07-released.md rename to nuxt/content/blog/2022/07/flowforge-07-released.md diff --git a/src/blog/2022/07/new-projecttype.md b/nuxt/content/blog/2022/07/new-projecttype.md similarity index 100% rename from src/blog/2022/07/new-projecttype.md rename to nuxt/content/blog/2022/07/new-projecttype.md diff --git a/src/blog/2022/08/community-news-06.md b/nuxt/content/blog/2022/08/community-news-06.md similarity index 100% rename from src/blog/2022/08/community-news-06.md rename to nuxt/content/blog/2022/08/community-news-06.md diff --git a/src/blog/2022/08/flowforge-08-released.md b/nuxt/content/blog/2022/08/flowforge-08-released.md similarity index 100% rename from src/blog/2022/08/flowforge-08-released.md rename to nuxt/content/blog/2022/08/flowforge-08-released.md diff --git a/src/blog/2022/09/community-news-08.md b/nuxt/content/blog/2022/09/community-news-08.md similarity index 100% rename from src/blog/2022/09/community-news-08.md rename to nuxt/content/blog/2022/09/community-news-08.md diff --git a/src/blog/2022/09/flowforge-010-released.md b/nuxt/content/blog/2022/09/flowforge-010-released.md similarity index 100% rename from src/blog/2022/09/flowforge-010-released.md rename to nuxt/content/blog/2022/09/flowforge-010-released.md diff --git a/src/blog/2022/09/flowforge-09-released.md b/nuxt/content/blog/2022/09/flowforge-09-released.md similarity index 100% rename from src/blog/2022/09/flowforge-09-released.md rename to nuxt/content/blog/2022/09/flowforge-09-released.md diff --git a/src/blog/2022/09/static-ips.md b/nuxt/content/blog/2022/09/static-ips.md similarity index 100% rename from src/blog/2022/09/static-ips.md rename to nuxt/content/blog/2022/09/static-ips.md diff --git a/src/blog/2022/10/community-news-09.md b/nuxt/content/blog/2022/10/community-news-09.md similarity index 100% rename from src/blog/2022/10/community-news-09.md rename to nuxt/content/blog/2022/10/community-news-09.md diff --git a/src/blog/2022/10/db-migration-01.md b/nuxt/content/blog/2022/10/db-migration-01.md similarity index 100% rename from src/blog/2022/10/db-migration-01.md rename to nuxt/content/blog/2022/10/db-migration-01.md diff --git a/src/blog/2022/10/ff-docker-gcp.md b/nuxt/content/blog/2022/10/ff-docker-gcp.md similarity index 100% rename from src/blog/2022/10/ff-docker-gcp.md rename to nuxt/content/blog/2022/10/ff-docker-gcp.md diff --git a/src/blog/2022/10/flowforge-1-released.md b/nuxt/content/blog/2022/10/flowforge-1-released.md similarity index 100% rename from src/blog/2022/10/flowforge-1-released.md rename to nuxt/content/blog/2022/10/flowforge-1-released.md diff --git a/src/blog/2022/10/seed-round-bring-node-red-to-enterprise.md b/nuxt/content/blog/2022/10/seed-round-bring-node-red-to-enterprise.md similarity index 100% rename from src/blog/2022/10/seed-round-bring-node-red-to-enterprise.md rename to nuxt/content/blog/2022/10/seed-round-bring-node-red-to-enterprise.md diff --git a/src/blog/2022/11/community-news-10.md b/nuxt/content/blog/2022/11/community-news-10.md similarity index 100% rename from src/blog/2022/11/community-news-10.md rename to nuxt/content/blog/2022/11/community-news-10.md diff --git a/src/blog/2022/11/flowforge-1-1-released.md b/nuxt/content/blog/2022/11/flowforge-1-1-released.md similarity index 100% rename from src/blog/2022/11/flowforge-1-1-released.md rename to nuxt/content/blog/2022/11/flowforge-1-1-released.md diff --git a/src/blog/2022/11/respin-docker-compose-01.md b/nuxt/content/blog/2022/11/respin-docker-compose-01.md similarity index 100% rename from src/blog/2022/11/respin-docker-compose-01.md rename to nuxt/content/blog/2022/11/respin-docker-compose-01.md diff --git a/src/blog/2022/11/scaling-node-red-with-diy-tooling.md b/nuxt/content/blog/2022/11/scaling-node-red-with-diy-tooling.md similarity index 100% rename from src/blog/2022/11/scaling-node-red-with-diy-tooling.md rename to nuxt/content/blog/2022/11/scaling-node-red-with-diy-tooling.md diff --git a/src/blog/2022/12/community-news-11.md b/nuxt/content/blog/2022/12/community-news-11.md similarity index 100% rename from src/blog/2022/12/community-news-11.md rename to nuxt/content/blog/2022/12/community-news-11.md diff --git a/src/blog/2022/12/create-http-trigger-with-authentication.md b/nuxt/content/blog/2022/12/create-http-trigger-with-authentication.md similarity index 100% rename from src/blog/2022/12/create-http-trigger-with-authentication.md rename to nuxt/content/blog/2022/12/create-http-trigger-with-authentication.md diff --git a/src/blog/2022/12/flowforge-1-1-2-released.md b/nuxt/content/blog/2022/12/flowforge-1-1-2-released.md similarity index 100% rename from src/blog/2022/12/flowforge-1-1-2-released.md rename to nuxt/content/blog/2022/12/flowforge-1-1-2-released.md diff --git a/src/blog/2022/12/flowforge-1-2-0-released.md b/nuxt/content/blog/2022/12/flowforge-1-2-0-released.md similarity index 100% rename from src/blog/2022/12/flowforge-1-2-0-released.md rename to nuxt/content/blog/2022/12/flowforge-1-2-0-released.md diff --git a/src/blog/2022/12/flowforge-gcp-https-set-up.md b/nuxt/content/blog/2022/12/flowforge-gcp-https-set-up.md similarity index 100% rename from src/blog/2022/12/flowforge-gcp-https-set-up.md rename to nuxt/content/blog/2022/12/flowforge-gcp-https-set-up.md diff --git a/src/blog/2022/12/flowforge-joins-openjs-foundation.md b/nuxt/content/blog/2022/12/flowforge-joins-openjs-foundation.md similarity index 100% rename from src/blog/2022/12/flowforge-joins-openjs-foundation.md rename to nuxt/content/blog/2022/12/flowforge-joins-openjs-foundation.md diff --git a/src/blog/2022/12/node-red-flow-best-practice.md b/nuxt/content/blog/2022/12/node-red-flow-best-practice.md similarity index 100% rename from src/blog/2022/12/node-red-flow-best-practice.md rename to nuxt/content/blog/2022/12/node-red-flow-best-practice.md diff --git a/src/blog/2022/12/what-flowforge-adds-to-node-red.md b/nuxt/content/blog/2022/12/what-flowforge-adds-to-node-red.md similarity index 100% rename from src/blog/2022/12/what-flowforge-adds-to-node-red.md rename to nuxt/content/blog/2022/12/what-flowforge-adds-to-node-red.md diff --git a/src/blog/2023/01/community-news-12.md b/nuxt/content/blog/2023/01/community-news-12.md similarity index 100% rename from src/blog/2023/01/community-news-12.md rename to nuxt/content/blog/2023/01/community-news-12.md diff --git a/src/blog/2023/01/environment-variables-in-node-red.md b/nuxt/content/blog/2023/01/environment-variables-in-node-red.md similarity index 100% rename from src/blog/2023/01/environment-variables-in-node-red.md rename to nuxt/content/blog/2023/01/environment-variables-in-node-red.md diff --git a/src/blog/2023/01/flowforge-1-3-0-released.md b/nuxt/content/blog/2023/01/flowforge-1-3-0-released.md similarity index 100% rename from src/blog/2023/01/flowforge-1-3-0-released.md rename to nuxt/content/blog/2023/01/flowforge-1-3-0-released.md diff --git a/src/blog/2023/01/flowforge-1.2.1-released.md b/nuxt/content/blog/2023/01/flowforge-1.2.1-released.md similarity index 100% rename from src/blog/2023/01/flowforge-1.2.1-released.md rename to nuxt/content/blog/2023/01/flowforge-1.2.1-released.md diff --git a/src/blog/2023/01/flowforge-story.md b/nuxt/content/blog/2023/01/flowforge-story.md similarity index 100% rename from src/blog/2023/01/flowforge-story.md rename to nuxt/content/blog/2023/01/flowforge-story.md diff --git a/src/blog/2023/01/getting-started-with-node-red.md b/nuxt/content/blog/2023/01/getting-started-with-node-red.md similarity index 100% rename from src/blog/2023/01/getting-started-with-node-red.md rename to nuxt/content/blog/2023/01/getting-started-with-node-red.md diff --git a/src/blog/2023/02/3-quick-node-red-tips-1.md b/nuxt/content/blog/2023/02/3-quick-node-red-tips-1.md similarity index 100% rename from src/blog/2023/02/3-quick-node-red-tips-1.md rename to nuxt/content/blog/2023/02/3-quick-node-red-tips-1.md diff --git a/src/blog/2023/02/3-quick-node-red-tips-2.md b/nuxt/content/blog/2023/02/3-quick-node-red-tips-2.md similarity index 100% rename from src/blog/2023/02/3-quick-node-red-tips-2.md rename to nuxt/content/blog/2023/02/3-quick-node-red-tips-2.md diff --git a/src/blog/2023/02/community-news-02.md b/nuxt/content/blog/2023/02/community-news-02.md similarity index 100% rename from src/blog/2023/02/community-news-02.md rename to nuxt/content/blog/2023/02/community-news-02.md diff --git a/src/blog/2023/02/flowforge-1-4-0-released.md b/nuxt/content/blog/2023/02/flowforge-1-4-0-released.md similarity index 100% rename from src/blog/2023/02/flowforge-1-4-0-released.md rename to nuxt/content/blog/2023/02/flowforge-1-4-0-released.md diff --git a/src/blog/2023/02/highly-available-node-red.md b/nuxt/content/blog/2023/02/highly-available-node-red.md similarity index 100% rename from src/blog/2023/02/highly-available-node-red.md rename to nuxt/content/blog/2023/02/highly-available-node-red.md diff --git a/src/blog/2023/02/ming-blog.md b/nuxt/content/blog/2023/02/ming-blog.md similarity index 100% rename from src/blog/2023/02/ming-blog.md rename to nuxt/content/blog/2023/02/ming-blog.md diff --git a/src/blog/2023/02/service-disruption-report-2023-01-27.md b/nuxt/content/blog/2023/02/service-disruption-report-2023-01-27.md similarity index 100% rename from src/blog/2023/02/service-disruption-report-2023-01-27.md rename to nuxt/content/blog/2023/02/service-disruption-report-2023-01-27.md diff --git a/src/blog/2023/02/webinar-1-missed-questions.md b/nuxt/content/blog/2023/02/webinar-1-missed-questions.md similarity index 100% rename from src/blog/2023/02/webinar-1-missed-questions.md rename to nuxt/content/blog/2023/02/webinar-1-missed-questions.md diff --git a/src/blog/2023/03/3-quick-node-red-tips-3.md b/nuxt/content/blog/2023/03/3-quick-node-red-tips-3.md similarity index 100% rename from src/blog/2023/03/3-quick-node-red-tips-3.md rename to nuxt/content/blog/2023/03/3-quick-node-red-tips-3.md diff --git a/src/blog/2023/03/3-quick-node-red-tips-4.md b/nuxt/content/blog/2023/03/3-quick-node-red-tips-4.md similarity index 100% rename from src/blog/2023/03/3-quick-node-red-tips-4.md rename to nuxt/content/blog/2023/03/3-quick-node-red-tips-4.md diff --git a/src/blog/2023/03/3-quick-node-red-tips-5.md b/nuxt/content/blog/2023/03/3-quick-node-red-tips-5.md similarity index 100% rename from src/blog/2023/03/3-quick-node-red-tips-5.md rename to nuxt/content/blog/2023/03/3-quick-node-red-tips-5.md diff --git a/src/blog/2023/03/community-news-03.md b/nuxt/content/blog/2023/03/community-news-03.md similarity index 100% rename from src/blog/2023/03/community-news-03.md rename to nuxt/content/blog/2023/03/community-news-03.md diff --git a/src/blog/2023/03/comparing-node-red-dashboards.md b/nuxt/content/blog/2023/03/comparing-node-red-dashboards.md similarity index 100% rename from src/blog/2023/03/comparing-node-red-dashboards.md rename to nuxt/content/blog/2023/03/comparing-node-red-dashboards.md diff --git a/src/blog/2023/03/flowforge-1-5-0-released.md b/nuxt/content/blog/2023/03/flowforge-1-5-0-released.md similarity index 100% rename from src/blog/2023/03/flowforge-1-5-0-released.md rename to nuxt/content/blog/2023/03/flowforge-1-5-0-released.md diff --git a/src/blog/2023/03/ibmcloud-starter-removed.md b/nuxt/content/blog/2023/03/ibmcloud-starter-removed.md similarity index 100% rename from src/blog/2023/03/ibmcloud-starter-removed.md rename to nuxt/content/blog/2023/03/ibmcloud-starter-removed.md diff --git a/src/blog/2023/03/integration-platform-for-edge-computing.md b/nuxt/content/blog/2023/03/integration-platform-for-edge-computing.md similarity index 100% rename from src/blog/2023/03/integration-platform-for-edge-computing.md rename to nuxt/content/blog/2023/03/integration-platform-for-edge-computing.md diff --git a/src/blog/2023/03/terminology-changes.md b/nuxt/content/blog/2023/03/terminology-changes.md similarity index 100% rename from src/blog/2023/03/terminology-changes.md rename to nuxt/content/blog/2023/03/terminology-changes.md diff --git a/src/blog/2023/03/why-should-you-use-node-red-function-nodes.md b/nuxt/content/blog/2023/03/why-should-you-use-node-red-function-nodes.md similarity index 100% rename from src/blog/2023/03/why-should-you-use-node-red-function-nodes.md rename to nuxt/content/blog/2023/03/why-should-you-use-node-red-function-nodes.md diff --git a/src/blog/2023/04/3-quick-node-red-tips-6.md b/nuxt/content/blog/2023/04/3-quick-node-red-tips-6.md similarity index 100% rename from src/blog/2023/04/3-quick-node-red-tips-6.md rename to nuxt/content/blog/2023/04/3-quick-node-red-tips-6.md diff --git a/src/blog/2023/04/community-news-04.md b/nuxt/content/blog/2023/04/community-news-04.md similarity index 100% rename from src/blog/2023/04/community-news-04.md rename to nuxt/content/blog/2023/04/community-news-04.md diff --git a/src/blog/2023/04/flowforge-1-6-released.md b/nuxt/content/blog/2023/04/flowforge-1-6-released.md similarity index 100% rename from src/blog/2023/04/flowforge-1-6-released.md rename to nuxt/content/blog/2023/04/flowforge-1-6-released.md diff --git a/src/blog/2023/04/hannover-messe.md b/nuxt/content/blog/2023/04/hannover-messe.md similarity index 100% rename from src/blog/2023/04/hannover-messe.md rename to nuxt/content/blog/2023/04/hannover-messe.md diff --git a/src/blog/2023/04/nodered-community-health.md b/nuxt/content/blog/2023/04/nodered-community-health.md similarity index 100% rename from src/blog/2023/04/nodered-community-health.md rename to nuxt/content/blog/2023/04/nodered-community-health.md diff --git a/src/blog/2023/04/securing-node-red-in-production.md b/nuxt/content/blog/2023/04/securing-node-red-in-production.md similarity index 100% rename from src/blog/2023/04/securing-node-red-in-production.md rename to nuxt/content/blog/2023/04/securing-node-red-in-production.md diff --git a/src/blog/2023/05/bringing-high-availability-to-node-red.md b/nuxt/content/blog/2023/05/bringing-high-availability-to-node-red.md similarity index 100% rename from src/blog/2023/05/bringing-high-availability-to-node-red.md rename to nuxt/content/blog/2023/05/bringing-high-availability-to-node-red.md diff --git a/src/blog/2023/05/chatgpt-nodered-fcn-node.md b/nuxt/content/blog/2023/05/chatgpt-nodered-fcn-node.md similarity index 100% rename from src/blog/2023/05/chatgpt-nodered-fcn-node.md rename to nuxt/content/blog/2023/05/chatgpt-nodered-fcn-node.md diff --git a/src/blog/2023/05/community-news-05.md b/nuxt/content/blog/2023/05/community-news-05.md similarity index 100% rename from src/blog/2023/05/community-news-05.md rename to nuxt/content/blog/2023/05/community-news-05.md diff --git a/src/blog/2023/05/device-agent-as-a-service.md b/nuxt/content/blog/2023/05/device-agent-as-a-service.md similarity index 100% rename from src/blog/2023/05/device-agent-as-a-service.md rename to nuxt/content/blog/2023/05/device-agent-as-a-service.md diff --git a/src/blog/2023/05/flowforge-1-7-released.md b/nuxt/content/blog/2023/05/flowforge-1-7-released.md similarity index 100% rename from src/blog/2023/05/flowforge-1-7-released.md rename to nuxt/content/blog/2023/05/flowforge-1-7-released.md diff --git a/src/blog/2023/05/integrating-modbus-with-node-red.md b/nuxt/content/blog/2023/05/integrating-modbus-with-node-red.md similarity index 100% rename from src/blog/2023/05/integrating-modbus-with-node-red.md rename to nuxt/content/blog/2023/05/integrating-modbus-with-node-red.md diff --git a/src/blog/2023/05/node-red-community-survey-results.md b/nuxt/content/blog/2023/05/node-red-community-survey-results.md similarity index 100% rename from src/blog/2023/05/node-red-community-survey-results.md rename to nuxt/content/blog/2023/05/node-red-community-survey-results.md diff --git a/src/blog/2023/05/persisting-chart-data-in-node-red.md b/nuxt/content/blog/2023/05/persisting-chart-data-in-node-red.md similarity index 100% rename from src/blog/2023/05/persisting-chart-data-in-node-red.md rename to nuxt/content/blog/2023/05/persisting-chart-data-in-node-red.md diff --git a/src/blog/2023/06/3-quick-node-red-tips-7.md b/nuxt/content/blog/2023/06/3-quick-node-red-tips-7.md similarity index 100% rename from src/blog/2023/06/3-quick-node-red-tips-7.md rename to nuxt/content/blog/2023/06/3-quick-node-red-tips-7.md diff --git a/src/blog/2023/06/community-news-06.md b/nuxt/content/blog/2023/06/community-news-06.md similarity index 100% rename from src/blog/2023/06/community-news-06.md rename to nuxt/content/blog/2023/06/community-news-06.md diff --git a/src/blog/2023/06/dashboard-announcement.md b/nuxt/content/blog/2023/06/dashboard-announcement.md similarity index 100% rename from src/blog/2023/06/dashboard-announcement.md rename to nuxt/content/blog/2023/06/dashboard-announcement.md diff --git a/src/blog/2023/06/flowforge-1-8-released.md b/nuxt/content/blog/2023/06/flowforge-1-8-released.md similarity index 100% rename from src/blog/2023/06/flowforge-1-8-released.md rename to nuxt/content/blog/2023/06/flowforge-1-8-released.md diff --git a/src/blog/2023/06/import-modules.md b/nuxt/content/blog/2023/06/import-modules.md similarity index 100% rename from src/blog/2023/06/import-modules.md rename to nuxt/content/blog/2023/06/import-modules.md diff --git a/src/blog/2023/06/introducing-the-flowforge-community-forum.md b/nuxt/content/blog/2023/06/introducing-the-flowforge-community-forum.md similarity index 100% rename from src/blog/2023/06/introducing-the-flowforge-community-forum.md rename to nuxt/content/blog/2023/06/introducing-the-flowforge-community-forum.md diff --git a/src/blog/2023/06/node-red-as-a-no-code-ethernet_ip-to-s7-protocol-converter.md b/nuxt/content/blog/2023/06/node-red-as-a-no-code-ethernet_ip-to-s7-protocol-converter.md similarity index 100% rename from src/blog/2023/06/node-red-as-a-no-code-ethernet_ip-to-s7-protocol-converter.md rename to nuxt/content/blog/2023/06/node-red-as-a-no-code-ethernet_ip-to-s7-protocol-converter.md diff --git a/src/blog/2023/07/community-news-07.md b/nuxt/content/blog/2023/07/community-news-07.md similarity index 100% rename from src/blog/2023/07/community-news-07.md rename to nuxt/content/blog/2023/07/community-news-07.md diff --git a/src/blog/2023/07/dashboard-0-1-release.md b/nuxt/content/blog/2023/07/dashboard-0-1-release.md similarity index 100% rename from src/blog/2023/07/dashboard-0-1-release.md rename to nuxt/content/blog/2023/07/dashboard-0-1-release.md diff --git a/src/blog/2023/07/flowforge-1-9-3-release.md b/nuxt/content/blog/2023/07/flowforge-1-9-3-release.md similarity index 100% rename from src/blog/2023/07/flowforge-1-9-3-release.md rename to nuxt/content/blog/2023/07/flowforge-1-9-3-release.md diff --git a/src/blog/2023/07/flowforge-1-9-release.md b/nuxt/content/blog/2023/07/flowforge-1-9-release.md similarity index 100% rename from src/blog/2023/07/flowforge-1-9-release.md rename to nuxt/content/blog/2023/07/flowforge-1-9-release.md diff --git a/src/blog/2023/07/how-to-build-a-opc-client-dashboard-in-node-red.md b/nuxt/content/blog/2023/07/how-to-build-a-opc-client-dashboard-in-node-red.md similarity index 100% rename from src/blog/2023/07/how-to-build-a-opc-client-dashboard-in-node-red.md rename to nuxt/content/blog/2023/07/how-to-build-a-opc-client-dashboard-in-node-red.md diff --git a/src/blog/2023/07/how-to-deploy-a-basic-opc-ua-server-in-node-red.md b/nuxt/content/blog/2023/07/how-to-deploy-a-basic-opc-ua-server-in-node-red.md similarity index 100% rename from src/blog/2023/07/how-to-deploy-a-basic-opc-ua-server-in-node-red.md rename to nuxt/content/blog/2023/07/how-to-deploy-a-basic-opc-ua-server-in-node-red.md diff --git a/src/blog/2023/07/images-in-node-red-dashboards.md b/nuxt/content/blog/2023/07/images-in-node-red-dashboards.md similarity index 100% rename from src/blog/2023/07/images-in-node-red-dashboards.md rename to nuxt/content/blog/2023/07/images-in-node-red-dashboards.md diff --git a/src/blog/2023/07/influxdb-historical-data.md b/nuxt/content/blog/2023/07/influxdb-historical-data.md similarity index 100% rename from src/blog/2023/07/influxdb-historical-data.md rename to nuxt/content/blog/2023/07/influxdb-historical-data.md diff --git a/src/blog/2023/08/aws-marketplace-announce.md b/nuxt/content/blog/2023/08/aws-marketplace-announce.md similarity index 100% rename from src/blog/2023/08/aws-marketplace-announce.md rename to nuxt/content/blog/2023/08/aws-marketplace-announce.md diff --git a/src/blog/2023/08/community-news-08.md b/nuxt/content/blog/2023/08/community-news-08.md similarity index 100% rename from src/blog/2023/08/community-news-08.md rename to nuxt/content/blog/2023/08/community-news-08.md diff --git a/src/blog/2023/08/dashboard-community-update.md b/nuxt/content/blog/2023/08/dashboard-community-update.md similarity index 100% rename from src/blog/2023/08/dashboard-community-update.md rename to nuxt/content/blog/2023/08/dashboard-community-update.md diff --git a/src/blog/2023/08/flowforge-1-10-release.md b/nuxt/content/blog/2023/08/flowforge-1-10-release.md similarity index 100% rename from src/blog/2023/08/flowforge-1-10-release.md rename to nuxt/content/blog/2023/08/flowforge-1-10-release.md diff --git a/src/blog/2023/08/flowforge-is-now-flowfuse.md b/nuxt/content/blog/2023/08/flowforge-is-now-flowfuse.md similarity index 100% rename from src/blog/2023/08/flowforge-is-now-flowfuse.md rename to nuxt/content/blog/2023/08/flowforge-is-now-flowfuse.md diff --git a/src/blog/2023/08/flowfuse-1-11-release.md b/nuxt/content/blog/2023/08/flowfuse-1-11-release.md similarity index 100% rename from src/blog/2023/08/flowfuse-1-11-release.md rename to nuxt/content/blog/2023/08/flowfuse-1-11-release.md diff --git a/src/blog/2023/08/isa-95-automation-pyramid-to-unified-namespace.md b/nuxt/content/blog/2023/08/isa-95-automation-pyramid-to-unified-namespace.md similarity index 100% rename from src/blog/2023/08/isa-95-automation-pyramid-to-unified-namespace.md rename to nuxt/content/blog/2023/08/isa-95-automation-pyramid-to-unified-namespace.md diff --git a/src/blog/2023/08/open-source-is-a-tier-not-competition.md b/nuxt/content/blog/2023/08/open-source-is-a-tier-not-competition.md similarity index 100% rename from src/blog/2023/08/open-source-is-a-tier-not-competition.md rename to nuxt/content/blog/2023/08/open-source-is-a-tier-not-competition.md diff --git a/src/blog/2023/09/bosch-rexroth-announce.md b/nuxt/content/blog/2023/09/bosch-rexroth-announce.md similarity index 100% rename from src/blog/2023/09/bosch-rexroth-announce.md rename to nuxt/content/blog/2023/09/bosch-rexroth-announce.md diff --git a/src/blog/2023/09/chatgpt-for-node-red-developers.md b/nuxt/content/blog/2023/09/chatgpt-for-node-red-developers.md similarity index 100% rename from src/blog/2023/09/chatgpt-for-node-red-developers.md rename to nuxt/content/blog/2023/09/chatgpt-for-node-red-developers.md diff --git a/src/blog/2023/09/community-news-09.md b/nuxt/content/blog/2023/09/community-news-09.md similarity index 100% rename from src/blog/2023/09/community-news-09.md rename to nuxt/content/blog/2023/09/community-news-09.md diff --git a/src/blog/2023/09/dashboard-notebook-layout.md b/nuxt/content/blog/2023/09/dashboard-notebook-layout.md similarity index 100% rename from src/blog/2023/09/dashboard-notebook-layout.md rename to nuxt/content/blog/2023/09/dashboard-notebook-layout.md diff --git a/src/blog/2023/09/flow-viewer.md b/nuxt/content/blog/2023/09/flow-viewer.md similarity index 100% rename from src/blog/2023/09/flow-viewer.md rename to nuxt/content/blog/2023/09/flow-viewer.md diff --git a/src/blog/2023/09/modernize-your-legacy-industrial-data-part2.md b/nuxt/content/blog/2023/09/modernize-your-legacy-industrial-data-part2.md similarity index 100% rename from src/blog/2023/09/modernize-your-legacy-industrial-data-part2.md rename to nuxt/content/blog/2023/09/modernize-your-legacy-industrial-data-part2.md diff --git a/src/blog/2023/09/modernize-your-legacy-industrial-data.md b/nuxt/content/blog/2023/09/modernize-your-legacy-industrial-data.md similarity index 100% rename from src/blog/2023/09/modernize-your-legacy-industrial-data.md rename to nuxt/content/blog/2023/09/modernize-your-legacy-industrial-data.md diff --git a/src/blog/2023/09/rebranding-our-components.md b/nuxt/content/blog/2023/09/rebranding-our-components.md similarity index 100% rename from src/blog/2023/09/rebranding-our-components.md rename to nuxt/content/blog/2023/09/rebranding-our-components.md diff --git a/src/blog/2023/09/tulip-event-report.md b/nuxt/content/blog/2023/09/tulip-event-report.md similarity index 100% rename from src/blog/2023/09/tulip-event-report.md rename to nuxt/content/blog/2023/09/tulip-event-report.md diff --git a/src/blog/2023/10/blueprints.md b/nuxt/content/blog/2023/10/blueprints.md similarity index 100% rename from src/blog/2023/10/blueprints.md rename to nuxt/content/blog/2023/10/blueprints.md diff --git a/src/blog/2023/10/certified-nodes.md b/nuxt/content/blog/2023/10/certified-nodes.md similarity index 100% rename from src/blog/2023/10/certified-nodes.md rename to nuxt/content/blog/2023/10/certified-nodes.md diff --git a/src/blog/2023/10/citizen-development.md b/nuxt/content/blog/2023/10/citizen-development.md similarity index 100% rename from src/blog/2023/10/citizen-development.md rename to nuxt/content/blog/2023/10/citizen-development.md diff --git a/src/blog/2023/10/community-news-10.md b/nuxt/content/blog/2023/10/community-news-10.md similarity index 100% rename from src/blog/2023/10/community-news-10.md rename to nuxt/content/blog/2023/10/community-news-10.md diff --git a/src/blog/2023/10/custom-vuetify-components-dashboard.md b/nuxt/content/blog/2023/10/custom-vuetify-components-dashboard.md similarity index 100% rename from src/blog/2023/10/custom-vuetify-components-dashboard.md rename to nuxt/content/blog/2023/10/custom-vuetify-components-dashboard.md diff --git a/src/blog/2023/10/dashboard-integrations.md b/nuxt/content/blog/2023/10/dashboard-integrations.md similarity index 100% rename from src/blog/2023/10/dashboard-integrations.md rename to nuxt/content/blog/2023/10/dashboard-integrations.md diff --git a/src/blog/2023/10/mes-build-buy.md b/nuxt/content/blog/2023/10/mes-build-buy.md similarity index 100% rename from src/blog/2023/10/mes-build-buy.md rename to nuxt/content/blog/2023/10/mes-build-buy.md diff --git a/src/blog/2023/10/service-disruption-report-2023-10-11.md b/nuxt/content/blog/2023/10/service-disruption-report-2023-10-11.md similarity index 100% rename from src/blog/2023/10/service-disruption-report-2023-10-11.md rename to nuxt/content/blog/2023/10/service-disruption-report-2023-10-11.md diff --git a/src/blog/2023/10/use-private-custom-nodes-with-flowfuse.md b/nuxt/content/blog/2023/10/use-private-custom-nodes-with-flowfuse.md similarity index 100% rename from src/blog/2023/10/use-private-custom-nodes-with-flowfuse.md rename to nuxt/content/blog/2023/10/use-private-custom-nodes-with-flowfuse.md diff --git a/src/blog/2023/11/ai-assistant.md b/nuxt/content/blog/2023/11/ai-assistant.md similarity index 100% rename from src/blog/2023/11/ai-assistant.md rename to nuxt/content/blog/2023/11/ai-assistant.md diff --git a/src/blog/2023/11/chatgpt-gpt.md b/nuxt/content/blog/2023/11/chatgpt-gpt.md similarity index 100% rename from src/blog/2023/11/chatgpt-gpt.md rename to nuxt/content/blog/2023/11/chatgpt-gpt.md diff --git a/src/blog/2023/11/community-news-11.md b/nuxt/content/blog/2023/11/community-news-11.md similarity index 100% rename from src/blog/2023/11/community-news-11.md rename to nuxt/content/blog/2023/11/community-news-11.md diff --git a/src/blog/2023/11/dashboard-0-7.md b/nuxt/content/blog/2023/11/dashboard-0-7.md similarity index 100% rename from src/blog/2023/11/dashboard-0-7.md rename to nuxt/content/blog/2023/11/dashboard-0-7.md diff --git a/src/blog/2023/11/dashboard-0-8-0.md b/nuxt/content/blog/2023/11/dashboard-0-8-0.md similarity index 100% rename from src/blog/2023/11/dashboard-0-8-0.md rename to nuxt/content/blog/2023/11/dashboard-0-8-0.md diff --git a/src/blog/2023/11/dashboard-2.0-user-tracking.md b/nuxt/content/blog/2023/11/dashboard-2.0-user-tracking.md similarity index 100% rename from src/blog/2023/11/dashboard-2.0-user-tracking.md rename to nuxt/content/blog/2023/11/dashboard-2.0-user-tracking.md diff --git a/src/blog/2023/11/device-agent-balena.md b/nuxt/content/blog/2023/11/device-agent-balena.md similarity index 100% rename from src/blog/2023/11/device-agent-balena.md rename to nuxt/content/blog/2023/11/device-agent-balena.md diff --git a/src/blog/2023/11/meet-us-at-sps-nuremberg.md b/nuxt/content/blog/2023/11/meet-us-at-sps-nuremberg.md similarity index 100% rename from src/blog/2023/11/meet-us-at-sps-nuremberg.md rename to nuxt/content/blog/2023/11/meet-us-at-sps-nuremberg.md diff --git a/src/blog/2023/12/ai-use-cases.md b/nuxt/content/blog/2023/12/ai-use-cases.md similarity index 100% rename from src/blog/2023/12/ai-use-cases.md rename to nuxt/content/blog/2023/12/ai-use-cases.md diff --git a/src/blog/2023/12/dashboard-0-10-0.md b/nuxt/content/blog/2023/12/dashboard-0-10-0.md similarity index 100% rename from src/blog/2023/12/dashboard-0-10-0.md rename to nuxt/content/blog/2023/12/dashboard-0-10-0.md diff --git a/src/blog/2023/12/device-agent-as-a-windows-service.md b/nuxt/content/blog/2023/12/device-agent-as-a-windows-service.md similarity index 100% rename from src/blog/2023/12/device-agent-as-a-windows-service.md rename to nuxt/content/blog/2023/12/device-agent-as-a-windows-service.md diff --git a/src/blog/2023/12/flowfuse-year-review-2023.md b/nuxt/content/blog/2023/12/flowfuse-year-review-2023.md similarity index 100% rename from src/blog/2023/12/flowfuse-year-review-2023.md rename to nuxt/content/blog/2023/12/flowfuse-year-review-2023.md diff --git a/src/blog/2023/12/introduction-to-unified-namespace.md b/nuxt/content/blog/2023/12/introduction-to-unified-namespace.md similarity index 100% rename from src/blog/2023/12/introduction-to-unified-namespace.md rename to nuxt/content/blog/2023/12/introduction-to-unified-namespace.md diff --git a/src/blog/2023/12/unified-namespace-data-modelling.md b/nuxt/content/blog/2023/12/unified-namespace-data-modelling.md similarity index 100% rename from src/blog/2023/12/unified-namespace-data-modelling.md rename to nuxt/content/blog/2023/12/unified-namespace-data-modelling.md diff --git a/src/blog/2024/01/capture-data-edge-with-node-red-flowfuse.md b/nuxt/content/blog/2024/01/capture-data-edge-with-node-red-flowfuse.md similarity index 100% rename from src/blog/2024/01/capture-data-edge-with-node-red-flowfuse.md rename to nuxt/content/blog/2024/01/capture-data-edge-with-node-red-flowfuse.md diff --git a/src/blog/2024/01/dashboard-2-ga.md b/nuxt/content/blog/2024/01/dashboard-2-ga.md similarity index 100% rename from src/blog/2024/01/dashboard-2-ga.md rename to nuxt/content/blog/2024/01/dashboard-2-ga.md diff --git a/src/blog/2024/01/dashboard-2-multi-user.md b/nuxt/content/blog/2024/01/dashboard-2-multi-user.md similarity index 100% rename from src/blog/2024/01/dashboard-2-multi-user.md rename to nuxt/content/blog/2024/01/dashboard-2-multi-user.md diff --git a/src/blog/2024/01/flowfuse-release-2-0.md b/nuxt/content/blog/2024/01/flowfuse-release-2-0.md similarity index 100% rename from src/blog/2024/01/flowfuse-release-2-0.md rename to nuxt/content/blog/2024/01/flowfuse-release-2-0.md diff --git a/src/blog/2024/01/how-to-deploy-node-red-with-flowfuse-to-balenacloud.md b/nuxt/content/blog/2024/01/how-to-deploy-node-red-with-flowfuse-to-balenacloud.md similarity index 100% rename from src/blog/2024/01/how-to-deploy-node-red-with-flowfuse-to-balenacloud.md rename to nuxt/content/blog/2024/01/how-to-deploy-node-red-with-flowfuse-to-balenacloud.md diff --git a/src/blog/2024/01/import-a-file.md b/nuxt/content/blog/2024/01/import-a-file.md similarity index 100% rename from src/blog/2024/01/import-a-file.md rename to nuxt/content/blog/2024/01/import-a-file.md diff --git a/src/blog/2024/01/revolutionizing-manufacturing-impact-ai-chatgpt-technologies.md b/nuxt/content/blog/2024/01/revolutionizing-manufacturing-impact-ai-chatgpt-technologies.md similarity index 100% rename from src/blog/2024/01/revolutionizing-manufacturing-impact-ai-chatgpt-technologies.md rename to nuxt/content/blog/2024/01/revolutionizing-manufacturing-impact-ai-chatgpt-technologies.md diff --git a/src/blog/2024/01/send-a-file.md b/nuxt/content/blog/2024/01/send-a-file.md similarity index 100% rename from src/blog/2024/01/send-a-file.md rename to nuxt/content/blog/2024/01/send-a-file.md diff --git a/src/blog/2024/01/sentiment-analysis-with-node-red.md b/nuxt/content/blog/2024/01/sentiment-analysis-with-node-red.md similarity index 100% rename from src/blog/2024/01/sentiment-analysis-with-node-red.md rename to nuxt/content/blog/2024/01/sentiment-analysis-with-node-red.md diff --git a/src/blog/2024/01/soc2.md b/nuxt/content/blog/2024/01/soc2.md similarity index 100% rename from src/blog/2024/01/soc2.md rename to nuxt/content/blog/2024/01/soc2.md diff --git a/src/blog/2024/01/speech-driven-chatbot-with-node-red.md b/nuxt/content/blog/2024/01/speech-driven-chatbot-with-node-red.md similarity index 100% rename from src/blog/2024/01/speech-driven-chatbot-with-node-red.md rename to nuxt/content/blog/2024/01/speech-driven-chatbot-with-node-red.md diff --git a/src/blog/2024/01/unified-namespace-what-broker.md b/nuxt/content/blog/2024/01/unified-namespace-what-broker.md similarity index 100% rename from src/blog/2024/01/unified-namespace-what-broker.md rename to nuxt/content/blog/2024/01/unified-namespace-what-broker.md diff --git a/src/blog/2024/01/unified-namespace-when-not-to-use.md b/nuxt/content/blog/2024/01/unified-namespace-when-not-to-use.md similarity index 100% rename from src/blog/2024/01/unified-namespace-when-not-to-use.md rename to nuxt/content/blog/2024/01/unified-namespace-when-not-to-use.md diff --git a/src/blog/2024/02/connect-node-red-to-kepware-opc.md b/nuxt/content/blog/2024/02/connect-node-red-to-kepware-opc.md similarity index 100% rename from src/blog/2024/02/connect-node-red-to-kepware-opc.md rename to nuxt/content/blog/2024/02/connect-node-red-to-kepware-opc.md diff --git a/src/blog/2024/02/history-of-nodered.md b/nuxt/content/blog/2024/02/history-of-nodered.md similarity index 100% rename from src/blog/2024/02/history-of-nodered.md rename to nuxt/content/blog/2024/02/history-of-nodered.md diff --git a/src/blog/2024/02/node-red-perfect-adapter-middleware-uns.md b/nuxt/content/blog/2024/02/node-red-perfect-adapter-middleware-uns.md similarity index 100% rename from src/blog/2024/02/node-red-perfect-adapter-middleware-uns.md rename to nuxt/content/blog/2024/02/node-red-perfect-adapter-middleware-uns.md diff --git a/src/blog/2024/02/node-red-unified-namespace-architecture.md b/nuxt/content/blog/2024/02/node-red-unified-namespace-architecture.md similarity index 100% rename from src/blog/2024/02/node-red-unified-namespace-architecture.md rename to nuxt/content/blog/2024/02/node-red-unified-namespace-architecture.md diff --git a/src/blog/2024/02/professional-services-for-node-red.md b/nuxt/content/blog/2024/02/professional-services-for-node-red.md similarity index 100% rename from src/blog/2024/02/professional-services-for-node-red.md rename to nuxt/content/blog/2024/02/professional-services-for-node-red.md diff --git a/src/blog/2024/02/software-development-in-node-red.md b/nuxt/content/blog/2024/02/software-development-in-node-red.md similarity index 100% rename from src/blog/2024/02/software-development-in-node-red.md rename to nuxt/content/blog/2024/02/software-development-in-node-red.md diff --git a/src/blog/2024/02/taking-it-further-with-node-red.md b/nuxt/content/blog/2024/02/taking-it-further-with-node-red.md similarity index 100% rename from src/blog/2024/02/taking-it-further-with-node-red.md rename to nuxt/content/blog/2024/02/taking-it-further-with-node-red.md diff --git a/src/blog/2024/02/why-citizen-development-platforms.md b/nuxt/content/blog/2024/02/why-citizen-development-platforms.md similarity index 100% rename from src/blog/2024/02/why-citizen-development-platforms.md rename to nuxt/content/blog/2024/02/why-citizen-development-platforms.md diff --git a/src/blog/2024/03/dashboard-getting-started.md b/nuxt/content/blog/2024/03/dashboard-getting-started.md similarity index 100% rename from src/blog/2024/03/dashboard-getting-started.md rename to nuxt/content/blog/2024/03/dashboard-getting-started.md diff --git a/src/blog/2024/03/flowfuse-gallarus-strategic-partnership-to-accelerate-industry-4-adoption.md b/nuxt/content/blog/2024/03/flowfuse-gallarus-strategic-partnership-to-accelerate-industry-4-adoption.md similarity index 100% rename from src/blog/2024/03/flowfuse-gallarus-strategic-partnership-to-accelerate-industry-4-adoption.md rename to nuxt/content/blog/2024/03/flowfuse-gallarus-strategic-partnership-to-accelerate-industry-4-adoption.md diff --git a/src/blog/2024/03/flowfuse-self-hosted-open-source-resource-limits.md b/nuxt/content/blog/2024/03/flowfuse-self-hosted-open-source-resource-limits.md similarity index 100% rename from src/blog/2024/03/flowfuse-self-hosted-open-source-resource-limits.md rename to nuxt/content/blog/2024/03/flowfuse-self-hosted-open-source-resource-limits.md diff --git a/src/blog/2024/03/http-authentication-node-red-with-flowfuse.md b/nuxt/content/blog/2024/03/http-authentication-node-red-with-flowfuse.md similarity index 100% rename from src/blog/2024/03/http-authentication-node-red-with-flowfuse.md rename to nuxt/content/blog/2024/03/http-authentication-node-red-with-flowfuse.md diff --git a/src/blog/2024/03/installing-operating-node-red-behind-firewall.md b/nuxt/content/blog/2024/03/installing-operating-node-red-behind-firewall.md similarity index 100% rename from src/blog/2024/03/installing-operating-node-red-behind-firewall.md rename to nuxt/content/blog/2024/03/installing-operating-node-red-behind-firewall.md diff --git a/src/blog/2024/03/looking-towards-node-red-4.md b/nuxt/content/blog/2024/03/looking-towards-node-red-4.md similarity index 100% rename from src/blog/2024/03/looking-towards-node-red-4.md rename to nuxt/content/blog/2024/03/looking-towards-node-red-4.md diff --git a/src/blog/2024/03/low-code-is-better.md b/nuxt/content/blog/2024/03/low-code-is-better.md similarity index 100% rename from src/blog/2024/03/low-code-is-better.md rename to nuxt/content/blog/2024/03/low-code-is-better.md diff --git a/src/blog/2024/03/scaling-node-red-devices-vs-flowfuse-instance.md b/nuxt/content/blog/2024/03/scaling-node-red-devices-vs-flowfuse-instance.md similarity index 100% rename from src/blog/2024/03/scaling-node-red-devices-vs-flowfuse-instance.md rename to nuxt/content/blog/2024/03/scaling-node-red-devices-vs-flowfuse-instance.md diff --git a/src/blog/2024/03/using-kafka-in-manufacturing.md b/nuxt/content/blog/2024/03/using-kafka-in-manufacturing.md similarity index 100% rename from src/blog/2024/03/using-kafka-in-manufacturing.md rename to nuxt/content/blog/2024/03/using-kafka-in-manufacturing.md diff --git a/src/blog/2024/03/using-kafka-with-node-red.md b/nuxt/content/blog/2024/03/using-kafka-with-node-red.md similarity index 100% rename from src/blog/2024/03/using-kafka-with-node-red.md rename to nuxt/content/blog/2024/03/using-kafka-with-node-red.md diff --git a/src/blog/2024/04/building-an-admin-panel-in-node-red-with-dashboard-2.md b/nuxt/content/blog/2024/04/building-an-admin-panel-in-node-red-with-dashboard-2.md similarity index 100% rename from src/blog/2024/04/building-an-admin-panel-in-node-red-with-dashboard-2.md rename to nuxt/content/blog/2024/04/building-an-admin-panel-in-node-red-with-dashboard-2.md diff --git a/src/blog/2024/04/dashboard-milestones-pwa-new-components.md b/nuxt/content/blog/2024/04/dashboard-milestones-pwa-new-components.md similarity index 100% rename from src/blog/2024/04/dashboard-milestones-pwa-new-components.md rename to nuxt/content/blog/2024/04/dashboard-milestones-pwa-new-components.md diff --git a/src/blog/2024/04/displaying-logged-in-users-on-dashboard.md b/nuxt/content/blog/2024/04/displaying-logged-in-users-on-dashboard.md similarity index 100% rename from src/blog/2024/04/displaying-logged-in-users-on-dashboard.md rename to nuxt/content/blog/2024/04/displaying-logged-in-users-on-dashboard.md diff --git a/src/blog/2024/04/flowfuse-at-hannover-messe-node-red.md b/nuxt/content/blog/2024/04/flowfuse-at-hannover-messe-node-red.md similarity index 100% rename from src/blog/2024/04/flowfuse-at-hannover-messe-node-red.md rename to nuxt/content/blog/2024/04/flowfuse-at-hannover-messe-node-red.md diff --git a/src/blog/2024/04/flowfuse-dedicated.md b/nuxt/content/blog/2024/04/flowfuse-dedicated.md similarity index 100% rename from src/blog/2024/04/flowfuse-dedicated.md rename to nuxt/content/blog/2024/04/flowfuse-dedicated.md diff --git a/src/blog/2024/04/how-to-build-an-application-with-node-red-dashboard-2.md b/nuxt/content/blog/2024/04/how-to-build-an-application-with-node-red-dashboard-2.md similarity index 100% rename from src/blog/2024/04/how-to-build-an-application-with-node-red-dashboard-2.md rename to nuxt/content/blog/2024/04/how-to-build-an-application-with-node-red-dashboard-2.md diff --git a/src/blog/2024/04/node-red-architecture.md b/nuxt/content/blog/2024/04/node-red-architecture.md similarity index 100% rename from src/blog/2024/04/node-red-architecture.md rename to nuxt/content/blog/2024/04/node-red-architecture.md diff --git a/src/blog/2024/04/node-red-multiplayer.md b/nuxt/content/blog/2024/04/node-red-multiplayer.md similarity index 100% rename from src/blog/2024/04/node-red-multiplayer.md rename to nuxt/content/blog/2024/04/node-red-multiplayer.md diff --git a/src/blog/2024/04/role-based-access-control-rbac-for-node-red-with-flowfuse.md b/nuxt/content/blog/2024/04/role-based-access-control-rbac-for-node-red-with-flowfuse.md similarity index 100% rename from src/blog/2024/04/role-based-access-control-rbac-for-node-red-with-flowfuse.md rename to nuxt/content/blog/2024/04/role-based-access-control-rbac-for-node-red-with-flowfuse.md diff --git a/src/blog/2024/05/exploring-node-red-dashboard-2-widgets.md b/nuxt/content/blog/2024/05/exploring-node-red-dashboard-2-widgets.md similarity index 100% rename from src/blog/2024/05/exploring-node-red-dashboard-2-widgets.md rename to nuxt/content/blog/2024/05/exploring-node-red-dashboard-2-widgets.md diff --git a/src/blog/2024/05/flowfuse-2-4-release.md b/nuxt/content/blog/2024/05/flowfuse-2-4-release.md similarity index 100% rename from src/blog/2024/05/flowfuse-2-4-release.md rename to nuxt/content/blog/2024/05/flowfuse-2-4-release.md diff --git a/src/blog/2024/05/mapping-location-on-dashboard-2.md b/nuxt/content/blog/2024/05/mapping-location-on-dashboard-2.md similarity index 100% rename from src/blog/2024/05/mapping-location-on-dashboard-2.md rename to nuxt/content/blog/2024/05/mapping-location-on-dashboard-2.md diff --git a/src/blog/2024/05/node-red-dashboard-2-layout-navigation-styling.md b/nuxt/content/blog/2024/05/node-red-dashboard-2-layout-navigation-styling.md similarity index 100% rename from src/blog/2024/05/node-red-dashboard-2-layout-navigation-styling.md rename to nuxt/content/blog/2024/05/node-red-dashboard-2-layout-navigation-styling.md diff --git a/src/blog/2024/05/node-red-mind-stack-with-flowfuse.md b/nuxt/content/blog/2024/05/node-red-mind-stack-with-flowfuse.md similarity index 100% rename from src/blog/2024/05/node-red-mind-stack-with-flowfuse.md rename to nuxt/content/blog/2024/05/node-red-mind-stack-with-flowfuse.md diff --git a/src/blog/2024/05/product-strategy-updates.md b/nuxt/content/blog/2024/05/product-strategy-updates.md similarity index 100% rename from src/blog/2024/05/product-strategy-updates.md rename to nuxt/content/blog/2024/05/product-strategy-updates.md diff --git a/src/blog/2024/05/understanding-node-flow-global-environment-variables-in-node-red.md b/nuxt/content/blog/2024/05/understanding-node-flow-global-environment-variables-in-node-red.md similarity index 100% rename from src/blog/2024/05/understanding-node-flow-global-environment-variables-in-node-red.md rename to nuxt/content/blog/2024/05/understanding-node-flow-global-environment-variables-in-node-red.md diff --git a/src/blog/2024/05/why-you-need-a-low-code-platform.md b/nuxt/content/blog/2024/05/why-you-need-a-low-code-platform.md similarity index 100% rename from src/blog/2024/05/why-you-need-a-low-code-platform.md rename to nuxt/content/blog/2024/05/why-you-need-a-low-code-platform.md diff --git a/src/blog/2024/06/dashboard-1-deprecated.md b/nuxt/content/blog/2024/06/dashboard-1-deprecated.md similarity index 100% rename from src/blog/2024/06/dashboard-1-deprecated.md rename to nuxt/content/blog/2024/06/dashboard-1-deprecated.md diff --git a/src/blog/2024/06/dashboard-multi-tenancy.md b/nuxt/content/blog/2024/06/dashboard-multi-tenancy.md similarity index 100% rename from src/blog/2024/06/dashboard-multi-tenancy.md rename to nuxt/content/blog/2024/06/dashboard-multi-tenancy.md diff --git a/src/blog/2024/06/flowfuse-2-5-release.md b/nuxt/content/blog/2024/06/flowfuse-2-5-release.md similarity index 100% rename from src/blog/2024/06/flowfuse-2-5-release.md rename to nuxt/content/blog/2024/06/flowfuse-2-5-release.md diff --git a/src/blog/2024/06/how-to-use-mqtt-in-node-red.md b/nuxt/content/blog/2024/06/how-to-use-mqtt-in-node-red.md similarity index 100% rename from src/blog/2024/06/how-to-use-mqtt-in-node-red.md rename to nuxt/content/blog/2024/06/how-to-use-mqtt-in-node-red.md diff --git a/src/blog/2024/06/interacting-with-google-sheet-from-node-red.md b/nuxt/content/blog/2024/06/interacting-with-google-sheet-from-node-red.md similarity index 100% rename from src/blog/2024/06/interacting-with-google-sheet-from-node-red.md rename to nuxt/content/blog/2024/06/interacting-with-google-sheet-from-node-red.md diff --git a/src/blog/2024/06/node-red-4-on-flowfuse-cloud.md b/nuxt/content/blog/2024/06/node-red-4-on-flowfuse-cloud.md similarity index 100% rename from src/blog/2024/06/node-red-4-on-flowfuse-cloud.md rename to nuxt/content/blog/2024/06/node-red-4-on-flowfuse-cloud.md diff --git a/src/blog/2024/07/building-on-flowfuse-devices.md b/nuxt/content/blog/2024/07/building-on-flowfuse-devices.md similarity index 100% rename from src/blog/2024/07/building-on-flowfuse-devices.md rename to nuxt/content/blog/2024/07/building-on-flowfuse-devices.md diff --git a/src/blog/2024/07/calling-python-script-from-node-red.md b/nuxt/content/blog/2024/07/calling-python-script-from-node-red.md similarity index 100% rename from src/blog/2024/07/calling-python-script-from-node-red.md rename to nuxt/content/blog/2024/07/calling-python-script-from-node-red.md diff --git a/src/blog/2024/07/dashboard-new-charts.md b/nuxt/content/blog/2024/07/dashboard-new-charts.md similarity index 100% rename from src/blog/2024/07/dashboard-new-charts.md rename to nuxt/content/blog/2024/07/dashboard-new-charts.md diff --git a/src/blog/2024/07/deploying-flowfuse-with-docker.md b/nuxt/content/blog/2024/07/deploying-flowfuse-with-docker.md similarity index 100% rename from src/blog/2024/07/deploying-flowfuse-with-docker.md rename to nuxt/content/blog/2024/07/deploying-flowfuse-with-docker.md diff --git a/src/blog/2024/07/evolution-of-technology-impact-on-job-roles-and-companies.md b/nuxt/content/blog/2024/07/evolution-of-technology-impact-on-job-roles-and-companies.md similarity index 100% rename from src/blog/2024/07/evolution-of-technology-impact-on-job-roles-and-companies.md rename to nuxt/content/blog/2024/07/evolution-of-technology-impact-on-job-roles-and-companies.md diff --git a/src/blog/2024/07/flowfuse-2-6-release.md b/nuxt/content/blog/2024/07/flowfuse-2-6-release.md similarity index 100% rename from src/blog/2024/07/flowfuse-2-6-release.md rename to nuxt/content/blog/2024/07/flowfuse-2-6-release.md diff --git a/src/blog/2024/07/how-to-setup-sso-ldap-for-the-node-red.md b/nuxt/content/blog/2024/07/how-to-setup-sso-ldap-for-the-node-red.md similarity index 100% rename from src/blog/2024/07/how-to-setup-sso-ldap-for-the-node-red.md rename to nuxt/content/blog/2024/07/how-to-setup-sso-ldap-for-the-node-red.md diff --git a/src/blog/2024/07/how-to-setup-sso-saml-for-the-node-red.md b/nuxt/content/blog/2024/07/how-to-setup-sso-saml-for-the-node-red.md similarity index 100% rename from src/blog/2024/07/how-to-setup-sso-saml-for-the-node-red.md rename to nuxt/content/blog/2024/07/how-to-setup-sso-saml-for-the-node-red.md diff --git a/src/blog/2024/08/comparing-dashboard-2-with-uibuilder.md b/nuxt/content/blog/2024/08/comparing-dashboard-2-with-uibuilder.md similarity index 100% rename from src/blog/2024/08/comparing-dashboard-2-with-uibuilder.md rename to nuxt/content/blog/2024/08/comparing-dashboard-2-with-uibuilder.md diff --git a/src/blog/2024/08/customise-theming-in-your-dashboards.md b/nuxt/content/blog/2024/08/customise-theming-in-your-dashboards.md similarity index 100% rename from src/blog/2024/08/customise-theming-in-your-dashboards.md rename to nuxt/content/blog/2024/08/customise-theming-in-your-dashboards.md diff --git a/src/blog/2024/08/dashboard-new-layout-widgets-and-gauges.md b/nuxt/content/blog/2024/08/dashboard-new-layout-widgets-and-gauges.md similarity index 100% rename from src/blog/2024/08/dashboard-new-layout-widgets-and-gauges.md rename to nuxt/content/blog/2024/08/dashboard-new-layout-widgets-and-gauges.md diff --git a/src/blog/2024/08/flowfuse-2-7-release.md b/nuxt/content/blog/2024/08/flowfuse-2-7-release.md similarity index 100% rename from src/blog/2024/08/flowfuse-2-7-release.md rename to nuxt/content/blog/2024/08/flowfuse-2-7-release.md diff --git a/src/blog/2024/08/flowfuse-2-8-release.md b/nuxt/content/blog/2024/08/flowfuse-2-8-release.md similarity index 100% rename from src/blog/2024/08/flowfuse-2-8-release.md rename to nuxt/content/blog/2024/08/flowfuse-2-8-release.md diff --git a/src/blog/2024/08/opc-ua-to-mqtt-with-node-red.md b/nuxt/content/blog/2024/08/opc-ua-to-mqtt-with-node-red.md similarity index 100% rename from src/blog/2024/08/opc-ua-to-mqtt-with-node-red.md rename to nuxt/content/blog/2024/08/opc-ua-to-mqtt-with-node-red.md diff --git a/src/blog/2024/08/opentelemetry-with-node-red.md b/nuxt/content/blog/2024/08/opentelemetry-with-node-red.md similarity index 100% rename from src/blog/2024/08/opentelemetry-with-node-red.md rename to nuxt/content/blog/2024/08/opentelemetry-with-node-red.md diff --git a/src/blog/2024/08/using-mqtt-sparkplugb-with-node-red.md b/nuxt/content/blog/2024/08/using-mqtt-sparkplugb-with-node-red.md similarity index 100% rename from src/blog/2024/08/using-mqtt-sparkplugb-with-node-red.md rename to nuxt/content/blog/2024/08/using-mqtt-sparkplugb-with-node-red.md diff --git a/src/blog/2024/09/flowfuse-release-2-9.md b/nuxt/content/blog/2024/09/flowfuse-release-2-9.md similarity index 100% rename from src/blog/2024/09/flowfuse-release-2-9.md rename to nuxt/content/blog/2024/09/flowfuse-release-2-9.md diff --git a/src/blog/2024/09/how-to-scrape-web-data-with-node-red.md b/nuxt/content/blog/2024/09/how-to-scrape-web-data-with-node-red.md similarity index 100% rename from src/blog/2024/09/how-to-scrape-web-data-with-node-red.md rename to nuxt/content/blog/2024/09/how-to-scrape-web-data-with-node-red.md diff --git a/src/blog/2024/09/how-to-use-subflow-in-node-red.md b/nuxt/content/blog/2024/09/how-to-use-subflow-in-node-red.md similarity index 100% rename from src/blog/2024/09/how-to-use-subflow-in-node-red.md rename to nuxt/content/blog/2024/09/how-to-use-subflow-in-node-red.md diff --git a/src/blog/2024/09/node-red-version-control-with-snapshots.md b/nuxt/content/blog/2024/09/node-red-version-control-with-snapshots.md similarity index 100% rename from src/blog/2024/09/node-red-version-control-with-snapshots.md rename to nuxt/content/blog/2024/09/node-red-version-control-with-snapshots.md diff --git a/src/blog/2024/10/announcement-mqtt-broker.md b/nuxt/content/blog/2024/10/announcement-mqtt-broker.md similarity index 100% rename from src/blog/2024/10/announcement-mqtt-broker.md rename to nuxt/content/blog/2024/10/announcement-mqtt-broker.md diff --git a/src/blog/2024/10/dashboard-new-group-type-app-icon-and-charts.md b/nuxt/content/blog/2024/10/dashboard-new-group-type-app-icon-and-charts.md similarity index 100% rename from src/blog/2024/10/dashboard-new-group-type-app-icon-and-charts.md rename to nuxt/content/blog/2024/10/dashboard-new-group-type-app-icon-and-charts.md diff --git a/src/blog/2024/10/exploring-flowfuse-project-nodes.md b/nuxt/content/blog/2024/10/exploring-flowfuse-project-nodes.md similarity index 100% rename from src/blog/2024/10/exploring-flowfuse-project-nodes.md rename to nuxt/content/blog/2024/10/exploring-flowfuse-project-nodes.md diff --git a/src/blog/2024/10/exploring-flowfuse-sbom-feature.md b/nuxt/content/blog/2024/10/exploring-flowfuse-sbom-feature.md similarity index 100% rename from src/blog/2024/10/exploring-flowfuse-sbom-feature.md rename to nuxt/content/blog/2024/10/exploring-flowfuse-sbom-feature.md diff --git a/src/blog/2024/10/exploring-flowfuse-security-features.md b/nuxt/content/blog/2024/10/exploring-flowfuse-security-features.md similarity index 100% rename from src/blog/2024/10/exploring-flowfuse-security-features.md rename to nuxt/content/blog/2024/10/exploring-flowfuse-security-features.md diff --git a/src/blog/2024/10/flowfuse-release-2-10.md b/nuxt/content/blog/2024/10/flowfuse-release-2-10.md similarity index 100% rename from src/blog/2024/10/flowfuse-release-2-10.md rename to nuxt/content/blog/2024/10/flowfuse-release-2-10.md diff --git a/src/blog/2024/10/how-to-build-automate-devops-pipelines-node-red-deployments.md b/nuxt/content/blog/2024/10/how-to-build-automate-devops-pipelines-node-red-deployments.md similarity index 100% rename from src/blog/2024/10/how-to-build-automate-devops-pipelines-node-red-deployments.md rename to nuxt/content/blog/2024/10/how-to-build-automate-devops-pipelines-node-red-deployments.md diff --git a/src/blog/2024/10/managing-node-red-instances-in-centralize-platfrom.md b/nuxt/content/blog/2024/10/managing-node-red-instances-in-centralize-platfrom.md similarity index 100% rename from src/blog/2024/10/managing-node-red-instances-in-centralize-platfrom.md rename to nuxt/content/blog/2024/10/managing-node-red-instances-in-centralize-platfrom.md diff --git a/src/blog/2024/10/quick-ways-to-write-functions-in-node-red.md b/nuxt/content/blog/2024/10/quick-ways-to-write-functions-in-node-red.md similarity index 100% rename from src/blog/2024/10/quick-ways-to-write-functions-in-node-red.md rename to nuxt/content/blog/2024/10/quick-ways-to-write-functions-in-node-red.md diff --git a/src/blog/2024/11/building-uns-with-flowfuse.md b/nuxt/content/blog/2024/11/building-uns-with-flowfuse.md similarity index 100% rename from src/blog/2024/11/building-uns-with-flowfuse.md rename to nuxt/content/blog/2024/11/building-uns-with-flowfuse.md diff --git a/src/blog/2024/11/dashboard-new-group-type-app-icon-and-charts.md b/nuxt/content/blog/2024/11/dashboard-new-group-type-app-icon-and-charts.md similarity index 100% rename from src/blog/2024/11/dashboard-new-group-type-app-icon-and-charts.md rename to nuxt/content/blog/2024/11/dashboard-new-group-type-app-icon-and-charts.md diff --git a/src/blog/2024/11/device-agent-as-service-on-mac.md b/nuxt/content/blog/2024/11/device-agent-as-service-on-mac.md similarity index 100% rename from src/blog/2024/11/device-agent-as-service-on-mac.md rename to nuxt/content/blog/2024/11/device-agent-as-service-on-mac.md diff --git a/src/blog/2024/11/esp32-with-node-red.md b/nuxt/content/blog/2024/11/esp32-with-node-red.md similarity index 100% rename from src/blog/2024/11/esp32-with-node-red.md rename to nuxt/content/blog/2024/11/esp32-with-node-red.md diff --git a/src/blog/2024/11/flowfuse-release-2-11.md b/nuxt/content/blog/2024/11/flowfuse-release-2-11.md similarity index 100% rename from src/blog/2024/11/flowfuse-release-2-11.md rename to nuxt/content/blog/2024/11/flowfuse-release-2-11.md diff --git a/src/blog/2024/11/getting-the-most-out-of-mqtt-for-industrial-iot.md b/nuxt/content/blog/2024/11/getting-the-most-out-of-mqtt-for-industrial-iot.md similarity index 100% rename from src/blog/2024/11/getting-the-most-out-of-mqtt-for-industrial-iot.md rename to nuxt/content/blog/2024/11/getting-the-most-out-of-mqtt-for-industrial-iot.md diff --git a/src/blog/2024/11/introducing-industrial-visionaries-podcast.md b/nuxt/content/blog/2024/11/introducing-industrial-visionaries-podcast.md similarity index 100% rename from src/blog/2024/11/introducing-industrial-visionaries-podcast.md rename to nuxt/content/blog/2024/11/introducing-industrial-visionaries-podcast.md diff --git a/src/blog/2024/11/migrating-from-node-red-to-flowfuse.md b/nuxt/content/blog/2024/11/migrating-from-node-red-to-flowfuse.md similarity index 100% rename from src/blog/2024/11/migrating-from-node-red-to-flowfuse.md rename to nuxt/content/blog/2024/11/migrating-from-node-red-to-flowfuse.md diff --git a/src/blog/2024/11/why-point-to-point-connection-is-dead.md b/nuxt/content/blog/2024/11/why-point-to-point-connection-is-dead.md similarity index 100% rename from src/blog/2024/11/why-point-to-point-connection-is-dead.md rename to nuxt/content/blog/2024/11/why-point-to-point-connection-is-dead.md diff --git a/src/blog/2024/11/why-pub-sub-in-uns.md b/nuxt/content/blog/2024/11/why-pub-sub-in-uns.md similarity index 100% rename from src/blog/2024/11/why-pub-sub-in-uns.md rename to nuxt/content/blog/2024/11/why-pub-sub-in-uns.md diff --git a/src/blog/2024/12/flowfuse-release-2-12.md b/nuxt/content/blog/2024/12/flowfuse-release-2-12.md similarity index 100% rename from src/blog/2024/12/flowfuse-release-2-12.md rename to nuxt/content/blog/2024/12/flowfuse-release-2-12.md diff --git a/src/blog/2024/12/flowfuse-team-collaboration.md b/nuxt/content/blog/2024/12/flowfuse-team-collaboration.md similarity index 100% rename from src/blog/2024/12/flowfuse-team-collaboration.md rename to nuxt/content/blog/2024/12/flowfuse-team-collaboration.md diff --git a/src/blog/2024/12/publishing-modbus-data-to-uns.md b/nuxt/content/blog/2024/12/publishing-modbus-data-to-uns.md similarity index 100% rename from src/blog/2024/12/publishing-modbus-data-to-uns.md rename to nuxt/content/blog/2024/12/publishing-modbus-data-to-uns.md diff --git a/src/blog/2024/12/why-uns-need-data-modeling.md b/nuxt/content/blog/2024/12/why-uns-need-data-modeling.md similarity index 100% rename from src/blog/2024/12/why-uns-need-data-modeling.md rename to nuxt/content/blog/2024/12/why-uns-need-data-modeling.md diff --git a/src/blog/2025/01/designing-topic-hierarchy-for-your-uns.md b/nuxt/content/blog/2025/01/designing-topic-hierarchy-for-your-uns.md similarity index 100% rename from src/blog/2025/01/designing-topic-hierarchy-for-your-uns.md rename to nuxt/content/blog/2025/01/designing-topic-hierarchy-for-your-uns.md diff --git a/src/blog/2025/01/flowfuse-release-2-13.md b/nuxt/content/blog/2025/01/flowfuse-release-2-13.md similarity index 100% rename from src/blog/2025/01/flowfuse-release-2-13.md rename to nuxt/content/blog/2025/01/flowfuse-release-2-13.md diff --git a/src/blog/2025/01/how-to-choose-right-iot-device-management-tool.md b/nuxt/content/blog/2025/01/how-to-choose-right-iot-device-management-tool.md similarity index 100% rename from src/blog/2025/01/how-to-choose-right-iot-device-management-tool.md rename to nuxt/content/blog/2025/01/how-to-choose-right-iot-device-management-tool.md diff --git a/src/blog/2025/01/integrating-siemens-s7-plcs-with-node-red-guide.md b/nuxt/content/blog/2025/01/integrating-siemens-s7-plcs-with-node-red-guide.md similarity index 100% rename from src/blog/2025/01/integrating-siemens-s7-plcs-with-node-red-guide.md rename to nuxt/content/blog/2025/01/integrating-siemens-s7-plcs-with-node-red-guide.md diff --git a/src/blog/2025/01/mqtt-frontrunner-for-uns-part-2.md b/nuxt/content/blog/2025/01/mqtt-frontrunner-for-uns-part-2.md similarity index 100% rename from src/blog/2025/01/mqtt-frontrunner-for-uns-part-2.md rename to nuxt/content/blog/2025/01/mqtt-frontrunner-for-uns-part-2.md diff --git a/src/blog/2025/01/mqtt-frontrunner-for-uns.md b/nuxt/content/blog/2025/01/mqtt-frontrunner-for-uns.md similarity index 100% rename from src/blog/2025/01/mqtt-frontrunner-for-uns.md rename to nuxt/content/blog/2025/01/mqtt-frontrunner-for-uns.md diff --git a/src/blog/2025/01/why-flowfuse-is-complete-toolkit-for-uns.md b/nuxt/content/blog/2025/01/why-flowfuse-is-complete-toolkit-for-uns.md similarity index 100% rename from src/blog/2025/01/why-flowfuse-is-complete-toolkit-for-uns.md rename to nuxt/content/blog/2025/01/why-flowfuse-is-complete-toolkit-for-uns.md diff --git a/src/blog/2025/02/flowfuse-release-2-14.md b/nuxt/content/blog/2025/02/flowfuse-release-2-14.md similarity index 100% rename from src/blog/2025/02/flowfuse-release-2-14.md rename to nuxt/content/blog/2025/02/flowfuse-release-2-14.md diff --git a/src/blog/2025/02/interacting-with-arduino-using-node-red.md b/nuxt/content/blog/2025/02/interacting-with-arduino-using-node-red.md similarity index 100% rename from src/blog/2025/02/interacting-with-arduino-using-node-red.md rename to nuxt/content/blog/2025/02/interacting-with-arduino-using-node-red.md diff --git a/src/blog/2025/02/monitoring-system-health-performance-scale-flowfuse.md b/nuxt/content/blog/2025/02/monitoring-system-health-performance-scale-flowfuse.md similarity index 100% rename from src/blog/2025/02/monitoring-system-health-performance-scale-flowfuse.md rename to nuxt/content/blog/2025/02/monitoring-system-health-performance-scale-flowfuse.md diff --git a/src/blog/2025/02/node-red-academy-announcement.md b/nuxt/content/blog/2025/02/node-red-academy-announcement.md similarity index 100% rename from src/blog/2025/02/node-red-academy-announcement.md rename to nuxt/content/blog/2025/02/node-red-academy-announcement.md diff --git a/src/blog/2025/03/flowfuse-release-2-15.md b/nuxt/content/blog/2025/03/flowfuse-release-2-15.md similarity index 100% rename from src/blog/2025/03/flowfuse-release-2-15.md rename to nuxt/content/blog/2025/03/flowfuse-release-2-15.md diff --git a/src/blog/2025/03/managing-mqtt-connections-at-scale-in-flowfuse.md b/nuxt/content/blog/2025/03/managing-mqtt-connections-at-scale-in-flowfuse.md similarity index 100% rename from src/blog/2025/03/managing-mqtt-connections-at-scale-in-flowfuse.md rename to nuxt/content/blog/2025/03/managing-mqtt-connections-at-scale-in-flowfuse.md diff --git a/src/blog/2025/04/build-manufacturing-oee-dashboard.md b/nuxt/content/blog/2025/04/build-manufacturing-oee-dashboard.md similarity index 100% rename from src/blog/2025/04/build-manufacturing-oee-dashboard.md rename to nuxt/content/blog/2025/04/build-manufacturing-oee-dashboard.md diff --git a/src/blog/2025/04/design-and-scale-oee-dashboard.md b/nuxt/content/blog/2025/04/design-and-scale-oee-dashboard.md similarity index 100% rename from src/blog/2025/04/design-and-scale-oee-dashboard.md rename to nuxt/content/blog/2025/04/design-and-scale-oee-dashboard.md diff --git a/src/blog/2025/04/flowfuse-release-2-16.md b/nuxt/content/blog/2025/04/flowfuse-release-2-16.md similarity index 100% rename from src/blog/2025/04/flowfuse-release-2-16.md rename to nuxt/content/blog/2025/04/flowfuse-release-2-16.md diff --git a/src/blog/2025/04/what-is-an-oee-dashboard.md b/nuxt/content/blog/2025/04/what-is-an-oee-dashboard.md similarity index 100% rename from src/blog/2025/04/what-is-an-oee-dashboard.md rename to nuxt/content/blog/2025/04/what-is-an-oee-dashboard.md diff --git a/src/blog/2025/05/building-andon-task-manager-with-ff.md b/nuxt/content/blog/2025/05/building-andon-task-manager-with-ff.md similarity index 100% rename from src/blog/2025/05/building-andon-task-manager-with-ff.md rename to nuxt/content/blog/2025/05/building-andon-task-manager-with-ff.md diff --git a/src/blog/2025/05/designing-flexible-cron-schedules-in-flowfuse-with-node-red.md b/nuxt/content/blog/2025/05/designing-flexible-cron-schedules-in-flowfuse-with-node-red.md similarity index 100% rename from src/blog/2025/05/designing-flexible-cron-schedules-in-flowfuse-with-node-red.md rename to nuxt/content/blog/2025/05/designing-flexible-cron-schedules-in-flowfuse-with-node-red.md diff --git a/src/blog/2025/05/displaying-embeded-webpages-on-node-red-dashboard.md b/nuxt/content/blog/2025/05/displaying-embeded-webpages-on-node-red-dashboard.md similarity index 100% rename from src/blog/2025/05/displaying-embeded-webpages-on-node-red-dashboard.md rename to nuxt/content/blog/2025/05/displaying-embeded-webpages-on-node-red-dashboard.md diff --git a/src/blog/2025/05/flowfuse-release-2-17.md b/nuxt/content/blog/2025/05/flowfuse-release-2-17.md similarity index 100% rename from src/blog/2025/05/flowfuse-release-2-17.md rename to nuxt/content/blog/2025/05/flowfuse-release-2-17.md diff --git a/src/blog/2025/05/how-to-generate-pdf-reports-using-node-red.md b/nuxt/content/blog/2025/05/how-to-generate-pdf-reports-using-node-red.md similarity index 100% rename from src/blog/2025/05/how-to-generate-pdf-reports-using-node-red.md rename to nuxt/content/blog/2025/05/how-to-generate-pdf-reports-using-node-red.md diff --git a/src/blog/2025/06/announcing-node-red-con-2025.md b/nuxt/content/blog/2025/06/announcing-node-red-con-2025.md similarity index 100% rename from src/blog/2025/06/announcing-node-red-con-2025.md rename to nuxt/content/blog/2025/06/announcing-node-red-con-2025.md diff --git a/src/blog/2025/06/building-andon-task-manager-dashboard-with-ff.md b/nuxt/content/blog/2025/06/building-andon-task-manager-dashboard-with-ff.md similarity index 100% rename from src/blog/2025/06/building-andon-task-manager-dashboard-with-ff.md rename to nuxt/content/blog/2025/06/building-andon-task-manager-dashboard-with-ff.md diff --git a/src/blog/2025/06/connect-shop-floor-to-odoo-erp-flowfuse.md b/nuxt/content/blog/2025/06/connect-shop-floor-to-odoo-erp-flowfuse.md similarity index 100% rename from src/blog/2025/06/connect-shop-floor-to-odoo-erp-flowfuse.md rename to nuxt/content/blog/2025/06/connect-shop-floor-to-odoo-erp-flowfuse.md diff --git a/src/blog/2025/06/data-acquisition-for-mes.md b/nuxt/content/blog/2025/06/data-acquisition-for-mes.md similarity index 100% rename from src/blog/2025/06/data-acquisition-for-mes.md rename to nuxt/content/blog/2025/06/data-acquisition-for-mes.md diff --git a/src/blog/2025/06/flowfuse-forms-easy-data-collection-factory-floor.md b/nuxt/content/blog/2025/06/flowfuse-forms-easy-data-collection-factory-floor.md similarity index 100% rename from src/blog/2025/06/flowfuse-forms-easy-data-collection-factory-floor.md rename to nuxt/content/blog/2025/06/flowfuse-forms-easy-data-collection-factory-floor.md diff --git a/src/blog/2025/06/flowfuse-release-2-18.md b/nuxt/content/blog/2025/06/flowfuse-release-2-18.md similarity index 100% rename from src/blog/2025/06/flowfuse-release-2-18.md rename to nuxt/content/blog/2025/06/flowfuse-release-2-18.md diff --git a/src/blog/2025/06/optimizing-operations-improve-industrial-operations-with-flowfuse.md b/nuxt/content/blog/2025/06/optimizing-operations-improve-industrial-operations-with-flowfuse.md similarity index 100% rename from src/blog/2025/06/optimizing-operations-improve-industrial-operations-with-flowfuse.md rename to nuxt/content/blog/2025/06/optimizing-operations-improve-industrial-operations-with-flowfuse.md diff --git a/src/blog/2025/06/shop-floor-kpis-for-mes.md b/nuxt/content/blog/2025/06/shop-floor-kpis-for-mes.md similarity index 100% rename from src/blog/2025/06/shop-floor-kpis-for-mes.md rename to nuxt/content/blog/2025/06/shop-floor-kpis-for-mes.md diff --git a/src/blog/2025/06/structuring-storing-data-mes-integration.md b/nuxt/content/blog/2025/06/structuring-storing-data-mes-integration.md similarity index 100% rename from src/blog/2025/06/structuring-storing-data-mes-integration.md rename to nuxt/content/blog/2025/06/structuring-storing-data-mes-integration.md diff --git a/src/blog/2025/06/what-is-mes.md b/nuxt/content/blog/2025/06/what-is-mes.md similarity index 100% rename from src/blog/2025/06/what-is-mes.md rename to nuxt/content/blog/2025/06/what-is-mes.md diff --git a/src/blog/2025/07/certified-nodes-v2.md b/nuxt/content/blog/2025/07/certified-nodes-v2.md similarity index 100% rename from src/blog/2025/07/certified-nodes-v2.md rename to nuxt/content/blog/2025/07/certified-nodes-v2.md diff --git a/src/blog/2025/07/connect-legacy-equipment-serial-flowfuse.md b/nuxt/content/blog/2025/07/connect-legacy-equipment-serial-flowfuse.md similarity index 100% rename from src/blog/2025/07/connect-legacy-equipment-serial-flowfuse.md rename to nuxt/content/blog/2025/07/connect-legacy-equipment-serial-flowfuse.md diff --git a/src/blog/2025/07/flowfuse-ai-assistant-better-node-red-manufacturing.md b/nuxt/content/blog/2025/07/flowfuse-ai-assistant-better-node-red-manufacturing.md similarity index 100% rename from src/blog/2025/07/flowfuse-ai-assistant-better-node-red-manufacturing.md rename to nuxt/content/blog/2025/07/flowfuse-ai-assistant-better-node-red-manufacturing.md diff --git a/src/blog/2025/07/flowfuse-release-2-19.md b/nuxt/content/blog/2025/07/flowfuse-release-2-19.md similarity index 100% rename from src/blog/2025/07/flowfuse-release-2-19.md rename to nuxt/content/blog/2025/07/flowfuse-release-2-19.md diff --git a/src/blog/2025/07/flowfuse-release-2-20.md b/nuxt/content/blog/2025/07/flowfuse-release-2-20.md similarity index 100% rename from src/blog/2025/07/flowfuse-release-2-20.md rename to nuxt/content/blog/2025/07/flowfuse-release-2-20.md diff --git a/src/blog/2025/07/quality-control-automation-spc-charts.md b/nuxt/content/blog/2025/07/quality-control-automation-spc-charts.md similarity index 100% rename from src/blog/2025/07/quality-control-automation-spc-charts.md rename to nuxt/content/blog/2025/07/quality-control-automation-spc-charts.md diff --git a/src/blog/2025/07/reading-and-writing-plc-data-using-opc-ua.md b/nuxt/content/blog/2025/07/reading-and-writing-plc-data-using-opc-ua.md similarity index 100% rename from src/blog/2025/07/reading-and-writing-plc-data-using-opc-ua.md rename to nuxt/content/blog/2025/07/reading-and-writing-plc-data-using-opc-ua.md diff --git a/src/blog/2025/07/smart-manufacturing-order-panel-flowfuse.md b/nuxt/content/blog/2025/07/smart-manufacturing-order-panel-flowfuse.md similarity index 100% rename from src/blog/2025/07/smart-manufacturing-order-panel-flowfuse.md rename to nuxt/content/blog/2025/07/smart-manufacturing-order-panel-flowfuse.md diff --git a/src/blog/2025/08/advanced-opcua-real-time-subscriptions-alarms-historical-data.md b/nuxt/content/blog/2025/08/advanced-opcua-real-time-subscriptions-alarms-historical-data.md similarity index 100% rename from src/blog/2025/08/advanced-opcua-real-time-subscriptions-alarms-historical-data.md rename to nuxt/content/blog/2025/08/advanced-opcua-real-time-subscriptions-alarms-historical-data.md diff --git a/src/blog/2025/08/annual_billing.md b/nuxt/content/blog/2025/08/annual_billing.md similarity index 100% rename from src/blog/2025/08/annual_billing.md rename to nuxt/content/blog/2025/08/annual_billing.md diff --git a/src/blog/2025/08/flowfuse-node-red-api.md b/nuxt/content/blog/2025/08/flowfuse-node-red-api.md similarity index 100% rename from src/blog/2025/08/flowfuse-node-red-api.md rename to nuxt/content/blog/2025/08/flowfuse-node-red-api.md diff --git a/src/blog/2025/08/flowfuse-release-2-21.md b/nuxt/content/blog/2025/08/flowfuse-release-2-21.md similarity index 100% rename from src/blog/2025/08/flowfuse-release-2-21.md rename to nuxt/content/blog/2025/08/flowfuse-release-2-21.md diff --git a/src/blog/2025/08/flowfuse-why-pricing-matters.md b/nuxt/content/blog/2025/08/flowfuse-why-pricing-matters.md similarity index 100% rename from src/blog/2025/08/flowfuse-why-pricing-matters.md rename to nuxt/content/blog/2025/08/flowfuse-why-pricing-matters.md diff --git a/src/blog/2025/08/getting-started-with-flowfuse-tables.md b/nuxt/content/blog/2025/08/getting-started-with-flowfuse-tables.md similarity index 100% rename from src/blog/2025/08/getting-started-with-flowfuse-tables.md rename to nuxt/content/blog/2025/08/getting-started-with-flowfuse-tables.md diff --git a/src/blog/2025/08/open-source-software-and-manufacturing.md b/nuxt/content/blog/2025/08/open-source-software-and-manufacturing.md similarity index 100% rename from src/blog/2025/08/open-source-software-and-manufacturing.md rename to nuxt/content/blog/2025/08/open-source-software-and-manufacturing.md diff --git a/src/blog/2025/08/orchestrating-virtual-power-plants-low-code-platforms.md b/nuxt/content/blog/2025/08/orchestrating-virtual-power-plants-low-code-platforms.md similarity index 100% rename from src/blog/2025/08/orchestrating-virtual-power-plants-low-code-platforms.md rename to nuxt/content/blog/2025/08/orchestrating-virtual-power-plants-low-code-platforms.md diff --git a/src/blog/2025/08/pareto-chart-manufacturing-guide.md b/nuxt/content/blog/2025/08/pareto-chart-manufacturing-guide.md similarity index 100% rename from src/blog/2025/08/pareto-chart-manufacturing-guide.md rename to nuxt/content/blog/2025/08/pareto-chart-manufacturing-guide.md diff --git a/src/blog/2025/08/time-series-dashboard-flowfuse-postgresql.md b/nuxt/content/blog/2025/08/time-series-dashboard-flowfuse-postgresql.md similarity index 100% rename from src/blog/2025/08/time-series-dashboard-flowfuse-postgresql.md rename to nuxt/content/blog/2025/08/time-series-dashboard-flowfuse-postgresql.md diff --git a/src/blog/2025/09/ai-assistant-flowfuse-tables.md b/nuxt/content/blog/2025/09/ai-assistant-flowfuse-tables.md similarity index 100% rename from src/blog/2025/09/ai-assistant-flowfuse-tables.md rename to nuxt/content/blog/2025/09/ai-assistant-flowfuse-tables.md diff --git a/src/blog/2025/09/creating-pareto-chart.md b/nuxt/content/blog/2025/09/creating-pareto-chart.md similarity index 100% rename from src/blog/2025/09/creating-pareto-chart.md rename to nuxt/content/blog/2025/09/creating-pareto-chart.md diff --git a/src/blog/2025/09/flowfuse-release-2-22.md b/nuxt/content/blog/2025/09/flowfuse-release-2-22.md similarity index 100% rename from src/blog/2025/09/flowfuse-release-2-22.md rename to nuxt/content/blog/2025/09/flowfuse-release-2-22.md diff --git a/src/blog/2025/09/installing-node-red.md b/nuxt/content/blog/2025/09/installing-node-red.md similarity index 100% rename from src/blog/2025/09/installing-node-red.md rename to nuxt/content/blog/2025/09/installing-node-red.md diff --git a/src/blog/2025/09/integrating-lorawan-with-flowfuse-node-red.md b/nuxt/content/blog/2025/09/integrating-lorawan-with-flowfuse-node-red.md similarity index 100% rename from src/blog/2025/09/integrating-lorawan-with-flowfuse-node-red.md rename to nuxt/content/blog/2025/09/integrating-lorawan-with-flowfuse-node-red.md diff --git a/src/blog/2025/09/it-vs-ot-difference-between-information-technology-and-operational-technology.md b/nuxt/content/blog/2025/09/it-vs-ot-difference-between-information-technology-and-operational-technology.md similarity index 100% rename from src/blog/2025/09/it-vs-ot-difference-between-information-technology-and-operational-technology.md rename to nuxt/content/blog/2025/09/it-vs-ot-difference-between-information-technology-and-operational-technology.md diff --git a/src/blog/2025/09/poka-yoke-mistake-proofing.md b/nuxt/content/blog/2025/09/poka-yoke-mistake-proofing.md similarity index 100% rename from src/blog/2025/09/poka-yoke-mistake-proofing.md rename to nuxt/content/blog/2025/09/poka-yoke-mistake-proofing.md diff --git a/src/blog/2025/09/preventive-maintenance-equipment-failure.md b/nuxt/content/blog/2025/09/preventive-maintenance-equipment-failure.md similarity index 100% rename from src/blog/2025/09/preventive-maintenance-equipment-failure.md rename to nuxt/content/blog/2025/09/preventive-maintenance-equipment-failure.md diff --git a/src/blog/2025/09/using-modbus-with-flowfuse.md b/nuxt/content/blog/2025/09/using-modbus-with-flowfuse.md similarity index 100% rename from src/blog/2025/09/using-modbus-with-flowfuse.md rename to nuxt/content/blog/2025/09/using-modbus-with-flowfuse.md diff --git a/src/blog/2025/09/what-is-5s-checklist.md b/nuxt/content/blog/2025/09/what-is-5s-checklist.md similarity index 100% rename from src/blog/2025/09/what-is-5s-checklist.md rename to nuxt/content/blog/2025/09/what-is-5s-checklist.md diff --git a/src/blog/2025/09/what-is-takt-time.md b/nuxt/content/blog/2025/09/what-is-takt-time.md similarity index 100% rename from src/blog/2025/09/what-is-takt-time.md rename to nuxt/content/blog/2025/09/what-is-takt-time.md diff --git a/src/blog/2025/10/ai-on-flowfuse.md b/nuxt/content/blog/2025/10/ai-on-flowfuse.md similarity index 100% rename from src/blog/2025/10/ai-on-flowfuse.md rename to nuxt/content/blog/2025/10/ai-on-flowfuse.md diff --git a/src/blog/2025/10/building-mcp-server-using-flowfuse.md b/nuxt/content/blog/2025/10/building-mcp-server-using-flowfuse.md similarity index 100% rename from src/blog/2025/10/building-mcp-server-using-flowfuse.md rename to nuxt/content/blog/2025/10/building-mcp-server-using-flowfuse.md diff --git a/src/blog/2025/10/custom-onnx-model.md b/nuxt/content/blog/2025/10/custom-onnx-model.md similarity index 100% rename from src/blog/2025/10/custom-onnx-model.md rename to nuxt/content/blog/2025/10/custom-onnx-model.md diff --git a/src/blog/2025/10/flowfuse-release-2-23.md b/nuxt/content/blog/2025/10/flowfuse-release-2-23.md similarity index 100% rename from src/blog/2025/10/flowfuse-release-2-23.md rename to nuxt/content/blog/2025/10/flowfuse-release-2-23.md diff --git a/src/blog/2025/10/how-to-log-plc-data-csv-files.md b/nuxt/content/blog/2025/10/how-to-log-plc-data-csv-files.md similarity index 100% rename from src/blog/2025/10/how-to-log-plc-data-csv-files.md rename to nuxt/content/blog/2025/10/how-to-log-plc-data-csv-files.md diff --git a/src/blog/2025/10/introducing-flowfuse-expert.md b/nuxt/content/blog/2025/10/introducing-flowfuse-expert.md similarity index 100% rename from src/blog/2025/10/introducing-flowfuse-expert.md rename to nuxt/content/blog/2025/10/introducing-flowfuse-expert.md diff --git a/src/blog/2025/10/node-red-revolution.md b/nuxt/content/blog/2025/10/node-red-revolution.md similarity index 100% rename from src/blog/2025/10/node-red-revolution.md rename to nuxt/content/blog/2025/10/node-red-revolution.md diff --git a/src/blog/2025/10/node-red-vs-flowfuse.md b/nuxt/content/blog/2025/10/node-red-vs-flowfuse.md similarity index 100% rename from src/blog/2025/10/node-red-vs-flowfuse.md rename to nuxt/content/blog/2025/10/node-red-vs-flowfuse.md diff --git a/src/blog/2025/10/open-ai-agent-builder-versus-flowfuse.md b/nuxt/content/blog/2025/10/open-ai-agent-builder-versus-flowfuse.md similarity index 100% rename from src/blog/2025/10/open-ai-agent-builder-versus-flowfuse.md rename to nuxt/content/blog/2025/10/open-ai-agent-builder-versus-flowfuse.md diff --git a/src/blog/2025/10/plc-to-mqtt-using-flowfuse.md b/nuxt/content/blog/2025/10/plc-to-mqtt-using-flowfuse.md similarity index 100% rename from src/blog/2025/10/plc-to-mqtt-using-flowfuse.md rename to nuxt/content/blog/2025/10/plc-to-mqtt-using-flowfuse.md diff --git a/src/blog/2025/10/the-ai-orchestration-hype.md b/nuxt/content/blog/2025/10/the-ai-orchestration-hype.md similarity index 100% rename from src/blog/2025/10/the-ai-orchestration-hype.md rename to nuxt/content/blog/2025/10/the-ai-orchestration-hype.md diff --git a/src/blog/2025/10/using-ethernet-ip-with-flowfuse.md b/nuxt/content/blog/2025/10/using-ethernet-ip-with-flowfuse.md similarity index 100% rename from src/blog/2025/10/using-ethernet-ip-with-flowfuse.md rename to nuxt/content/blog/2025/10/using-ethernet-ip-with-flowfuse.md diff --git a/src/blog/2025/11/building-hmi-for-equipment-control.md b/nuxt/content/blog/2025/11/building-hmi-for-equipment-control.md similarity index 100% rename from src/blog/2025/11/building-hmi-for-equipment-control.md rename to nuxt/content/blog/2025/11/building-hmi-for-equipment-control.md diff --git a/src/blog/2025/11/building-label-scanner-with-flowfuse.md b/nuxt/content/blog/2025/11/building-label-scanner-with-flowfuse.md similarity index 100% rename from src/blog/2025/11/building-label-scanner-with-flowfuse.md rename to nuxt/content/blog/2025/11/building-label-scanner-with-flowfuse.md diff --git a/src/blog/2025/11/csv-mqtt-database-dashboard-flowfuse.md b/nuxt/content/blog/2025/11/csv-mqtt-database-dashboard-flowfuse.md similarity index 100% rename from src/blog/2025/11/csv-mqtt-database-dashboard-flowfuse.md rename to nuxt/content/blog/2025/11/csv-mqtt-database-dashboard-flowfuse.md diff --git a/src/blog/2025/11/flowfuse+llm+mcp-equals-text-driven-operations.md b/nuxt/content/blog/2025/11/flowfuse+llm+mcp-equals-text-driven-operations.md similarity index 100% rename from src/blog/2025/11/flowfuse+llm+mcp-equals-text-driven-operations.md rename to nuxt/content/blog/2025/11/flowfuse+llm+mcp-equals-text-driven-operations.md diff --git a/src/blog/2025/11/flowfuse-release-2-24.md b/nuxt/content/blog/2025/11/flowfuse-release-2-24.md similarity index 100% rename from src/blog/2025/11/flowfuse-release-2-24.md rename to nuxt/content/blog/2025/11/flowfuse-release-2-24.md diff --git a/src/blog/2025/11/industrial-data-validation-guide.md b/nuxt/content/blog/2025/11/industrial-data-validation-guide.md similarity index 100% rename from src/blog/2025/11/industrial-data-validation-guide.md rename to nuxt/content/blog/2025/11/industrial-data-validation-guide.md diff --git a/src/blog/2025/11/optimize-industrial-data-protocol-buffers.md b/nuxt/content/blog/2025/11/optimize-industrial-data-protocol-buffers.md similarity index 100% rename from src/blog/2025/11/optimize-industrial-data-protocol-buffers.md rename to nuxt/content/blog/2025/11/optimize-industrial-data-protocol-buffers.md diff --git a/src/blog/2025/11/ptc-kepware-thingworx-divestment.md b/nuxt/content/blog/2025/11/ptc-kepware-thingworx-divestment.md similarity index 100% rename from src/blog/2025/11/ptc-kepware-thingworx-divestment.md rename to nuxt/content/blog/2025/11/ptc-kepware-thingworx-divestment.md diff --git a/src/blog/2025/11/store-and-forward-edge-data-buffering.md b/nuxt/content/blog/2025/11/store-and-forward-edge-data-buffering.md similarity index 100% rename from src/blog/2025/11/store-and-forward-edge-data-buffering.md rename to nuxt/content/blog/2025/11/store-and-forward-edge-data-buffering.md diff --git a/src/blog/2025/12/five-whys-root-cause-analysis-definition-examples.md b/nuxt/content/blog/2025/12/five-whys-root-cause-analysis-definition-examples.md similarity index 100% rename from src/blog/2025/12/five-whys-root-cause-analysis-definition-examples.md rename to nuxt/content/blog/2025/12/five-whys-root-cause-analysis-definition-examples.md diff --git a/src/blog/2025/12/flowfuse-release-2-25.md b/nuxt/content/blog/2025/12/flowfuse-release-2-25.md similarity index 100% rename from src/blog/2025/12/flowfuse-release-2-25.md rename to nuxt/content/blog/2025/12/flowfuse-release-2-25.md diff --git a/src/blog/2025/12/getting-weather-data-in-node-red.md b/nuxt/content/blog/2025/12/getting-weather-data-in-node-red.md similarity index 100% rename from src/blog/2025/12/getting-weather-data-in-node-red.md rename to nuxt/content/blog/2025/12/getting-weather-data-in-node-red.md diff --git a/src/blog/2025/12/kafka-vs-mqtt.md b/nuxt/content/blog/2025/12/kafka-vs-mqtt.md similarity index 100% rename from src/blog/2025/12/kafka-vs-mqtt.md rename to nuxt/content/blog/2025/12/kafka-vs-mqtt.md diff --git a/src/blog/2025/12/mttf-vs-mtbf-vs-mttr.md b/nuxt/content/blog/2025/12/mttf-vs-mtbf-vs-mttr.md similarity index 100% rename from src/blog/2025/12/mttf-vs-mtbf-vs-mttr.md rename to nuxt/content/blog/2025/12/mttf-vs-mtbf-vs-mttr.md diff --git a/src/blog/2025/12/node-red-buffer-parser-industrial-data.md b/nuxt/content/blog/2025/12/node-red-buffer-parser-industrial-data.md similarity index 100% rename from src/blog/2025/12/node-red-buffer-parser-industrial-data.md rename to nuxt/content/blog/2025/12/node-red-buffer-parser-industrial-data.md diff --git a/src/blog/2025/12/node-red-timer.md b/nuxt/content/blog/2025/12/node-red-timer.md similarity index 100% rename from src/blog/2025/12/node-red-timer.md rename to nuxt/content/blog/2025/12/node-red-timer.md diff --git a/src/blog/2025/12/read-s7-optimized-datablocks-flowfuse.md b/nuxt/content/blog/2025/12/read-s7-optimized-datablocks-flowfuse.md similarity index 100% rename from src/blog/2025/12/read-s7-optimized-datablocks-flowfuse.md rename to nuxt/content/blog/2025/12/read-s7-optimized-datablocks-flowfuse.md diff --git a/src/blog/2025/12/what-is-plc.md b/nuxt/content/blog/2025/12/what-is-plc.md similarity index 100% rename from src/blog/2025/12/what-is-plc.md rename to nuxt/content/blog/2025/12/what-is-plc.md diff --git a/src/blog/2025/12/what-is-teep.md b/nuxt/content/blog/2025/12/what-is-teep.md similarity index 100% rename from src/blog/2025/12/what-is-teep.md rename to nuxt/content/blog/2025/12/what-is-teep.md diff --git a/src/blog/2026/01/eliminate-opc-ua-bottleneck-ai-agents.md b/nuxt/content/blog/2026/01/eliminate-opc-ua-bottleneck-ai-agents.md similarity index 100% rename from src/blog/2026/01/eliminate-opc-ua-bottleneck-ai-agents.md rename to nuxt/content/blog/2026/01/eliminate-opc-ua-bottleneck-ai-agents.md diff --git a/src/blog/2026/01/flowfuse-release-2-26.md b/nuxt/content/blog/2026/01/flowfuse-release-2-26.md similarity index 100% rename from src/blog/2026/01/flowfuse-release-2-26.md rename to nuxt/content/blog/2026/01/flowfuse-release-2-26.md diff --git a/src/blog/2026/01/how-to-integrate-node-red-with-git.md b/nuxt/content/blog/2026/01/how-to-integrate-node-red-with-git.md similarity index 100% rename from src/blog/2026/01/how-to-integrate-node-red-with-git.md rename to nuxt/content/blog/2026/01/how-to-integrate-node-red-with-git.md diff --git a/src/blog/2026/01/kepware-opcua-better-alternative.md b/nuxt/content/blog/2026/01/kepware-opcua-better-alternative.md similarity index 100% rename from src/blog/2026/01/kepware-opcua-better-alternative.md rename to nuxt/content/blog/2026/01/kepware-opcua-better-alternative.md diff --git a/src/blog/2026/01/node-red-history-community-industrial-iot-flowfuse.md b/nuxt/content/blog/2026/01/node-red-history-community-industrial-iot-flowfuse.md similarity index 100% rename from src/blog/2026/01/node-red-history-community-industrial-iot-flowfuse.md rename to nuxt/content/blog/2026/01/node-red-history-community-industrial-iot-flowfuse.md diff --git a/src/blog/2026/01/opcua-vs-mqtt.md b/nuxt/content/blog/2026/01/opcua-vs-mqtt.md similarity index 100% rename from src/blog/2026/01/opcua-vs-mqtt.md rename to nuxt/content/blog/2026/01/opcua-vs-mqtt.md diff --git a/src/blog/2026/01/what-is-system-integrator.md b/nuxt/content/blog/2026/01/what-is-system-integrator.md similarity index 100% rename from src/blog/2026/01/what-is-system-integrator.md rename to nuxt/content/blog/2026/01/what-is-system-integrator.md diff --git a/src/blog/2026/01/why-modbus-still-exist.md b/nuxt/content/blog/2026/01/why-modbus-still-exist.md similarity index 100% rename from src/blog/2026/01/why-modbus-still-exist.md rename to nuxt/content/blog/2026/01/why-modbus-still-exist.md diff --git a/src/blog/2026/02/edge-ai-is-80-percent-pipeline-and-20-percent-ai.md b/nuxt/content/blog/2026/02/edge-ai-is-80-percent-pipeline-and-20-percent-ai.md similarity index 100% rename from src/blog/2026/02/edge-ai-is-80-percent-pipeline-and-20-percent-ai.md rename to nuxt/content/blog/2026/02/edge-ai-is-80-percent-pipeline-and-20-percent-ai.md diff --git a/src/blog/2026/02/flowfuse-release-2-27.md b/nuxt/content/blog/2026/02/flowfuse-release-2-27.md similarity index 100% rename from src/blog/2026/02/flowfuse-release-2-27.md rename to nuxt/content/blog/2026/02/flowfuse-release-2-27.md diff --git a/src/blog/2026/02/getting-started-with-canbus.md b/nuxt/content/blog/2026/02/getting-started-with-canbus.md similarity index 100% rename from src/blog/2026/02/getting-started-with-canbus.md rename to nuxt/content/blog/2026/02/getting-started-with-canbus.md diff --git a/src/blog/2026/02/mapping-mtconnect-streams.md b/nuxt/content/blog/2026/02/mapping-mtconnect-streams.md similarity index 100% rename from src/blog/2026/02/mapping-mtconnect-streams.md rename to nuxt/content/blog/2026/02/mapping-mtconnect-streams.md diff --git a/src/blog/2026/02/modbus-tcp-vs-modbus-rtu.md b/nuxt/content/blog/2026/02/modbus-tcp-vs-modbus-rtu.md similarity index 100% rename from src/blog/2026/02/modbus-tcp-vs-modbus-rtu.md rename to nuxt/content/blog/2026/02/modbus-tcp-vs-modbus-rtu.md diff --git a/src/blog/2026/02/motor-anomaly-detector-ai.md b/nuxt/content/blog/2026/02/motor-anomaly-detector-ai.md similarity index 100% rename from src/blog/2026/02/motor-anomaly-detector-ai.md rename to nuxt/content/blog/2026/02/motor-anomaly-detector-ai.md diff --git a/src/blog/2026/02/mqtt-influxdb-tutorial.md b/nuxt/content/blog/2026/02/mqtt-influxdb-tutorial.md similarity index 100% rename from src/blog/2026/02/mqtt-influxdb-tutorial.md rename to nuxt/content/blog/2026/02/mqtt-influxdb-tutorial.md diff --git a/src/blog/2026/02/mqtt-vs-coap.md b/nuxt/content/blog/2026/02/mqtt-vs-coap.md similarity index 100% rename from src/blog/2026/02/mqtt-vs-coap.md rename to nuxt/content/blog/2026/02/mqtt-vs-coap.md diff --git a/src/blog/2026/02/shop-floor-to-ai-signals-context-decisions.md b/nuxt/content/blog/2026/02/shop-floor-to-ai-signals-context-decisions.md similarity index 100% rename from src/blog/2026/02/shop-floor-to-ai-signals-context-decisions.md rename to nuxt/content/blog/2026/02/shop-floor-to-ai-signals-context-decisions.md diff --git a/src/blog/2026/02/what-is-event-driven-architecture-in-manufacturing.md b/nuxt/content/blog/2026/02/what-is-event-driven-architecture-in-manufacturing.md similarity index 100% rename from src/blog/2026/02/what-is-event-driven-architecture-in-manufacturing.md rename to nuxt/content/blog/2026/02/what-is-event-driven-architecture-in-manufacturing.md diff --git a/src/blog/2026/03/ai-usecases-in-factory.md b/nuxt/content/blog/2026/03/ai-usecases-in-factory.md similarity index 100% rename from src/blog/2026/03/ai-usecases-in-factory.md rename to nuxt/content/blog/2026/03/ai-usecases-in-factory.md diff --git a/src/blog/2026/03/bus-factory-problem-in-manufacturing.md b/nuxt/content/blog/2026/03/bus-factory-problem-in-manufacturing.md similarity index 100% rename from src/blog/2026/03/bus-factory-problem-in-manufacturing.md rename to nuxt/content/blog/2026/03/bus-factory-problem-in-manufacturing.md diff --git a/src/blog/2026/03/edge-ai-vs-cloud-ai-in-iiot.md b/nuxt/content/blog/2026/03/edge-ai-vs-cloud-ai-in-iiot.md similarity index 100% rename from src/blog/2026/03/edge-ai-vs-cloud-ai-in-iiot.md rename to nuxt/content/blog/2026/03/edge-ai-vs-cloud-ai-in-iiot.md diff --git a/src/blog/2026/03/enterprise-packaging-updates.md b/nuxt/content/blog/2026/03/enterprise-packaging-updates.md similarity index 100% rename from src/blog/2026/03/enterprise-packaging-updates.md rename to nuxt/content/blog/2026/03/enterprise-packaging-updates.md diff --git a/src/blog/2026/03/flowfuse-release-2-28.md b/nuxt/content/blog/2026/03/flowfuse-release-2-28.md similarity index 100% rename from src/blog/2026/03/flowfuse-release-2-28.md rename to nuxt/content/blog/2026/03/flowfuse-release-2-28.md diff --git a/src/blog/2026/03/how-to-connect-to-twincat-using-ads.md b/nuxt/content/blog/2026/03/how-to-connect-to-twincat-using-ads.md similarity index 100% rename from src/blog/2026/03/how-to-connect-to-twincat-using-ads.md rename to nuxt/content/blog/2026/03/how-to-connect-to-twincat-using-ads.md diff --git a/src/blog/2026/03/how-to-implement-dlq-and-retries.md b/nuxt/content/blog/2026/03/how-to-implement-dlq-and-retries.md similarity index 100% rename from src/blog/2026/03/how-to-implement-dlq-and-retries.md rename to nuxt/content/blog/2026/03/how-to-implement-dlq-and-retries.md diff --git a/src/blog/2026/03/how-to-monitor-industrial-network-usign-snmp.md b/nuxt/content/blog/2026/03/how-to-monitor-industrial-network-usign-snmp.md similarity index 100% rename from src/blog/2026/03/how-to-monitor-industrial-network-usign-snmp.md rename to nuxt/content/blog/2026/03/how-to-monitor-industrial-network-usign-snmp.md diff --git a/src/blog/2026/03/how-to-parse-binary-data-serial-devices.md b/nuxt/content/blog/2026/03/how-to-parse-binary-data-serial-devices.md similarity index 100% rename from src/blog/2026/03/how-to-parse-binary-data-serial-devices.md rename to nuxt/content/blog/2026/03/how-to-parse-binary-data-serial-devices.md diff --git a/src/blog/2026/03/last-mile-problem-ai.md b/nuxt/content/blog/2026/03/last-mile-problem-ai.md similarity index 100% rename from src/blog/2026/03/last-mile-problem-ai.md rename to nuxt/content/blog/2026/03/last-mile-problem-ai.md diff --git a/src/blog/2026/03/rethinking-edge-ais-core-orchestration.md b/nuxt/content/blog/2026/03/rethinking-edge-ais-core-orchestration.md similarity index 100% rename from src/blog/2026/03/rethinking-edge-ais-core-orchestration.md rename to nuxt/content/blog/2026/03/rethinking-edge-ais-core-orchestration.md diff --git a/src/blog/2026/03/why-opcua-is-not-replacing-modbus-yet.md b/nuxt/content/blog/2026/03/why-opcua-is-not-replacing-modbus-yet.md similarity index 100% rename from src/blog/2026/03/why-opcua-is-not-replacing-modbus-yet.md rename to nuxt/content/blog/2026/03/why-opcua-is-not-replacing-modbus-yet.md diff --git a/src/blog/2026/04/cloud-edge-or-hybrid-how-to-choose-your-flowfuse-deployment.md b/nuxt/content/blog/2026/04/cloud-edge-or-hybrid-how-to-choose-your-flowfuse-deployment.md similarity index 100% rename from src/blog/2026/04/cloud-edge-or-hybrid-how-to-choose-your-flowfuse-deployment.md rename to nuxt/content/blog/2026/04/cloud-edge-or-hybrid-how-to-choose-your-flowfuse-deployment.md diff --git a/src/blog/2026/04/connect-industrial-edge-devices-aws-iot-core.md b/nuxt/content/blog/2026/04/connect-industrial-edge-devices-aws-iot-core.md similarity index 100% rename from src/blog/2026/04/connect-industrial-edge-devices-aws-iot-core.md rename to nuxt/content/blog/2026/04/connect-industrial-edge-devices-aws-iot-core.md diff --git a/src/blog/2026/04/diagnosing-modbus-degradation.md b/nuxt/content/blog/2026/04/diagnosing-modbus-degradation.md similarity index 100% rename from src/blog/2026/04/diagnosing-modbus-degradation.md rename to nuxt/content/blog/2026/04/diagnosing-modbus-degradation.md diff --git a/src/blog/2026/04/flowfuse-release-2-29.md b/nuxt/content/blog/2026/04/flowfuse-release-2-29.md similarity index 100% rename from src/blog/2026/04/flowfuse-release-2-29.md rename to nuxt/content/blog/2026/04/flowfuse-release-2-29.md diff --git a/src/blog/2026/04/it-vs-ot-who-owns-the-edge.md b/nuxt/content/blog/2026/04/it-vs-ot-who-owns-the-edge.md similarity index 100% rename from src/blog/2026/04/it-vs-ot-who-owns-the-edge.md rename to nuxt/content/blog/2026/04/it-vs-ot-who-owns-the-edge.md diff --git a/src/blog/2026/04/modbus-polling-best-practices.md b/nuxt/content/blog/2026/04/modbus-polling-best-practices.md similarity index 100% rename from src/blog/2026/04/modbus-polling-best-practices.md rename to nuxt/content/blog/2026/04/modbus-polling-best-practices.md diff --git a/src/blog/2026/04/rosetta-stone-for-industrial-data.md b/nuxt/content/blog/2026/04/rosetta-stone-for-industrial-data.md similarity index 100% rename from src/blog/2026/04/rosetta-stone-for-industrial-data.md rename to nuxt/content/blog/2026/04/rosetta-stone-for-industrial-data.md diff --git a/src/blog/2026/04/stop-noisy-sensor-data-deadband-filter-flowfuse.md b/nuxt/content/blog/2026/04/stop-noisy-sensor-data-deadband-filter-flowfuse.md similarity index 100% rename from src/blog/2026/04/stop-noisy-sensor-data-deadband-filter-flowfuse.md rename to nuxt/content/blog/2026/04/stop-noisy-sensor-data-deadband-filter-flowfuse.md diff --git a/src/blog/2026/04/why-simplicity-wins-in-iiot.md b/nuxt/content/blog/2026/04/why-simplicity-wins-in-iiot.md similarity index 100% rename from src/blog/2026/04/why-simplicity-wins-in-iiot.md rename to nuxt/content/blog/2026/04/why-simplicity-wins-in-iiot.md diff --git a/src/blog/2026/05/fixing-oee-measurement-in-manufacturing.md b/nuxt/content/blog/2026/05/fixing-oee-measurement-in-manufacturing.md similarity index 100% rename from src/blog/2026/05/fixing-oee-measurement-in-manufacturing.md rename to nuxt/content/blog/2026/05/fixing-oee-measurement-in-manufacturing.md diff --git a/src/blog/2026/05/flowfuse-expert-building-flows.md b/nuxt/content/blog/2026/05/flowfuse-expert-building-flows.md similarity index 100% rename from src/blog/2026/05/flowfuse-expert-building-flows.md rename to nuxt/content/blog/2026/05/flowfuse-expert-building-flows.md diff --git a/src/blog/2026/05/flowfuse-release-2-30.md b/nuxt/content/blog/2026/05/flowfuse-release-2-30.md similarity index 100% rename from src/blog/2026/05/flowfuse-release-2-30.md rename to nuxt/content/blog/2026/05/flowfuse-release-2-30.md diff --git a/src/blog/2026/05/git-snapshot-for-iiot-flows.md b/nuxt/content/blog/2026/05/git-snapshot-for-iiot-flows.md similarity index 100% rename from src/blog/2026/05/git-snapshot-for-iiot-flows.md rename to nuxt/content/blog/2026/05/git-snapshot-for-iiot-flows.md diff --git a/src/blog/2026/05/manufacturing-software-built-in-stages.md b/nuxt/content/blog/2026/05/manufacturing-software-built-in-stages.md similarity index 100% rename from src/blog/2026/05/manufacturing-software-built-in-stages.md rename to nuxt/content/blog/2026/05/manufacturing-software-built-in-stages.md diff --git a/src/blog/2026/05/nis2-iec-62443-manufacturers.md b/nuxt/content/blog/2026/05/nis2-iec-62443-manufacturers.md similarity index 100% rename from src/blog/2026/05/nis2-iec-62443-manufacturers.md rename to nuxt/content/blog/2026/05/nis2-iec-62443-manufacturers.md diff --git a/src/blog/2026/05/opc-ua-security-attack-vectors.md b/nuxt/content/blog/2026/05/opc-ua-security-attack-vectors.md similarity index 100% rename from src/blog/2026/05/opc-ua-security-attack-vectors.md rename to nuxt/content/blog/2026/05/opc-ua-security-attack-vectors.md diff --git a/src/blog/2026/06/announcing-node-red-con-2026.md b/nuxt/content/blog/2026/06/announcing-node-red-con-2026.md similarity index 100% rename from src/blog/2026/06/announcing-node-red-con-2026.md rename to nuxt/content/blog/2026/06/announcing-node-red-con-2026.md diff --git a/src/blog/2026/06/application-idea-to-architectur.md b/nuxt/content/blog/2026/06/application-idea-to-architectur.md similarity index 100% rename from src/blog/2026/06/application-idea-to-architectur.md rename to nuxt/content/blog/2026/06/application-idea-to-architectur.md diff --git a/src/blog/2026/06/event-driven-downtime-escalation-workflow.md b/nuxt/content/blog/2026/06/event-driven-downtime-escalation-workflow.md similarity index 100% rename from src/blog/2026/06/event-driven-downtime-escalation-workflow.md rename to nuxt/content/blog/2026/06/event-driven-downtime-escalation-workflow.md diff --git a/src/blog/2026/06/flowfuse-release-2-31.md b/nuxt/content/blog/2026/06/flowfuse-release-2-31.md similarity index 100% rename from src/blog/2026/06/flowfuse-release-2-31.md rename to nuxt/content/blog/2026/06/flowfuse-release-2-31.md diff --git a/src/blog/2026/06/mqtt-vs-sparkplug-b.md b/nuxt/content/blog/2026/06/mqtt-vs-sparkplug-b.md similarity index 100% rename from src/blog/2026/06/mqtt-vs-sparkplug-b.md rename to nuxt/content/blog/2026/06/mqtt-vs-sparkplug-b.md diff --git a/src/blog/2026/06/node-red-5-on-flowfuse.md b/nuxt/content/blog/2026/06/node-red-5-on-flowfuse.md similarity index 100% rename from src/blog/2026/06/node-red-5-on-flowfuse.md rename to nuxt/content/blog/2026/06/node-red-5-on-flowfuse.md diff --git a/src/blog/2026/06/opc-ua-security-best-practices.md b/nuxt/content/blog/2026/06/opc-ua-security-best-practices.md similarity index 100% rename from src/blog/2026/06/opc-ua-security-best-practices.md rename to nuxt/content/blog/2026/06/opc-ua-security-best-practices.md diff --git a/src/blog/2026/06/opcua-to-influxdb.md b/nuxt/content/blog/2026/06/opcua-to-influxdb.md similarity index 100% rename from src/blog/2026/06/opcua-to-influxdb.md rename to nuxt/content/blog/2026/06/opcua-to-influxdb.md diff --git a/src/blog/2026/06/plc-communication-latency-causes-and-fixes.md b/nuxt/content/blog/2026/06/plc-communication-latency-causes-and-fixes.md similarity index 100% rename from src/blog/2026/06/plc-communication-latency-causes-and-fixes.md rename to nuxt/content/blog/2026/06/plc-communication-latency-causes-and-fixes.md diff --git a/src/blog/2026/06/process-rtsp-camera-feeds-at-the-edge.md b/nuxt/content/blog/2026/06/process-rtsp-camera-feeds-at-the-edge.md similarity index 100% rename from src/blog/2026/06/process-rtsp-camera-feeds-at-the-edge.md rename to nuxt/content/blog/2026/06/process-rtsp-camera-feeds-at-the-edge.md diff --git a/src/blog/2026/06/scaling-manufacturing-data-integration.md b/nuxt/content/blog/2026/06/scaling-manufacturing-data-integration.md similarity index 100% rename from src/blog/2026/06/scaling-manufacturing-data-integration.md rename to nuxt/content/blog/2026/06/scaling-manufacturing-data-integration.md diff --git a/src/blog/2026/07/build-downtime-logger.md b/nuxt/content/blog/2026/07/build-downtime-logger.md similarity index 100% rename from src/blog/2026/07/build-downtime-logger.md rename to nuxt/content/blog/2026/07/build-downtime-logger.md diff --git a/src/blog/2026/07/calibration-management-dashboard.md b/nuxt/content/blog/2026/07/calibration-management-dashboard.md similarity index 100% rename from src/blog/2026/07/calibration-management-dashboard.md rename to nuxt/content/blog/2026/07/calibration-management-dashboard.md diff --git a/src/blog/2026/07/control-and-track-factory-floor-machines.md b/nuxt/content/blog/2026/07/control-and-track-factory-floor-machines.md similarity index 100% rename from src/blog/2026/07/control-and-track-factory-floor-machines.md rename to nuxt/content/blog/2026/07/control-and-track-factory-floor-machines.md diff --git a/src/blog/2026/07/defect-and-quality-monitoring.md b/nuxt/content/blog/2026/07/defect-and-quality-monitoring.md similarity index 100% rename from src/blog/2026/07/defect-and-quality-monitoring.md rename to nuxt/content/blog/2026/07/defect-and-quality-monitoring.md diff --git a/src/blog/2026/07/digital-work-instruction.md b/nuxt/content/blog/2026/07/digital-work-instruction.md similarity index 100% rename from src/blog/2026/07/digital-work-instruction.md rename to nuxt/content/blog/2026/07/digital-work-instruction.md diff --git a/src/blog/2026/07/flowfuse-release-2-32.md b/nuxt/content/blog/2026/07/flowfuse-release-2-32.md similarity index 100% rename from src/blog/2026/07/flowfuse-release-2-32.md rename to nuxt/content/blog/2026/07/flowfuse-release-2-32.md diff --git a/src/blog/2026/07/flowfuse-release-2-33.md b/nuxt/content/blog/2026/07/flowfuse-release-2-33.md similarity index 100% rename from src/blog/2026/07/flowfuse-release-2-33.md rename to nuxt/content/blog/2026/07/flowfuse-release-2-33.md diff --git a/src/blog/2026/07/gitops-for-manufacturing.md b/nuxt/content/blog/2026/07/gitops-for-manufacturing.md similarity index 100% rename from src/blog/2026/07/gitops-for-manufacturing.md rename to nuxt/content/blog/2026/07/gitops-for-manufacturing.md diff --git a/src/blog/2026/07/ishikawa-fishbone-diagram.md b/nuxt/content/blog/2026/07/ishikawa-fishbone-diagram.md similarity index 100% rename from src/blog/2026/07/ishikawa-fishbone-diagram.md rename to nuxt/content/blog/2026/07/ishikawa-fishbone-diagram.md diff --git a/src/blog/2026/07/software-defined-manufacturing.md b/nuxt/content/blog/2026/07/software-defined-manufacturing.md similarity index 100% rename from src/blog/2026/07/software-defined-manufacturing.md rename to nuxt/content/blog/2026/07/software-defined-manufacturing.md diff --git a/src/blog/2026/07/time-synchronization-edge-devices.md b/nuxt/content/blog/2026/07/time-synchronization-edge-devices.md similarity index 100% rename from src/blog/2026/07/time-synchronization-edge-devices.md rename to nuxt/content/blog/2026/07/time-synchronization-edge-devices.md diff --git a/src/blog/2026/07/what-is-instrument-calibration.md b/nuxt/content/blog/2026/07/what-is-instrument-calibration.md similarity index 100% rename from src/blog/2026/07/what-is-instrument-calibration.md rename to nuxt/content/blog/2026/07/what-is-instrument-calibration.md diff --git a/src/blog/2026/08/automotive-traceability.md b/nuxt/content/blog/2026/08/automotive-traceability.md similarity index 100% rename from src/blog/2026/08/automotive-traceability.md rename to nuxt/content/blog/2026/08/automotive-traceability.md diff --git a/src/blog/2026/08/connect-agvs-vda-5050-mqtt.md b/nuxt/content/blog/2026/08/connect-agvs-vda-5050-mqtt.md similarity index 100% rename from src/blog/2026/08/connect-agvs-vda-5050-mqtt.md rename to nuxt/content/blog/2026/08/connect-agvs-vda-5050-mqtt.md diff --git a/src/blog/2026/08/containment-action.md b/nuxt/content/blog/2026/08/containment-action.md similarity index 100% rename from src/blog/2026/08/containment-action.md rename to nuxt/content/blog/2026/08/containment-action.md diff --git a/src/blog/2026/08/control-plans.md b/nuxt/content/blog/2026/08/control-plans.md similarity index 100% rename from src/blog/2026/08/control-plans.md rename to nuxt/content/blog/2026/08/control-plans.md diff --git a/src/blog/2026/08/dashboard-themes-and-rendering-fixes.md b/nuxt/content/blog/2026/08/dashboard-themes-and-rendering-fixes.md similarity index 100% rename from src/blog/2026/08/dashboard-themes-and-rendering-fixes.md rename to nuxt/content/blog/2026/08/dashboard-themes-and-rendering-fixes.md diff --git a/src/blog/2026/08/flowfuse-release-3-0.md b/nuxt/content/blog/2026/08/flowfuse-release-3-0.md similarity index 100% rename from src/blog/2026/08/flowfuse-release-3-0.md rename to nuxt/content/blog/2026/08/flowfuse-release-3-0.md diff --git a/src/blog/2026/08/layered-process-audit.md b/nuxt/content/blog/2026/08/layered-process-audit.md similarity index 100% rename from src/blog/2026/08/layered-process-audit.md rename to nuxt/content/blog/2026/08/layered-process-audit.md diff --git a/src/blog/2026/08/manufacturing-dashboard-examples.md b/nuxt/content/blog/2026/08/manufacturing-dashboard-examples.md similarity index 100% rename from src/blog/2026/08/manufacturing-dashboard-examples.md rename to nuxt/content/blog/2026/08/manufacturing-dashboard-examples.md diff --git a/src/blog/2026/08/run-at-rate.md b/nuxt/content/blog/2026/08/run-at-rate.md similarity index 100% rename from src/blog/2026/08/run-at-rate.md rename to nuxt/content/blog/2026/08/run-at-rate.md diff --git a/src/blog/2026/08/safe-launch.md b/nuxt/content/blog/2026/08/safe-launch.md similarity index 100% rename from src/blog/2026/08/safe-launch.md rename to nuxt/content/blog/2026/08/safe-launch.md diff --git a/src/blog/2026/08/statistical-process-control.md b/nuxt/content/blog/2026/08/statistical-process-control.md similarity index 100% rename from src/blog/2026/08/statistical-process-control.md rename to nuxt/content/blog/2026/08/statistical-process-control.md diff --git a/src/blog/2026/08/vda-6.3.md b/nuxt/content/blog/2026/08/vda-6.3.md similarity index 100% rename from src/blog/2026/08/vda-6.3.md rename to nuxt/content/blog/2026/08/vda-6.3.md diff --git a/src/blog/2026/08/what-is-scada.md b/nuxt/content/blog/2026/08/what-is-scada.md similarity index 100% rename from src/blog/2026/08/what-is-scada.md rename to nuxt/content/blog/2026/08/what-is-scada.md diff --git a/src/blog/2026/09/5-whys-vs-fishbone-diagram.md b/nuxt/content/blog/2026/09/5-whys-vs-fishbone-diagram.md similarity index 100% rename from src/blog/2026/09/5-whys-vs-fishbone-diagram.md rename to nuxt/content/blog/2026/09/5-whys-vs-fishbone-diagram.md diff --git a/src/blog/2026/09/ai-in-manufacturing.md b/nuxt/content/blog/2026/09/ai-in-manufacturing.md similarity index 100% rename from src/blog/2026/09/ai-in-manufacturing.md rename to nuxt/content/blog/2026/09/ai-in-manufacturing.md diff --git a/src/blog/2026/09/automotive-mes.md b/nuxt/content/blog/2026/09/automotive-mes.md similarity index 100% rename from src/blog/2026/09/automotive-mes.md rename to nuxt/content/blog/2026/09/automotive-mes.md diff --git a/src/blog/2026/09/capa-corrective-preventive-action.md b/nuxt/content/blog/2026/09/capa-corrective-preventive-action.md similarity index 100% rename from src/blog/2026/09/capa-corrective-preventive-action.md rename to nuxt/content/blog/2026/09/capa-corrective-preventive-action.md diff --git a/src/blog/2026/09/first-pass-inspection-fpa.md b/nuxt/content/blog/2026/09/first-pass-inspection-fpa.md similarity index 100% rename from src/blog/2026/09/first-pass-inspection-fpa.md rename to nuxt/content/blog/2026/09/first-pass-inspection-fpa.md diff --git a/src/blog/2026/09/five-whys-template.md b/nuxt/content/blog/2026/09/five-whys-template.md similarity index 100% rename from src/blog/2026/09/five-whys-template.md rename to nuxt/content/blog/2026/09/five-whys-template.md diff --git a/src/blog/2026/09/industrial-ai-agent.md b/nuxt/content/blog/2026/09/industrial-ai-agent.md similarity index 100% rename from src/blog/2026/09/industrial-ai-agent.md rename to nuxt/content/blog/2026/09/industrial-ai-agent.md diff --git a/src/blog/2026/09/ishikawa-fishbone-diagram-template.md b/nuxt/content/blog/2026/09/ishikawa-fishbone-diagram-template.md similarity index 100% rename from src/blog/2026/09/ishikawa-fishbone-diagram-template.md rename to nuxt/content/blog/2026/09/ishikawa-fishbone-diagram-template.md diff --git a/src/blog/2026/09/layered-process-audit-checklist-template.md b/nuxt/content/blog/2026/09/layered-process-audit-checklist-template.md similarity index 100% rename from src/blog/2026/09/layered-process-audit-checklist-template.md rename to nuxt/content/blog/2026/09/layered-process-audit-checklist-template.md diff --git a/src/blog/2026/09/ppap.md b/nuxt/content/blog/2026/09/ppap.md similarity index 100% rename from src/blog/2026/09/ppap.md rename to nuxt/content/blog/2026/09/ppap.md diff --git a/src/changelog/2023/09/custom-node-support.md b/nuxt/content/changelog/2023/09/custom-node-support.md similarity index 100% rename from src/changelog/2023/09/custom-node-support.md rename to nuxt/content/changelog/2023/09/custom-node-support.md diff --git a/src/changelog/2023/09/devops-actions.md b/nuxt/content/changelog/2023/09/devops-actions.md similarity index 100% rename from src/changelog/2023/09/devops-actions.md rename to nuxt/content/changelog/2023/09/devops-actions.md diff --git a/src/changelog/2023/09/introduction-enterprise-tier.md b/nuxt/content/changelog/2023/09/introduction-enterprise-tier.md similarity index 100% rename from src/changelog/2023/09/introduction-enterprise-tier.md rename to nuxt/content/changelog/2023/09/introduction-enterprise-tier.md diff --git a/src/changelog/2023/09/pipeline-api.md b/nuxt/content/changelog/2023/09/pipeline-api.md similarity index 100% rename from src/changelog/2023/09/pipeline-api.md rename to nuxt/content/changelog/2023/09/pipeline-api.md diff --git a/src/changelog/2023/09/snapshots-devices.md b/nuxt/content/changelog/2023/09/snapshots-devices.md similarity index 100% rename from src/changelog/2023/09/snapshots-devices.md rename to nuxt/content/changelog/2023/09/snapshots-devices.md diff --git a/src/changelog/2023/10/blueprints.md b/nuxt/content/changelog/2023/10/blueprints.md similarity index 100% rename from src/changelog/2023/10/blueprints.md rename to nuxt/content/changelog/2023/10/blueprints.md diff --git a/src/changelog/2023/10/certified-nodes.md b/nuxt/content/changelog/2023/10/certified-nodes.md similarity index 100% rename from src/changelog/2023/10/certified-nodes.md rename to nuxt/content/changelog/2023/10/certified-nodes.md diff --git a/src/changelog/2023/10/device-snapshot-selection.md b/nuxt/content/changelog/2023/10/device-snapshot-selection.md similarity index 100% rename from src/changelog/2023/10/device-snapshot-selection.md rename to nuxt/content/changelog/2023/10/device-snapshot-selection.md diff --git a/src/changelog/2023/10/path-bug-fix.md b/nuxt/content/changelog/2023/10/path-bug-fix.md similarity index 100% rename from src/changelog/2023/10/path-bug-fix.md rename to nuxt/content/changelog/2023/10/path-bug-fix.md diff --git a/src/changelog/2023/10/resource-alerts.md b/nuxt/content/changelog/2023/10/resource-alerts.md similarity index 100% rename from src/changelog/2023/10/resource-alerts.md rename to nuxt/content/changelog/2023/10/resource-alerts.md diff --git a/src/changelog/2023/11/2fa.md b/nuxt/content/changelog/2023/11/2fa.md similarity index 100% rename from src/changelog/2023/11/2fa.md rename to nuxt/content/changelog/2023/11/2fa.md diff --git a/src/changelog/2023/11/default-editor.md b/nuxt/content/changelog/2023/11/default-editor.md similarity index 100% rename from src/changelog/2023/11/default-editor.md rename to nuxt/content/changelog/2023/11/default-editor.md diff --git a/src/changelog/2023/11/devices-in-pipelines.md b/nuxt/content/changelog/2023/11/devices-in-pipelines.md similarity index 100% rename from src/changelog/2023/11/devices-in-pipelines.md rename to nuxt/content/changelog/2023/11/devices-in-pipelines.md diff --git a/src/changelog/2023/11/project-nodes-devices.md b/nuxt/content/changelog/2023/11/project-nodes-devices.md similarity index 100% rename from src/changelog/2023/11/project-nodes-devices.md rename to nuxt/content/changelog/2023/11/project-nodes-devices.md diff --git a/src/changelog/2023/12/billing.md b/nuxt/content/changelog/2023/12/billing.md similarity index 100% rename from src/changelog/2023/12/billing.md rename to nuxt/content/changelog/2023/12/billing.md diff --git a/src/changelog/2023/12/blueprint-selection.md b/nuxt/content/changelog/2023/12/blueprint-selection.md similarity index 100% rename from src/changelog/2023/12/blueprint-selection.md rename to nuxt/content/changelog/2023/12/blueprint-selection.md diff --git a/src/changelog/2023/12/device-groups.md b/nuxt/content/changelog/2023/12/device-groups.md similarity index 100% rename from src/changelog/2023/12/device-groups.md rename to nuxt/content/changelog/2023/12/device-groups.md diff --git a/src/changelog/2023/12/email-alerting-node-red-crash.md b/nuxt/content/changelog/2023/12/email-alerting-node-red-crash.md similarity index 100% rename from src/changelog/2023/12/email-alerting-node-red-crash.md rename to nuxt/content/changelog/2023/12/email-alerting-node-red-crash.md diff --git a/src/changelog/2023/12/node-red-updated.md b/nuxt/content/changelog/2023/12/node-red-updated.md similarity index 100% rename from src/changelog/2023/12/node-red-updated.md rename to nuxt/content/changelog/2023/12/node-red-updated.md diff --git a/src/changelog/2024/01/device-audit-log.md b/nuxt/content/changelog/2024/01/device-audit-log.md similarity index 100% rename from src/changelog/2024/01/device-audit-log.md rename to nuxt/content/changelog/2024/01/device-audit-log.md diff --git a/src/changelog/2024/01/device-groups-snapshot.md b/nuxt/content/changelog/2024/01/device-groups-snapshot.md similarity index 100% rename from src/changelog/2024/01/device-groups-snapshot.md rename to nuxt/content/changelog/2024/01/device-groups-snapshot.md diff --git a/src/changelog/2024/01/fleet-mode.md b/nuxt/content/changelog/2024/01/fleet-mode.md similarity index 100% rename from src/changelog/2024/01/fleet-mode.md rename to nuxt/content/changelog/2024/01/fleet-mode.md diff --git a/src/changelog/2024/01/helm-v2.md b/nuxt/content/changelog/2024/01/helm-v2.md similarity index 100% rename from src/changelog/2024/01/helm-v2.md rename to nuxt/content/changelog/2024/01/helm-v2.md diff --git a/src/changelog/2024/01/new-blueprints.md b/nuxt/content/changelog/2024/01/new-blueprints.md similarity index 100% rename from src/changelog/2024/01/new-blueprints.md rename to nuxt/content/changelog/2024/01/new-blueprints.md diff --git a/src/changelog/2024/01/security-updates.md b/nuxt/content/changelog/2024/01/security-updates.md similarity index 100% rename from src/changelog/2024/01/security-updates.md rename to nuxt/content/changelog/2024/01/security-updates.md diff --git a/src/changelog/2024/01/sso-team-membership.md b/nuxt/content/changelog/2024/01/sso-team-membership.md similarity index 100% rename from src/changelog/2024/01/sso-team-membership.md rename to nuxt/content/changelog/2024/01/sso-team-membership.md diff --git a/src/changelog/2024/01/streamlined-device-assignment.md b/nuxt/content/changelog/2024/01/streamlined-device-assignment.md similarity index 100% rename from src/changelog/2024/01/streamlined-device-assignment.md rename to nuxt/content/changelog/2024/01/streamlined-device-assignment.md diff --git a/src/changelog/2024/02/device-auto-snapshot.md b/nuxt/content/changelog/2024/02/device-auto-snapshot.md similarity index 100% rename from src/changelog/2024/02/device-auto-snapshot.md rename to nuxt/content/changelog/2024/02/device-auto-snapshot.md diff --git a/src/changelog/2024/02/device-instance-audit-logs.md b/nuxt/content/changelog/2024/02/device-instance-audit-logs.md similarity index 100% rename from src/changelog/2024/02/device-instance-audit-logs.md rename to nuxt/content/changelog/2024/02/device-instance-audit-logs.md diff --git a/src/changelog/2024/02/device-onboarding-improvements.md b/nuxt/content/changelog/2024/02/device-onboarding-improvements.md similarity index 100% rename from src/changelog/2024/02/device-onboarding-improvements.md rename to nuxt/content/changelog/2024/02/device-onboarding-improvements.md diff --git a/src/changelog/2024/02/device-pricing-change.md b/nuxt/content/changelog/2024/02/device-pricing-change.md similarity index 100% rename from src/changelog/2024/02/device-pricing-change.md rename to nuxt/content/changelog/2024/02/device-pricing-change.md diff --git a/src/changelog/2024/02/instance-auto-snapshots.md b/nuxt/content/changelog/2024/02/instance-auto-snapshots.md similarity index 100% rename from src/changelog/2024/02/instance-auto-snapshots.md rename to nuxt/content/changelog/2024/02/instance-auto-snapshots.md diff --git a/src/changelog/2024/02/postgresql-upgrade.md b/nuxt/content/changelog/2024/02/postgresql-upgrade.md similarity index 100% rename from src/changelog/2024/02/postgresql-upgrade.md rename to nuxt/content/changelog/2024/02/postgresql-upgrade.md diff --git a/src/changelog/2024/03/bearer-token-authentication.md b/nuxt/content/changelog/2024/03/bearer-token-authentication.md similarity index 100% rename from src/changelog/2024/03/bearer-token-authentication.md rename to nuxt/content/changelog/2024/03/bearer-token-authentication.md diff --git a/src/changelog/2024/03/instance-protection-mode.md b/nuxt/content/changelog/2024/03/instance-protection-mode.md similarity index 100% rename from src/changelog/2024/03/instance-protection-mode.md rename to nuxt/content/changelog/2024/03/instance-protection-mode.md diff --git a/src/changelog/2024/03/limits-debug-payload.md b/nuxt/content/changelog/2024/03/limits-debug-payload.md similarity index 100% rename from src/changelog/2024/03/limits-debug-payload.md rename to nuxt/content/changelog/2024/03/limits-debug-payload.md diff --git a/src/changelog/2024/03/restart-devices-remotly.md b/nuxt/content/changelog/2024/03/restart-devices-remotly.md similarity index 100% rename from src/changelog/2024/03/restart-devices-remotly.md rename to nuxt/content/changelog/2024/03/restart-devices-remotly.md diff --git a/src/changelog/2024/04/custom-nodes-on-devices.md b/nuxt/content/changelog/2024/04/custom-nodes-on-devices.md similarity index 100% rename from src/changelog/2024/04/custom-nodes-on-devices.md rename to nuxt/content/changelog/2024/04/custom-nodes-on-devices.md diff --git a/src/changelog/2024/04/device-auto-snapshot.md b/nuxt/content/changelog/2024/04/device-auto-snapshot.md similarity index 100% rename from src/changelog/2024/04/device-auto-snapshot.md rename to nuxt/content/changelog/2024/04/device-auto-snapshot.md diff --git a/src/changelog/2024/04/improving-device-groups.md b/nuxt/content/changelog/2024/04/improving-device-groups.md similarity index 100% rename from src/changelog/2024/04/improving-device-groups.md rename to nuxt/content/changelog/2024/04/improving-device-groups.md diff --git a/src/changelog/2024/04/pricing-change.md b/nuxt/content/changelog/2024/04/pricing-change.md similarity index 100% rename from src/changelog/2024/04/pricing-change.md rename to nuxt/content/changelog/2024/04/pricing-change.md diff --git a/src/changelog/2024/04/tougher-rate-limiting.md b/nuxt/content/changelog/2024/04/tougher-rate-limiting.md similarity index 100% rename from src/changelog/2024/04/tougher-rate-limiting.md rename to nuxt/content/changelog/2024/04/tougher-rate-limiting.md diff --git a/src/changelog/2024/05/instance-healthcheck.md b/nuxt/content/changelog/2024/05/instance-healthcheck.md similarity index 100% rename from src/changelog/2024/05/instance-healthcheck.md rename to nuxt/content/changelog/2024/05/instance-healthcheck.md diff --git a/src/changelog/2024/05/library-blueprints.md b/nuxt/content/changelog/2024/05/library-blueprints.md similarity index 100% rename from src/changelog/2024/05/library-blueprints.md rename to nuxt/content/changelog/2024/05/library-blueprints.md diff --git a/src/changelog/2024/05/library-flowviewer.md b/nuxt/content/changelog/2024/05/library-flowviewer.md similarity index 100% rename from src/changelog/2024/05/library-flowviewer.md rename to nuxt/content/changelog/2024/05/library-flowviewer.md diff --git a/src/changelog/2024/05/managing-node-red-version-on-devices.md b/nuxt/content/changelog/2024/05/managing-node-red-version-on-devices.md similarity index 100% rename from src/changelog/2024/05/managing-node-red-version-on-devices.md rename to nuxt/content/changelog/2024/05/managing-node-red-version-on-devices.md diff --git a/src/changelog/2024/05/snapshot-improvements-pt3.md b/nuxt/content/changelog/2024/05/snapshot-improvements-pt3.md similarity index 100% rename from src/changelog/2024/05/snapshot-improvements-pt3.md rename to nuxt/content/changelog/2024/05/snapshot-improvements-pt3.md diff --git a/src/changelog/2024/05/snapshot-improvements.md b/nuxt/content/changelog/2024/05/snapshot-improvements.md similarity index 100% rename from src/changelog/2024/05/snapshot-improvements.md rename to nuxt/content/changelog/2024/05/snapshot-improvements.md diff --git a/src/changelog/2024/05/snapshot-upload.md b/nuxt/content/changelog/2024/05/snapshot-upload.md similarity index 100% rename from src/changelog/2024/05/snapshot-upload.md rename to nuxt/content/changelog/2024/05/snapshot-upload.md diff --git a/src/changelog/2024/06/device-agent-proxy-support.md b/nuxt/content/changelog/2024/06/device-agent-proxy-support.md similarity index 100% rename from src/changelog/2024/06/device-agent-proxy-support.md rename to nuxt/content/changelog/2024/06/device-agent-proxy-support.md diff --git a/src/changelog/2024/06/library-blueprints.md b/nuxt/content/changelog/2024/06/library-blueprints.md similarity index 100% rename from src/changelog/2024/06/library-blueprints.md rename to nuxt/content/changelog/2024/06/library-blueprints.md diff --git a/src/changelog/2024/06/multiline-env-vars.md b/nuxt/content/changelog/2024/06/multiline-env-vars.md similarity index 100% rename from src/changelog/2024/06/multiline-env-vars.md rename to nuxt/content/changelog/2024/06/multiline-env-vars.md diff --git a/src/changelog/2024/06/snapshot-flow-compare.md b/nuxt/content/changelog/2024/06/snapshot-flow-compare.md similarity index 100% rename from src/changelog/2024/06/snapshot-flow-compare.md rename to nuxt/content/changelog/2024/06/snapshot-flow-compare.md diff --git a/src/changelog/2024/07/applications-search.md b/nuxt/content/changelog/2024/07/applications-search.md similarity index 100% rename from src/changelog/2024/07/applications-search.md rename to nuxt/content/changelog/2024/07/applications-search.md diff --git a/src/changelog/2024/07/device-group-clear-snapshot.md b/nuxt/content/changelog/2024/07/device-group-clear-snapshot.md similarity index 100% rename from src/changelog/2024/07/device-group-clear-snapshot.md rename to nuxt/content/changelog/2024/07/device-group-clear-snapshot.md diff --git a/src/changelog/2024/07/device-management-bulk-delete.md b/nuxt/content/changelog/2024/07/device-management-bulk-delete.md similarity index 100% rename from src/changelog/2024/07/device-management-bulk-delete.md rename to nuxt/content/changelog/2024/07/device-management-bulk-delete.md diff --git a/src/changelog/2024/07/device-management-bulk-move.md b/nuxt/content/changelog/2024/07/device-management-bulk-move.md similarity index 100% rename from src/changelog/2024/07/device-management-bulk-move.md rename to nuxt/content/changelog/2024/07/device-management-bulk-move.md diff --git a/src/changelog/2024/07/edit-snapshots.md b/nuxt/content/changelog/2024/07/edit-snapshots.md similarity index 100% rename from src/changelog/2024/07/edit-snapshots.md rename to nuxt/content/changelog/2024/07/edit-snapshots.md diff --git a/src/changelog/2024/07/flowfuse-assistant-json.md b/nuxt/content/changelog/2024/07/flowfuse-assistant-json.md similarity index 100% rename from src/changelog/2024/07/flowfuse-assistant-json.md rename to nuxt/content/changelog/2024/07/flowfuse-assistant-json.md diff --git a/src/changelog/2024/07/flowfuse-assistant.md b/nuxt/content/changelog/2024/07/flowfuse-assistant.md similarity index 100% rename from src/changelog/2024/07/flowfuse-assistant.md rename to nuxt/content/changelog/2024/07/flowfuse-assistant.md diff --git a/src/changelog/2024/07/immersive-editor.md b/nuxt/content/changelog/2024/07/immersive-editor.md similarity index 100% rename from src/changelog/2024/07/immersive-editor.md rename to nuxt/content/changelog/2024/07/immersive-editor.md diff --git a/src/changelog/2024/07/notifications-inbox.md b/nuxt/content/changelog/2024/07/notifications-inbox.md similarity index 100% rename from src/changelog/2024/07/notifications-inbox.md rename to nuxt/content/changelog/2024/07/notifications-inbox.md diff --git a/src/changelog/2024/07/notifications-update.md b/nuxt/content/changelog/2024/07/notifications-update.md similarity index 100% rename from src/changelog/2024/07/notifications-update.md rename to nuxt/content/changelog/2024/07/notifications-update.md diff --git a/src/changelog/2024/07/persistent-storage.md b/nuxt/content/changelog/2024/07/persistent-storage.md similarity index 100% rename from src/changelog/2024/07/persistent-storage.md rename to nuxt/content/changelog/2024/07/persistent-storage.md diff --git a/src/changelog/2024/07/sso.md b/nuxt/content/changelog/2024/07/sso.md similarity index 100% rename from src/changelog/2024/07/sso.md rename to nuxt/content/changelog/2024/07/sso.md diff --git a/src/changelog/2024/08/bill-of-materials.md b/nuxt/content/changelog/2024/08/bill-of-materials.md similarity index 100% rename from src/changelog/2024/08/bill-of-materials.md rename to nuxt/content/changelog/2024/08/bill-of-materials.md diff --git a/src/changelog/2024/08/enterprise-license-update.md b/nuxt/content/changelog/2024/08/enterprise-license-update.md similarity index 100% rename from src/changelog/2024/08/enterprise-license-update.md rename to nuxt/content/changelog/2024/08/enterprise-license-update.md diff --git a/src/changelog/2024/08/ldap-sso-groups.md b/nuxt/content/changelog/2024/08/ldap-sso-groups.md similarity index 100% rename from src/changelog/2024/08/ldap-sso-groups.md rename to nuxt/content/changelog/2024/08/ldap-sso-groups.md diff --git a/src/changelog/2024/08/static-file-service-navigation-visibility.md b/nuxt/content/changelog/2024/08/static-file-service-navigation-visibility.md similarity index 100% rename from src/changelog/2024/08/static-file-service-navigation-visibility.md rename to nuxt/content/changelog/2024/08/static-file-service-navigation-visibility.md diff --git a/src/changelog/2024/10/device-group-env-vars.md b/nuxt/content/changelog/2024/10/device-group-env-vars.md similarity index 100% rename from src/changelog/2024/10/device-group-env-vars.md rename to nuxt/content/changelog/2024/10/device-group-env-vars.md diff --git a/src/changelog/2024/10/mqtt-service.md b/nuxt/content/changelog/2024/10/mqtt-service.md similarity index 100% rename from src/changelog/2024/10/mqtt-service.md rename to nuxt/content/changelog/2024/10/mqtt-service.md diff --git a/src/changelog/2024/10/notifications-bulk-actions.md b/nuxt/content/changelog/2024/10/notifications-bulk-actions.md similarity index 100% rename from src/changelog/2024/10/notifications-bulk-actions.md rename to nuxt/content/changelog/2024/10/notifications-bulk-actions.md diff --git a/src/changelog/2024/10/snapshot-download-upload-options.md b/nuxt/content/changelog/2024/10/snapshot-download-upload-options.md similarity index 100% rename from src/changelog/2024/10/snapshot-download-upload-options.md rename to nuxt/content/changelog/2024/10/snapshot-download-upload-options.md diff --git a/src/changelog/2024/10/version-history-timeline.md b/nuxt/content/changelog/2024/10/version-history-timeline.md similarity index 100% rename from src/changelog/2024/10/version-history-timeline.md rename to nuxt/content/changelog/2024/10/version-history-timeline.md diff --git a/src/changelog/2024/11/audit-log-hierarchy.md b/nuxt/content/changelog/2024/11/audit-log-hierarchy.md similarity index 100% rename from src/changelog/2024/11/audit-log-hierarchy.md rename to nuxt/content/changelog/2024/11/audit-log-hierarchy.md diff --git a/src/changelog/2024/11/device-agent-release.md b/nuxt/content/changelog/2024/11/device-agent-release.md similarity index 100% rename from src/changelog/2024/11/device-agent-release.md rename to nuxt/content/changelog/2024/11/device-agent-release.md diff --git a/src/changelog/2024/11/mqtt-topic-hierarchy.md b/nuxt/content/changelog/2024/11/mqtt-topic-hierarchy.md similarity index 100% rename from src/changelog/2024/11/mqtt-topic-hierarchy.md rename to nuxt/content/changelog/2024/11/mqtt-topic-hierarchy.md diff --git a/src/changelog/2024/11/team-search.md b/nuxt/content/changelog/2024/11/team-search.md similarity index 100% rename from src/changelog/2024/11/team-search.md rename to nuxt/content/changelog/2024/11/team-search.md diff --git a/src/changelog/2024/12/dashboad-iframe.md b/nuxt/content/changelog/2024/12/dashboad-iframe.md similarity index 100% rename from src/changelog/2024/12/dashboad-iframe.md rename to nuxt/content/changelog/2024/12/dashboad-iframe.md diff --git a/src/changelog/2024/12/device-editor-cache.md b/nuxt/content/changelog/2024/12/device-editor-cache.md similarity index 100% rename from src/changelog/2024/12/device-editor-cache.md rename to nuxt/content/changelog/2024/12/device-editor-cache.md diff --git a/src/changelog/2024/12/team-bom-timeline.md b/nuxt/content/changelog/2024/12/team-bom-timeline.md similarity index 100% rename from src/changelog/2024/12/team-bom-timeline.md rename to nuxt/content/changelog/2024/12/team-bom-timeline.md diff --git a/src/changelog/2025/01/free-tier-onboarding.md b/nuxt/content/changelog/2025/01/free-tier-onboarding.md similarity index 100% rename from src/changelog/2025/01/free-tier-onboarding.md rename to nuxt/content/changelog/2025/01/free-tier-onboarding.md diff --git a/src/changelog/2025/01/hidden-env-vars.md b/nuxt/content/changelog/2025/01/hidden-env-vars.md similarity index 100% rename from src/changelog/2025/01/hidden-env-vars.md rename to nuxt/content/changelog/2025/01/hidden-env-vars.md diff --git a/src/changelog/2025/01/improved-diagnostics.md b/nuxt/content/changelog/2025/01/improved-diagnostics.md similarity index 100% rename from src/changelog/2025/01/improved-diagnostics.md rename to nuxt/content/changelog/2025/01/improved-diagnostics.md diff --git a/src/changelog/2025/01/team-level-groups.md b/nuxt/content/changelog/2025/01/team-level-groups.md similarity index 100% rename from src/changelog/2025/01/team-level-groups.md rename to nuxt/content/changelog/2025/01/team-level-groups.md diff --git a/src/changelog/2025/02/additional-device-version-history-events.md b/nuxt/content/changelog/2025/02/additional-device-version-history-events.md similarity index 100% rename from src/changelog/2025/02/additional-device-version-history-events.md rename to nuxt/content/changelog/2025/02/additional-device-version-history-events.md diff --git a/src/changelog/2025/02/broker-error-feedback.md b/nuxt/content/changelog/2025/02/broker-error-feedback.md similarity index 100% rename from src/changelog/2025/02/broker-error-feedback.md rename to nuxt/content/changelog/2025/02/broker-error-feedback.md diff --git a/src/changelog/2025/02/device-agent-updates.md b/nuxt/content/changelog/2025/02/device-agent-updates.md similarity index 100% rename from src/changelog/2025/02/device-agent-updates.md rename to nuxt/content/changelog/2025/02/device-agent-updates.md diff --git a/src/changelog/2025/02/device-version-history-timeline.md b/nuxt/content/changelog/2025/02/device-version-history-timeline.md similarity index 100% rename from src/changelog/2025/02/device-version-history-timeline.md rename to nuxt/content/changelog/2025/02/device-version-history-timeline.md diff --git a/src/changelog/2025/02/external-brokers.md b/nuxt/content/changelog/2025/02/external-brokers.md similarity index 100% rename from src/changelog/2025/02/external-brokers.md rename to nuxt/content/changelog/2025/02/external-brokers.md diff --git a/src/changelog/2025/02/mqtt-schema-suggestions.md b/nuxt/content/changelog/2025/02/mqtt-schema-suggestions.md similarity index 100% rename from src/changelog/2025/02/mqtt-schema-suggestions.md rename to nuxt/content/changelog/2025/02/mqtt-schema-suggestions.md diff --git a/src/changelog/2025/02/resend-and-extend-team-invitation-expiration.md b/nuxt/content/changelog/2025/02/resend-and-extend-team-invitation-expiration.md similarity index 100% rename from src/changelog/2025/02/resend-and-extend-team-invitation-expiration.md rename to nuxt/content/changelog/2025/02/resend-and-extend-team-invitation-expiration.md diff --git a/src/changelog/2025/02/schema-docs.md b/nuxt/content/changelog/2025/02/schema-docs.md similarity index 100% rename from src/changelog/2025/02/schema-docs.md rename to nuxt/content/changelog/2025/02/schema-docs.md diff --git a/src/changelog/2025/02/topic-hierarchy-search.md b/nuxt/content/changelog/2025/02/topic-hierarchy-search.md similarity index 100% rename from src/changelog/2025/02/topic-hierarchy-search.md rename to nuxt/content/changelog/2025/02/topic-hierarchy-search.md diff --git a/src/changelog/2025/03/container-tags.md b/nuxt/content/changelog/2025/03/container-tags.md similarity index 100% rename from src/changelog/2025/03/container-tags.md rename to nuxt/content/changelog/2025/03/container-tags.md diff --git a/src/changelog/2025/03/device-groups.md b/nuxt/content/changelog/2025/03/device-groups.md similarity index 100% rename from src/changelog/2025/03/device-groups.md rename to nuxt/content/changelog/2025/03/device-groups.md diff --git a/src/changelog/2025/03/device-local-login.md b/nuxt/content/changelog/2025/03/device-local-login.md similarity index 100% rename from src/changelog/2025/03/device-local-login.md rename to nuxt/content/changelog/2025/03/device-local-login.md diff --git a/src/changelog/2025/03/free-tier.md b/nuxt/content/changelog/2025/03/free-tier.md similarity index 100% rename from src/changelog/2025/03/free-tier.md rename to nuxt/content/changelog/2025/03/free-tier.md diff --git a/src/changelog/2025/03/resource-notifications.md b/nuxt/content/changelog/2025/03/resource-notifications.md similarity index 100% rename from src/changelog/2025/03/resource-notifications.md rename to nuxt/content/changelog/2025/03/resource-notifications.md diff --git a/src/changelog/2025/03/snapshot-filter.md b/nuxt/content/changelog/2025/03/snapshot-filter.md similarity index 100% rename from src/changelog/2025/03/snapshot-filter.md rename to nuxt/content/changelog/2025/03/snapshot-filter.md diff --git a/src/changelog/2025/03/team-npm-registry.md b/nuxt/content/changelog/2025/03/team-npm-registry.md similarity index 100% rename from src/changelog/2025/03/team-npm-registry.md rename to nuxt/content/changelog/2025/03/team-npm-registry.md diff --git a/src/changelog/2025/03/topic-deletion.md b/nuxt/content/changelog/2025/03/topic-deletion.md similarity index 100% rename from src/changelog/2025/03/topic-deletion.md rename to nuxt/content/changelog/2025/03/topic-deletion.md diff --git a/src/changelog/2025/04/device-provisioning.md b/nuxt/content/changelog/2025/04/device-provisioning.md similarity index 100% rename from src/changelog/2025/04/device-provisioning.md rename to nuxt/content/changelog/2025/04/device-provisioning.md diff --git a/src/changelog/2025/04/git-integration.md b/nuxt/content/changelog/2025/04/git-integration.md similarity index 100% rename from src/changelog/2025/04/git-integration.md rename to nuxt/content/changelog/2025/04/git-integration.md diff --git a/src/changelog/2025/04/instance-log-browsing.md b/nuxt/content/changelog/2025/04/instance-log-browsing.md similarity index 100% rename from src/changelog/2025/04/instance-log-browsing.md rename to nuxt/content/changelog/2025/04/instance-log-browsing.md diff --git a/src/changelog/2025/05/import-node-red-flows.md b/nuxt/content/changelog/2025/05/import-node-red-flows.md similarity index 100% rename from src/changelog/2025/05/import-node-red-flows.md rename to nuxt/content/changelog/2025/05/import-node-red-flows.md diff --git a/src/changelog/2025/06/flowfuse-assistant-2.md b/nuxt/content/changelog/2025/06/flowfuse-assistant-2.md similarity index 100% rename from src/changelog/2025/06/flowfuse-assistant-2.md rename to nuxt/content/changelog/2025/06/flowfuse-assistant-2.md diff --git a/src/changelog/2025/06/flowfuse-assistant.md b/nuxt/content/changelog/2025/06/flowfuse-assistant.md similarity index 100% rename from src/changelog/2025/06/flowfuse-assistant.md rename to nuxt/content/changelog/2025/06/flowfuse-assistant.md diff --git a/src/changelog/2025/06/git-integration.md b/nuxt/content/changelog/2025/06/git-integration.md similarity index 100% rename from src/changelog/2025/06/git-integration.md rename to nuxt/content/changelog/2025/06/git-integration.md diff --git a/src/changelog/2025/06/instance-performance-memory.md b/nuxt/content/changelog/2025/06/instance-performance-memory.md similarity index 100% rename from src/changelog/2025/06/instance-performance-memory.md rename to nuxt/content/changelog/2025/06/instance-performance-memory.md diff --git a/src/changelog/2025/06/new-home-page.md b/nuxt/content/changelog/2025/06/new-home-page.md similarity index 100% rename from src/changelog/2025/06/new-home-page.md rename to nuxt/content/changelog/2025/06/new-home-page.md diff --git a/src/changelog/2025/06/team-performance-view.md b/nuxt/content/changelog/2025/06/team-performance-view.md similarity index 100% rename from src/changelog/2025/06/team-performance-view.md rename to nuxt/content/changelog/2025/06/team-performance-view.md diff --git a/src/changelog/2025/06/team-performance.md b/nuxt/content/changelog/2025/06/team-performance.md similarity index 100% rename from src/changelog/2025/06/team-performance.md rename to nuxt/content/changelog/2025/06/team-performance.md diff --git a/src/changelog/2025/06/ui-refresh.md b/nuxt/content/changelog/2025/06/ui-refresh.md similarity index 100% rename from src/changelog/2025/06/ui-refresh.md rename to nuxt/content/changelog/2025/06/ui-refresh.md diff --git a/src/changelog/2025/07/browse-node-red-flows.md b/nuxt/content/changelog/2025/07/browse-node-red-flows.md similarity index 100% rename from src/changelog/2025/07/browse-node-red-flows.md rename to nuxt/content/changelog/2025/07/browse-node-red-flows.md diff --git a/src/changelog/2025/07/flowfuse-tables.md b/nuxt/content/changelog/2025/07/flowfuse-tables.md similarity index 100% rename from src/changelog/2025/07/flowfuse-tables.md rename to nuxt/content/changelog/2025/07/flowfuse-tables.md diff --git a/src/changelog/2025/07/import-blueprints.md b/nuxt/content/changelog/2025/07/import-blueprints.md similarity index 100% rename from src/changelog/2025/07/import-blueprints.md rename to nuxt/content/changelog/2025/07/import-blueprints.md diff --git a/src/changelog/2025/07/simplified-applications-overview.md b/nuxt/content/changelog/2025/07/simplified-applications-overview.md similarity index 100% rename from src/changelog/2025/07/simplified-applications-overview.md rename to nuxt/content/changelog/2025/07/simplified-applications-overview.md diff --git a/src/changelog/2025/07/smart-suggestions.md b/nuxt/content/changelog/2025/07/smart-suggestions.md similarity index 100% rename from src/changelog/2025/07/smart-suggestions.md rename to nuxt/content/changelog/2025/07/smart-suggestions.md diff --git a/src/changelog/2025/07/team-to-pro-plan-rename.md b/nuxt/content/changelog/2025/07/team-to-pro-plan-rename.md similarity index 100% rename from src/changelog/2025/07/team-to-pro-plan-rename.md rename to nuxt/content/changelog/2025/07/team-to-pro-plan-rename.md diff --git a/src/changelog/2025/08/ai-generated-snapshot-descriptions-hosted.md b/nuxt/content/changelog/2025/08/ai-generated-snapshot-descriptions-hosted.md similarity index 100% rename from src/changelog/2025/08/ai-generated-snapshot-descriptions-hosted.md rename to nuxt/content/changelog/2025/08/ai-generated-snapshot-descriptions-hosted.md diff --git a/src/changelog/2025/08/ai-generated-snapshot-descriptions-remote.md b/nuxt/content/changelog/2025/08/ai-generated-snapshot-descriptions-remote.md similarity index 100% rename from src/changelog/2025/08/ai-generated-snapshot-descriptions-remote.md rename to nuxt/content/changelog/2025/08/ai-generated-snapshot-descriptions-remote.md diff --git a/src/changelog/2025/08/device-performance.md b/nuxt/content/changelog/2025/08/device-performance.md similarity index 100% rename from src/changelog/2025/08/device-performance.md rename to nuxt/content/changelog/2025/08/device-performance.md diff --git a/src/changelog/2025/08/direct-sso.md b/nuxt/content/changelog/2025/08/direct-sso.md similarity index 100% rename from src/changelog/2025/08/direct-sso.md rename to nuxt/content/changelog/2025/08/direct-sso.md diff --git a/src/changelog/2025/08/flowfuse-assistant.md b/nuxt/content/changelog/2025/08/flowfuse-assistant.md similarity index 100% rename from src/changelog/2025/08/flowfuse-assistant.md rename to nuxt/content/changelog/2025/08/flowfuse-assistant.md diff --git a/src/changelog/2025/08/flowfuse-mqtt.md b/nuxt/content/changelog/2025/08/flowfuse-mqtt.md similarity index 100% rename from src/changelog/2025/08/flowfuse-mqtt.md rename to nuxt/content/changelog/2025/08/flowfuse-mqtt.md diff --git a/src/changelog/2025/08/http-cors.md b/nuxt/content/changelog/2025/08/http-cors.md similarity index 100% rename from src/changelog/2025/08/http-cors.md rename to nuxt/content/changelog/2025/08/http-cors.md diff --git a/src/changelog/2025/08/subflow-export.md b/nuxt/content/changelog/2025/08/subflow-export.md similarity index 100% rename from src/changelog/2025/08/subflow-export.md rename to nuxt/content/changelog/2025/08/subflow-export.md diff --git a/src/changelog/2025/08/tables-assistant.md b/nuxt/content/changelog/2025/08/tables-assistant.md similarity index 100% rename from src/changelog/2025/08/tables-assistant.md rename to nuxt/content/changelog/2025/08/tables-assistant.md diff --git a/src/changelog/2025/09/expose-saml-groups-to-dashboard.md b/nuxt/content/changelog/2025/09/expose-saml-groups-to-dashboard.md similarity index 100% rename from src/changelog/2025/09/expose-saml-groups-to-dashboard.md rename to nuxt/content/changelog/2025/09/expose-saml-groups-to-dashboard.md diff --git a/src/changelog/2025/09/inline-assist.md b/nuxt/content/changelog/2025/09/inline-assist.md similarity index 100% rename from src/changelog/2025/09/inline-assist.md rename to nuxt/content/changelog/2025/09/inline-assist.md diff --git a/src/changelog/2025/09/retiring-flowforge-device-agent.md b/nuxt/content/changelog/2025/09/retiring-flowforge-device-agent.md similarity index 100% rename from src/changelog/2025/09/retiring-flowforge-device-agent.md rename to nuxt/content/changelog/2025/09/retiring-flowforge-device-agent.md diff --git a/src/changelog/2025/09/revised-instance-snapshot-ui.md b/nuxt/content/changelog/2025/09/revised-instance-snapshot-ui.md similarity index 100% rename from src/changelog/2025/09/revised-instance-snapshot-ui.md rename to nuxt/content/changelog/2025/09/revised-instance-snapshot-ui.md diff --git a/src/changelog/2025/09/team-broker-async-api.md b/nuxt/content/changelog/2025/09/team-broker-async-api.md similarity index 100% rename from src/changelog/2025/09/team-broker-async-api.md rename to nuxt/content/changelog/2025/09/team-broker-async-api.md diff --git a/src/changelog/2025/10/application-level-rbac.md b/nuxt/content/changelog/2025/10/application-level-rbac.md similarity index 100% rename from src/changelog/2025/10/application-level-rbac.md rename to nuxt/content/changelog/2025/10/application-level-rbac.md diff --git a/src/changelog/2025/10/bulk-device-group-assignment.md b/nuxt/content/changelog/2025/10/bulk-device-group-assignment.md similarity index 100% rename from src/changelog/2025/10/bulk-device-group-assignment.md rename to nuxt/content/changelog/2025/10/bulk-device-group-assignment.md diff --git a/src/changelog/2025/10/duplicate-instances-across-applications.md b/nuxt/content/changelog/2025/10/duplicate-instances-across-applications.md similarity index 100% rename from src/changelog/2025/10/duplicate-instances-across-applications.md rename to nuxt/content/changelog/2025/10/duplicate-instances-across-applications.md diff --git a/src/changelog/2025/10/import-flows-on-instance-creation.md b/nuxt/content/changelog/2025/10/import-flows-on-instance-creation.md similarity index 100% rename from src/changelog/2025/10/import-flows-on-instance-creation.md rename to nuxt/content/changelog/2025/10/import-flows-on-instance-creation.md diff --git a/src/changelog/2025/10/mcp-nodes.md b/nuxt/content/changelog/2025/10/mcp-nodes.md similarity index 100% rename from src/changelog/2025/10/mcp-nodes.md rename to nuxt/content/changelog/2025/10/mcp-nodes.md diff --git a/src/changelog/2025/10/onnx-nodes.md b/nuxt/content/changelog/2025/10/onnx-nodes.md similarity index 100% rename from src/changelog/2025/10/onnx-nodes.md rename to nuxt/content/changelog/2025/10/onnx-nodes.md diff --git a/src/changelog/2025/10/settings-page-device-group-management.md b/nuxt/content/changelog/2025/10/settings-page-device-group-management.md similarity index 100% rename from src/changelog/2025/10/settings-page-device-group-management.md rename to nuxt/content/changelog/2025/10/settings-page-device-group-management.md diff --git a/src/changelog/2025/11/ff-expert-update.md b/nuxt/content/changelog/2025/11/ff-expert-update.md similarity index 100% rename from src/changelog/2025/11/ff-expert-update.md rename to nuxt/content/changelog/2025/11/ff-expert-update.md diff --git a/src/changelog/2025/11/minimum-nodejs-version.md b/nuxt/content/changelog/2025/11/minimum-nodejs-version.md similarity index 100% rename from src/changelog/2025/11/minimum-nodejs-version.md rename to nuxt/content/changelog/2025/11/minimum-nodejs-version.md diff --git a/src/changelog/2025/11/sso-session.md b/nuxt/content/changelog/2025/11/sso-session.md similarity index 100% rename from src/changelog/2025/11/sso-session.md rename to nuxt/content/changelog/2025/11/sso-session.md diff --git a/src/changelog/2025/12/ff-expert-mcp-insights.md b/nuxt/content/changelog/2025/12/ff-expert-mcp-insights.md similarity index 100% rename from src/changelog/2025/12/ff-expert-mcp-insights.md rename to nuxt/content/changelog/2025/12/ff-expert-mcp-insights.md diff --git a/src/changelog/2025/12/scheduled-maintenance.md b/nuxt/content/changelog/2025/12/scheduled-maintenance.md similarity index 100% rename from src/changelog/2025/12/scheduled-maintenance.md rename to nuxt/content/changelog/2025/12/scheduled-maintenance.md diff --git a/src/changelog/2026/01/device-agent-containers.md b/nuxt/content/changelog/2026/01/device-agent-containers.md similarity index 100% rename from src/changelog/2026/01/device-agent-containers.md rename to nuxt/content/changelog/2026/01/device-agent-containers.md diff --git a/src/changelog/2026/01/ff-expert-manage-palette.md b/nuxt/content/changelog/2026/01/ff-expert-manage-palette.md similarity index 100% rename from src/changelog/2026/01/ff-expert-manage-palette.md rename to nuxt/content/changelog/2026/01/ff-expert-manage-palette.md diff --git a/src/changelog/2026/01/ff-expert-nr-actions.md b/nuxt/content/changelog/2026/01/ff-expert-nr-actions.md similarity index 100% rename from src/changelog/2026/01/ff-expert-nr-actions.md rename to nuxt/content/changelog/2026/01/ff-expert-nr-actions.md diff --git a/src/changelog/2026/01/ff-expert-palette-queries.md b/nuxt/content/changelog/2026/01/ff-expert-palette-queries.md similarity index 100% rename from src/changelog/2026/01/ff-expert-palette-queries.md rename to nuxt/content/changelog/2026/01/ff-expert-palette-queries.md diff --git a/src/changelog/2026/01/ff-expert-select-flows.md b/nuxt/content/changelog/2026/01/ff-expert-select-flows.md similarity index 100% rename from src/changelog/2026/01/ff-expert-select-flows.md rename to nuxt/content/changelog/2026/01/ff-expert-select-flows.md diff --git a/src/changelog/2026/01/mcp-rbacs.md b/nuxt/content/changelog/2026/01/mcp-rbacs.md similarity index 100% rename from src/changelog/2026/01/mcp-rbacs.md rename to nuxt/content/changelog/2026/01/mcp-rbacs.md diff --git a/src/changelog/2026/01/mcp-security.md b/nuxt/content/changelog/2026/01/mcp-security.md similarity index 100% rename from src/changelog/2026/01/mcp-security.md rename to nuxt/content/changelog/2026/01/mcp-security.md diff --git a/src/changelog/2026/02/device-agent-nodejs-options.md b/nuxt/content/changelog/2026/02/device-agent-nodejs-options.md similarity index 100% rename from src/changelog/2026/02/device-agent-nodejs-options.md rename to nuxt/content/changelog/2026/02/device-agent-nodejs-options.md diff --git a/src/changelog/2026/02/ff-expert-debug-log-context.md b/nuxt/content/changelog/2026/02/ff-expert-debug-log-context.md similarity index 100% rename from src/changelog/2026/02/ff-expert-debug-log-context.md rename to nuxt/content/changelog/2026/02/ff-expert-debug-log-context.md diff --git a/src/changelog/2026/02/ff-expert-update-banner.md b/nuxt/content/changelog/2026/02/ff-expert-update-banner.md similarity index 100% rename from src/changelog/2026/02/ff-expert-update-banner.md rename to nuxt/content/changelog/2026/02/ff-expert-update-banner.md diff --git a/src/changelog/2026/02/ha-instance-rolling-restart.md b/nuxt/content/changelog/2026/02/ha-instance-rolling-restart.md similarity index 100% rename from src/changelog/2026/02/ha-instance-rolling-restart.md rename to nuxt/content/changelog/2026/02/ha-instance-rolling-restart.md diff --git a/src/changelog/2026/02/remote-instances-immersive-editor.md b/nuxt/content/changelog/2026/02/remote-instances-immersive-editor.md similarity index 100% rename from src/changelog/2026/02/remote-instances-immersive-editor.md rename to nuxt/content/changelog/2026/02/remote-instances-immersive-editor.md diff --git a/src/changelog/2026/02/restoring-snapshots-to-remote-instances.md b/nuxt/content/changelog/2026/02/restoring-snapshots-to-remote-instances.md similarity index 100% rename from src/changelog/2026/02/restoring-snapshots-to-remote-instances.md rename to nuxt/content/changelog/2026/02/restoring-snapshots-to-remote-instances.md diff --git a/src/changelog/2026/03/azure-dev-ops-gitops.md b/nuxt/content/changelog/2026/03/azure-dev-ops-gitops.md similarity index 100% rename from src/changelog/2026/03/azure-dev-ops-gitops.md rename to nuxt/content/changelog/2026/03/azure-dev-ops-gitops.md diff --git a/src/changelog/2026/03/developer-mode-in-immersive-editor.md b/nuxt/content/changelog/2026/03/developer-mode-in-immersive-editor.md similarity index 100% rename from src/changelog/2026/03/developer-mode-in-immersive-editor.md rename to nuxt/content/changelog/2026/03/developer-mode-in-immersive-editor.md diff --git a/src/changelog/2026/03/embedded-editor-tab-title.md b/nuxt/content/changelog/2026/03/embedded-editor-tab-title.md similarity index 100% rename from src/changelog/2026/03/embedded-editor-tab-title.md rename to nuxt/content/changelog/2026/03/embedded-editor-tab-title.md diff --git a/src/changelog/2026/03/march-scheduled-maintenance.md b/nuxt/content/changelog/2026/03/march-scheduled-maintenance.md similarity index 100% rename from src/changelog/2026/03/march-scheduled-maintenance.md rename to nuxt/content/changelog/2026/03/march-scheduled-maintenance.md diff --git a/src/changelog/2026/03/snapshot-detail-modal-immersive-editor.md b/nuxt/content/changelog/2026/03/snapshot-detail-modal-immersive-editor.md similarity index 100% rename from src/changelog/2026/03/snapshot-detail-modal-immersive-editor.md rename to nuxt/content/changelog/2026/03/snapshot-detail-modal-immersive-editor.md diff --git a/src/changelog/2026/04/expert-action-links.md b/nuxt/content/changelog/2026/04/expert-action-links.md similarity index 100% rename from src/changelog/2026/04/expert-action-links.md rename to nuxt/content/changelog/2026/04/expert-action-links.md diff --git a/src/changelog/2026/04/hosted-instance-url-env-var.md b/nuxt/content/changelog/2026/04/hosted-instance-url-env-var.md similarity index 100% rename from src/changelog/2026/04/hosted-instance-url-env-var.md rename to nuxt/content/changelog/2026/04/hosted-instance-url-env-var.md diff --git a/src/changelog/2026/04/immersive-editor-drawer.md b/nuxt/content/changelog/2026/04/immersive-editor-drawer.md similarity index 100% rename from src/changelog/2026/04/immersive-editor-drawer.md rename to nuxt/content/changelog/2026/04/immersive-editor-drawer.md diff --git a/src/changelog/2026/04/snapshot-diff-viewer.md b/nuxt/content/changelog/2026/04/snapshot-diff-viewer.md similarity index 100% rename from src/changelog/2026/04/snapshot-diff-viewer.md rename to nuxt/content/changelog/2026/04/snapshot-diff-viewer.md diff --git a/src/changelog/2026/05/ai-opt-out.md b/nuxt/content/changelog/2026/05/ai-opt-out.md similarity index 100% rename from src/changelog/2026/05/ai-opt-out.md rename to nuxt/content/changelog/2026/05/ai-opt-out.md diff --git a/src/changelog/2026/05/expert-application-building.md b/nuxt/content/changelog/2026/05/expert-application-building.md similarity index 100% rename from src/changelog/2026/05/expert-application-building.md rename to nuxt/content/changelog/2026/05/expert-application-building.md diff --git a/src/changelog/2026/05/single-sso-provider.md b/nuxt/content/changelog/2026/05/single-sso-provider.md similarity index 100% rename from src/changelog/2026/05/single-sso-provider.md rename to nuxt/content/changelog/2026/05/single-sso-provider.md diff --git a/src/changelog/2026/06/dark-mode.md b/nuxt/content/changelog/2026/06/dark-mode.md similarity index 100% rename from src/changelog/2026/06/dark-mode.md rename to nuxt/content/changelog/2026/06/dark-mode.md diff --git a/src/changelog/2026/06/device-agent-v4-released.md b/nuxt/content/changelog/2026/06/device-agent-v4-released.md similarity index 100% rename from src/changelog/2026/06/device-agent-v4-released.md rename to nuxt/content/changelog/2026/06/device-agent-v4-released.md diff --git a/src/changelog/2026/06/generic-git-server-support.md b/nuxt/content/changelog/2026/06/generic-git-server-support.md similarity index 100% rename from src/changelog/2026/06/generic-git-server-support.md rename to nuxt/content/changelog/2026/06/generic-git-server-support.md diff --git a/src/changelog/2026/06/july-scheduled-maintenance.md b/nuxt/content/changelog/2026/06/july-scheduled-maintenance.md similarity index 100% rename from src/changelog/2026/06/july-scheduled-maintenance.md rename to nuxt/content/changelog/2026/06/july-scheduled-maintenance.md diff --git a/src/changelog/2026/07/application-sso-groups.md b/nuxt/content/changelog/2026/07/application-sso-groups.md similarity index 100% rename from src/changelog/2026/07/application-sso-groups.md rename to nuxt/content/changelog/2026/07/application-sso-groups.md diff --git a/src/changelog/2026/07/device-agent-onboarding.md b/nuxt/content/changelog/2026/07/device-agent-onboarding.md similarity index 100% rename from src/changelog/2026/07/device-agent-onboarding.md rename to nuxt/content/changelog/2026/07/device-agent-onboarding.md diff --git a/src/changelog/2026/07/expert-enhancements.md b/nuxt/content/changelog/2026/07/expert-enhancements.md similarity index 100% rename from src/changelog/2026/07/expert-enhancements.md rename to nuxt/content/changelog/2026/07/expert-enhancements.md diff --git a/src/changelog/2026/07/expert-tables-automation.md b/nuxt/content/changelog/2026/07/expert-tables-automation.md similarity index 100% rename from src/changelog/2026/07/expert-tables-automation.md rename to nuxt/content/changelog/2026/07/expert-tables-automation.md diff --git a/src/changelog/2026/07/scoped-pats.md b/nuxt/content/changelog/2026/07/scoped-pats.md similarity index 100% rename from src/changelog/2026/07/scoped-pats.md rename to nuxt/content/changelog/2026/07/scoped-pats.md diff --git a/src/changelog/2026/07/team-and-application-dashboards.md b/nuxt/content/changelog/2026/07/team-and-application-dashboards.md similarity index 100% rename from src/changelog/2026/07/team-and-application-dashboards.md rename to nuxt/content/changelog/2026/07/team-and-application-dashboards.md diff --git a/src/changelog/2026/08/connect-your-own-ai-agent.md b/nuxt/content/changelog/2026/08/connect-your-own-ai-agent.md similarity index 100% rename from src/changelog/2026/08/connect-your-own-ai-agent.md rename to nuxt/content/changelog/2026/08/connect-your-own-ai-agent.md diff --git a/src/changelog/2026/08/dashboard-theme-presets.md b/nuxt/content/changelog/2026/08/dashboard-theme-presets.md similarity index 100% rename from src/changelog/2026/08/dashboard-theme-presets.md rename to nuxt/content/changelog/2026/08/dashboard-theme-presets.md diff --git a/src/changelog/2026/08/expert-model-upgrade.md b/nuxt/content/changelog/2026/08/expert-model-upgrade.md similarity index 100% rename from src/changelog/2026/08/expert-model-upgrade.md rename to nuxt/content/changelog/2026/08/expert-model-upgrade.md diff --git a/src/changelog/2026/08/table-date-time-columns.md b/nuxt/content/changelog/2026/08/table-date-time-columns.md similarity index 100% rename from src/changelog/2026/08/table-date-time-columns.md rename to nuxt/content/changelog/2026/08/table-date-time-columns.md diff --git a/src/changelog/2026/09/agent-auto-install-nodes.md b/nuxt/content/changelog/2026/09/agent-auto-install-nodes.md similarity index 100% rename from src/changelog/2026/09/agent-auto-install-nodes.md rename to nuxt/content/changelog/2026/09/agent-auto-install-nodes.md diff --git a/src/changelog/2026/09/auto-deploy-tool.md b/nuxt/content/changelog/2026/09/auto-deploy-tool.md similarity index 100% rename from src/changelog/2026/09/auto-deploy-tool.md rename to nuxt/content/changelog/2026/09/auto-deploy-tool.md diff --git a/src/changelog/2026/09/client-presence-events.md b/nuxt/content/changelog/2026/09/client-presence-events.md similarity index 100% rename from src/changelog/2026/09/client-presence-events.md rename to nuxt/content/changelog/2026/09/client-presence-events.md diff --git a/src/changelog/2026/09/dashboard-reconnection.md b/nuxt/content/changelog/2026/09/dashboard-reconnection.md similarity index 100% rename from src/changelog/2026/09/dashboard-reconnection.md rename to nuxt/content/changelog/2026/09/dashboard-reconnection.md diff --git a/src/customer-stories/aperia-technologies-plc-replacement.md b/nuxt/content/customer-stories/aperia-technologies-plc-replacement.md similarity index 100% rename from src/customer-stories/aperia-technologies-plc-replacement.md rename to nuxt/content/customer-stories/aperia-technologies-plc-replacement.md diff --git a/src/customer-stories/energinet-streamlining-critical-infrastructure-data-management.md b/nuxt/content/customer-stories/energinet-streamlining-critical-infrastructure-data-management.md similarity index 100% rename from src/customer-stories/energinet-streamlining-critical-infrastructure-data-management.md rename to nuxt/content/customer-stories/energinet-streamlining-critical-infrastructure-data-management.md diff --git a/src/customer-stories/leveraging-node-red-and-flowfuse-to-automate-precision-manufacturing.md b/nuxt/content/customer-stories/leveraging-node-red-and-flowfuse-to-automate-precision-manufacturing.md similarity index 100% rename from src/customer-stories/leveraging-node-red-and-flowfuse-to-automate-precision-manufacturing.md rename to nuxt/content/customer-stories/leveraging-node-red-and-flowfuse-to-automate-precision-manufacturing.md diff --git a/src/customer-stories/leveraging-node-red-and-flowfuse-to-revolutionize-irrigation.md b/nuxt/content/customer-stories/leveraging-node-red-and-flowfuse-to-revolutionize-irrigation.md similarity index 100% rename from src/customer-stories/leveraging-node-red-and-flowfuse-to-revolutionize-irrigation.md rename to nuxt/content/customer-stories/leveraging-node-red-and-flowfuse-to-revolutionize-irrigation.md diff --git a/src/customer-stories/manufacturing-digital-transformation.md b/nuxt/content/customer-stories/manufacturing-digital-transformation.md similarity index 100% rename from src/customer-stories/manufacturing-digital-transformation.md rename to nuxt/content/customer-stories/manufacturing-digital-transformation.md diff --git a/src/customer-stories/node-red-building-management.md b/nuxt/content/customer-stories/node-red-building-management.md similarity index 100% rename from src/customer-stories/node-red-building-management.md rename to nuxt/content/customer-stories/node-red-building-management.md diff --git a/src/customer-stories/opto22-embraces-node-red.md b/nuxt/content/customer-stories/opto22-embraces-node-red.md similarity index 100% rename from src/customer-stories/opto22-embraces-node-red.md rename to nuxt/content/customer-stories/opto22-embraces-node-red.md diff --git a/src/customer-stories/reducing-costs-and-boosting-sales-performance-through-automated-digital-twin-demonstrations.md b/nuxt/content/customer-stories/reducing-costs-and-boosting-sales-performance-through-automated-digital-twin-demonstrations.md similarity index 100% rename from src/customer-stories/reducing-costs-and-boosting-sales-performance-through-automated-digital-twin-demonstrations.md rename to nuxt/content/customer-stories/reducing-costs-and-boosting-sales-performance-through-automated-digital-twin-demonstrations.md diff --git a/src/customer-stories/scaling-industrial-iot-operations-while-maintaining-competitive-edge.md b/nuxt/content/customer-stories/scaling-industrial-iot-operations-while-maintaining-competitive-edge.md similarity index 100% rename from src/customer-stories/scaling-industrial-iot-operations-while-maintaining-competitive-edge.md rename to nuxt/content/customer-stories/scaling-industrial-iot-operations-while-maintaining-competitive-edge.md diff --git a/src/customer-stories/scaling-manufacturing-automation-with-flowfuse.md b/nuxt/content/customer-stories/scaling-manufacturing-automation-with-flowfuse.md similarity index 100% rename from src/customer-stories/scaling-manufacturing-automation-with-flowfuse.md rename to nuxt/content/customer-stories/scaling-manufacturing-automation-with-flowfuse.md diff --git a/src/customer-stories/stfi-future-of-textile-powered-by-node-red.md b/nuxt/content/customer-stories/stfi-future-of-textile-powered-by-node-red.md similarity index 100% rename from src/customer-stories/stfi-future-of-textile-powered-by-node-red.md rename to nuxt/content/customer-stories/stfi-future-of-textile-powered-by-node-red.md diff --git a/src/customer-stories/un-wmo-nr-data-sharing.md b/nuxt/content/customer-stories/un-wmo-nr-data-sharing.md similarity index 100% rename from src/customer-stories/un-wmo-nr-data-sharing.md rename to nuxt/content/customer-stories/un-wmo-nr-data-sharing.md diff --git a/nuxt/content/handbook/company/organizational-structure.md b/nuxt/content/handbook/company/organizational-structure.md index 9102a4ab26..f88537e529 100644 --- a/nuxt/content/handbook/company/organizational-structure.md +++ b/nuxt/content/handbook/company/organizational-structure.md @@ -13,7 +13,7 @@ This page provides an overview of FlowFuse's organizational structure and report ## Reporting Structure -The organizational structure is automatically generated from team member data files located in `src/_data/team/`. Each team member's JSON file includes a `reports_to` field that indicates their direct manager. +The organizational structure is automatically generated from team member data files located in `nuxt/data/team/`. Each team member's JSON file includes a `reports_to` field that indicates their direct manager. ### Executive Leadership diff --git a/nuxt/content/handbook/engineering/releases/release-blogs.md b/nuxt/content/handbook/engineering/releases/release-blogs.md index e549906542..df09875407 100644 --- a/nuxt/content/handbook/engineering/releases/release-blogs.md +++ b/nuxt/content/handbook/engineering/releases/release-blogs.md @@ -16,10 +16,10 @@ The release wrangler owns the first draft. Engineers who shipped features in the ## Creating the file -Posts live in the [website repository](https://github.com/FlowFuse/website/tree/main/src/blog). Navigate to the correct year and month folder and create a new `.md` file. +Posts live in the [website repository](https://github.com/FlowFuse/website/tree/main/nuxt/content/blog). Navigate to the correct year and month folder and create a new `.md` file. ``` -src/blog/YYYY/MM/flowfuse-release-X-YY.md +nuxt/content/blog/YYYY/MM/flowfuse-release-X-YY.md ``` If the folder for that month does not yet exist, create it. @@ -34,7 +34,7 @@ Every post requires the following fields: | `subtitle` | One sentence expanding on the title. Names the next tier of features if the title does not cover them. | | `description` | One sentence for link previews and search results. Should make sense without surrounding context. | | `date` | Release date in `YYYY-MM-DD` format. | -| `authors` | Your handle from `src/_data/team`. | +| `authors` | Your handle from `nuxt/data/team`. | | `image` | Path to the hero image. Coordinate with design. | | `tags` | Always include `flowfuse`, `news`, and `releases`. | | `release` | The release number as a string, e.g. `"2.29"`. | diff --git a/nuxt/content/handbook/engineering/releases/writing-changelog.md b/nuxt/content/handbook/engineering/releases/writing-changelog.md index c2d37cbafb..b7e8642475 100644 --- a/nuxt/content/handbook/engineering/releases/writing-changelog.md +++ b/nuxt/content/handbook/engineering/releases/writing-changelog.md @@ -29,10 +29,10 @@ This ensures the team plans changelog work alongside delivery, rather than remem ## Creating the file -Posts live in the [website repository](https://github.com/FlowFuse/website/tree/main/src/changelog). Navigate to the correct year and month folder for when the feature shipped, and create a new `.md` file. If the folder for that month does not exist yet, create it. +Posts live in the [website repository](https://github.com/FlowFuse/website/tree/main/nuxt/content/changelog). Navigate to the correct year and month folder for when the feature shipped, and create a new `.md` file. If the folder for that month does not exist yet, create it. ``` -src/changelog/YYYY/MM/your-post-slug.md +nuxt/content/changelog/YYYY/MM/your-post-slug.md ``` The slug should be short, lowercase, and hyphen-separated, describing the feature you are announcing. @@ -47,7 +47,7 @@ Every post requires the following fields at the top of the file: | `description` | One sentence summarising the change. This appears in link previews and search results, so it should make sense without any surrounding context. | | `date` | The date and time the feature shipped, in `YYYY-MM-DD HH:mm:ss` format (e.g., `2026-03-24 17:00:00`). Zero-pad the month and day. The timestamp ensures correct sorting when you add multiple features on the same day. | | `release` | The release this ships in for Self Hosted users, quoted, as `MAJOR.MINOR` (e.g. `"2.33"`). This is the same version you name in the availability note, and the changelog page groups entries by it. Your change is live on FlowFuse Cloud already, so this is the next release that has not shipped yet: take the version from the current [milestone](https://github.com/FlowFuse/flowfuse/milestones). Quote it, or `2.30` is read as the number `2.3`. | -| `authors` | Your handle from `src/_data/team`. Leave it out if there is no single clear author. | +| `authors` | Your handle from `nuxt/data/team`. Leave it out if there is no single clear author. | | `tags` | Always include `changelog`. | | `issues` | A list of related GitHub issue URLs. Link any issues that tracked the work this post announces. | @@ -116,7 +116,7 @@ That said, every post should answer four questions: ### Screenshots -Include a screenshot for any visual change. Reference images from `src/img/` like this: +Include a screenshot for any visual change. Put it in `nuxt/public/changelog/YYYY/MM/images/`, the same year and month as the post, and reference it like this: ```markdown ![Alt text](./images/image.png) diff --git a/nuxt/content/handbook/marketing/content-strategy/blog.md b/nuxt/content/handbook/marketing/content-strategy/blog.md index c6064bbacb..0db238395e 100644 --- a/nuxt/content/handbook/marketing/content-strategy/blog.md +++ b/nuxt/content/handbook/marketing/content-strategy/blog.md @@ -158,9 +158,9 @@ The author can be seen on both the blog index and the articles. If you need to a authors: ["rob-marcer", "joe-pavitt"] ``` -If the authors are FlowFuse team members, the names need to be formatted inline with the file names found [here](https://github.com/FlowFuse/website/tree/main/src/_data/team) +If the authors are FlowFuse team members, the names need to be formatted inline with the file names found [here](https://github.com/FlowFuse/website/tree/main/nuxt/data/team) -If they're not FlowFuse team members, they need to be added to the [guests list](https://github.com/FlowFuse/website/tree/main/src/_data/guests). Duplicate any of the files already in that folder, proceed to change the name of the file and update the info inside the `json` file. You'll also need to add a headshot in the images/team [folder](https://github.com/FlowFuse/website/tree/main/src/images/team) following the same name convention as the rest of the files. +If they're not FlowFuse team members, they need to be added to the [guests list](https://github.com/FlowFuse/website/tree/main/nuxt/data/guests). Duplicate any of the files already in that folder, proceed to change the name of the file and update the info inside the `json` file. You'll also need to add a headshot in the images/team [folder](https://github.com/FlowFuse/website/tree/main/nuxt/public/images/team) following the same name convention as the rest of the files. ### Video @@ -313,7 +313,7 @@ Tracking is automatic and fires the same `blog-cta` event as the end-of-article #### Shared CTA image library -CTA images are shared across articles, so they go in `src/images/cta/` — not in an article's own images folder. Reference them as `/images/cta/<name>.png`. Put any new CTA image there too, and add it to this table: +CTA images are shared across articles, so they go in `nuxt/public/images/cta/` — not in an article's own images folder. Reference them as `/images/cta/<name>.png`. Put any new CTA image there too, and add it to this table: | Image | Use it on | |-------|-----------| @@ -350,7 +350,7 @@ Additionally, the tags you assign to your content will be output as [meta keywor ### Adding Images -Images can be added into the respective `/blog/<year>/<month>/images` folder. +Images go in `nuxt/public/blog/<year>/<month>/images/`, the same year and month as the post. The image can then be referenced in the markdown file like so: diff --git a/nuxt/content/handbook/marketing/content-strategy/webinars.md b/nuxt/content/handbook/marketing/content-strategy/webinars.md index 0bea5bfa92..0b159d19ea 100644 --- a/nuxt/content/handbook/marketing/content-strategy/webinars.md +++ b/nuxt/content/handbook/marketing/content-strategy/webinars.md @@ -129,7 +129,7 @@ Every webinar should be treated as a **content flywheel**, not a one-off event ## Creating a Webinar Page -Webinar pages follow a fixed structure, you can see plenty of examples [here](https://github.com/FlowFuse/website/tree/main/src/webinars) in our website repository. Importantly, they must define the following properties at the top of the `.md` file: +Webinar pages follow a fixed structure, you can see plenty of examples [here](https://github.com/FlowFuse/website/tree/main/nuxt/content/webinars) in our website repository. Importantly, they must define the following properties at the top of the `.md` file: ### Properties @@ -142,7 +142,7 @@ Webinar pages follow a fixed structure, you can see plenty of examples [here](ht | `date` | The date that the webinar will take place | `time` | The time that the webinar will take place, in both GMT & ET | `duration` | How long, in minutes with the webinar last for -| `hosts` | A list of the webinar hosts, the names need to be formatted inline with the file names found [here](https://github.com/FlowFuse/website/tree/main/src/_data/team). If they're not part of the FlowFuse team, then you can find a list of guests in [here](https://github.com/FlowFuse/website/tree/main/src/_data/guests), feel free to add any guest you need and remember to add the headshot image in the images/team [folder](https://github.com/FlowFuse/website/tree/main/src/images/team) following the same name convention as the rest of the files. +| `hosts` | A list of the webinar hosts, the names need to be formatted inline with the file names found [here](https://github.com/FlowFuse/website/tree/main/nuxt/data/team). If they're not part of the FlowFuse team, then you can find a list of guests in [here](https://github.com/FlowFuse/website/tree/main/nuxt/data/guests), feel free to add any guest you need and remember to add the headshot image in the images/team [folder](https://github.com/FlowFuse/website/tree/main/nuxt/public/images/team) following the same name convention as the rest of the files. | `hubspot.formId` | The formId from HubSpot to handle the event registration ### Example diff --git a/nuxt/content/handbook/marketing/website.md b/nuxt/content/handbook/marketing/website.md index 46177bda39..f7e3b28c78 100644 --- a/nuxt/content/handbook/marketing/website.md +++ b/nuxt/content/handbook/marketing/website.md @@ -16,7 +16,7 @@ sitemap: The event banner at the top of the website can display more than one event or announcement. -To add or update an event, you'll need to modify the [following file](https://github.com/FlowFuse/website/blob/main/src/_data/events.yaml). The information should be formatted as follows for each banner: +To add or update an event, you'll need to modify the [following file](https://github.com/FlowFuse/website/blob/main/nuxt/data/events.yaml). The information should be formatted as follows for each banner: ```text - type: "Webinar" @@ -101,32 +101,7 @@ For short, silent, looping animations that would otherwise be a GIF, check a `.w Meta keywords are a type of HTML metadata that describe the topics covered by a page. **Major search engines (Google, Bing) have not used meta keywords as a ranking signal since 2009** — setting them has no effect on search visibility or rankings. -They are still output in the HTML on 11ty-served pages and may be used by site-search tools (such as Algolia) or other non-Google indexers, but they should not be treated as an SEO lever. - -### Default Keywords - -By default, each 11ty-served webpage on the FlowFuse website includes a set of predefined keywords: :site-value{path="messaging.keywords"}. These default keywords are relevant to the overall theme of the website. - -### Priority of Keywords - -On 11ty-served pages, meta keywords are populated in this priority order: - -1. **Meta Keywords:** Keywords specified in the front matter under `meta.keywords`. -2. **Keywords:** If no `meta.keywords` are found, the `keywords` front matter field is used. -3. [**Tags:**](/handbook/marketing/content-strategy/blog/#tags) If neither field is set, the page's tags are used. -4. **Default Keywords:** Always appended as a fallback. - -### Adding Meta Keywords - -To specify meta keywords for a page, include them in the front matter: - -```yaml ---- -title: Example Page -meta: - keywords: flowfuse, flows, manufacturing ---- -``` +A few pages still set them, in the page's own `.vue` file (`keywords` in its `useSeoMeta` call), and they may be used by site-search tools (such as Algolia) or other non-Google indexers, but they should not be treated as an SEO lever. A `keywords` or `meta.keywords` field in a markdown page's front matter is not read. ## Call-to-Action Buttons @@ -144,7 +119,7 @@ Contact Us vs. Book a Demo: these two CTAs carry different intent signals and sh If a page needs different wording than what's listed above, that's a sign the destination needs a sixth CTA, not a new prop on these five or custom inline code. -**These components only exist on Nuxt-rendered pages** (`nuxt/pages/`, `nuxt/content/`), part of the site is still served by Eleventy and doesn't have access to them yet. On an Eleventy page, a CTA is still a hand-written `<a class="ff-btn ...">` link. +They are available on every page: in `.vue` pages under `nuxt/pages/`, and in markdown under `nuxt/content/`. ### Choosing a style @@ -275,17 +250,9 @@ In many cases, this helps keep changes focused and iterations small when the pag For design-related considerations, see the [Design Review process](/handbook/design/process/#design-review). -## New Pages Must Be Built in Nuxt - -The site is migrating from Eleventy (11ty) to Nuxt, section by section, as 11ty is phased out. Any brand-new page (a landing page, a campaign page, etc.) needs to be built in Nuxt, never as a new page in the old 11ty system, even if it looks like the fastest way to copy an existing 11ty page's pattern. - -A test in the site's automated test suite catches this automatically: a pull request that adds any brand-new `.njk` file (the file type 11ty page templates are built with) fails the PR's required checks until it's moved to Nuxt. Editing an existing `.njk` page is unaffected; this only catches genuinely new pages. - -This only looks at `.njk` files, so it never affects the markdown and images you add day to day. New blog posts, webinars, blueprints, changelog entries, and customer stories are all `.md` files (plus their images), not `.njk`. Keep publishing those as normal. - -That also means a brand-new page built as a `.md` file reusing an existing 11ty layout (rather than a new `.njk`) will not fail this check. The rule above still applies to it: build it in Nuxt. The test is a safety net for the most common case, not a substitute for following the rule. +## Where Files Go -If a page truly needs to ship on 11ty before its Nuxt equivalent exists, a member of the GitHub "admin" team can merge anyway via "Merge without waiting for requirements to be met". +The whole site is built with Nuxt. Markdown content lives in `nuxt/content/` (blog posts in `nuxt/content/blog/`, changelog entries in `nuxt/content/changelog/`), and everything served as a file, images included, lives in `nuxt/public/` at the path it is served from. The old `src/` folder is gone: a file added there is never published, and the site's automated tests fail a pull request that adds one. ## Pull Request Scope diff --git a/src/webinars/2023/blueprints.md b/nuxt/content/webinars/2023/blueprints.md similarity index 100% rename from src/webinars/2023/blueprints.md rename to nuxt/content/webinars/2023/blueprints.md diff --git a/src/webinars/2023/building-scalable-ha-node-red.md b/nuxt/content/webinars/2023/building-scalable-ha-node-red.md similarity index 100% rename from src/webinars/2023/building-scalable-ha-node-red.md rename to nuxt/content/webinars/2023/building-scalable-ha-node-red.md diff --git a/src/webinars/2023/dashboard-20.md b/nuxt/content/webinars/2023/dashboard-20.md similarity index 100% rename from src/webinars/2023/dashboard-20.md rename to nuxt/content/webinars/2023/dashboard-20.md diff --git a/src/webinars/2023/flowforge-device-management.md b/nuxt/content/webinars/2023/flowforge-device-management.md similarity index 100% rename from src/webinars/2023/flowforge-device-management.md rename to nuxt/content/webinars/2023/flowforge-device-management.md diff --git a/src/webinars/2023/getting-started-nodered-dashboard.md b/nuxt/content/webinars/2023/getting-started-nodered-dashboard.md similarity index 100% rename from src/webinars/2023/getting-started-nodered-dashboard.md rename to nuxt/content/webinars/2023/getting-started-nodered-dashboard.md diff --git a/src/webinars/2023/getting-started-nodered.md b/nuxt/content/webinars/2023/getting-started-nodered.md similarity index 100% rename from src/webinars/2023/getting-started-nodered.md rename to nuxt/content/webinars/2023/getting-started-nodered.md diff --git a/src/webinars/2023/getting-started-opcua-node-red.md b/nuxt/content/webinars/2023/getting-started-opcua-node-red.md similarity index 100% rename from src/webinars/2023/getting-started-opcua-node-red.md rename to nuxt/content/webinars/2023/getting-started-opcua-node-red.md diff --git a/src/webinars/2023/industrial-data-node-red.md b/nuxt/content/webinars/2023/industrial-data-node-red.md similarity index 100% rename from src/webinars/2023/industrial-data-node-red.md rename to nuxt/content/webinars/2023/industrial-data-node-red.md diff --git a/src/webinars/2023/introduction-to-flowforge.md b/nuxt/content/webinars/2023/introduction-to-flowforge.md similarity index 100% rename from src/webinars/2023/introduction-to-flowforge.md rename to nuxt/content/webinars/2023/introduction-to-flowforge.md diff --git a/src/webinars/2023/node-red-10-years.md b/nuxt/content/webinars/2023/node-red-10-years.md similarity index 100% rename from src/webinars/2023/node-red-10-years.md rename to nuxt/content/webinars/2023/node-red-10-years.md diff --git a/src/webinars/2023/sync-music-to-fireworks.md b/nuxt/content/webinars/2023/sync-music-to-fireworks.md similarity index 100% rename from src/webinars/2023/sync-music-to-fireworks.md rename to nuxt/content/webinars/2023/sync-music-to-fireworks.md diff --git a/src/webinars/2024/balena.md b/nuxt/content/webinars/2024/balena.md similarity index 100% rename from src/webinars/2024/balena.md rename to nuxt/content/webinars/2024/balena.md diff --git a/src/webinars/2024/bringing-ai-to-nodered.md b/nuxt/content/webinars/2024/bringing-ai-to-nodered.md similarity index 100% rename from src/webinars/2024/bringing-ai-to-nodered.md rename to nuxt/content/webinars/2024/bringing-ai-to-nodered.md diff --git a/src/webinars/2024/bringing-node-red-to-industrial-solutions-with-wago.md b/nuxt/content/webinars/2024/bringing-node-red-to-industrial-solutions-with-wago.md similarity index 100% rename from src/webinars/2024/bringing-node-red-to-industrial-solutions-with-wago.md rename to nuxt/content/webinars/2024/bringing-node-red-to-industrial-solutions-with-wago.md diff --git a/src/webinars/2024/building-a-foundation-for-enterprise-agility-and-process-optimization.md b/nuxt/content/webinars/2024/building-a-foundation-for-enterprise-agility-and-process-optimization.md similarity index 100% rename from src/webinars/2024/building-a-foundation-for-enterprise-agility-and-process-optimization.md rename to nuxt/content/webinars/2024/building-a-foundation-for-enterprise-agility-and-process-optimization.md diff --git a/src/webinars/2024/building-unified-namespace-using-nodered-mqtt.md b/nuxt/content/webinars/2024/building-unified-namespace-using-nodered-mqtt.md similarity index 100% rename from src/webinars/2024/building-unified-namespace-using-nodered-mqtt.md rename to nuxt/content/webinars/2024/building-unified-namespace-using-nodered-mqtt.md diff --git a/src/webinars/2024/deploy-flowfuse-on-industrial-iot-with-ncd-io.md b/nuxt/content/webinars/2024/deploy-flowfuse-on-industrial-iot-with-ncd-io.md similarity index 100% rename from src/webinars/2024/deploy-flowfuse-on-industrial-iot-with-ncd-io.md rename to nuxt/content/webinars/2024/deploy-flowfuse-on-industrial-iot-with-ncd-io.md diff --git a/src/webinars/2024/elevating-nodered-a-flowfuse-platform-update.md b/nuxt/content/webinars/2024/elevating-nodered-a-flowfuse-platform-update.md similarity index 100% rename from src/webinars/2024/elevating-nodered-a-flowfuse-platform-update.md rename to nuxt/content/webinars/2024/elevating-nodered-a-flowfuse-platform-update.md diff --git a/src/webinars/2024/flowfuse-mqtt-broker-for-industrial-transformation.md b/nuxt/content/webinars/2024/flowfuse-mqtt-broker-for-industrial-transformation.md similarity index 100% rename from src/webinars/2024/flowfuse-mqtt-broker-for-industrial-transformation.md rename to nuxt/content/webinars/2024/flowfuse-mqtt-broker-for-industrial-transformation.md diff --git a/src/webinars/2024/managing-distributed-node-red-deployments.md b/nuxt/content/webinars/2024/managing-distributed-node-red-deployments.md similarity index 100% rename from src/webinars/2024/managing-distributed-node-red-deployments.md rename to nuxt/content/webinars/2024/managing-distributed-node-red-deployments.md diff --git a/src/webinars/2024/node-red-dashboard-multi-user.md b/nuxt/content/webinars/2024/node-red-dashboard-multi-user.md similarity index 100% rename from src/webinars/2024/node-red-dashboard-multi-user.md rename to nuxt/content/webinars/2024/node-red-dashboard-multi-user.md diff --git a/src/webinars/2024/operationalizing-node-red-for-the-enterprise.md b/nuxt/content/webinars/2024/operationalizing-node-red-for-the-enterprise.md similarity index 100% rename from src/webinars/2024/operationalizing-node-red-for-the-enterprise.md rename to nuxt/content/webinars/2024/operationalizing-node-red-for-the-enterprise.md diff --git a/src/webinars/2024/workshop-dashboard.md b/nuxt/content/webinars/2024/workshop-dashboard.md similarity index 100% rename from src/webinars/2024/workshop-dashboard.md rename to nuxt/content/webinars/2024/workshop-dashboard.md diff --git a/src/webinars/2025/be-an-industry-4-0-hero-from-shop-floor-data-to-real-time-dashboards.md b/nuxt/content/webinars/2025/be-an-industry-4-0-hero-from-shop-floor-data-to-real-time-dashboards.md similarity index 100% rename from src/webinars/2025/be-an-industry-4-0-hero-from-shop-floor-data-to-real-time-dashboards.md rename to nuxt/content/webinars/2025/be-an-industry-4-0-hero-from-shop-floor-data-to-real-time-dashboards.md diff --git a/src/webinars/2025/blueprints-build-faster-with-node-red-on-flowfuse.md b/nuxt/content/webinars/2025/blueprints-build-faster-with-node-red-on-flowfuse.md similarity index 100% rename from src/webinars/2025/blueprints-build-faster-with-node-red-on-flowfuse.md rename to nuxt/content/webinars/2025/blueprints-build-faster-with-node-red-on-flowfuse.md diff --git a/src/webinars/2025/develop-manage-and-deploy-complex-node-red-projects-at-scale-with-flowfuse.md b/nuxt/content/webinars/2025/develop-manage-and-deploy-complex-node-red-projects-at-scale-with-flowfuse.md similarity index 100% rename from src/webinars/2025/develop-manage-and-deploy-complex-node-red-projects-at-scale-with-flowfuse.md rename to nuxt/content/webinars/2025/develop-manage-and-deploy-complex-node-red-projects-at-scale-with-flowfuse.md diff --git a/src/webinars/2025/flowfuse-and-hivemq-powering-the-core-components-of-a-unified-namespace.md b/nuxt/content/webinars/2025/flowfuse-and-hivemq-powering-the-core-components-of-a-unified-namespace.md similarity index 100% rename from src/webinars/2025/flowfuse-and-hivemq-powering-the-core-components-of-a-unified-namespace.md rename to nuxt/content/webinars/2025/flowfuse-and-hivemq-powering-the-core-components-of-a-unified-namespace.md diff --git a/src/webinars/2025/from-node-red-to-flowfuse-it-ot-integration-and-automation-in-container-terminals.md b/nuxt/content/webinars/2025/from-node-red-to-flowfuse-it-ot-integration-and-automation-in-container-terminals.md similarity index 100% rename from src/webinars/2025/from-node-red-to-flowfuse-it-ot-integration-and-automation-in-container-terminals.md rename to nuxt/content/webinars/2025/from-node-red-to-flowfuse-it-ot-integration-and-automation-in-container-terminals.md diff --git a/src/webinars/2025/how-flowfuse-enables-a-future-proof-uns-it-ot-architecture.md b/nuxt/content/webinars/2025/how-flowfuse-enables-a-future-proof-uns-it-ot-architecture.md similarity index 100% rename from src/webinars/2025/how-flowfuse-enables-a-future-proof-uns-it-ot-architecture.md rename to nuxt/content/webinars/2025/how-flowfuse-enables-a-future-proof-uns-it-ot-architecture.md diff --git a/src/webinars/2025/live-from-the-shop-floor-scaling-from-digital-to-smart-with-flowfuse-and-revolution-pi.md b/nuxt/content/webinars/2025/live-from-the-shop-floor-scaling-from-digital-to-smart-with-flowfuse-and-revolution-pi.md similarity index 100% rename from src/webinars/2025/live-from-the-shop-floor-scaling-from-digital-to-smart-with-flowfuse-and-revolution-pi.md rename to nuxt/content/webinars/2025/live-from-the-shop-floor-scaling-from-digital-to-smart-with-flowfuse-and-revolution-pi.md diff --git a/src/webinars/2025/node-red-why-and-when-for-cloud-and-edge.md b/nuxt/content/webinars/2025/node-red-why-and-when-for-cloud-and-edge.md similarity index 100% rename from src/webinars/2025/node-red-why-and-when-for-cloud-and-edge.md rename to nuxt/content/webinars/2025/node-red-why-and-when-for-cloud-and-edge.md diff --git a/src/webinars/2025/simplifying-opc-ua/index.md b/nuxt/content/webinars/2025/simplifying-opc-ua/index.md similarity index 100% rename from src/webinars/2025/simplifying-opc-ua/index.md rename to nuxt/content/webinars/2025/simplifying-opc-ua/index.md diff --git a/src/webinars/2025/skys-journey-to-faster-data-delivery-with-flowfuse.md b/nuxt/content/webinars/2025/skys-journey-to-faster-data-delivery-with-flowfuse.md similarity index 100% rename from src/webinars/2025/skys-journey-to-faster-data-delivery-with-flowfuse.md rename to nuxt/content/webinars/2025/skys-journey-to-faster-data-delivery-with-flowfuse.md diff --git a/src/webinars/2025/the-power-of-integration-flowfuse-platform-update.md b/nuxt/content/webinars/2025/the-power-of-integration-flowfuse-platform-update.md similarity index 100% rename from src/webinars/2025/the-power-of-integration-flowfuse-platform-update.md rename to nuxt/content/webinars/2025/the-power-of-integration-flowfuse-platform-update.md diff --git a/src/webinars/2025/the-ptc-tpg-deal.md b/nuxt/content/webinars/2025/the-ptc-tpg-deal.md similarity index 100% rename from src/webinars/2025/the-ptc-tpg-deal.md rename to nuxt/content/webinars/2025/the-ptc-tpg-deal.md diff --git a/src/webinars/2026/ai-on-the-factory-floor.md b/nuxt/content/webinars/2026/ai-on-the-factory-floor.md similarity index 100% rename from src/webinars/2026/ai-on-the-factory-floor.md rename to nuxt/content/webinars/2026/ai-on-the-factory-floor.md diff --git a/src/webinars/2026/industrial-iot-solutions.md b/nuxt/content/webinars/2026/industrial-iot-solutions.md similarity index 100% rename from src/webinars/2026/industrial-iot-solutions.md rename to nuxt/content/webinars/2026/industrial-iot-solutions.md diff --git a/src/webinars/2026/integrating-external-ai-agents-in-industrial-workflows.md b/nuxt/content/webinars/2026/integrating-external-ai-agents-in-industrial-workflows.md similarity index 100% rename from src/webinars/2026/integrating-external-ai-agents-in-industrial-workflows.md rename to nuxt/content/webinars/2026/integrating-external-ai-agents-in-industrial-workflows.md diff --git a/src/webinars/2026/making-industry-work-leveraging-opc-ua-at-scale.md b/nuxt/content/webinars/2026/making-industry-work-leveraging-opc-ua-at-scale.md similarity index 100% rename from src/webinars/2026/making-industry-work-leveraging-opc-ua-at-scale.md rename to nuxt/content/webinars/2026/making-industry-work-leveraging-opc-ua-at-scale.md diff --git a/src/webinars/2026/modbus-communications-modernization.md b/nuxt/content/webinars/2026/modbus-communications-modernization.md similarity index 100% rename from src/webinars/2026/modbus-communications-modernization.md rename to nuxt/content/webinars/2026/modbus-communications-modernization.md diff --git a/src/webinars/2026/mqtt-vs-opc-ua-industrial-data-showdown.md b/nuxt/content/webinars/2026/mqtt-vs-opc-ua-industrial-data-showdown.md similarity index 100% rename from src/webinars/2026/mqtt-vs-opc-ua-industrial-data-showdown.md rename to nuxt/content/webinars/2026/mqtt-vs-opc-ua-industrial-data-showdown.md diff --git a/src/webinars/2026/the-agile-factory-on-the-connected-edge.md b/nuxt/content/webinars/2026/the-agile-factory-on-the-connected-edge.md similarity index 100% rename from src/webinars/2026/the-agile-factory-on-the-connected-edge.md rename to nuxt/content/webinars/2026/the-agile-factory-on-the-connected-edge.md diff --git a/src/webinars/2026/the-bus-factor-in-real-life.md b/nuxt/content/webinars/2026/the-bus-factor-in-real-life.md similarity index 100% rename from src/webinars/2026/the-bus-factor-in-real-life.md rename to nuxt/content/webinars/2026/the-bus-factor-in-real-life.md diff --git a/src/webinars/2026/turning-data-into-knowledge-with-flowfuse-ai-mcp.md b/nuxt/content/webinars/2026/turning-data-into-knowledge-with-flowfuse-ai-mcp.md similarity index 100% rename from src/webinars/2026/turning-data-into-knowledge-with-flowfuse-ai-mcp.md rename to nuxt/content/webinars/2026/turning-data-into-knowledge-with-flowfuse-ai-mcp.md diff --git a/src/_data/blogTags.json b/nuxt/data/blogTags.json similarity index 100% rename from src/_data/blogTags.json rename to nuxt/data/blogTags.json diff --git a/src/_data/chrome.json b/nuxt/data/chrome.json similarity index 97% rename from src/_data/chrome.json rename to nuxt/data/chrome.json index 6d95644874..8208c7f18e 100644 --- a/src/_data/chrome.json +++ b/nuxt/data/chrome.json @@ -1,5 +1,5 @@ { - "_comment": "Canonical marketing chrome: the top mega nav and the footer link lists. Rendered by BOTH renderers, so a page added or removed here propagates to the whole site: Eleventy reads it as an 11ty _data file (as `chrome`) in src/_includes/layouts/base.njk, and Nuxt imports it directly in components/AppHeader.vue and components/AppFooter.vue. Icon keys are filenames in src/_includes/components/icons/; Nuxt resolves them through utils/navIcons.ts, which a unit test keeps in sync. Class strings are literal so Tailwind can see them (src/css/style.css has an @source for this file). An href of 'site:<key>' is resolved against src/_data/site.json at render time instead of being a literal URL, so values like the job board link stay single-sourced there.", + "_comment": "Canonical marketing chrome: the top mega nav and the footer link lists. A page added or removed here propagates to the whole site: components/AppHeader.vue and components/AppFooter.vue import this file directly. Icon keys are filenames in nuxt/assets/nav-icons/; utils/navIcons.ts resolves them, and a unit test keeps the two in sync. Class strings are literal so Tailwind can see them (assets/css/style.css and assets/css/theme.css each declare an @source for this file). An href of 'site:<key>' is resolved against nuxt/data/site.json at render time instead of being a literal URL, so values like the job board link stay single-sourced there.", "header": { "dropdowns": [ { diff --git a/src/_data/events.yaml b/nuxt/data/events.yaml similarity index 100% rename from src/_data/events.yaml rename to nuxt/data/events.yaml diff --git a/src/_data/guests/alejandro-simo.json b/nuxt/data/guests/alejandro-simo.json similarity index 100% rename from src/_data/guests/alejandro-simo.json rename to nuxt/data/guests/alejandro-simo.json diff --git a/src/_data/guests/andrew-lynch.json b/nuxt/data/guests/andrew-lynch.json similarity index 100% rename from src/_data/guests/andrew-lynch.json rename to nuxt/data/guests/andrew-lynch.json diff --git a/src/_data/guests/anthony-sargeant.json b/nuxt/data/guests/anthony-sargeant.json similarity index 100% rename from src/_data/guests/anthony-sargeant.json rename to nuxt/data/guests/anthony-sargeant.json diff --git a/src/_data/guests/boris-crismancich.json b/nuxt/data/guests/boris-crismancich.json similarity index 100% rename from src/_data/guests/boris-crismancich.json rename to nuxt/data/guests/boris-crismancich.json diff --git a/src/_data/guests/etienne-rossignon.json b/nuxt/data/guests/etienne-rossignon.json similarity index 100% rename from src/_data/guests/etienne-rossignon.json rename to nuxt/data/guests/etienne-rossignon.json diff --git a/src/_data/guests/grey-dziuba.json b/nuxt/data/guests/grey-dziuba.json similarity index 100% rename from src/_data/guests/grey-dziuba.json rename to nuxt/data/guests/grey-dziuba.json diff --git a/src/_data/guests/harshad-joshi.json b/nuxt/data/guests/harshad-joshi.json similarity index 100% rename from src/_data/guests/harshad-joshi.json rename to nuxt/data/guests/harshad-joshi.json diff --git a/src/_data/guests/joe-pavitt.json b/nuxt/data/guests/joe-pavitt.json similarity index 100% rename from src/_data/guests/joe-pavitt.json rename to nuxt/data/guests/joe-pavitt.json diff --git a/src/_data/guests/kin-lane.json b/nuxt/data/guests/kin-lane.json similarity index 100% rename from src/_data/guests/kin-lane.json rename to nuxt/data/guests/kin-lane.json diff --git a/src/_data/guests/klaus-landsdorf.json b/nuxt/data/guests/klaus-landsdorf.json similarity index 100% rename from src/_data/guests/klaus-landsdorf.json rename to nuxt/data/guests/klaus-landsdorf.json diff --git a/src/_data/guests/kudzai-manditereza.json b/nuxt/data/guests/kudzai-manditereza.json similarity index 100% rename from src/_data/guests/kudzai-manditereza.json rename to nuxt/data/guests/kudzai-manditereza.json diff --git a/src/_data/guests/kurt-braun.json b/nuxt/data/guests/kurt-braun.json similarity index 100% rename from src/_data/guests/kurt-braun.json rename to nuxt/data/guests/kurt-braun.json diff --git a/src/_data/guests/mandeep-sidhu.json b/nuxt/data/guests/mandeep-sidhu.json similarity index 100% rename from src/_data/guests/mandeep-sidhu.json rename to nuxt/data/guests/mandeep-sidhu.json diff --git a/src/_data/guests/marian-demme.json b/nuxt/data/guests/marian-demme.json similarity index 100% rename from src/_data/guests/marian-demme.json rename to nuxt/data/guests/marian-demme.json diff --git a/src/_data/guests/michael-palmer.json b/nuxt/data/guests/michael-palmer.json similarity index 100% rename from src/_data/guests/michael-palmer.json rename to nuxt/data/guests/michael-palmer.json diff --git a/src/_data/guests/pablo-filomeno.json b/nuxt/data/guests/pablo-filomeno.json similarity index 100% rename from src/_data/guests/pablo-filomeno.json rename to nuxt/data/guests/pablo-filomeno.json diff --git a/src/_data/guests/quintijn-steelant.json b/nuxt/data/guests/quintijn-steelant.json similarity index 100% rename from src/_data/guests/quintijn-steelant.json rename to nuxt/data/guests/quintijn-steelant.json diff --git a/src/_data/guests/raymond-macaisa.json b/nuxt/data/guests/raymond-macaisa.json similarity index 100% rename from src/_data/guests/raymond-macaisa.json rename to nuxt/data/guests/raymond-macaisa.json diff --git a/src/_data/guests/rhythm-agarwal.json b/nuxt/data/guests/rhythm-agarwal.json similarity index 100% rename from src/_data/guests/rhythm-agarwal.json rename to nuxt/data/guests/rhythm-agarwal.json diff --git a/src/_data/guests/travis-elliot.json b/nuxt/data/guests/travis-elliot.json similarity index 100% rename from src/_data/guests/travis-elliot.json rename to nuxt/data/guests/travis-elliot.json diff --git a/src/_data/guests/trent-christopher.json b/nuxt/data/guests/trent-christopher.json similarity index 100% rename from src/_data/guests/trent-christopher.json rename to nuxt/data/guests/trent-christopher.json diff --git a/src/_data/navHighlights.json b/nuxt/data/navHighlights.json similarity index 100% rename from src/_data/navHighlights.json rename to nuxt/data/navHighlights.json diff --git a/src/_data/site.json b/nuxt/data/site.json similarity index 100% rename from src/_data/site.json rename to nuxt/data/site.json diff --git a/src/_data/team/andrea-palmieri.json b/nuxt/data/team/andrea-palmieri.json similarity index 100% rename from src/_data/team/andrea-palmieri.json rename to nuxt/data/team/andrea-palmieri.json diff --git a/src/_data/team/ben-hardill.json b/nuxt/data/team/ben-hardill.json similarity index 100% rename from src/_data/team/ben-hardill.json rename to nuxt/data/team/ben-hardill.json diff --git a/src/_data/team/dan-parry.json b/nuxt/data/team/dan-parry.json similarity index 100% rename from src/_data/team/dan-parry.json rename to nuxt/data/team/dan-parry.json diff --git a/src/_data/team/dimitrie-hoekstra.json b/nuxt/data/team/dimitrie-hoekstra.json similarity index 100% rename from src/_data/team/dimitrie-hoekstra.json rename to nuxt/data/team/dimitrie-hoekstra.json diff --git a/src/_data/team/drew-gatti.json b/nuxt/data/team/drew-gatti.json similarity index 100% rename from src/_data/team/drew-gatti.json rename to nuxt/data/team/drew-gatti.json diff --git a/src/_data/team/esme-wieringa.json b/nuxt/data/team/esme-wieringa.json similarity index 100% rename from src/_data/team/esme-wieringa.json rename to nuxt/data/team/esme-wieringa.json diff --git a/src/_data/team/jamie-strusz.json b/nuxt/data/team/jamie-strusz.json similarity index 100% rename from src/_data/team/jamie-strusz.json rename to nuxt/data/team/jamie-strusz.json diff --git a/src/_data/team/john-sapia.json b/nuxt/data/team/john-sapia.json similarity index 100% rename from src/_data/team/john-sapia.json rename to nuxt/data/team/john-sapia.json diff --git a/src/_data/team/joyce.json b/nuxt/data/team/joyce.json similarity index 100% rename from src/_data/team/joyce.json rename to nuxt/data/team/joyce.json diff --git a/src/_data/team/kasheef-mohammed.json b/nuxt/data/team/kasheef-mohammed.json similarity index 100% rename from src/_data/team/kasheef-mohammed.json rename to nuxt/data/team/kasheef-mohammed.json diff --git a/src/_data/team/kristopher-sandoval.json b/nuxt/data/team/kristopher-sandoval.json similarity index 100% rename from src/_data/team/kristopher-sandoval.json rename to nuxt/data/team/kristopher-sandoval.json diff --git a/src/_data/team/michael-davis.json b/nuxt/data/team/michael-davis.json similarity index 100% rename from src/_data/team/michael-davis.json rename to nuxt/data/team/michael-davis.json diff --git a/src/_data/team/nick-oleary.json b/nuxt/data/team/nick-oleary.json similarity index 100% rename from src/_data/team/nick-oleary.json rename to nuxt/data/team/nick-oleary.json diff --git a/src/_data/team/noley-holland.json b/nuxt/data/team/noley-holland.json similarity index 100% rename from src/_data/team/noley-holland.json rename to nuxt/data/team/noley-holland.json diff --git a/src/_data/team/noubar-tedjirian.json b/nuxt/data/team/noubar-tedjirian.json similarity index 100% rename from src/_data/team/noubar-tedjirian.json rename to nuxt/data/team/noubar-tedjirian.json diff --git a/src/_data/team/piotr-pawlowski.json b/nuxt/data/team/piotr-pawlowski.json similarity index 100% rename from src/_data/team/piotr-pawlowski.json rename to nuxt/data/team/piotr-pawlowski.json diff --git a/src/_data/team/rob-marcer.json b/nuxt/data/team/rob-marcer.json similarity index 100% rename from src/_data/team/rob-marcer.json rename to nuxt/data/team/rob-marcer.json diff --git a/src/_data/team/serban-costin.json b/nuxt/data/team/serban-costin.json similarity index 100% rename from src/_data/team/serban-costin.json rename to nuxt/data/team/serban-costin.json diff --git a/src/_data/team/stephen-mclaughlin.json b/nuxt/data/team/stephen-mclaughlin.json similarity index 100% rename from src/_data/team/stephen-mclaughlin.json rename to nuxt/data/team/stephen-mclaughlin.json diff --git a/src/_data/team/sumit-shinde.json b/nuxt/data/team/sumit-shinde.json similarity index 100% rename from src/_data/team/sumit-shinde.json rename to nuxt/data/team/sumit-shinde.json diff --git a/src/_data/team/yndira-escobar.json b/nuxt/data/team/yndira-escobar.json similarity index 100% rename from src/_data/team/yndira-escobar.json rename to nuxt/data/team/yndira-escobar.json diff --git a/src/_data/team/zeger-jan-van-de-weg.json b/nuxt/data/team/zeger-jan-van-de-weg.json similarity index 100% rename from src/_data/team/zeger-jan-van-de-weg.json rename to nuxt/data/team/zeger-jan-van-de-weg.json diff --git a/src/_data/testimonials.json b/nuxt/data/testimonials.json similarity index 100% rename from src/_data/testimonials.json rename to nuxt/data/testimonials.json diff --git a/nuxt/error.vue b/nuxt/error.vue index d64d781b4f..9285f76835 100644 --- a/nuxt/error.vue +++ b/nuxt/error.vue @@ -11,9 +11,6 @@ defineProps<{ error: { statusCode: number; statusMessage: string } }>() </div> <h1 class="mb-0 text-[2.75rem] leading-[3.1rem] font-normal text-gray-700">Ooops!</h1> <h5 class="text-[1.1rem] leading-[1.85rem] font-semibold text-gray-700">Page not found</h5> - <!-- external (CtaCustom's default) forces a full page navigation — / - is served by 11ty and a client-side Nuxt redirect would leave the - page blank. --> <CtaCustom label="Return to homepage" destination-key="homepage" variant="primary" position="hero" class="mt-4" /> </div> </div> diff --git a/nuxt/lib/changelog-frontmatter.test.mjs b/nuxt/lib/changelog-frontmatter.test.mjs index fd3af55cc0..d51e0a992e 100644 --- a/nuxt/lib/changelog-frontmatter.test.mjs +++ b/nuxt/lib/changelog-frontmatter.test.mjs @@ -1,4 +1,4 @@ -// Validates the frontmatter of every changelog entry in src/changelog/. +// Validates the frontmatter of every changelog entry in nuxt/content/changelog/. // // These entries are hand-authored by engineering and product (see the handbook, // Writing Changelog Posts), and the listing page groups them by release. A wrong or @@ -12,7 +12,7 @@ import { join, dirname, relative } from 'node:path' import { fileURLToPath } from 'node:url' import { findFiles } from './find-files.mjs' -const CHANGELOG_DIR = join(dirname(fileURLToPath(import.meta.url)), '../../src/changelog') +const CHANGELOG_DIR = join(dirname(fileURLToPath(import.meta.url)), '../content/changelog') function frontmatter (text) { const match = /^---\r?\n([\s\S]*?)\r?\n---/.exec(text) diff --git a/nuxt/lib/chrome.test.mjs b/nuxt/lib/chrome.test.mjs index ffe5ac947a..0181fe668f 100644 --- a/nuxt/lib/chrome.test.mjs +++ b/nuxt/lib/chrome.test.mjs @@ -1,7 +1,7 @@ -// Guards on src/_data/chrome.json, the shared marketing nav and footer. +// Guards on nuxt/data/chrome.json, the shared marketing nav and footer. // -// The file is rendered by two independent templates, so the things that can drift -// are checked here rather than left to a reviewer noticing. +// The file is rendered by two independent components (AppHeader.vue and AppFooter.vue), +// so the things that can drift are checked here rather than left to a reviewer noticing. import assert from 'node:assert/strict' import { existsSync, readFileSync } from 'node:fs' import { dirname, join, resolve } from 'node:path' @@ -9,7 +9,7 @@ import { test } from 'node:test' import { fileURLToPath } from 'node:url' const repo = join(dirname(fileURLToPath(import.meta.url)), '..', '..') -const chrome = JSON.parse(readFileSync(join(repo, 'src/_data/chrome.json'), 'utf8')) +const chrome = JSON.parse(readFileSync(join(repo, 'nuxt/data/chrome.json'), 'utf8')) const navLinks = chrome.header.dropdowns.flatMap(d => d.columns.flatMap(c => c.links)) const footerLinks = [ @@ -22,13 +22,13 @@ const allLinks = [...navLinks, ...chrome.header.direct, ...footerLinks] test('every icon key resolves to an icon file', () => { for (const { icon, label } of navLinks) { assert.ok(icon, `${label} has no icon`) - assert.ok(existsSync(join(repo, `src/_includes/components/icons/${icon}.svg`)), + assert.ok(existsSync(join(repo, `nuxt/assets/nav-icons/${icon}.svg`)), `${label} points at a missing icon: ${icon}.svg`) } }) test('every icon key is in the Nuxt icon map', () => { - // Eleventy loads icons off disk by name, Nuxt needs an explicit import. + // navIcons.ts imports each icon explicitly, so a key missing there renders nothing. const map = readFileSync(join(repo, 'nuxt/utils/navIcons.ts'), 'utf8') const covered = new Set([...map.matchAll(/^\s*'([^']+)':/gm)].map(m => m[1])) for (const { icon, label } of navLinks) { @@ -67,7 +67,8 @@ test('no nav or footer link points at a redirected path', () => { }) test('both Tailwind builds resolve an @source onto the data file', () => { - // There are two independent Tailwind builds: src/css/style.css for Eleventy and + // There are two independent Tailwind builds: nuxt/assets/css/style.css, which + // prod:postcss-nuxt compiles to nuxt/public/css/style.css, and // nuxt/assets/css/theme.css for the Nuxt bundle, which only scans nuxt/ and is // loaded second. A utility that exists in one build but not the other loses to // any lower-breakpoint rule the later sheet does have. Dropping either @source @@ -77,15 +78,15 @@ test('both Tailwind builds resolve an @source onto the data file', () => { // says nothing when the path misses, so check where each one actually lands // rather than that the line reads plausibly. A wrong number of ../ steps is // the failure this is here to catch. - const target = join(repo, 'src/_data/chrome.json') - for (const css of ['src/css/style.css', 'nuxt/assets/css/theme.css']) { + const target = join(repo, 'nuxt/data/chrome.json') + for (const css of ['nuxt/assets/css/style.css', 'nuxt/assets/css/theme.css']) { const text = readFileSync(join(repo, css), 'utf8') - const declared = text.match(/@source\s+"([^"]*_data\/chrome\.json)"/) - assert.ok(declared, `${css} must declare @source for src/_data/chrome.json`) + const declared = text.match(/@source\s+"([^"]*chrome\.json)"/) + assert.ok(declared, `${css} must declare @source for nuxt/data/chrome.json`) const landed = resolve(dirname(join(repo, css)), declared[1]) assert.equal(landed, target, `${css} declares @source "${declared[1]}", which resolves to ${landed} ` - + 'instead of src/_data/chrome.json, so that build scans nothing') + + 'instead of nuxt/data/chrome.json, so that build scans nothing') } }) @@ -118,13 +119,13 @@ test('every dropdown column reserves enough grid rows for its links', () => { assert.ok(span, `${dd.label} > ${col.title} has no row-span`) assert.ok(Number(span[1]) >= col.links.length, `${dd.label} > ${col.title} spans ${span[1]} rows but has ` - + `${col.links.length} links - raise its row-span in src/_data/chrome.json`) + + `${col.links.length} links - raise its row-span in nuxt/data/chrome.json`) // A column occupies its title row plus one row per link. tallest = Math.max(tallest, 1 + col.links.length) } assert.ok(Number(megaRows[1]) >= tallest, `${dd.label} declares ${megaRows[1]} mega rows but its tallest column needs ` - + `${tallest} - raise the repeat() count in src/_data/chrome.json`) + + `${tallest} - raise the repeat() count in nuxt/data/chrome.json`) } }) diff --git a/nuxt/lib/cta-destinations.ts b/nuxt/lib/cta-destinations.ts index 81156c986a..8a6ff03600 100644 --- a/nuxt/lib/cta-destinations.ts +++ b/nuxt/lib/cta-destinations.ts @@ -1,4 +1,4 @@ -import site from '../../src/_data/site.json' +import site from '../data/site.json' // Shared by CtaCustom.vue and custom-cta-destinations.ts, both of which // compare hrefs for equality - a trailing slash shouldn't make two otherwise diff --git a/nuxt/lib/docs-redirects.test.mjs b/nuxt/lib/docs-redirects.test.mjs index 74f26d46c9..05e77b91e1 100644 --- a/nuxt/lib/docs-redirects.test.mjs +++ b/nuxt/lib/docs-redirects.test.mjs @@ -33,7 +33,7 @@ test('the key is the route verbatim, so docs-source can reuse it to skip prerend test('an off-site target is a 301 like any other', () => { // docs/community-support.md points at the Node-RED forum, and docs/admin/licensing.md - // at /pricing/, which is still served by Eleventy. Neither is a docs page. + // at /pricing/. Neither is a docs page. const rules = docsRedirectRules([ redirectPage('/docs/community-support/', 'https://discourse.nodered.org/c/vendors/flowfuse/24'), ]) diff --git a/nuxt/lib/feature-catalog.test.mjs b/nuxt/lib/feature-catalog.test.mjs index 3ab39b03d8..252ab218ff 100644 --- a/nuxt/lib/feature-catalog.test.mjs +++ b/nuxt/lib/feature-catalog.test.mjs @@ -204,7 +204,7 @@ test('catalog feature ids are unique', () => { }) test('every catalog changelog url points at a changelog post that exists', () => { - const changelogDir = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'src', 'changelog') + const changelogDir = join(dirname(fileURLToPath(import.meta.url)), '..', 'content', 'changelog') const posts = new Set() const walk = (dir, prefix) => { for (const entry of readdirSync(dir, { withFileTypes: true })) { diff --git a/nuxt/lib/git-lastmod.mjs b/nuxt/lib/git-lastmod.mjs index 91a5d20729..32288787bb 100644 --- a/nuxt/lib/git-lastmod.mjs +++ b/nuxt/lib/git-lastmod.mjs @@ -11,7 +11,7 @@ // pruning whole unchanged subtrees via tree-object-id ("treesame") comparisons instead of // diffing file-by-file, and stops early once every path has been resolved. That is a // more efficient shared walk (matches Gitaly/GitHub's write-up: revisiting the same -// commits per file is "twice the necessary" work); this module's `--name-only` walk +// commits per file is "twice the necessary" work); this module's `--name-status` walk // below shares the same core insight - one walk, not one process per file, and the first // occurrence of a path scanning newest-first is its most recent commit - but reads the // whole history as flat text and dedupes in JS rather than pruning the walk itself, which @@ -20,29 +20,53 @@ import { execFileSync } from 'node:child_process' // A NUL byte can't appear in a file path, so it safely marks a commit-date line apart -// from the `--name-only` file lines that follow it. `%x00` asks git to emit the byte +// from the `--name-status` file lines that follow it. `%x00` asks git to emit the byte // into its output; the argv string itself only ever contains the ASCII text "%x00". const NUL = '\u0000' const mapCache = new Map() /** - * Pure parser for `git log --pretty=format:%x00%ci --name-only` output - split out from - * buildLastmodMap so the newest-first/first-occurrence-wins logic can be unit tested - * against fixture strings without shelling out to git or touching a real repo. + * Pure parser for `git log --first-parent -m --pretty=format:%x00%ci --name-status -M100%` + * output - split out from buildLastmodMap so the newest-first/first-occurrence-wins logic + * can be unit tested against fixture strings without shelling out to git or touching a + * real repo. + * + * A move is not an edit. When a file was moved without changing it (an `R100` line), its + * history under the old path still counts as its own, so moving a content tree (src/blog + * to nuxt/content/blog, say) does not stamp every page in it with the date of the move. + * With `-M100%` every rename line is an R100: a move that also edited the file comes out + * as an add and a delete, so the add dates it. A lower rename score, should the flag ever + * change, is counted as an edit. Deletions are skipped: a path that is gone has no page + * to date. * * @param {string} output raw stdout from the git log invocation above * @returns {Map<string, string>} file path -> most recent commit date */ export function parseGitLogOutput (output) { const map = new Map() + // Older names of a moved file, pointing at the name it has now. The walk is main's own + // history, newest first, so a move is always seen before anything that happened under + // the old name. + const movedTo = new Map() + const currentName = path => movedTo.get(path) ?? path let currentDate = null for (const line of output.split('\n')) { if (line.startsWith(NUL)) { currentDate = line.slice(1) continue } - if (!line || map.has(line)) continue - map.set(line, currentDate) + if (!line) continue + const [status, ...paths] = line.split('\t') + if (status.startsWith('R')) { + const [from, to] = paths + const name = currentName(to) + movedTo.set(from, name) + if (status !== 'R100' && !map.has(name)) map.set(name, currentDate) + continue + } + if (status === 'D') continue + const name = currentName(paths[paths.length - 1]) + if (!map.has(name)) map.set(name, currentDate) } return map } @@ -50,11 +74,17 @@ export function parseGitLogOutput (output) { function buildLastmodMap (repoRoot) { let output try { - // Newest-first (git log's default order): the first time a path is seen while - // walking top-to-bottom is its most recent commit. + // Newest-first: the first time a path is seen while walking top-to-bottom is its + // most recent commit. `--first-parent -m` walks main's own history and lists what + // each merge changed against main, so a change merged in from a branch is dated + // when it reached main, and is listed under the path it has there. Without it, a + // branch commit made after a move but still naming the old path is interleaved by + // date, filed under the old name, and the page keeps its pre-move date. `-M100%` + // detects only exact moves, which git finds by blob id without the pairwise content + // scoring a looser threshold would run on every commit. output = execFileSync( 'git', - ['log', '--pretty=format:%x00%ci', '--name-only'], + ['log', '--first-parent', '-m', '--pretty=format:%x00%ci', '--name-status', '-M100%'], { cwd: repoRoot, encoding: 'utf8', maxBuffer: 1024 * 1024 * 256 } ) } catch (err) { @@ -67,7 +97,7 @@ function buildLastmodMap (repoRoot) { /** * @param {string} repoRoot absolute path to the git repository root - * @param {string} relativePath path to the file, relative to repoRoot (e.g. "src/blog/2024/01/post.md") + * @param {string} relativePath path to the file, relative to repoRoot (e.g. "nuxt/content/blog/2024/01/post.md") * @returns {string|undefined} the ISO-ish commit date git log reports, or undefined if unknown */ export function getGitLastmod (repoRoot, relativePath) { diff --git a/nuxt/lib/git-lastmod.test.mjs b/nuxt/lib/git-lastmod.test.mjs new file mode 100644 index 0000000000..3abb1bdb27 --- /dev/null +++ b/nuxt/lib/git-lastmod.test.mjs @@ -0,0 +1,117 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { execFileSync } from 'node:child_process' +import { mkdirSync, mkdtempSync, writeFileSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { dirname, join } from 'node:path' + +import { getGitLastmod, parseGitLogOutput } from './git-lastmod.mjs' + +const commit = (date, ...lines) => [`\u0000${date}`, ...lines, ''].join('\n') + +test('the newest commit touching a path wins', () => { + const map = parseGitLogOutput( + commit('2026-03-01', 'M\tblog/a.md') + + commit('2026-01-01', 'A\tblog/a.md', 'A\tblog/b.md') + ) + assert.equal(map.get('blog/a.md'), '2026-03-01') + assert.equal(map.get('blog/b.md'), '2026-01-01') +}) + +test('a pure move keeps the date the content last changed', () => { + const map = parseGitLogOutput( + commit('2026-09-25', 'R100\tsrc/blog/a.md\tnuxt/content/blog/a.md') + + commit('2025-06-01', 'M\tsrc/blog/a.md') + + commit('2024-01-01', 'A\tsrc/blog/a.md') + ) + assert.equal(map.get('nuxt/content/blog/a.md'), '2025-06-01') +}) + +test('an edit after the move is newer than anything before it', () => { + const map = parseGitLogOutput( + commit('2026-10-01', 'M\tnuxt/content/blog/a.md') + + commit('2026-09-25', 'R100\tsrc/blog/a.md\tnuxt/content/blog/a.md') + + commit('2025-06-01', 'M\tsrc/blog/a.md') + ) + assert.equal(map.get('nuxt/content/blog/a.md'), '2026-10-01') +}) + +test('history follows a file through several moves', () => { + const map = parseGitLogOutput( + commit('2026-09-25', 'R100\tsrc/blog/a.md\tnuxt/content/blog/a.md') + + commit('2025-01-01', 'R100\tblog/a.md\tsrc/blog/a.md') + + commit('2024-05-01', 'M\tblog/a.md') + ) + assert.equal(map.get('nuxt/content/blog/a.md'), '2024-05-01') +}) + +test('a move that also changed the file counts as a change', () => { + // -M100% only pairs exact moves, so an edited move is listed as an add and a delete. + const map = parseGitLogOutput( + commit('2026-09-25', 'A\tnuxt/assets/css/style.css', 'D\tsrc/css/style.css') + + commit('2025-06-01', 'M\tsrc/css/style.css') + ) + assert.equal(map.get('nuxt/assets/css/style.css'), '2026-09-25') +}) + +test('a path created where a file was moved away from is dated on its own', () => { + const map = parseGitLogOutput( + commit('2026-10-01', 'A\tsrc/blog/a.md') + + commit('2026-09-25', 'R100\tsrc/blog/a.md\tnuxt/content/blog/a.md') + + commit('2025-06-01', 'M\tsrc/blog/a.md') + ) + assert.equal(map.get('src/blog/a.md'), '2026-10-01') + assert.equal(map.get('nuxt/content/blog/a.md'), '2025-06-01') +}) + +test('a deletion does not date anything', () => { + const map = parseGitLogOutput( + commit('2026-09-25', 'D\tblog/gone.md') + + commit('2025-06-01', 'A\tblog/gone.md') + ) + assert.equal(map.get('blog/gone.md'), '2025-06-01') +}) + +test('against a real repository: moves, edited moves, and a branch merged after the move', () => { + const repo = mkdtempSync(join(tmpdir(), 'git-lastmod-')) + const git = (date, ...args) => execFileSync('git', [ + '-c', 'user.name=test', '-c', 'user.email=test@example.com', + '-c', 'commit.gpgsign=false', '-c', 'init.defaultBranch=main', ...args + ], { cwd: repo, env: { ...process.env, GIT_AUTHOR_DATE: date, GIT_COMMITTER_DATE: date }, stdio: 'pipe' }) + const write = (path, text) => { + mkdirSync(dirname(join(repo, path)), { recursive: true }) + writeFileSync(join(repo, path), text) + } + + git('2024-01-01T12:00:00Z', 'init', '-q') + write('src/blog/a.md', 'a') + write('src/blog/b.md', 'b') + write('src/blog/c.md', 'c') + git('2024-01-01T12:00:00Z', 'add', '.') + git('2024-01-01T12:00:00Z', 'commit', '-q', '-m', 'posts') + write('src/blog/a.md', 'a, edited') + git('2025-01-01T12:00:00Z', 'commit', '-q', '-am', 'edit a') + + // A branch cut before the move, which edits b under its old path after the move. + git('2025-01-01T12:00:00Z', 'checkout', '-q', '-b', 'feature') + + git('2026-09-25T12:00:00Z', 'checkout', '-q', 'main') + mkdirSync(join(repo, 'nuxt/content'), { recursive: true }) + git('2026-09-25T12:00:00Z', 'mv', 'src/blog', 'nuxt/content/blog') + write('nuxt/content/blog/c.md', 'c, edited while moving') + git('2026-09-25T12:00:00Z', 'commit', '-q', '-am', 'move') + + git('2026-10-01T12:00:00Z', 'checkout', '-q', 'feature') + write('src/blog/b.md', 'b, edited on a branch') + git('2026-10-01T12:00:00Z', 'commit', '-q', '-am', 'edit b') + git('2026-10-02T12:00:00Z', 'checkout', '-q', 'main') + git('2026-10-02T12:00:00Z', 'merge', '-q', '--no-ff', '-m', 'merge feature', 'feature') + + const date = path => getGitLastmod(repo, path)?.slice(0, 10) + // Moved untouched: dated by its last edit, not by the move. + assert.equal(date('nuxt/content/blog/a.md'), '2025-01-01') + // Edited on a branch after the move: dated when the edit reached main. + assert.equal(date('nuxt/content/blog/b.md'), '2026-10-02') + // Edited in the same commit that moved it: that commit is its last change. + assert.equal(date('nuxt/content/blog/c.md'), '2026-09-25') +}) diff --git a/nuxt/lib/icon-collection.test.mjs b/nuxt/lib/icon-collection.test.mjs new file mode 100644 index 0000000000..5273dda39c --- /dev/null +++ b/nuxt/lib/icon-collection.test.mjs @@ -0,0 +1,27 @@ +// The `ff` icon collection (<UIcon name="i-ff-..." />) is every SVG in the directory +// nuxt.config.ts names under icon.customCollections. Nuxt Icon parses each one at build +// time, and a file without its own <svg> root, such as the bare <path> fragments the nav +// icons in nuxt/assets/nav-icons/ are, fails the whole build with "Cannot read properties +// of undefined (reading 'attribs')". Checked here so it fails in seconds, by name. +import assert from 'node:assert/strict' +import { readdirSync, readFileSync } from 'node:fs' +import { dirname, join } from 'node:path' +import { test } from 'node:test' +import { fileURLToPath } from 'node:url' + +const nuxtRoot = join(dirname(fileURLToPath(import.meta.url)), '..') + +test('every file in the ff icon collection is a complete SVG', () => { + const config = readFileSync(join(nuxtRoot, 'nuxt.config.ts'), 'utf8') + const declared = config.match(/prefix:\s*'ff',\s*dir:\s*join\(__dirname,\s*'([^']+)'\)/) + assert.ok(declared, 'nuxt.config.ts no longer declares the ff collection the way this test reads it') + + const dir = join(nuxtRoot, declared[1]) + const files = readdirSync(dir).filter(f => f.endsWith('.svg')) + assert.ok(files.length > 0, `${declared[1]} has no SVG files`) + for (const file of files) { + const text = readFileSync(join(dir, file), 'utf8') + assert.match(text, /^\s*(<\?xml[^>]*\?>\s*)?(<!--[\s\S]*?-->\s*)*<svg[\s>]/, + `${declared[1]}/${file} has no <svg> root, so Nuxt Icon cannot parse it`) + } +}) diff --git a/nuxt/lib/legacy-pages.test.mjs b/nuxt/lib/legacy-pages.test.mjs deleted file mode 100644 index 3f3704ccf4..0000000000 --- a/nuxt/lib/legacy-pages.test.mjs +++ /dev/null @@ -1,108 +0,0 @@ -// Fails when a PR adds a brand-new .njk file under src/ (11ty). 11ty is being phased out -// (see CLAUDE.md's migration status) — Nuxt pages are .vue/.md under nuxt/, never .njk, -// so a new .njk file can only mean a page built in the legacy stack instead of Nuxt. -// See /handbook/marketing/website#new-pages-must-be-built-in-nuxt. -// -// Scope: .njk only, deliberately. This does not (and is not meant to) catch a new page -// built as a bare .md file against an existing layout — content directories like -// src/blog/, src/changelog/, src/webinars/ and src/blueprints/ need to keep adding new -// .md files all the time as routine content work, most of them already managed by Nuxt -// regardless of where the source file lives, and reliably telling "a new content entry" -// apart from "a new page wearing an existing layout" isn't something this check does. -// CLAUDE.md and the handbook call this out explicitly. -// -// No allowlist to maintain: this fetches main and checks, for every .njk file that -// exists in this checkout, whether that path already existed on main — at its current -// tip, or within the last MAIN_LOOKBACK commits, so an unrelated rename/delete elsewhere -// on main after this branch forked doesn't retroactively fail a PR that never touched -// that file. A path missing from both fails; editing an existing .njk is unaffected. -// -// This file is picked up by the top-level `npm test` glob, so a failure here fails the -// "test_website / Build and check" status check that main's ruleset already requires — -// unlike a standalone workflow, this one actually blocks the PR. - -import { test } from 'node:test' -import assert from 'node:assert/strict' -import { execFileSync } from 'node:child_process' -import { readdirSync, lstatSync } from 'node:fs' -import { join, dirname, relative } from 'node:path' -import { fileURLToPath } from 'node:url' -import { findFiles } from './find-files.mjs' - -const REPO_ROOT = join(dirname(fileURLToPath(import.meta.url)), '../..') -const SRC_DIR = join(REPO_ROOT, 'src') - -// Not pages at all: global data and layout partials/macros other pages include. A new -// file here is never itself "a new page" the way a new top-level .njk is. -const NON_PAGE_DIRS = ['_data', '_includes'] - -const MAIN_LOOKBACK = 30 - -function git (args, options = {}) { - return execFileSync('git', args, { cwd: REPO_ROOT, encoding: 'utf8', maxBuffer: 10 * 1024 * 1024, ...options }) -} - -function currentPageFiles () { - const found = [] - for (const name of readdirSync(SRC_DIR)) { - if (NON_PAGE_DIRS.includes(name)) continue - const path = join(SRC_DIR, name) - if (lstatSync(path).isSymbolicLink()) continue - if (lstatSync(path).isDirectory()) findFiles(path, ['.njk'], found) - else if (name.endsWith('.njk')) found.push(path) - } - return found.map(path => relative(REPO_ROOT, path).split('\\').join('/')).sort() -} - -function pagesOnRef (ref) { - try { - return git(['ls-tree', '-r', '--name-only', ref, '--', 'src']) - .split('\n') - .filter(path => path.endsWith('.njk')) - } catch { - // ref doesn't resolve (main has fewer than MAIN_LOOKBACK commits) — fine, the - // tip check alone still covers it. - return [] - } -} - -test('no new .njk pages were added under src/ (11ty)', async (t) => { - try { - // Force the update (+): a shallow, single-commit fetch into this ref has no - // parent info, so a plain fetch can refuse a previous run's leftover ref as - // "not a fast-forward" even though it's simply an older snapshot of main. - git(['fetch', `--depth=${MAIN_LOOKBACK + 5}`, 'origin', '+main:refs/main-tip']) - } catch (err) { - // CI always has network — a failed fetch there means something is actually - // broken, so it must fail loud rather than silently let a new page through. - // Locally (offline, no remote configured, etc.) it's fine to just skip. - if (process.env.CI) throw new Error(`couldn't fetch origin main to compare against: ${err.message}`) - t.skip(`couldn't fetch origin main to compare against, skipping (${err.message})`) - return - } - - try { - const pagesOnMain = new Set([ - ...pagesOnRef('refs/main-tip'), - ...pagesOnRef(`refs/main-tip~${MAIN_LOOKBACK}`) - ]) - - const newPages = currentPageFiles().filter(path => !pagesOnMain.has(path)) - - assert.deepEqual(newPages, [], [ - 'New .njk page(s) found under src/ that do not exist on main:', - ...newPages.map(p => ` - ${p}`), - '', - '11ty is being phased out — build new pages in Nuxt (nuxt/pages/) instead.', - 'See /handbook/marketing/website#new-pages-must-be-built-in-nuxt for context.', - 'If this page genuinely must ship on 11ty first, a member of the GitHub "admin"', - 'team can merge anyway via "Merge without waiting for requirements to be met".' - ].join('\n')) - } finally { - try { - git(['update-ref', '-d', 'refs/main-tip']) - } catch { - // Best-effort cleanup only — must never mask a real assertion failure above. - } - } -}) diff --git a/nuxt/lib/meta-title-length.test.mjs b/nuxt/lib/meta-title-length.test.mjs index cc9ab24ef1..589ef02dd8 100644 --- a/nuxt/lib/meta-title-length.test.mjs +++ b/nuxt/lib/meta-title-length.test.mjs @@ -6,11 +6,11 @@ import { dirname, join } from 'node:path' import { MAX_META_TITLE_LENGTH, findOverlongMetaTitles, isDirectory } from './meta-title-length.mjs' const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '../..') -const blogDir = join(repoRoot, 'src/blog') -const changelogDir = join(repoRoot, 'src/changelog') +const blogDir = join(repoRoot, 'nuxt/content/blog') +const changelogDir = join(repoRoot, 'nuxt/content/changelog') // Guards the fixture-free tests below against a silent no-op if the source layout moves. -test('src/blog and src/changelog exist where these tests expect them', () => { +test('the blog and changelog content trees exist where these tests expect them', () => { assert.ok(isDirectory(blogDir), `expected ${blogDir} to exist`) assert.ok(isDirectory(changelogDir), `expected ${changelogDir} to exist`) }) diff --git a/nuxt/lib/node-red-help.mjs b/nuxt/lib/node-red-help.mjs index 9985076a50..385bf43d29 100644 --- a/nuxt/lib/node-red-help.mjs +++ b/nuxt/lib/node-red-help.mjs @@ -114,8 +114,8 @@ const ALLOWED_TAGS = [ // because the class is the only thing that says WHICH of two visually identical items is // which: upstream writes `<dt class="optional">` to mark an optional message property, and // `<span class="property-type">` to mark a type rather than more prose. Stripping those -// stripped meaning, not styling - the live Eleventy pages keep them, so this was a -// regression the move would have shipped. It cannot execute anything. +// stripped meaning, not styling - the Eleventy pages these replaced kept them, so this +// was a regression the move would have shipped. It cannot execute anything. // // `style` is deliberately NOT allowed. Upstream's only use of it is a single malformed // `<table style="outline-width:#888 solid thin">` on the Range node; letting arbitrary diff --git a/nuxt/lib/node-red-help.test.mjs b/nuxt/lib/node-red-help.test.mjs index 39f4d78100..f9cd2f7533 100644 --- a/nuxt/lib/node-red-help.test.mjs +++ b/nuxt/lib/node-red-help.test.mjs @@ -130,7 +130,7 @@ test('the sanitiser keeps the classes that carry meaning rather than styling', ( // marks an OPTIONAL message property with `<dt class="optional">` and a type (rather // than more prose) with `<span class="property-type">`. Both render as plain text // without the class, so an optional property became indistinguishable from a required - // one. The live Eleventy pages keep both, so dropping them was a regression. + // one. The Eleventy pages these replaced kept both, so dropping them was a regression. const html = sanitiseHelp( '<dl class="message-properties">' + '<dt class="optional">template <span class="property-type">string</span></dt>' diff --git a/nuxt/lib/release-features.test.mjs b/nuxt/lib/release-features.test.mjs index ee2c98cab6..872b18e8fc 100644 --- a/nuxt/lib/release-features.test.mjs +++ b/nuxt/lib/release-features.test.mjs @@ -171,7 +171,7 @@ test('injectReleaseFeatures leaves a body alone when nothing resolves or a headi }) test('every release blog features entry names a catalog feature that exists', () => { - const blogDir = join(here, '..', '..', 'src', 'blog') + const blogDir = join(here, '..', 'content', 'blog') const ids = new Set(allFeatures(catalog).map(feature => feature.id)) const posts = [] const walk = (dir) => { @@ -190,7 +190,7 @@ test('every release blog features entry names a catalog feature that exists', () try { frontmatter = jsYaml.load(match[1]) } catch { continue } for (const entry of frontmatter?.features ?? []) { for (const id of [entry.id ?? []].flat()) { - if (!ids.has(id)) broken.push(`${post.split('/src/')[1]}: ${id}`) + if (!ids.has(id)) broken.push(`${post.split('/content/')[1]}: ${id}`) } } } diff --git a/nuxt/lib/retired-src.test.mjs b/nuxt/lib/retired-src.test.mjs new file mode 100644 index 0000000000..5747a568b1 --- /dev/null +++ b/nuxt/lib/retired-src.test.mjs @@ -0,0 +1,24 @@ +// src/ was Eleventy's input tree. Eleventy is gone and nothing reads src/ any more, so a +// file that lands there is never built and nothing else says so. That happens when a +// branch cut before the move is merged after it: a new post in a new month directory +// merges cleanly into src/blog/, and the only sign is a page that never appears. +import assert from 'node:assert/strict' +import { execFileSync } from 'node:child_process' +import { dirname, join } from 'node:path' +import { test } from 'node:test' +import { fileURLToPath } from 'node:url' + +const repo = join(dirname(fileURLToPath(import.meta.url)), '..', '..') + +test('nothing is tracked under src/', (t) => { + let tracked + try { + tracked = execFileSync('git', ['ls-files', '--', 'src'], { cwd: repo, encoding: 'utf8' }).trim() + } catch { + t.skip('not a git checkout') + return + } + assert.equal(tracked, '', + 'src/ is retired: these files are never built. Move content into nuxt/content/, ' + + 'served files into nuxt/public/, data into nuxt/data/:\n' + tracked) +}) diff --git a/nuxt/nuxt.config.ts b/nuxt/nuxt.config.ts index 65b37bde62..96502b3428 100644 --- a/nuxt/nuxt.config.ts +++ b/nuxt/nuxt.config.ts @@ -7,7 +7,7 @@ import remarkSiteLinks from './utils/remark-site-links' import { BLOG_TAGS } from './composables/useBlogList' import { redirects } from './redirects' import { sitemapProblems } from './lib/sitemap-coverage.mjs' -import site from '../src/_data/site.json' +import site from './data/site.json' // Collect all handbook routes from content files for SSG prerendering function collectHandbookRoutes(dir: string, basePath: string): string[] { @@ -42,7 +42,7 @@ function collectChangelogRoutes(dir: string, basePath: string): { routes: string return { routes, entryCount } } -// Webinars are one .md per file under src/webinars/<year>/, sourced in place by the +// Webinars are one .md per file under nuxt/content/webinars/<year>/, sourced by the // `webinars` collection, so their routes come from the tree rather than from a field. // // `<slug>/index.md` is the directory's own page, not a page called "index". One webinar is @@ -102,7 +102,7 @@ function collectProductRoutes (dir: string): string[] { } // Same idea as collectProductRoutes above, for customer stories (flat -// src/customer-stories/ dir, see content.config.ts). +// nuxt/content/customer-stories/ dir, see content.config.ts). function collectStoryRoutes(dir: string): string[] { const routes = ['/customer-stories/'] for (const file of readdirSync(dir)) { @@ -136,7 +136,7 @@ function collectBlogFiles(dir: string, basePath: string): Array<{ route: string, // `authors` values that mean "no individual author" - they have no data file by design. const ORG_AUTHOR_SLUGS = new Set(['-', 'FlowFuse', 'flowfuse', 'flowfuseteam']) -// Author pages are rendered by pages/blog/author/[slug].vue from src/_data/{team,guests} +// Author pages are rendered by pages/blog/author/[slug].vue from nuxt/data/{team,guests} // rather than from an @nuxt/content collection, so neither prerendering nor the sitemap // can discover them - enumerate the authors who both have a data file and a published post. function collectAuthorRoutes(blogFiles: Array<{ authors: string[] }>, dataDirs: string[]): string[] { @@ -146,7 +146,7 @@ function collectAuthorRoutes(blogFiles: Array<{ authors: string[] }>, dataDirs: // Anything left is either a former team member or a typo - surface it in the build log. const missing = [...withPosts].filter(slug => !known.has(slug) && !ORG_AUTHOR_SLUGS.has(slug)).sort() if (missing.length) { - console.warn(`[blog] ${missing.length} author slug(s) in blog frontmatter have no data file in src/_data/{team,guests}; these posts fall back to the "FlowFuse" byline and get no author page: ${missing.join(', ')}`) + console.warn(`[blog] ${missing.length} author slug(s) in blog frontmatter have no data file in nuxt/data/{team,guests}; these posts fall back to the "FlowFuse" byline and get no author page: ${missing.join(', ')}`) } return [...withPosts].filter(slug => known.has(slug)).sort().map(slug => `/blog/author/${slug}/`) @@ -157,8 +157,8 @@ function paginatedListingRoutes(basePath: string, entryCount: number): string[] return [`${basePath}/`, ...Array.from({ length: pageCount - 1 }, (_, i) => `${basePath}/${i + 2}/`)] } -const blogFiles = collectBlogFiles(join(__dirname, '../src/blog'), '/blog') -const blogAuthorRoutes = collectAuthorRoutes(blogFiles, [join(__dirname, '../src/_data/team'), join(__dirname, '../src/_data/guests')]) +const blogFiles = collectBlogFiles(join(__dirname, 'content/blog'), '/blog') +const blogAuthorRoutes = collectAuthorRoutes(blogFiles, [join(__dirname, 'data/team'), join(__dirname, 'data/guests')]) // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ @@ -207,10 +207,8 @@ export default defineNuxtConfig({ trailingSlash: true, }, - // Only covers content already served by Nuxt. The handbook is deliberately excluded - // (internal company content, not product documentation) - see README.md. Anything left - // on the legacy Eleventy site is not visible to @nuxt/content, so it is absent here too - // until it migrates - the named examples are gone now, so the list is not kept here. + // Covers the @nuxt/content collections. The handbook is deliberately excluded + // (internal company content, not product documentation) - see README.md. llms: { domain: site.baseURL, title: 'FlowFuse', @@ -219,10 +217,6 @@ export default defineNuxtConfig({ title: 'FlowFuse - Full Documentation', description: 'Complete FlowFuse documentation, blog, changelog, and resources in a single markdown document.', }, - notes: [ - 'This file only covers pages served by the Nuxt frontend. Some sections of flowfuse.com are still served by a legacy Eleventy site not represented here.', - ], - // /raw/<path>.md, the per-page markdown endpoint the links below point at, is served // by @nuxt/content's own llms feature rather than by nuxt-llms, and it searches every // page-type collection by default. That included the handbook, so the exclusion above @@ -308,31 +302,28 @@ export default defineNuxtConfig({ ...blogAuthorRoutes.map(loc => ({ loc, priority: 0.6 })), // /vs/<slug>/ is one [slug].vue over a `data` collection, so the module's // static-route discovery cannot see it and content-urls.get.ts cannot either - // (it keys on `path`, which a data collection has no equivalent of). The three - // pages left sitemap-legacy.xml when their .njk files were deleted, so without - // this they are in neither sitemap. + // (it keys on `path`, which a data collection has no equivalent of), so without + // this the three pages are missing from the sitemap. ...collectSlugRoutes(join(__dirname, 'content/vs'), '/vs').map(loc => ({ loc })), // /industries/<slug>/ is one [slug].vue over a `data` collection, so the // module's static-route discovery cannot see it, and content-urls.get.ts cannot // either (it keys on `path`, which a data collection has no equivalent of). - // Without this the seven pages are in neither sitemap, having left - // sitemap-legacy.xml when their .md files moved. /industries/automotive/ has its - // own .vue file, so that one is discovered normally. + // Without this the seven pages are missing from the sitemap. + // /industries/automotive/ has its own .vue file, so that one is discovered normally. ...collectSlugRoutes(join(__dirname, 'content/industries-legacy'), '/industries').map(loc => ({ loc })), // /landing/<slug>/ is one [slug].vue over a `data` collection, so the module's // static-route discovery cannot see it, and content-urls.get.ts cannot either // (it keys on `path`, which a data collection has no equivalent of). Without - // this they are in neither sitemap, having left sitemap-legacy.xml when their - // .njk files were deleted. `skipIndex` entries stay out, as they are noindex. + // this they are missing from the sitemap. `skipIndex` entries stay out, as they + // are noindex. ...readEntries(join(__dirname, 'content/landing')) .filter(entry => !entry.skipIndex) .map(entry => ({ loc: `/landing/${entry.slug}/` })), // The two operational use-cases render through pages/use-cases/[slug].vue over a // `data` collection, so the module's static-route discovery cannot see them, and // content-urls.get.ts cannot either (it keys on `path`, which a data collection - // has no equivalent of). Without this they are in neither sitemap, having left - // sitemap-legacy.xml when their .njk files were deleted. The six architecture - // pages have their own .vue files and are discovered normally. + // has no equivalent of). Without this they are missing from the sitemap. The six + // architecture pages have their own .vue files and are discovered normally. ...collectUseCaseRoutes(join(__dirname, 'content/use-cases')).map(loc => ({ loc })), ], exclude: ['/_studio/**', '/api/**'], @@ -343,15 +334,14 @@ export default defineNuxtConfig({ { userAgent: ['*'], allow: ['/'] }, { userAgent: ['Algolia Crawler'], allow: ['/'] }, ], - // sitemap.xml covers Nuxt-native pages; sitemap-legacy.xml (generated by 11ty, - // served as a static file from nuxt/public/) covers everything still on 11ty. - sitemap: [`${site.baseURL}/sitemap.xml`, `${site.baseURL}/sitemap-legacy.xml`], + sitemap: [`${site.baseURL}/sitemap.xml`], }, linkChecker: { failOnError: true, - // trailing-slash: 11ty pages use trailing slashes intentionally - // no-error-response: links to 11ty pages return 404 in the Nuxt-only static output + // trailing-slash: every URL on this site ends in one, by design (site.trailingSlash) + // no-error-response: skipped while 11ty pages were absent from this build's output; + // not re-checked since they all moved to Nuxt skipInspections: ['trailing-slash', 'no-error-response'], // By default the module re-inspects every prerendered page once the build finishes, // and that pass has grown with the page count: 4m34s over 251 routes on 28 Jul, @@ -411,11 +401,9 @@ export default defineNuxtConfig({ { textContent: "(function(){try{var u=new URL(location.href),p=u.searchParams;if(!p.get('code')||p.get('iss')!=='https://github.com/login/oauth')return;p.delete('code');p.delete('state');p.delete('iss');var q=p.toString();history.replaceState(history.state,'',u.pathname+(q?'?'+q:'')+u.hash)}catch(e){}})()", }, - // Explicit nav-click tracking. Source is src/js/nav-tracking.js; - // prod:eleventy-nuxt copies the 11ty output into nuxt/public/. + // Explicit nav-click tracking. Served straight from nuxt/public/js/. { src: '/js/nav-tracking.js', defer: true }, // Opens sign-up in a small popup window on desktop/tablet. - // Source is src/js/signup-popup.js; copied the same way as nav-tracking.js. { src: '/js/signup-popup.js', defer: true }, ] } @@ -463,23 +451,23 @@ export default defineNuxtConfig({ { baseName: 'analytics', // Nitro resolves this dir against nitro.srcDir (Nuxt's serverDir, i.e. nuxt/server), - // not against the nuxt/ root — so this needs one more level up than it looks like. - dir: '../../src/_includes/analytics' + // not against the nuxt/ root. + dir: 'assets/analytics' }, { baseName: 'team', - dir: '../src/_data/team' + dir: '../data/team' }, { baseName: 'guests', - dir: '../src/_data/guests' + dir: '../data/guests' } ], prerender: { routes: (() => { // The changelog listing is a single page now (grouped by release, revealed // as you scroll), so there are no /changelog/<n>/ pages to enumerate. - const changelog = collectChangelogRoutes(join(__dirname, '../src/changelog'), '/changelog') + const changelog = collectChangelogRoutes(join(__dirname, 'content/changelog'), '/changelog') const blogListingRoutes = paginatedListingRoutes('/blog', blogFiles.length) const blogTagRoutes = BLOG_TAGS.flatMap(tag => @@ -526,9 +514,8 @@ export default defineNuxtConfig({ '/use-cases/mes/', '/use-cases/scada/', '/use-cases/uns/', - // /ai is only linked from 11ty-generated HTML (nav, homepage), which the - // Nuxt prerender crawler never parses, so it has to be listed explicitly - // or the route is missing from nuxt/dist and every link to it breaks. + // crawlLinks is off, so a .vue page is prerendered only if it is listed here. + // Without this /ai is missing from nuxt/dist and every link to it breaks. '/ai', '/industries/automotive', '/industries/industrial-machinery', @@ -537,7 +524,7 @@ export default defineNuxtConfig({ ...collectSlugRoutes(join(__dirname, 'content/industries-legacy'), '/industries'), ...collectProductRoutes(join(__dirname, 'content/products')), '/webinars/', - ...collectWebinarRoutes(join(__dirname, '../src/webinars'), '/webinars'), + ...collectWebinarRoutes(join(__dirname, 'content/webinars'), '/webinars'), ...collectSlugRoutes(join(__dirname, 'content/vs'), '/vs'), @@ -589,7 +576,7 @@ export default defineNuxtConfig({ ...blogFiles.map(f => f.route), ...blogAuthorRoutes, ...collectHandbookRoutes(join(__dirname, 'content/handbook'), '/handbook'), - ...collectStoryRoutes(join(__dirname, '../src/customer-stories')), + ...collectStoryRoutes(join(__dirname, 'content/customer-stories')), ] })(), crawlLinks: false, @@ -703,6 +690,4 @@ export default defineNuxtConfig({ colors: ['primary', 'secondary', 'success', 'info', 'warning', 'error', 'highlight'] } }, - // Dev proxying to 11ty is handled by server/middleware/legacy.ts - // to allow per-route exclusions as pages are migrated. }) diff --git a/nuxt/pages/about/index.vue b/nuxt/pages/about/index.vue index 947dcb423c..ceb1dbe6b9 100644 --- a/nuxt/pages/about/index.vue +++ b/nuxt/pages/about/index.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/about.njk (11ty), which this replaces. Same page, same copy, same -// classes from src/css/style.css. +// classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - The team grid read the `team` global and sorted by `order`. It uses useStaff(), the @@ -104,8 +104,6 @@ useSchemaOrg([ improve their processes continuously. </p> <p> - <!-- Plain <a>, not <NuxtLink>: /platform/security/ is still an 11ty page, so - client-side routing would fall through to pages/[...slug].vue and 404. --> <a href="/platform/security/#certifications" class="text-indigo-600 hover:text-indigo-800 font-medium">See our security certifications</a> </p> </div> diff --git a/nuxt/pages/ai/index.vue b/nuxt/pages/ai/index.vue index a4e375e1b0..8529856545 100644 --- a/nuxt/pages/ai/index.vue +++ b/nuxt/pages/ai/index.vue @@ -1,7 +1,7 @@ <script setup lang="ts"> import { getAllBlogPosts } from '~/utils/sharedContent' // Ported from src/ai.njk (11ty), which this replaces. Same page, same copy, same -// classes from src/css/style.css, which nuxt.config.ts already links here. +// classes from nuxt/assets/css/style.css, which nuxt.config.ts already links here. // // What the port changes on purpose: // - The two hand-rolled DOM scripts (agent tabs, showcase rotation) become diff --git a/nuxt/pages/blueprints/submit.vue b/nuxt/pages/blueprints/submit.vue index d4d8dcadd5..332e4e70ee 100644 --- a/nuxt/pages/blueprints/submit.vue +++ b/nuxt/pages/blueprints/submit.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/blueprints/submit.njk (11ty), which this replaces. Same page, same copy, -// same classes from src/css/style.css. +// same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - The .njk used 11ty pagination (size 3) purely to slice three blueprints for the diff --git a/nuxt/pages/customer-stories/[slug].vue b/nuxt/pages/customer-stories/[slug].vue index 417ca1970f..7782c8eaf5 100644 --- a/nuxt/pages/customer-stories/[slug].vue +++ b/nuxt/pages/customer-stories/[slug].vue @@ -17,7 +17,7 @@ const { data: allStories } = await useAsyncData( const otherStories = computed(() => (allStories.value || []).filter(item => item.path !== page.value?.path)) -// Prefer resolving the quote byline from src/_data/team|guests/*.json (name/title/headshot) +// Prefer resolving the quote byline from nuxt/data/team|guests/*.json (name/title/headshot) // when `quoteAuthorSlug` is set; not every quoted person has a JSON entry, so fall back to // the manual quoteAuthor/quoteRole/quoteAvatar fields on `story`. const quoteAuthorMember = computed(() => useTeamMember(page.value?.story?.quoteAuthorSlug)) diff --git a/nuxt/pages/events/hannover-messe-2025.vue b/nuxt/pages/events/hannover-messe-2025.vue index 88cbb87b7d..bf7346d68f 100644 --- a/nuxt/pages/events/hannover-messe-2025.vue +++ b/nuxt/pages/events/hannover-messe-2025.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/events/hannover-messe-2025.njk (11ty), which this replaces. Same page, -// same copy, same classes from src/css/style.css. +// same copy, same classes from nuxt/assets/css/style.css. // // layouts/base.njk added only the header and footer, so this page is its own body. The // frontmatter blocks nothing else read become the consts below. diff --git a/nuxt/pages/events/hannover-messe-2026.vue b/nuxt/pages/events/hannover-messe-2026.vue index d99de4c96d..8fd01f0486 100644 --- a/nuxt/pages/events/hannover-messe-2026.vue +++ b/nuxt/pages/events/hannover-messe-2026.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/events/hannover-messe-2026.njk (11ty), which this replaces. Same page, -// same copy, same classes from src/css/style.css. +// same copy, same classes from nuxt/assets/css/style.css. // // layouts/base.njk added only the header and footer, so this page is its own body. The // frontmatter blocks nothing else read become the consts below. diff --git a/nuxt/pages/events/proveit-2026.vue b/nuxt/pages/events/proveit-2026.vue index 24bbf2c491..770a93f201 100644 --- a/nuxt/pages/events/proveit-2026.vue +++ b/nuxt/pages/events/proveit-2026.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/events/proveit-2026.njk (11ty), which this replaces. Same page, same -// copy, same classes from src/css/style.css. +// copy, same classes from nuxt/assets/css/style.css. // // layouts/base.njk added only the header and footer, so this page is its own body. // diff --git a/nuxt/pages/index.vue b/nuxt/pages/index.vue index db7096de78..2a01f1ca81 100644 --- a/nuxt/pages/index.vue +++ b/nuxt/pages/index.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/index.njk (11ty), which this replaces. Same page, same copy, same -// classes from src/css/style.css. This is the last 11ty-rendered route on the site. +// classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - The hero's cross-fading background becomes <HomeHeroSlides>, which replaces an diff --git a/nuxt/pages/industries/index.vue b/nuxt/pages/industries/index.vue index 898c58f58f..a741c54dfb 100644 --- a/nuxt/pages/industries/index.vue +++ b/nuxt/pages/industries/index.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/industries.njk (11ty), which this replaces. Same page, same copy, same -// classes from src/css/style.css. +// classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - collections["industry"] becomes two data collections merged into one card grid: diff --git a/nuxt/pages/landing/factory-efficiency.vue b/nuxt/pages/landing/factory-efficiency.vue index 0467c14759..0cbd6ee1f6 100644 --- a/nuxt/pages/landing/factory-efficiency.vue +++ b/nuxt/pages/landing/factory-efficiency.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/landing/factory-efficiency.njk (11ty), which this replaces. Same page, -// same copy, same classes from src/css/style.css. +// same copy, same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - The hero's two download buttons ran an inline onclick that both scrolled to the form diff --git a/nuxt/pages/landing/plc.vue b/nuxt/pages/landing/plc.vue index 3f74be6470..e725bc6409 100644 --- a/nuxt/pages/landing/plc.vue +++ b/nuxt/pages/landing/plc.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/landing/plc.njk (11ty), which this replaces. Same page, same copy, -// same classes from src/css/style.css. +// same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - The protocol/use-case glyphs are <UIcon>. They were {% include %}d raw with no diff --git a/nuxt/pages/landing/tulip.vue b/nuxt/pages/landing/tulip.vue index 37780532d3..3a6dc380f3 100644 --- a/nuxt/pages/landing/tulip.vue +++ b/nuxt/pages/landing/tulip.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/landing/tulip.njk (11ty), which this replaces. Same page, same copy, -// same classes from src/css/style.css. +// same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - The hero's two buttons ran an inline onclick that both scrolled to the form and diff --git a/nuxt/pages/node-red/index.vue b/nuxt/pages/node-red/index.vue index 03fd1b4f13..0bde5d90ca 100644 --- a/nuxt/pages/node-red/index.vue +++ b/nuxt/pages/node-red/index.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/node-red/index.njk (11ty), which this replaces. Same page, same copy, -// same classes from src/css/style.css. +// same classes from nuxt/assets/css/style.css. // // The rest of /node-red/ (the core-node reference and the hardware guides) already moved // into /docs/; this was the last page left under that prefix. diff --git a/nuxt/pages/partners/certify-hardware.vue b/nuxt/pages/partners/certify-hardware.vue index 6442013960..a3537517b8 100644 --- a/nuxt/pages/partners/certify-hardware.vue +++ b/nuxt/pages/partners/certify-hardware.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/partners/certify-hardware.njk (11ty), which this replaces. Same page, -// same copy, same classes from src/css/style.css. +// same copy, same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - The step glyphs were {% include %}d raw inside .ff-certify-list-icon. They are all diff --git a/nuxt/pages/partners/ctrlx.vue b/nuxt/pages/partners/ctrlx.vue index fded734ab2..3698378f97 100644 --- a/nuxt/pages/partners/ctrlx.vue +++ b/nuxt/pages/partners/ctrlx.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/partners/ctrlx.njk (11ty), which this replaces. Same page, same copy, -// same classes from src/css/style.css. +// same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - ctaBookDemo becomes <CtaBookDemo>. diff --git a/nuxt/pages/partners/index.vue b/nuxt/pages/partners/index.vue index b4bb90d8f2..37c0fbaad1 100644 --- a/nuxt/pages/partners/index.vue +++ b/nuxt/pages/partners/index.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/partners/index.njk (11ty), which this replaces. Same page, same copy, -// same classes from src/css/style.css. +// same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - The section headings carried <span class="text-indigo-600"> in frontmatter, printed diff --git a/nuxt/pages/partners/referral-sign-up.vue b/nuxt/pages/partners/referral-sign-up.vue index 9bdf15a3d3..31580d0022 100644 --- a/nuxt/pages/partners/referral-sign-up.vue +++ b/nuxt/pages/partners/referral-sign-up.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/partners/referral-sign-up.njk (11ty), which this replaces. Same page, -// same copy, same classes from src/css/style.css. +// same copy, same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - hs-form.njk becomes <HubSpotForm>, keeping the same form id, cta event and diff --git a/nuxt/pages/platform/dashboard.vue b/nuxt/pages/platform/dashboard.vue index fd9eb8ab7c..104bc963e0 100644 --- a/nuxt/pages/platform/dashboard.vue +++ b/nuxt/pages/platform/dashboard.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/platform/dashboard.njk (11ty), which this replaces. Same page, same -// copy, same classes from src/css/style.css. +// copy, same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - The live theme preview and the Dashboard 1.0 importer become diff --git a/nuxt/pages/platform/why-flowfuse.vue b/nuxt/pages/platform/why-flowfuse.vue index 5e74ab555d..ccf0c75494 100644 --- a/nuxt/pages/platform/why-flowfuse.vue +++ b/nuxt/pages/platform/why-flowfuse.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/platform/why-flowfuse.njk (11ty), which this replaces. Same page, same -// copy, same classes from src/css/style.css. +// copy, same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - The two hand-written <lite-youtube> elements become <LiteYoutube>, shared with the diff --git a/nuxt/pages/use-cases/data-integration.vue b/nuxt/pages/use-cases/data-integration.vue index ae6ec1a011..b8d62fcc17 100644 --- a/nuxt/pages/use-cases/data-integration.vue +++ b/nuxt/pages/use-cases/data-integration.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/use-cases/data-integration.njk (11ty), which this replaces. Same page, -// same copy, same classes from src/css/style.css. +// same copy, same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - layouts/solution.njk's hero becomes <UseCaseSolutionHero>, with the frontmatter diff --git a/nuxt/pages/use-cases/index.vue b/nuxt/pages/use-cases/index.vue index 0a7ca0937a..9d398ec294 100644 --- a/nuxt/pages/use-cases/index.vue +++ b/nuxt/pages/use-cases/index.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/use-cases.njk (11ty), which this replaces. Same page, same copy, same -// classes from src/css/style.css. +// classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - collections["use-case"] becomes the `useCases` data collection. Whether an entry diff --git a/nuxt/pages/use-cases/it-ot-middleware.vue b/nuxt/pages/use-cases/it-ot-middleware.vue index 2a4556875c..0d25138e77 100644 --- a/nuxt/pages/use-cases/it-ot-middleware.vue +++ b/nuxt/pages/use-cases/it-ot-middleware.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/use-cases/it-ot-middleware.njk (11ty), which this replaces. Same page, -// same copy, same classes from src/css/style.css. +// same copy, same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - layouts/solution.njk's hero becomes <UseCaseSolutionHero>, with the frontmatter @@ -15,9 +15,8 @@ // - The three deployment-card headings carried a stray </br>, which is not a tag. // They are plain headings here. // - The reading-list and resources thumbnails point at /blog/**, /whitepaper/** and -// /resources/** - assets owned by sections still on 11ty. They stay where they are and -// move wholesale at teardown; the page's own art is copied into nuxt/public/images/, -// which is where the already-ported pages keep theirs. +// /resources/** - assets owned by those sections, in nuxt/public/ at the same paths. +// The page's own art is in nuxt/public/images/. const capture = useCapture() const FEATURES = [ diff --git a/nuxt/pages/use-cases/mes.vue b/nuxt/pages/use-cases/mes.vue index af7d01424e..d3a561b4cb 100644 --- a/nuxt/pages/use-cases/mes.vue +++ b/nuxt/pages/use-cases/mes.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/use-cases/mes.njk (11ty), which this replaces. Same page, same copy, -// same classes from src/css/style.css. +// same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - The page's frontmatter carried markup (heading spans, inline links) that the .njk diff --git a/nuxt/pages/use-cases/scada.vue b/nuxt/pages/use-cases/scada.vue index 1ae35f5022..ba8e24a4f4 100644 --- a/nuxt/pages/use-cases/scada.vue +++ b/nuxt/pages/use-cases/scada.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/use-cases/scada.njk (11ty), which this replaces. Same page, same copy, -// same classes from src/css/style.css. +// same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - Frontmatter that carried markup (the heading spans) is written as template markup diff --git a/nuxt/pages/use-cases/uns.vue b/nuxt/pages/use-cases/uns.vue index 1be9248e75..8fbc167ac9 100644 --- a/nuxt/pages/use-cases/uns.vue +++ b/nuxt/pages/use-cases/uns.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/use-cases/uns.njk (11ty), which this replaces. Same page, same copy, -// same classes from src/css/style.css. +// same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - The five feature icons were {% include %}d straight from @@ -13,9 +13,8 @@ // - The "From Data Source to Application:" heading used </br>, which is not a tag. It is // a <br> here, which is what it was reaching for. // - The reading-list and resources thumbnails point at /blog/**, /whitepaper/** and -// /resources/** - assets owned by sections still on 11ty. They stay where they are and -// move wholesale at teardown; the page's own art is copied into nuxt/public/images/, -// which is where the already-ported pages keep theirs. +// /resources/** - assets owned by those sections, in nuxt/public/ at the same paths. +// The page's own art is in nuxt/public/images/. const FEATURES = [ { icon: 'i-heroicons-circle-stack', title: 'Break down data silos', description: 'Access data from any source, regardless of its format or location and make it available through a central hub. ' }, { icon: 'i-heroicons-eye', title: 'Gain real-time visibility', description: 'Monitor your operations with interactive visual dashboards.' }, diff --git a/nuxt/pages/vs/[slug].vue b/nuxt/pages/vs/[slug].vue index b65466bc56..9c016594d4 100644 --- a/nuxt/pages/vs/[slug].vue +++ b/nuxt/pages/vs/[slug].vue @@ -36,7 +36,7 @@ if (!page.value) { const capture = useCapture() const resolveHref = useResolveHref() -// hero.buttonLink and cta.linkHref are "site:" pointers into src/_data/site.json, so the +// hero.buttonLink and cta.linkHref are "site:" pointers into nuxt/data/site.json, so the // meeting-booker URL the three pages share lives in one place. const migrationExpertHref = computed(() => resolveHref(page.value?.hero.buttonLink)) diff --git a/nuxt/pages/webinars/[...slug].vue b/nuxt/pages/webinars/[...slug].vue index 636a4e0587..3daff7a464 100644 --- a/nuxt/pages/webinars/[...slug].vue +++ b/nuxt/pages/webinars/[...slug].vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/_includes/layouts/webinar.njk (11ty), which this replaces. Same page, -// same copy, same classes from src/css/style.css. +// same copy, same classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - The hand-written <lite-youtube> element and the hs-form.njk include become diff --git a/nuxt/pages/webinars/index.vue b/nuxt/pages/webinars/index.vue index 7b4b2cc62a..d36cf981c0 100644 --- a/nuxt/pages/webinars/index.vue +++ b/nuxt/pages/webinars/index.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> // Ported from src/webinars.njk (11ty), which this replaces. Same page, same copy, same -// classes from src/css/style.css. +// classes from nuxt/assets/css/style.css. // // What the port changes on purpose: // - collections.event became queryCollection('webinars'). The 11ty collection was built diff --git a/src/public/.well-known/security.txt b/nuxt/public/.well-known/security.txt similarity index 100% rename from src/public/.well-known/security.txt rename to nuxt/public/.well-known/security.txt diff --git a/src/public/CNAME b/nuxt/public/CNAME similarity index 100% rename from src/public/CNAME rename to nuxt/public/CNAME diff --git a/src/public/android-chrome-192x192.png b/nuxt/public/android-chrome-192x192.png similarity index 100% rename from src/public/android-chrome-192x192.png rename to nuxt/public/android-chrome-192x192.png diff --git a/src/public/android-chrome-512x512.png b/nuxt/public/android-chrome-512x512.png similarity index 100% rename from src/public/android-chrome-512x512.png rename to nuxt/public/android-chrome-512x512.png diff --git a/src/public/apple-touch-icon.png b/nuxt/public/apple-touch-icon.png similarity index 100% rename from src/public/apple-touch-icon.png rename to nuxt/public/apple-touch-icon.png diff --git a/src/blog/2022/05/images/beta_stack.webm b/nuxt/public/blog/2022/05/images/beta_stack.webm similarity index 100% rename from src/blog/2022/05/images/beta_stack.webm rename to nuxt/public/blog/2022/05/images/beta_stack.webm diff --git a/src/blog/2022/05/images/ff-05-dashboard.png b/nuxt/public/blog/2022/05/images/ff-05-dashboard.png similarity index 100% rename from src/blog/2022/05/images/ff-05-dashboard.png rename to nuxt/public/blog/2022/05/images/ff-05-dashboard.png diff --git a/src/blog/2022/07/images/ff-07-theme.png b/nuxt/public/blog/2022/07/images/ff-07-theme.png similarity index 100% rename from src/blog/2022/07/images/ff-07-theme.png rename to nuxt/public/blog/2022/07/images/ff-07-theme.png diff --git a/src/blog/2022/07/images/project-type.png b/nuxt/public/blog/2022/07/images/project-type.png similarity index 100% rename from src/blog/2022/07/images/project-type.png rename to nuxt/public/blog/2022/07/images/project-type.png diff --git a/src/blog/2022/08/images/ProjectLink.webm b/nuxt/public/blog/2022/08/images/ProjectLink.webm similarity index 100% rename from src/blog/2022/08/images/ProjectLink.webm rename to nuxt/public/blog/2022/08/images/ProjectLink.webm diff --git a/src/blog/2022/10/images/1.png b/nuxt/public/blog/2022/10/images/1.png similarity index 100% rename from src/blog/2022/10/images/1.png rename to nuxt/public/blog/2022/10/images/1.png diff --git a/src/blog/2022/10/images/10.png b/nuxt/public/blog/2022/10/images/10.png similarity index 100% rename from src/blog/2022/10/images/10.png rename to nuxt/public/blog/2022/10/images/10.png diff --git a/src/blog/2022/10/images/11.png b/nuxt/public/blog/2022/10/images/11.png similarity index 100% rename from src/blog/2022/10/images/11.png rename to nuxt/public/blog/2022/10/images/11.png diff --git a/src/blog/2022/10/images/12.png b/nuxt/public/blog/2022/10/images/12.png similarity index 100% rename from src/blog/2022/10/images/12.png rename to nuxt/public/blog/2022/10/images/12.png diff --git a/src/blog/2022/10/images/13.png b/nuxt/public/blog/2022/10/images/13.png similarity index 100% rename from src/blog/2022/10/images/13.png rename to nuxt/public/blog/2022/10/images/13.png diff --git a/src/blog/2022/10/images/14.png b/nuxt/public/blog/2022/10/images/14.png similarity index 100% rename from src/blog/2022/10/images/14.png rename to nuxt/public/blog/2022/10/images/14.png diff --git a/src/blog/2022/10/images/2.png b/nuxt/public/blog/2022/10/images/2.png similarity index 100% rename from src/blog/2022/10/images/2.png rename to nuxt/public/blog/2022/10/images/2.png diff --git a/src/blog/2022/10/images/3.png b/nuxt/public/blog/2022/10/images/3.png similarity index 100% rename from src/blog/2022/10/images/3.png rename to nuxt/public/blog/2022/10/images/3.png diff --git a/src/blog/2022/10/images/4.png b/nuxt/public/blog/2022/10/images/4.png similarity index 100% rename from src/blog/2022/10/images/4.png rename to nuxt/public/blog/2022/10/images/4.png diff --git a/src/blog/2022/10/images/5.png b/nuxt/public/blog/2022/10/images/5.png similarity index 100% rename from src/blog/2022/10/images/5.png rename to nuxt/public/blog/2022/10/images/5.png diff --git a/src/blog/2022/10/images/6.png b/nuxt/public/blog/2022/10/images/6.png similarity index 100% rename from src/blog/2022/10/images/6.png rename to nuxt/public/blog/2022/10/images/6.png diff --git a/src/blog/2022/10/images/7.png b/nuxt/public/blog/2022/10/images/7.png similarity index 100% rename from src/blog/2022/10/images/7.png rename to nuxt/public/blog/2022/10/images/7.png diff --git a/src/blog/2022/10/images/8.png b/nuxt/public/blog/2022/10/images/8.png similarity index 100% rename from src/blog/2022/10/images/8.png rename to nuxt/public/blog/2022/10/images/8.png diff --git a/src/blog/2022/10/images/9.png b/nuxt/public/blog/2022/10/images/9.png similarity index 100% rename from src/blog/2022/10/images/9.png rename to nuxt/public/blog/2022/10/images/9.png diff --git a/src/blog/2022/12/images/audit-log.png b/nuxt/public/blog/2022/12/images/audit-log.png similarity index 100% rename from src/blog/2022/12/images/audit-log.png rename to nuxt/public/blog/2022/12/images/audit-log.png diff --git a/src/blog/2022/12/images/clue-capers.jpg b/nuxt/public/blog/2022/12/images/clue-capers.jpg similarity index 100% rename from src/blog/2022/12/images/clue-capers.jpg rename to nuxt/public/blog/2022/12/images/clue-capers.jpg diff --git a/src/blog/2022/12/images/compact-bad.png b/nuxt/public/blog/2022/12/images/compact-bad.png similarity index 100% rename from src/blog/2022/12/images/compact-bad.png rename to nuxt/public/blog/2022/12/images/compact-bad.png diff --git a/src/blog/2022/12/images/compact-good.png b/nuxt/public/blog/2022/12/images/compact-good.png similarity index 100% rename from src/blog/2022/12/images/compact-good.png rename to nuxt/public/blog/2022/12/images/compact-good.png diff --git a/src/blog/2022/12/images/edit-http-node.png b/nuxt/public/blog/2022/12/images/edit-http-node.png similarity index 100% rename from src/blog/2022/12/images/edit-http-node.png rename to nuxt/public/blog/2022/12/images/edit-http-node.png diff --git a/src/blog/2022/12/images/flowdown-bad.png b/nuxt/public/blog/2022/12/images/flowdown-bad.png similarity index 100% rename from src/blog/2022/12/images/flowdown-bad.png rename to nuxt/public/blog/2022/12/images/flowdown-bad.png diff --git a/src/blog/2022/12/images/flowdown-good.png b/nuxt/public/blog/2022/12/images/flowdown-good.png similarity index 100% rename from src/blog/2022/12/images/flowdown-good.png rename to nuxt/public/blog/2022/12/images/flowdown-good.png diff --git a/src/blog/2022/12/images/groupwires-bad.png b/nuxt/public/blog/2022/12/images/groupwires-bad.png similarity index 100% rename from src/blog/2022/12/images/groupwires-bad.png rename to nuxt/public/blog/2022/12/images/groupwires-bad.png diff --git a/src/blog/2022/12/images/groupwires-good.png b/nuxt/public/blog/2022/12/images/groupwires-good.png similarity index 100% rename from src/blog/2022/12/images/groupwires-good.png rename to nuxt/public/blog/2022/12/images/groupwires-good.png diff --git a/src/blog/2022/12/images/https-working.png b/nuxt/public/blog/2022/12/images/https-working.png similarity index 100% rename from src/blog/2022/12/images/https-working.png rename to nuxt/public/blog/2022/12/images/https-working.png diff --git a/src/blog/2022/12/images/link-bad.png b/nuxt/public/blog/2022/12/images/link-bad.png similarity index 100% rename from src/blog/2022/12/images/link-bad.png rename to nuxt/public/blog/2022/12/images/link-bad.png diff --git a/src/blog/2022/12/images/link-good.png b/nuxt/public/blog/2022/12/images/link-good.png similarity index 100% rename from src/blog/2022/12/images/link-good.png rename to nuxt/public/blog/2022/12/images/link-good.png diff --git a/src/blog/2022/12/images/name-bad.png b/nuxt/public/blog/2022/12/images/name-bad.png similarity index 100% rename from src/blog/2022/12/images/name-bad.png rename to nuxt/public/blog/2022/12/images/name-bad.png diff --git a/src/blog/2022/12/images/name-good.png b/nuxt/public/blog/2022/12/images/name-good.png similarity index 100% rename from src/blog/2022/12/images/name-good.png rename to nuxt/public/blog/2022/12/images/name-good.png diff --git a/src/blog/2022/12/images/switch-bad.png b/nuxt/public/blog/2022/12/images/switch-bad.png similarity index 100% rename from src/blog/2022/12/images/switch-bad.png rename to nuxt/public/blog/2022/12/images/switch-bad.png diff --git a/src/blog/2022/12/images/switch-good.png b/nuxt/public/blog/2022/12/images/switch-good.png similarity index 100% rename from src/blog/2022/12/images/switch-good.png rename to nuxt/public/blog/2022/12/images/switch-good.png diff --git a/src/blog/2022/12/images/view-the-flow.png b/nuxt/public/blog/2022/12/images/view-the-flow.png similarity index 100% rename from src/blog/2022/12/images/view-the-flow.png rename to nuxt/public/blog/2022/12/images/view-the-flow.png diff --git a/src/blog/2022/12/images/wires-bad.png b/nuxt/public/blog/2022/12/images/wires-bad.png similarity index 100% rename from src/blog/2022/12/images/wires-bad.png rename to nuxt/public/blog/2022/12/images/wires-bad.png diff --git a/src/blog/2022/12/images/wires-good.png b/nuxt/public/blog/2022/12/images/wires-good.png similarity index 100% rename from src/blog/2022/12/images/wires-good.png rename to nuxt/public/blog/2022/12/images/wires-good.png diff --git a/src/blog/2023/01/images/flowforge-130-hero.png b/nuxt/public/blog/2023/01/images/flowforge-130-hero.png similarity index 100% rename from src/blog/2023/01/images/flowforge-130-hero.png rename to nuxt/public/blog/2023/01/images/flowforge-130-hero.png diff --git a/src/blog/2023/01/images/flowforge-set-env-var.png b/nuxt/public/blog/2023/01/images/flowforge-set-env-var.png similarity index 100% rename from src/blog/2023/01/images/flowforge-set-env-var.png rename to nuxt/public/blog/2023/01/images/flowforge-set-env-var.png diff --git a/src/blog/2023/01/images/getting-started-nr.png b/nuxt/public/blog/2023/01/images/getting-started-nr.png similarity index 100% rename from src/blog/2023/01/images/getting-started-nr.png rename to nuxt/public/blog/2023/01/images/getting-started-nr.png diff --git a/src/blog/2023/01/images/node-red-use-env-var.png b/nuxt/public/blog/2023/01/images/node-red-use-env-var.png similarity index 100% rename from src/blog/2023/01/images/node-red-use-env-var.png rename to nuxt/public/blog/2023/01/images/node-red-use-env-var.png diff --git a/src/blog/2023/01/images/response-code.png b/nuxt/public/blog/2023/01/images/response-code.png similarity index 100% rename from src/blog/2023/01/images/response-code.png rename to nuxt/public/blog/2023/01/images/response-code.png diff --git a/src/blog/2023/01/images/set-reply.png b/nuxt/public/blog/2023/01/images/set-reply.png similarity index 100% rename from src/blog/2023/01/images/set-reply.png rename to nuxt/public/blog/2023/01/images/set-reply.png diff --git a/src/blog/2023/01/images/three-nodes.png b/nuxt/public/blog/2023/01/images/three-nodes.png similarity index 100% rename from src/blog/2023/01/images/three-nodes.png rename to nuxt/public/blog/2023/01/images/three-nodes.png diff --git a/src/blog/2023/02/images/chart-flow.png b/nuxt/public/blog/2023/02/images/chart-flow.png similarity index 100% rename from src/blog/2023/02/images/chart-flow.png rename to nuxt/public/blog/2023/02/images/chart-flow.png diff --git a/src/blog/2023/02/images/debug-jump.webm b/nuxt/public/blog/2023/02/images/debug-jump.webm similarity index 100% rename from src/blog/2023/02/images/debug-jump.webm rename to nuxt/public/blog/2023/02/images/debug-jump.webm diff --git a/src/blog/2023/02/images/delete-subflow.png b/nuxt/public/blog/2023/02/images/delete-subflow.png similarity index 100% rename from src/blog/2023/02/images/delete-subflow.png rename to nuxt/public/blog/2023/02/images/delete-subflow.png diff --git a/src/blog/2023/02/images/deploy.webm b/nuxt/public/blog/2023/02/images/deploy.webm similarity index 100% rename from src/blog/2023/02/images/deploy.webm rename to nuxt/public/blog/2023/02/images/deploy.webm diff --git a/src/blog/2023/02/images/ff-r14-image.png b/nuxt/public/blog/2023/02/images/ff-r14-image.png similarity index 100% rename from src/blog/2023/02/images/ff-r14-image.png rename to nuxt/public/blog/2023/02/images/ff-r14-image.png diff --git a/src/blog/2023/02/images/flogger.webm b/nuxt/public/blog/2023/02/images/flogger.webm similarity index 100% rename from src/blog/2023/02/images/flogger.webm rename to nuxt/public/blog/2023/02/images/flogger.webm diff --git a/src/blog/2023/02/images/join-wires.webm b/nuxt/public/blog/2023/02/images/join-wires.webm similarity index 100% rename from src/blog/2023/02/images/join-wires.webm rename to nuxt/public/blog/2023/02/images/join-wires.webm diff --git a/src/blog/2023/02/images/load-node.webm b/nuxt/public/blog/2023/02/images/load-node.webm similarity index 100% rename from src/blog/2023/02/images/load-node.webm rename to nuxt/public/blog/2023/02/images/load-node.webm diff --git a/src/blog/2023/02/images/moment.png b/nuxt/public/blog/2023/02/images/moment.png similarity index 100% rename from src/blog/2023/02/images/moment.png rename to nuxt/public/blog/2023/02/images/moment.png diff --git a/src/blog/2023/02/images/rate-limit.webm b/nuxt/public/blog/2023/02/images/rate-limit.webm similarity index 100% rename from src/blog/2023/02/images/rate-limit.webm rename to nuxt/public/blog/2023/02/images/rate-limit.webm diff --git a/src/blog/2023/02/images/roadmap-unsplash.jpg b/nuxt/public/blog/2023/02/images/roadmap-unsplash.jpg similarity index 100% rename from src/blog/2023/02/images/roadmap-unsplash.jpg rename to nuxt/public/blog/2023/02/images/roadmap-unsplash.jpg diff --git a/src/blog/2023/02/images/split-with-link.webm b/nuxt/public/blog/2023/02/images/split-with-link.webm similarity index 100% rename from src/blog/2023/02/images/split-with-link.webm rename to nuxt/public/blog/2023/02/images/split-with-link.webm diff --git a/src/blog/2023/02/images/tile-ming.jpg b/nuxt/public/blog/2023/02/images/tile-ming.jpg similarity index 100% rename from src/blog/2023/02/images/tile-ming.jpg rename to nuxt/public/blog/2023/02/images/tile-ming.jpg diff --git a/src/blog/2023/02/images/twitch.webp b/nuxt/public/blog/2023/02/images/twitch.webp similarity index 100% rename from src/blog/2023/02/images/twitch.webp rename to nuxt/public/blog/2023/02/images/twitch.webp diff --git a/src/blog/2023/03/images/Flowforge-Concepts.png b/nuxt/public/blog/2023/03/images/Flowforge-Concepts.png similarity index 100% rename from src/blog/2023/03/images/Flowforge-Concepts.png rename to nuxt/public/blog/2023/03/images/Flowforge-Concepts.png diff --git a/src/blog/2023/03/images/catch.webm b/nuxt/public/blog/2023/03/images/catch.webm similarity index 100% rename from src/blog/2023/03/images/catch.webm rename to nuxt/public/blog/2023/03/images/catch.webm diff --git a/src/blog/2023/03/images/concept-changes.png b/nuxt/public/blog/2023/03/images/concept-changes.png similarity index 100% rename from src/blog/2023/03/images/concept-changes.png rename to nuxt/public/blog/2023/03/images/concept-changes.png diff --git a/src/blog/2023/03/images/counting-debug.webm b/nuxt/public/blog/2023/03/images/counting-debug.webm similarity index 100% rename from src/blog/2023/03/images/counting-debug.webm rename to nuxt/public/blog/2023/03/images/counting-debug.webm diff --git a/src/blog/2023/03/images/dashboard-activity.png b/nuxt/public/blog/2023/03/images/dashboard-activity.png similarity index 100% rename from src/blog/2023/03/images/dashboard-activity.png rename to nuxt/public/blog/2023/03/images/dashboard-activity.png diff --git a/src/blog/2023/03/images/example.webm b/nuxt/public/blog/2023/03/images/example.webm similarity index 100% rename from src/blog/2023/03/images/example.webm rename to nuxt/public/blog/2023/03/images/example.webm diff --git a/src/blog/2023/03/images/exec-example.webm b/nuxt/public/blog/2023/03/images/exec-example.webm similarity index 100% rename from src/blog/2023/03/images/exec-example.webm rename to nuxt/public/blog/2023/03/images/exec-example.webm diff --git a/src/blog/2023/03/images/ff-installed-modules.png b/nuxt/public/blog/2023/03/images/ff-installed-modules.png similarity index 100% rename from src/blog/2023/03/images/ff-installed-modules.png rename to nuxt/public/blog/2023/03/images/ff-installed-modules.png diff --git a/src/blog/2023/03/images/filter-config.png b/nuxt/public/blog/2023/03/images/filter-config.png similarity index 100% rename from src/blog/2023/03/images/filter-config.png rename to nuxt/public/blog/2023/03/images/filter-config.png diff --git a/src/blog/2023/03/images/filter-example.webm b/nuxt/public/blog/2023/03/images/filter-example.webm similarity index 100% rename from src/blog/2023/03/images/filter-example.webm rename to nuxt/public/blog/2023/03/images/filter-example.webm diff --git a/src/blog/2023/03/images/flexdash-activity.png b/nuxt/public/blog/2023/03/images/flexdash-activity.png similarity index 100% rename from src/blog/2023/03/images/flexdash-activity.png rename to nuxt/public/blog/2023/03/images/flexdash-activity.png diff --git a/src/blog/2023/03/images/function-example.webm b/nuxt/public/blog/2023/03/images/function-example.webm similarity index 100% rename from src/blog/2023/03/images/function-example.webm rename to nuxt/public/blog/2023/03/images/function-example.webm diff --git a/src/blog/2023/03/images/function-nodes.png b/nuxt/public/blog/2023/03/images/function-nodes.png similarity index 100% rename from src/blog/2023/03/images/function-nodes.png rename to nuxt/public/blog/2023/03/images/function-nodes.png diff --git a/src/blog/2023/03/images/groups.webm b/nuxt/public/blog/2023/03/images/groups.webm similarity index 100% rename from src/blog/2023/03/images/groups.webm rename to nuxt/public/blog/2023/03/images/groups.webm diff --git a/src/blog/2023/03/images/import-export.webm b/nuxt/public/blog/2023/03/images/import-export.webm similarity index 100% rename from src/blog/2023/03/images/import-export.webm rename to nuxt/public/blog/2023/03/images/import-export.webm diff --git a/src/blog/2023/03/images/integration-platform-blog-image.jpg b/nuxt/public/blog/2023/03/images/integration-platform-blog-image.jpg similarity index 100% rename from src/blog/2023/03/images/integration-platform-blog-image.jpg rename to nuxt/public/blog/2023/03/images/integration-platform-blog-image.jpg diff --git a/src/blog/2023/03/images/jsonata.png b/nuxt/public/blog/2023/03/images/jsonata.png similarity index 100% rename from src/blog/2023/03/images/jsonata.png rename to nuxt/public/blog/2023/03/images/jsonata.png diff --git a/src/blog/2023/03/images/no-function-example.webm b/nuxt/public/blog/2023/03/images/no-function-example.webm similarity index 100% rename from src/blog/2023/03/images/no-function-example.webm rename to nuxt/public/blog/2023/03/images/no-function-example.webm diff --git a/src/blog/2023/03/images/nr-manage-palette-cloudant.png b/nuxt/public/blog/2023/03/images/nr-manage-palette-cloudant.png similarity index 100% rename from src/blog/2023/03/images/nr-manage-palette-cloudant.png rename to nuxt/public/blog/2023/03/images/nr-manage-palette-cloudant.png diff --git a/src/blog/2023/03/images/release-150.jpg b/nuxt/public/blog/2023/03/images/release-150.jpg similarity index 100% rename from src/blog/2023/03/images/release-150.jpg rename to nuxt/public/blog/2023/03/images/release-150.jpg diff --git a/src/blog/2023/03/images/screenshot-applications.png b/nuxt/public/blog/2023/03/images/screenshot-applications.png similarity index 100% rename from src/blog/2023/03/images/screenshot-applications.png rename to nuxt/public/blog/2023/03/images/screenshot-applications.png diff --git a/src/blog/2023/03/images/screenshot-devices.png b/nuxt/public/blog/2023/03/images/screenshot-devices.png similarity index 100% rename from src/blog/2023/03/images/screenshot-devices.png rename to nuxt/public/blog/2023/03/images/screenshot-devices.png diff --git a/src/blog/2023/03/images/screenshot-instance.png b/nuxt/public/blog/2023/03/images/screenshot-instance.png similarity index 100% rename from src/blog/2023/03/images/screenshot-instance.png rename to nuxt/public/blog/2023/03/images/screenshot-instance.png diff --git a/src/blog/2023/03/images/screenshot-instances.png b/nuxt/public/blog/2023/03/images/screenshot-instances.png similarity index 100% rename from src/blog/2023/03/images/screenshot-instances.png rename to nuxt/public/blog/2023/03/images/screenshot-instances.png diff --git a/src/blog/2023/03/images/setup-counting-debug.png b/nuxt/public/blog/2023/03/images/setup-counting-debug.png similarity index 100% rename from src/blog/2023/03/images/setup-counting-debug.png rename to nuxt/public/blog/2023/03/images/setup-counting-debug.png diff --git a/src/blog/2023/03/images/smooth.png b/nuxt/public/blog/2023/03/images/smooth.png similarity index 100% rename from src/blog/2023/03/images/smooth.png rename to nuxt/public/blog/2023/03/images/smooth.png diff --git a/src/blog/2023/03/images/uibuilder-activity.png b/nuxt/public/blog/2023/03/images/uibuilder-activity.png similarity index 100% rename from src/blog/2023/03/images/uibuilder-activity.png rename to nuxt/public/blog/2023/03/images/uibuilder-activity.png diff --git a/src/blog/2023/04/images/HMI2023.png b/nuxt/public/blog/2023/04/images/HMI2023.png similarity index 100% rename from src/blog/2023/04/images/HMI2023.png rename to nuxt/public/blog/2023/04/images/HMI2023.png diff --git a/src/blog/2023/04/images/editor-off.png b/nuxt/public/blog/2023/04/images/editor-off.png similarity index 100% rename from src/blog/2023/04/images/editor-off.png rename to nuxt/public/blog/2023/04/images/editor-off.png diff --git a/src/blog/2023/04/images/editor-on.png b/nuxt/public/blog/2023/04/images/editor-on.png similarity index 100% rename from src/blog/2023/04/images/editor-on.png rename to nuxt/public/blog/2023/04/images/editor-on.png diff --git a/src/blog/2023/04/images/flow-using-range.png b/nuxt/public/blog/2023/04/images/flow-using-range.png similarity index 100% rename from src/blog/2023/04/images/flow-using-range.png rename to nuxt/public/blog/2023/04/images/flow-using-range.png diff --git a/src/blog/2023/04/images/flow-with-link-nodes.png b/nuxt/public/blog/2023/04/images/flow-with-link-nodes.png similarity index 100% rename from src/blog/2023/04/images/flow-with-link-nodes.png rename to nuxt/public/blog/2023/04/images/flow-with-link-nodes.png diff --git a/src/blog/2023/04/images/flow-without-link-nodes.png b/nuxt/public/blog/2023/04/images/flow-without-link-nodes.png similarity index 100% rename from src/blog/2023/04/images/flow-without-link-nodes.png rename to nuxt/public/blog/2023/04/images/flow-without-link-nodes.png diff --git a/src/blog/2023/04/images/login.webm b/nuxt/public/blog/2023/04/images/login.webm similarity index 100% rename from src/blog/2023/04/images/login.webm rename to nuxt/public/blog/2023/04/images/login.webm diff --git a/src/blog/2023/04/images/ls.png b/nuxt/public/blog/2023/04/images/ls.png similarity index 100% rename from src/blog/2023/04/images/ls.png rename to nuxt/public/blog/2023/04/images/ls.png diff --git a/src/blog/2023/04/images/no-subflow.png b/nuxt/public/blog/2023/04/images/no-subflow.png similarity index 100% rename from src/blog/2023/04/images/no-subflow.png rename to nuxt/public/blog/2023/04/images/no-subflow.png diff --git a/src/blog/2023/04/images/nr-via-vpn.png b/nuxt/public/blog/2023/04/images/nr-via-vpn.png similarity index 100% rename from src/blog/2023/04/images/nr-via-vpn.png rename to nuxt/public/blog/2023/04/images/nr-via-vpn.png diff --git a/src/blog/2023/04/images/password.png b/nuxt/public/blog/2023/04/images/password.png similarity index 100% rename from src/blog/2023/04/images/password.png rename to nuxt/public/blog/2023/04/images/password.png diff --git a/src/blog/2023/04/images/range-config.png b/nuxt/public/blog/2023/04/images/range-config.png similarity index 100% rename from src/blog/2023/04/images/range-config.png rename to nuxt/public/blog/2023/04/images/range-config.png diff --git a/src/blog/2023/04/images/range-demo.webm b/nuxt/public/blog/2023/04/images/range-demo.webm similarity index 100% rename from src/blog/2023/04/images/range-demo.webm rename to nuxt/public/blog/2023/04/images/range-demo.webm diff --git a/src/blog/2023/04/images/release-1.6.0.png b/nuxt/public/blog/2023/04/images/release-1.6.0.png similarity index 100% rename from src/blog/2023/04/images/release-1.6.0.png rename to nuxt/public/blog/2023/04/images/release-1.6.0.png diff --git a/src/blog/2023/04/images/security-header.png b/nuxt/public/blog/2023/04/images/security-header.png similarity index 100% rename from src/blog/2023/04/images/security-header.png rename to nuxt/public/blog/2023/04/images/security-header.png diff --git a/src/blog/2023/04/images/subflow.png b/nuxt/public/blog/2023/04/images/subflow.png similarity index 100% rename from src/blog/2023/04/images/subflow.png rename to nuxt/public/blog/2023/04/images/subflow.png diff --git a/src/blog/2023/04/images/tailscale.png b/nuxt/public/blog/2023/04/images/tailscale.png similarity index 100% rename from src/blog/2023/04/images/tailscale.png rename to nuxt/public/blog/2023/04/images/tailscale.png diff --git a/src/blog/2023/04/images/using-the-subflow.png b/nuxt/public/blog/2023/04/images/using-the-subflow.png similarity index 100% rename from src/blog/2023/04/images/using-the-subflow.png rename to nuxt/public/blog/2023/04/images/using-the-subflow.png diff --git a/src/blog/2023/04/images/wiring-link-nodes.webm b/nuxt/public/blog/2023/04/images/wiring-link-nodes.webm similarity index 100% rename from src/blog/2023/04/images/wiring-link-nodes.webm rename to nuxt/public/blog/2023/04/images/wiring-link-nodes.webm diff --git a/src/blog/2023/04/images/with-password.png b/nuxt/public/blog/2023/04/images/with-password.png similarity index 100% rename from src/blog/2023/04/images/with-password.png rename to nuxt/public/blog/2023/04/images/with-password.png diff --git a/src/blog/2023/04/images/without-password.png b/nuxt/public/blog/2023/04/images/without-password.png similarity index 100% rename from src/blog/2023/04/images/without-password.png rename to nuxt/public/blog/2023/04/images/without-password.png diff --git a/src/blog/2023/05/images/agent-on-pi.png b/nuxt/public/blog/2023/05/images/agent-on-pi.png similarity index 100% rename from src/blog/2023/05/images/agent-on-pi.png rename to nuxt/public/blog/2023/05/images/agent-on-pi.png diff --git a/src/blog/2023/05/images/data-in-browser.png b/nuxt/public/blog/2023/05/images/data-in-browser.png similarity index 100% rename from src/blog/2023/05/images/data-in-browser.png rename to nuxt/public/blog/2023/05/images/data-in-browser.png diff --git a/src/blog/2023/05/images/inject-on-deploy.png b/nuxt/public/blog/2023/05/images/inject-on-deploy.png similarity index 100% rename from src/blog/2023/05/images/inject-on-deploy.png rename to nuxt/public/blog/2023/05/images/inject-on-deploy.png diff --git a/src/blog/2023/05/images/inject-the-json.png b/nuxt/public/blog/2023/05/images/inject-the-json.png similarity index 100% rename from src/blog/2023/05/images/inject-the-json.png rename to nuxt/public/blog/2023/05/images/inject-the-json.png diff --git a/src/blog/2023/05/images/integrating-modbus-1.png b/nuxt/public/blog/2023/05/images/integrating-modbus-1.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-1.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-1.png diff --git a/src/blog/2023/05/images/integrating-modbus-10.png b/nuxt/public/blog/2023/05/images/integrating-modbus-10.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-10.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-10.png diff --git a/src/blog/2023/05/images/integrating-modbus-11.png b/nuxt/public/blog/2023/05/images/integrating-modbus-11.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-11.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-11.png diff --git a/src/blog/2023/05/images/integrating-modbus-12.png b/nuxt/public/blog/2023/05/images/integrating-modbus-12.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-12.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-12.png diff --git a/src/blog/2023/05/images/integrating-modbus-13.png b/nuxt/public/blog/2023/05/images/integrating-modbus-13.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-13.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-13.png diff --git a/src/blog/2023/05/images/integrating-modbus-14.png b/nuxt/public/blog/2023/05/images/integrating-modbus-14.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-14.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-14.png diff --git a/src/blog/2023/05/images/integrating-modbus-2.png b/nuxt/public/blog/2023/05/images/integrating-modbus-2.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-2.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-2.png diff --git a/src/blog/2023/05/images/integrating-modbus-3.png b/nuxt/public/blog/2023/05/images/integrating-modbus-3.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-3.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-3.png diff --git a/src/blog/2023/05/images/integrating-modbus-4.png b/nuxt/public/blog/2023/05/images/integrating-modbus-4.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-4.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-4.png diff --git a/src/blog/2023/05/images/integrating-modbus-5.png b/nuxt/public/blog/2023/05/images/integrating-modbus-5.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-5.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-5.png diff --git a/src/blog/2023/05/images/integrating-modbus-6.png b/nuxt/public/blog/2023/05/images/integrating-modbus-6.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-6.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-6.png diff --git a/src/blog/2023/05/images/integrating-modbus-7.png b/nuxt/public/blog/2023/05/images/integrating-modbus-7.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-7.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-7.png diff --git a/src/blog/2023/05/images/integrating-modbus-8.png b/nuxt/public/blog/2023/05/images/integrating-modbus-8.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-8.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-8.png diff --git a/src/blog/2023/05/images/integrating-modbus-9.png b/nuxt/public/blog/2023/05/images/integrating-modbus-9.png similarity index 100% rename from src/blog/2023/05/images/integrating-modbus-9.png rename to nuxt/public/blog/2023/05/images/integrating-modbus-9.png diff --git a/src/blog/2023/05/images/modbus2.jpg b/nuxt/public/blog/2023/05/images/modbus2.jpg similarity index 100% rename from src/blog/2023/05/images/modbus2.jpg rename to nuxt/public/blog/2023/05/images/modbus2.jpg diff --git a/src/blog/2023/05/images/nr-community-survey.jpg b/nuxt/public/blog/2023/05/images/nr-community-survey.jpg similarity index 100% rename from src/blog/2023/05/images/nr-community-survey.jpg rename to nuxt/public/blog/2023/05/images/nr-community-survey.jpg diff --git a/src/blog/2023/05/images/persisting-data-header.jpeg b/nuxt/public/blog/2023/05/images/persisting-data-header.jpeg similarity index 100% rename from src/blog/2023/05/images/persisting-data-header.jpeg rename to nuxt/public/blog/2023/05/images/persisting-data-header.jpeg diff --git a/src/blog/2023/05/images/release-1.7.0.png b/nuxt/public/blog/2023/05/images/release-1.7.0.png similarity index 100% rename from src/blog/2023/05/images/release-1.7.0.png rename to nuxt/public/blog/2023/05/images/release-1.7.0.png diff --git a/src/blog/2023/06/images/ethip-to-S7/Node-RED-as-a-No-Code-Ethernet_IP-to-S7-Protocol-Converter.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/Node-RED-as-a-No-Code-Ethernet_IP-to-S7-Protocol-Converter.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/Node-RED-as-a-No-Code-Ethernet_IP-to-S7-Protocol-Converter.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/Node-RED-as-a-No-Code-Ethernet_IP-to-S7-Protocol-Converter.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-1.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-1.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-1.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-1.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-10.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-10.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-10.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-10.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-11.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-11.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-11.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-11.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-12.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-12.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-12.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-12.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-13.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-13.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-13.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-13.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-14.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-14.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-14.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-14.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-15.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-15.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-15.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-15.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-16.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-16.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-16.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-16.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-17.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-17.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-17.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-17.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-18.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-18.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-18.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-18.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-19.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-19.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-19.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-19.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-2.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-2.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-2.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-2.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-20.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-20.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-20.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-20.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-21.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-21.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-21.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-21.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-22.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-22.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-22.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-22.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-23.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-23.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-23.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-23.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-24.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-24.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-24.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-24.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-3.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-3.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-3.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-3.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-4.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-4.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-4.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-4.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-5.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-5.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-5.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-5.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-6.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-6.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-6.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-6.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-7.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-7.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-7.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-7.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-8.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-8.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-8.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-8.png diff --git a/src/blog/2023/06/images/ethip-to-S7/e-to-p-9.png b/nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-9.png similarity index 100% rename from src/blog/2023/06/images/ethip-to-S7/e-to-p-9.png rename to nuxt/public/blog/2023/06/images/ethip-to-S7/e-to-p-9.png diff --git a/src/blog/2023/06/images/node-red-dashboard.png b/nuxt/public/blog/2023/06/images/node-red-dashboard.png similarity index 100% rename from src/blog/2023/06/images/node-red-dashboard.png rename to nuxt/public/blog/2023/06/images/node-red-dashboard.png diff --git a/src/blog/2023/06/images/npmimport-add.jpg b/nuxt/public/blog/2023/06/images/npmimport-add.jpg similarity index 100% rename from src/blog/2023/06/images/npmimport-add.jpg rename to nuxt/public/blog/2023/06/images/npmimport-add.jpg diff --git a/src/blog/2023/06/images/release-1.8.0.png b/nuxt/public/blog/2023/06/images/release-1.8.0.png similarity index 100% rename from src/blog/2023/06/images/release-1.8.0.png rename to nuxt/public/blog/2023/06/images/release-1.8.0.png diff --git a/src/blog/2023/06/images/responsive.webm b/nuxt/public/blog/2023/06/images/responsive.webm similarity index 100% rename from src/blog/2023/06/images/responsive.webm rename to nuxt/public/blog/2023/06/images/responsive.webm diff --git a/src/blog/2023/06/images/slider-ui.webm b/nuxt/public/blog/2023/06/images/slider-ui.webm similarity index 100% rename from src/blog/2023/06/images/slider-ui.webm rename to nuxt/public/blog/2023/06/images/slider-ui.webm diff --git a/src/blog/2023/06/images/temp-graph.png b/nuxt/public/blog/2023/06/images/temp-graph.png similarity index 100% rename from src/blog/2023/06/images/temp-graph.png rename to nuxt/public/blog/2023/06/images/temp-graph.png diff --git a/src/blog/2023/07/images/add-images-in-node-red-header.png b/nuxt/public/blog/2023/07/images/add-images-in-node-red-header.png similarity index 100% rename from src/blog/2023/07/images/add-images-in-node-red-header.png rename to nuxt/public/blog/2023/07/images/add-images-in-node-red-header.png diff --git a/src/blog/2023/07/images/change-node.png b/nuxt/public/blog/2023/07/images/change-node.png similarity index 100% rename from src/blog/2023/07/images/change-node.png rename to nuxt/public/blog/2023/07/images/change-node.png diff --git a/src/blog/2023/07/images/historical-data-dashboard.png b/nuxt/public/blog/2023/07/images/historical-data-dashboard.png similarity index 100% rename from src/blog/2023/07/images/historical-data-dashboard.png rename to nuxt/public/blog/2023/07/images/historical-data-dashboard.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/bucket-influxdb-10.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/bucket-influxdb-10.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/bucket-influxdb-10.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/bucket-influxdb-10.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/change-node-26.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/change-node-26.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/change-node-26.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/change-node-26.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/change-node-30.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/change-node-30.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/change-node-30.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/change-node-30.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/change-node-32.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/change-node-32.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/change-node-32.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/change-node-32.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/change-node-33.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/change-node-33.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/change-node-33.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/change-node-33.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/change-node-6.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/change-node-6.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/change-node-6.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/change-node-6.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/chart-node-29.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/chart-node-29.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/chart-node-29.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/chart-node-29.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/create-bucket-influxdb-11.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/create-bucket-influxdb-11.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/create-bucket-influxdb-11.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/create-bucket-influxdb-11.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/dashboard-1.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/dashboard-1.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/dashboard-1.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/dashboard-1.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/data-flow-22.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/data-flow-22.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/data-flow-22.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/data-flow-22.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/data-format-27.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/data-format-27.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/data-format-27.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/data-format-27.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/debugger-5.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/debugger-5.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/debugger-5.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/debugger-5.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/delay-4.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/delay-4.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/delay-4.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/delay-4.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/final-dashboard-34.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/final-dashboard-34.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/final-dashboard-34.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/final-dashboard-34.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/flow-2.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/flow-2.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/flow-2.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/flow-2.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/flow-influxdb-out-18.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/flow-influxdb-out-18.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/flow-influxdb-out-18.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/flow-influxdb-out-18.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/form-node-24.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/form-node-24.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/form-node-24.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/form-node-24.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/free-influxdb-9.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/free-influxdb-9.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/free-influxdb-9.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/free-influxdb-9.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/function-node-25.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/function-node-25.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/function-node-25.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/function-node-25.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/generate-token-influxdb-13.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/generate-token-influxdb-13.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/generate-token-influxdb-13.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/generate-token-influxdb-13.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/historical-data-21.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/historical-data-21.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/historical-data-21.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/historical-data-21.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/influxdb-explorer-20.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/influxdb-explorer-20.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/influxdb-explorer-20.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/influxdb-explorer-20.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/influxdb-node-17.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/influxdb-node-17.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/influxdb-node-17.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/influxdb-node-17.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/influxdb-nodes-15.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/influxdb-nodes-15.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/influxdb-nodes-15.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/influxdb-nodes-15.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/influxdb-out-node-16.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/influxdb-out-node-16.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/influxdb-out-node-16.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/influxdb-out-node-16.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/install-contrib-influxdb-14.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/install-contrib-influxdb-14.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/install-contrib-influxdb-14.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/install-contrib-influxdb-14.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/join-node-33.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/join-node-33.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/join-node-33.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/join-node-33.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/live-data-chart-19.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/live-data-chart-19.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/live-data-chart-19.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/live-data-chart-19.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/load-data-influxdb-11.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/load-data-influxdb-11.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/load-data-influxdb-11.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/load-data-influxdb-11.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/number-7.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/number-7.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/number-7.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/number-7.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/run-influxdb-8.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/run-influxdb-8.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/run-influxdb-8.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/run-influxdb-8.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/serial-port-node-3.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/serial-port-node-3.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/serial-port-node-3.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/serial-port-node-3.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/split-node-31.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/split-node-31.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/split-node-31.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/split-node-31.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/switch-node-28.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/switch-node-28.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/switch-node-28.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/switch-node-28.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/template-node-23.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/template-node-23.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/template-node-23.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/template-node-23.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/token-influxdb-12.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/token-influxdb-12.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/token-influxdb-12.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/token-influxdb-12.png diff --git a/src/blog/2023/07/images/influxdb-historical-data/transform-data-28.png b/nuxt/public/blog/2023/07/images/influxdb-historical-data/transform-data-28.png similarity index 100% rename from src/blog/2023/07/images/influxdb-historical-data/transform-data-28.png rename to nuxt/public/blog/2023/07/images/influxdb-historical-data/transform-data-28.png diff --git a/src/blog/2023/07/images/load-images-from-disk-and-show-in-dashboard.png b/nuxt/public/blog/2023/07/images/load-images-from-disk-and-show-in-dashboard.png similarity index 100% rename from src/blog/2023/07/images/load-images-from-disk-and-show-in-dashboard.png rename to nuxt/public/blog/2023/07/images/load-images-from-disk-and-show-in-dashboard.png diff --git a/src/blog/2023/07/images/nr-dashboard-screenshot.png b/nuxt/public/blog/2023/07/images/nr-dashboard-screenshot.png similarity index 100% rename from src/blog/2023/07/images/nr-dashboard-screenshot.png rename to nuxt/public/blog/2023/07/images/nr-dashboard-screenshot.png diff --git a/src/blog/2023/07/images/nr-dashboard-tile.png b/nuxt/public/blog/2023/07/images/nr-dashboard-tile.png similarity index 100% rename from src/blog/2023/07/images/nr-dashboard-tile.png rename to nuxt/public/blog/2023/07/images/nr-dashboard-tile.png diff --git a/src/blog/2023/07/images/opc-ua-1/OPC-UA-distributed-model.jpg b/nuxt/public/blog/2023/07/images/opc-ua-1/OPC-UA-distributed-model.jpg similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/OPC-UA-distributed-model.jpg rename to nuxt/public/blog/2023/07/images/opc-ua-1/OPC-UA-distributed-model.jpg diff --git a/src/blog/2023/07/images/opc-ua-1/OPC-UA-pyramid-2.webp b/nuxt/public/blog/2023/07/images/opc-ua-1/OPC-UA-pyramid-2.webp similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/OPC-UA-pyramid-2.webp rename to nuxt/public/blog/2023/07/images/opc-ua-1/OPC-UA-pyramid-2.webp diff --git a/src/blog/2023/07/images/opc-ua-1/automation-pyramid.jpg b/nuxt/public/blog/2023/07/images/opc-ua-1/automation-pyramid.jpg similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/automation-pyramid.jpg rename to nuxt/public/blog/2023/07/images/opc-ua-1/automation-pyramid.jpg diff --git a/src/blog/2023/07/images/opc-ua-1/compact-server-active.png b/nuxt/public/blog/2023/07/images/opc-ua-1/compact-server-active.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/compact-server-active.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/compact-server-active.png diff --git a/src/blog/2023/07/images/opc-ua-1/compact-server-flow.png b/nuxt/public/blog/2023/07/images/opc-ua-1/compact-server-flow.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/compact-server-flow.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/compact-server-flow.png diff --git a/src/blog/2023/07/images/opc-ua-1/compact-server-node.png b/nuxt/public/blog/2023/07/images/opc-ua-1/compact-server-node.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/compact-server-node.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/compact-server-node.png diff --git a/src/blog/2023/07/images/opc-ua-1/context-data-1.png b/nuxt/public/blog/2023/07/images/opc-ua-1/context-data-1.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/context-data-1.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/context-data-1.png diff --git a/src/blog/2023/07/images/opc-ua-1/context-data-2.png b/nuxt/public/blog/2023/07/images/opc-ua-1/context-data-2.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/context-data-2.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/context-data-2.png diff --git a/src/blog/2023/07/images/opc-ua-1/discovery-tab.png b/nuxt/public/blog/2023/07/images/opc-ua-1/discovery-tab.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/discovery-tab.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/discovery-tab.png diff --git a/src/blog/2023/07/images/opc-ua-1/fieldbus-model.png b/nuxt/public/blog/2023/07/images/opc-ua-1/fieldbus-model.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/fieldbus-model.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/fieldbus-model.png diff --git a/src/blog/2023/07/images/opc-ua-1/opc-client-browser.png b/nuxt/public/blog/2023/07/images/opc-ua-1/opc-client-browser.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/opc-client-browser.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/opc-client-browser.png diff --git a/src/blog/2023/07/images/opc-ua-1/opc-client-connect.png b/nuxt/public/blog/2023/07/images/opc-ua-1/opc-client-connect.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/opc-client-connect.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/opc-client-connect.png diff --git a/src/blog/2023/07/images/opc-ua-1/opc-client-node.png b/nuxt/public/blog/2023/07/images/opc-ua-1/opc-client-node.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/opc-client-node.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/opc-client-node.png diff --git a/src/blog/2023/07/images/opc-ua-1/opc-client-ui.png b/nuxt/public/blog/2023/07/images/opc-ua-1/opc-client-ui.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/opc-client-ui.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/opc-client-ui.png diff --git a/src/blog/2023/07/images/opc-ua-1/opc-client-view.png b/nuxt/public/blog/2023/07/images/opc-ua-1/opc-client-view.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/opc-client-view.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/opc-client-view.png diff --git a/src/blog/2023/07/images/opc-ua-1/opc-information-model.png b/nuxt/public/blog/2023/07/images/opc-ua-1/opc-information-model.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/opc-information-model.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/opc-information-model.png diff --git a/src/blog/2023/07/images/opc-ua-1/opc-ua-1-title-image.png b/nuxt/public/blog/2023/07/images/opc-ua-1/opc-ua-1-title-image.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/opc-ua-1-title-image.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/opc-ua-1-title-image.png diff --git a/src/blog/2023/07/images/opc-ua-1/security-tab.png b/nuxt/public/blog/2023/07/images/opc-ua-1/security-tab.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/security-tab.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/security-tab.png diff --git a/src/blog/2023/07/images/opc-ua-1/settings-tab.png b/nuxt/public/blog/2023/07/images/opc-ua-1/settings-tab.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-1/settings-tab.png rename to nuxt/public/blog/2023/07/images/opc-ua-1/settings-tab.png diff --git a/src/blog/2023/07/images/opc-ua-3/address-debug.png b/nuxt/public/blog/2023/07/images/opc-ua-3/address-debug.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/address-debug.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/address-debug.png diff --git a/src/blog/2023/07/images/opc-ua-3/address-space-dashboard.png b/nuxt/public/blog/2023/07/images/opc-ua-3/address-space-dashboard.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/address-space-dashboard.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/address-space-dashboard.png diff --git a/src/blog/2023/07/images/opc-ua-3/address-space-folders-only.png b/nuxt/public/blog/2023/07/images/opc-ua-3/address-space-folders-only.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/address-space-folders-only.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/address-space-folders-only.png diff --git a/src/blog/2023/07/images/opc-ua-3/address-space.png b/nuxt/public/blog/2023/07/images/opc-ua-3/address-space.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/address-space.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/address-space.png diff --git a/src/blog/2023/07/images/opc-ua-3/browse-node.png b/nuxt/public/blog/2023/07/images/opc-ua-3/browse-node.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/browse-node.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/browse-node.png diff --git a/src/blog/2023/07/images/opc-ua-3/browse-payload-1.png b/nuxt/public/blog/2023/07/images/opc-ua-3/browse-payload-1.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/browse-payload-1.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/browse-payload-1.png diff --git a/src/blog/2023/07/images/opc-ua-3/client-events.png b/nuxt/public/blog/2023/07/images/opc-ua-3/client-events.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/client-events.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/client-events.png diff --git a/src/blog/2023/07/images/opc-ua-3/client-node.png b/nuxt/public/blog/2023/07/images/opc-ua-3/client-node.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/client-node.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/client-node.png diff --git a/src/blog/2023/07/images/opc-ua-3/copy-node-id.png b/nuxt/public/blog/2023/07/images/opc-ua-3/copy-node-id.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/copy-node-id.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/copy-node-id.png diff --git a/src/blog/2023/07/images/opc-ua-3/counter-propertie.png b/nuxt/public/blog/2023/07/images/opc-ua-3/counter-propertie.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/counter-propertie.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/counter-propertie.png diff --git a/src/blog/2023/07/images/opc-ua-3/counter-properties.png b/nuxt/public/blog/2023/07/images/opc-ua-3/counter-properties.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/counter-properties.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/counter-properties.png diff --git a/src/blog/2023/07/images/opc-ua-3/empty-check.png b/nuxt/public/blog/2023/07/images/opc-ua-3/empty-check.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/empty-check.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/empty-check.png diff --git a/src/blog/2023/07/images/opc-ua-3/endpoint-configure.png b/nuxt/public/blog/2023/07/images/opc-ua-3/endpoint-configure.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/endpoint-configure.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/endpoint-configure.png diff --git a/src/blog/2023/07/images/opc-ua-3/event-debug.png b/nuxt/public/blog/2023/07/images/opc-ua-3/event-debug.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/event-debug.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/event-debug.png diff --git a/src/blog/2023/07/images/opc-ua-3/event-node-properties.png b/nuxt/public/blog/2023/07/images/opc-ua-3/event-node-properties.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/event-node-properties.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/event-node-properties.png diff --git a/src/blog/2023/07/images/opc-ua-3/expert-mode.png b/nuxt/public/blog/2023/07/images/opc-ua-3/expert-mode.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/expert-mode.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/expert-mode.png diff --git a/src/blog/2023/07/images/opc-ua-3/flow-context-nodeid.png b/nuxt/public/blog/2023/07/images/opc-ua-3/flow-context-nodeid.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/flow-context-nodeid.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/flow-context-nodeid.png diff --git a/src/blog/2023/07/images/opc-ua-3/get-counter-value.png b/nuxt/public/blog/2023/07/images/opc-ua-3/get-counter-value.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/get-counter-value.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/get-counter-value.png diff --git a/src/blog/2023/07/images/opc-ua-3/image-20230727-085611.png b/nuxt/public/blog/2023/07/images/opc-ua-3/image-20230727-085611.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/image-20230727-085611.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/image-20230727-085611.png diff --git a/src/blog/2023/07/images/opc-ua-3/image-20230727-090252.png b/nuxt/public/blog/2023/07/images/opc-ua-3/image-20230727-090252.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/image-20230727-090252.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/image-20230727-090252.png diff --git a/src/blog/2023/07/images/opc-ua-3/level-range.png b/nuxt/public/blog/2023/07/images/opc-ua-3/level-range.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/level-range.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/level-range.png diff --git a/src/blog/2023/07/images/opc-ua-3/mylevel-event.png b/nuxt/public/blog/2023/07/images/opc-ua-3/mylevel-event.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/mylevel-event.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/mylevel-event.png diff --git a/src/blog/2023/07/images/opc-ua-3/opc-endpoint-url.png b/nuxt/public/blog/2023/07/images/opc-ua-3/opc-endpoint-url.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/opc-endpoint-url.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/opc-endpoint-url.png diff --git a/src/blog/2023/07/images/opc-ua-3/opc-event-flow.png b/nuxt/public/blog/2023/07/images/opc-ua-3/opc-event-flow.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/opc-event-flow.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/opc-event-flow.png diff --git a/src/blog/2023/07/images/opc-ua-3/opc-event.webm b/nuxt/public/blog/2023/07/images/opc-ua-3/opc-event.webm similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/opc-event.webm rename to nuxt/public/blog/2023/07/images/opc-ua-3/opc-event.webm diff --git a/src/blog/2023/07/images/opc-ua-3/opc-read-dashboard.webm b/nuxt/public/blog/2023/07/images/opc-ua-3/opc-read-dashboard.webm similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/opc-read-dashboard.webm rename to nuxt/public/blog/2023/07/images/opc-ua-3/opc-read-dashboard.webm diff --git a/src/blog/2023/07/images/opc-ua-3/opc-ua-3-title-image.png b/nuxt/public/blog/2023/07/images/opc-ua-3/opc-ua-3-title-image.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/opc-ua-3-title-image.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/opc-ua-3-title-image.png diff --git a/src/blog/2023/07/images/opc-ua-3/opc-write.webm b/nuxt/public/blog/2023/07/images/opc-ua-3/opc-write.webm similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/opc-write.webm rename to nuxt/public/blog/2023/07/images/opc-ua-3/opc-write.webm diff --git a/src/blog/2023/07/images/opc-ua-3/opcua-item.png b/nuxt/public/blog/2023/07/images/opc-ua-3/opcua-item.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/opcua-item.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/opcua-item.png diff --git a/src/blog/2023/07/images/opc-ua-3/read-opc-values.png b/nuxt/public/blog/2023/07/images/opc-ua-3/read-opc-values.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/read-opc-values.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/read-opc-values.png diff --git a/src/blog/2023/07/images/opc-ua-3/sim-counter-server.png b/nuxt/public/blog/2023/07/images/opc-ua-3/sim-counter-server.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/sim-counter-server.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/sim-counter-server.png diff --git a/src/blog/2023/07/images/opc-ua-3/simulation-debug.png b/nuxt/public/blog/2023/07/images/opc-ua-3/simulation-debug.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/simulation-debug.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/simulation-debug.png diff --git a/src/blog/2023/07/images/opc-ua-3/simulation-folder.png b/nuxt/public/blog/2023/07/images/opc-ua-3/simulation-folder.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/simulation-folder.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/simulation-folder.png diff --git a/src/blog/2023/07/images/opc-ua-3/simulation-injection.png b/nuxt/public/blog/2023/07/images/opc-ua-3/simulation-injection.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/simulation-injection.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/simulation-injection.png diff --git a/src/blog/2023/07/images/opc-ua-3/write-mydevice.png b/nuxt/public/blog/2023/07/images/opc-ua-3/write-mydevice.png similarity index 100% rename from src/blog/2023/07/images/opc-ua-3/write-mydevice.png rename to nuxt/public/blog/2023/07/images/opc-ua-3/write-mydevice.png diff --git a/src/blog/2023/07/images/release-1.9.0.png b/nuxt/public/blog/2023/07/images/release-1.9.0.png similarity index 100% rename from src/blog/2023/07/images/release-1.9.0.png rename to nuxt/public/blog/2023/07/images/release-1.9.0.png diff --git a/src/blog/2023/07/images/static-assets.png b/nuxt/public/blog/2023/07/images/static-assets.png similarity index 100% rename from src/blog/2023/07/images/static-assets.png rename to nuxt/public/blog/2023/07/images/static-assets.png diff --git a/src/blog/2023/07/images/the-dashboard.webm b/nuxt/public/blog/2023/07/images/the-dashboard.webm similarity index 100% rename from src/blog/2023/07/images/the-dashboard.webm rename to nuxt/public/blog/2023/07/images/the-dashboard.webm diff --git a/src/blog/2023/07/images/write-the-data.webm b/nuxt/public/blog/2023/07/images/write-the-data.webm similarity index 100% rename from src/blog/2023/07/images/write-the-data.webm rename to nuxt/public/blog/2023/07/images/write-the-data.webm diff --git a/src/blog/2023/08/images/Dashboard Community Update-Aug23.jpg b/nuxt/public/blog/2023/08/images/Dashboard Community Update-Aug23.jpg similarity index 100% rename from src/blog/2023/08/images/Dashboard Community Update-Aug23.jpg rename to nuxt/public/blog/2023/08/images/Dashboard Community Update-Aug23.jpg diff --git a/src/blog/2023/08/images/UNS/Automation-Pyramid.png b/nuxt/public/blog/2023/08/images/UNS/Automation-Pyramid.png similarity index 100% rename from src/blog/2023/08/images/UNS/Automation-Pyramid.png rename to nuxt/public/blog/2023/08/images/UNS/Automation-Pyramid.png diff --git a/src/blog/2023/08/images/UNS/IIoT-Circle.svg b/nuxt/public/blog/2023/08/images/UNS/IIoT-Circle.svg similarity index 100% rename from src/blog/2023/08/images/UNS/IIoT-Circle.svg rename to nuxt/public/blog/2023/08/images/UNS/IIoT-Circle.svg diff --git a/src/blog/2023/08/images/UNS/ISA95.svg b/nuxt/public/blog/2023/08/images/UNS/ISA95.svg similarity index 100% rename from src/blog/2023/08/images/UNS/ISA95.svg rename to nuxt/public/blog/2023/08/images/UNS/ISA95.svg diff --git a/src/blog/2023/08/images/UNS/RAMI40.webm b/nuxt/public/blog/2023/08/images/UNS/RAMI40.webm similarity index 100% rename from src/blog/2023/08/images/UNS/RAMI40.webm rename to nuxt/public/blog/2023/08/images/UNS/RAMI40.webm diff --git a/src/blog/2023/08/images/UNS/UNS-Headline.svg b/nuxt/public/blog/2023/08/images/UNS/UNS-Headline.svg similarity index 100% rename from src/blog/2023/08/images/UNS/UNS-Headline.svg rename to nuxt/public/blog/2023/08/images/UNS/UNS-Headline.svg diff --git a/src/blog/2023/08/images/auto-pyramid-cta-1.png b/nuxt/public/blog/2023/08/images/auto-pyramid-cta-1.png similarity index 100% rename from src/blog/2023/08/images/auto-pyramid-cta-1.png rename to nuxt/public/blog/2023/08/images/auto-pyramid-cta-1.png diff --git a/src/blog/2023/08/images/flowforge-is-now-flowfuse.jpg b/nuxt/public/blog/2023/08/images/flowforge-is-now-flowfuse.jpg similarity index 100% rename from src/blog/2023/08/images/flowforge-is-now-flowfuse.jpg rename to nuxt/public/blog/2023/08/images/flowforge-is-now-flowfuse.jpg diff --git a/src/blog/2023/08/images/flowfuse-aws.png b/nuxt/public/blog/2023/08/images/flowfuse-aws.png similarity index 100% rename from src/blog/2023/08/images/flowfuse-aws.png rename to nuxt/public/blog/2023/08/images/flowfuse-aws.png diff --git a/src/blog/2023/08/images/matt-hardy-waves.jpg b/nuxt/public/blog/2023/08/images/matt-hardy-waves.jpg similarity index 100% rename from src/blog/2023/08/images/matt-hardy-waves.jpg rename to nuxt/public/blog/2023/08/images/matt-hardy-waves.jpg diff --git a/src/blog/2023/08/images/release-1-10-graphic.png b/nuxt/public/blog/2023/08/images/release-1-10-graphic.png similarity index 100% rename from src/blog/2023/08/images/release-1-10-graphic.png rename to nuxt/public/blog/2023/08/images/release-1-10-graphic.png diff --git a/src/blog/2023/08/images/release-1-11-graphic.png b/nuxt/public/blog/2023/08/images/release-1-11-graphic.png similarity index 100% rename from src/blog/2023/08/images/release-1-11-graphic.png rename to nuxt/public/blog/2023/08/images/release-1-11-graphic.png diff --git a/src/blog/2023/09/images/bosch-rexroth-announce.png b/nuxt/public/blog/2023/09/images/bosch-rexroth-announce.png similarity index 100% rename from src/blog/2023/09/images/bosch-rexroth-announce.png rename to nuxt/public/blog/2023/09/images/bosch-rexroth-announce.png diff --git a/src/blog/2023/09/images/chatgpt-fcn-example.png b/nuxt/public/blog/2023/09/images/chatgpt-fcn-example.png similarity index 100% rename from src/blog/2023/09/images/chatgpt-fcn-example.png rename to nuxt/public/blog/2023/09/images/chatgpt-fcn-example.png diff --git a/src/blog/2023/09/images/chatgpt-node-red-dx-tile.png b/nuxt/public/blog/2023/09/images/chatgpt-node-red-dx-tile.png similarity index 100% rename from src/blog/2023/09/images/chatgpt-node-red-dx-tile.png rename to nuxt/public/blog/2023/09/images/chatgpt-node-red-dx-tile.png diff --git a/src/blog/2023/09/images/db-notebook-example.png b/nuxt/public/blog/2023/09/images/db-notebook-example.png similarity index 100% rename from src/blog/2023/09/images/db-notebook-example.png rename to nuxt/public/blog/2023/09/images/db-notebook-example.png diff --git a/src/blog/2023/09/images/db-notebook-inject.png b/nuxt/public/blog/2023/09/images/db-notebook-inject.png similarity index 100% rename from src/blog/2023/09/images/db-notebook-inject.png rename to nuxt/public/blog/2023/09/images/db-notebook-inject.png diff --git a/src/blog/2023/09/images/db-notebook-jokes-table.png b/nuxt/public/blog/2023/09/images/db-notebook-jokes-table.png similarity index 100% rename from src/blog/2023/09/images/db-notebook-jokes-table.png rename to nuxt/public/blog/2023/09/images/db-notebook-jokes-table.png diff --git a/src/blog/2023/09/images/db-notebook-order.png b/nuxt/public/blog/2023/09/images/db-notebook-order.png similarity index 100% rename from src/blog/2023/09/images/db-notebook-order.png rename to nuxt/public/blog/2023/09/images/db-notebook-order.png diff --git a/src/blog/2023/09/images/db-notebook-tile.png b/nuxt/public/blog/2023/09/images/db-notebook-tile.png similarity index 100% rename from src/blog/2023/09/images/db-notebook-tile.png rename to nuxt/public/blog/2023/09/images/db-notebook-tile.png diff --git a/src/blog/2023/09/images/generate-jokes-flow.png b/nuxt/public/blog/2023/09/images/generate-jokes-flow.png similarity index 100% rename from src/blog/2023/09/images/generate-jokes-flow.png rename to nuxt/public/blog/2023/09/images/generate-jokes-flow.png diff --git a/src/blog/2023/09/images/industrial-legacy-data-blog-image.png b/nuxt/public/blog/2023/09/images/industrial-legacy-data-blog-image.png similarity index 100% rename from src/blog/2023/09/images/industrial-legacy-data-blog-image.png rename to nuxt/public/blog/2023/09/images/industrial-legacy-data-blog-image.png diff --git a/src/blog/2023/09/images/industrial-legacy-data-pt2-10polls.webm b/nuxt/public/blog/2023/09/images/industrial-legacy-data-pt2-10polls.webm similarity index 100% rename from src/blog/2023/09/images/industrial-legacy-data-pt2-10polls.webm rename to nuxt/public/blog/2023/09/images/industrial-legacy-data-pt2-10polls.webm diff --git a/src/blog/2023/09/images/industrial-legacy-data-pt2-1poll-extensible.webm b/nuxt/public/blog/2023/09/images/industrial-legacy-data-pt2-1poll-extensible.webm similarity index 100% rename from src/blog/2023/09/images/industrial-legacy-data-pt2-1poll-extensible.webm rename to nuxt/public/blog/2023/09/images/industrial-legacy-data-pt2-1poll-extensible.webm diff --git a/src/blog/2023/09/images/industrial-legacy-data-pt2-1poll-fixed.webm b/nuxt/public/blog/2023/09/images/industrial-legacy-data-pt2-1poll-fixed.webm similarity index 100% rename from src/blog/2023/09/images/industrial-legacy-data-pt2-1poll-fixed.webm rename to nuxt/public/blog/2023/09/images/industrial-legacy-data-pt2-1poll-fixed.webm diff --git a/src/blog/2023/09/images/industrial-legacy-data-pt2-demo1.png b/nuxt/public/blog/2023/09/images/industrial-legacy-data-pt2-demo1.png similarity index 100% rename from src/blog/2023/09/images/industrial-legacy-data-pt2-demo1.png rename to nuxt/public/blog/2023/09/images/industrial-legacy-data-pt2-demo1.png diff --git a/src/blog/2023/09/images/industrial-legacy-data-pt2-demo1b.png b/nuxt/public/blog/2023/09/images/industrial-legacy-data-pt2-demo1b.png similarity index 100% rename from src/blog/2023/09/images/industrial-legacy-data-pt2-demo1b.png rename to nuxt/public/blog/2023/09/images/industrial-legacy-data-pt2-demo1b.png diff --git a/src/blog/2023/09/images/industrial-legacy-data-pt2-table.png b/nuxt/public/blog/2023/09/images/industrial-legacy-data-pt2-table.png similarity index 100% rename from src/blog/2023/09/images/industrial-legacy-data-pt2-table.png rename to nuxt/public/blog/2023/09/images/industrial-legacy-data-pt2-table.png diff --git a/src/blog/2023/09/images/industrial-legacy-data-to-dashboard.png b/nuxt/public/blog/2023/09/images/industrial-legacy-data-to-dashboard.png similarity index 100% rename from src/blog/2023/09/images/industrial-legacy-data-to-dashboard.png rename to nuxt/public/blog/2023/09/images/industrial-legacy-data-to-dashboard.png diff --git a/src/blog/2023/09/images/industrial-legacy-data-to-influx.png b/nuxt/public/blog/2023/09/images/industrial-legacy-data-to-influx.png similarity index 100% rename from src/blog/2023/09/images/industrial-legacy-data-to-influx.png rename to nuxt/public/blog/2023/09/images/industrial-legacy-data-to-influx.png diff --git a/src/blog/2023/09/images/industrial-legacy-data-to-influx2.png b/nuxt/public/blog/2023/09/images/industrial-legacy-data-to-influx2.png similarity index 100% rename from src/blog/2023/09/images/industrial-legacy-data-to-influx2.png rename to nuxt/public/blog/2023/09/images/industrial-legacy-data-to-influx2.png diff --git a/src/blog/2023/09/images/industrial-legacy-data-to-mqtt.webm b/nuxt/public/blog/2023/09/images/industrial-legacy-data-to-mqtt.webm similarity index 100% rename from src/blog/2023/09/images/industrial-legacy-data-to-mqtt.webm rename to nuxt/public/blog/2023/09/images/industrial-legacy-data-to-mqtt.webm diff --git a/src/blog/2023/09/images/inject-http-simple.png b/nuxt/public/blog/2023/09/images/inject-http-simple.png similarity index 100% rename from src/blog/2023/09/images/inject-http-simple.png rename to nuxt/public/blog/2023/09/images/inject-http-simple.png diff --git a/src/blog/2023/09/images/md-timestamp.webm b/nuxt/public/blog/2023/09/images/md-timestamp.webm similarity index 100% rename from src/blog/2023/09/images/md-timestamp.webm rename to nuxt/public/blog/2023/09/images/md-timestamp.webm diff --git a/src/blog/2023/09/images/operation-calling.png b/nuxt/public/blog/2023/09/images/operation-calling.png similarity index 100% rename from src/blog/2023/09/images/operation-calling.png rename to nuxt/public/blog/2023/09/images/operation-calling.png diff --git a/src/blog/2023/09/images/rest-dashboard-final-flow.png b/nuxt/public/blog/2023/09/images/rest-dashboard-final-flow.png similarity index 100% rename from src/blog/2023/09/images/rest-dashboard-final-flow.png rename to nuxt/public/blog/2023/09/images/rest-dashboard-final-flow.png diff --git a/src/blog/2023/09/images/tile-flowviewer.jpg b/nuxt/public/blog/2023/09/images/tile-flowviewer.jpg similarity index 100% rename from src/blog/2023/09/images/tile-flowviewer.jpg rename to nuxt/public/blog/2023/09/images/tile-flowviewer.jpg diff --git a/src/blog/2023/09/images/tile-rebranding.png b/nuxt/public/blog/2023/09/images/tile-rebranding.png similarity index 100% rename from src/blog/2023/09/images/tile-rebranding.png rename to nuxt/public/blog/2023/09/images/tile-rebranding.png diff --git a/src/blog/2023/09/images/tile-restapi-dashboard.png b/nuxt/public/blog/2023/09/images/tile-restapi-dashboard.png similarity index 100% rename from src/blog/2023/09/images/tile-restapi-dashboard.png rename to nuxt/public/blog/2023/09/images/tile-restapi-dashboard.png diff --git a/src/blog/2023/10/images/ANDON1.png b/nuxt/public/blog/2023/10/images/ANDON1.png similarity index 100% rename from src/blog/2023/10/images/ANDON1.png rename to nuxt/public/blog/2023/10/images/ANDON1.png diff --git a/src/blog/2023/10/images/blueprints.png b/nuxt/public/blog/2023/10/images/blueprints.png similarity index 100% rename from src/blog/2023/10/images/blueprints.png rename to nuxt/public/blog/2023/10/images/blueprints.png diff --git a/src/blog/2023/10/images/buildvbuy.png b/nuxt/public/blog/2023/10/images/buildvbuy.png similarity index 100% rename from src/blog/2023/10/images/buildvbuy.png rename to nuxt/public/blog/2023/10/images/buildvbuy.png diff --git a/src/blog/2023/10/images/certified-nodes.png b/nuxt/public/blog/2023/10/images/certified-nodes.png similarity index 100% rename from src/blog/2023/10/images/certified-nodes.png rename to nuxt/public/blog/2023/10/images/certified-nodes.png diff --git a/src/blog/2023/10/images/custom-element-dashboard.png b/nuxt/public/blog/2023/10/images/custom-element-dashboard.png similarity index 100% rename from src/blog/2023/10/images/custom-element-dashboard.png rename to nuxt/public/blog/2023/10/images/custom-element-dashboard.png diff --git a/src/blog/2023/10/images/dashboard-data.png b/nuxt/public/blog/2023/10/images/dashboard-data.png similarity index 100% rename from src/blog/2023/10/images/dashboard-data.png rename to nuxt/public/blog/2023/10/images/dashboard-data.png diff --git a/src/blog/2023/10/images/image-certified-nodes.png b/nuxt/public/blog/2023/10/images/image-certified-nodes.png similarity index 100% rename from src/blog/2023/10/images/image-certified-nodes.png rename to nuxt/public/blog/2023/10/images/image-certified-nodes.png diff --git a/src/blog/2023/10/images/image-citizen-developers.png b/nuxt/public/blog/2023/10/images/image-citizen-developers.png similarity index 100% rename from src/blog/2023/10/images/image-citizen-developers.png rename to nuxt/public/blog/2023/10/images/image-citizen-developers.png diff --git a/src/blog/2023/10/images/performance-dashboard.png b/nuxt/public/blog/2023/10/images/performance-dashboard.png similarity index 100% rename from src/blog/2023/10/images/performance-dashboard.png rename to nuxt/public/blog/2023/10/images/performance-dashboard.png diff --git a/src/blog/2023/10/images/random-progress-element.webm b/nuxt/public/blog/2023/10/images/random-progress-element.webm similarity index 100% rename from src/blog/2023/10/images/random-progress-element.webm rename to nuxt/public/blog/2023/10/images/random-progress-element.webm diff --git a/src/blog/2023/10/images/tile-blog-custom-vuetify-components-for-Dashboard.png b/nuxt/public/blog/2023/10/images/tile-blog-custom-vuetify-components-for-Dashboard.png similarity index 100% rename from src/blog/2023/10/images/tile-blog-custom-vuetify-components-for-Dashboard.png rename to nuxt/public/blog/2023/10/images/tile-blog-custom-vuetify-components-for-Dashboard.png diff --git a/src/blog/2023/10/images/tile-blog-private-custom-nodes-tile.png b/nuxt/public/blog/2023/10/images/tile-blog-private-custom-nodes-tile.png similarity index 100% rename from src/blog/2023/10/images/tile-blog-private-custom-nodes-tile.png rename to nuxt/public/blog/2023/10/images/tile-blog-private-custom-nodes-tile.png diff --git a/src/blog/2023/10/images/tile-db-integration.png b/nuxt/public/blog/2023/10/images/tile-db-integration.png similarity index 100% rename from src/blog/2023/10/images/tile-db-integration.png rename to nuxt/public/blog/2023/10/images/tile-db-integration.png diff --git a/src/blog/2023/11/images/IMG_6334.jpg b/nuxt/public/blog/2023/11/images/IMG_6334.jpg similarity index 100% rename from src/blog/2023/11/images/IMG_6334.jpg rename to nuxt/public/blog/2023/11/images/IMG_6334.jpg diff --git a/src/blog/2023/11/images/SPS-FlowFuse.png b/nuxt/public/blog/2023/11/images/SPS-FlowFuse.png similarity index 100% rename from src/blog/2023/11/images/SPS-FlowFuse.png rename to nuxt/public/blog/2023/11/images/SPS-FlowFuse.png diff --git a/src/blog/2023/11/images/ai-assistant.png b/nuxt/public/blog/2023/11/images/ai-assistant.png similarity index 100% rename from src/blog/2023/11/images/ai-assistant.png rename to nuxt/public/blog/2023/11/images/ai-assistant.png diff --git a/src/blog/2023/11/images/ai-flows.png b/nuxt/public/blog/2023/11/images/ai-flows.png similarity index 100% rename from src/blog/2023/11/images/ai-flows.png rename to nuxt/public/blog/2023/11/images/ai-flows.png diff --git a/src/blog/2023/11/images/balena-env-var.png b/nuxt/public/blog/2023/11/images/balena-env-var.png similarity index 100% rename from src/blog/2023/11/images/balena-env-var.png rename to nuxt/public/blog/2023/11/images/balena-env-var.png diff --git a/src/blog/2023/11/images/balena.png b/nuxt/public/blog/2023/11/images/balena.png similarity index 100% rename from src/blog/2023/11/images/balena.png rename to nuxt/public/blog/2023/11/images/balena.png diff --git a/src/blog/2023/11/images/chatgpt-GPT.png b/nuxt/public/blog/2023/11/images/chatgpt-GPT.png similarity index 100% rename from src/blog/2023/11/images/chatgpt-GPT.png rename to nuxt/public/blog/2023/11/images/chatgpt-GPT.png diff --git a/src/blog/2023/11/images/dashboard-0-8-0.png b/nuxt/public/blog/2023/11/images/dashboard-0-8-0.png similarity index 100% rename from src/blog/2023/11/images/dashboard-0-8-0.png rename to nuxt/public/blog/2023/11/images/dashboard-0-8-0.png diff --git a/src/blog/2023/11/images/dashboard-build.png b/nuxt/public/blog/2023/11/images/dashboard-build.png similarity index 100% rename from src/blog/2023/11/images/dashboard-build.png rename to nuxt/public/blog/2023/11/images/dashboard-build.png diff --git a/src/blog/2023/11/images/dashboard-user-flow.png b/nuxt/public/blog/2023/11/images/dashboard-user-flow.png similarity index 100% rename from src/blog/2023/11/images/dashboard-user-flow.png rename to nuxt/public/blog/2023/11/images/dashboard-user-flow.png diff --git a/src/blog/2023/11/images/debug-view.png b/nuxt/public/blog/2023/11/images/debug-view.png similarity index 100% rename from src/blog/2023/11/images/debug-view.png rename to nuxt/public/blog/2023/11/images/debug-view.png diff --git a/src/blog/2023/11/images/migration-guide-snippet.png b/nuxt/public/blog/2023/11/images/migration-guide-snippet.png similarity index 100% rename from src/blog/2023/11/images/migration-guide-snippet.png rename to nuxt/public/blog/2023/11/images/migration-guide-snippet.png diff --git a/src/blog/2023/11/images/tile-blog-dashboard-migration.png b/nuxt/public/blog/2023/11/images/tile-blog-dashboard-migration.png similarity index 100% rename from src/blog/2023/11/images/tile-blog-dashboard-migration.png rename to nuxt/public/blog/2023/11/images/tile-blog-dashboard-migration.png diff --git a/src/blog/2023/11/images/ui-chart-keymap-properties.png b/nuxt/public/blog/2023/11/images/ui-chart-keymap-properties.png similarity index 100% rename from src/blog/2023/11/images/ui-chart-keymap-properties.png rename to nuxt/public/blog/2023/11/images/ui-chart-keymap-properties.png diff --git a/src/blog/2023/11/images/ui-chart-mapping.png b/nuxt/public/blog/2023/11/images/ui-chart-mapping.png similarity index 100% rename from src/blog/2023/11/images/ui-chart-mapping.png rename to nuxt/public/blog/2023/11/images/ui-chart-mapping.png diff --git a/src/blog/2023/11/images/ui-chart-multipoint.png b/nuxt/public/blog/2023/11/images/ui-chart-multipoint.png similarity index 100% rename from src/blog/2023/11/images/ui-chart-multipoint.png rename to nuxt/public/blog/2023/11/images/ui-chart-multipoint.png diff --git a/src/blog/2023/11/images/ui-chart-series-property.png b/nuxt/public/blog/2023/11/images/ui-chart-series-property.png similarity index 100% rename from src/blog/2023/11/images/ui-chart-series-property.png rename to nuxt/public/blog/2023/11/images/ui-chart-series-property.png diff --git a/src/blog/2023/12/images/2023-review.png b/nuxt/public/blog/2023/12/images/2023-review.png similarity index 100% rename from src/blog/2023/12/images/2023-review.png rename to nuxt/public/blog/2023/12/images/2023-review.png diff --git a/src/blog/2023/12/images/agent-as-windows-service.png b/nuxt/public/blog/2023/12/images/agent-as-windows-service.png similarity index 100% rename from src/blog/2023/12/images/agent-as-windows-service.png rename to nuxt/public/blog/2023/12/images/agent-as-windows-service.png diff --git a/src/blog/2023/12/images/beyond-automation.png b/nuxt/public/blog/2023/12/images/beyond-automation.png similarity index 100% rename from src/blog/2023/12/images/beyond-automation.png rename to nuxt/public/blog/2023/12/images/beyond-automation.png diff --git a/src/blog/2023/12/images/dashboard-video-1.png b/nuxt/public/blog/2023/12/images/dashboard-video-1.png similarity index 100% rename from src/blog/2023/12/images/dashboard-video-1.png rename to nuxt/public/blog/2023/12/images/dashboard-video-1.png diff --git a/src/blog/2023/12/images/dashboard-video-2.png b/nuxt/public/blog/2023/12/images/dashboard-video-2.png similarity index 100% rename from src/blog/2023/12/images/dashboard-video-2.png rename to nuxt/public/blog/2023/12/images/dashboard-video-2.png diff --git a/src/blog/2023/12/images/intro-uns-cta-1.png b/nuxt/public/blog/2023/12/images/intro-uns-cta-1.png similarity index 100% rename from src/blog/2023/12/images/intro-uns-cta-1.png rename to nuxt/public/blog/2023/12/images/intro-uns-cta-1.png diff --git a/src/blog/2023/12/images/introduction-to-uns.png b/nuxt/public/blog/2023/12/images/introduction-to-uns.png similarity index 100% rename from src/blog/2023/12/images/introduction-to-uns.png rename to nuxt/public/blog/2023/12/images/introduction-to-uns.png diff --git a/src/blog/2023/12/images/mqtt_topic_tree.png b/nuxt/public/blog/2023/12/images/mqtt_topic_tree.png similarity index 100% rename from src/blog/2023/12/images/mqtt_topic_tree.png rename to nuxt/public/blog/2023/12/images/mqtt_topic_tree.png diff --git a/src/blog/2023/12/images/nssm_service_editor.png b/nuxt/public/blog/2023/12/images/nssm_service_editor.png similarity index 100% rename from src/blog/2023/12/images/nssm_service_editor.png rename to nuxt/public/blog/2023/12/images/nssm_service_editor.png diff --git a/src/blog/2023/12/images/revpi_nodes.png b/nuxt/public/blog/2023/12/images/revpi_nodes.png similarity index 100% rename from src/blog/2023/12/images/revpi_nodes.png rename to nuxt/public/blog/2023/12/images/revpi_nodes.png diff --git a/src/blog/2023/12/images/team_library.png b/nuxt/public/blog/2023/12/images/team_library.png similarity index 100% rename from src/blog/2023/12/images/team_library.png rename to nuxt/public/blog/2023/12/images/team_library.png diff --git a/src/blog/2023/12/images/template_node.png b/nuxt/public/blog/2023/12/images/template_node.png similarity index 100% rename from src/blog/2023/12/images/template_node.png rename to nuxt/public/blog/2023/12/images/template_node.png diff --git a/src/blog/2023/12/images/tile-dashboard-0-10-0.png b/nuxt/public/blog/2023/12/images/tile-dashboard-0-10-0.png similarity index 100% rename from src/blog/2023/12/images/tile-dashboard-0-10-0.png rename to nuxt/public/blog/2023/12/images/tile-dashboard-0-10-0.png diff --git a/src/blog/2023/12/images/uns-data-modeling.png b/nuxt/public/blog/2023/12/images/uns-data-modeling.png similarity index 100% rename from src/blog/2023/12/images/uns-data-modeling.png rename to nuxt/public/blog/2023/12/images/uns-data-modeling.png diff --git a/src/blog/2023/12/images/uns-hub.png b/nuxt/public/blog/2023/12/images/uns-hub.png similarity index 100% rename from src/blog/2023/12/images/uns-hub.png rename to nuxt/public/blog/2023/12/images/uns-hub.png diff --git a/src/blog/2023/12/images/uns-point-to-point.png b/nuxt/public/blog/2023/12/images/uns-point-to-point.png similarity index 100% rename from src/blog/2023/12/images/uns-point-to-point.png rename to nuxt/public/blog/2023/12/images/uns-point-to-point.png diff --git a/src/blog/2024/01/images/Futuristic factory with robots.png b/nuxt/public/blog/2024/01/images/Futuristic factory with robots.png similarity index 100% rename from src/blog/2024/01/images/Futuristic factory with robots.png rename to nuxt/public/blog/2024/01/images/Futuristic factory with robots.png diff --git a/src/blog/2024/01/images/balena-and-flowfuse.png b/nuxt/public/blog/2024/01/images/balena-and-flowfuse.png similarity index 100% rename from src/blog/2024/01/images/balena-and-flowfuse.png rename to nuxt/public/blog/2024/01/images/balena-and-flowfuse.png diff --git a/src/blog/2024/01/images/broker-for-uns.png b/nuxt/public/blog/2024/01/images/broker-for-uns.png similarity index 100% rename from src/blog/2024/01/images/broker-for-uns.png rename to nuxt/public/blog/2024/01/images/broker-for-uns.png diff --git a/src/blog/2024/01/images/capture-data-from-edge-devices.png b/nuxt/public/blog/2024/01/images/capture-data-from-edge-devices.png similarity index 100% rename from src/blog/2024/01/images/capture-data-from-edge-devices.png rename to nuxt/public/blog/2024/01/images/capture-data-from-edge-devices.png diff --git a/src/blog/2024/01/images/csv-dashboard.png b/nuxt/public/blog/2024/01/images/csv-dashboard.png similarity index 100% rename from src/blog/2024/01/images/csv-dashboard.png rename to nuxt/public/blog/2024/01/images/csv-dashboard.png diff --git a/src/blog/2024/01/images/csv_upload_app.png b/nuxt/public/blog/2024/01/images/csv_upload_app.png similarity index 100% rename from src/blog/2024/01/images/csv_upload_app.png rename to nuxt/public/blog/2024/01/images/csv_upload_app.png diff --git a/src/blog/2024/01/images/dashboard-ga-example.png b/nuxt/public/blog/2024/01/images/dashboard-ga-example.png similarity index 100% rename from src/blog/2024/01/images/dashboard-ga-example.png rename to nuxt/public/blog/2024/01/images/dashboard-ga-example.png diff --git a/src/blog/2024/01/images/device-yml-flowfuse.png b/nuxt/public/blog/2024/01/images/device-yml-flowfuse.png similarity index 100% rename from src/blog/2024/01/images/device-yml-flowfuse.png rename to nuxt/public/blog/2024/01/images/device-yml-flowfuse.png diff --git a/src/blog/2024/01/images/flowfuse-2-release.png b/nuxt/public/blog/2024/01/images/flowfuse-2-release.png similarity index 100% rename from src/blog/2024/01/images/flowfuse-2-release.png rename to nuxt/public/blog/2024/01/images/flowfuse-2-release.png diff --git a/src/blog/2024/01/images/flowfuse-agent-setup.png b/nuxt/public/blog/2024/01/images/flowfuse-agent-setup.png similarity index 100% rename from src/blog/2024/01/images/flowfuse-agent-setup.png rename to nuxt/public/blog/2024/01/images/flowfuse-agent-setup.png diff --git a/src/blog/2024/01/images/import-file-to-node-red.png b/nuxt/public/blog/2024/01/images/import-file-to-node-red.png similarity index 100% rename from src/blog/2024/01/images/import-file-to-node-red.png rename to nuxt/public/blog/2024/01/images/import-file-to-node-red.png diff --git a/src/blog/2024/01/images/multi-user-dashboard-admin-tasks.png b/nuxt/public/blog/2024/01/images/multi-user-dashboard-admin-tasks.png similarity index 100% rename from src/blog/2024/01/images/multi-user-dashboard-admin-tasks.png rename to nuxt/public/blog/2024/01/images/multi-user-dashboard-admin-tasks.png diff --git a/src/blog/2024/01/images/multi-user-dashboard-admin.png b/nuxt/public/blog/2024/01/images/multi-user-dashboard-admin.png similarity index 100% rename from src/blog/2024/01/images/multi-user-dashboard-admin.png rename to nuxt/public/blog/2024/01/images/multi-user-dashboard-admin.png diff --git a/src/blog/2024/01/images/multi-user-dashboard-ff-settings.png b/nuxt/public/blog/2024/01/images/multi-user-dashboard-ff-settings.png similarity index 100% rename from src/blog/2024/01/images/multi-user-dashboard-ff-settings.png rename to nuxt/public/blog/2024/01/images/multi-user-dashboard-ff-settings.png diff --git a/src/blog/2024/01/images/multi-user-dashboard-ffauth.png b/nuxt/public/blog/2024/01/images/multi-user-dashboard-ffauth.png similarity index 100% rename from src/blog/2024/01/images/multi-user-dashboard-ffauth.png rename to nuxt/public/blog/2024/01/images/multi-user-dashboard-ffauth.png diff --git a/src/blog/2024/01/images/multi-user-dashboard-user2.png b/nuxt/public/blog/2024/01/images/multi-user-dashboard-user2.png similarity index 100% rename from src/blog/2024/01/images/multi-user-dashboard-user2.png rename to nuxt/public/blog/2024/01/images/multi-user-dashboard-user2.png diff --git a/src/blog/2024/01/images/professional-services-for-your-node-red.png b/nuxt/public/blog/2024/01/images/professional-services-for-your-node-red.png similarity index 100% rename from src/blog/2024/01/images/professional-services-for-your-node-red.png rename to nuxt/public/blog/2024/01/images/professional-services-for-your-node-red.png diff --git a/src/blog/2024/01/images/send-file-to-node-red.png b/nuxt/public/blog/2024/01/images/send-file-to-node-red.png similarity index 100% rename from src/blog/2024/01/images/send-file-to-node-red.png rename to nuxt/public/blog/2024/01/images/send-file-to-node-red.png diff --git a/src/blog/2024/01/images/sentiement-analysis-flowfuse-editor.png b/nuxt/public/blog/2024/01/images/sentiement-analysis-flowfuse-editor.png similarity index 100% rename from src/blog/2024/01/images/sentiement-analysis-flowfuse-editor.png rename to nuxt/public/blog/2024/01/images/sentiement-analysis-flowfuse-editor.png diff --git a/src/blog/2024/01/images/sentiment-analysis-change-node(2).png b/nuxt/public/blog/2024/01/images/sentiment-analysis-change-node(2).png similarity index 100% rename from src/blog/2024/01/images/sentiment-analysis-change-node(2).png rename to nuxt/public/blog/2024/01/images/sentiment-analysis-change-node(2).png diff --git a/src/blog/2024/01/images/sentiment-analysis-dashboard-gif.gif b/nuxt/public/blog/2024/01/images/sentiment-analysis-dashboard-gif.gif similarity index 100% rename from src/blog/2024/01/images/sentiment-analysis-dashboard-gif.gif rename to nuxt/public/blog/2024/01/images/sentiment-analysis-dashboard-gif.gif diff --git a/src/blog/2024/01/images/sentiment-analysis-dashboard-gif.webm b/nuxt/public/blog/2024/01/images/sentiment-analysis-dashboard-gif.webm similarity index 100% rename from src/blog/2024/01/images/sentiment-analysis-dashboard-gif.webm rename to nuxt/public/blog/2024/01/images/sentiment-analysis-dashboard-gif.webm diff --git a/src/blog/2024/01/images/sentiment-analysis-form.png b/nuxt/public/blog/2024/01/images/sentiment-analysis-form.png similarity index 100% rename from src/blog/2024/01/images/sentiment-analysis-form.png rename to nuxt/public/blog/2024/01/images/sentiment-analysis-form.png diff --git a/src/blog/2024/01/images/sentiment-anlaysis-change-node(1).png b/nuxt/public/blog/2024/01/images/sentiment-anlaysis-change-node(1).png similarity index 100% rename from src/blog/2024/01/images/sentiment-anlaysis-change-node(1).png rename to nuxt/public/blog/2024/01/images/sentiment-anlaysis-change-node(1).png diff --git a/src/blog/2024/01/images/sentiment-anlaysis-flow.png b/nuxt/public/blog/2024/01/images/sentiment-anlaysis-flow.png similarity index 100% rename from src/blog/2024/01/images/sentiment-anlaysis-flow.png rename to nuxt/public/blog/2024/01/images/sentiment-anlaysis-flow.png diff --git a/src/blog/2024/01/images/soc-2-compliant.png b/nuxt/public/blog/2024/01/images/soc-2-compliant.png similarity index 100% rename from src/blog/2024/01/images/soc-2-compliant.png rename to nuxt/public/blog/2024/01/images/soc-2-compliant.png diff --git a/src/blog/2024/01/images/speech-driven-chatbot-change-node.png b/nuxt/public/blog/2024/01/images/speech-driven-chatbot-change-node.png similarity index 100% rename from src/blog/2024/01/images/speech-driven-chatbot-change-node.png rename to nuxt/public/blog/2024/01/images/speech-driven-chatbot-change-node.png diff --git a/src/blog/2024/01/images/speech-driven-chatbot-environment-section.png b/nuxt/public/blog/2024/01/images/speech-driven-chatbot-environment-section.png similarity index 100% rename from src/blog/2024/01/images/speech-driven-chatbot-environment-section.png rename to nuxt/public/blog/2024/01/images/speech-driven-chatbot-environment-section.png diff --git a/src/blog/2024/01/images/speech-driven-chatbot-flow.png b/nuxt/public/blog/2024/01/images/speech-driven-chatbot-flow.png similarity index 100% rename from src/blog/2024/01/images/speech-driven-chatbot-flow.png rename to nuxt/public/blog/2024/01/images/speech-driven-chatbot-flow.png diff --git a/src/blog/2024/01/images/speech-driven-chatbot-flowfue-editor.png b/nuxt/public/blog/2024/01/images/speech-driven-chatbot-flowfue-editor.png similarity index 100% rename from src/blog/2024/01/images/speech-driven-chatbot-flowfue-editor.png rename to nuxt/public/blog/2024/01/images/speech-driven-chatbot-flowfue-editor.png diff --git a/src/blog/2024/01/images/speech-driven-chatbot-system.gif b/nuxt/public/blog/2024/01/images/speech-driven-chatbot-system.gif similarity index 100% rename from src/blog/2024/01/images/speech-driven-chatbot-system.gif rename to nuxt/public/blog/2024/01/images/speech-driven-chatbot-system.gif diff --git a/src/blog/2024/01/images/speech-driven-chatbot-system.webm b/nuxt/public/blog/2024/01/images/speech-driven-chatbot-system.webm similarity index 100% rename from src/blog/2024/01/images/speech-driven-chatbot-system.webm rename to nuxt/public/blog/2024/01/images/speech-driven-chatbot-system.webm diff --git a/src/blog/2024/01/images/storing-data-getting-started-with-node-red.png b/nuxt/public/blog/2024/01/images/storing-data-getting-started-with-node-red.png similarity index 100% rename from src/blog/2024/01/images/storing-data-getting-started-with-node-red.png rename to nuxt/public/blog/2024/01/images/storing-data-getting-started-with-node-red.png diff --git a/src/blog/2024/01/images/tile-dashboard-2-ga.png b/nuxt/public/blog/2024/01/images/tile-dashboard-2-ga.png similarity index 100% rename from src/blog/2024/01/images/tile-dashboard-2-ga.png rename to nuxt/public/blog/2024/01/images/tile-dashboard-2-ga.png diff --git a/src/blog/2024/01/images/tile-dashboard-2-multi-user.png b/nuxt/public/blog/2024/01/images/tile-dashboard-2-multi-user.png similarity index 100% rename from src/blog/2024/01/images/tile-dashboard-2-multi-user.png rename to nuxt/public/blog/2024/01/images/tile-dashboard-2-multi-user.png diff --git a/src/blog/2024/01/images/when-not-to-use-the-uns.png b/nuxt/public/blog/2024/01/images/when-not-to-use-the-uns.png similarity index 100% rename from src/blog/2024/01/images/when-not-to-use-the-uns.png rename to nuxt/public/blog/2024/01/images/when-not-to-use-the-uns.png diff --git a/src/blog/2024/02/images/citizen-development.png b/nuxt/public/blog/2024/02/images/citizen-development.png similarity index 100% rename from src/blog/2024/02/images/citizen-development.png rename to nuxt/public/blog/2024/02/images/citizen-development.png diff --git a/src/blog/2024/02/images/data-outside-msg-payload.webm b/nuxt/public/blog/2024/02/images/data-outside-msg-payload.webm similarity index 100% rename from src/blog/2024/02/images/data-outside-msg-payload.webm rename to nuxt/public/blog/2024/02/images/data-outside-msg-payload.webm diff --git a/src/blog/2024/02/images/delete-other.webm b/nuxt/public/blog/2024/02/images/delete-other.webm similarity index 100% rename from src/blog/2024/02/images/delete-other.webm rename to nuxt/public/blog/2024/02/images/delete-other.webm diff --git a/src/blog/2024/02/images/delete.png b/nuxt/public/blog/2024/02/images/delete.png similarity index 100% rename from src/blog/2024/02/images/delete.png rename to nuxt/public/blog/2024/02/images/delete.png diff --git a/src/blog/2024/02/images/history-cloud-catalog.png b/nuxt/public/blog/2024/02/images/history-cloud-catalog.png similarity index 100% rename from src/blog/2024/02/images/history-cloud-catalog.png rename to nuxt/public/blog/2024/02/images/history-cloud-catalog.png diff --git a/src/blog/2024/02/images/history-ibm-lab.jpg b/nuxt/public/blog/2024/02/images/history-ibm-lab.jpg similarity index 100% rename from src/blog/2024/02/images/history-ibm-lab.jpg rename to nuxt/public/blog/2024/02/images/history-ibm-lab.jpg diff --git a/src/blog/2024/02/images/history-nr-screenshot.png b/nuxt/public/blog/2024/02/images/history-nr-screenshot.png similarity index 100% rename from src/blog/2024/02/images/history-nr-screenshot.png rename to nuxt/public/blog/2024/02/images/history-nr-screenshot.png diff --git a/src/blog/2024/02/images/history-of-node-red.png b/nuxt/public/blog/2024/02/images/history-of-node-red.png similarity index 100% rename from src/blog/2024/02/images/history-of-node-red.png rename to nuxt/public/blog/2024/02/images/history-of-node-red.png diff --git a/src/blog/2024/02/images/kep-endpoint-definition.png b/nuxt/public/blog/2024/02/images/kep-endpoint-definition.png similarity index 100% rename from src/blog/2024/02/images/kep-endpoint-definition.png rename to nuxt/public/blog/2024/02/images/kep-endpoint-definition.png diff --git a/src/blog/2024/02/images/kepserverex-tray.png b/nuxt/public/blog/2024/02/images/kepserverex-tray.png similarity index 100% rename from src/blog/2024/02/images/kepserverex-tray.png rename to nuxt/public/blog/2024/02/images/kepserverex-tray.png diff --git a/src/blog/2024/02/images/kepserverex-trusted-client-after.png b/nuxt/public/blog/2024/02/images/kepserverex-trusted-client-after.png similarity index 100% rename from src/blog/2024/02/images/kepserverex-trusted-client-after.png rename to nuxt/public/blog/2024/02/images/kepserverex-trusted-client-after.png diff --git a/src/blog/2024/02/images/kepserverex-trusted-client-before.png b/nuxt/public/blog/2024/02/images/kepserverex-trusted-client-before.png similarity index 100% rename from src/blog/2024/02/images/kepserverex-trusted-client-before.png rename to nuxt/public/blog/2024/02/images/kepserverex-trusted-client-before.png diff --git a/src/blog/2024/02/images/kepware-opc-browsed-tags-node-red.png b/nuxt/public/blog/2024/02/images/kepware-opc-browsed-tags-node-red.png similarity index 100% rename from src/blog/2024/02/images/kepware-opc-browsed-tags-node-red.png rename to nuxt/public/blog/2024/02/images/kepware-opc-browsed-tags-node-red.png diff --git a/src/blog/2024/02/images/kepware-quick-client.png b/nuxt/public/blog/2024/02/images/kepware-quick-client.png similarity index 100% rename from src/blog/2024/02/images/kepware-quick-client.png rename to nuxt/public/blog/2024/02/images/kepware-quick-client.png diff --git a/src/blog/2024/02/images/node-red-debug-output-opc.png b/nuxt/public/blog/2024/02/images/node-red-debug-output-opc.png similarity index 100% rename from src/blog/2024/02/images/node-red-debug-output-opc.png rename to nuxt/public/blog/2024/02/images/node-red-debug-output-opc.png diff --git a/src/blog/2024/02/images/node-red-debug-output-write-opc.png b/nuxt/public/blog/2024/02/images/node-red-debug-output-write-opc.png similarity index 100% rename from src/blog/2024/02/images/node-red-debug-output-write-opc.png rename to nuxt/public/blog/2024/02/images/node-red-debug-output-write-opc.png diff --git a/src/blog/2024/02/images/node-red-debugger.png b/nuxt/public/blog/2024/02/images/node-red-debugger.png similarity index 100% rename from src/blog/2024/02/images/node-red-debugger.png rename to nuxt/public/blog/2024/02/images/node-red-debugger.png diff --git a/src/blog/2024/02/images/node-red-for-uns.png b/nuxt/public/blog/2024/02/images/node-red-for-uns.png similarity index 100% rename from src/blog/2024/02/images/node-red-for-uns.png rename to nuxt/public/blog/2024/02/images/node-red-for-uns.png diff --git a/src/blog/2024/02/images/node-red-kepware-anonymous-login.png b/nuxt/public/blog/2024/02/images/node-red-kepware-anonymous-login.png similarity index 100% rename from src/blog/2024/02/images/node-red-kepware-anonymous-login.png rename to nuxt/public/blog/2024/02/images/node-red-kepware-anonymous-login.png diff --git a/src/blog/2024/02/images/node-red-kepware-read-tag.png b/nuxt/public/blog/2024/02/images/node-red-kepware-read-tag.png similarity index 100% rename from src/blog/2024/02/images/node-red-kepware-read-tag.png rename to nuxt/public/blog/2024/02/images/node-red-kepware-read-tag.png diff --git a/src/blog/2024/02/images/node-red-kepware-write-tag.png b/nuxt/public/blog/2024/02/images/node-red-kepware-write-tag.png similarity index 100% rename from src/blog/2024/02/images/node-red-kepware-write-tag.png rename to nuxt/public/blog/2024/02/images/node-red-kepware-write-tag.png diff --git a/src/blog/2024/02/images/node-red-linter.png b/nuxt/public/blog/2024/02/images/node-red-linter.png similarity index 100% rename from src/blog/2024/02/images/node-red-linter.png rename to nuxt/public/blog/2024/02/images/node-red-linter.png diff --git a/src/blog/2024/02/images/node-red-opc-ua-invalid-endpoint.png b/nuxt/public/blog/2024/02/images/node-red-opc-ua-invalid-endpoint.png similarity index 100% rename from src/blog/2024/02/images/node-red-opc-ua-invalid-endpoint.png rename to nuxt/public/blog/2024/02/images/node-red-opc-ua-invalid-endpoint.png diff --git a/src/blog/2024/02/images/node-red-sidebar.png b/nuxt/public/blog/2024/02/images/node-red-sidebar.png similarity index 100% rename from src/blog/2024/02/images/node-red-sidebar.png rename to nuxt/public/blog/2024/02/images/node-red-sidebar.png diff --git a/src/blog/2024/02/images/node-red-to-kepware.png b/nuxt/public/blog/2024/02/images/node-red-to-kepware.png similarity index 100% rename from src/blog/2024/02/images/node-red-to-kepware.png rename to nuxt/public/blog/2024/02/images/node-red-to-kepware.png diff --git a/src/blog/2024/02/images/opcua-endpoint-node-red-encrypted.png b/nuxt/public/blog/2024/02/images/opcua-endpoint-node-red-encrypted.png similarity index 100% rename from src/blog/2024/02/images/opcua-endpoint-node-red-encrypted.png rename to nuxt/public/blog/2024/02/images/opcua-endpoint-node-red-encrypted.png diff --git a/src/blog/2024/02/images/race-condition.webm b/nuxt/public/blog/2024/02/images/race-condition.webm similarity index 100% rename from src/blog/2024/02/images/race-condition.webm rename to nuxt/public/blog/2024/02/images/race-condition.webm diff --git a/src/blog/2024/02/images/software-development-practices-to-node-red.png b/nuxt/public/blog/2024/02/images/software-development-practices-to-node-red.png similarity index 100% rename from src/blog/2024/02/images/software-development-practices-to-node-red.png rename to nuxt/public/blog/2024/02/images/software-development-practices-to-node-red.png diff --git a/src/blog/2024/02/images/storing-data-getting-started-with-node-red.png b/nuxt/public/blog/2024/02/images/storing-data-getting-started-with-node-red.png similarity index 100% rename from src/blog/2024/02/images/storing-data-getting-started-with-node-red.png rename to nuxt/public/blog/2024/02/images/storing-data-getting-started-with-node-red.png diff --git a/src/blog/2024/02/images/sunset-example.webm b/nuxt/public/blog/2024/02/images/sunset-example.webm similarity index 100% rename from src/blog/2024/02/images/sunset-example.webm rename to nuxt/public/blog/2024/02/images/sunset-example.webm diff --git a/src/blog/2024/02/images/unified-namespace-architecture.png b/nuxt/public/blog/2024/02/images/unified-namespace-architecture.png similarity index 100% rename from src/blog/2024/02/images/unified-namespace-architecture.png rename to nuxt/public/blog/2024/02/images/unified-namespace-architecture.png diff --git a/src/blog/2024/03/images/Flowfuse-Gallarus-Partnership.png b/nuxt/public/blog/2024/03/images/Flowfuse-Gallarus-Partnership.png similarity index 100% rename from src/blog/2024/03/images/Flowfuse-Gallarus-Partnership.png rename to nuxt/public/blog/2024/03/images/Flowfuse-Gallarus-Partnership.png diff --git a/src/blog/2024/03/images/dashboard-getting-started-add-widget.webm b/nuxt/public/blog/2024/03/images/dashboard-getting-started-add-widget.webm similarity index 100% rename from src/blog/2024/03/images/dashboard-getting-started-add-widget.webm rename to nuxt/public/blog/2024/03/images/dashboard-getting-started-add-widget.webm diff --git a/src/blog/2024/03/images/dashboard-getting-started-btn-config.png b/nuxt/public/blog/2024/03/images/dashboard-getting-started-btn-config.png similarity index 100% rename from src/blog/2024/03/images/dashboard-getting-started-btn-config.png rename to nuxt/public/blog/2024/03/images/dashboard-getting-started-btn-config.png diff --git a/src/blog/2024/03/images/dashboard-getting-started-example.png b/nuxt/public/blog/2024/03/images/dashboard-getting-started-example.png similarity index 100% rename from src/blog/2024/03/images/dashboard-getting-started-example.png rename to nuxt/public/blog/2024/03/images/dashboard-getting-started-example.png diff --git a/src/blog/2024/03/images/dashboard-getting-started-final.png b/nuxt/public/blog/2024/03/images/dashboard-getting-started-final.png similarity index 100% rename from src/blog/2024/03/images/dashboard-getting-started-final.png rename to nuxt/public/blog/2024/03/images/dashboard-getting-started-final.png diff --git a/src/blog/2024/03/images/dashboard-getting-started-final.webm b/nuxt/public/blog/2024/03/images/dashboard-getting-started-final.webm similarity index 100% rename from src/blog/2024/03/images/dashboard-getting-started-final.webm rename to nuxt/public/blog/2024/03/images/dashboard-getting-started-final.webm diff --git a/src/blog/2024/03/images/dashboard-getting-started-flow.png b/nuxt/public/blog/2024/03/images/dashboard-getting-started-flow.png similarity index 100% rename from src/blog/2024/03/images/dashboard-getting-started-flow.png rename to nuxt/public/blog/2024/03/images/dashboard-getting-started-flow.png diff --git a/src/blog/2024/03/images/dashboard-getting-started-layout.png b/nuxt/public/blog/2024/03/images/dashboard-getting-started-layout.png similarity index 100% rename from src/blog/2024/03/images/dashboard-getting-started-layout.png rename to nuxt/public/blog/2024/03/images/dashboard-getting-started-layout.png diff --git a/src/blog/2024/03/images/dashboard-getting-started-manage-palette.png b/nuxt/public/blog/2024/03/images/dashboard-getting-started-manage-palette.png similarity index 100% rename from src/blog/2024/03/images/dashboard-getting-started-manage-palette.png rename to nuxt/public/blog/2024/03/images/dashboard-getting-started-manage-palette.png diff --git a/src/blog/2024/03/images/dashboard-getting-started-new-group.png b/nuxt/public/blog/2024/03/images/dashboard-getting-started-new-group.png similarity index 100% rename from src/blog/2024/03/images/dashboard-getting-started-new-group.png rename to nuxt/public/blog/2024/03/images/dashboard-getting-started-new-group.png diff --git a/src/blog/2024/03/images/dashboard-getting-started-search-install.png b/nuxt/public/blog/2024/03/images/dashboard-getting-started-search-install.png similarity index 100% rename from src/blog/2024/03/images/dashboard-getting-started-search-install.png rename to nuxt/public/blog/2024/03/images/dashboard-getting-started-search-install.png diff --git a/src/blog/2024/03/images/dashboard-getting-started-sidebar.png b/nuxt/public/blog/2024/03/images/dashboard-getting-started-sidebar.png similarity index 100% rename from src/blog/2024/03/images/dashboard-getting-started-sidebar.png rename to nuxt/public/blog/2024/03/images/dashboard-getting-started-sidebar.png diff --git a/src/blog/2024/03/images/getting-started-with-dashboard-2.png b/nuxt/public/blog/2024/03/images/getting-started-with-dashboard-2.png similarity index 100% rename from src/blog/2024/03/images/getting-started-with-dashboard-2.png rename to nuxt/public/blog/2024/03/images/getting-started-with-dashboard-2.png diff --git a/src/blog/2024/03/images/looking-towards-node-red-4.png b/nuxt/public/blog/2024/03/images/looking-towards-node-red-4.png similarity index 100% rename from src/blog/2024/03/images/looking-towards-node-red-4.png rename to nuxt/public/blog/2024/03/images/looking-towards-node-red-4.png diff --git a/src/blog/2024/03/images/low-code-is-better.png b/nuxt/public/blog/2024/03/images/low-code-is-better.png similarity index 100% rename from src/blog/2024/03/images/low-code-is-better.png rename to nuxt/public/blog/2024/03/images/low-code-is-better.png diff --git a/src/blog/2024/03/images/node-authentication.png b/nuxt/public/blog/2024/03/images/node-authentication.png similarity index 100% rename from src/blog/2024/03/images/node-authentication.png rename to nuxt/public/blog/2024/03/images/node-authentication.png diff --git a/src/blog/2024/03/images/node-red-vpn.png b/nuxt/public/blog/2024/03/images/node-red-vpn.png similarity index 100% rename from src/blog/2024/03/images/node-red-vpn.png rename to nuxt/public/blog/2024/03/images/node-red-vpn.png diff --git a/src/blog/2024/03/images/nr4-auto-complete.png b/nuxt/public/blog/2024/03/images/nr4-auto-complete.png similarity index 100% rename from src/blog/2024/03/images/nr4-auto-complete.png rename to nuxt/public/blog/2024/03/images/nr4-auto-complete.png diff --git a/src/blog/2024/03/images/nr4-timestamp-formatting.png b/nuxt/public/blog/2024/03/images/nr4-timestamp-formatting.png similarity index 100% rename from src/blog/2024/03/images/nr4-timestamp-formatting.png rename to nuxt/public/blog/2024/03/images/nr4-timestamp-formatting.png diff --git a/src/blog/2024/03/images/open-source-tier-resource-limits.png b/nuxt/public/blog/2024/03/images/open-source-tier-resource-limits.png similarity index 100% rename from src/blog/2024/03/images/open-source-tier-resource-limits.png rename to nuxt/public/blog/2024/03/images/open-source-tier-resource-limits.png diff --git a/src/blog/2024/03/images/scaling-node-red-with-flowfuse.png b/nuxt/public/blog/2024/03/images/scaling-node-red-with-flowfuse.png similarity index 100% rename from src/blog/2024/03/images/scaling-node-red-with-flowfuse.png rename to nuxt/public/blog/2024/03/images/scaling-node-red-with-flowfuse.png diff --git a/src/blog/2024/03/images/using-kafka-in-manufacturing-kafka-architecture.png b/nuxt/public/blog/2024/03/images/using-kafka-in-manufacturing-kafka-architecture.png similarity index 100% rename from src/blog/2024/03/images/using-kafka-in-manufacturing-kafka-architecture.png rename to nuxt/public/blog/2024/03/images/using-kafka-in-manufacturing-kafka-architecture.png diff --git a/src/blog/2024/03/images/using-kafka-in-manufacturing.png b/nuxt/public/blog/2024/03/images/using-kafka-in-manufacturing.png similarity index 100% rename from src/blog/2024/03/images/using-kafka-in-manufacturing.png rename to nuxt/public/blog/2024/03/images/using-kafka-in-manufacturing.png diff --git a/src/blog/2024/03/images/using-kafka-with-node-red-change-node.png b/nuxt/public/blog/2024/03/images/using-kafka-with-node-red-change-node.png similarity index 100% rename from src/blog/2024/03/images/using-kafka-with-node-red-change-node.png rename to nuxt/public/blog/2024/03/images/using-kafka-with-node-red-change-node.png diff --git a/src/blog/2024/03/images/using-kafka-with-node-red-creating-topic.png b/nuxt/public/blog/2024/03/images/using-kafka-with-node-red-creating-topic.png similarity index 100% rename from src/blog/2024/03/images/using-kafka-with-node-red-creating-topic.png rename to nuxt/public/blog/2024/03/images/using-kafka-with-node-red-creating-topic.png diff --git a/src/blog/2024/03/images/using-kafka-with-node-red-inject-node.png b/nuxt/public/blog/2024/03/images/using-kafka-with-node-red-inject-node.png similarity index 100% rename from src/blog/2024/03/images/using-kafka-with-node-red-inject-node.png rename to nuxt/public/blog/2024/03/images/using-kafka-with-node-red-inject-node.png diff --git a/src/blog/2024/03/images/using-kafka-with-node-red-kafka-configuration.png b/nuxt/public/blog/2024/03/images/using-kafka-with-node-red-kafka-configuration.png similarity index 100% rename from src/blog/2024/03/images/using-kafka-with-node-red-kafka-configuration.png rename to nuxt/public/blog/2024/03/images/using-kafka-with-node-red-kafka-configuration.png diff --git a/src/blog/2024/03/images/using-kafka-with-node-red-kafka-consumer.png b/nuxt/public/blog/2024/03/images/using-kafka-with-node-red-kafka-consumer.png similarity index 100% rename from src/blog/2024/03/images/using-kafka-with-node-red-kafka-consumer.png rename to nuxt/public/blog/2024/03/images/using-kafka-with-node-red-kafka-consumer.png diff --git a/src/blog/2024/03/images/using-kafka-with-node-red-kafka-producer.png b/nuxt/public/blog/2024/03/images/using-kafka-with-node-red-kafka-producer.png similarity index 100% rename from src/blog/2024/03/images/using-kafka-with-node-red-kafka-producer.png rename to nuxt/public/blog/2024/03/images/using-kafka-with-node-red-kafka-producer.png diff --git a/src/blog/2024/03/images/using-kafka-with-node-red-setting-environment-variables.png b/nuxt/public/blog/2024/03/images/using-kafka-with-node-red-setting-environment-variables.png similarity index 100% rename from src/blog/2024/03/images/using-kafka-with-node-red-setting-environment-variables.png rename to nuxt/public/blog/2024/03/images/using-kafka-with-node-red-setting-environment-variables.png diff --git a/src/blog/2024/03/images/using-kafka-with-node-red-temperature-monitoring-system-flow.png b/nuxt/public/blog/2024/03/images/using-kafka-with-node-red-temperature-monitoring-system-flow.png similarity index 100% rename from src/blog/2024/03/images/using-kafka-with-node-red-temperature-monitoring-system-flow.png rename to nuxt/public/blog/2024/03/images/using-kafka-with-node-red-temperature-monitoring-system-flow.png diff --git a/src/blog/2024/03/images/using-kafka-with-node-red-temperature-monitoring-system.webm b/nuxt/public/blog/2024/03/images/using-kafka-with-node-red-temperature-monitoring-system.webm similarity index 100% rename from src/blog/2024/03/images/using-kafka-with-node-red-temperature-monitoring-system.webm rename to nuxt/public/blog/2024/03/images/using-kafka-with-node-red-temperature-monitoring-system.webm diff --git a/src/blog/2024/03/images/using-kafka-with-node-red-tls-configuration.png b/nuxt/public/blog/2024/03/images/using-kafka-with-node-red-tls-configuration.png similarity index 100% rename from src/blog/2024/03/images/using-kafka-with-node-red-tls-configuration.png rename to nuxt/public/blog/2024/03/images/using-kafka-with-node-red-tls-configuration.png diff --git a/src/blog/2024/03/images/using-kafka-with-node-red.png b/nuxt/public/blog/2024/03/images/using-kafka-with-node-red.png similarity index 100% rename from src/blog/2024/03/images/using-kafka-with-node-red.png rename to nuxt/public/blog/2024/03/images/using-kafka-with-node-red.png diff --git a/src/blog/2024/04/images/admin-dashboard.png b/nuxt/public/blog/2024/04/images/admin-dashboard.png similarity index 100% rename from src/blog/2024/04/images/admin-dashboard.png rename to nuxt/public/blog/2024/04/images/admin-dashboard.png diff --git a/src/blog/2024/04/images/build-app-cta-1.png b/nuxt/public/blog/2024/04/images/build-app-cta-1.png similarity index 100% rename from src/blog/2024/04/images/build-app-cta-1.png rename to nuxt/public/blog/2024/04/images/build-app-cta-1.png diff --git a/src/blog/2024/04/images/build-application-dashboard-2.png b/nuxt/public/blog/2024/04/images/build-application-dashboard-2.png similarity index 100% rename from src/blog/2024/04/images/build-application-dashboard-2.png rename to nuxt/public/blog/2024/04/images/build-application-dashboard-2.png diff --git a/src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-admin-only-page-configuration.png b/nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-admin-only-page-configuration.png similarity index 100% rename from src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-admin-only-page-configuration.png rename to nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-admin-only-page-configuration.png diff --git a/src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-hidding-page.png b/nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-hidding-page.png similarity index 100% rename from src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-hidding-page.png rename to nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-hidding-page.png diff --git a/src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-redirecting-user.png b/nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-redirecting-user.png similarity index 100% rename from src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-redirecting-user.png rename to nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-redirecting-user.png diff --git a/src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-showing-page.png b/nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-showing-page.png similarity index 100% rename from src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-showing-page.png rename to nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-showing-page.png diff --git a/src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-storing-adminlist-to-global-contenxt.png b/nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-storing-adminlist-to-global-contenxt.png similarity index 100% rename from src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-storing-adminlist-to-global-contenxt.png rename to nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-change-node-for-storing-adminlist-to-global-contenxt.png diff --git a/src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-dashboard-view-for-admin-users.png b/nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-dashboard-view-for-admin-users.png similarity index 100% rename from src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-dashboard-view-for-admin-users.png rename to nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-dashboard-view-for-admin-users.png diff --git a/src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-dashboard-view-for-normal-users.png b/nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-dashboard-view-for-normal-users.png similarity index 100% rename from src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-dashboard-view-for-normal-users.png rename to nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-dashboard-view-for-normal-users.png diff --git a/src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-flowfuse-editior.png b/nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-flowfuse-editior.png similarity index 100% rename from src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-flowfuse-editior.png rename to nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-flowfuse-editior.png diff --git a/src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-flowfuse-instance-setting.png b/nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-flowfuse-instance-setting.png similarity index 100% rename from src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-flowfuse-instance-setting.png rename to nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-flowfuse-instance-setting.png diff --git a/src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-switch-node-checking-is-current-page-is-adminpage.png b/nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-switch-node-checking-is-current-page-is-adminpage.png similarity index 100% rename from src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-switch-node-checking-is-current-page-is-adminpage.png rename to nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-switch-node-checking-is-current-page-is-adminpage.png diff --git a/src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-switch-node-checking-page-viewer-isadmin.png b/nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-switch-node-checking-page-viewer-isadmin.png similarity index 100% rename from src/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-switch-node-checking-page-viewer-isadmin.png rename to nuxt/public/blog/2024/04/images/building-admin-panel-node-red-dashboard-2-switch-node-checking-page-viewer-isadmin.png diff --git a/src/blog/2024/04/images/building-an-application-with-dashboard-2-ff-auth-tab.png b/nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-2-ff-auth-tab.png similarity index 100% rename from src/blog/2024/04/images/building-an-application-with-dashboard-2-ff-auth-tab.png rename to nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-2-ff-auth-tab.png diff --git a/src/blog/2024/04/images/building-an-application-with-dashboard-2-page1-configuration.png b/nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-2-page1-configuration.png similarity index 100% rename from src/blog/2024/04/images/building-an-application-with-dashboard-2-page1-configuration.png rename to nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-2-page1-configuration.png diff --git a/src/blog/2024/04/images/building-an-application-with-dashboard-2-page2-configuration.png b/nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-2-page2-configuration.png similarity index 100% rename from src/blog/2024/04/images/building-an-application-with-dashboard-2-page2-configuration.png rename to nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-2-page2-configuration.png diff --git a/src/blog/2024/04/images/building-an-application-with-dashboard-2-task-management-system.webm b/nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-2-task-management-system.webm similarity index 100% rename from src/blog/2024/04/images/building-an-application-with-dashboard-2-task-management-system.webm rename to nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-2-task-management-system.webm diff --git a/src/blog/2024/04/images/building-an-application-with-dashboard-2-task-submission-form.png b/nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-2-task-submission-form.png similarity index 100% rename from src/blog/2024/04/images/building-an-application-with-dashboard-2-task-submission-form.png rename to nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-2-task-submission-form.png diff --git a/src/blog/2024/04/images/building-an-application-with-dashboard-change-node-retriving-global-context-data.png b/nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-change-node-retriving-global-context-data.png similarity index 100% rename from src/blog/2024/04/images/building-an-application-with-dashboard-change-node-retriving-global-context-data.png rename to nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-change-node-retriving-global-context-data.png diff --git a/src/blog/2024/04/images/building-an-application-with-dashboard-change-node-setting-payload-for-notification.png b/nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-change-node-setting-payload-for-notification.png similarity index 100% rename from src/blog/2024/04/images/building-an-application-with-dashboard-change-node-setting-payload-for-notification.png rename to nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-change-node-setting-payload-for-notification.png diff --git a/src/blog/2024/04/images/building-an-application-with-dashboard-task-management-application-flow.png b/nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-task-management-application-flow.png similarity index 100% rename from src/blog/2024/04/images/building-an-application-with-dashboard-task-management-application-flow.png rename to nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-task-management-application-flow.png diff --git a/src/blog/2024/04/images/building-an-application-with-dashboard-template-widget.png b/nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-template-widget.png similarity index 100% rename from src/blog/2024/04/images/building-an-application-with-dashboard-template-widget.png rename to nuxt/public/blog/2024/04/images/building-an-application-with-dashboard-template-widget.png diff --git a/src/blog/2024/04/images/displaying-logged-in-user-dashboard-view.png b/nuxt/public/blog/2024/04/images/displaying-logged-in-user-dashboard-view.png similarity index 100% rename from src/blog/2024/04/images/displaying-logged-in-user-dashboard-view.png rename to nuxt/public/blog/2024/04/images/displaying-logged-in-user-dashboard-view.png diff --git a/src/blog/2024/04/images/displaying-logged-in-user-ff-auth-tab.png b/nuxt/public/blog/2024/04/images/displaying-logged-in-user-ff-auth-tab.png similarity index 100% rename from src/blog/2024/04/images/displaying-logged-in-user-ff-auth-tab.png rename to nuxt/public/blog/2024/04/images/displaying-logged-in-user-ff-auth-tab.png diff --git a/src/blog/2024/04/images/displaying-logged-in-user-flowfuse-instance-setting.png b/nuxt/public/blog/2024/04/images/displaying-logged-in-user-flowfuse-instance-setting.png similarity index 100% rename from src/blog/2024/04/images/displaying-logged-in-user-flowfuse-instance-setting.png rename to nuxt/public/blog/2024/04/images/displaying-logged-in-user-flowfuse-instance-setting.png diff --git a/src/blog/2024/04/images/flowfuse-at-hannover-messe-node-red.png b/nuxt/public/blog/2024/04/images/flowfuse-at-hannover-messe-node-red.png similarity index 100% rename from src/blog/2024/04/images/flowfuse-at-hannover-messe-node-red.png rename to nuxt/public/blog/2024/04/images/flowfuse-at-hannover-messe-node-red.png diff --git a/src/blog/2024/04/images/introducing-flowfuse-dedicated.png b/nuxt/public/blog/2024/04/images/introducing-flowfuse-dedicated.png similarity index 100% rename from src/blog/2024/04/images/introducing-flowfuse-dedicated.png rename to nuxt/public/blog/2024/04/images/introducing-flowfuse-dedicated.png diff --git a/src/blog/2024/04/images/logged-in-user-dashboard.png b/nuxt/public/blog/2024/04/images/logged-in-user-dashboard.png similarity index 100% rename from src/blog/2024/04/images/logged-in-user-dashboard.png rename to nuxt/public/blog/2024/04/images/logged-in-user-dashboard.png diff --git a/src/blog/2024/04/images/milestones-pwa-new-components.png b/nuxt/public/blog/2024/04/images/milestones-pwa-new-components.png similarity index 100% rename from src/blog/2024/04/images/milestones-pwa-new-components.png rename to nuxt/public/blog/2024/04/images/milestones-pwa-new-components.png diff --git a/src/blog/2024/04/images/node-red-architecture.png b/nuxt/public/blog/2024/04/images/node-red-architecture.png similarity index 100% rename from src/blog/2024/04/images/node-red-architecture.png rename to nuxt/public/blog/2024/04/images/node-red-architecture.png diff --git a/src/blog/2024/04/images/node-red-multiplayer.png b/nuxt/public/blog/2024/04/images/node-red-multiplayer.png similarity index 100% rename from src/blog/2024/04/images/node-red-multiplayer.png rename to nuxt/public/blog/2024/04/images/node-red-multiplayer.png diff --git a/src/blog/2024/04/images/nr-multiplayer.png b/nuxt/public/blog/2024/04/images/nr-multiplayer.png similarity index 100% rename from src/blog/2024/04/images/nr-multiplayer.png rename to nuxt/public/blog/2024/04/images/nr-multiplayer.png diff --git a/src/blog/2024/04/images/protect-instance-node-red-with-flowfuse.png b/nuxt/public/blog/2024/04/images/protect-instance-node-red-with-flowfuse.png similarity index 100% rename from src/blog/2024/04/images/protect-instance-node-red-with-flowfuse.png rename to nuxt/public/blog/2024/04/images/protect-instance-node-red-with-flowfuse.png diff --git a/src/blog/2024/04/images/purdue-model.png b/nuxt/public/blog/2024/04/images/purdue-model.png similarity index 100% rename from src/blog/2024/04/images/purdue-model.png rename to nuxt/public/blog/2024/04/images/purdue-model.png diff --git a/src/blog/2024/04/images/role-based-access-control-for-node-red-flowfuse.png b/nuxt/public/blog/2024/04/images/role-based-access-control-for-node-red-flowfuse.png similarity index 100% rename from src/blog/2024/04/images/role-based-access-control-for-node-red-flowfuse.png rename to nuxt/public/blog/2024/04/images/role-based-access-control-for-node-red-flowfuse.png diff --git a/src/blog/2024/04/images/role-based-access.png b/nuxt/public/blog/2024/04/images/role-based-access.png similarity index 100% rename from src/blog/2024/04/images/role-based-access.png rename to nuxt/public/blog/2024/04/images/role-based-access.png diff --git a/src/blog/2024/04/images/vuetify-data-table-sparkline.png b/nuxt/public/blog/2024/04/images/vuetify-data-table-sparkline.png similarity index 100% rename from src/blog/2024/04/images/vuetify-data-table-sparkline.png rename to nuxt/public/blog/2024/04/images/vuetify-data-table-sparkline.png diff --git a/src/blog/2024/04/images/vuetify-numeric.png b/nuxt/public/blog/2024/04/images/vuetify-numeric.png similarity index 100% rename from src/blog/2024/04/images/vuetify-numeric.png rename to nuxt/public/blog/2024/04/images/vuetify-numeric.png diff --git a/src/blog/2024/04/images/vuetify-sparkline.png b/nuxt/public/blog/2024/04/images/vuetify-sparkline.png similarity index 100% rename from src/blog/2024/04/images/vuetify-sparkline.png rename to nuxt/public/blog/2024/04/images/vuetify-sparkline.png diff --git a/src/blog/2024/04/images/vuetify-treeview.png b/nuxt/public/blog/2024/04/images/vuetify-treeview.png similarity index 100% rename from src/blog/2024/04/images/vuetify-treeview.png rename to nuxt/public/blog/2024/04/images/vuetify-treeview.png diff --git a/src/blog/2024/05/images/dashboard-widgets.png b/nuxt/public/blog/2024/05/images/dashboard-widgets.png similarity index 100% rename from src/blog/2024/05/images/dashboard-widgets.png rename to nuxt/public/blog/2024/05/images/dashboard-widgets.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-change-node.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-change-node.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-change-node.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-change-node.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-calculate-total-join-node.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-calculate-total-join-node.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-calculate-total-join-node.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-calculate-total-join-node.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-convert-amount-to-number-change-node.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-convert-amount-to-number-change-node.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-convert-amount-to-number-change-node.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-convert-amount-to-number-change-node.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-retrieve-combine-object-join-node.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-retrieve-combine-object-join-node.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-retrieve-combine-object-join-node.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-retrieve-combine-object-join-node.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-retrieve-expense-change-node.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-retrieve-expense-change-node.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-retrieve-expense-change-node.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-retrieve-expense-change-node.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-retrieve-income-change-node.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-retrieve-income-change-node.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-retrieve-income-change-node.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget-retrieve-income-change-node.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-chart-widget.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-dropdown-widget.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-dropdown-widget.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-dropdown-widget.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-dropdown-widget.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-expense-submission-form.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-expense-submission-form.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-expense-submission-form.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-expense-submission-form.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-incom-expense-tracker-system.webm b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-incom-expense-tracker-system.webm similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-incom-expense-tracker-system.webm rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-incom-expense-tracker-system.webm diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-income-expense-tracker-system-node-red-flow.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-income-expense-tracker-system-node-red-flow.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-income-expense-tracker-system-node-red-flow.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-income-expense-tracker-system-node-red-flow.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-income-submission-form.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-income-submission-form.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-income-submission-form.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-income-submission-form.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-notification-widget.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-notification-widget.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-notification-widget.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-notification-widget.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-table-widget.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-table-widget.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-table-widget.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-table-widget.png diff --git a/src/blog/2024/05/images/exploring-dashboard-2-widgets-template-widget.png b/nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-template-widget.png similarity index 100% rename from src/blog/2024/05/images/exploring-dashboard-2-widgets-template-widget.png rename to nuxt/public/blog/2024/05/images/exploring-dashboard-2-widgets-template-widget.png diff --git a/src/blog/2024/05/images/mapping-location-on-dashboard-2-change-node-changing-and-deleting-properties.png b/nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-change-node-changing-and-deleting-properties.png similarity index 100% rename from src/blog/2024/05/images/mapping-location-on-dashboard-2-change-node-changing-and-deleting-properties.png rename to nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-change-node-changing-and-deleting-properties.png diff --git a/src/blog/2024/05/images/mapping-location-on-dashboard-2-change-node-setting-icon-for-bus.png b/nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-change-node-setting-icon-for-bus.png similarity index 100% rename from src/blog/2024/05/images/mapping-location-on-dashboard-2-change-node-setting-icon-for-bus.png rename to nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-change-node-setting-icon-for-bus.png diff --git a/src/blog/2024/05/images/mapping-location-on-dashboard-2-change-node-setting-icon-for-tram.png b/nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-change-node-setting-icon-for-tram.png similarity index 100% rename from src/blog/2024/05/images/mapping-location-on-dashboard-2-change-node-setting-icon-for-tram.png rename to nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-change-node-setting-icon-for-tram.png diff --git a/src/blog/2024/05/images/mapping-location-on-dashboard-2-change-node.png b/nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-change-node.png similarity index 100% rename from src/blog/2024/05/images/mapping-location-on-dashboard-2-change-node.png rename to nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-change-node.png diff --git a/src/blog/2024/05/images/mapping-location-on-dashboard-2-http-request-node.png b/nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-http-request-node.png similarity index 100% rename from src/blog/2024/05/images/mapping-location-on-dashboard-2-http-request-node.png rename to nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-http-request-node.png diff --git a/src/blog/2024/05/images/mapping-location-on-dashboard-2-iframe-widget.png b/nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-iframe-widget.png similarity index 100% rename from src/blog/2024/05/images/mapping-location-on-dashboard-2-iframe-widget.png rename to nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-iframe-widget.png diff --git a/src/blog/2024/05/images/mapping-location-on-dashboard-2-switch-node-checking-is-vehicale-type-is-tram-or-not.png b/nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-switch-node-checking-is-vehicale-type-is-tram-or-not.png similarity index 100% rename from src/blog/2024/05/images/mapping-location-on-dashboard-2-switch-node-checking-is-vehicale-type-is-tram-or-not.png rename to nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-switch-node-checking-is-vehicale-type-is-tram-or-not.png diff --git a/src/blog/2024/05/images/mapping-location-on-dashboard-2-uk-live-transport.webm b/nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-uk-live-transport.webm similarity index 100% rename from src/blog/2024/05/images/mapping-location-on-dashboard-2-uk-live-transport.webm rename to nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-uk-live-transport.webm diff --git a/src/blog/2024/05/images/mapping-location-on-dashboard-2-worldmap-node.png b/nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-worldmap-node.png similarity index 100% rename from src/blog/2024/05/images/mapping-location-on-dashboard-2-worldmap-node.png rename to nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-worldmap-node.png diff --git a/src/blog/2024/05/images/mapping-location-on-dashboard-2-worldmap.png b/nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-worldmap.png similarity index 100% rename from src/blog/2024/05/images/mapping-location-on-dashboard-2-worldmap.png rename to nuxt/public/blog/2024/05/images/mapping-location-on-dashboard-2-worldmap.png diff --git a/src/blog/2024/05/images/mind-mqtt-influxdb-node-red-dashboard-2-0.png b/nuxt/public/blog/2024/05/images/mind-mqtt-influxdb-node-red-dashboard-2-0.png similarity index 100% rename from src/blog/2024/05/images/mind-mqtt-influxdb-node-red-dashboard-2-0.png rename to nuxt/public/blog/2024/05/images/mind-mqtt-influxdb-node-red-dashboard-2-0.png diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-adding-new-theme.webm b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-adding-new-theme.webm similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-adding-new-theme.webm rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-adding-new-theme.webm diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-adding-style.png b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-adding-style.png similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-adding-style.png rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-adding-style.png diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-always-hidden.png b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-always-hidden.png similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-always-hidden.png rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-always-hidden.png diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-appear-over-content.webm b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-appear-over-content.webm similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-appear-over-content.webm rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-appear-over-content.webm diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-collaps-to-icon-sidebar.webm b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-collaps-to-icon-sidebar.webm similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-collaps-to-icon-sidebar.webm rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-collaps-to-icon-sidebar.webm diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-collapsing-sidebar.webm b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-collapsing-sidebar.webm similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-collapsing-sidebar.webm rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-collapsing-sidebar.webm diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-fix-layout.png b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-fix-layout.png similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-fix-layout.png rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-fix-layout.png diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-fixed-layout.png b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-fixed-layout.png similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-fixed-layout.png rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-fixed-layout.png diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-grid-layout.jpg b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-grid-layout.jpg similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-grid-layout.jpg rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-grid-layout.jpg diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-notebook-layout.png b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-notebook-layout.png similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-notebook-layout.png rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-notebook-layout.png diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-setting-new-page-layout.webm b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-setting-new-page-layout.webm similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-setting-new-page-layout.webm rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-setting-new-page-layout.webm diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-setting-sidebar.webm b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-setting-sidebar.webm similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-setting-sidebar.webm rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-setting-sidebar.webm diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-setting-size.webm b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-setting-size.webm similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-setting-size.webm rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-setting-size.webm diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-showing-class-property-feild.png b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-showing-class-property-feild.png similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-showing-class-property-feild.png rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling-showing-class-property-feild.png diff --git a/src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling.png b/nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling.png similarity index 100% rename from src/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling.png rename to nuxt/public/blog/2024/05/images/node-red-dashboard-2-layout-navigation-styling.png diff --git a/src/blog/2024/05/images/product-strategy-updates.png b/nuxt/public/blog/2024/05/images/product-strategy-updates.png similarity index 100% rename from src/blog/2024/05/images/product-strategy-updates.png rename to nuxt/public/blog/2024/05/images/product-strategy-updates.png diff --git a/src/blog/2024/05/images/release-2-4-graphic.png b/nuxt/public/blog/2024/05/images/release-2-4-graphic.png similarity index 100% rename from src/blog/2024/05/images/release-2-4-graphic.png rename to nuxt/public/blog/2024/05/images/release-2-4-graphic.png diff --git a/src/blog/2024/05/images/sensor-data-mqtt-node-red-dashboard-influxdb.png b/nuxt/public/blog/2024/05/images/sensor-data-mqtt-node-red-dashboard-influxdb.png similarity index 100% rename from src/blog/2024/05/images/sensor-data-mqtt-node-red-dashboard-influxdb.png rename to nuxt/public/blog/2024/05/images/sensor-data-mqtt-node-red-dashboard-influxdb.png diff --git a/src/blog/2024/05/images/tire-swing-project-management-flowfuse-node-red.png b/nuxt/public/blog/2024/05/images/tire-swing-project-management-flowfuse-node-red.png similarity index 100% rename from src/blog/2024/05/images/tire-swing-project-management-flowfuse-node-red.png rename to nuxt/public/blog/2024/05/images/tire-swing-project-management-flowfuse-node-red.png diff --git a/src/blog/2024/05/images/understanding-node-red-variables.png b/nuxt/public/blog/2024/05/images/understanding-node-red-variables.png similarity index 100% rename from src/blog/2024/05/images/understanding-node-red-variables.png rename to nuxt/public/blog/2024/05/images/understanding-node-red-variables.png diff --git a/src/blog/2024/05/images/variables-in-node-red-change-node-persistent-store-option-for-while-setting-variable.webm b/nuxt/public/blog/2024/05/images/variables-in-node-red-change-node-persistent-store-option-for-while-setting-variable.webm similarity index 100% rename from src/blog/2024/05/images/variables-in-node-red-change-node-persistent-store-option-for-while-setting-variable.webm rename to nuxt/public/blog/2024/05/images/variables-in-node-red-change-node-persistent-store-option-for-while-setting-variable.webm diff --git a/src/blog/2024/05/images/variables-in-node-red-change-node-persistent-store-option.webm b/nuxt/public/blog/2024/05/images/variables-in-node-red-change-node-persistent-store-option.webm similarity index 100% rename from src/blog/2024/05/images/variables-in-node-red-change-node-persistent-store-option.webm rename to nuxt/public/blog/2024/05/images/variables-in-node-red-change-node-persistent-store-option.webm diff --git a/src/blog/2024/05/images/variables-in-node-red-context-data-tab-options-for-varrables.png b/nuxt/public/blog/2024/05/images/variables-in-node-red-context-data-tab-options-for-varrables.png similarity index 100% rename from src/blog/2024/05/images/variables-in-node-red-context-data-tab-options-for-varrables.png rename to nuxt/public/blog/2024/05/images/variables-in-node-red-context-data-tab-options-for-varrables.png diff --git a/src/blog/2024/05/images/variables-in-node-red-context-data-tab.png b/nuxt/public/blog/2024/05/images/variables-in-node-red-context-data-tab.png similarity index 100% rename from src/blog/2024/05/images/variables-in-node-red-context-data-tab.png rename to nuxt/public/blog/2024/05/images/variables-in-node-red-context-data-tab.png diff --git a/src/blog/2024/05/images/variables-in-node-red-deleting-flow-variable-using-change-node.png b/nuxt/public/blog/2024/05/images/variables-in-node-red-deleting-flow-variable-using-change-node.png similarity index 100% rename from src/blog/2024/05/images/variables-in-node-red-deleting-flow-variable-using-change-node.png rename to nuxt/public/blog/2024/05/images/variables-in-node-red-deleting-flow-variable-using-change-node.png diff --git a/src/blog/2024/05/images/variables-in-node-red-deleting-global-variable-using-change-node.png b/nuxt/public/blog/2024/05/images/variables-in-node-red-deleting-global-variable-using-change-node.png similarity index 100% rename from src/blog/2024/05/images/variables-in-node-red-deleting-global-variable-using-change-node.png rename to nuxt/public/blog/2024/05/images/variables-in-node-red-deleting-global-variable-using-change-node.png diff --git a/src/blog/2024/05/images/variables-in-node-red-retrieving-environment-variable-using-change-node.png b/nuxt/public/blog/2024/05/images/variables-in-node-red-retrieving-environment-variable-using-change-node.png similarity index 100% rename from src/blog/2024/05/images/variables-in-node-red-retrieving-environment-variable-using-change-node.png rename to nuxt/public/blog/2024/05/images/variables-in-node-red-retrieving-environment-variable-using-change-node.png diff --git a/src/blog/2024/05/images/variables-in-node-red-retrieving-flow-variable-using-change-node.png b/nuxt/public/blog/2024/05/images/variables-in-node-red-retrieving-flow-variable-using-change-node.png similarity index 100% rename from src/blog/2024/05/images/variables-in-node-red-retrieving-flow-variable-using-change-node.png rename to nuxt/public/blog/2024/05/images/variables-in-node-red-retrieving-flow-variable-using-change-node.png diff --git a/src/blog/2024/05/images/variables-in-node-red-retrieving-global-variable-using-change-node.png b/nuxt/public/blog/2024/05/images/variables-in-node-red-retrieving-global-variable-using-change-node.png similarity index 100% rename from src/blog/2024/05/images/variables-in-node-red-retrieving-global-variable-using-change-node.png rename to nuxt/public/blog/2024/05/images/variables-in-node-red-retrieving-global-variable-using-change-node.png diff --git a/src/blog/2024/05/images/variables-in-node-red-setting-flow-scope-enviroment-variable.webm b/nuxt/public/blog/2024/05/images/variables-in-node-red-setting-flow-scope-enviroment-variable.webm similarity index 100% rename from src/blog/2024/05/images/variables-in-node-red-setting-flow-scope-enviroment-variable.webm rename to nuxt/public/blog/2024/05/images/variables-in-node-red-setting-flow-scope-enviroment-variable.webm diff --git a/src/blog/2024/05/images/variables-in-node-red-setting-flow-variable-using-change-node.png b/nuxt/public/blog/2024/05/images/variables-in-node-red-setting-flow-variable-using-change-node.png similarity index 100% rename from src/blog/2024/05/images/variables-in-node-red-setting-flow-variable-using-change-node.png rename to nuxt/public/blog/2024/05/images/variables-in-node-red-setting-flow-variable-using-change-node.png diff --git a/src/blog/2024/05/images/variables-in-node-red-setting-global-variable-using-change-node.png b/nuxt/public/blog/2024/05/images/variables-in-node-red-setting-global-variable-using-change-node.png similarity index 100% rename from src/blog/2024/05/images/variables-in-node-red-setting-global-variable-using-change-node.png rename to nuxt/public/blog/2024/05/images/variables-in-node-red-setting-global-variable-using-change-node.png diff --git a/src/blog/2024/05/images/why-you-need-a-low-code-platform.png b/nuxt/public/blog/2024/05/images/why-you-need-a-low-code-platform.png similarity index 100% rename from src/blog/2024/05/images/why-you-need-a-low-code-platform.png rename to nuxt/public/blog/2024/05/images/why-you-need-a-low-code-platform.png diff --git a/src/blog/2024/06/images/dashboard-include-client-data.png b/nuxt/public/blog/2024/06/images/dashboard-include-client-data.png similarity index 100% rename from src/blog/2024/06/images/dashboard-include-client-data.png rename to nuxt/public/blog/2024/06/images/dashboard-include-client-data.png diff --git a/src/blog/2024/06/images/dashboard-migration-service.png b/nuxt/public/blog/2024/06/images/dashboard-migration-service.png similarity index 100% rename from src/blog/2024/06/images/dashboard-migration-service.png rename to nuxt/public/blog/2024/06/images/dashboard-migration-service.png diff --git a/src/blog/2024/06/images/dashboard-multi-tenancy-sidebar.png b/nuxt/public/blog/2024/06/images/dashboard-multi-tenancy-sidebar.png similarity index 100% rename from src/blog/2024/06/images/dashboard-multi-tenancy-sidebar.png rename to nuxt/public/blog/2024/06/images/dashboard-multi-tenancy-sidebar.png diff --git a/src/blog/2024/06/images/dashboard1-deprecated.png b/nuxt/public/blog/2024/06/images/dashboard1-deprecated.png similarity index 100% rename from src/blog/2024/06/images/dashboard1-deprecated.png rename to nuxt/public/blog/2024/06/images/dashboard1-deprecated.png diff --git a/src/blog/2024/06/images/design-pattern-client.png b/nuxt/public/blog/2024/06/images/design-pattern-client.png similarity index 100% rename from src/blog/2024/06/images/design-pattern-client.png rename to nuxt/public/blog/2024/06/images/design-pattern-client.png diff --git a/src/blog/2024/06/images/design-pattern-single.png b/nuxt/public/blog/2024/06/images/design-pattern-single.png similarity index 100% rename from src/blog/2024/06/images/design-pattern-single.png rename to nuxt/public/blog/2024/06/images/design-pattern-single.png diff --git a/src/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-change-node.png b/nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-change-node.png similarity index 100% rename from src/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-change-node.png rename to nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-change-node.png diff --git a/src/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-calculating-avg.png b/nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-calculating-avg.png similarity index 100% rename from src/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-calculating-avg.png rename to nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-calculating-avg.png diff --git a/src/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-combining-node.png b/nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-combining-node.png similarity index 100% rename from src/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-combining-node.png rename to nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-combining-node.png diff --git a/src/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-sort-node.png b/nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-sort-node.png similarity index 100% rename from src/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-sort-node.png rename to nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-sort-node.png diff --git a/src/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-switch-node.png b/nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-switch-node.png similarity index 100% rename from src/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-switch-node.png rename to nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-data-with-node-red-switch-node.png diff --git a/src/blog/2024/06/images/filtering-mapping-sorting-reducing-switch-node.png b/nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-switch-node.png similarity index 100% rename from src/blog/2024/06/images/filtering-mapping-sorting-reducing-switch-node.png rename to nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-switch-node.png diff --git a/src/blog/2024/06/images/filtering-mapping-sorting-reducing-with-node-red.png b/nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-with-node-red.png similarity index 100% rename from src/blog/2024/06/images/filtering-mapping-sorting-reducing-with-node-red.png rename to nuxt/public/blog/2024/06/images/filtering-mapping-sorting-reducing-with-node-red.png diff --git a/src/blog/2024/06/images/flowfuse-instance-security.png b/nuxt/public/blog/2024/06/images/flowfuse-instance-security.png similarity index 100% rename from src/blog/2024/06/images/flowfuse-instance-security.png rename to nuxt/public/blog/2024/06/images/flowfuse-instance-security.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_1.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_1.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_1.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_1.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_10.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_10.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_10.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_10.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_11.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_11.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_11.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_11.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_12.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_12.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_12.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_12.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_13.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_13.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_13.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_13.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_14.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_14.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_14.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_14.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_15.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_15.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_15.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_15.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_2.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_2.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_2.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_2.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_3.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_3.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_3.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_3.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_4.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_4.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_4.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_4.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_5.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_5.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_5.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_5.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_6.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_6.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_6.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_6.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_7.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_7.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_7.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_7.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_8.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_8.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_8.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_8.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_9.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_9.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_9.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete-page_9.png diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete.webm b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete.webm similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete.webm rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-delete.webm diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-read.webm b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-read.webm similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-read.webm rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-read.webm diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-update.webm b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-update.webm similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-update.webm rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-update.webm diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-write.webm b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-write.webm similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red-write.webm rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red-write.webm diff --git a/src/blog/2024/06/images/interacting-with-google-sheet-from-node-red.png b/nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red.png similarity index 100% rename from src/blog/2024/06/images/interacting-with-google-sheet-from-node-red.png rename to nuxt/public/blog/2024/06/images/interacting-with-google-sheet-from-node-red.png diff --git a/src/blog/2024/06/images/mqtt-broker-config.png b/nuxt/public/blog/2024/06/images/mqtt-broker-config.png similarity index 100% rename from src/blog/2024/06/images/mqtt-broker-config.png rename to nuxt/public/blog/2024/06/images/mqtt-broker-config.png diff --git a/src/blog/2024/06/images/mqtt-configuration-security-tab.png b/nuxt/public/blog/2024/06/images/mqtt-configuration-security-tab.png similarity index 100% rename from src/blog/2024/06/images/mqtt-configuration-security-tab.png rename to nuxt/public/blog/2024/06/images/mqtt-configuration-security-tab.png diff --git a/src/blog/2024/06/images/mqtt-in-config.png b/nuxt/public/blog/2024/06/images/mqtt-in-config.png similarity index 100% rename from src/blog/2024/06/images/mqtt-in-config.png rename to nuxt/public/blog/2024/06/images/mqtt-in-config.png diff --git a/src/blog/2024/06/images/mqtt-in-dynamic.png b/nuxt/public/blog/2024/06/images/mqtt-in-dynamic.png similarity index 100% rename from src/blog/2024/06/images/mqtt-in-dynamic.png rename to nuxt/public/blog/2024/06/images/mqtt-in-dynamic.png diff --git a/src/blog/2024/06/images/mqtt-node-status.png b/nuxt/public/blog/2024/06/images/mqtt-node-status.png similarity index 100% rename from src/blog/2024/06/images/mqtt-node-status.png rename to nuxt/public/blog/2024/06/images/mqtt-node-status.png diff --git a/src/blog/2024/06/images/mqtt-out.png b/nuxt/public/blog/2024/06/images/mqtt-out.png similarity index 100% rename from src/blog/2024/06/images/mqtt-out.png rename to nuxt/public/blog/2024/06/images/mqtt-out.png diff --git a/src/blog/2024/06/images/node-red-4-on-flowfuse-cloud.png b/nuxt/public/blog/2024/06/images/node-red-4-on-flowfuse-cloud.png similarity index 100% rename from src/blog/2024/06/images/node-red-4-on-flowfuse-cloud.png rename to nuxt/public/blog/2024/06/images/node-red-4-on-flowfuse-cloud.png diff --git a/src/blog/2024/06/images/nr4-background-deploy.png b/nuxt/public/blog/2024/06/images/nr4-background-deploy.png similarity index 100% rename from src/blog/2024/06/images/nr4-background-deploy.png rename to nuxt/public/blog/2024/06/images/nr4-background-deploy.png diff --git a/src/blog/2024/06/images/nr4-multiplayer.png b/nuxt/public/blog/2024/06/images/nr4-multiplayer.png similarity index 100% rename from src/blog/2024/06/images/nr4-multiplayer.png rename to nuxt/public/blog/2024/06/images/nr4-multiplayer.png diff --git a/src/blog/2024/06/images/release-2-5-graphic.png b/nuxt/public/blog/2024/06/images/release-2-5-graphic.png similarity index 100% rename from src/blog/2024/06/images/release-2-5-graphic.png rename to nuxt/public/blog/2024/06/images/release-2-5-graphic.png diff --git a/src/blog/2024/06/images/tile-dashboard-2-multi-tenancy.png b/nuxt/public/blog/2024/06/images/tile-dashboard-2-multi-tenancy.png similarity index 100% rename from src/blog/2024/06/images/tile-dashboard-2-multi-tenancy.png rename to nuxt/public/blog/2024/06/images/tile-dashboard-2-multi-tenancy.png diff --git a/src/blog/2024/06/images/working-with-mqtt.jpg b/nuxt/public/blog/2024/06/images/working-with-mqtt.jpg similarity index 100% rename from src/blog/2024/06/images/working-with-mqtt.jpg rename to nuxt/public/blog/2024/06/images/working-with-mqtt.jpg diff --git a/src/blog/2024/07/images/Cofiguring-slapd-ubuntu.png b/nuxt/public/blog/2024/07/images/Cofiguring-slapd-ubuntu.png similarity index 100% rename from src/blog/2024/07/images/Cofiguring-slapd-ubuntu.png rename to nuxt/public/blog/2024/07/images/Cofiguring-slapd-ubuntu.png diff --git a/src/blog/2024/07/images/Confirm-Ldap-Admin-Passsword-Ubuntu.png b/nuxt/public/blog/2024/07/images/Confirm-Ldap-Admin-Passsword-Ubuntu.png similarity index 100% rename from src/blog/2024/07/images/Confirm-Ldap-Admin-Passsword-Ubuntu.png rename to nuxt/public/blog/2024/07/images/Confirm-Ldap-Admin-Passsword-Ubuntu.png diff --git a/src/blog/2024/07/images/Database-Removal-Slapd-Ubuntu.png b/nuxt/public/blog/2024/07/images/Database-Removal-Slapd-Ubuntu.png similarity index 100% rename from src/blog/2024/07/images/Database-Removal-Slapd-Ubuntu.png rename to nuxt/public/blog/2024/07/images/Database-Removal-Slapd-Ubuntu.png diff --git a/src/blog/2024/07/images/Ldap-Server-Admin-Password-Ubuntu.png b/nuxt/public/blog/2024/07/images/Ldap-Server-Admin-Password-Ubuntu.png similarity index 100% rename from src/blog/2024/07/images/Ldap-Server-Admin-Password-Ubuntu.png rename to nuxt/public/blog/2024/07/images/Ldap-Server-Admin-Password-Ubuntu.png diff --git a/src/blog/2024/07/images/SAML-SSO.png b/nuxt/public/blog/2024/07/images/SAML-SSO.png similarity index 100% rename from src/blog/2024/07/images/SAML-SSO.png rename to nuxt/public/blog/2024/07/images/SAML-SSO.png diff --git a/src/blog/2024/07/images/Select-Yes-Move-Old-Databases-Slapd-Ubuntu.png b/nuxt/public/blog/2024/07/images/Select-Yes-Move-Old-Databases-Slapd-Ubuntu.png similarity index 100% rename from src/blog/2024/07/images/Select-Yes-Move-Old-Databases-Slapd-Ubuntu.png rename to nuxt/public/blog/2024/07/images/Select-Yes-Move-Old-Databases-Slapd-Ubuntu.png diff --git a/src/blog/2024/07/images/add-custom-saml-apps-option.png b/nuxt/public/blog/2024/07/images/add-custom-saml-apps-option.png similarity index 100% rename from src/blog/2024/07/images/add-custom-saml-apps-option.png rename to nuxt/public/blog/2024/07/images/add-custom-saml-apps-option.png diff --git a/src/blog/2024/07/images/admin-setting-option.png b/nuxt/public/blog/2024/07/images/admin-setting-option.png similarity index 100% rename from src/blog/2024/07/images/admin-setting-option.png rename to nuxt/public/blog/2024/07/images/admin-setting-option.png diff --git a/src/blog/2024/07/images/assistant-dialog-function-node-builder.png b/nuxt/public/blog/2024/07/images/assistant-dialog-function-node-builder.png similarity index 100% rename from src/blog/2024/07/images/assistant-dialog-function-node-builder.png rename to nuxt/public/blog/2024/07/images/assistant-dialog-function-node-builder.png diff --git a/src/blog/2024/07/images/assistant-function-node-inline-code-lens.png b/nuxt/public/blog/2024/07/images/assistant-function-node-inline-code-lens.png similarity index 100% rename from src/blog/2024/07/images/assistant-function-node-inline-code-lens.png rename to nuxt/public/blog/2024/07/images/assistant-function-node-inline-code-lens.png diff --git a/src/blog/2024/07/images/assistant-toolbar.png b/nuxt/public/blog/2024/07/images/assistant-toolbar.png similarity index 100% rename from src/blog/2024/07/images/assistant-toolbar.png rename to nuxt/public/blog/2024/07/images/assistant-toolbar.png diff --git a/src/blog/2024/07/images/blueprint-import-export.png b/nuxt/public/blog/2024/07/images/blueprint-import-export.png similarity index 100% rename from src/blog/2024/07/images/blueprint-import-export.png rename to nuxt/public/blog/2024/07/images/blueprint-import-export.png diff --git a/src/blog/2024/07/images/calling-python-script-from-node-red-py-conformation.png b/nuxt/public/blog/2024/07/images/calling-python-script-from-node-red-py-conformation.png similarity index 100% rename from src/blog/2024/07/images/calling-python-script-from-node-red-py-conformation.png rename to nuxt/public/blog/2024/07/images/calling-python-script-from-node-red-py-conformation.png diff --git a/src/blog/2024/07/images/calling-python-script-from-node-red.png b/nuxt/public/blog/2024/07/images/calling-python-script-from-node-red.png similarity index 100% rename from src/blog/2024/07/images/calling-python-script-from-node-red.png rename to nuxt/public/blog/2024/07/images/calling-python-script-from-node-red.png diff --git a/src/blog/2024/07/images/calling-python-scrpt-from-node-red-exec-node.png b/nuxt/public/blog/2024/07/images/calling-python-scrpt-from-node-red-exec-node.png similarity index 100% rename from src/blog/2024/07/images/calling-python-scrpt-from-node-red-exec-node.png rename to nuxt/public/blog/2024/07/images/calling-python-scrpt-from-node-red-exec-node.png diff --git a/src/blog/2024/07/images/calling-python-scrpt-from-node-red-output.webm b/nuxt/public/blog/2024/07/images/calling-python-scrpt-from-node-red-output.webm similarity index 100% rename from src/blog/2024/07/images/calling-python-scrpt-from-node-red-output.webm rename to nuxt/public/blog/2024/07/images/calling-python-scrpt-from-node-red-output.webm diff --git a/src/blog/2024/07/images/compact-applications-view.png b/nuxt/public/blog/2024/07/images/compact-applications-view.png similarity index 100% rename from src/blog/2024/07/images/compact-applications-view.png rename to nuxt/public/blog/2024/07/images/compact-applications-view.png diff --git a/src/blog/2024/07/images/config-details-for-sso.png b/nuxt/public/blog/2024/07/images/config-details-for-sso.png similarity index 100% rename from src/blog/2024/07/images/config-details-for-sso.png rename to nuxt/public/blog/2024/07/images/config-details-for-sso.png diff --git a/src/blog/2024/07/images/create-sso-config-button.png b/nuxt/public/blog/2024/07/images/create-sso-config-button.png similarity index 100% rename from src/blog/2024/07/images/create-sso-config-button.png rename to nuxt/public/blog/2024/07/images/create-sso-config-button.png diff --git a/src/blog/2024/07/images/dashboard-interactive-docs.png b/nuxt/public/blog/2024/07/images/dashboard-interactive-docs.png similarity index 100% rename from src/blog/2024/07/images/dashboard-interactive-docs.png rename to nuxt/public/blog/2024/07/images/dashboard-interactive-docs.png diff --git a/src/blog/2024/07/images/deploying-flowfuse-successfull-with-ssl.png b/nuxt/public/blog/2024/07/images/deploying-flowfuse-successfull-with-ssl.png similarity index 100% rename from src/blog/2024/07/images/deploying-flowfuse-successfull-with-ssl.png rename to nuxt/public/blog/2024/07/images/deploying-flowfuse-successfull-with-ssl.png diff --git a/src/blog/2024/07/images/deploying-flowfuse.png b/nuxt/public/blog/2024/07/images/deploying-flowfuse.png similarity index 100% rename from src/blog/2024/07/images/deploying-flowfuse.png rename to nuxt/public/blog/2024/07/images/deploying-flowfuse.png diff --git a/src/blog/2024/07/images/device-monitoring-architecture.png b/nuxt/public/blog/2024/07/images/device-monitoring-architecture.png similarity index 100% rename from src/blog/2024/07/images/device-monitoring-architecture.png rename to nuxt/public/blog/2024/07/images/device-monitoring-architecture.png diff --git a/src/blog/2024/07/images/device-monitoring-use-case.png b/nuxt/public/blog/2024/07/images/device-monitoring-use-case.png similarity index 100% rename from src/blog/2024/07/images/device-monitoring-use-case.png rename to nuxt/public/blog/2024/07/images/device-monitoring-use-case.png diff --git a/src/blog/2024/07/images/docker-compose-update-2.png b/nuxt/public/blog/2024/07/images/docker-compose-update-2.png similarity index 100% rename from src/blog/2024/07/images/docker-compose-update-2.png rename to nuxt/public/blog/2024/07/images/docker-compose-update-2.png diff --git a/src/blog/2024/07/images/docker-compose-update.png b/nuxt/public/blog/2024/07/images/docker-compose-update.png similarity index 100% rename from src/blog/2024/07/images/docker-compose-update.png rename to nuxt/public/blog/2024/07/images/docker-compose-update.png diff --git a/src/blog/2024/07/images/docker-compose-yml-acme-update.png b/nuxt/public/blog/2024/07/images/docker-compose-yml-acme-update.png similarity index 100% rename from src/blog/2024/07/images/docker-compose-yml-acme-update.png rename to nuxt/public/blog/2024/07/images/docker-compose-yml-acme-update.png diff --git a/src/blog/2024/07/images/domain-provider-panel.png b/nuxt/public/blog/2024/07/images/domain-provider-panel.png similarity index 100% rename from src/blog/2024/07/images/domain-provider-panel.png rename to nuxt/public/blog/2024/07/images/domain-provider-panel.png diff --git a/src/blog/2024/07/images/edit-sso-config.png b/nuxt/public/blog/2024/07/images/edit-sso-config.png similarity index 100% rename from src/blog/2024/07/images/edit-sso-config.png rename to nuxt/public/blog/2024/07/images/edit-sso-config.png diff --git a/src/blog/2024/07/images/evolution-of-technology.png b/nuxt/public/blog/2024/07/images/evolution-of-technology.png similarity index 100% rename from src/blog/2024/07/images/evolution-of-technology.png rename to nuxt/public/blog/2024/07/images/evolution-of-technology.png diff --git a/src/blog/2024/07/images/ff-ecosystem-lineup.png b/nuxt/public/blog/2024/07/images/ff-ecosystem-lineup.png similarity index 100% rename from src/blog/2024/07/images/ff-ecosystem-lineup.png rename to nuxt/public/blog/2024/07/images/ff-ecosystem-lineup.png diff --git a/src/blog/2024/07/images/flowforge-yml-https-update.png b/nuxt/public/blog/2024/07/images/flowforge-yml-https-update.png similarity index 100% rename from src/blog/2024/07/images/flowforge-yml-https-update.png rename to nuxt/public/blog/2024/07/images/flowforge-yml-https-update.png diff --git a/src/blog/2024/07/images/flowforge-yml-https-update2.png b/nuxt/public/blog/2024/07/images/flowforge-yml-https-update2.png similarity index 100% rename from src/blog/2024/07/images/flowforge-yml-https-update2.png rename to nuxt/public/blog/2024/07/images/flowforge-yml-https-update2.png diff --git a/src/blog/2024/07/images/flowforge-yml-successfully-running-container.png b/nuxt/public/blog/2024/07/images/flowforge-yml-successfully-running-container.png similarity index 100% rename from src/blog/2024/07/images/flowforge-yml-successfully-running-container.png rename to nuxt/public/blog/2024/07/images/flowforge-yml-successfully-running-container.png diff --git a/src/blog/2024/07/images/form-to-add-app-info.png b/nuxt/public/blog/2024/07/images/form-to-add-app-info.png similarity index 100% rename from src/blog/2024/07/images/form-to-add-app-info.png rename to nuxt/public/blog/2024/07/images/form-to-add-app-info.png diff --git a/src/blog/2024/07/images/form-to-add-the-config-provided-flowfuse.png b/nuxt/public/blog/2024/07/images/form-to-add-the-config-provided-flowfuse.png similarity index 100% rename from src/blog/2024/07/images/form-to-add-the-config-provided-flowfuse.png rename to nuxt/public/blog/2024/07/images/form-to-add-the-config-provided-flowfuse.png diff --git a/src/blog/2024/07/images/how-to-set-up-sso-ldap-for-node-red.png b/nuxt/public/blog/2024/07/images/how-to-set-up-sso-ldap-for-node-red.png similarity index 100% rename from src/blog/2024/07/images/how-to-set-up-sso-ldap-for-node-red.png rename to nuxt/public/blog/2024/07/images/how-to-set-up-sso-ldap-for-node-red.png diff --git a/src/blog/2024/07/images/immersive-editor-collapsed.png b/nuxt/public/blog/2024/07/images/immersive-editor-collapsed.png similarity index 100% rename from src/blog/2024/07/images/immersive-editor-collapsed.png rename to nuxt/public/blog/2024/07/images/immersive-editor-collapsed.png diff --git a/src/blog/2024/07/images/immersive-editor.png b/nuxt/public/blog/2024/07/images/immersive-editor.png similarity index 100% rename from src/blog/2024/07/images/immersive-editor.png rename to nuxt/public/blog/2024/07/images/immersive-editor.png diff --git a/src/blog/2024/07/images/ldap-advance-config-tag.png b/nuxt/public/blog/2024/07/images/ldap-advance-config-tag.png similarity index 100% rename from src/blog/2024/07/images/ldap-advance-config-tag.png rename to nuxt/public/blog/2024/07/images/ldap-advance-config-tag.png diff --git a/src/blog/2024/07/images/main-menus-web-and-mobile-apps-option.png b/nuxt/public/blog/2024/07/images/main-menus-web-and-mobile-apps-option.png similarity index 100% rename from src/blog/2024/07/images/main-menus-web-and-mobile-apps-option.png rename to nuxt/public/blog/2024/07/images/main-menus-web-and-mobile-apps-option.png diff --git a/src/blog/2024/07/images/multiline-env-vars.png b/nuxt/public/blog/2024/07/images/multiline-env-vars.png similarity index 100% rename from src/blog/2024/07/images/multiline-env-vars.png rename to nuxt/public/blog/2024/07/images/multiline-env-vars.png diff --git a/src/blog/2024/07/images/prompt-for-domain.jpeg b/nuxt/public/blog/2024/07/images/prompt-for-domain.jpeg similarity index 100% rename from src/blog/2024/07/images/prompt-for-domain.jpeg rename to nuxt/public/blog/2024/07/images/prompt-for-domain.jpeg diff --git a/src/blog/2024/07/images/prompt-for-org.jpeg b/nuxt/public/blog/2024/07/images/prompt-for-org.jpeg similarity index 100% rename from src/blog/2024/07/images/prompt-for-org.jpeg rename to nuxt/public/blog/2024/07/images/prompt-for-org.jpeg diff --git a/src/blog/2024/07/images/release-2-6-july-2024.png b/nuxt/public/blog/2024/07/images/release-2-6-july-2024.png similarity index 100% rename from src/blog/2024/07/images/release-2-6-july-2024.png rename to nuxt/public/blog/2024/07/images/release-2-6-july-2024.png diff --git a/src/blog/2024/07/images/release-2-7-aug-2024.png b/nuxt/public/blog/2024/07/images/release-2-7-aug-2024.png similarity index 100% rename from src/blog/2024/07/images/release-2-7-aug-2024.png rename to nuxt/public/blog/2024/07/images/release-2-7-aug-2024.png diff --git a/src/blog/2024/07/images/sending-and-receiving-discord-message-with-node-red.png b/nuxt/public/blog/2024/07/images/sending-and-receiving-discord-message-with-node-red.png similarity index 100% rename from src/blog/2024/07/images/sending-and-receiving-discord-message-with-node-red.png rename to nuxt/public/blog/2024/07/images/sending-and-receiving-discord-message-with-node-red.png diff --git a/src/blog/2024/07/images/settings-sso-setting-section.png b/nuxt/public/blog/2024/07/images/settings-sso-setting-section.png similarity index 100% rename from src/blog/2024/07/images/settings-sso-setting-section.png rename to nuxt/public/blog/2024/07/images/settings-sso-setting-section.png diff --git a/src/blog/2024/07/images/sso-config-form.png b/nuxt/public/blog/2024/07/images/sso-config-form.png similarity index 100% rename from src/blog/2024/07/images/sso-config-form.png rename to nuxt/public/blog/2024/07/images/sso-config-form.png diff --git a/src/blog/2024/07/images/sso-config-initial-form.png b/nuxt/public/blog/2024/07/images/sso-config-initial-form.png similarity index 100% rename from src/blog/2024/07/images/sso-config-initial-form.png rename to nuxt/public/blog/2024/07/images/sso-config-initial-form.png diff --git a/src/blog/2024/07/images/sso-config-ldap.png b/nuxt/public/blog/2024/07/images/sso-config-ldap.png similarity index 100% rename from src/blog/2024/07/images/sso-config-ldap.png rename to nuxt/public/blog/2024/07/images/sso-config-ldap.png diff --git a/src/blog/2024/07/images/sso-config-next-form.png b/nuxt/public/blog/2024/07/images/sso-config-next-form.png similarity index 100% rename from src/blog/2024/07/images/sso-config-next-form.png rename to nuxt/public/blog/2024/07/images/sso-config-next-form.png diff --git a/src/blog/2024/07/images/sso-saml-with-node-red.png b/nuxt/public/blog/2024/07/images/sso-saml-with-node-red.png similarity index 100% rename from src/blog/2024/07/images/sso-saml-with-node-red.png rename to nuxt/public/blog/2024/07/images/sso-saml-with-node-red.png diff --git a/src/blog/2024/07/images/successfull-docker-installation.png b/nuxt/public/blog/2024/07/images/successfull-docker-installation.png similarity index 100% rename from src/blog/2024/07/images/successfull-docker-installation.png rename to nuxt/public/blog/2024/07/images/successfull-docker-installation.png diff --git a/src/blog/2024/07/images/tile-building-on-flowfuse-devices.png b/nuxt/public/blog/2024/07/images/tile-building-on-flowfuse-devices.png similarity index 100% rename from src/blog/2024/07/images/tile-building-on-flowfuse-devices.png rename to nuxt/public/blog/2024/07/images/tile-building-on-flowfuse-devices.png diff --git a/src/blog/2024/07/images/tile-dashboard-new-charts.png b/nuxt/public/blog/2024/07/images/tile-dashboard-new-charts.png similarity index 100% rename from src/blog/2024/07/images/tile-dashboard-new-charts.png rename to nuxt/public/blog/2024/07/images/tile-dashboard-new-charts.png diff --git a/src/blog/2024/07/images/ui-chart-bar-grouped-finance-stacks.png b/nuxt/public/blog/2024/07/images/ui-chart-bar-grouped-finance-stacks.png similarity index 100% rename from src/blog/2024/07/images/ui-chart-bar-grouped-finance-stacks.png rename to nuxt/public/blog/2024/07/images/ui-chart-bar-grouped-finance-stacks.png diff --git a/src/blog/2024/07/images/ui-chart-bar-grouped-finance.png b/nuxt/public/blog/2024/07/images/ui-chart-bar-grouped-finance.png similarity index 100% rename from src/blog/2024/07/images/ui-chart-bar-grouped-finance.png rename to nuxt/public/blog/2024/07/images/ui-chart-bar-grouped-finance.png diff --git a/src/blog/2024/07/images/ui-chart-bar-sw-config.png b/nuxt/public/blog/2024/07/images/ui-chart-bar-sw-config.png similarity index 100% rename from src/blog/2024/07/images/ui-chart-bar-sw-config.png rename to nuxt/public/blog/2024/07/images/ui-chart-bar-sw-config.png diff --git a/src/blog/2024/07/images/ui-chart-bar-sw.png b/nuxt/public/blog/2024/07/images/ui-chart-bar-sw.png similarity index 100% rename from src/blog/2024/07/images/ui-chart-bar-sw.png rename to nuxt/public/blog/2024/07/images/ui-chart-bar-sw.png diff --git a/src/blog/2024/07/images/ui-chart-pie-doughnut.png b/nuxt/public/blog/2024/07/images/ui-chart-pie-doughnut.png similarity index 100% rename from src/blog/2024/07/images/ui-chart-pie-doughnut.png rename to nuxt/public/blog/2024/07/images/ui-chart-pie-doughnut.png diff --git a/src/blog/2024/08/images/2-8-release-bulk-move.png b/nuxt/public/blog/2024/08/images/2-8-release-bulk-move.png similarity index 100% rename from src/blog/2024/08/images/2-8-release-bulk-move.png rename to nuxt/public/blog/2024/08/images/2-8-release-bulk-move.png diff --git a/src/blog/2024/08/images/2-8-release-notifications.png b/nuxt/public/blog/2024/08/images/2-8-release-notifications.png similarity index 100% rename from src/blog/2024/08/images/2-8-release-notifications.png rename to nuxt/public/blog/2024/08/images/2-8-release-notifications.png diff --git a/src/blog/2024/08/images/after.png b/nuxt/public/blog/2024/08/images/after.png similarity index 100% rename from src/blog/2024/08/images/after.png rename to nuxt/public/blog/2024/08/images/after.png diff --git a/src/blog/2024/08/images/ask-assistant-json-2.png b/nuxt/public/blog/2024/08/images/ask-assistant-json-2.png similarity index 100% rename from src/blog/2024/08/images/ask-assistant-json-2.png rename to nuxt/public/blog/2024/08/images/ask-assistant-json-2.png diff --git a/src/blog/2024/08/images/ask-assistant-json.jpg b/nuxt/public/blog/2024/08/images/ask-assistant-json.jpg similarity index 100% rename from src/blog/2024/08/images/ask-assistant-json.jpg rename to nuxt/public/blog/2024/08/images/ask-assistant-json.jpg diff --git a/src/blog/2024/08/images/before.png b/nuxt/public/blog/2024/08/images/before.png similarity index 100% rename from src/blog/2024/08/images/before.png rename to nuxt/public/blog/2024/08/images/before.png diff --git a/src/blog/2024/08/images/brdging-opcua-to-mqtt.png b/nuxt/public/blog/2024/08/images/brdging-opcua-to-mqtt.png similarity index 100% rename from src/blog/2024/08/images/brdging-opcua-to-mqtt.png rename to nuxt/public/blog/2024/08/images/brdging-opcua-to-mqtt.png diff --git a/src/blog/2024/08/images/button-added-dashboard.png b/nuxt/public/blog/2024/08/images/button-added-dashboard.png similarity index 100% rename from src/blog/2024/08/images/button-added-dashboard.png rename to nuxt/public/blog/2024/08/images/button-added-dashboard.png diff --git a/src/blog/2024/08/images/change-node-setting-nodeid-datatype.png b/nuxt/public/blog/2024/08/images/change-node-setting-nodeid-datatype.png similarity index 100% rename from src/blog/2024/08/images/change-node-setting-nodeid-datatype.png rename to nuxt/public/blog/2024/08/images/change-node-setting-nodeid-datatype.png diff --git a/src/blog/2024/08/images/comodity-prices-on-the-table.png b/nuxt/public/blog/2024/08/images/comodity-prices-on-the-table.png similarity index 100% rename from src/blog/2024/08/images/comodity-prices-on-the-table.png rename to nuxt/public/blog/2024/08/images/comodity-prices-on-the-table.png diff --git a/src/blog/2024/08/images/customize-theming-flowfuse-dashboard.png b/nuxt/public/blog/2024/08/images/customize-theming-flowfuse-dashboard.png similarity index 100% rename from src/blog/2024/08/images/customize-theming-flowfuse-dashboard.png rename to nuxt/public/blog/2024/08/images/customize-theming-flowfuse-dashboard.png diff --git a/src/blog/2024/08/images/dashboard-2-1150-release.png b/nuxt/public/blog/2024/08/images/dashboard-2-1150-release.png similarity index 100% rename from src/blog/2024/08/images/dashboard-2-1150-release.png rename to nuxt/public/blog/2024/08/images/dashboard-2-1150-release.png diff --git a/src/blog/2024/08/images/dashboard-2-commits.png b/nuxt/public/blog/2024/08/images/dashboard-2-commits.png similarity index 100% rename from src/blog/2024/08/images/dashboard-2-commits.png rename to nuxt/public/blog/2024/08/images/dashboard-2-commits.png diff --git a/src/blog/2024/08/images/dashboard-2-download.png b/nuxt/public/blog/2024/08/images/dashboard-2-download.png similarity index 100% rename from src/blog/2024/08/images/dashboard-2-download.png rename to nuxt/public/blog/2024/08/images/dashboard-2-download.png diff --git a/src/blog/2024/08/images/dashboard-2-project-plan.png b/nuxt/public/blog/2024/08/images/dashboard-2-project-plan.png similarity index 100% rename from src/blog/2024/08/images/dashboard-2-project-plan.png rename to nuxt/public/blog/2024/08/images/dashboard-2-project-plan.png diff --git a/src/blog/2024/08/images/dashboard-2-vs-ui-builder.png b/nuxt/public/blog/2024/08/images/dashboard-2-vs-ui-builder.png similarity index 100% rename from src/blog/2024/08/images/dashboard-2-vs-ui-builder.png rename to nuxt/public/blog/2024/08/images/dashboard-2-vs-ui-builder.png diff --git a/src/blog/2024/08/images/dashboard-theme-settings.png b/nuxt/public/blog/2024/08/images/dashboard-theme-settings.png similarity index 100% rename from src/blog/2024/08/images/dashboard-theme-settings.png rename to nuxt/public/blog/2024/08/images/dashboard-theme-settings.png diff --git a/src/blog/2024/08/images/dashboard-theme-tab.png b/nuxt/public/blog/2024/08/images/dashboard-theme-tab.png similarity index 100% rename from src/blog/2024/08/images/dashboard-theme-tab.png rename to nuxt/public/blog/2024/08/images/dashboard-theme-tab.png diff --git a/src/blog/2024/08/images/default-header.webm b/nuxt/public/blog/2024/08/images/default-header.webm similarity index 100% rename from src/blog/2024/08/images/default-header.webm rename to nuxt/public/blog/2024/08/images/default-header.webm diff --git a/src/blog/2024/08/images/edit-setting-button.png b/nuxt/public/blog/2024/08/images/edit-setting-button.png similarity index 100% rename from src/blog/2024/08/images/edit-setting-button.png rename to nuxt/public/blog/2024/08/images/edit-setting-button.png diff --git a/src/blog/2024/08/images/fixed-header.webm b/nuxt/public/blog/2024/08/images/fixed-header.webm similarity index 100% rename from src/blog/2024/08/images/fixed-header.webm rename to nuxt/public/blog/2024/08/images/fixed-header.webm diff --git a/src/blog/2024/08/images/header-style-options.png b/nuxt/public/blog/2024/08/images/header-style-options.png similarity index 100% rename from src/blog/2024/08/images/header-style-options.png rename to nuxt/public/blog/2024/08/images/header-style-options.png diff --git a/src/blog/2024/08/images/hidden-header.png b/nuxt/public/blog/2024/08/images/hidden-header.png similarity index 100% rename from src/blog/2024/08/images/hidden-header.png rename to nuxt/public/blog/2024/08/images/hidden-header.png diff --git a/src/blog/2024/08/images/join-node-config.png b/nuxt/public/blog/2024/08/images/join-node-config.png similarity index 100% rename from src/blog/2024/08/images/join-node-config.png rename to nuxt/public/blog/2024/08/images/join-node-config.png diff --git a/src/blog/2024/08/images/layout-tab-dashboard.png b/nuxt/public/blog/2024/08/images/layout-tab-dashboard.png similarity index 100% rename from src/blog/2024/08/images/layout-tab-dashboard.png rename to nuxt/public/blog/2024/08/images/layout-tab-dashboard.png diff --git a/src/blog/2024/08/images/left-side-area.png b/nuxt/public/blog/2024/08/images/left-side-area.png similarity index 100% rename from src/blog/2024/08/images/left-side-area.png rename to nuxt/public/blog/2024/08/images/left-side-area.png diff --git a/src/blog/2024/08/images/logo-added-dashboard.png b/nuxt/public/blog/2024/08/images/logo-added-dashboard.png similarity index 100% rename from src/blog/2024/08/images/logo-added-dashboard.png rename to nuxt/public/blog/2024/08/images/logo-added-dashboard.png diff --git a/src/blog/2024/08/images/mqtt-broker-config.png b/nuxt/public/blog/2024/08/images/mqtt-broker-config.png similarity index 100% rename from src/blog/2024/08/images/mqtt-broker-config.png rename to nuxt/public/blog/2024/08/images/mqtt-broker-config.png diff --git a/src/blog/2024/08/images/mqtt-in-node-config.png b/nuxt/public/blog/2024/08/images/mqtt-in-node-config.png similarity index 100% rename from src/blog/2024/08/images/mqtt-in-node-config.png rename to nuxt/public/blog/2024/08/images/mqtt-in-node-config.png diff --git a/src/blog/2024/08/images/mqtt-out-node-config.png b/nuxt/public/blog/2024/08/images/mqtt-out-node-config.png similarity index 100% rename from src/blog/2024/08/images/mqtt-out-node-config.png rename to nuxt/public/blog/2024/08/images/mqtt-out-node-config.png diff --git a/src/blog/2024/08/images/mqtt-spark-device-advance.png b/nuxt/public/blog/2024/08/images/mqtt-spark-device-advance.png similarity index 100% rename from src/blog/2024/08/images/mqtt-spark-device-advance.png rename to nuxt/public/blog/2024/08/images/mqtt-spark-device-advance.png diff --git a/src/blog/2024/08/images/mqtt-sparkplug-device-node.png b/nuxt/public/blog/2024/08/images/mqtt-sparkplug-device-node.png similarity index 100% rename from src/blog/2024/08/images/mqtt-sparkplug-device-node.png rename to nuxt/public/blog/2024/08/images/mqtt-sparkplug-device-node.png diff --git a/src/blog/2024/08/images/mqtt-to-opcua.webm b/nuxt/public/blog/2024/08/images/mqtt-to-opcua.webm similarity index 100% rename from src/blog/2024/08/images/mqtt-to-opcua.webm rename to nuxt/public/blog/2024/08/images/mqtt-to-opcua.webm diff --git a/src/blog/2024/08/images/opc-ua-config.png b/nuxt/public/blog/2024/08/images/opc-ua-config.png similarity index 100% rename from src/blog/2024/08/images/opc-ua-config.png rename to nuxt/public/blog/2024/08/images/opc-ua-config.png diff --git a/src/blog/2024/08/images/opc-ua-config2.png b/nuxt/public/blog/2024/08/images/opc-ua-config2.png similarity index 100% rename from src/blog/2024/08/images/opc-ua-config2.png rename to nuxt/public/blog/2024/08/images/opc-ua-config2.png diff --git a/src/blog/2024/08/images/opc-ua-to-mqtt.png b/nuxt/public/blog/2024/08/images/opc-ua-to-mqtt.png similarity index 100% rename from src/blog/2024/08/images/opc-ua-to-mqtt.png rename to nuxt/public/blog/2024/08/images/opc-ua-to-mqtt.png diff --git a/src/blog/2024/08/images/opcua-to-mqtt.webm b/nuxt/public/blog/2024/08/images/opcua-to-mqtt.webm similarity index 100% rename from src/blog/2024/08/images/opcua-to-mqtt.webm rename to nuxt/public/blog/2024/08/images/opcua-to-mqtt.webm diff --git a/src/blog/2024/08/images/opentelemetry-with-node-red.png b/nuxt/public/blog/2024/08/images/opentelemetry-with-node-red.png similarity index 100% rename from src/blog/2024/08/images/opentelemetry-with-node-red.png rename to nuxt/public/blog/2024/08/images/opentelemetry-with-node-red.png diff --git a/src/blog/2024/08/images/opentelmetry-node.png b/nuxt/public/blog/2024/08/images/opentelmetry-node.png similarity index 100% rename from src/blog/2024/08/images/opentelmetry-node.png rename to nuxt/public/blog/2024/08/images/opentelmetry-node.png diff --git a/src/blog/2024/08/images/release-2-8-august-2024.png b/nuxt/public/blog/2024/08/images/release-2-8-august-2024.png similarity index 100% rename from src/blog/2024/08/images/release-2-8-august-2024.png rename to nuxt/public/blog/2024/08/images/release-2-8-august-2024.png diff --git a/src/blog/2024/08/images/right-side-area.png b/nuxt/public/blog/2024/08/images/right-side-area.png similarity index 100% rename from src/blog/2024/08/images/right-side-area.png rename to nuxt/public/blog/2024/08/images/right-side-area.png diff --git a/src/blog/2024/08/images/settings.png b/nuxt/public/blog/2024/08/images/settings.png similarity index 100% rename from src/blog/2024/08/images/settings.png rename to nuxt/public/blog/2024/08/images/settings.png diff --git a/src/blog/2024/08/images/sparkplug-messages.png b/nuxt/public/blog/2024/08/images/sparkplug-messages.png similarity index 100% rename from src/blog/2024/08/images/sparkplug-messages.png rename to nuxt/public/blog/2024/08/images/sparkplug-messages.png diff --git a/src/blog/2024/08/images/structrer-of-page.png b/nuxt/public/blog/2024/08/images/structrer-of-page.png similarity index 100% rename from src/blog/2024/08/images/structrer-of-page.png rename to nuxt/public/blog/2024/08/images/structrer-of-page.png diff --git a/src/blog/2024/08/images/ui-builder-commits.png b/nuxt/public/blog/2024/08/images/ui-builder-commits.png similarity index 100% rename from src/blog/2024/08/images/ui-builder-commits.png rename to nuxt/public/blog/2024/08/images/ui-builder-commits.png diff --git a/src/blog/2024/08/images/ui-builder-downloads.png b/nuxt/public/blog/2024/08/images/ui-builder-downloads.png similarity index 100% rename from src/blog/2024/08/images/ui-builder-downloads.png rename to nuxt/public/blog/2024/08/images/ui-builder-downloads.png diff --git a/src/blog/2024/08/images/ui-gauge-battery.png b/nuxt/public/blog/2024/08/images/ui-gauge-battery.png similarity index 100% rename from src/blog/2024/08/images/ui-gauge-battery.png rename to nuxt/public/blog/2024/08/images/ui-gauge-battery.png diff --git a/src/blog/2024/08/images/ui-gauge-tank-filled.png b/nuxt/public/blog/2024/08/images/ui-gauge-tank-filled.png similarity index 100% rename from src/blog/2024/08/images/ui-gauge-tank-filled.png rename to nuxt/public/blog/2024/08/images/ui-gauge-tank-filled.png diff --git a/src/blog/2024/08/images/ui-number-input-widget.png b/nuxt/public/blog/2024/08/images/ui-number-input-widget.png similarity index 100% rename from src/blog/2024/08/images/ui-number-input-widget.png rename to nuxt/public/blog/2024/08/images/ui-number-input-widget.png diff --git a/src/blog/2024/08/images/user-profile.png b/nuxt/public/blog/2024/08/images/user-profile.png similarity index 100% rename from src/blog/2024/08/images/user-profile.png rename to nuxt/public/blog/2024/08/images/user-profile.png diff --git a/src/blog/2024/08/images/using-sparkplug-with-node-red.png b/nuxt/public/blog/2024/08/images/using-sparkplug-with-node-red.png similarity index 100% rename from src/blog/2024/08/images/using-sparkplug-with-node-red.png rename to nuxt/public/blog/2024/08/images/using-sparkplug-with-node-red.png diff --git a/src/blog/2024/08/images/with-plane-mqtt.png b/nuxt/public/blog/2024/08/images/with-plane-mqtt.png similarity index 100% rename from src/blog/2024/08/images/with-plane-mqtt.png rename to nuxt/public/blog/2024/08/images/with-plane-mqtt.png diff --git a/src/blog/2024/08/images/with-sparkplug.png b/nuxt/public/blog/2024/08/images/with-sparkplug.png similarity index 100% rename from src/blog/2024/08/images/with-sparkplug.png rename to nuxt/public/blog/2024/08/images/with-sparkplug.png diff --git a/src/blog/2024/09/images/add-env.png b/nuxt/public/blog/2024/09/images/add-env.png similarity index 100% rename from src/blog/2024/09/images/add-env.png rename to nuxt/public/blog/2024/09/images/add-env.png diff --git a/src/blog/2024/09/images/application-device-snapshot-tab.png b/nuxt/public/blog/2024/09/images/application-device-snapshot-tab.png similarity index 100% rename from src/blog/2024/09/images/application-device-snapshot-tab.png rename to nuxt/public/blog/2024/09/images/application-device-snapshot-tab.png diff --git a/src/blog/2024/09/images/button-to-create-snapshot.png b/nuxt/public/blog/2024/09/images/button-to-create-snapshot.png similarity index 100% rename from src/blog/2024/09/images/button-to-create-snapshot.png rename to nuxt/public/blog/2024/09/images/button-to-create-snapshot.png diff --git a/src/blog/2024/09/images/button-upload-snapshot.png b/nuxt/public/blog/2024/09/images/button-upload-snapshot.png similarity index 100% rename from src/blog/2024/09/images/button-upload-snapshot.png rename to nuxt/public/blog/2024/09/images/button-upload-snapshot.png diff --git a/src/blog/2024/09/images/compare-snapshot-option.png b/nuxt/public/blog/2024/09/images/compare-snapshot-option.png similarity index 100% rename from src/blog/2024/09/images/compare-snapshot-option.png rename to nuxt/public/blog/2024/09/images/compare-snapshot-option.png diff --git a/src/blog/2024/09/images/customizing-apperance.png b/nuxt/public/blog/2024/09/images/customizing-apperance.png similarity index 100% rename from src/blog/2024/09/images/customizing-apperance.png rename to nuxt/public/blog/2024/09/images/customizing-apperance.png diff --git a/src/blog/2024/09/images/deploy-snapshot.png b/nuxt/public/blog/2024/09/images/deploy-snapshot.png similarity index 100% rename from src/blog/2024/09/images/deploy-snapshot.png rename to nuxt/public/blog/2024/09/images/deploy-snapshot.png diff --git a/src/blog/2024/09/images/devices-option-in-the-sidebar.png b/nuxt/public/blog/2024/09/images/devices-option-in-the-sidebar.png similarity index 100% rename from src/blog/2024/09/images/devices-option-in-the-sidebar.png rename to nuxt/public/blog/2024/09/images/devices-option-in-the-sidebar.png diff --git a/src/blog/2024/09/images/documentation-tab.png b/nuxt/public/blog/2024/09/images/documentation-tab.png similarity index 100% rename from src/blog/2024/09/images/documentation-tab.png rename to nuxt/public/blog/2024/09/images/documentation-tab.png diff --git a/src/blog/2024/09/images/download-snapshot-prompt.png b/nuxt/public/blog/2024/09/images/download-snapshot-prompt.png similarity index 100% rename from src/blog/2024/09/images/download-snapshot-prompt.png rename to nuxt/public/blog/2024/09/images/download-snapshot-prompt.png diff --git a/src/blog/2024/09/images/download-snapshot.png b/nuxt/public/blog/2024/09/images/download-snapshot.png similarity index 100% rename from src/blog/2024/09/images/download-snapshot.png rename to nuxt/public/blog/2024/09/images/download-snapshot.png diff --git a/src/blog/2024/09/images/edit-properties.png b/nuxt/public/blog/2024/09/images/edit-properties.png similarity index 100% rename from src/blog/2024/09/images/edit-properties.png rename to nuxt/public/blog/2024/09/images/edit-properties.png diff --git a/src/blog/2024/09/images/edit-template-option.png b/nuxt/public/blog/2024/09/images/edit-template-option.png similarity index 100% rename from src/blog/2024/09/images/edit-template-option.png rename to nuxt/public/blog/2024/09/images/edit-template-option.png diff --git a/src/blog/2024/09/images/enable-disable-auto-snapshot.png b/nuxt/public/blog/2024/09/images/enable-disable-auto-snapshot.png similarity index 100% rename from src/blog/2024/09/images/enable-disable-auto-snapshot.png rename to nuxt/public/blog/2024/09/images/enable-disable-auto-snapshot.png diff --git a/src/blog/2024/09/images/form-to-give-snapshot-name-desc.png b/nuxt/public/blog/2024/09/images/form-to-give-snapshot-name-desc.png similarity index 100% rename from src/blog/2024/09/images/form-to-give-snapshot-name-desc.png rename to nuxt/public/blog/2024/09/images/form-to-give-snapshot-name-desc.png diff --git a/src/blog/2024/09/images/html-structer-of-target-website.png b/nuxt/public/blog/2024/09/images/html-structer-of-target-website.png similarity index 100% rename from src/blog/2024/09/images/html-structer-of-target-website.png rename to nuxt/public/blog/2024/09/images/html-structer-of-target-website.png diff --git a/src/blog/2024/09/images/http-request-url-env-adding.png b/nuxt/public/blog/2024/09/images/http-request-url-env-adding.png similarity index 100% rename from src/blog/2024/09/images/http-request-url-env-adding.png rename to nuxt/public/blog/2024/09/images/http-request-url-env-adding.png diff --git a/src/blog/2024/09/images/input-adding-subflow.png b/nuxt/public/blog/2024/09/images/input-adding-subflow.png similarity index 100% rename from src/blog/2024/09/images/input-adding-subflow.png rename to nuxt/public/blog/2024/09/images/input-adding-subflow.png diff --git a/src/blog/2024/09/images/instances-option-in-sidebar.png b/nuxt/public/blog/2024/09/images/instances-option-in-sidebar.png similarity index 100% rename from src/blog/2024/09/images/instances-option-in-sidebar.png rename to nuxt/public/blog/2024/09/images/instances-option-in-sidebar.png diff --git a/src/blog/2024/09/images/max-retry-setting.png b/nuxt/public/blog/2024/09/images/max-retry-setting.png similarity index 100% rename from src/blog/2024/09/images/max-retry-setting.png rename to nuxt/public/blog/2024/09/images/max-retry-setting.png diff --git a/src/blog/2024/09/images/option-to-create-device-snapshot.png b/nuxt/public/blog/2024/09/images/option-to-create-device-snapshot.png similarity index 100% rename from src/blog/2024/09/images/option-to-create-device-snapshot.png rename to nuxt/public/blog/2024/09/images/option-to-create-device-snapshot.png diff --git a/src/blog/2024/09/images/option-to-switch-to-snapshots-tab.png b/nuxt/public/blog/2024/09/images/option-to-switch-to-snapshots-tab.png similarity index 100% rename from src/blog/2024/09/images/option-to-switch-to-snapshots-tab.png rename to nuxt/public/blog/2024/09/images/option-to-switch-to-snapshots-tab.png diff --git a/src/blog/2024/09/images/options-available-for-instance.png b/nuxt/public/blog/2024/09/images/options-available-for-instance.png similarity index 100% rename from src/blog/2024/09/images/options-available-for-instance.png rename to nuxt/public/blog/2024/09/images/options-available-for-instance.png diff --git a/src/blog/2024/09/images/output-adding-subflow.png b/nuxt/public/blog/2024/09/images/output-adding-subflow.png similarity index 100% rename from src/blog/2024/09/images/output-adding-subflow.png rename to nuxt/public/blog/2024/09/images/output-adding-subflow.png diff --git a/src/blog/2024/09/images/recreate-sequence-option.png b/nuxt/public/blog/2024/09/images/recreate-sequence-option.png similarity index 100% rename from src/blog/2024/09/images/recreate-sequence-option.png rename to nuxt/public/blog/2024/09/images/recreate-sequence-option.png diff --git a/src/blog/2024/09/images/release-2-9-september-2024.png b/nuxt/public/blog/2024/09/images/release-2-9-september-2024.png similarity index 100% rename from src/blog/2024/09/images/release-2-9-september-2024.png rename to nuxt/public/blog/2024/09/images/release-2-9-september-2024.png diff --git a/src/blog/2024/09/images/screenshot-sbom.png b/nuxt/public/blog/2024/09/images/screenshot-sbom.png similarity index 100% rename from src/blog/2024/09/images/screenshot-sbom.png rename to nuxt/public/blog/2024/09/images/screenshot-sbom.png diff --git a/src/blog/2024/09/images/selecting-and-converting-subflow.webm b/nuxt/public/blog/2024/09/images/selecting-and-converting-subflow.webm similarity index 100% rename from src/blog/2024/09/images/selecting-and-converting-subflow.webm rename to nuxt/public/blog/2024/09/images/selecting-and-converting-subflow.webm diff --git a/src/blog/2024/09/images/set-targe-snapshot-option.png b/nuxt/public/blog/2024/09/images/set-targe-snapshot-option.png similarity index 100% rename from src/blog/2024/09/images/set-targe-snapshot-option.png rename to nuxt/public/blog/2024/09/images/set-targe-snapshot-option.png diff --git a/src/blog/2024/09/images/snapshot-in-the-list.png b/nuxt/public/blog/2024/09/images/snapshot-in-the-list.png similarity index 100% rename from src/blog/2024/09/images/snapshot-in-the-list.png rename to nuxt/public/blog/2024/09/images/snapshot-in-the-list.png diff --git a/src/blog/2024/09/images/snapshot-with-node-red-ff.png b/nuxt/public/blog/2024/09/images/snapshot-with-node-red-ff.png similarity index 100% rename from src/blog/2024/09/images/snapshot-with-node-red-ff.png rename to nuxt/public/blog/2024/09/images/snapshot-with-node-red-ff.png diff --git a/src/blog/2024/09/images/status-adding-subflow.png b/nuxt/public/blog/2024/09/images/status-adding-subflow.png similarity index 100% rename from src/blog/2024/09/images/status-adding-subflow.png rename to nuxt/public/blog/2024/09/images/status-adding-subflow.png diff --git a/src/blog/2024/09/images/status-showing-the-target-snapshot.png b/nuxt/public/blog/2024/09/images/status-showing-the-target-snapshot.png similarity index 100% rename from src/blog/2024/09/images/status-showing-the-target-snapshot.png rename to nuxt/public/blog/2024/09/images/status-showing-the-target-snapshot.png diff --git a/src/blog/2024/09/images/subflow-in-node-red.png b/nuxt/public/blog/2024/09/images/subflow-in-node-red.png similarity index 100% rename from src/blog/2024/09/images/subflow-in-node-red.png rename to nuxt/public/blog/2024/09/images/subflow-in-node-red.png diff --git a/src/blog/2024/09/images/subflow-showing-in-pallete.png b/nuxt/public/blog/2024/09/images/subflow-showing-in-pallete.png similarity index 100% rename from src/blog/2024/09/images/subflow-showing-in-pallete.png rename to nuxt/public/blog/2024/09/images/subflow-showing-in-pallete.png diff --git a/src/blog/2024/09/images/subflow.png b/nuxt/public/blog/2024/09/images/subflow.png similarity index 100% rename from src/blog/2024/09/images/subflow.png rename to nuxt/public/blog/2024/09/images/subflow.png diff --git a/src/blog/2024/09/images/ui-preivew-env.png b/nuxt/public/blog/2024/09/images/ui-preivew-env.png similarity index 100% rename from src/blog/2024/09/images/ui-preivew-env.png rename to nuxt/public/blog/2024/09/images/ui-preivew-env.png diff --git a/src/blog/2024/09/images/upload-prompt.png b/nuxt/public/blog/2024/09/images/upload-prompt.png similarity index 100% rename from src/blog/2024/09/images/upload-prompt.png rename to nuxt/public/blog/2024/09/images/upload-prompt.png diff --git a/src/blog/2024/09/images/upload-snapshot-prompt.png b/nuxt/public/blog/2024/09/images/upload-snapshot-prompt.png similarity index 100% rename from src/blog/2024/09/images/upload-snapshot-prompt.png rename to nuxt/public/blog/2024/09/images/upload-snapshot-prompt.png diff --git a/src/blog/2024/09/images/view-snapshot-option.png b/nuxt/public/blog/2024/09/images/view-snapshot-option.png similarity index 100% rename from src/blog/2024/09/images/view-snapshot-option.png rename to nuxt/public/blog/2024/09/images/view-snapshot-option.png diff --git a/src/blog/2024/09/images/view-snapshot-window.png b/nuxt/public/blog/2024/09/images/view-snapshot-window.png similarity index 100% rename from src/blog/2024/09/images/view-snapshot-window.png rename to nuxt/public/blog/2024/09/images/view-snapshot-window.png diff --git a/src/blog/2024/09/images/webscraping-with-node-red.png b/nuxt/public/blog/2024/09/images/webscraping-with-node-red.png similarity index 100% rename from src/blog/2024/09/images/webscraping-with-node-red.png rename to nuxt/public/blog/2024/09/images/webscraping-with-node-red.png diff --git a/src/blog/2024/09/images/webscrapping-result.png b/nuxt/public/blog/2024/09/images/webscrapping-result.png similarity index 100% rename from src/blog/2024/09/images/webscrapping-result.png rename to nuxt/public/blog/2024/09/images/webscrapping-result.png diff --git a/src/blog/2024/09/images/window-comparing-snapshots-2.png b/nuxt/public/blog/2024/09/images/window-comparing-snapshots-2.png similarity index 100% rename from src/blog/2024/09/images/window-comparing-snapshots-2.png rename to nuxt/public/blog/2024/09/images/window-comparing-snapshots-2.png diff --git a/src/blog/2024/09/images/window-comparing-snapshots.png b/nuxt/public/blog/2024/09/images/window-comparing-snapshots.png similarity index 100% rename from src/blog/2024/09/images/window-comparing-snapshots.png rename to nuxt/public/blog/2024/09/images/window-comparing-snapshots.png diff --git a/src/blog/2024/10/images/2f-auth.png b/nuxt/public/blog/2024/10/images/2f-auth.png similarity index 100% rename from src/blog/2024/10/images/2f-auth.png rename to nuxt/public/blog/2024/10/images/2f-auth.png diff --git a/src/blog/2024/10/images/What-is-DevOps.png b/nuxt/public/blog/2024/10/images/What-is-DevOps.png similarity index 100% rename from src/blog/2024/10/images/What-is-DevOps.png rename to nuxt/public/blog/2024/10/images/What-is-DevOps.png diff --git a/src/blog/2024/10/images/add-pipeline-button.png b/nuxt/public/blog/2024/10/images/add-pipeline-button.png similarity index 100% rename from src/blog/2024/10/images/add-pipeline-button.png rename to nuxt/public/blog/2024/10/images/add-pipeline-button.png diff --git a/src/blog/2024/10/images/app-icon-installation.png b/nuxt/public/blog/2024/10/images/app-icon-installation.png similarity index 100% rename from src/blog/2024/10/images/app-icon-installation.png rename to nuxt/public/blog/2024/10/images/app-icon-installation.png diff --git a/src/blog/2024/10/images/application-audit-logs.png b/nuxt/public/blog/2024/10/images/application-audit-logs.png similarity index 100% rename from src/blog/2024/10/images/application-audit-logs.png rename to nuxt/public/blog/2024/10/images/application-audit-logs.png diff --git a/src/blog/2024/10/images/applications-options-in-the-ff.png b/nuxt/public/blog/2024/10/images/applications-options-in-the-ff.png similarity index 100% rename from src/blog/2024/10/images/applications-options-in-the-ff.png rename to nuxt/public/blog/2024/10/images/applications-options-in-the-ff.png diff --git a/src/blog/2024/10/images/blockly.png b/nuxt/public/blog/2024/10/images/blockly.png similarity index 100% rename from src/blog/2024/10/images/blockly.png rename to nuxt/public/blog/2024/10/images/blockly.png diff --git a/src/blog/2024/10/images/button-to-add-stages.png b/nuxt/public/blog/2024/10/images/button-to-add-stages.png similarity index 100% rename from src/blog/2024/10/images/button-to-add-stages.png rename to nuxt/public/blog/2024/10/images/button-to-add-stages.png diff --git a/src/blog/2024/10/images/button-to-run-pipeline.png b/nuxt/public/blog/2024/10/images/button-to-run-pipeline.png similarity index 100% rename from src/blog/2024/10/images/button-to-run-pipeline.png rename to nuxt/public/blog/2024/10/images/button-to-run-pipeline.png diff --git a/src/blog/2024/10/images/centralize-node-red-instance.png b/nuxt/public/blog/2024/10/images/centralize-node-red-instance.png similarity index 100% rename from src/blog/2024/10/images/centralize-node-red-instance.png rename to nuxt/public/blog/2024/10/images/centralize-node-red-instance.png diff --git a/src/blog/2024/10/images/chart-histogram.png b/nuxt/public/blog/2024/10/images/chart-histogram.png similarity index 100% rename from src/blog/2024/10/images/chart-histogram.png rename to nuxt/public/blog/2024/10/images/chart-histogram.png diff --git a/src/blog/2024/10/images/creating-and-automating-devops-pipeline-nr.png b/nuxt/public/blog/2024/10/images/creating-and-automating-devops-pipeline-nr.png similarity index 100% rename from src/blog/2024/10/images/creating-and-automating-devops-pipeline-nr.png rename to nuxt/public/blog/2024/10/images/creating-and-automating-devops-pipeline-nr.png diff --git a/src/blog/2024/10/images/dashboard-1-18-0-blog-tile.png b/nuxt/public/blog/2024/10/images/dashboard-1-18-0-blog-tile.png similarity index 100% rename from src/blog/2024/10/images/dashboard-1-18-0-blog-tile.png rename to nuxt/public/blog/2024/10/images/dashboard-1-18-0-blog-tile.png diff --git a/src/blog/2024/10/images/dependencies-tab-option.png b/nuxt/public/blog/2024/10/images/dependencies-tab-option.png similarity index 100% rename from src/blog/2024/10/images/dependencies-tab-option.png rename to nuxt/public/blog/2024/10/images/dependencies-tab-option.png diff --git a/src/blog/2024/10/images/device-monitoring-chart.webm b/nuxt/public/blog/2024/10/images/device-monitoring-chart.webm similarity index 100% rename from src/blog/2024/10/images/device-monitoring-chart.webm rename to nuxt/public/blog/2024/10/images/device-monitoring-chart.webm diff --git a/src/blog/2024/10/images/device-monitoring-gauges.webm b/nuxt/public/blog/2024/10/images/device-monitoring-gauges.webm similarity index 100% rename from src/blog/2024/10/images/device-monitoring-gauges.webm rename to nuxt/public/blog/2024/10/images/device-monitoring-gauges.webm diff --git a/src/blog/2024/10/images/devices.png b/nuxt/public/blog/2024/10/images/devices.png similarity index 100% rename from src/blog/2024/10/images/devices.png rename to nuxt/public/blog/2024/10/images/devices.png diff --git a/src/blog/2024/10/images/devops-pipeline-option-in-apps.png b/nuxt/public/blog/2024/10/images/devops-pipeline-option-in-apps.png similarity index 100% rename from src/blog/2024/10/images/devops-pipeline-option-in-apps.png rename to nuxt/public/blog/2024/10/images/devops-pipeline-option-in-apps.png diff --git a/src/blog/2024/10/images/devops-pipeline.webm b/nuxt/public/blog/2024/10/images/devops-pipeline.webm similarity index 100% rename from src/blog/2024/10/images/devops-pipeline.webm rename to nuxt/public/blog/2024/10/images/devops-pipeline.webm diff --git a/src/blog/2024/10/images/devops.png b/nuxt/public/blog/2024/10/images/devops.png similarity index 100% rename from src/blog/2024/10/images/devops.png rename to nuxt/public/blog/2024/10/images/devops.png diff --git a/src/blog/2024/10/images/exploring-flowfuse-project-nodes.png b/nuxt/public/blog/2024/10/images/exploring-flowfuse-project-nodes.png similarity index 100% rename from src/blog/2024/10/images/exploring-flowfuse-project-nodes.png rename to nuxt/public/blog/2024/10/images/exploring-flowfuse-project-nodes.png diff --git a/src/blog/2024/10/images/ff-mqtt.png b/nuxt/public/blog/2024/10/images/ff-mqtt.png similarity index 100% rename from src/blog/2024/10/images/ff-mqtt.png rename to nuxt/public/blog/2024/10/images/ff-mqtt.png diff --git a/src/blog/2024/10/images/flowfuse-ai-assistant.webm b/nuxt/public/blog/2024/10/images/flowfuse-ai-assistant.webm similarity index 100% rename from src/blog/2024/10/images/flowfuse-ai-assistant.webm rename to nuxt/public/blog/2024/10/images/flowfuse-ai-assistant.webm diff --git a/src/blog/2024/10/images/flowfuse-sbom.png b/nuxt/public/blog/2024/10/images/flowfuse-sbom.png similarity index 100% rename from src/blog/2024/10/images/flowfuse-sbom.png rename to nuxt/public/blog/2024/10/images/flowfuse-sbom.png diff --git a/src/blog/2024/10/images/flowfuse-security-features.png b/nuxt/public/blog/2024/10/images/flowfuse-security-features.png similarity index 100% rename from src/blog/2024/10/images/flowfuse-security-features.png rename to nuxt/public/blog/2024/10/images/flowfuse-security-features.png diff --git a/src/blog/2024/10/images/form-to-create-configure-stages.png b/nuxt/public/blog/2024/10/images/form-to-create-configure-stages.png similarity index 100% rename from src/blog/2024/10/images/form-to-create-configure-stages.png rename to nuxt/public/blog/2024/10/images/form-to-create-configure-stages.png diff --git a/src/blog/2024/10/images/form-to-create-pipeline.png b/nuxt/public/blog/2024/10/images/form-to-create-pipeline.png similarity index 100% rename from src/blog/2024/10/images/form-to-create-pipeline.png rename to nuxt/public/blog/2024/10/images/form-to-create-pipeline.png diff --git a/src/blog/2024/10/images/genrate-token-for-platform-api.png b/nuxt/public/blog/2024/10/images/genrate-token-for-platform-api.png similarity index 100% rename from src/blog/2024/10/images/genrate-token-for-platform-api.png rename to nuxt/public/blog/2024/10/images/genrate-token-for-platform-api.png diff --git a/src/blog/2024/10/images/high-availablity.png b/nuxt/public/blog/2024/10/images/high-availablity.png similarity index 100% rename from src/blog/2024/10/images/high-availablity.png rename to nuxt/public/blog/2024/10/images/high-availablity.png diff --git a/src/blog/2024/10/images/http-api-auth.png b/nuxt/public/blog/2024/10/images/http-api-auth.png similarity index 100% rename from src/blog/2024/10/images/http-api-auth.png rename to nuxt/public/blog/2024/10/images/http-api-auth.png diff --git a/src/blog/2024/10/images/imersive-editor.png b/nuxt/public/blog/2024/10/images/imersive-editor.png similarity index 100% rename from src/blog/2024/10/images/imersive-editor.png rename to nuxt/public/blog/2024/10/images/imersive-editor.png diff --git a/src/blog/2024/10/images/instance-audit-logs.png b/nuxt/public/blog/2024/10/images/instance-audit-logs.png similarity index 100% rename from src/blog/2024/10/images/instance-audit-logs.png rename to nuxt/public/blog/2024/10/images/instance-audit-logs.png diff --git a/src/blog/2024/10/images/instance-protection.png b/nuxt/public/blog/2024/10/images/instance-protection.png similarity index 100% rename from src/blog/2024/10/images/instance-protection.png rename to nuxt/public/blog/2024/10/images/instance-protection.png diff --git a/src/blog/2024/10/images/instances.png b/nuxt/public/blog/2024/10/images/instances.png similarity index 100% rename from src/blog/2024/10/images/instances.png rename to nuxt/public/blog/2024/10/images/instances.png diff --git a/src/blog/2024/10/images/log.png b/nuxt/public/blog/2024/10/images/log.png similarity index 100% rename from src/blog/2024/10/images/log.png rename to nuxt/public/blog/2024/10/images/log.png diff --git a/src/blog/2024/10/images/mqtt-broker-add-client.png b/nuxt/public/blog/2024/10/images/mqtt-broker-add-client.png similarity index 100% rename from src/blog/2024/10/images/mqtt-broker-add-client.png rename to nuxt/public/blog/2024/10/images/mqtt-broker-add-client.png diff --git a/src/blog/2024/10/images/mqtt-broker-config.png b/nuxt/public/blog/2024/10/images/mqtt-broker-config.png similarity index 100% rename from src/blog/2024/10/images/mqtt-broker-config.png rename to nuxt/public/blog/2024/10/images/mqtt-broker-config.png diff --git a/src/blog/2024/10/images/mqtt-broker-security.png b/nuxt/public/blog/2024/10/images/mqtt-broker-security.png similarity index 100% rename from src/blog/2024/10/images/mqtt-broker-security.png rename to nuxt/public/blog/2024/10/images/mqtt-broker-security.png diff --git a/src/blog/2024/10/images/mqtt-factory-architecture.jpg b/nuxt/public/blog/2024/10/images/mqtt-factory-architecture.jpg similarity index 100% rename from src/blog/2024/10/images/mqtt-factory-architecture.jpg rename to nuxt/public/blog/2024/10/images/mqtt-factory-architecture.jpg diff --git a/src/blog/2024/10/images/node_function.png b/nuxt/public/blog/2024/10/images/node_function.png similarity index 100% rename from src/blog/2024/10/images/node_function.png rename to nuxt/public/blog/2024/10/images/node_function.png diff --git a/src/blog/2024/10/images/project-nodes.png b/nuxt/public/blog/2024/10/images/project-nodes.png similarity index 100% rename from src/blog/2024/10/images/project-nodes.png rename to nuxt/public/blog/2024/10/images/project-nodes.png diff --git a/src/blog/2024/10/images/project-out-node-triggering-flow.webm b/nuxt/public/blog/2024/10/images/project-out-node-triggering-flow.webm similarity index 100% rename from src/blog/2024/10/images/project-out-node-triggering-flow.webm rename to nuxt/public/blog/2024/10/images/project-out-node-triggering-flow.webm diff --git a/src/blog/2024/10/images/quick-ways-to-write-function-nodes.png b/nuxt/public/blog/2024/10/images/quick-ways-to-write-function-nodes.png similarity index 100% rename from src/blog/2024/10/images/quick-ways-to-write-function-nodes.png rename to nuxt/public/blog/2024/10/images/quick-ways-to-write-function-nodes.png diff --git a/src/blog/2024/10/images/rbac.png b/nuxt/public/blog/2024/10/images/rbac.png similarity index 100% rename from src/blog/2024/10/images/rbac.png rename to nuxt/public/blog/2024/10/images/rbac.png diff --git a/src/blog/2024/10/images/sbom.png b/nuxt/public/blog/2024/10/images/sbom.png similarity index 100% rename from src/blog/2024/10/images/sbom.png rename to nuxt/public/blog/2024/10/images/sbom.png diff --git a/src/blog/2024/10/images/screenshot-mqtt-client-config.png b/nuxt/public/blog/2024/10/images/screenshot-mqtt-client-config.png similarity index 100% rename from src/blog/2024/10/images/screenshot-mqtt-client-config.png rename to nuxt/public/blog/2024/10/images/screenshot-mqtt-client-config.png diff --git a/src/blog/2024/10/images/screenshot-visual-timeline.png b/nuxt/public/blog/2024/10/images/screenshot-visual-timeline.png similarity index 100% rename from src/blog/2024/10/images/screenshot-visual-timeline.png rename to nuxt/public/blog/2024/10/images/screenshot-visual-timeline.png diff --git a/src/blog/2024/10/images/snapshots.png b/nuxt/public/blog/2024/10/images/snapshots.png similarity index 100% rename from src/blog/2024/10/images/snapshots.png rename to nuxt/public/blog/2024/10/images/snapshots.png diff --git a/src/blog/2024/10/images/team-audit-logs.png b/nuxt/public/blog/2024/10/images/team-audit-logs.png similarity index 100% rename from src/blog/2024/10/images/team-audit-logs.png rename to nuxt/public/blog/2024/10/images/team-audit-logs.png diff --git a/src/blog/2024/10/images/the-dependency-tab-info.png b/nuxt/public/blog/2024/10/images/the-dependency-tab-info.png similarity index 100% rename from src/blog/2024/10/images/the-dependency-tab-info.png rename to nuxt/public/blog/2024/10/images/the-dependency-tab-info.png diff --git a/src/blog/2024/10/images/tile-release-2-10.png b/nuxt/public/blog/2024/10/images/tile-release-2-10.png similarity index 100% rename from src/blog/2024/10/images/tile-release-2-10.png rename to nuxt/public/blog/2024/10/images/tile-release-2-10.png diff --git a/src/blog/2024/10/images/ui-group-type-dialog.png b/nuxt/public/blog/2024/10/images/ui-group-type-dialog.png similarity index 100% rename from src/blog/2024/10/images/ui-group-type-dialog.png rename to nuxt/public/blog/2024/10/images/ui-group-type-dialog.png diff --git a/src/blog/2024/11/images/FLOWFUSE-IV-Pod__1200x627px_Intro.jpg b/nuxt/public/blog/2024/11/images/FLOWFUSE-IV-Pod__1200x627px_Intro.jpg similarity index 100% rename from src/blog/2024/11/images/FLOWFUSE-IV-Pod__1200x627px_Intro.jpg rename to nuxt/public/blog/2024/11/images/FLOWFUSE-IV-Pod__1200x627px_Intro.jpg diff --git a/src/blog/2024/11/images/audit-log-child-events.png b/nuxt/public/blog/2024/11/images/audit-log-child-events.png similarity index 100% rename from src/blog/2024/11/images/audit-log-child-events.png rename to nuxt/public/blog/2024/11/images/audit-log-child-events.png diff --git a/src/blog/2024/11/images/build-uns-cta-1.png b/nuxt/public/blog/2024/11/images/build-uns-cta-1.png similarity index 100% rename from src/blog/2024/11/images/build-uns-cta-1.png rename to nuxt/public/blog/2024/11/images/build-uns-cta-1.png diff --git a/src/blog/2024/11/images/building-uns-with-flowfuse.png b/nuxt/public/blog/2024/11/images/building-uns-with-flowfuse.png similarity index 100% rename from src/blog/2024/11/images/building-uns-with-flowfuse.png rename to nuxt/public/blog/2024/11/images/building-uns-with-flowfuse.png diff --git a/src/blog/2024/11/images/change-node-calculating-magnitude.png b/nuxt/public/blog/2024/11/images/change-node-calculating-magnitude.png similarity index 100% rename from src/blog/2024/11/images/change-node-calculating-magnitude.png rename to nuxt/public/blog/2024/11/images/change-node-calculating-magnitude.png diff --git a/src/blog/2024/11/images/change-node-structering-data.png b/nuxt/public/blog/2024/11/images/change-node-structering-data.png similarity index 100% rename from src/blog/2024/11/images/change-node-structering-data.png rename to nuxt/public/blog/2024/11/images/change-node-structering-data.png diff --git a/src/blog/2024/11/images/colima-status.png b/nuxt/public/blog/2024/11/images/colima-status.png similarity index 100% rename from src/blog/2024/11/images/colima-status.png rename to nuxt/public/blog/2024/11/images/colima-status.png diff --git a/src/blog/2024/11/images/creating-client-interface.png b/nuxt/public/blog/2024/11/images/creating-client-interface.png similarity index 100% rename from src/blog/2024/11/images/creating-client-interface.png rename to nuxt/public/blog/2024/11/images/creating-client-interface.png diff --git a/src/blog/2024/11/images/dashboard-1-19-0-tile.png b/nuxt/public/blog/2024/11/images/dashboard-1-19-0-tile.png similarity index 100% rename from src/blog/2024/11/images/dashboard-1-19-0-tile.png rename to nuxt/public/blog/2024/11/images/dashboard-1-19-0-tile.png diff --git a/src/blog/2024/11/images/dashboard2.png b/nuxt/public/blog/2024/11/images/dashboard2.png similarity index 100% rename from src/blog/2024/11/images/dashboard2.png rename to nuxt/public/blog/2024/11/images/dashboard2.png diff --git a/src/blog/2024/11/images/device-status-on-ff.png b/nuxt/public/blog/2024/11/images/device-status-on-ff.png similarity index 100% rename from src/blog/2024/11/images/device-status-on-ff.png rename to nuxt/public/blog/2024/11/images/device-status-on-ff.png diff --git a/src/blog/2024/11/images/docker-ps-result.png b/nuxt/public/blog/2024/11/images/docker-ps-result.png similarity index 100% rename from src/blog/2024/11/images/docker-ps-result.png rename to nuxt/public/blog/2024/11/images/docker-ps-result.png diff --git a/src/blog/2024/11/images/edit-layout-button.png b/nuxt/public/blog/2024/11/images/edit-layout-button.png similarity index 100% rename from src/blog/2024/11/images/edit-layout-button.png rename to nuxt/public/blog/2024/11/images/edit-layout-button.png diff --git a/src/blog/2024/11/images/esp32-mqtt-node-red.png b/nuxt/public/blog/2024/11/images/esp32-mqtt-node-red.png similarity index 100% rename from src/blog/2024/11/images/esp32-mqtt-node-red.png rename to nuxt/public/blog/2024/11/images/esp32-mqtt-node-red.png diff --git a/src/blog/2024/11/images/esp32-with-node-red.png b/nuxt/public/blog/2024/11/images/esp32-with-node-red.png similarity index 100% rename from src/blog/2024/11/images/esp32-with-node-red.png rename to nuxt/public/blog/2024/11/images/esp32-with-node-red.png diff --git a/src/blog/2024/11/images/esp32.webp b/nuxt/public/blog/2024/11/images/esp32.webp similarity index 100% rename from src/blog/2024/11/images/esp32.webp rename to nuxt/public/blog/2024/11/images/esp32.webp diff --git a/src/blog/2024/11/images/flowfuse-as-service-on-mac.png b/nuxt/public/blog/2024/11/images/flowfuse-as-service-on-mac.png similarity index 100% rename from src/blog/2024/11/images/flowfuse-as-service-on-mac.png rename to nuxt/public/blog/2024/11/images/flowfuse-as-service-on-mac.png diff --git a/src/blog/2024/11/images/flowfuse-dashboard.png b/nuxt/public/blog/2024/11/images/flowfuse-dashboard.png similarity index 100% rename from src/blog/2024/11/images/flowfuse-dashboard.png rename to nuxt/public/blog/2024/11/images/flowfuse-dashboard.png diff --git a/src/blog/2024/11/images/function-node.png b/nuxt/public/blog/2024/11/images/function-node.png similarity index 100% rename from src/blog/2024/11/images/function-node.png rename to nuxt/public/blog/2024/11/images/function-node.png diff --git a/src/blog/2024/11/images/hub.png b/nuxt/public/blog/2024/11/images/hub.png similarity index 100% rename from src/blog/2024/11/images/hub.png rename to nuxt/public/blog/2024/11/images/hub.png diff --git a/src/blog/2024/11/images/isa-95-equipement-model.png b/nuxt/public/blog/2024/11/images/isa-95-equipement-model.png similarity index 100% rename from src/blog/2024/11/images/isa-95-equipement-model.png rename to nuxt/public/blog/2024/11/images/isa-95-equipement-model.png diff --git a/src/blog/2024/11/images/migrating-from-self-managed-nr-to-flowfuse-managed-nr.png b/nuxt/public/blog/2024/11/images/migrating-from-self-managed-nr-to-flowfuse-managed-nr.png similarity index 100% rename from src/blog/2024/11/images/migrating-from-self-managed-nr-to-flowfuse-managed-nr.png rename to nuxt/public/blog/2024/11/images/migrating-from-self-managed-nr-to-flowfuse-managed-nr.png diff --git a/src/blog/2024/11/images/mqtt-broker-config-security.png b/nuxt/public/blog/2024/11/images/mqtt-broker-config-security.png similarity index 100% rename from src/blog/2024/11/images/mqtt-broker-config-security.png rename to nuxt/public/blog/2024/11/images/mqtt-broker-config-security.png diff --git a/src/blog/2024/11/images/mqtt-broker-node-config.png b/nuxt/public/blog/2024/11/images/mqtt-broker-node-config.png similarity index 100% rename from src/blog/2024/11/images/mqtt-broker-node-config.png rename to nuxt/public/blog/2024/11/images/mqtt-broker-node-config.png diff --git a/src/blog/2024/11/images/mqtt-client-create.png b/nuxt/public/blog/2024/11/images/mqtt-client-create.png similarity index 100% rename from src/blog/2024/11/images/mqtt-client-create.png rename to nuxt/public/blog/2024/11/images/mqtt-client-create.png diff --git a/src/blog/2024/11/images/mqtt-common-pitfalls.png b/nuxt/public/blog/2024/11/images/mqtt-common-pitfalls.png similarity index 100% rename from src/blog/2024/11/images/mqtt-common-pitfalls.png rename to nuxt/public/blog/2024/11/images/mqtt-common-pitfalls.png diff --git a/src/blog/2024/11/images/mqtt-out-node-config.png b/nuxt/public/blog/2024/11/images/mqtt-out-node-config.png similarity index 100% rename from src/blog/2024/11/images/mqtt-out-node-config.png rename to nuxt/public/blog/2024/11/images/mqtt-out-node-config.png diff --git a/src/blog/2024/11/images/nr-in-uns.png b/nuxt/public/blog/2024/11/images/nr-in-uns.png similarity index 100% rename from src/blog/2024/11/images/nr-in-uns.png rename to nuxt/public/blog/2024/11/images/nr-in-uns.png diff --git a/src/blog/2024/11/images/p2p.png b/nuxt/public/blog/2024/11/images/p2p.png similarity index 100% rename from src/blog/2024/11/images/p2p.png rename to nuxt/public/blog/2024/11/images/p2p.png diff --git a/src/blog/2024/11/images/pixelcut-export-4.png b/nuxt/public/blog/2024/11/images/pixelcut-export-4.png similarity index 100% rename from src/blog/2024/11/images/pixelcut-export-4.png rename to nuxt/public/blog/2024/11/images/pixelcut-export-4.png diff --git a/src/blog/2024/11/images/pub-sub.png b/nuxt/public/blog/2024/11/images/pub-sub.png similarity index 100% rename from src/blog/2024/11/images/pub-sub.png rename to nuxt/public/blog/2024/11/images/pub-sub.png diff --git a/src/blog/2024/11/images/publishing-modbus-data-to-uns-using-ff.png b/nuxt/public/blog/2024/11/images/publishing-modbus-data-to-uns-using-ff.png similarity index 100% rename from src/blog/2024/11/images/publishing-modbus-data-to-uns-using-ff.png rename to nuxt/public/blog/2024/11/images/publishing-modbus-data-to-uns-using-ff.png diff --git a/src/blog/2024/11/images/screenshot-mqtt-hierarchy.png b/nuxt/public/blog/2024/11/images/screenshot-mqtt-hierarchy.png similarity index 100% rename from src/blog/2024/11/images/screenshot-mqtt-hierarchy.png rename to nuxt/public/blog/2024/11/images/screenshot-mqtt-hierarchy.png diff --git a/src/blog/2024/11/images/screenshot-search.png b/nuxt/public/blog/2024/11/images/screenshot-search.png similarity index 100% rename from src/blog/2024/11/images/screenshot-search.png rename to nuxt/public/blog/2024/11/images/screenshot-search.png diff --git a/src/blog/2024/11/images/screenshot-sidebar.png b/nuxt/public/blog/2024/11/images/screenshot-sidebar.png similarity index 100% rename from src/blog/2024/11/images/screenshot-sidebar.png rename to nuxt/public/blog/2024/11/images/screenshot-sidebar.png diff --git a/src/blog/2024/11/images/serial-monitor.png b/nuxt/public/blog/2024/11/images/serial-monitor.png similarity index 100% rename from src/blog/2024/11/images/serial-monitor.png rename to nuxt/public/blog/2024/11/images/serial-monitor.png diff --git a/src/blog/2024/11/images/spacer-example.png b/nuxt/public/blog/2024/11/images/spacer-example.png similarity index 100% rename from src/blog/2024/11/images/spacer-example.png rename to nuxt/public/blog/2024/11/images/spacer-example.png diff --git a/src/blog/2024/11/images/the-death-of-point-to-point.png b/nuxt/public/blog/2024/11/images/the-death-of-point-to-point.png similarity index 100% rename from src/blog/2024/11/images/the-death-of-point-to-point.png rename to nuxt/public/blog/2024/11/images/the-death-of-point-to-point.png diff --git a/src/blog/2024/11/images/tile-release-2-11.png b/nuxt/public/blog/2024/11/images/tile-release-2-11.png similarity index 100% rename from src/blog/2024/11/images/tile-release-2-11.png rename to nuxt/public/blog/2024/11/images/tile-release-2-11.png diff --git a/src/blog/2024/11/images/topic-hierarchy.png b/nuxt/public/blog/2024/11/images/topic-hierarchy.png similarity index 100% rename from src/blog/2024/11/images/topic-hierarchy.png rename to nuxt/public/blog/2024/11/images/topic-hierarchy.png diff --git a/src/blog/2024/11/images/uns.png b/nuxt/public/blog/2024/11/images/uns.png similarity index 100% rename from src/blog/2024/11/images/uns.png rename to nuxt/public/blog/2024/11/images/uns.png diff --git a/src/blog/2024/11/images/why-uns-needs-pub-sub.png b/nuxt/public/blog/2024/11/images/why-uns-needs-pub-sub.png similarity index 100% rename from src/blog/2024/11/images/why-uns-needs-pub-sub.png rename to nuxt/public/blog/2024/11/images/why-uns-needs-pub-sub.png diff --git a/src/blog/2024/11/images/wysiwyg-demo.webm b/nuxt/public/blog/2024/11/images/wysiwyg-demo.webm similarity index 100% rename from src/blog/2024/11/images/wysiwyg-demo.webm rename to nuxt/public/blog/2024/11/images/wysiwyg-demo.webm diff --git a/src/blog/2024/12/images/application-audit-logs.jpeg b/nuxt/public/blog/2024/12/images/application-audit-logs.jpeg similarity index 100% rename from src/blog/2024/12/images/application-audit-logs.jpeg rename to nuxt/public/blog/2024/12/images/application-audit-logs.jpeg diff --git a/src/blog/2024/12/images/application-wise-instance-organization.jpeg b/nuxt/public/blog/2024/12/images/application-wise-instance-organization.jpeg similarity index 100% rename from src/blog/2024/12/images/application-wise-instance-organization.jpeg rename to nuxt/public/blog/2024/12/images/application-wise-instance-organization.jpeg diff --git a/src/blog/2024/12/images/bridging-modbus-data-to-mqtt.png b/nuxt/public/blog/2024/12/images/bridging-modbus-data-to-mqtt.png similarity index 100% rename from src/blog/2024/12/images/bridging-modbus-data-to-mqtt.png rename to nuxt/public/blog/2024/12/images/bridging-modbus-data-to-mqtt.png diff --git a/src/blog/2024/12/images/data-modeling-uns.png b/nuxt/public/blog/2024/12/images/data-modeling-uns.png similarity index 100% rename from src/blog/2024/12/images/data-modeling-uns.png rename to nuxt/public/blog/2024/12/images/data-modeling-uns.png diff --git a/src/blog/2024/12/images/edge-devices.jpeg b/nuxt/public/blog/2024/12/images/edge-devices.jpeg similarity index 100% rename from src/blog/2024/12/images/edge-devices.jpeg rename to nuxt/public/blog/2024/12/images/edge-devices.jpeg diff --git a/src/blog/2024/12/images/flowfuse-mqtt-topic-hierarchy-monitoring.png b/nuxt/public/blog/2024/12/images/flowfuse-mqtt-topic-hierarchy-monitoring.png similarity index 100% rename from src/blog/2024/12/images/flowfuse-mqtt-topic-hierarchy-monitoring.png rename to nuxt/public/blog/2024/12/images/flowfuse-mqtt-topic-hierarchy-monitoring.png diff --git a/src/blog/2024/12/images/flowfuse-team-collaboration.png b/nuxt/public/blog/2024/12/images/flowfuse-team-collaboration.png similarity index 100% rename from src/blog/2024/12/images/flowfuse-team-collaboration.png rename to nuxt/public/blog/2024/12/images/flowfuse-team-collaboration.png diff --git a/src/blog/2024/12/images/how-to-bridge-modbus-to-mqtt.png b/nuxt/public/blog/2024/12/images/how-to-bridge-modbus-to-mqtt.png similarity index 100% rename from src/blog/2024/12/images/how-to-bridge-modbus-to-mqtt.png rename to nuxt/public/blog/2024/12/images/how-to-bridge-modbus-to-mqtt.png diff --git a/src/blog/2024/12/images/humidity-data-transformation.png b/nuxt/public/blog/2024/12/images/humidity-data-transformation.png similarity index 100% rename from src/blog/2024/12/images/humidity-data-transformation.png rename to nuxt/public/blog/2024/12/images/humidity-data-transformation.png diff --git a/src/blog/2024/12/images/inviting-member-to-team.jpeg b/nuxt/public/blog/2024/12/images/inviting-member-to-team.jpeg similarity index 100% rename from src/blog/2024/12/images/inviting-member-to-team.jpeg rename to nuxt/public/blog/2024/12/images/inviting-member-to-team.jpeg diff --git a/src/blog/2024/12/images/list-of-instances.jpeg b/nuxt/public/blog/2024/12/images/list-of-instances.jpeg similarity index 100% rename from src/blog/2024/12/images/list-of-instances.jpeg rename to nuxt/public/blog/2024/12/images/list-of-instances.jpeg diff --git a/src/blog/2024/12/images/modbus-connection-config.png b/nuxt/public/blog/2024/12/images/modbus-connection-config.png similarity index 100% rename from src/blog/2024/12/images/modbus-connection-config.png rename to nuxt/public/blog/2024/12/images/modbus-connection-config.png diff --git a/src/blog/2024/12/images/modbus-connection-configuration.png b/nuxt/public/blog/2024/12/images/modbus-connection-configuration.png similarity index 100% rename from src/blog/2024/12/images/modbus-connection-configuration.png rename to nuxt/public/blog/2024/12/images/modbus-connection-configuration.png diff --git a/src/blog/2024/12/images/modsim.png b/nuxt/public/blog/2024/12/images/modsim.png similarity index 100% rename from src/blog/2024/12/images/modsim.png rename to nuxt/public/blog/2024/12/images/modsim.png diff --git a/src/blog/2024/12/images/mqtt-broker-config-node.png b/nuxt/public/blog/2024/12/images/mqtt-broker-config-node.png similarity index 100% rename from src/blog/2024/12/images/mqtt-broker-config-node.png rename to nuxt/public/blog/2024/12/images/mqtt-broker-config-node.png diff --git a/src/blog/2024/12/images/mqtt-client-config-temperature.png b/nuxt/public/blog/2024/12/images/mqtt-client-config-temperature.png similarity index 100% rename from src/blog/2024/12/images/mqtt-client-config-temperature.png rename to nuxt/public/blog/2024/12/images/mqtt-client-config-temperature.png diff --git a/src/blog/2024/12/images/multiplayer-flowfuse.jpeg b/nuxt/public/blog/2024/12/images/multiplayer-flowfuse.jpeg similarity index 100% rename from src/blog/2024/12/images/multiplayer-flowfuse.jpeg rename to nuxt/public/blog/2024/12/images/multiplayer-flowfuse.jpeg diff --git a/src/blog/2024/12/images/onboarding-device-registration.png b/nuxt/public/blog/2024/12/images/onboarding-device-registration.png similarity index 100% rename from src/blog/2024/12/images/onboarding-device-registration.png rename to nuxt/public/blog/2024/12/images/onboarding-device-registration.png diff --git a/src/blog/2024/12/images/onboarding-new-application.png b/nuxt/public/blog/2024/12/images/onboarding-new-application.png similarity index 100% rename from src/blog/2024/12/images/onboarding-new-application.png rename to nuxt/public/blog/2024/12/images/onboarding-new-application.png diff --git a/src/blog/2024/12/images/onboarding-team-type.png b/nuxt/public/blog/2024/12/images/onboarding-team-type.png similarity index 100% rename from src/blog/2024/12/images/onboarding-team-type.png rename to nuxt/public/blog/2024/12/images/onboarding-team-type.png diff --git a/src/blog/2024/12/images/pressure-data-transformation.png b/nuxt/public/blog/2024/12/images/pressure-data-transformation.png similarity index 100% rename from src/blog/2024/12/images/pressure-data-transformation.png rename to nuxt/public/blog/2024/12/images/pressure-data-transformation.png diff --git a/src/blog/2024/12/images/shared-lib-import.jpeg b/nuxt/public/blog/2024/12/images/shared-lib-import.jpeg similarity index 100% rename from src/blog/2024/12/images/shared-lib-import.jpeg rename to nuxt/public/blog/2024/12/images/shared-lib-import.jpeg diff --git a/src/blog/2024/12/images/team-members-list.jpeg b/nuxt/public/blog/2024/12/images/team-members-list.jpeg similarity index 100% rename from src/blog/2024/12/images/team-members-list.jpeg rename to nuxt/public/blog/2024/12/images/team-members-list.jpeg diff --git a/src/blog/2024/12/images/temperature-data-tranformation.png b/nuxt/public/blog/2024/12/images/temperature-data-tranformation.png similarity index 100% rename from src/blog/2024/12/images/temperature-data-tranformation.png rename to nuxt/public/blog/2024/12/images/temperature-data-tranformation.png diff --git a/src/blog/2024/12/images/tile-release-2-12.png b/nuxt/public/blog/2024/12/images/tile-release-2-12.png similarity index 100% rename from src/blog/2024/12/images/tile-release-2-12.png rename to nuxt/public/blog/2024/12/images/tile-release-2-12.png diff --git a/src/blog/2024/12/images/version-history-snapshots.jpeg b/nuxt/public/blog/2024/12/images/version-history-snapshots.jpeg similarity index 100% rename from src/blog/2024/12/images/version-history-snapshots.jpeg rename to nuxt/public/blog/2024/12/images/version-history-snapshots.jpeg diff --git a/src/blog/2024/12/images/version-history-timeline.jpeg b/nuxt/public/blog/2024/12/images/version-history-timeline.jpeg similarity index 100% rename from src/blog/2024/12/images/version-history-timeline.jpeg rename to nuxt/public/blog/2024/12/images/version-history-timeline.jpeg diff --git a/src/blog/2024/12/images/vibration-data-transformation.png b/nuxt/public/blog/2024/12/images/vibration-data-transformation.png similarity index 100% rename from src/blog/2024/12/images/vibration-data-transformation.png rename to nuxt/public/blog/2024/12/images/vibration-data-transformation.png diff --git a/src/blog/2025/01/images/adding-variables.png b/nuxt/public/blog/2025/01/images/adding-variables.png similarity index 100% rename from src/blog/2025/01/images/adding-variables.png rename to nuxt/public/blog/2025/01/images/adding-variables.png diff --git a/src/blog/2025/01/images/allow-put-get-communication.png b/nuxt/public/blog/2025/01/images/allow-put-get-communication.png similarity index 100% rename from src/blog/2025/01/images/allow-put-get-communication.png rename to nuxt/public/blog/2025/01/images/allow-put-get-communication.png diff --git a/src/blog/2025/01/images/choosing-iot-device-mangement-platform.png b/nuxt/public/blog/2025/01/images/choosing-iot-device-mangement-platform.png similarity index 100% rename from src/blog/2025/01/images/choosing-iot-device-mangement-platform.png rename to nuxt/public/blog/2025/01/images/choosing-iot-device-mangement-platform.png diff --git a/src/blog/2025/01/images/components-of-uns.jpeg b/nuxt/public/blog/2025/01/images/components-of-uns.jpeg similarity index 100% rename from src/blog/2025/01/images/components-of-uns.jpeg rename to nuxt/public/blog/2025/01/images/components-of-uns.jpeg diff --git a/src/blog/2025/01/images/configuring-s7-in-node.png b/nuxt/public/blog/2025/01/images/configuring-s7-in-node.png similarity index 100% rename from src/blog/2025/01/images/configuring-s7-in-node.png rename to nuxt/public/blog/2025/01/images/configuring-s7-in-node.png diff --git a/src/blog/2025/01/images/configuring-s7-out-node.png b/nuxt/public/blog/2025/01/images/configuring-s7-out-node.png similarity index 100% rename from src/blog/2025/01/images/configuring-s7-out-node.png rename to nuxt/public/blog/2025/01/images/configuring-s7-out-node.png diff --git a/src/blog/2025/01/images/custom-function-storing-bits-in-word.png b/nuxt/public/blog/2025/01/images/custom-function-storing-bits-in-word.png similarity index 100% rename from src/blog/2025/01/images/custom-function-storing-bits-in-word.png rename to nuxt/public/blog/2025/01/images/custom-function-storing-bits-in-word.png diff --git a/src/blog/2025/01/images/design-topic-structer-cta-1.png b/nuxt/public/blog/2025/01/images/design-topic-structer-cta-1.png similarity index 100% rename from src/blog/2025/01/images/design-topic-structer-cta-1.png rename to nuxt/public/blog/2025/01/images/design-topic-structer-cta-1.png diff --git a/src/blog/2025/01/images/error.png b/nuxt/public/blog/2025/01/images/error.png similarity index 100% rename from src/blog/2025/01/images/error.png rename to nuxt/public/blog/2025/01/images/error.png diff --git a/src/blog/2025/01/images/flowfuse-hierarchy.jpg b/nuxt/public/blog/2025/01/images/flowfuse-hierarchy.jpg similarity index 100% rename from src/blog/2025/01/images/flowfuse-hierarchy.jpg rename to nuxt/public/blog/2025/01/images/flowfuse-hierarchy.jpg diff --git a/src/blog/2025/01/images/flowfuse-mqtt-topic-hierarchy-monitoring.png b/nuxt/public/blog/2025/01/images/flowfuse-mqtt-topic-hierarchy-monitoring.png similarity index 100% rename from src/blog/2025/01/images/flowfuse-mqtt-topic-hierarchy-monitoring.png rename to nuxt/public/blog/2025/01/images/flowfuse-mqtt-topic-hierarchy-monitoring.png diff --git a/src/blog/2025/01/images/flowfuse-team-groups.png b/nuxt/public/blog/2025/01/images/flowfuse-team-groups.png similarity index 100% rename from src/blog/2025/01/images/flowfuse-team-groups.png rename to nuxt/public/blog/2025/01/images/flowfuse-team-groups.png diff --git a/src/blog/2025/01/images/flowfuse-topic-schema.png b/nuxt/public/blog/2025/01/images/flowfuse-topic-schema.png similarity index 100% rename from src/blog/2025/01/images/flowfuse-topic-schema.png rename to nuxt/public/blog/2025/01/images/flowfuse-topic-schema.png diff --git a/src/blog/2025/01/images/free-tier-tour.png b/nuxt/public/blog/2025/01/images/free-tier-tour.png similarity index 100% rename from src/blog/2025/01/images/free-tier-tour.png rename to nuxt/public/blog/2025/01/images/free-tier-tour.png diff --git a/src/blog/2025/01/images/isa-95-equipement-model.png b/nuxt/public/blog/2025/01/images/isa-95-equipement-model.png similarity index 100% rename from src/blog/2025/01/images/isa-95-equipement-model.png rename to nuxt/public/blog/2025/01/images/isa-95-equipement-model.png diff --git a/src/blog/2025/01/images/ladder-program-to-control-lights.png b/nuxt/public/blog/2025/01/images/ladder-program-to-control-lights.png similarity index 100% rename from src/blog/2025/01/images/ladder-program-to-control-lights.png rename to nuxt/public/blog/2025/01/images/ladder-program-to-control-lights.png diff --git a/src/blog/2025/01/images/ladder-to-control-lights.png b/nuxt/public/blog/2025/01/images/ladder-to-control-lights.png similarity index 100% rename from src/blog/2025/01/images/ladder-to-control-lights.png rename to nuxt/public/blog/2025/01/images/ladder-to-control-lights.png diff --git a/src/blog/2025/01/images/mqtt-compatiblity.png b/nuxt/public/blog/2025/01/images/mqtt-compatiblity.png similarity index 100% rename from src/blog/2025/01/images/mqtt-compatiblity.png rename to nuxt/public/blog/2025/01/images/mqtt-compatiblity.png diff --git a/src/blog/2025/01/images/mqtt-for-uns-1.png b/nuxt/public/blog/2025/01/images/mqtt-for-uns-1.png similarity index 100% rename from src/blog/2025/01/images/mqtt-for-uns-1.png rename to nuxt/public/blog/2025/01/images/mqtt-for-uns-1.png diff --git a/src/blog/2025/01/images/mqtt-for-uns-2.png b/nuxt/public/blog/2025/01/images/mqtt-for-uns-2.png similarity index 100% rename from src/blog/2025/01/images/mqtt-for-uns-2.png rename to nuxt/public/blog/2025/01/images/mqtt-for-uns-2.png diff --git a/src/blog/2025/01/images/mqtt-packate-size.png b/nuxt/public/blog/2025/01/images/mqtt-packate-size.png similarity index 100% rename from src/blog/2025/01/images/mqtt-packate-size.png rename to nuxt/public/blog/2025/01/images/mqtt-packate-size.png diff --git a/src/blog/2025/01/images/optimized-block-access.png b/nuxt/public/blog/2025/01/images/optimized-block-access.png similarity index 100% rename from src/blog/2025/01/images/optimized-block-access.png rename to nuxt/public/blog/2025/01/images/optimized-block-access.png diff --git a/src/blog/2025/01/images/picking-broker-cta-1.png b/nuxt/public/blog/2025/01/images/picking-broker-cta-1.png similarity index 100% rename from src/blog/2025/01/images/picking-broker-cta-1.png rename to nuxt/public/blog/2025/01/images/picking-broker-cta-1.png diff --git a/src/blog/2025/01/images/providing-full-access-to-plc.png b/nuxt/public/blog/2025/01/images/providing-full-access-to-plc.png similarity index 100% rename from src/blog/2025/01/images/providing-full-access-to-plc.png rename to nuxt/public/blog/2025/01/images/providing-full-access-to-plc.png diff --git a/src/blog/2025/01/images/release-2-13.png b/nuxt/public/blog/2025/01/images/release-2-13.png similarity index 100% rename from src/blog/2025/01/images/release-2-13.png rename to nuxt/public/blog/2025/01/images/release-2-13.png diff --git a/src/blog/2025/01/images/s7-config-variables.png b/nuxt/public/blog/2025/01/images/s7-config-variables.png similarity index 100% rename from src/blog/2025/01/images/s7-config-variables.png rename to nuxt/public/blog/2025/01/images/s7-config-variables.png diff --git a/src/blog/2025/01/images/s7-connection-configuration.png b/nuxt/public/blog/2025/01/images/s7-connection-configuration.png similarity index 100% rename from src/blog/2025/01/images/s7-connection-configuration.png rename to nuxt/public/blog/2025/01/images/s7-connection-configuration.png diff --git a/src/blog/2025/01/images/s7-with-node-red.png b/nuxt/public/blog/2025/01/images/s7-with-node-red.png similarity index 100% rename from src/blog/2025/01/images/s7-with-node-red.png rename to nuxt/public/blog/2025/01/images/s7-with-node-red.png diff --git a/src/blog/2025/01/images/showing-rack-and-slot.png b/nuxt/public/blog/2025/01/images/showing-rack-and-slot.png similarity index 100% rename from src/blog/2025/01/images/showing-rack-and-slot.png rename to nuxt/public/blog/2025/01/images/showing-rack-and-slot.png diff --git a/src/blog/2025/01/images/uns-topic-structer.png b/nuxt/public/blog/2025/01/images/uns-topic-structer.png similarity index 100% rename from src/blog/2025/01/images/uns-topic-structer.png rename to nuxt/public/blog/2025/01/images/uns-topic-structer.png diff --git a/src/blog/2025/01/images/why-flowfuse-is-complete-toolkit-for-uns.jpeg b/nuxt/public/blog/2025/01/images/why-flowfuse-is-complete-toolkit-for-uns.jpeg similarity index 100% rename from src/blog/2025/01/images/why-flowfuse-is-complete-toolkit-for-uns.jpeg rename to nuxt/public/blog/2025/01/images/why-flowfuse-is-complete-toolkit-for-uns.jpeg diff --git a/src/blog/2025/02/images/academy-announcement.png b/nuxt/public/blog/2025/02/images/academy-announcement.png similarity index 100% rename from src/blog/2025/02/images/academy-announcement.png rename to nuxt/public/blog/2025/02/images/academy-announcement.png diff --git a/src/blog/2025/02/images/academy-home-page.png b/nuxt/public/blog/2025/02/images/academy-home-page.png similarity index 100% rename from src/blog/2025/02/images/academy-home-page.png rename to nuxt/public/blog/2025/02/images/academy-home-page.png diff --git a/src/blog/2025/02/images/academy-screenshot.png b/nuxt/public/blog/2025/02/images/academy-screenshot.png similarity index 100% rename from src/blog/2025/02/images/academy-screenshot.png rename to nuxt/public/blog/2025/02/images/academy-screenshot.png diff --git a/src/blog/2025/02/images/add-pipeline-button.png b/nuxt/public/blog/2025/02/images/add-pipeline-button.png similarity index 100% rename from src/blog/2025/02/images/add-pipeline-button.png rename to nuxt/public/blog/2025/02/images/add-pipeline-button.png diff --git a/src/blog/2025/02/images/adding-stage-button.png b/nuxt/public/blog/2025/02/images/adding-stage-button.png similarity index 100% rename from src/blog/2025/02/images/adding-stage-button.png rename to nuxt/public/blog/2025/02/images/adding-stage-button.png diff --git a/src/blog/2025/02/images/arduino-with-node-red.png b/nuxt/public/blog/2025/02/images/arduino-with-node-red.png similarity index 100% rename from src/blog/2025/02/images/arduino-with-node-red.png rename to nuxt/public/blog/2025/02/images/arduino-with-node-red.png diff --git a/src/blog/2025/02/images/combine-object.png b/nuxt/public/blog/2025/02/images/combine-object.png similarity index 100% rename from src/blog/2025/02/images/combine-object.png rename to nuxt/public/blog/2025/02/images/combine-object.png diff --git a/src/blog/2025/02/images/control-led.png b/nuxt/public/blog/2025/02/images/control-led.png similarity index 100% rename from src/blog/2025/02/images/control-led.png rename to nuxt/public/blog/2025/02/images/control-led.png diff --git a/src/blog/2025/02/images/cpu-usage.png b/nuxt/public/blog/2025/02/images/cpu-usage.png similarity index 100% rename from src/blog/2025/02/images/cpu-usage.png rename to nuxt/public/blog/2025/02/images/cpu-usage.png diff --git a/src/blog/2025/02/images/create-snapshot.png b/nuxt/public/blog/2025/02/images/create-snapshot.png similarity index 100% rename from src/blog/2025/02/images/create-snapshot.png rename to nuxt/public/blog/2025/02/images/create-snapshot.png diff --git a/src/blog/2025/02/images/dashboard-monitoring-device.png b/nuxt/public/blog/2025/02/images/dashboard-monitoring-device.png similarity index 100% rename from src/blog/2025/02/images/dashboard-monitoring-device.png rename to nuxt/public/blog/2025/02/images/dashboard-monitoring-device.png diff --git a/src/blog/2025/02/images/device-group-create.png b/nuxt/public/blog/2025/02/images/device-group-create.png similarity index 100% rename from src/blog/2025/02/images/device-group-create.png rename to nuxt/public/blog/2025/02/images/device-group-create.png diff --git a/src/blog/2025/02/images/device-group-device-adding.png b/nuxt/public/blog/2025/02/images/device-group-device-adding.png similarity index 100% rename from src/blog/2025/02/images/device-group-device-adding.png rename to nuxt/public/blog/2025/02/images/device-group-device-adding.png diff --git a/src/blog/2025/02/images/device-group-form-create.png b/nuxt/public/blog/2025/02/images/device-group-form-create.png similarity index 100% rename from src/blog/2025/02/images/device-group-form-create.png rename to nuxt/public/blog/2025/02/images/device-group-form-create.png diff --git a/src/blog/2025/02/images/device-group-with-added-device.png b/nuxt/public/blog/2025/02/images/device-group-with-added-device.png similarity index 100% rename from src/blog/2025/02/images/device-group-with-added-device.png rename to nuxt/public/blog/2025/02/images/device-group-with-added-device.png diff --git a/src/blog/2025/02/images/edit-device-group.png b/nuxt/public/blog/2025/02/images/edit-device-group.png similarity index 100% rename from src/blog/2025/02/images/edit-device-group.png rename to nuxt/public/blog/2025/02/images/edit-device-group.png diff --git a/src/blog/2025/02/images/env.png b/nuxt/public/blog/2025/02/images/env.png similarity index 100% rename from src/blog/2025/02/images/env.png rename to nuxt/public/blog/2025/02/images/env.png diff --git a/src/blog/2025/02/images/firmata-import.png b/nuxt/public/blog/2025/02/images/firmata-import.png similarity index 100% rename from src/blog/2025/02/images/firmata-import.png rename to nuxt/public/blog/2025/02/images/firmata-import.png diff --git a/src/blog/2025/02/images/fleet-mode.png b/nuxt/public/blog/2025/02/images/fleet-mode.png similarity index 100% rename from src/blog/2025/02/images/fleet-mode.png rename to nuxt/public/blog/2025/02/images/fleet-mode.png diff --git a/src/blog/2025/02/images/load-avg.png b/nuxt/public/blog/2025/02/images/load-avg.png similarity index 100% rename from src/blog/2025/02/images/load-avg.png rename to nuxt/public/blog/2025/02/images/load-avg.png diff --git a/src/blog/2025/02/images/memory-usage.png b/nuxt/public/blog/2025/02/images/memory-usage.png similarity index 100% rename from src/blog/2025/02/images/memory-usage.png rename to nuxt/public/blog/2025/02/images/memory-usage.png diff --git a/src/blog/2025/02/images/monitoring-device-health-and-performance-at-scale.png b/nuxt/public/blog/2025/02/images/monitoring-device-health-and-performance-at-scale.png similarity index 100% rename from src/blog/2025/02/images/monitoring-device-health-and-performance-at-scale.png rename to nuxt/public/blog/2025/02/images/monitoring-device-health-and-performance-at-scale.png diff --git a/src/blog/2025/02/images/option-add-device-group.png b/nuxt/public/blog/2025/02/images/option-add-device-group.png similarity index 100% rename from src/blog/2025/02/images/option-add-device-group.png rename to nuxt/public/blog/2025/02/images/option-add-device-group.png diff --git a/src/blog/2025/02/images/pipeline-creation-form.png b/nuxt/public/blog/2025/02/images/pipeline-creation-form.png similarity index 100% rename from src/blog/2025/02/images/pipeline-creation-form.png rename to nuxt/public/blog/2025/02/images/pipeline-creation-form.png diff --git a/src/blog/2025/02/images/pipeline-runn.png b/nuxt/public/blog/2025/02/images/pipeline-runn.png similarity index 100% rename from src/blog/2025/02/images/pipeline-runn.png rename to nuxt/public/blog/2025/02/images/pipeline-runn.png diff --git a/src/blog/2025/02/images/production-with-deviec-group.png b/nuxt/public/blog/2025/02/images/production-with-deviec-group.png similarity index 100% rename from src/blog/2025/02/images/production-with-deviec-group.png rename to nuxt/public/blog/2025/02/images/production-with-deviec-group.png diff --git a/src/blog/2025/02/images/read-sensor-data.png b/nuxt/public/blog/2025/02/images/read-sensor-data.png similarity index 100% rename from src/blog/2025/02/images/read-sensor-data.png rename to nuxt/public/blog/2025/02/images/read-sensor-data.png diff --git a/src/blog/2025/02/images/release-2-14.png b/nuxt/public/blog/2025/02/images/release-2-14.png similarity index 100% rename from src/blog/2025/02/images/release-2-14.png rename to nuxt/public/blog/2025/02/images/release-2-14.png diff --git a/src/blog/2025/02/images/rpi-stage.png b/nuxt/public/blog/2025/02/images/rpi-stage.png similarity index 100% rename from src/blog/2025/02/images/rpi-stage.png rename to nuxt/public/blog/2025/02/images/rpi-stage.png diff --git a/src/blog/2025/02/images/save-changes-to-add-devices.png b/nuxt/public/blog/2025/02/images/save-changes-to-add-devices.png similarity index 100% rename from src/blog/2025/02/images/save-changes-to-add-devices.png rename to nuxt/public/blog/2025/02/images/save-changes-to-add-devices.png diff --git a/src/blog/2025/02/images/screenshot-timeline.png b/nuxt/public/blog/2025/02/images/screenshot-timeline.png similarity index 100% rename from src/blog/2025/02/images/screenshot-timeline.png rename to nuxt/public/blog/2025/02/images/screenshot-timeline.png diff --git a/src/blog/2025/02/images/screenshot-topic-docs.png b/nuxt/public/blog/2025/02/images/screenshot-topic-docs.png similarity index 100% rename from src/blog/2025/02/images/screenshot-topic-docs.png rename to nuxt/public/blog/2025/02/images/screenshot-topic-docs.png diff --git a/src/blog/2025/02/images/screenshot-topic-hierarchy.png b/nuxt/public/blog/2025/02/images/screenshot-topic-hierarchy.png similarity index 100% rename from src/blog/2025/02/images/screenshot-topic-hierarchy.png rename to nuxt/public/blog/2025/02/images/screenshot-topic-hierarchy.png diff --git a/src/blog/2025/02/images/serial-port-config.png b/nuxt/public/blog/2025/02/images/serial-port-config.png similarity index 100% rename from src/blog/2025/02/images/serial-port-config.png rename to nuxt/public/blog/2025/02/images/serial-port-config.png diff --git a/src/blog/2025/02/images/set-active-snapshot.png b/nuxt/public/blog/2025/02/images/set-active-snapshot.png similarity index 100% rename from src/blog/2025/02/images/set-active-snapshot.png rename to nuxt/public/blog/2025/02/images/set-active-snapshot.png diff --git a/src/blog/2025/02/images/switch.png b/nuxt/public/blog/2025/02/images/switch.png similarity index 100% rename from src/blog/2025/02/images/switch.png rename to nuxt/public/blog/2025/02/images/switch.png diff --git a/src/blog/2025/02/images/uptime.png b/nuxt/public/blog/2025/02/images/uptime.png similarity index 100% rename from src/blog/2025/02/images/uptime.png rename to nuxt/public/blog/2025/02/images/uptime.png diff --git a/src/blog/2025/03/images/CHANGE-NODE-1.png b/nuxt/public/blog/2025/03/images/CHANGE-NODE-1.png similarity index 100% rename from src/blog/2025/03/images/CHANGE-NODE-1.png rename to nuxt/public/blog/2025/03/images/CHANGE-NODE-1.png diff --git a/src/blog/2025/03/images/CHANGE-NODE-TOPIC-1.png b/nuxt/public/blog/2025/03/images/CHANGE-NODE-TOPIC-1.png similarity index 100% rename from src/blog/2025/03/images/CHANGE-NODE-TOPIC-1.png rename to nuxt/public/blog/2025/03/images/CHANGE-NODE-TOPIC-1.png diff --git a/src/blog/2025/03/images/CHANGE-NODE.png b/nuxt/public/blog/2025/03/images/CHANGE-NODE.png similarity index 100% rename from src/blog/2025/03/images/CHANGE-NODE.png rename to nuxt/public/blog/2025/03/images/CHANGE-NODE.png diff --git a/src/blog/2025/03/images/devops-pipeline.png b/nuxt/public/blog/2025/03/images/devops-pipeline.png similarity index 100% rename from src/blog/2025/03/images/devops-pipeline.png rename to nuxt/public/blog/2025/03/images/devops-pipeline.png diff --git a/src/blog/2025/03/images/env-settings.png b/nuxt/public/blog/2025/03/images/env-settings.png similarity index 100% rename from src/blog/2025/03/images/env-settings.png rename to nuxt/public/blog/2025/03/images/env-settings.png diff --git a/src/blog/2025/03/images/env-vars-blur.png b/nuxt/public/blog/2025/03/images/env-vars-blur.png similarity index 100% rename from src/blog/2025/03/images/env-vars-blur.png rename to nuxt/public/blog/2025/03/images/env-vars-blur.png diff --git a/src/blog/2025/03/images/managing-connections-scale-cta-1.png b/nuxt/public/blog/2025/03/images/managing-connections-scale-cta-1.png similarity index 100% rename from src/blog/2025/03/images/managing-connections-scale-cta-1.png rename to nuxt/public/blog/2025/03/images/managing-connections-scale-cta-1.png diff --git a/src/blog/2025/03/images/mqtt-broker-monitoring.png b/nuxt/public/blog/2025/03/images/mqtt-broker-monitoring.png similarity index 100% rename from src/blog/2025/03/images/mqtt-broker-monitoring.png rename to nuxt/public/blog/2025/03/images/mqtt-broker-monitoring.png diff --git a/src/blog/2025/03/images/mqtt-broker-out-config.png b/nuxt/public/blog/2025/03/images/mqtt-broker-out-config.png similarity index 100% rename from src/blog/2025/03/images/mqtt-broker-out-config.png rename to nuxt/public/blog/2025/03/images/mqtt-broker-out-config.png diff --git a/src/blog/2025/03/images/mqtt-config-with-env.png b/nuxt/public/blog/2025/03/images/mqtt-config-with-env.png similarity index 100% rename from src/blog/2025/03/images/mqtt-config-with-env.png rename to nuxt/public/blog/2025/03/images/mqtt-config-with-env.png diff --git a/src/blog/2025/03/images/mqtt-node-security-config.png b/nuxt/public/blog/2025/03/images/mqtt-node-security-config.png similarity index 100% rename from src/blog/2025/03/images/mqtt-node-security-config.png rename to nuxt/public/blog/2025/03/images/mqtt-node-security-config.png diff --git a/src/blog/2025/03/images/release-2-15.png b/nuxt/public/blog/2025/03/images/release-2-15.png similarity index 100% rename from src/blog/2025/03/images/release-2-15.png rename to nuxt/public/blog/2025/03/images/release-2-15.png diff --git a/src/blog/2025/03/images/scaling-mqtt-connections.png b/nuxt/public/blog/2025/03/images/scaling-mqtt-connections.png similarity index 100% rename from src/blog/2025/03/images/scaling-mqtt-connections.png rename to nuxt/public/blog/2025/03/images/scaling-mqtt-connections.png diff --git a/src/blog/2025/03/images/screenshot-custon-catalog.png b/nuxt/public/blog/2025/03/images/screenshot-custon-catalog.png similarity index 100% rename from src/blog/2025/03/images/screenshot-custon-catalog.png rename to nuxt/public/blog/2025/03/images/screenshot-custon-catalog.png diff --git a/src/blog/2025/03/images/screenshot-user-role.png b/nuxt/public/blog/2025/03/images/screenshot-user-role.png similarity index 100% rename from src/blog/2025/03/images/screenshot-user-role.png rename to nuxt/public/blog/2025/03/images/screenshot-user-role.png diff --git a/src/blog/2025/04/images/browse-logs.png b/nuxt/public/blog/2025/04/images/browse-logs.png similarity index 100% rename from src/blog/2025/04/images/browse-logs.png rename to nuxt/public/blog/2025/04/images/browse-logs.png diff --git a/src/blog/2025/04/images/building-oee-dashboard-part1.png b/nuxt/public/blog/2025/04/images/building-oee-dashboard-part1.png similarity index 100% rename from src/blog/2025/04/images/building-oee-dashboard-part1.png rename to nuxt/public/blog/2025/04/images/building-oee-dashboard-part1.png diff --git a/src/blog/2025/04/images/calculate-oee-and-key-metrics.png b/nuxt/public/blog/2025/04/images/calculate-oee-and-key-metrics.png similarity index 100% rename from src/blog/2025/04/images/calculate-oee-and-key-metrics.png rename to nuxt/public/blog/2025/04/images/calculate-oee-and-key-metrics.png diff --git a/src/blog/2025/04/images/color-picking.png b/nuxt/public/blog/2025/04/images/color-picking.png similarity index 100% rename from src/blog/2025/04/images/color-picking.png rename to nuxt/public/blog/2025/04/images/color-picking.png diff --git a/src/blog/2025/04/images/configuration-flow.png b/nuxt/public/blog/2025/04/images/configuration-flow.png similarity index 100% rename from src/blog/2025/04/images/configuration-flow.png rename to nuxt/public/blog/2025/04/images/configuration-flow.png diff --git a/src/blog/2025/04/images/demo-data-props.png b/nuxt/public/blog/2025/04/images/demo-data-props.png similarity index 100% rename from src/blog/2025/04/images/demo-data-props.png rename to nuxt/public/blog/2025/04/images/demo-data-props.png diff --git a/src/blog/2025/04/images/downtime-events-summery-oee-machine-wise.png b/nuxt/public/blog/2025/04/images/downtime-events-summery-oee-machine-wise.png similarity index 100% rename from src/blog/2025/04/images/downtime-events-summery-oee-machine-wise.png rename to nuxt/public/blog/2025/04/images/downtime-events-summery-oee-machine-wise.png diff --git a/src/blog/2025/04/images/git-pipeline-stage.png b/nuxt/public/blog/2025/04/images/git-pipeline-stage.png similarity index 100% rename from src/blog/2025/04/images/git-pipeline-stage.png rename to nuxt/public/blog/2025/04/images/git-pipeline-stage.png diff --git a/src/blog/2025/04/images/oee-dashboard-1.png b/nuxt/public/blog/2025/04/images/oee-dashboard-1.png similarity index 100% rename from src/blog/2025/04/images/oee-dashboard-1.png rename to nuxt/public/blog/2025/04/images/oee-dashboard-1.png diff --git a/src/blog/2025/04/images/oee-dashboard-2.png b/nuxt/public/blog/2025/04/images/oee-dashboard-2.png similarity index 100% rename from src/blog/2025/04/images/oee-dashboard-2.png rename to nuxt/public/blog/2025/04/images/oee-dashboard-2.png diff --git a/src/blog/2025/04/images/oee-dashboard-breaked-layout.png b/nuxt/public/blog/2025/04/images/oee-dashboard-breaked-layout.png similarity index 100% rename from src/blog/2025/04/images/oee-dashboard-breaked-layout.png rename to nuxt/public/blog/2025/04/images/oee-dashboard-breaked-layout.png diff --git a/src/blog/2025/04/images/oee-dashboard-buildig-ff-2.png b/nuxt/public/blog/2025/04/images/oee-dashboard-buildig-ff-2.png similarity index 100% rename from src/blog/2025/04/images/oee-dashboard-buildig-ff-2.png rename to nuxt/public/blog/2025/04/images/oee-dashboard-buildig-ff-2.png diff --git a/src/blog/2025/04/images/oee-dashboard-building-3.png b/nuxt/public/blog/2025/04/images/oee-dashboard-building-3.png similarity index 100% rename from src/blog/2025/04/images/oee-dashboard-building-3.png rename to nuxt/public/blog/2025/04/images/oee-dashboard-building-3.png diff --git a/src/blog/2025/04/images/oee-dashboard-tablet.png b/nuxt/public/blog/2025/04/images/oee-dashboard-tablet.png similarity index 100% rename from src/blog/2025/04/images/oee-dashboard-tablet.png rename to nuxt/public/blog/2025/04/images/oee-dashboard-tablet.png diff --git a/src/blog/2025/04/images/oee-dashboard-with-proper-styling.png b/nuxt/public/blog/2025/04/images/oee-dashboard-with-proper-styling.png similarity index 100% rename from src/blog/2025/04/images/oee-dashboard-with-proper-styling.png rename to nuxt/public/blog/2025/04/images/oee-dashboard-with-proper-styling.png diff --git a/src/blog/2025/04/images/oee-dashboard-with-styling-2.png b/nuxt/public/blog/2025/04/images/oee-dashboard-with-styling-2.png similarity index 100% rename from src/blog/2025/04/images/oee-dashboard-with-styling-2.png rename to nuxt/public/blog/2025/04/images/oee-dashboard-with-styling-2.png diff --git a/src/blog/2025/04/images/oee-dashboard-without-style-2.png b/nuxt/public/blog/2025/04/images/oee-dashboard-without-style-2.png similarity index 100% rename from src/blog/2025/04/images/oee-dashboard-without-style-2.png rename to nuxt/public/blog/2025/04/images/oee-dashboard-without-style-2.png diff --git a/src/blog/2025/04/images/oee-dashboard-without-style.png b/nuxt/public/blog/2025/04/images/oee-dashboard-without-style.png similarity index 100% rename from src/blog/2025/04/images/oee-dashboard-without-style.png rename to nuxt/public/blog/2025/04/images/oee-dashboard-without-style.png diff --git a/src/blog/2025/04/images/oee-dashboard.png b/nuxt/public/blog/2025/04/images/oee-dashboard.png similarity index 100% rename from src/blog/2025/04/images/oee-dashboard.png rename to nuxt/public/blog/2025/04/images/oee-dashboard.png diff --git a/src/blog/2025/04/images/oee-tablet.png b/nuxt/public/blog/2025/04/images/oee-tablet.png similarity index 100% rename from src/blog/2025/04/images/oee-tablet.png rename to nuxt/public/blog/2025/04/images/oee-tablet.png diff --git a/src/blog/2025/04/images/oee-trend.png b/nuxt/public/blog/2025/04/images/oee-trend.png similarity index 100% rename from src/blog/2025/04/images/oee-trend.png rename to nuxt/public/blog/2025/04/images/oee-trend.png diff --git a/src/blog/2025/04/images/preparing-data-flow.png b/nuxt/public/blog/2025/04/images/preparing-data-flow.png similarity index 100% rename from src/blog/2025/04/images/preparing-data-flow.png rename to nuxt/public/blog/2025/04/images/preparing-data-flow.png diff --git a/src/blog/2025/04/images/release-2-16.png b/nuxt/public/blog/2025/04/images/release-2-16.png similarity index 100% rename from src/blog/2025/04/images/release-2-16.png rename to nuxt/public/blog/2025/04/images/release-2-16.png diff --git a/src/blog/2025/04/images/sqlite-flow.png b/nuxt/public/blog/2025/04/images/sqlite-flow.png similarity index 100% rename from src/blog/2025/04/images/sqlite-flow.png rename to nuxt/public/blog/2025/04/images/sqlite-flow.png diff --git a/src/blog/2025/04/images/table-incosistency.png b/nuxt/public/blog/2025/04/images/table-incosistency.png similarity index 100% rename from src/blog/2025/04/images/table-incosistency.png rename to nuxt/public/blog/2025/04/images/table-incosistency.png diff --git a/src/blog/2025/05/images/Building-an-Andon-Task-Manager-with-FlowFuse-1.png b/nuxt/public/blog/2025/05/images/Building-an-Andon-Task-Manager-with-FlowFuse-1.png similarity index 100% rename from src/blog/2025/05/images/Building-an-Andon-Task-Manager-with-FlowFuse-1.png rename to nuxt/public/blog/2025/05/images/Building-an-Andon-Task-Manager-with-FlowFuse-1.png diff --git a/src/blog/2025/05/images/admin-view-andon.png b/nuxt/public/blog/2025/05/images/admin-view-andon.png similarity index 100% rename from src/blog/2025/05/images/admin-view-andon.png rename to nuxt/public/blog/2025/05/images/admin-view-andon.png diff --git a/src/blog/2025/05/images/allow-dashboard-embedding.png b/nuxt/public/blog/2025/05/images/allow-dashboard-embedding.png similarity index 100% rename from src/blog/2025/05/images/allow-dashboard-embedding.png rename to nuxt/public/blog/2025/05/images/allow-dashboard-embedding.png diff --git a/src/blog/2025/05/images/cron-node-red.png b/nuxt/public/blog/2025/05/images/cron-node-red.png similarity index 100% rename from src/blog/2025/05/images/cron-node-red.png rename to nuxt/public/blog/2025/05/images/cron-node-red.png diff --git a/src/blog/2025/05/images/cron_expression_syntax.png b/nuxt/public/blog/2025/05/images/cron_expression_syntax.png similarity index 100% rename from src/blog/2025/05/images/cron_expression_syntax.png rename to nuxt/public/blog/2025/05/images/cron_expression_syntax.png diff --git a/src/blog/2025/05/images/dashboard-admin-veiw.png b/nuxt/public/blog/2025/05/images/dashboard-admin-veiw.png similarity index 100% rename from src/blog/2025/05/images/dashboard-admin-veiw.png rename to nuxt/public/blog/2025/05/images/dashboard-admin-veiw.png diff --git a/src/blog/2025/05/images/dashboard-with-embedded-report.png b/nuxt/public/blog/2025/05/images/dashboard-with-embedded-report.png similarity index 100% rename from src/blog/2025/05/images/dashboard-with-embedded-report.png rename to nuxt/public/blog/2025/05/images/dashboard-with-embedded-report.png diff --git a/src/blog/2025/05/images/dashboard.png b/nuxt/public/blog/2025/05/images/dashboard.png similarity index 100% rename from src/blog/2025/05/images/dashboard.png rename to nuxt/public/blog/2025/05/images/dashboard.png diff --git a/src/blog/2025/05/images/department-menu.png b/nuxt/public/blog/2025/05/images/department-menu.png similarity index 100% rename from src/blog/2025/05/images/department-menu.png rename to nuxt/public/blog/2025/05/images/department-menu.png diff --git a/src/blog/2025/05/images/department-wise.png b/nuxt/public/blog/2025/05/images/department-wise.png similarity index 100% rename from src/blog/2025/05/images/department-wise.png rename to nuxt/public/blog/2025/05/images/department-wise.png diff --git a/src/blog/2025/05/images/device-reg-dynamic-form.webm b/nuxt/public/blog/2025/05/images/device-reg-dynamic-form.webm similarity index 100% rename from src/blog/2025/05/images/device-reg-dynamic-form.webm rename to nuxt/public/blog/2025/05/images/device-reg-dynamic-form.webm diff --git a/src/blog/2025/05/images/dynamic-schedules-list.webm b/nuxt/public/blog/2025/05/images/dynamic-schedules-list.webm similarity index 100% rename from src/blog/2025/05/images/dynamic-schedules-list.webm rename to nuxt/public/blog/2025/05/images/dynamic-schedules-list.webm diff --git a/src/blog/2025/05/images/easy-builder.webm b/nuxt/public/blog/2025/05/images/easy-builder.webm similarity index 100% rename from src/blog/2025/05/images/easy-builder.webm rename to nuxt/public/blog/2025/05/images/easy-builder.webm diff --git a/src/blog/2025/05/images/embedding-flowfuse-oee-dashboard.png b/nuxt/public/blog/2025/05/images/embedding-flowfuse-oee-dashboard.png similarity index 100% rename from src/blog/2025/05/images/embedding-flowfuse-oee-dashboard.png rename to nuxt/public/blog/2025/05/images/embedding-flowfuse-oee-dashboard.png diff --git a/src/blog/2025/05/images/emeding-webpage-on-flowfuse-dashboard.png b/nuxt/public/blog/2025/05/images/emeding-webpage-on-flowfuse-dashboard.png similarity index 100% rename from src/blog/2025/05/images/emeding-webpage-on-flowfuse-dashboard.png rename to nuxt/public/blog/2025/05/images/emeding-webpage-on-flowfuse-dashboard.png diff --git a/src/blog/2025/05/images/example-pdf.png b/nuxt/public/blog/2025/05/images/example-pdf.png similarity index 100% rename from src/blog/2025/05/images/example-pdf.png rename to nuxt/public/blog/2025/05/images/example-pdf.png diff --git a/src/blog/2025/05/images/google-calendar.png b/nuxt/public/blog/2025/05/images/google-calendar.png similarity index 100% rename from src/blog/2025/05/images/google-calendar.png rename to nuxt/public/blog/2025/05/images/google-calendar.png diff --git a/src/blog/2025/05/images/google-map.png b/nuxt/public/blog/2025/05/images/google-map.png similarity index 100% rename from src/blog/2025/05/images/google-map.png rename to nuxt/public/blog/2025/05/images/google-map.png diff --git a/src/blog/2025/05/images/how-to-generate-pdf-with-nr-and-ff.png b/nuxt/public/blog/2025/05/images/how-to-generate-pdf-with-nr-and-ff.png similarity index 100% rename from src/blog/2025/05/images/how-to-generate-pdf-with-nr-and-ff.png rename to nuxt/public/blog/2025/05/images/how-to-generate-pdf-with-nr-and-ff.png diff --git a/src/blog/2025/05/images/if_frame-config.png b/nuxt/public/blog/2025/05/images/if_frame-config.png similarity index 100% rename from src/blog/2025/05/images/if_frame-config.png rename to nuxt/public/blog/2025/05/images/if_frame-config.png diff --git a/src/blog/2025/05/images/line-menu.png b/nuxt/public/blog/2025/05/images/line-menu.png similarity index 100% rename from src/blog/2025/05/images/line-menu.png rename to nuxt/public/blog/2025/05/images/line-menu.png diff --git a/src/blog/2025/05/images/line-page.png b/nuxt/public/blog/2025/05/images/line-page.png similarity index 100% rename from src/blog/2025/05/images/line-page.png rename to nuxt/public/blog/2025/05/images/line-page.png diff --git a/src/blog/2025/05/images/node-status-event.png b/nuxt/public/blog/2025/05/images/node-status-event.png similarity index 100% rename from src/blog/2025/05/images/node-status-event.png rename to nuxt/public/blog/2025/05/images/node-status-event.png diff --git a/src/blog/2025/05/images/pdf-flow.png b/nuxt/public/blog/2025/05/images/pdf-flow.png similarity index 100% rename from src/blog/2025/05/images/pdf-flow.png rename to nuxt/public/blog/2025/05/images/pdf-flow.png diff --git a/src/blog/2025/05/images/pdf.png b/nuxt/public/blog/2025/05/images/pdf.png similarity index 100% rename from src/blog/2025/05/images/pdf.png rename to nuxt/public/blog/2025/05/images/pdf.png diff --git a/src/blog/2025/05/images/release-2-17.png b/nuxt/public/blog/2025/05/images/release-2-17.png similarity index 100% rename from src/blog/2025/05/images/release-2-17.png rename to nuxt/public/blog/2025/05/images/release-2-17.png diff --git a/src/blog/2025/05/images/simple-form.png b/nuxt/public/blog/2025/05/images/simple-form.png similarity index 100% rename from src/blog/2025/05/images/simple-form.png rename to nuxt/public/blog/2025/05/images/simple-form.png diff --git a/src/blog/2025/05/images/timezone-selection.png b/nuxt/public/blog/2025/05/images/timezone-selection.png similarity index 100% rename from src/blog/2025/05/images/timezone-selection.png rename to nuxt/public/blog/2025/05/images/timezone-selection.png diff --git a/src/blog/2025/05/images/weather-widget.png b/nuxt/public/blog/2025/05/images/weather-widget.png similarity index 100% rename from src/blog/2025/05/images/weather-widget.png rename to nuxt/public/blog/2025/05/images/weather-widget.png diff --git a/src/blog/2025/05/images/weather-widget.webm b/nuxt/public/blog/2025/05/images/weather-widget.webm similarity index 100% rename from src/blog/2025/05/images/weather-widget.webm rename to nuxt/public/blog/2025/05/images/weather-widget.webm diff --git a/src/blog/2025/06/images/AI_preview.webm b/nuxt/public/blog/2025/06/images/AI_preview.webm similarity index 100% rename from src/blog/2025/06/images/AI_preview.webm rename to nuxt/public/blog/2025/06/images/AI_preview.webm diff --git a/src/blog/2025/06/images/Building-an-Andon-Task-Manager-with-FlowFuse-2.png b/nuxt/public/blog/2025/06/images/Building-an-Andon-Task-Manager-with-FlowFuse-2.png similarity index 100% rename from src/blog/2025/06/images/Building-an-Andon-Task-Manager-with-FlowFuse-2.png rename to nuxt/public/blog/2025/06/images/Building-an-Andon-Task-Manager-with-FlowFuse-2.png diff --git a/src/blog/2025/06/images/KPIs.png b/nuxt/public/blog/2025/06/images/KPIs.png similarity index 100% rename from src/blog/2025/06/images/KPIs.png rename to nuxt/public/blog/2025/06/images/KPIs.png diff --git a/src/blog/2025/06/images/SA-95-hierarchical-view-of-automation-infrastructures.png b/nuxt/public/blog/2025/06/images/SA-95-hierarchical-view-of-automation-infrastructures.png similarity index 100% rename from src/blog/2025/06/images/SA-95-hierarchical-view-of-automation-infrastructures.png rename to nuxt/public/blog/2025/06/images/SA-95-hierarchical-view-of-automation-infrastructures.png diff --git a/src/blog/2025/06/images/accessing-production-lines.png b/nuxt/public/blog/2025/06/images/accessing-production-lines.png similarity index 100% rename from src/blog/2025/06/images/accessing-production-lines.png rename to nuxt/public/blog/2025/06/images/accessing-production-lines.png diff --git a/src/blog/2025/06/images/add-request-update-button.png b/nuxt/public/blog/2025/06/images/add-request-update-button.png similarity index 100% rename from src/blog/2025/06/images/add-request-update-button.png rename to nuxt/public/blog/2025/06/images/add-request-update-button.png diff --git a/src/blog/2025/06/images/adding-form-element.webm b/nuxt/public/blog/2025/06/images/adding-form-element.webm similarity index 100% rename from src/blog/2025/06/images/adding-form-element.webm rename to nuxt/public/blog/2025/06/images/adding-form-element.webm diff --git a/src/blog/2025/06/images/building-forms-in-flowfuse.png b/nuxt/public/blog/2025/06/images/building-forms-in-flowfuse.png similarity index 100% rename from src/blog/2025/06/images/building-forms-in-flowfuse.png rename to nuxt/public/blog/2025/06/images/building-forms-in-flowfuse.png diff --git a/src/blog/2025/06/images/button-for-res-ack.png b/nuxt/public/blog/2025/06/images/button-for-res-ack.png similarity index 100% rename from src/blog/2025/06/images/button-for-res-ack.png rename to nuxt/public/blog/2025/06/images/button-for-res-ack.png diff --git a/src/blog/2025/06/images/client-data-configuration.png b/nuxt/public/blog/2025/06/images/client-data-configuration.png similarity index 100% rename from src/blog/2025/06/images/client-data-configuration.png rename to nuxt/public/blog/2025/06/images/client-data-configuration.png diff --git a/src/blog/2025/06/images/configuration-odoo.png b/nuxt/public/blog/2025/06/images/configuration-odoo.png similarity index 100% rename from src/blog/2025/06/images/configuration-odoo.png rename to nuxt/public/blog/2025/06/images/configuration-odoo.png diff --git a/src/blog/2025/06/images/connect-shopfloor-to-erp.png b/nuxt/public/blog/2025/06/images/connect-shopfloor-to-erp.png similarity index 100% rename from src/blog/2025/06/images/connect-shopfloor-to-erp.png rename to nuxt/public/blog/2025/06/images/connect-shopfloor-to-erp.png diff --git a/src/blog/2025/06/images/data-structering-and-storing-for-mes.png b/nuxt/public/blog/2025/06/images/data-structering-and-storing-for-mes.png similarity index 100% rename from src/blog/2025/06/images/data-structering-and-storing-for-mes.png rename to nuxt/public/blog/2025/06/images/data-structering-and-storing-for-mes.png diff --git a/src/blog/2025/06/images/downtime.png b/nuxt/public/blog/2025/06/images/downtime.png similarity index 100% rename from src/blog/2025/06/images/downtime.png rename to nuxt/public/blog/2025/06/images/downtime.png diff --git a/src/blog/2025/06/images/flowfuse-fundraising.png b/nuxt/public/blog/2025/06/images/flowfuse-fundraising.png similarity index 100% rename from src/blog/2025/06/images/flowfuse-fundraising.png rename to nuxt/public/blog/2025/06/images/flowfuse-fundraising.png diff --git a/src/blog/2025/06/images/highlighted-requst.png b/nuxt/public/blog/2025/06/images/highlighted-requst.png similarity index 100% rename from src/blog/2025/06/images/highlighted-requst.png rename to nuxt/public/blog/2025/06/images/highlighted-requst.png diff --git a/src/blog/2025/06/images/industrial-data-landscapes.png b/nuxt/public/blog/2025/06/images/industrial-data-landscapes.png similarity index 100% rename from src/blog/2025/06/images/industrial-data-landscapes.png rename to nuxt/public/blog/2025/06/images/industrial-data-landscapes.png diff --git a/src/blog/2025/06/images/invalid-data.png b/nuxt/public/blog/2025/06/images/invalid-data.png similarity index 100% rename from src/blog/2025/06/images/invalid-data.png rename to nuxt/public/blog/2025/06/images/invalid-data.png diff --git a/src/blog/2025/06/images/json-full-validator-node.png b/nuxt/public/blog/2025/06/images/json-full-validator-node.png similarity index 100% rename from src/blog/2025/06/images/json-full-validator-node.png rename to nuxt/public/blog/2025/06/images/json-full-validator-node.png diff --git a/src/blog/2025/06/images/lines-page-with-tittle-of-selected-line.png b/nuxt/public/blog/2025/06/images/lines-page-with-tittle-of-selected-line.png similarity index 100% rename from src/blog/2025/06/images/lines-page-with-tittle-of-selected-line.png rename to nuxt/public/blog/2025/06/images/lines-page-with-tittle-of-selected-line.png diff --git a/src/blog/2025/06/images/lines.png b/nuxt/public/blog/2025/06/images/lines.png similarity index 100% rename from src/blog/2025/06/images/lines.png rename to nuxt/public/blog/2025/06/images/lines.png diff --git a/src/blog/2025/06/images/low-code-powerhouse-for-industrial-data.png b/nuxt/public/blog/2025/06/images/low-code-powerhouse-for-industrial-data.png similarity index 100% rename from src/blog/2025/06/images/low-code-powerhouse-for-industrial-data.png rename to nuxt/public/blog/2025/06/images/low-code-powerhouse-for-industrial-data.png diff --git a/src/blog/2025/06/images/menu-for-lines-flow.png b/nuxt/public/blog/2025/06/images/menu-for-lines-flow.png similarity index 100% rename from src/blog/2025/06/images/menu-for-lines-flow.png rename to nuxt/public/blog/2025/06/images/menu-for-lines-flow.png diff --git a/src/blog/2025/06/images/menu-for-lines.png b/nuxt/public/blog/2025/06/images/menu-for-lines.png similarity index 100% rename from src/blog/2025/06/images/menu-for-lines.png rename to nuxt/public/blog/2025/06/images/menu-for-lines.png diff --git a/src/blog/2025/06/images/mes-blog-cta.png b/nuxt/public/blog/2025/06/images/mes-blog-cta.png similarity index 100% rename from src/blog/2025/06/images/mes-blog-cta.png rename to nuxt/public/blog/2025/06/images/mes-blog-cta.png diff --git a/src/blog/2025/06/images/mes-data-aqusition.png b/nuxt/public/blog/2025/06/images/mes-data-aqusition.png similarity index 100% rename from src/blog/2025/06/images/mes-data-aqusition.png rename to nuxt/public/blog/2025/06/images/mes-data-aqusition.png diff --git a/src/blog/2025/06/images/mes-diagram.png b/nuxt/public/blog/2025/06/images/mes-diagram.png similarity index 100% rename from src/blog/2025/06/images/mes-diagram.png rename to nuxt/public/blog/2025/06/images/mes-diagram.png diff --git a/src/blog/2025/06/images/mes-intro.png b/nuxt/public/blog/2025/06/images/mes-intro.png similarity index 100% rename from src/blog/2025/06/images/mes-intro.png rename to nuxt/public/blog/2025/06/images/mes-intro.png diff --git a/src/blog/2025/06/images/mes-kpi.png b/nuxt/public/blog/2025/06/images/mes-kpi.png similarity index 100% rename from src/blog/2025/06/images/mes-kpi.png rename to nuxt/public/blog/2025/06/images/mes-kpi.png diff --git a/src/blog/2025/06/images/node-red-con-2025.png b/nuxt/public/blog/2025/06/images/node-red-con-2025.png similarity index 100% rename from src/blog/2025/06/images/node-red-con-2025.png rename to nuxt/public/blog/2025/06/images/node-red-con-2025.png diff --git a/src/blog/2025/06/images/observability1.png b/nuxt/public/blog/2025/06/images/observability1.png similarity index 100% rename from src/blog/2025/06/images/observability1.png rename to nuxt/public/blog/2025/06/images/observability1.png diff --git a/src/blog/2025/06/images/oee-dashboard-flow.png b/nuxt/public/blog/2025/06/images/oee-dashboard-flow.png similarity index 100% rename from src/blog/2025/06/images/oee-dashboard-flow.png rename to nuxt/public/blog/2025/06/images/oee-dashboard-flow.png diff --git a/src/blog/2025/06/images/oee.png b/nuxt/public/blog/2025/06/images/oee.png similarity index 100% rename from src/blog/2025/06/images/oee.png rename to nuxt/public/blog/2025/06/images/oee.png diff --git a/src/blog/2025/06/images/params-change-node.png b/nuxt/public/blog/2025/06/images/params-change-node.png similarity index 100% rename from src/blog/2025/06/images/params-change-node.png rename to nuxt/public/blog/2025/06/images/params-change-node.png diff --git a/src/blog/2025/06/images/preparing-data.png b/nuxt/public/blog/2025/06/images/preparing-data.png similarity index 100% rename from src/blog/2025/06/images/preparing-data.png rename to nuxt/public/blog/2025/06/images/preparing-data.png diff --git a/src/blog/2025/06/images/recipe-update-form.webm b/nuxt/public/blog/2025/06/images/recipe-update-form.webm similarity index 100% rename from src/blog/2025/06/images/recipe-update-form.webm rename to nuxt/public/blog/2025/06/images/recipe-update-form.webm diff --git a/src/blog/2025/06/images/release-2-18.png b/nuxt/public/blog/2025/06/images/release-2-18.png similarity index 100% rename from src/blog/2025/06/images/release-2-18.png rename to nuxt/public/blog/2025/06/images/release-2-18.png diff --git a/src/blog/2025/06/images/render-data-in-table.png b/nuxt/public/blog/2025/06/images/render-data-in-table.png similarity index 100% rename from src/blog/2025/06/images/render-data-in-table.png rename to nuxt/public/blog/2025/06/images/render-data-in-table.png diff --git a/src/blog/2025/06/images/retrive-data.png b/nuxt/public/blog/2025/06/images/retrive-data.png similarity index 100% rename from src/blog/2025/06/images/retrive-data.png rename to nuxt/public/blog/2025/06/images/retrive-data.png diff --git a/src/blog/2025/06/images/sqlite-create-flow.png b/nuxt/public/blog/2025/06/images/sqlite-create-flow.png similarity index 100% rename from src/blog/2025/06/images/sqlite-create-flow.png rename to nuxt/public/blog/2025/06/images/sqlite-create-flow.png diff --git a/src/blog/2025/06/images/submit-form.png b/nuxt/public/blog/2025/06/images/submit-form.png similarity index 100% rename from src/blog/2025/06/images/submit-form.png rename to nuxt/public/blog/2025/06/images/submit-form.png diff --git a/src/blog/2025/06/images/submit-request-flow.png b/nuxt/public/blog/2025/06/images/submit-request-flow.png similarity index 100% rename from src/blog/2025/06/images/submit-request-flow.png rename to nuxt/public/blog/2025/06/images/submit-request-flow.png diff --git a/src/blog/2025/06/images/update-request-status.png b/nuxt/public/blog/2025/06/images/update-request-status.png similarity index 100% rename from src/blog/2025/06/images/update-request-status.png rename to nuxt/public/blog/2025/06/images/update-request-status.png diff --git a/src/blog/2025/06/images/valid-data-message.png b/nuxt/public/blog/2025/06/images/valid-data-message.png similarity index 100% rename from src/blog/2025/06/images/valid-data-message.png rename to nuxt/public/blog/2025/06/images/valid-data-message.png diff --git a/src/blog/2025/06/images/visual-alert-and-timestamp-formatting.png b/nuxt/public/blog/2025/06/images/visual-alert-and-timestamp-formatting.png similarity index 100% rename from src/blog/2025/06/images/visual-alert-and-timestamp-formatting.png rename to nuxt/public/blog/2025/06/images/visual-alert-and-timestamp-formatting.png diff --git a/src/blog/2025/06/images/what-is-mes.png b/nuxt/public/blog/2025/06/images/what-is-mes.png similarity index 100% rename from src/blog/2025/06/images/what-is-mes.png rename to nuxt/public/blog/2025/06/images/what-is-mes.png diff --git a/src/blog/2025/07/images/Memory.png b/nuxt/public/blog/2025/07/images/Memory.png similarity index 100% rename from src/blog/2025/07/images/Memory.png rename to nuxt/public/blog/2025/07/images/Memory.png diff --git a/src/blog/2025/07/images/ai-css.webm b/nuxt/public/blog/2025/07/images/ai-css.webm similarity index 100% rename from src/blog/2025/07/images/ai-css.webm rename to nuxt/public/blog/2025/07/images/ai-css.webm diff --git a/src/blog/2025/07/images/applications-redesign.png b/nuxt/public/blog/2025/07/images/applications-redesign.png similarity index 100% rename from src/blog/2025/07/images/applications-redesign.png rename to nuxt/public/blog/2025/07/images/applications-redesign.png diff --git a/src/blog/2025/07/images/assistant-0-3-0-flow-explainer-3tbNoRlb4T-1089.webm b/nuxt/public/blog/2025/07/images/assistant-0-3-0-flow-explainer-3tbNoRlb4T-1089.webm similarity index 100% rename from src/blog/2025/07/images/assistant-0-3-0-flow-explainer-3tbNoRlb4T-1089.webm rename to nuxt/public/blog/2025/07/images/assistant-0-3-0-flow-explainer-3tbNoRlb4T-1089.webm diff --git a/src/blog/2025/07/images/blueprint-import.png b/nuxt/public/blog/2025/07/images/blueprint-import.png similarity index 100% rename from src/blog/2025/07/images/blueprint-import.png rename to nuxt/public/blog/2025/07/images/blueprint-import.png diff --git a/src/blog/2025/07/images/certified-nodes-v2.png b/nuxt/public/blog/2025/07/images/certified-nodes-v2.png similarity index 100% rename from src/blog/2025/07/images/certified-nodes-v2.png rename to nuxt/public/blog/2025/07/images/certified-nodes-v2.png diff --git a/src/blog/2025/07/images/connect-serial-port-node-red-ff.png b/nuxt/public/blog/2025/07/images/connect-serial-port-node-red-ff.png similarity index 100% rename from src/blog/2025/07/images/connect-serial-port-node-red-ff.png rename to nuxt/public/blog/2025/07/images/connect-serial-port-node-red-ff.png diff --git a/src/blog/2025/07/images/css-ai.webm b/nuxt/public/blog/2025/07/images/css-ai.webm similarity index 100% rename from src/blog/2025/07/images/css-ai.webm rename to nuxt/public/blog/2025/07/images/css-ai.webm diff --git a/src/blog/2025/07/images/dashboard-ai.webm b/nuxt/public/blog/2025/07/images/dashboard-ai.webm similarity index 100% rename from src/blog/2025/07/images/dashboard-ai.webm rename to nuxt/public/blog/2025/07/images/dashboard-ai.webm diff --git a/src/blog/2025/07/images/debug-panel-output.png b/nuxt/public/blog/2025/07/images/debug-panel-output.png similarity index 100% rename from src/blog/2025/07/images/debug-panel-output.png rename to nuxt/public/blog/2025/07/images/debug-panel-output.png diff --git a/src/blog/2025/07/images/flow-expainer-ai.webm b/nuxt/public/blog/2025/07/images/flow-expainer-ai.webm similarity index 100% rename from src/blog/2025/07/images/flow-expainer-ai.webm rename to nuxt/public/blog/2025/07/images/flow-expainer-ai.webm diff --git a/src/blog/2025/07/images/flowfuse-ai.png b/nuxt/public/blog/2025/07/images/flowfuse-ai.png similarity index 100% rename from src/blog/2025/07/images/flowfuse-ai.png rename to nuxt/public/blog/2025/07/images/flowfuse-ai.png diff --git a/src/blog/2025/07/images/function-ai.webm b/nuxt/public/blog/2025/07/images/function-ai.webm similarity index 100% rename from src/blog/2025/07/images/function-ai.webm rename to nuxt/public/blog/2025/07/images/function-ai.webm diff --git a/src/blog/2025/07/images/homepage.png b/nuxt/public/blog/2025/07/images/homepage.png similarity index 100% rename from src/blog/2025/07/images/homepage.png rename to nuxt/public/blog/2025/07/images/homepage.png diff --git a/src/blog/2025/07/images/how-we-built-smart-order-manufacturing-system.png b/nuxt/public/blog/2025/07/images/how-we-built-smart-order-manufacturing-system.png similarity index 100% rename from src/blog/2025/07/images/how-we-built-smart-order-manufacturing-system.png rename to nuxt/public/blog/2025/07/images/how-we-built-smart-order-manufacturing-system.png diff --git a/src/blog/2025/07/images/input-output-serial-node.png b/nuxt/public/blog/2025/07/images/input-output-serial-node.png similarity index 100% rename from src/blog/2025/07/images/input-output-serial-node.png rename to nuxt/public/blog/2025/07/images/input-output-serial-node.png diff --git a/src/blog/2025/07/images/json-ai.webm b/nuxt/public/blog/2025/07/images/json-ai.webm similarity index 100% rename from src/blog/2025/07/images/json-ai.webm rename to nuxt/public/blog/2025/07/images/json-ai.webm diff --git a/src/blog/2025/07/images/list-of-available-tags.png b/nuxt/public/blog/2025/07/images/list-of-available-tags.png similarity index 100% rename from src/blog/2025/07/images/list-of-available-tags.png rename to nuxt/public/blog/2025/07/images/list-of-available-tags.png diff --git a/src/blog/2025/07/images/modifed-nodes-deploy.png b/nuxt/public/blog/2025/07/images/modifed-nodes-deploy.png similarity index 100% rename from src/blog/2025/07/images/modifed-nodes-deploy.png rename to nuxt/public/blog/2025/07/images/modifed-nodes-deploy.png diff --git a/src/blog/2025/07/images/opcua-browser.png b/nuxt/public/blog/2025/07/images/opcua-browser.png similarity index 100% rename from src/blog/2025/07/images/opcua-browser.png rename to nuxt/public/blog/2025/07/images/opcua-browser.png diff --git a/src/blog/2025/07/images/opcua-client-read-node.png b/nuxt/public/blog/2025/07/images/opcua-client-read-node.png similarity index 100% rename from src/blog/2025/07/images/opcua-client-read-node.png rename to nuxt/public/blog/2025/07/images/opcua-client-read-node.png diff --git a/src/blog/2025/07/images/opcua-client-write-multiple.png b/nuxt/public/blog/2025/07/images/opcua-client-write-multiple.png similarity index 100% rename from src/blog/2025/07/images/opcua-client-write-multiple.png rename to nuxt/public/blog/2025/07/images/opcua-client-write-multiple.png diff --git a/src/blog/2025/07/images/opcua-client-write-ops.png b/nuxt/public/blog/2025/07/images/opcua-client-write-ops.png similarity index 100% rename from src/blog/2025/07/images/opcua-client-write-ops.png rename to nuxt/public/blog/2025/07/images/opcua-client-write-ops.png diff --git a/src/blog/2025/07/images/opcua-client.png b/nuxt/public/blog/2025/07/images/opcua-client.png similarity index 100% rename from src/blog/2025/07/images/opcua-client.png rename to nuxt/public/blog/2025/07/images/opcua-client.png diff --git a/src/blog/2025/07/images/opcua-endpoint-config.png b/nuxt/public/blog/2025/07/images/opcua-endpoint-config.png similarity index 100% rename from src/blog/2025/07/images/opcua-endpoint-config.png rename to nuxt/public/blog/2025/07/images/opcua-endpoint-config.png diff --git a/src/blog/2025/07/images/opcua-item-node-write.png b/nuxt/public/blog/2025/07/images/opcua-item-node-write.png similarity index 100% rename from src/blog/2025/07/images/opcua-item-node-write.png rename to nuxt/public/blog/2025/07/images/opcua-item-node-write.png diff --git a/src/blog/2025/07/images/opcua-item-node.png b/nuxt/public/blog/2025/07/images/opcua-item-node.png similarity index 100% rename from src/blog/2025/07/images/opcua-item-node.png rename to nuxt/public/blog/2025/07/images/opcua-item-node.png diff --git a/src/blog/2025/07/images/opcua-tutorial.png b/nuxt/public/blog/2025/07/images/opcua-tutorial.png similarity index 100% rename from src/blog/2025/07/images/opcua-tutorial.png rename to nuxt/public/blog/2025/07/images/opcua-tutorial.png diff --git a/src/blog/2025/07/images/read-multiple.png b/nuxt/public/blog/2025/07/images/read-multiple.png similarity index 100% rename from src/blog/2025/07/images/read-multiple.png rename to nuxt/public/blog/2025/07/images/read-multiple.png diff --git a/src/blog/2025/07/images/release-2-19.png b/nuxt/public/blog/2025/07/images/release-2-19.png similarity index 100% rename from src/blog/2025/07/images/release-2-19.png rename to nuxt/public/blog/2025/07/images/release-2-19.png diff --git a/src/blog/2025/07/images/release-2-20.png b/nuxt/public/blog/2025/07/images/release-2-20.png similarity index 100% rename from src/blog/2025/07/images/release-2-20.png rename to nuxt/public/blog/2025/07/images/release-2-20.png diff --git a/src/blog/2025/07/images/searching-path.webm b/nuxt/public/blog/2025/07/images/searching-path.webm similarity index 100% rename from src/blog/2025/07/images/searching-path.webm rename to nuxt/public/blog/2025/07/images/searching-path.webm diff --git a/src/blog/2025/07/images/serial-port-node-status.png b/nuxt/public/blog/2025/07/images/serial-port-node-status.png similarity index 100% rename from src/blog/2025/07/images/serial-port-node-status.png rename to nuxt/public/blog/2025/07/images/serial-port-node-status.png diff --git a/src/blog/2025/07/images/serial-port.jpg b/nuxt/public/blog/2025/07/images/serial-port.jpg similarity index 100% rename from src/blog/2025/07/images/serial-port.jpg rename to nuxt/public/blog/2025/07/images/serial-port.jpg diff --git a/src/blog/2025/07/images/simulated-drift-alert.webm b/nuxt/public/blog/2025/07/images/simulated-drift-alert.webm similarity index 100% rename from src/blog/2025/07/images/simulated-drift-alert.webm rename to nuxt/public/blog/2025/07/images/simulated-drift-alert.webm diff --git a/src/blog/2025/07/images/smart-suggestion.webm b/nuxt/public/blog/2025/07/images/smart-suggestion.webm similarity index 100% rename from src/blog/2025/07/images/smart-suggestion.webm rename to nuxt/public/blog/2025/07/images/smart-suggestion.webm diff --git a/src/blog/2025/07/images/social-sign-on.png b/nuxt/public/blog/2025/07/images/social-sign-on.png similarity index 100% rename from src/blog/2025/07/images/social-sign-on.png rename to nuxt/public/blog/2025/07/images/social-sign-on.png diff --git a/src/blog/2025/07/images/spc-chart.png b/nuxt/public/blog/2025/07/images/spc-chart.png similarity index 100% rename from src/blog/2025/07/images/spc-chart.png rename to nuxt/public/blog/2025/07/images/spc-chart.png diff --git a/src/blog/2025/07/images/spc-cta-1.png b/nuxt/public/blog/2025/07/images/spc-cta-1.png similarity index 100% rename from src/blog/2025/07/images/spc-cta-1.png rename to nuxt/public/blog/2025/07/images/spc-cta-1.png diff --git a/src/blog/2025/07/images/spc-cta-2.png b/nuxt/public/blog/2025/07/images/spc-cta-2.png similarity index 100% rename from src/blog/2025/07/images/spc-cta-2.png rename to nuxt/public/blog/2025/07/images/spc-cta-2.png diff --git a/src/blog/2025/07/images/spc-flowfuse.png b/nuxt/public/blog/2025/07/images/spc-flowfuse.png similarity index 100% rename from src/blog/2025/07/images/spc-flowfuse.png rename to nuxt/public/blog/2025/07/images/spc-flowfuse.png diff --git a/src/blog/2025/07/images/spc-out-control.png b/nuxt/public/blog/2025/07/images/spc-out-control.png similarity index 100% rename from src/blog/2025/07/images/spc-out-control.png rename to nuxt/public/blog/2025/07/images/spc-out-control.png diff --git a/src/blog/2025/07/images/spc-visual-alert.png b/nuxt/public/blog/2025/07/images/spc-visual-alert.png similarity index 100% rename from src/blog/2025/07/images/spc-visual-alert.png rename to nuxt/public/blog/2025/07/images/spc-visual-alert.png diff --git a/src/blog/2025/07/images/spc-visual-alert2.png b/nuxt/public/blog/2025/07/images/spc-visual-alert2.png similarity index 100% rename from src/blog/2025/07/images/spc-visual-alert2.png rename to nuxt/public/blog/2025/07/images/spc-visual-alert2.png diff --git a/src/blog/2025/07/images/spc.png b/nuxt/public/blog/2025/07/images/spc.png similarity index 100% rename from src/blog/2025/07/images/spc.png rename to nuxt/public/blog/2025/07/images/spc.png diff --git a/src/blog/2025/07/images/tables-query-node.png b/nuxt/public/blog/2025/07/images/tables-query-node.png similarity index 100% rename from src/blog/2025/07/images/tables-query-node.png rename to nuxt/public/blog/2025/07/images/tables-query-node.png diff --git a/src/blog/2025/07/images/tables-ui-screenshot.png b/nuxt/public/blog/2025/07/images/tables-ui-screenshot.png similarity index 100% rename from src/blog/2025/07/images/tables-ui-screenshot.png rename to nuxt/public/blog/2025/07/images/tables-ui-screenshot.png diff --git a/src/blog/2025/08/images/advanced-opcua-real-time-subscriptions-alarms-historical-data.png b/nuxt/public/blog/2025/08/images/advanced-opcua-real-time-subscriptions-alarms-historical-data.png similarity index 100% rename from src/blog/2025/08/images/advanced-opcua-real-time-subscriptions-alarms-historical-data.png rename to nuxt/public/blog/2025/08/images/advanced-opcua-real-time-subscriptions-alarms-historical-data.png diff --git a/src/blog/2025/08/images/annual-billing.png b/nuxt/public/blog/2025/08/images/annual-billing.png similarity index 100% rename from src/blog/2025/08/images/annual-billing.png rename to nuxt/public/blog/2025/08/images/annual-billing.png diff --git a/src/blog/2025/08/images/copy-token.png b/nuxt/public/blog/2025/08/images/copy-token.png similarity index 100% rename from src/blog/2025/08/images/copy-token.png rename to nuxt/public/blog/2025/08/images/copy-token.png diff --git a/src/blog/2025/08/images/create-table.png b/nuxt/public/blog/2025/08/images/create-table.png similarity index 100% rename from src/blog/2025/08/images/create-table.png rename to nuxt/public/blog/2025/08/images/create-table.png diff --git a/src/blog/2025/08/images/energy-monitoring.png b/nuxt/public/blog/2025/08/images/energy-monitoring.png similarity index 100% rename from src/blog/2025/08/images/energy-monitoring.png rename to nuxt/public/blog/2025/08/images/energy-monitoring.png diff --git a/src/blog/2025/08/images/flowfuse-api.png b/nuxt/public/blog/2025/08/images/flowfuse-api.png similarity index 100% rename from src/blog/2025/08/images/flowfuse-api.png rename to nuxt/public/blog/2025/08/images/flowfuse-api.png diff --git a/src/blog/2025/08/images/flowfuse-database.png b/nuxt/public/blog/2025/08/images/flowfuse-database.png similarity index 100% rename from src/blog/2025/08/images/flowfuse-database.png rename to nuxt/public/blog/2025/08/images/flowfuse-database.png diff --git a/src/blog/2025/08/images/flowfuse-swagger-api-docs.webm b/nuxt/public/blog/2025/08/images/flowfuse-swagger-api-docs.webm similarity index 100% rename from src/blog/2025/08/images/flowfuse-swagger-api-docs.webm rename to nuxt/public/blog/2025/08/images/flowfuse-swagger-api-docs.webm diff --git a/src/blog/2025/08/images/form-time-range-selector.png b/nuxt/public/blog/2025/08/images/form-time-range-selector.png similarity index 100% rename from src/blog/2025/08/images/form-time-range-selector.png rename to nuxt/public/blog/2025/08/images/form-time-range-selector.png diff --git a/src/blog/2025/08/images/form-widget.png b/nuxt/public/blog/2025/08/images/form-widget.png similarity index 100% rename from src/blog/2025/08/images/form-widget.png rename to nuxt/public/blog/2025/08/images/form-widget.png diff --git a/src/blog/2025/08/images/historical-data-dashboard.png b/nuxt/public/blog/2025/08/images/historical-data-dashboard.png similarity index 100% rename from src/blog/2025/08/images/historical-data-dashboard.png rename to nuxt/public/blog/2025/08/images/historical-data-dashboard.png diff --git a/src/blog/2025/08/images/historical-data-dashboard.webm b/nuxt/public/blog/2025/08/images/historical-data-dashboard.webm similarity index 100% rename from src/blog/2025/08/images/historical-data-dashboard.webm rename to nuxt/public/blog/2025/08/images/historical-data-dashboard.webm diff --git a/src/blog/2025/08/images/moment.png b/nuxt/public/blog/2025/08/images/moment.png similarity index 100% rename from src/blog/2025/08/images/moment.png rename to nuxt/public/blog/2025/08/images/moment.png diff --git a/src/blog/2025/08/images/open-source-software-and-manufacturing.png b/nuxt/public/blog/2025/08/images/open-source-software-and-manufacturing.png similarity index 100% rename from src/blog/2025/08/images/open-source-software-and-manufacturing.png rename to nuxt/public/blog/2025/08/images/open-source-software-and-manufacturing.png diff --git a/src/blog/2025/08/images/pareto-chart-image.png b/nuxt/public/blog/2025/08/images/pareto-chart-image.png similarity index 100% rename from src/blog/2025/08/images/pareto-chart-image.png rename to nuxt/public/blog/2025/08/images/pareto-chart-image.png diff --git a/src/blog/2025/08/images/pareto-chart-manufacturing-guide.png b/nuxt/public/blog/2025/08/images/pareto-chart-manufacturing-guide.png similarity index 100% rename from src/blog/2025/08/images/pareto-chart-manufacturing-guide.png rename to nuxt/public/blog/2025/08/images/pareto-chart-manufacturing-guide.png diff --git a/src/blog/2025/08/images/query-node.png b/nuxt/public/blog/2025/08/images/query-node.png similarity index 100% rename from src/blog/2025/08/images/query-node.png rename to nuxt/public/blog/2025/08/images/query-node.png diff --git a/src/blog/2025/08/images/release-2.21.png b/nuxt/public/blog/2025/08/images/release-2.21.png similarity index 100% rename from src/blog/2025/08/images/release-2.21.png rename to nuxt/public/blog/2025/08/images/release-2.21.png diff --git a/src/blog/2025/08/images/remote.png b/nuxt/public/blog/2025/08/images/remote.png similarity index 100% rename from src/blog/2025/08/images/remote.png rename to nuxt/public/blog/2025/08/images/remote.png diff --git a/src/blog/2025/08/images/snapshot.png b/nuxt/public/blog/2025/08/images/snapshot.png similarity index 100% rename from src/blog/2025/08/images/snapshot.png rename to nuxt/public/blog/2025/08/images/snapshot.png diff --git a/src/blog/2025/08/images/tables-credentials.png b/nuxt/public/blog/2025/08/images/tables-credentials.png similarity index 100% rename from src/blog/2025/08/images/tables-credentials.png rename to nuxt/public/blog/2025/08/images/tables-credentials.png diff --git a/src/blog/2025/08/images/tables-explorer.png b/nuxt/public/blog/2025/08/images/tables-explorer.png similarity index 100% rename from src/blog/2025/08/images/tables-explorer.png rename to nuxt/public/blog/2025/08/images/tables-explorer.png diff --git a/src/blog/2025/08/images/tables.png b/nuxt/public/blog/2025/08/images/tables.png similarity index 100% rename from src/blog/2025/08/images/tables.png rename to nuxt/public/blog/2025/08/images/tables.png diff --git a/src/blog/2025/08/images/tables.webm b/nuxt/public/blog/2025/08/images/tables.webm similarity index 100% rename from src/blog/2025/08/images/tables.webm rename to nuxt/public/blog/2025/08/images/tables.webm diff --git a/src/blog/2025/08/images/the-evolution-of-business-automation-why-pricing-models-matter.png b/nuxt/public/blog/2025/08/images/the-evolution-of-business-automation-why-pricing-models-matter.png similarity index 100% rename from src/blog/2025/08/images/the-evolution-of-business-automation-why-pricing-models-matter.png rename to nuxt/public/blog/2025/08/images/the-evolution-of-business-automation-why-pricing-models-matter.png diff --git a/src/blog/2025/08/images/token-form.png b/nuxt/public/blog/2025/08/images/token-form.png similarity index 100% rename from src/blog/2025/08/images/token-form.png rename to nuxt/public/blog/2025/08/images/token-form.png diff --git a/src/blog/2025/08/images/vpp-flowfuse.png b/nuxt/public/blog/2025/08/images/vpp-flowfuse.png similarity index 100% rename from src/blog/2025/08/images/vpp-flowfuse.png rename to nuxt/public/blog/2025/08/images/vpp-flowfuse.png diff --git a/src/blog/2025/09/images/2.22-release.png b/nuxt/public/blog/2025/09/images/2.22-release.png similarity index 100% rename from src/blog/2025/09/images/2.22-release.png rename to nuxt/public/blog/2025/09/images/2.22-release.png diff --git a/src/blog/2025/09/images/add-remote-instance.png b/nuxt/public/blog/2025/09/images/add-remote-instance.png similarity index 100% rename from src/blog/2025/09/images/add-remote-instance.png rename to nuxt/public/blog/2025/09/images/add-remote-instance.png diff --git a/src/blog/2025/09/images/developer-mode.png b/nuxt/public/blog/2025/09/images/developer-mode.png similarity index 100% rename from src/blog/2025/09/images/developer-mode.png rename to nuxt/public/blog/2025/09/images/developer-mode.png diff --git a/src/blog/2025/09/images/device-configuration-window-2.webm b/nuxt/public/blog/2025/09/images/device-configuration-window-2.webm similarity index 100% rename from src/blog/2025/09/images/device-configuration-window-2.webm rename to nuxt/public/blog/2025/09/images/device-configuration-window-2.webm diff --git a/src/blog/2025/09/images/download-node-red.png b/nuxt/public/blog/2025/09/images/download-node-red.png similarity index 100% rename from src/blog/2025/09/images/download-node-red.png rename to nuxt/public/blog/2025/09/images/download-node-red.png diff --git a/src/blog/2025/09/images/ff-instance-tools.webm b/nuxt/public/blog/2025/09/images/ff-instance-tools.webm similarity index 100% rename from src/blog/2025/09/images/ff-instance-tools.webm rename to nuxt/public/blog/2025/09/images/ff-instance-tools.webm diff --git a/src/blog/2025/09/images/flowfuse-ai-assistance-table-demo.webm b/nuxt/public/blog/2025/09/images/flowfuse-ai-assistance-table-demo.webm similarity index 100% rename from src/blog/2025/09/images/flowfuse-ai-assistance-table-demo.webm rename to nuxt/public/blog/2025/09/images/flowfuse-ai-assistance-table-demo.webm diff --git a/src/blog/2025/09/images/flowfuse-assistant-query-node.png b/nuxt/public/blog/2025/09/images/flowfuse-assistant-query-node.png similarity index 100% rename from src/blog/2025/09/images/flowfuse-assistant-query-node.png rename to nuxt/public/blog/2025/09/images/flowfuse-assistant-query-node.png diff --git a/src/blog/2025/09/images/inline-assist-function.webm b/nuxt/public/blog/2025/09/images/inline-assist-function.webm similarity index 100% rename from src/blog/2025/09/images/inline-assist-function.webm rename to nuxt/public/blog/2025/09/images/inline-assist-function.webm diff --git a/src/blog/2025/09/images/installing-node-red.png b/nuxt/public/blog/2025/09/images/installing-node-red.png similarity index 100% rename from src/blog/2025/09/images/installing-node-red.png rename to nuxt/public/blog/2025/09/images/installing-node-red.png diff --git a/src/blog/2025/09/images/it-vs-ot-cta-1.png b/nuxt/public/blog/2025/09/images/it-vs-ot-cta-1.png similarity index 100% rename from src/blog/2025/09/images/it-vs-ot-cta-1.png rename to nuxt/public/blog/2025/09/images/it-vs-ot-cta-1.png diff --git a/src/blog/2025/09/images/it-vs-ot-difference-between-information-technology-and-operational-technology.png b/nuxt/public/blog/2025/09/images/it-vs-ot-difference-between-information-technology-and-operational-technology.png similarity index 100% rename from src/blog/2025/09/images/it-vs-ot-difference-between-information-technology-and-operational-technology.png rename to nuxt/public/blog/2025/09/images/it-vs-ot-difference-between-information-technology-and-operational-technology.png diff --git a/src/blog/2025/09/images/live-data-ttn-downlink.webm b/nuxt/public/blog/2025/09/images/live-data-ttn-downlink.webm similarity index 100% rename from src/blog/2025/09/images/live-data-ttn-downlink.webm rename to nuxt/public/blog/2025/09/images/live-data-ttn-downlink.webm diff --git a/src/blog/2025/09/images/live-data-ttn-ff1.webm b/nuxt/public/blog/2025/09/images/live-data-ttn-ff1.webm similarity index 100% rename from src/blog/2025/09/images/live-data-ttn-ff1.webm rename to nuxt/public/blog/2025/09/images/live-data-ttn-ff1.webm diff --git a/src/blog/2025/09/images/lorawan-flowfuse.png b/nuxt/public/blog/2025/09/images/lorawan-flowfuse.png similarity index 100% rename from src/blog/2025/09/images/lorawan-flowfuse.png rename to nuxt/public/blog/2025/09/images/lorawan-flowfuse.png diff --git a/src/blog/2025/09/images/modbus-configuration.png b/nuxt/public/blog/2025/09/images/modbus-configuration.png similarity index 100% rename from src/blog/2025/09/images/modbus-configuration.png rename to nuxt/public/blog/2025/09/images/modbus-configuration.png diff --git a/src/blog/2025/09/images/modbus-read.png b/nuxt/public/blog/2025/09/images/modbus-read.png similarity index 100% rename from src/blog/2025/09/images/modbus-read.png rename to nuxt/public/blog/2025/09/images/modbus-read.png diff --git a/src/blog/2025/09/images/modbus-rtu.png b/nuxt/public/blog/2025/09/images/modbus-rtu.png similarity index 100% rename from src/blog/2025/09/images/modbus-rtu.png rename to nuxt/public/blog/2025/09/images/modbus-rtu.png diff --git a/src/blog/2025/09/images/mqtt-connection-details.png b/nuxt/public/blog/2025/09/images/mqtt-connection-details.png similarity index 100% rename from src/blog/2025/09/images/mqtt-connection-details.png rename to nuxt/public/blog/2025/09/images/mqtt-connection-details.png diff --git a/src/blog/2025/09/images/node-red-editor.png b/nuxt/public/blog/2025/09/images/node-red-editor.png similarity index 100% rename from src/blog/2025/09/images/node-red-editor.png rename to nuxt/public/blog/2025/09/images/node-red-editor.png diff --git a/src/blog/2025/09/images/open-editor.png b/nuxt/public/blog/2025/09/images/open-editor.png similarity index 100% rename from src/blog/2025/09/images/open-editor.png rename to nuxt/public/blog/2025/09/images/open-editor.png diff --git a/src/blog/2025/09/images/pareto-chart-create.png b/nuxt/public/blog/2025/09/images/pareto-chart-create.png similarity index 100% rename from src/blog/2025/09/images/pareto-chart-create.png rename to nuxt/public/blog/2025/09/images/pareto-chart-create.png diff --git a/src/blog/2025/09/images/pareto-chart-decoded.png b/nuxt/public/blog/2025/09/images/pareto-chart-decoded.png similarity index 100% rename from src/blog/2025/09/images/pareto-chart-decoded.png rename to nuxt/public/blog/2025/09/images/pareto-chart-decoded.png diff --git a/src/blog/2025/09/images/pareto-chart.png b/nuxt/public/blog/2025/09/images/pareto-chart.png similarity index 100% rename from src/blog/2025/09/images/pareto-chart.png rename to nuxt/public/blog/2025/09/images/pareto-chart.png diff --git a/src/blog/2025/09/images/pf-curve.jpg b/nuxt/public/blog/2025/09/images/pf-curve.jpg similarity index 100% rename from src/blog/2025/09/images/pf-curve.jpg rename to nuxt/public/blog/2025/09/images/pf-curve.jpg diff --git a/src/blog/2025/09/images/platform-ff.png b/nuxt/public/blog/2025/09/images/platform-ff.png similarity index 100% rename from src/blog/2025/09/images/platform-ff.png rename to nuxt/public/blog/2025/09/images/platform-ff.png diff --git a/src/blog/2025/09/images/poka-yoke.png b/nuxt/public/blog/2025/09/images/poka-yoke.png similarity index 100% rename from src/blog/2025/09/images/poka-yoke.png rename to nuxt/public/blog/2025/09/images/poka-yoke.png diff --git a/src/blog/2025/09/images/preventive-maintenance-blog.png b/nuxt/public/blog/2025/09/images/preventive-maintenance-blog.png similarity index 100% rename from src/blog/2025/09/images/preventive-maintenance-blog.png rename to nuxt/public/blog/2025/09/images/preventive-maintenance-blog.png diff --git a/src/blog/2025/09/images/schema-autodetect.png b/nuxt/public/blog/2025/09/images/schema-autodetect.png similarity index 100% rename from src/blog/2025/09/images/schema-autodetect.png rename to nuxt/public/blog/2025/09/images/schema-autodetect.png diff --git a/src/blog/2025/09/images/snapshots-ui.png b/nuxt/public/blog/2025/09/images/snapshots-ui.png similarity index 100% rename from src/blog/2025/09/images/snapshots-ui.png rename to nuxt/public/blog/2025/09/images/snapshots-ui.png diff --git a/src/blog/2025/09/images/takt-time-flowfuse.png b/nuxt/public/blog/2025/09/images/takt-time-flowfuse.png similarity index 100% rename from src/blog/2025/09/images/takt-time-flowfuse.png rename to nuxt/public/blog/2025/09/images/takt-time-flowfuse.png diff --git a/src/blog/2025/09/images/takt-time-flowfuse.webm b/nuxt/public/blog/2025/09/images/takt-time-flowfuse.webm similarity index 100% rename from src/blog/2025/09/images/takt-time-flowfuse.webm rename to nuxt/public/blog/2025/09/images/takt-time-flowfuse.webm diff --git a/src/blog/2025/09/images/takt-time-formula.png b/nuxt/public/blog/2025/09/images/takt-time-formula.png similarity index 100% rename from src/blog/2025/09/images/takt-time-formula.png rename to nuxt/public/blog/2025/09/images/takt-time-formula.png diff --git a/src/blog/2025/09/images/trail-add-instance.png b/nuxt/public/blog/2025/09/images/trail-add-instance.png similarity index 100% rename from src/blog/2025/09/images/trail-add-instance.png rename to nuxt/public/blog/2025/09/images/trail-add-instance.png diff --git a/src/blog/2025/09/images/what-is-5s-checklist.png b/nuxt/public/blog/2025/09/images/what-is-5s-checklist.png similarity index 100% rename from src/blog/2025/09/images/what-is-5s-checklist.png rename to nuxt/public/blog/2025/09/images/what-is-5s-checklist.png diff --git a/src/blog/2025/09/images/what-is-poka-yoke.png b/nuxt/public/blog/2025/09/images/what-is-poka-yoke.png similarity index 100% rename from src/blog/2025/09/images/what-is-poka-yoke.png rename to nuxt/public/blog/2025/09/images/what-is-poka-yoke.png diff --git a/src/blog/2025/09/images/write-multi-coils.png b/nuxt/public/blog/2025/09/images/write-multi-coils.png similarity index 100% rename from src/blog/2025/09/images/write-multi-coils.png rename to nuxt/public/blog/2025/09/images/write-multi-coils.png diff --git a/src/blog/2025/09/images/write-single-coil.png b/nuxt/public/blog/2025/09/images/write-single-coil.png similarity index 100% rename from src/blog/2025/09/images/write-single-coil.png rename to nuxt/public/blog/2025/09/images/write-single-coil.png diff --git a/src/blog/2025/10/images/adding-tags.webm b/nuxt/public/blog/2025/10/images/adding-tags.webm similarity index 100% rename from src/blog/2025/10/images/adding-tags.webm rename to nuxt/public/blog/2025/10/images/adding-tags.webm diff --git a/src/blog/2025/10/images/ai-on-flowfuse.png b/nuxt/public/blog/2025/10/images/ai-on-flowfuse.png similarity index 100% rename from src/blog/2025/10/images/ai-on-flowfuse.png rename to nuxt/public/blog/2025/10/images/ai-on-flowfuse.png diff --git a/src/blog/2025/10/images/all-tags-one-msg-per-tag.png b/nuxt/public/blog/2025/10/images/all-tags-one-msg-per-tag.png similarity index 100% rename from src/blog/2025/10/images/all-tags-one-msg-per-tag.png rename to nuxt/public/blog/2025/10/images/all-tags-one-msg-per-tag.png diff --git a/src/blog/2025/10/images/all-tags-single-obj.png b/nuxt/public/blog/2025/10/images/all-tags-single-obj.png similarity index 100% rename from src/blog/2025/10/images/all-tags-single-obj.png rename to nuxt/public/blog/2025/10/images/all-tags-single-obj.png diff --git a/src/blog/2025/10/images/allen-bradly-plc.png b/nuxt/public/blog/2025/10/images/allen-bradly-plc.png similarity index 100% rename from src/blog/2025/10/images/allen-bradly-plc.png rename to nuxt/public/blog/2025/10/images/allen-bradly-plc.png diff --git a/src/blog/2025/10/images/building-mcp-server-node-red-with-ff.png b/nuxt/public/blog/2025/10/images/building-mcp-server-node-red-with-ff.png similarity index 100% rename from src/blog/2025/10/images/building-mcp-server-node-red-with-ff.png rename to nuxt/public/blog/2025/10/images/building-mcp-server-node-red-with-ff.png diff --git a/src/blog/2025/10/images/catch.png b/nuxt/public/blog/2025/10/images/catch.png similarity index 100% rename from src/blog/2025/10/images/catch.png rename to nuxt/public/blog/2025/10/images/catch.png diff --git a/src/blog/2025/10/images/change-node-adding-context.png b/nuxt/public/blog/2025/10/images/change-node-adding-context.png similarity index 100% rename from src/blog/2025/10/images/change-node-adding-context.png rename to nuxt/public/blog/2025/10/images/change-node-adding-context.png diff --git a/src/blog/2025/10/images/client-access-control.jpg b/nuxt/public/blog/2025/10/images/client-access-control.jpg similarity index 100% rename from src/blog/2025/10/images/client-access-control.jpg rename to nuxt/public/blog/2025/10/images/client-access-control.jpg diff --git a/src/blog/2025/10/images/configure-access-control.png b/nuxt/public/blog/2025/10/images/configure-access-control.png similarity index 100% rename from src/blog/2025/10/images/configure-access-control.png rename to nuxt/public/blog/2025/10/images/configure-access-control.png diff --git a/src/blog/2025/10/images/csv-config.png b/nuxt/public/blog/2025/10/images/csv-config.png similarity index 100% rename from src/blog/2025/10/images/csv-config.png rename to nuxt/public/blog/2025/10/images/csv-config.png diff --git a/src/blog/2025/10/images/custom-onnx-mode--import-flow.png b/nuxt/public/blog/2025/10/images/custom-onnx-mode--import-flow.png similarity index 100% rename from src/blog/2025/10/images/custom-onnx-mode--import-flow.png rename to nuxt/public/blog/2025/10/images/custom-onnx-mode--import-flow.png diff --git a/src/blog/2025/10/images/custom-onnx-mode--in-action.png b/nuxt/public/blog/2025/10/images/custom-onnx-mode--in-action.png similarity index 100% rename from src/blog/2025/10/images/custom-onnx-mode--in-action.png rename to nuxt/public/blog/2025/10/images/custom-onnx-mode--in-action.png diff --git a/src/blog/2025/10/images/diffrence-between-node-red-flowfuse.png b/nuxt/public/blog/2025/10/images/diffrence-between-node-red-flowfuse.png similarity index 100% rename from src/blog/2025/10/images/diffrence-between-node-red-flowfuse.png rename to nuxt/public/blog/2025/10/images/diffrence-between-node-red-flowfuse.png diff --git a/src/blog/2025/10/images/eth-ip-config.png b/nuxt/public/blog/2025/10/images/eth-ip-config.png similarity index 100% rename from src/blog/2025/10/images/eth-ip-config.png rename to nuxt/public/blog/2025/10/images/eth-ip-config.png diff --git a/src/blog/2025/10/images/eth-out-node.png b/nuxt/public/blog/2025/10/images/eth-out-node.png similarity index 100% rename from src/blog/2025/10/images/eth-out-node.png rename to nuxt/public/blog/2025/10/images/eth-out-node.png diff --git a/src/blog/2025/10/images/expert.png b/nuxt/public/blog/2025/10/images/expert.png similarity index 100% rename from src/blog/2025/10/images/expert.png rename to nuxt/public/blog/2025/10/images/expert.png diff --git a/src/blog/2025/10/images/ff-auth.png b/nuxt/public/blog/2025/10/images/ff-auth.png similarity index 100% rename from src/blog/2025/10/images/ff-auth.png rename to nuxt/public/blog/2025/10/images/ff-auth.png diff --git a/src/blog/2025/10/images/flowfuse-ai-nodes.png b/nuxt/public/blog/2025/10/images/flowfuse-ai-nodes.png similarity index 100% rename from src/blog/2025/10/images/flowfuse-ai-nodes.png rename to nuxt/public/blog/2025/10/images/flowfuse-ai-nodes.png diff --git a/src/blog/2025/10/images/flowfuse-expert.webm b/nuxt/public/blog/2025/10/images/flowfuse-expert.webm similarity index 100% rename from src/blog/2025/10/images/flowfuse-expert.webm rename to nuxt/public/blog/2025/10/images/flowfuse-expert.webm diff --git a/src/blog/2025/10/images/flowfuse-release-2-23.png b/nuxt/public/blog/2025/10/images/flowfuse-release-2-23.png similarity index 100% rename from src/blog/2025/10/images/flowfuse-release-2-23.png rename to nuxt/public/blog/2025/10/images/flowfuse-release-2-23.png diff --git a/src/blog/2025/10/images/introducing-our-flowFuse-expert.png b/nuxt/public/blog/2025/10/images/introducing-our-flowFuse-expert.png similarity index 100% rename from src/blog/2025/10/images/introducing-our-flowFuse-expert.png rename to nuxt/public/blog/2025/10/images/introducing-our-flowFuse-expert.png diff --git a/src/blog/2025/10/images/log-plc-data-to-csv.png b/nuxt/public/blog/2025/10/images/log-plc-data-to-csv.png similarity index 100% rename from src/blog/2025/10/images/log-plc-data-to-csv.png rename to nuxt/public/blog/2025/10/images/log-plc-data-to-csv.png diff --git a/src/blog/2025/10/images/mcp-in-flowfuse.png b/nuxt/public/blog/2025/10/images/mcp-in-flowfuse.png similarity index 100% rename from src/blog/2025/10/images/mcp-in-flowfuse.png rename to nuxt/public/blog/2025/10/images/mcp-in-flowfuse.png diff --git a/src/blog/2025/10/images/mcp-nodes.png b/nuxt/public/blog/2025/10/images/mcp-nodes.png similarity index 100% rename from src/blog/2025/10/images/mcp-nodes.png rename to nuxt/public/blog/2025/10/images/mcp-nodes.png diff --git a/src/blog/2025/10/images/mcp-resource-node-config.png b/nuxt/public/blog/2025/10/images/mcp-resource-node-config.png similarity index 100% rename from src/blog/2025/10/images/mcp-resource-node-config.png rename to nuxt/public/blog/2025/10/images/mcp-resource-node-config.png diff --git a/src/blog/2025/10/images/mcp-server-config.png b/nuxt/public/blog/2025/10/images/mcp-server-config.png similarity index 100% rename from src/blog/2025/10/images/mcp-server-config.png rename to nuxt/public/blog/2025/10/images/mcp-server-config.png diff --git a/src/blog/2025/10/images/mcp-tools.png b/nuxt/public/blog/2025/10/images/mcp-tools.png similarity index 100% rename from src/blog/2025/10/images/mcp-tools.png rename to nuxt/public/blog/2025/10/images/mcp-tools.png diff --git a/src/blog/2025/10/images/mqtt-topic-hierarchy.png b/nuxt/public/blog/2025/10/images/mqtt-topic-hierarchy.png similarity index 100% rename from src/blog/2025/10/images/mqtt-topic-hierarchy.png rename to nuxt/public/blog/2025/10/images/mqtt-topic-hierarchy.png diff --git a/src/blog/2025/10/images/mqtt-topic-schema-document.png b/nuxt/public/blog/2025/10/images/mqtt-topic-schema-document.png similarity index 100% rename from src/blog/2025/10/images/mqtt-topic-schema-document.png rename to nuxt/public/blog/2025/10/images/mqtt-topic-schema-document.png diff --git a/src/blog/2025/10/images/node-red-revolution.png b/nuxt/public/blog/2025/10/images/node-red-revolution.png similarity index 100% rename from src/blog/2025/10/images/node-red-revolution.png rename to nuxt/public/blog/2025/10/images/node-red-revolution.png diff --git a/src/blog/2025/10/images/open-ai-agent-builder-versus-flowfuse.png b/nuxt/public/blog/2025/10/images/open-ai-agent-builder-versus-flowfuse.png similarity index 100% rename from src/blog/2025/10/images/open-ai-agent-builder-versus-flowfuse.png rename to nuxt/public/blog/2025/10/images/open-ai-agent-builder-versus-flowfuse.png diff --git a/src/blog/2025/10/images/plc-program.png b/nuxt/public/blog/2025/10/images/plc-program.png similarity index 100% rename from src/blog/2025/10/images/plc-program.png rename to nuxt/public/blog/2025/10/images/plc-program.png diff --git a/src/blog/2025/10/images/plc-to-csv.webm b/nuxt/public/blog/2025/10/images/plc-to-csv.webm similarity index 100% rename from src/blog/2025/10/images/plc-to-csv.webm rename to nuxt/public/blog/2025/10/images/plc-to-csv.webm diff --git a/src/blog/2025/10/images/plc-to-mqtt.png b/nuxt/public/blog/2025/10/images/plc-to-mqtt.png similarity index 100% rename from src/blog/2025/10/images/plc-to-mqtt.png rename to nuxt/public/blog/2025/10/images/plc-to-mqtt.png diff --git a/src/blog/2025/10/images/rbac2.png b/nuxt/public/blog/2025/10/images/rbac2.png similarity index 100% rename from src/blog/2025/10/images/rbac2.png rename to nuxt/public/blog/2025/10/images/rbac2.png diff --git a/src/blog/2025/10/images/read-plc-tag.png b/nuxt/public/blog/2025/10/images/read-plc-tag.png similarity index 100% rename from src/blog/2025/10/images/read-plc-tag.png rename to nuxt/public/blog/2025/10/images/read-plc-tag.png diff --git a/src/blog/2025/10/images/resource-demo.webm b/nuxt/public/blog/2025/10/images/resource-demo.webm similarity index 100% rename from src/blog/2025/10/images/resource-demo.webm rename to nuxt/public/blog/2025/10/images/resource-demo.webm diff --git a/src/blog/2025/10/images/set-broker.png b/nuxt/public/blog/2025/10/images/set-broker.png similarity index 100% rename from src/blog/2025/10/images/set-broker.png rename to nuxt/public/blog/2025/10/images/set-broker.png diff --git a/src/blog/2025/10/images/the-ai-orchestration-hype.png b/nuxt/public/blog/2025/10/images/the-ai-orchestration-hype.png similarity index 100% rename from src/blog/2025/10/images/the-ai-orchestration-hype.png rename to nuxt/public/blog/2025/10/images/the-ai-orchestration-hype.png diff --git a/src/blog/2025/10/images/tools-demo.webm b/nuxt/public/blog/2025/10/images/tools-demo.webm similarity index 100% rename from src/blog/2025/10/images/tools-demo.webm rename to nuxt/public/blog/2025/10/images/tools-demo.webm diff --git a/src/blog/2025/10/images/topic-hierarchy.png b/nuxt/public/blog/2025/10/images/topic-hierarchy.png similarity index 100% rename from src/blog/2025/10/images/topic-hierarchy.png rename to nuxt/public/blog/2025/10/images/topic-hierarchy.png diff --git a/src/blog/2025/10/images/write-file-config.png b/nuxt/public/blog/2025/10/images/write-file-config.png similarity index 100% rename from src/blog/2025/10/images/write-file-config.png rename to nuxt/public/blog/2025/10/images/write-file-config.png diff --git a/src/blog/2025/11/images/2.24-release.png b/nuxt/public/blog/2025/11/images/2.24-release.png similarity index 100% rename from src/blog/2025/11/images/2.24-release.png rename to nuxt/public/blog/2025/11/images/2.24-release.png diff --git a/src/blog/2025/11/images/add-record-id-to-payload.png b/nuxt/public/blog/2025/11/images/add-record-id-to-payload.png similarity index 100% rename from src/blog/2025/11/images/add-record-id-to-payload.png rename to nuxt/public/blog/2025/11/images/add-record-id-to-payload.png diff --git a/src/blog/2025/11/images/building-a-web-hmi-for-factory.png b/nuxt/public/blog/2025/11/images/building-a-web-hmi-for-factory.png similarity index 100% rename from src/blog/2025/11/images/building-a-web-hmi-for-factory.png rename to nuxt/public/blog/2025/11/images/building-a-web-hmi-for-factory.png diff --git a/src/blog/2025/11/images/building-label-scanner-with-flowfuse.png b/nuxt/public/blog/2025/11/images/building-label-scanner-with-flowfuse.png similarity index 100% rename from src/blog/2025/11/images/building-label-scanner-with-flowfuse.png rename to nuxt/public/blog/2025/11/images/building-label-scanner-with-flowfuse.png diff --git a/src/blog/2025/11/images/change-node-running.png b/nuxt/public/blog/2025/11/images/change-node-running.png similarity index 100% rename from src/blog/2025/11/images/change-node-running.png rename to nuxt/public/blog/2025/11/images/change-node-running.png diff --git a/src/blog/2025/11/images/change-node-stopped.png b/nuxt/public/blog/2025/11/images/change-node-stopped.png similarity index 100% rename from src/blog/2025/11/images/change-node-stopped.png rename to nuxt/public/blog/2025/11/images/change-node-stopped.png diff --git a/src/blog/2025/11/images/chart-node-config.png b/nuxt/public/blog/2025/11/images/chart-node-config.png similarity index 100% rename from src/blog/2025/11/images/chart-node-config.png rename to nuxt/public/blog/2025/11/images/chart-node-config.png diff --git a/src/blog/2025/11/images/css.png b/nuxt/public/blog/2025/11/images/css.png similarity index 100% rename from src/blog/2025/11/images/css.png rename to nuxt/public/blog/2025/11/images/css.png diff --git a/src/blog/2025/11/images/csv-node-config.png b/nuxt/public/blog/2025/11/images/csv-node-config.png similarity index 100% rename from src/blog/2025/11/images/csv-node-config.png rename to nuxt/public/blog/2025/11/images/csv-node-config.png diff --git a/src/blog/2025/11/images/csv-to-mqtt-cta-1.png b/nuxt/public/blog/2025/11/images/csv-to-mqtt-cta-1.png similarity index 100% rename from src/blog/2025/11/images/csv-to-mqtt-cta-1.png rename to nuxt/public/blog/2025/11/images/csv-to-mqtt-cta-1.png diff --git a/src/blog/2025/11/images/csv-to-mqtt-cta-2.png b/nuxt/public/blog/2025/11/images/csv-to-mqtt-cta-2.png similarity index 100% rename from src/blog/2025/11/images/csv-to-mqtt-cta-2.png rename to nuxt/public/blog/2025/11/images/csv-to-mqtt-cta-2.png diff --git a/src/blog/2025/11/images/csv-to-mqtt.png b/nuxt/public/blog/2025/11/images/csv-to-mqtt.png similarity index 100% rename from src/blog/2025/11/images/csv-to-mqtt.png rename to nuxt/public/blog/2025/11/images/csv-to-mqtt.png diff --git a/src/blog/2025/11/images/enable-offline-access.png b/nuxt/public/blog/2025/11/images/enable-offline-access.png similarity index 100% rename from src/blog/2025/11/images/enable-offline-access.png rename to nuxt/public/blog/2025/11/images/enable-offline-access.png diff --git a/src/blog/2025/11/images/encode-config.png b/nuxt/public/blog/2025/11/images/encode-config.png similarity index 100% rename from src/blog/2025/11/images/encode-config.png rename to nuxt/public/blog/2025/11/images/encode-config.png diff --git a/src/blog/2025/11/images/ff-expert-ui.png b/nuxt/public/blog/2025/11/images/ff-expert-ui.png similarity index 100% rename from src/blog/2025/11/images/ff-expert-ui.png rename to nuxt/public/blog/2025/11/images/ff-expert-ui.png diff --git a/src/blog/2025/11/images/flow-error.png b/nuxt/public/blog/2025/11/images/flow-error.png similarity index 100% rename from src/blog/2025/11/images/flow-error.png rename to nuxt/public/blog/2025/11/images/flow-error.png diff --git a/src/blog/2025/11/images/flowfuse+llm+mcp-equals-text-driven-operations.png b/nuxt/public/blog/2025/11/images/flowfuse+llm+mcp-equals-text-driven-operations.png similarity index 100% rename from src/blog/2025/11/images/flowfuse+llm+mcp-equals-text-driven-operations.png rename to nuxt/public/blog/2025/11/images/flowfuse+llm+mcp-equals-text-driven-operations.png diff --git a/src/blog/2025/11/images/flowfuse-dashboard-hmi.png b/nuxt/public/blog/2025/11/images/flowfuse-dashboard-hmi.png similarity index 100% rename from src/blog/2025/11/images/flowfuse-dashboard-hmi.png rename to nuxt/public/blog/2025/11/images/flowfuse-dashboard-hmi.png diff --git a/src/blog/2025/11/images/flowfuse-dashboard.webm b/nuxt/public/blog/2025/11/images/flowfuse-dashboard.webm similarity index 100% rename from src/blog/2025/11/images/flowfuse-dashboard.webm rename to nuxt/public/blog/2025/11/images/flowfuse-dashboard.webm diff --git a/src/blog/2025/11/images/flowfuse-scanner.webm b/nuxt/public/blog/2025/11/images/flowfuse-scanner.webm similarity index 100% rename from src/blog/2025/11/images/flowfuse-scanner.webm rename to nuxt/public/blog/2025/11/images/flowfuse-scanner.webm diff --git a/src/blog/2025/11/images/how-to-ingest-csv-logs.png b/nuxt/public/blog/2025/11/images/how-to-ingest-csv-logs.png similarity index 100% rename from src/blog/2025/11/images/how-to-ingest-csv-logs.png rename to nuxt/public/blog/2025/11/images/how-to-ingest-csv-logs.png diff --git a/src/blog/2025/11/images/if-connected-to-internet.png b/nuxt/public/blog/2025/11/images/if-connected-to-internet.png similarity index 100% rename from src/blog/2025/11/images/if-connected-to-internet.png rename to nuxt/public/blog/2025/11/images/if-connected-to-internet.png diff --git a/src/blog/2025/11/images/if-no-error.png b/nuxt/public/blog/2025/11/images/if-no-error.png similarity index 100% rename from src/blog/2025/11/images/if-no-error.png rename to nuxt/public/blog/2025/11/images/if-no-error.png diff --git a/src/blog/2025/11/images/industrial-data-validation-guide.png b/nuxt/public/blog/2025/11/images/industrial-data-validation-guide.png similarity index 100% rename from src/blog/2025/11/images/industrial-data-validation-guide.png rename to nuxt/public/blog/2025/11/images/industrial-data-validation-guide.png diff --git a/src/blog/2025/11/images/is-network-online.png b/nuxt/public/blog/2025/11/images/is-network-online.png similarity index 100% rename from src/blog/2025/11/images/is-network-online.png rename to nuxt/public/blog/2025/11/images/is-network-online.png diff --git a/src/blog/2025/11/images/json-schema-validator.png b/nuxt/public/blog/2025/11/images/json-schema-validator.png similarity index 100% rename from src/blog/2025/11/images/json-schema-validator.png rename to nuxt/public/blog/2025/11/images/json-schema-validator.png diff --git a/src/blog/2025/11/images/mcp-in-flowfuse.png b/nuxt/public/blog/2025/11/images/mcp-in-flowfuse.png similarity index 100% rename from src/blog/2025/11/images/mcp-in-flowfuse.png rename to nuxt/public/blog/2025/11/images/mcp-in-flowfuse.png diff --git a/src/blog/2025/11/images/motor-status-text-widget.png b/nuxt/public/blog/2025/11/images/motor-status-text-widget.png similarity index 100% rename from src/blog/2025/11/images/motor-status-text-widget.png rename to nuxt/public/blog/2025/11/images/motor-status-text-widget.png diff --git a/src/blog/2025/11/images/mqtt-to-dashboard.png b/nuxt/public/blog/2025/11/images/mqtt-to-dashboard.png similarity index 100% rename from src/blog/2025/11/images/mqtt-to-dashboard.png rename to nuxt/public/blog/2025/11/images/mqtt-to-dashboard.png diff --git a/src/blog/2025/11/images/optimize-industrial-data.png b/nuxt/public/blog/2025/11/images/optimize-industrial-data.png similarity index 100% rename from src/blog/2025/11/images/optimize-industrial-data.png rename to nuxt/public/blog/2025/11/images/optimize-industrial-data.png diff --git a/src/blog/2025/11/images/parse-json.png b/nuxt/public/blog/2025/11/images/parse-json.png similarity index 100% rename from src/blog/2025/11/images/parse-json.png rename to nuxt/public/blog/2025/11/images/parse-json.png diff --git a/src/blog/2025/11/images/ping.png b/nuxt/public/blog/2025/11/images/ping.png similarity index 100% rename from src/blog/2025/11/images/ping.png rename to nuxt/public/blog/2025/11/images/ping.png diff --git a/src/blog/2025/11/images/prepare-forward-msg.png b/nuxt/public/blog/2025/11/images/prepare-forward-msg.png similarity index 100% rename from src/blog/2025/11/images/prepare-forward-msg.png rename to nuxt/public/blog/2025/11/images/prepare-forward-msg.png diff --git a/src/blog/2025/11/images/read-file-node.png b/nuxt/public/blog/2025/11/images/read-file-node.png similarity index 100% rename from src/blog/2025/11/images/read-file-node.png rename to nuxt/public/blog/2025/11/images/read-file-node.png diff --git a/src/blog/2025/11/images/scan-label-button.png b/nuxt/public/blog/2025/11/images/scan-label-button.png similarity index 100% rename from src/blog/2025/11/images/scan-label-button.png rename to nuxt/public/blog/2025/11/images/scan-label-button.png diff --git a/src/blog/2025/11/images/scheduler.png b/nuxt/public/blog/2025/11/images/scheduler.png similarity index 100% rename from src/blog/2025/11/images/scheduler.png rename to nuxt/public/blog/2025/11/images/scheduler.png diff --git a/src/blog/2025/11/images/serial-no-on-part.png b/nuxt/public/blog/2025/11/images/serial-no-on-part.png similarity index 100% rename from src/blog/2025/11/images/serial-no-on-part.png rename to nuxt/public/blog/2025/11/images/serial-no-on-part.png diff --git a/src/blog/2025/11/images/set-flow-error-flag.png b/nuxt/public/blog/2025/11/images/set-flow-error-flag.png similarity index 100% rename from src/blog/2025/11/images/set-flow-error-flag.png rename to nuxt/public/blog/2025/11/images/set-flow-error-flag.png diff --git a/src/blog/2025/11/images/set-network-failure-flag.png b/nuxt/public/blog/2025/11/images/set-network-failure-flag.png similarity index 100% rename from src/blog/2025/11/images/set-network-failure-flag.png rename to nuxt/public/blog/2025/11/images/set-network-failure-flag.png diff --git a/src/blog/2025/11/images/set-network-offline.png b/nuxt/public/blog/2025/11/images/set-network-offline.png similarity index 100% rename from src/blog/2025/11/images/set-network-offline.png rename to nuxt/public/blog/2025/11/images/set-network-offline.png diff --git a/src/blog/2025/11/images/set-network-online.png b/nuxt/public/blog/2025/11/images/set-network-online.png similarity index 100% rename from src/blog/2025/11/images/set-network-online.png rename to nuxt/public/blog/2025/11/images/set-network-online.png diff --git a/src/blog/2025/11/images/set-params-step-3.png b/nuxt/public/blog/2025/11/images/set-params-step-3.png similarity index 100% rename from src/blog/2025/11/images/set-params-step-3.png rename to nuxt/public/blog/2025/11/images/set-params-step-3.png diff --git a/src/blog/2025/11/images/set-params-step-5.png b/nuxt/public/blog/2025/11/images/set-params-step-5.png similarity index 100% rename from src/blog/2025/11/images/set-params-step-5.png rename to nuxt/public/blog/2025/11/images/set-params-step-5.png diff --git a/src/blog/2025/11/images/sqlite-config.png b/nuxt/public/blog/2025/11/images/sqlite-config.png similarity index 100% rename from src/blog/2025/11/images/sqlite-config.png rename to nuxt/public/blog/2025/11/images/sqlite-config.png diff --git a/src/blog/2025/11/images/start-button.png b/nuxt/public/blog/2025/11/images/start-button.png similarity index 100% rename from src/blog/2025/11/images/start-button.png rename to nuxt/public/blog/2025/11/images/start-button.png diff --git a/src/blog/2025/11/images/stop-button.png b/nuxt/public/blog/2025/11/images/stop-button.png similarity index 100% rename from src/blog/2025/11/images/stop-button.png rename to nuxt/public/blog/2025/11/images/stop-button.png diff --git a/src/blog/2025/11/images/store-and-forward.png b/nuxt/public/blog/2025/11/images/store-and-forward.png similarity index 100% rename from src/blog/2025/11/images/store-and-forward.png rename to nuxt/public/blog/2025/11/images/store-and-forward.png diff --git a/src/blog/2025/11/images/stringify-json.png b/nuxt/public/blog/2025/11/images/stringify-json.png similarity index 100% rename from src/blog/2025/11/images/stringify-json.png rename to nuxt/public/blog/2025/11/images/stringify-json.png diff --git a/src/blog/2025/11/images/switch-node.png b/nuxt/public/blog/2025/11/images/switch-node.png similarity index 100% rename from src/blog/2025/11/images/switch-node.png rename to nuxt/public/blog/2025/11/images/switch-node.png diff --git a/src/blog/2025/11/images/the-industrial-iot-market-shift.png b/nuxt/public/blog/2025/11/images/the-industrial-iot-market-shift.png similarity index 100% rename from src/blog/2025/11/images/the-industrial-iot-market-shift.png rename to nuxt/public/blog/2025/11/images/the-industrial-iot-market-shift.png diff --git a/src/blog/2025/11/images/token.png b/nuxt/public/blog/2025/11/images/token.png similarity index 100% rename from src/blog/2025/11/images/token.png rename to nuxt/public/blog/2025/11/images/token.png diff --git a/src/blog/2025/12/images/5-why-cta.png b/nuxt/public/blog/2025/12/images/5-why-cta.png similarity index 100% rename from src/blog/2025/12/images/5-why-cta.png rename to nuxt/public/blog/2025/12/images/5-why-cta.png diff --git a/src/blog/2025/12/images/5-why-root-cause-analysis.png b/nuxt/public/blog/2025/12/images/5-why-root-cause-analysis.png similarity index 100% rename from src/blog/2025/12/images/5-why-root-cause-analysis.png rename to nuxt/public/blog/2025/12/images/5-why-root-cause-analysis.png diff --git a/src/blog/2025/12/images/5-why-root-cause-funnel.png b/nuxt/public/blog/2025/12/images/5-why-root-cause-funnel.png similarity index 100% rename from src/blog/2025/12/images/5-why-root-cause-funnel.png rename to nuxt/public/blog/2025/12/images/5-why-root-cause-funnel.png diff --git a/src/blog/2025/12/images/First-modicon-084.png b/nuxt/public/blog/2025/12/images/First-modicon-084.png similarity index 100% rename from src/blog/2025/12/images/First-modicon-084.png rename to nuxt/public/blog/2025/12/images/First-modicon-084.png diff --git a/src/blog/2025/12/images/Release-2-25.png b/nuxt/public/blog/2025/12/images/Release-2-25.png similarity index 100% rename from src/blog/2025/12/images/Release-2-25.png rename to nuxt/public/blog/2025/12/images/Release-2-25.png diff --git a/src/blog/2025/12/images/add-server-interface.png b/nuxt/public/blog/2025/12/images/add-server-interface.png similarity index 100% rename from src/blog/2025/12/images/add-server-interface.png rename to nuxt/public/blog/2025/12/images/add-server-interface.png diff --git a/src/blog/2025/12/images/buffer-parser-temp-and-hum.png b/nuxt/public/blog/2025/12/images/buffer-parser-temp-and-hum.png similarity index 100% rename from src/blog/2025/12/images/buffer-parser-temp-and-hum.png rename to nuxt/public/blog/2025/12/images/buffer-parser-temp-and-hum.png diff --git a/src/blog/2025/12/images/buffer-parser.png b/nuxt/public/blog/2025/12/images/buffer-parser.png similarity index 100% rename from src/blog/2025/12/images/buffer-parser.png rename to nuxt/public/blog/2025/12/images/buffer-parser.png diff --git a/src/blog/2025/12/images/building-a-weather-dashboard.png b/nuxt/public/blog/2025/12/images/building-a-weather-dashboard.png similarity index 100% rename from src/blog/2025/12/images/building-a-weather-dashboard.png rename to nuxt/public/blog/2025/12/images/building-a-weather-dashboard.png diff --git a/src/blog/2025/12/images/city-display.png b/nuxt/public/blog/2025/12/images/city-display.png similarity index 100% rename from src/blog/2025/12/images/city-display.png rename to nuxt/public/blog/2025/12/images/city-display.png diff --git a/src/blog/2025/12/images/condition-display.png b/nuxt/public/blog/2025/12/images/condition-display.png similarity index 100% rename from src/blog/2025/12/images/condition-display.png rename to nuxt/public/blog/2025/12/images/condition-display.png diff --git a/src/blog/2025/12/images/countdown.png b/nuxt/public/blog/2025/12/images/countdown.png similarity index 100% rename from src/blog/2025/12/images/countdown.png rename to nuxt/public/blog/2025/12/images/countdown.png diff --git a/src/blog/2025/12/images/enable-opcua-server.png b/nuxt/public/blog/2025/12/images/enable-opcua-server.png similarity index 100% rename from src/blog/2025/12/images/enable-opcua-server.png rename to nuxt/public/blog/2025/12/images/enable-opcua-server.png diff --git a/src/blog/2025/12/images/ff-assistant-nr.png b/nuxt/public/blog/2025/12/images/ff-assistant-nr.png similarity index 100% rename from src/blog/2025/12/images/ff-assistant-nr.png rename to nuxt/public/blog/2025/12/images/ff-assistant-nr.png diff --git a/src/blog/2025/12/images/five-whys-analysis.png b/nuxt/public/blog/2025/12/images/five-whys-analysis.png similarity index 100% rename from src/blog/2025/12/images/five-whys-analysis.png rename to nuxt/public/blog/2025/12/images/five-whys-analysis.png diff --git a/src/blog/2025/12/images/flowfuse-platform.png b/nuxt/public/blog/2025/12/images/flowfuse-platform.png similarity index 100% rename from src/blog/2025/12/images/flowfuse-platform.png rename to nuxt/public/blog/2025/12/images/flowfuse-platform.png diff --git a/src/blog/2025/12/images/function-setup-tab.png b/nuxt/public/blog/2025/12/images/function-setup-tab.png similarity index 100% rename from src/blog/2025/12/images/function-setup-tab.png rename to nuxt/public/blog/2025/12/images/function-setup-tab.png diff --git a/src/blog/2025/12/images/hourglass-output.png b/nuxt/public/blog/2025/12/images/hourglass-output.png similarity index 100% rename from src/blog/2025/12/images/hourglass-output.png rename to nuxt/public/blog/2025/12/images/hourglass-output.png diff --git a/src/blog/2025/12/images/http-request.png b/nuxt/public/blog/2025/12/images/http-request.png similarity index 100% rename from src/blog/2025/12/images/http-request.png rename to nuxt/public/blog/2025/12/images/http-request.png diff --git a/src/blog/2025/12/images/humidity-gauge.png b/nuxt/public/blog/2025/12/images/humidity-gauge.png similarity index 100% rename from src/blog/2025/12/images/humidity-gauge.png rename to nuxt/public/blog/2025/12/images/humidity-gauge.png diff --git a/src/blog/2025/12/images/kafka-vs-mqtt.png b/nuxt/public/blog/2025/12/images/kafka-vs-mqtt.png similarity index 100% rename from src/blog/2025/12/images/kafka-vs-mqtt.png rename to nuxt/public/blog/2025/12/images/kafka-vs-mqtt.png diff --git a/src/blog/2025/12/images/kafka.png b/nuxt/public/blog/2025/12/images/kafka.png similarity index 100% rename from src/blog/2025/12/images/kafka.png rename to nuxt/public/blog/2025/12/images/kafka.png diff --git a/src/blog/2025/12/images/mcp-in-flowfuse.png b/nuxt/public/blog/2025/12/images/mcp-in-flowfuse.png similarity index 100% rename from src/blog/2025/12/images/mcp-in-flowfuse.png rename to nuxt/public/blog/2025/12/images/mcp-in-flowfuse.png diff --git a/src/blog/2025/12/images/mqtt.png b/nuxt/public/blog/2025/12/images/mqtt.png similarity index 100% rename from src/blog/2025/12/images/mqtt.png rename to nuxt/public/blog/2025/12/images/mqtt.png diff --git a/src/blog/2025/12/images/node-red-buffer-parser-industrial-data.png b/nuxt/public/blog/2025/12/images/node-red-buffer-parser-industrial-data.png similarity index 100% rename from src/blog/2025/12/images/node-red-buffer-parser-industrial-data.png rename to nuxt/public/blog/2025/12/images/node-red-buffer-parser-industrial-data.png diff --git a/src/blog/2025/12/images/node-red-timer.png b/nuxt/public/blog/2025/12/images/node-red-timer.png similarity index 100% rename from src/blog/2025/12/images/node-red-timer.png rename to nuxt/public/blog/2025/12/images/node-red-timer.png diff --git a/src/blog/2025/12/images/optimized-db-and-accessbile-via-opcua-option.png b/nuxt/public/blog/2025/12/images/optimized-db-and-accessbile-via-opcua-option.png similarity index 100% rename from src/blog/2025/12/images/optimized-db-and-accessbile-via-opcua-option.png rename to nuxt/public/blog/2025/12/images/optimized-db-and-accessbile-via-opcua-option.png diff --git a/src/blog/2025/12/images/performance-operator-terminal.png b/nuxt/public/blog/2025/12/images/performance-operator-terminal.png similarity index 100% rename from src/blog/2025/12/images/performance-operator-terminal.png rename to nuxt/public/blog/2025/12/images/performance-operator-terminal.png diff --git a/src/blog/2025/12/images/pre-plc-relay-cabinet.jpg b/nuxt/public/blog/2025/12/images/pre-plc-relay-cabinet.jpg similarity index 100% rename from src/blog/2025/12/images/pre-plc-relay-cabinet.jpg rename to nuxt/public/blog/2025/12/images/pre-plc-relay-cabinet.jpg diff --git a/src/blog/2025/12/images/reading-s7-optimize-data-block.png b/nuxt/public/blog/2025/12/images/reading-s7-optimize-data-block.png similarity index 100% rename from src/blog/2025/12/images/reading-s7-optimize-data-block.png rename to nuxt/public/blog/2025/12/images/reading-s7-optimize-data-block.png diff --git a/src/blog/2025/12/images/simulate-data-inject.png b/nuxt/public/blog/2025/12/images/simulate-data-inject.png similarity index 100% rename from src/blog/2025/12/images/simulate-data-inject.png rename to nuxt/public/blog/2025/12/images/simulate-data-inject.png diff --git a/src/blog/2025/12/images/tags-added-in-the-server-interface.png b/nuxt/public/blog/2025/12/images/tags-added-in-the-server-interface.png similarity index 100% rename from src/blog/2025/12/images/tags-added-in-the-server-interface.png rename to nuxt/public/blog/2025/12/images/tags-added-in-the-server-interface.png diff --git a/src/blog/2025/12/images/temperature-gauge.png b/nuxt/public/blog/2025/12/images/temperature-gauge.png similarity index 100% rename from src/blog/2025/12/images/temperature-gauge.png rename to nuxt/public/blog/2025/12/images/temperature-gauge.png diff --git a/src/blog/2025/12/images/trigger-weather-api.png b/nuxt/public/blog/2025/12/images/trigger-weather-api.png similarity index 100% rename from src/blog/2025/12/images/trigger-weather-api.png rename to nuxt/public/blog/2025/12/images/trigger-weather-api.png diff --git a/src/blog/2025/12/images/updates.png b/nuxt/public/blog/2025/12/images/updates.png similarity index 100% rename from src/blog/2025/12/images/updates.png rename to nuxt/public/blog/2025/12/images/updates.png diff --git a/src/blog/2025/12/images/weather-dashboard.png b/nuxt/public/blog/2025/12/images/weather-dashboard.png similarity index 100% rename from src/blog/2025/12/images/weather-dashboard.png rename to nuxt/public/blog/2025/12/images/weather-dashboard.png diff --git a/src/blog/2025/12/images/what-is-mttf.png b/nuxt/public/blog/2025/12/images/what-is-mttf.png similarity index 100% rename from src/blog/2025/12/images/what-is-mttf.png rename to nuxt/public/blog/2025/12/images/what-is-mttf.png diff --git a/src/blog/2025/12/images/what-is-plc.png b/nuxt/public/blog/2025/12/images/what-is-plc.png similarity index 100% rename from src/blog/2025/12/images/what-is-plc.png rename to nuxt/public/blog/2025/12/images/what-is-plc.png diff --git a/src/blog/2025/12/images/what-is-teep.png b/nuxt/public/blog/2025/12/images/what-is-teep.png similarity index 100% rename from src/blog/2025/12/images/what-is-teep.png rename to nuxt/public/blog/2025/12/images/what-is-teep.png diff --git a/src/blog/2025/12/images/wind-speed-chart.png b/nuxt/public/blog/2025/12/images/wind-speed-chart.png similarity index 100% rename from src/blog/2025/12/images/wind-speed-chart.png rename to nuxt/public/blog/2025/12/images/wind-speed-chart.png diff --git a/src/blog/2026/01/images/Q-CON-2014.png b/nuxt/public/blog/2026/01/images/Q-CON-2014.png similarity index 100% rename from src/blog/2026/01/images/Q-CON-2014.png rename to nuxt/public/blog/2026/01/images/Q-CON-2014.png diff --git a/src/blog/2026/01/images/add-token.png b/nuxt/public/blog/2026/01/images/add-token.png similarity index 100% rename from src/blog/2026/01/images/add-token.png rename to nuxt/public/blog/2026/01/images/add-token.png diff --git a/src/blog/2026/01/images/ai-mcp-opcua.png b/nuxt/public/blog/2026/01/images/ai-mcp-opcua.png similarity index 100% rename from src/blog/2026/01/images/ai-mcp-opcua.png rename to nuxt/public/blog/2026/01/images/ai-mcp-opcua.png diff --git a/src/blog/2026/01/images/ai-opcua-document-generation.jpg b/nuxt/public/blog/2026/01/images/ai-opcua-document-generation.jpg similarity index 100% rename from src/blog/2026/01/images/ai-opcua-document-generation.jpg rename to nuxt/public/blog/2026/01/images/ai-opcua-document-generation.jpg diff --git a/src/blog/2026/01/images/dev-pipeline.png b/nuxt/public/blog/2026/01/images/dev-pipeline.png similarity index 100% rename from src/blog/2026/01/images/dev-pipeline.png rename to nuxt/public/blog/2026/01/images/dev-pipeline.png diff --git a/src/blog/2026/01/images/early-node-red-screenshot.png b/nuxt/public/blog/2026/01/images/early-node-red-screenshot.png similarity index 100% rename from src/blog/2026/01/images/early-node-red-screenshot.png rename to nuxt/public/blog/2026/01/images/early-node-red-screenshot.png diff --git a/src/blog/2026/01/images/ff-expert-install-node.webm b/nuxt/public/blog/2026/01/images/ff-expert-install-node.webm similarity index 100% rename from src/blog/2026/01/images/ff-expert-install-node.webm rename to nuxt/public/blog/2026/01/images/ff-expert-install-node.webm diff --git a/src/blog/2026/01/images/git-stage-adding.png b/nuxt/public/blog/2026/01/images/git-stage-adding.png similarity index 100% rename from src/blog/2026/01/images/git-stage-adding.png rename to nuxt/public/blog/2026/01/images/git-stage-adding.png diff --git a/src/blog/2026/01/images/ibm-bluemix.png b/nuxt/public/blog/2026/01/images/ibm-bluemix.png similarity index 100% rename from src/blog/2026/01/images/ibm-bluemix.png rename to nuxt/public/blog/2026/01/images/ibm-bluemix.png diff --git a/src/blog/2026/01/images/integrate-nr-with-git.png b/nuxt/public/blog/2026/01/images/integrate-nr-with-git.png similarity index 100% rename from src/blog/2026/01/images/integrate-nr-with-git.png rename to nuxt/public/blog/2026/01/images/integrate-nr-with-git.png diff --git a/src/blog/2026/01/images/integrator-cta-1.png b/nuxt/public/blog/2026/01/images/integrator-cta-1.png similarity index 100% rename from src/blog/2026/01/images/integrator-cta-1.png rename to nuxt/public/blog/2026/01/images/integrator-cta-1.png diff --git a/src/blog/2026/01/images/kepware-alternative.png b/nuxt/public/blog/2026/01/images/kepware-alternative.png similarity index 100% rename from src/blog/2026/01/images/kepware-alternative.png rename to nuxt/public/blog/2026/01/images/kepware-alternative.png diff --git a/src/blog/2026/01/images/mcp-annotations.png b/nuxt/public/blog/2026/01/images/mcp-annotations.png similarity index 100% rename from src/blog/2026/01/images/mcp-annotations.png rename to nuxt/public/blog/2026/01/images/mcp-annotations.png diff --git a/src/blog/2026/01/images/nick-and-dave.png b/nuxt/public/blog/2026/01/images/nick-and-dave.png similarity index 100% rename from src/blog/2026/01/images/nick-and-dave.png rename to nuxt/public/blog/2026/01/images/nick-and-dave.png diff --git a/src/blog/2026/01/images/node-red-on-pi.jpg b/nuxt/public/blog/2026/01/images/node-red-on-pi.jpg similarity index 100% rename from src/blog/2026/01/images/node-red-on-pi.jpg rename to nuxt/public/blog/2026/01/images/node-red-on-pi.jpg diff --git a/src/blog/2026/01/images/node-red-story.png b/nuxt/public/blog/2026/01/images/node-red-story.png similarity index 100% rename from src/blog/2026/01/images/node-red-story.png rename to nuxt/public/blog/2026/01/images/node-red-story.png diff --git a/src/blog/2026/01/images/opcua-vs-mqtt.png b/nuxt/public/blog/2026/01/images/opcua-vs-mqtt.png similarity index 100% rename from src/blog/2026/01/images/opcua-vs-mqtt.png rename to nuxt/public/blog/2026/01/images/opcua-vs-mqtt.png diff --git a/src/blog/2026/01/images/release-2-26.png b/nuxt/public/blog/2026/01/images/release-2-26.png similarity index 100% rename from src/blog/2026/01/images/release-2-26.png rename to nuxt/public/blog/2026/01/images/release-2-26.png diff --git a/src/blog/2026/01/images/system-integrator-cta-1.png b/nuxt/public/blog/2026/01/images/system-integrator-cta-1.png similarity index 100% rename from src/blog/2026/01/images/system-integrator-cta-1.png rename to nuxt/public/blog/2026/01/images/system-integrator-cta-1.png diff --git a/src/blog/2026/01/images/sytem-integrator.png b/nuxt/public/blog/2026/01/images/sytem-integrator.png similarity index 100% rename from src/blog/2026/01/images/sytem-integrator.png rename to nuxt/public/blog/2026/01/images/sytem-integrator.png diff --git a/src/blog/2026/01/images/team-settings-integrations.png b/nuxt/public/blog/2026/01/images/team-settings-integrations.png similarity index 100% rename from src/blog/2026/01/images/team-settings-integrations.png rename to nuxt/public/blog/2026/01/images/team-settings-integrations.png diff --git a/src/blog/2026/01/images/why-modbus-wont-dia.png b/nuxt/public/blog/2026/01/images/why-modbus-wont-dia.png similarity index 100% rename from src/blog/2026/01/images/why-modbus-wont-dia.png rename to nuxt/public/blog/2026/01/images/why-modbus-wont-dia.png diff --git a/src/blog/2026/01/images/zj-and-nick.png b/nuxt/public/blog/2026/01/images/zj-and-nick.png similarity index 100% rename from src/blog/2026/01/images/zj-and-nick.png rename to nuxt/public/blog/2026/01/images/zj-and-nick.png diff --git a/src/blog/2026/02/images/ai-nodes.png b/nuxt/public/blog/2026/02/images/ai-nodes.png similarity index 100% rename from src/blog/2026/02/images/ai-nodes.png rename to nuxt/public/blog/2026/02/images/ai-nodes.png diff --git a/src/blog/2026/02/images/anomaly-detection.png b/nuxt/public/blog/2026/02/images/anomaly-detection.png similarity index 100% rename from src/blog/2026/02/images/anomaly-detection.png rename to nuxt/public/blog/2026/02/images/anomaly-detection.png diff --git a/src/blog/2026/02/images/can-bus-cta-2.png b/nuxt/public/blog/2026/02/images/can-bus-cta-2.png similarity index 100% rename from src/blog/2026/02/images/can-bus-cta-2.png rename to nuxt/public/blog/2026/02/images/can-bus-cta-2.png diff --git a/src/blog/2026/02/images/canbus-tutorial.png b/nuxt/public/blog/2026/02/images/canbus-tutorial.png similarity index 100% rename from src/blog/2026/02/images/canbus-tutorial.png rename to nuxt/public/blog/2026/02/images/canbus-tutorial.png diff --git a/src/blog/2026/02/images/change-node-influxdb-influxdb-transform.png b/nuxt/public/blog/2026/02/images/change-node-influxdb-influxdb-transform.png similarity index 100% rename from src/blog/2026/02/images/change-node-influxdb-influxdb-transform.png rename to nuxt/public/blog/2026/02/images/change-node-influxdb-influxdb-transform.png diff --git a/src/blog/2026/02/images/coap-vs-mqtt.png b/nuxt/public/blog/2026/02/images/coap-vs-mqtt.png similarity index 100% rename from src/blog/2026/02/images/coap-vs-mqtt.png rename to nuxt/public/blog/2026/02/images/coap-vs-mqtt.png diff --git a/src/blog/2026/02/images/dashboard-with-mtconnect-agent-digital-twin.webm b/nuxt/public/blog/2026/02/images/dashboard-with-mtconnect-agent-digital-twin.webm similarity index 100% rename from src/blog/2026/02/images/dashboard-with-mtconnect-agent-digital-twin.webm rename to nuxt/public/blog/2026/02/images/dashboard-with-mtconnect-agent-digital-twin.webm diff --git a/src/blog/2026/02/images/debug-output-can-message.png b/nuxt/public/blog/2026/02/images/debug-output-can-message.png similarity index 100% rename from src/blog/2026/02/images/debug-output-can-message.png rename to nuxt/public/blog/2026/02/images/debug-output-can-message.png diff --git a/src/blog/2026/02/images/edge-ai-is-80-20.png b/nuxt/public/blog/2026/02/images/edge-ai-is-80-20.png similarity index 100% rename from src/blog/2026/02/images/edge-ai-is-80-20.png rename to nuxt/public/blog/2026/02/images/edge-ai-is-80-20.png diff --git a/src/blog/2026/02/images/event-driven-architecture.png b/nuxt/public/blog/2026/02/images/event-driven-architecture.png similarity index 100% rename from src/blog/2026/02/images/event-driven-architecture.png rename to nuxt/public/blog/2026/02/images/event-driven-architecture.png diff --git a/src/blog/2026/02/images/ff-expert-palette-context.webm b/nuxt/public/blog/2026/02/images/ff-expert-palette-context.webm similarity index 100% rename from src/blog/2026/02/images/ff-expert-palette-context.webm rename to nuxt/public/blog/2026/02/images/ff-expert-palette-context.webm diff --git a/src/blog/2026/02/images/ff-to-canbus.png b/nuxt/public/blog/2026/02/images/ff-to-canbus.png similarity index 100% rename from src/blog/2026/02/images/ff-to-canbus.png rename to nuxt/public/blog/2026/02/images/ff-to-canbus.png diff --git a/src/blog/2026/02/images/flow.png b/nuxt/public/blog/2026/02/images/flow.png similarity index 100% rename from src/blog/2026/02/images/flow.png rename to nuxt/public/blog/2026/02/images/flow.png diff --git a/src/blog/2026/02/images/flowfuse-release-2-27.png b/nuxt/public/blog/2026/02/images/flowfuse-release-2-27.png similarity index 100% rename from src/blog/2026/02/images/flowfuse-release-2-27.png rename to nuxt/public/blog/2026/02/images/flowfuse-release-2-27.png diff --git a/src/blog/2026/02/images/gauge.png b/nuxt/public/blog/2026/02/images/gauge.png similarity index 100% rename from src/blog/2026/02/images/gauge.png rename to nuxt/public/blog/2026/02/images/gauge.png diff --git a/src/blog/2026/02/images/influxdb--config.png b/nuxt/public/blog/2026/02/images/influxdb--config.png similarity index 100% rename from src/blog/2026/02/images/influxdb--config.png rename to nuxt/public/blog/2026/02/images/influxdb--config.png diff --git a/src/blog/2026/02/images/influxdb-node.png b/nuxt/public/blog/2026/02/images/influxdb-node.png similarity index 100% rename from src/blog/2026/02/images/influxdb-node.png rename to nuxt/public/blog/2026/02/images/influxdb-node.png diff --git a/src/blog/2026/02/images/influxdb-nodes.png b/nuxt/public/blog/2026/02/images/influxdb-nodes.png similarity index 100% rename from src/blog/2026/02/images/influxdb-nodes.png rename to nuxt/public/blog/2026/02/images/influxdb-nodes.png diff --git a/src/blog/2026/02/images/modbus-rtu-and-tcp-physical-layer.png b/nuxt/public/blog/2026/02/images/modbus-rtu-and-tcp-physical-layer.png similarity index 100% rename from src/blog/2026/02/images/modbus-rtu-and-tcp-physical-layer.png rename to nuxt/public/blog/2026/02/images/modbus-rtu-and-tcp-physical-layer.png diff --git a/src/blog/2026/02/images/modbus-rtu-tcp-latency.png b/nuxt/public/blog/2026/02/images/modbus-rtu-tcp-latency.png similarity index 100% rename from src/blog/2026/02/images/modbus-rtu-tcp-latency.png rename to nuxt/public/blog/2026/02/images/modbus-rtu-tcp-latency.png diff --git a/src/blog/2026/02/images/modbus-rtu-vs-tcp.png b/nuxt/public/blog/2026/02/images/modbus-rtu-vs-tcp.png similarity index 100% rename from src/blog/2026/02/images/modbus-rtu-vs-tcp.png rename to nuxt/public/blog/2026/02/images/modbus-rtu-vs-tcp.png diff --git a/src/blog/2026/02/images/modbus-tcp-open-connection-failure.png b/nuxt/public/blog/2026/02/images/modbus-tcp-open-connection-failure.png similarity index 100% rename from src/blog/2026/02/images/modbus-tcp-open-connection-failure.png rename to nuxt/public/blog/2026/02/images/modbus-tcp-open-connection-failure.png diff --git a/src/blog/2026/02/images/motor-anomaly-detection-ai.png b/nuxt/public/blog/2026/02/images/motor-anomaly-detection-ai.png similarity index 100% rename from src/blog/2026/02/images/motor-anomaly-detection-ai.png rename to nuxt/public/blog/2026/02/images/motor-anomaly-detection-ai.png diff --git a/src/blog/2026/02/images/mqtt--in.png b/nuxt/public/blog/2026/02/images/mqtt--in.png similarity index 100% rename from src/blog/2026/02/images/mqtt--in.png rename to nuxt/public/blog/2026/02/images/mqtt--in.png diff --git a/src/blog/2026/02/images/mqtt-config.png b/nuxt/public/blog/2026/02/images/mqtt-config.png similarity index 100% rename from src/blog/2026/02/images/mqtt-config.png rename to nuxt/public/blog/2026/02/images/mqtt-config.png diff --git a/src/blog/2026/02/images/mqtt-in--config.png b/nuxt/public/blog/2026/02/images/mqtt-in--config.png similarity index 100% rename from src/blog/2026/02/images/mqtt-in--config.png rename to nuxt/public/blog/2026/02/images/mqtt-in--config.png diff --git a/src/blog/2026/02/images/mqtt-in--security.png b/nuxt/public/blog/2026/02/images/mqtt-in--security.png similarity index 100% rename from src/blog/2026/02/images/mqtt-in--security.png rename to nuxt/public/blog/2026/02/images/mqtt-in--security.png diff --git a/src/blog/2026/02/images/mqtt-to--influxdb-architecture.png b/nuxt/public/blog/2026/02/images/mqtt-to--influxdb-architecture.png similarity index 100% rename from src/blog/2026/02/images/mqtt-to--influxdb-architecture.png rename to nuxt/public/blog/2026/02/images/mqtt-to--influxdb-architecture.png diff --git a/src/blog/2026/02/images/mqtt-to-influxdb-cta-1.png b/nuxt/public/blog/2026/02/images/mqtt-to-influxdb-cta-1.png similarity index 100% rename from src/blog/2026/02/images/mqtt-to-influxdb-cta-1.png rename to nuxt/public/blog/2026/02/images/mqtt-to-influxdb-cta-1.png diff --git a/src/blog/2026/02/images/mqtt-to-influxdb.png b/nuxt/public/blog/2026/02/images/mqtt-to-influxdb.png similarity index 100% rename from src/blog/2026/02/images/mqtt-to-influxdb.png rename to nuxt/public/blog/2026/02/images/mqtt-to-influxdb.png diff --git a/src/blog/2026/02/images/mqtt-vs-coap-cta-1.png b/nuxt/public/blog/2026/02/images/mqtt-vs-coap-cta-1.png similarity index 100% rename from src/blog/2026/02/images/mqtt-vs-coap-cta-1.png rename to nuxt/public/blog/2026/02/images/mqtt-vs-coap-cta-1.png diff --git a/src/blog/2026/02/images/mqtt-vs-coap-cta-2.png b/nuxt/public/blog/2026/02/images/mqtt-vs-coap-cta-2.png similarity index 100% rename from src/blog/2026/02/images/mqtt-vs-coap-cta-2.png rename to nuxt/public/blog/2026/02/images/mqtt-vs-coap-cta-2.png diff --git a/src/blog/2026/02/images/mtconnect.png b/nuxt/public/blog/2026/02/images/mtconnect.png similarity index 100% rename from src/blog/2026/02/images/mtconnect.png rename to nuxt/public/blog/2026/02/images/mtconnect.png diff --git a/src/blog/2026/02/images/output.png b/nuxt/public/blog/2026/02/images/output.png similarity index 100% rename from src/blog/2026/02/images/output.png rename to nuxt/public/blog/2026/02/images/output.png diff --git a/src/blog/2026/02/images/polling-vs-eda.png b/nuxt/public/blog/2026/02/images/polling-vs-eda.png similarity index 100% rename from src/blog/2026/02/images/polling-vs-eda.png rename to nuxt/public/blog/2026/02/images/polling-vs-eda.png diff --git a/src/blog/2026/02/images/receiving-can.png b/nuxt/public/blog/2026/02/images/receiving-can.png similarity index 100% rename from src/blog/2026/02/images/receiving-can.png rename to nuxt/public/blog/2026/02/images/receiving-can.png diff --git a/src/blog/2026/02/images/remote-instance-immersive.webm b/nuxt/public/blog/2026/02/images/remote-instance-immersive.webm similarity index 100% rename from src/blog/2026/02/images/remote-instance-immersive.webm rename to nuxt/public/blog/2026/02/images/remote-instance-immersive.webm diff --git a/src/blog/2026/02/images/shopfloor-to-ai.png b/nuxt/public/blog/2026/02/images/shopfloor-to-ai.png similarity index 100% rename from src/blog/2026/02/images/shopfloor-to-ai.png rename to nuxt/public/blog/2026/02/images/shopfloor-to-ai.png diff --git a/src/blog/2026/02/images/snapshot-restore.png b/nuxt/public/blog/2026/02/images/snapshot-restore.png similarity index 100% rename from src/blog/2026/02/images/snapshot-restore.png rename to nuxt/public/blog/2026/02/images/snapshot-restore.png diff --git a/src/blog/2026/02/images/socket-can-cta-1.png b/nuxt/public/blog/2026/02/images/socket-can-cta-1.png similarity index 100% rename from src/blog/2026/02/images/socket-can-cta-1.png rename to nuxt/public/blog/2026/02/images/socket-can-cta-1.png diff --git a/src/blog/2026/02/images/text-widget.png b/nuxt/public/blog/2026/02/images/text-widget.png similarity index 100% rename from src/blog/2026/02/images/text-widget.png rename to nuxt/public/blog/2026/02/images/text-widget.png diff --git a/src/blog/2026/02/images/transmitting-can.png b/nuxt/public/blog/2026/02/images/transmitting-can.png similarity index 100% rename from src/blog/2026/02/images/transmitting-can.png rename to nuxt/public/blog/2026/02/images/transmitting-can.png diff --git a/src/blog/2026/03/images/Twincat-config-required-fields.png b/nuxt/public/blog/2026/03/images/Twincat-config-required-fields.png similarity index 100% rename from src/blog/2026/03/images/Twincat-config-required-fields.png rename to nuxt/public/blog/2026/03/images/Twincat-config-required-fields.png diff --git a/src/blog/2026/03/images/ads-read-value.png b/nuxt/public/blog/2026/03/images/ads-read-value.png similarity index 100% rename from src/blog/2026/03/images/ads-read-value.png rename to nuxt/public/blog/2026/03/images/ads-read-value.png diff --git a/src/blog/2026/03/images/ads-read.png b/nuxt/public/blog/2026/03/images/ads-read.png similarity index 100% rename from src/blog/2026/03/images/ads-read.png rename to nuxt/public/blog/2026/03/images/ads-read.png diff --git a/src/blog/2026/03/images/ads-subscribe-image.png b/nuxt/public/blog/2026/03/images/ads-subscribe-image.png similarity index 100% rename from src/blog/2026/03/images/ads-subscribe-image.png rename to nuxt/public/blog/2026/03/images/ads-subscribe-image.png diff --git a/src/blog/2026/03/images/ads-subscribe.png b/nuxt/public/blog/2026/03/images/ads-subscribe.png similarity index 100% rename from src/blog/2026/03/images/ads-subscribe.png rename to nuxt/public/blog/2026/03/images/ads-subscribe.png diff --git a/src/blog/2026/03/images/ads-write-image.png b/nuxt/public/blog/2026/03/images/ads-write-image.png similarity index 100% rename from src/blog/2026/03/images/ads-write-image.png rename to nuxt/public/blog/2026/03/images/ads-write-image.png diff --git a/src/blog/2026/03/images/ads-write.png b/nuxt/public/blog/2026/03/images/ads-write.png similarity index 100% rename from src/blog/2026/03/images/ads-write.png rename to nuxt/public/blog/2026/03/images/ads-write.png diff --git a/src/blog/2026/03/images/ai-use-case.png b/nuxt/public/blog/2026/03/images/ai-use-case.png similarity index 100% rename from src/blog/2026/03/images/ai-use-case.png rename to nuxt/public/blog/2026/03/images/ai-use-case.png diff --git a/src/blog/2026/03/images/backoff-twincat.png b/nuxt/public/blog/2026/03/images/backoff-twincat.png similarity index 100% rename from src/blog/2026/03/images/backoff-twincat.png rename to nuxt/public/blog/2026/03/images/backoff-twincat.png diff --git a/src/blog/2026/03/images/buffer-parser.png b/nuxt/public/blog/2026/03/images/buffer-parser.png similarity index 100% rename from src/blog/2026/03/images/buffer-parser.png rename to nuxt/public/blog/2026/03/images/buffer-parser.png diff --git a/src/blog/2026/03/images/bus-factor-problem-tile-image.png b/nuxt/public/blog/2026/03/images/bus-factor-problem-tile-image.png similarity index 100% rename from src/blog/2026/03/images/bus-factor-problem-tile-image.png rename to nuxt/public/blog/2026/03/images/bus-factor-problem-tile-image.png diff --git a/src/blog/2026/03/images/connection-status.png b/nuxt/public/blog/2026/03/images/connection-status.png similarity index 100% rename from src/blog/2026/03/images/connection-status.png rename to nuxt/public/blog/2026/03/images/connection-status.png diff --git a/src/blog/2026/03/images/create-symbol.png b/nuxt/public/blog/2026/03/images/create-symbol.png similarity index 100% rename from src/blog/2026/03/images/create-symbol.png rename to nuxt/public/blog/2026/03/images/create-symbol.png diff --git a/src/blog/2026/03/images/debug-expert.png b/nuxt/public/blog/2026/03/images/debug-expert.png similarity index 100% rename from src/blog/2026/03/images/debug-expert.png rename to nuxt/public/blog/2026/03/images/debug-expert.png diff --git a/src/blog/2026/03/images/dlq-blog-tile.png b/nuxt/public/blog/2026/03/images/dlq-blog-tile.png similarity index 100% rename from src/blog/2026/03/images/dlq-blog-tile.png rename to nuxt/public/blog/2026/03/images/dlq-blog-tile.png diff --git a/src/blog/2026/03/images/edge-ai-vs-cloud-ai.png b/nuxt/public/blog/2026/03/images/edge-ai-vs-cloud-ai.png similarity index 100% rename from src/blog/2026/03/images/edge-ai-vs-cloud-ai.png rename to nuxt/public/blog/2026/03/images/edge-ai-vs-cloud-ai.png diff --git a/src/blog/2026/03/images/enterprise-pillars-cert-nodes.png b/nuxt/public/blog/2026/03/images/enterprise-pillars-cert-nodes.png similarity index 100% rename from src/blog/2026/03/images/enterprise-pillars-cert-nodes.png rename to nuxt/public/blog/2026/03/images/enterprise-pillars-cert-nodes.png diff --git a/src/blog/2026/03/images/expert-update-banner.png b/nuxt/public/blog/2026/03/images/expert-update-banner.png similarity index 100% rename from src/blog/2026/03/images/expert-update-banner.png rename to nuxt/public/blog/2026/03/images/expert-update-banner.png diff --git a/src/blog/2026/03/images/ff-expert-explaining-flow.jpeg b/nuxt/public/blog/2026/03/images/ff-expert-explaining-flow.jpeg similarity index 100% rename from src/blog/2026/03/images/ff-expert-explaining-flow.jpeg rename to nuxt/public/blog/2026/03/images/ff-expert-explaining-flow.jpeg diff --git a/src/blog/2026/03/images/flowfuse-release-2-28.png b/nuxt/public/blog/2026/03/images/flowfuse-release-2-28.png similarity index 100% rename from src/blog/2026/03/images/flowfuse-release-2-28.png rename to nuxt/public/blog/2026/03/images/flowfuse-release-2-28.png diff --git a/src/blog/2026/03/images/integration-systems-black-box.png b/nuxt/public/blog/2026/03/images/integration-systems-black-box.png similarity index 100% rename from src/blog/2026/03/images/integration-systems-black-box.png rename to nuxt/public/blog/2026/03/images/integration-systems-black-box.png diff --git a/src/blog/2026/03/images/isa95_flowfuse_final_v4.svg b/nuxt/public/blog/2026/03/images/isa95_flowfuse_final_v4.svg similarity index 100% rename from src/blog/2026/03/images/isa95_flowfuse_final_v4.svg rename to nuxt/public/blog/2026/03/images/isa95_flowfuse_final_v4.svg diff --git a/src/blog/2026/03/images/last-mile-problem-ai.png b/nuxt/public/blog/2026/03/images/last-mile-problem-ai.png similarity index 100% rename from src/blog/2026/03/images/last-mile-problem-ai.png rename to nuxt/public/blog/2026/03/images/last-mile-problem-ai.png diff --git a/src/blog/2026/03/images/opcua-is-not-replacing-modbus-yet.png b/nuxt/public/blog/2026/03/images/opcua-is-not-replacing-modbus-yet.png similarity index 100% rename from src/blog/2026/03/images/opcua-is-not-replacing-modbus-yet.png rename to nuxt/public/blog/2026/03/images/opcua-is-not-replacing-modbus-yet.png diff --git a/src/blog/2026/03/images/parse-binary-data-2.png b/nuxt/public/blog/2026/03/images/parse-binary-data-2.png similarity index 100% rename from src/blog/2026/03/images/parse-binary-data-2.png rename to nuxt/public/blog/2026/03/images/parse-binary-data-2.png diff --git a/src/blog/2026/03/images/rethinking-edge-ais-core-orchestration-diagram.png b/nuxt/public/blog/2026/03/images/rethinking-edge-ais-core-orchestration-diagram.png similarity index 100% rename from src/blog/2026/03/images/rethinking-edge-ais-core-orchestration-diagram.png rename to nuxt/public/blog/2026/03/images/rethinking-edge-ais-core-orchestration-diagram.png diff --git a/src/blog/2026/03/images/rethinking-edge-ais-core-orchestration.png b/nuxt/public/blog/2026/03/images/rethinking-edge-ais-core-orchestration.png similarity index 100% rename from src/blog/2026/03/images/rethinking-edge-ais-core-orchestration.png rename to nuxt/public/blog/2026/03/images/rethinking-edge-ais-core-orchestration.png diff --git a/src/blog/2026/03/images/snmp-nodes.png b/nuxt/public/blog/2026/03/images/snmp-nodes.png similarity index 100% rename from src/blog/2026/03/images/snmp-nodes.png rename to nuxt/public/blog/2026/03/images/snmp-nodes.png diff --git a/src/blog/2026/03/images/snmp-tile.png b/nuxt/public/blog/2026/03/images/snmp-tile.png similarity index 100% rename from src/blog/2026/03/images/snmp-tile.png rename to nuxt/public/blog/2026/03/images/snmp-tile.png diff --git a/src/blog/2026/03/images/twincat-ads-nodes.png b/nuxt/public/blog/2026/03/images/twincat-ads-nodes.png similarity index 100% rename from src/blog/2026/03/images/twincat-ads-nodes.png rename to nuxt/public/blog/2026/03/images/twincat-ads-nodes.png diff --git a/src/blog/2026/03/images/twincat-config-optional-tab.png b/nuxt/public/blog/2026/03/images/twincat-config-optional-tab.png similarity index 100% rename from src/blog/2026/03/images/twincat-config-optional-tab.png rename to nuxt/public/blog/2026/03/images/twincat-config-optional-tab.png diff --git a/src/blog/2026/04/images/Connection-tab.png b/nuxt/public/blog/2026/04/images/Connection-tab.png similarity index 100% rename from src/blog/2026/04/images/Connection-tab.png rename to nuxt/public/blog/2026/04/images/Connection-tab.png diff --git a/src/blog/2026/04/images/aws-console-1-step.png b/nuxt/public/blog/2026/04/images/aws-console-1-step.png similarity index 100% rename from src/blog/2026/04/images/aws-console-1-step.png rename to nuxt/public/blog/2026/04/images/aws-console-1-step.png diff --git a/src/blog/2026/04/images/aws-console-2-step.png b/nuxt/public/blog/2026/04/images/aws-console-2-step.png similarity index 100% rename from src/blog/2026/04/images/aws-console-2-step.png rename to nuxt/public/blog/2026/04/images/aws-console-2-step.png diff --git a/src/blog/2026/04/images/aws-console-3-step.png b/nuxt/public/blog/2026/04/images/aws-console-3-step.png similarity index 100% rename from src/blog/2026/04/images/aws-console-3-step.png rename to nuxt/public/blog/2026/04/images/aws-console-3-step.png diff --git a/src/blog/2026/04/images/aws-console-4-step.png b/nuxt/public/blog/2026/04/images/aws-console-4-step.png similarity index 100% rename from src/blog/2026/04/images/aws-console-4-step.png rename to nuxt/public/blog/2026/04/images/aws-console-4-step.png diff --git a/src/blog/2026/04/images/aws-console-5-step.png b/nuxt/public/blog/2026/04/images/aws-console-5-step.png similarity index 100% rename from src/blog/2026/04/images/aws-console-5-step.png rename to nuxt/public/blog/2026/04/images/aws-console-5-step.png diff --git a/src/blog/2026/04/images/aws-console-6-step.png b/nuxt/public/blog/2026/04/images/aws-console-6-step.png similarity index 100% rename from src/blog/2026/04/images/aws-console-6-step.png rename to nuxt/public/blog/2026/04/images/aws-console-6-step.png diff --git a/src/blog/2026/04/images/aws-console-7-step.png b/nuxt/public/blog/2026/04/images/aws-console-7-step.png similarity index 100% rename from src/blog/2026/04/images/aws-console-7-step.png rename to nuxt/public/blog/2026/04/images/aws-console-7-step.png diff --git a/src/blog/2026/04/images/aws-console-8-step.png b/nuxt/public/blog/2026/04/images/aws-console-8-step.png similarity index 100% rename from src/blog/2026/04/images/aws-console-8-step.png rename to nuxt/public/blog/2026/04/images/aws-console-8-step.png diff --git a/src/blog/2026/04/images/chart-with-deadband-and-without-it.png b/nuxt/public/blog/2026/04/images/chart-with-deadband-and-without-it.png similarity index 100% rename from src/blog/2026/04/images/chart-with-deadband-and-without-it.png rename to nuxt/public/blog/2026/04/images/chart-with-deadband-and-without-it.png diff --git a/src/blog/2026/04/images/common-language-three-parts.png b/nuxt/public/blog/2026/04/images/common-language-three-parts.png similarity index 100% rename from src/blog/2026/04/images/common-language-three-parts.png rename to nuxt/public/blog/2026/04/images/common-language-three-parts.png diff --git a/src/blog/2026/04/images/deadband-filter-how-it-works.png b/nuxt/public/blog/2026/04/images/deadband-filter-how-it-works.png similarity index 100% rename from src/blog/2026/04/images/deadband-filter-how-it-works.png rename to nuxt/public/blog/2026/04/images/deadband-filter-how-it-works.png diff --git a/src/blog/2026/04/images/deadband-filter.png b/nuxt/public/blog/2026/04/images/deadband-filter.png similarity index 100% rename from src/blog/2026/04/images/deadband-filter.png rename to nuxt/public/blog/2026/04/images/deadband-filter.png diff --git a/src/blog/2026/04/images/deployment-decision-tree.png b/nuxt/public/blog/2026/04/images/deployment-decision-tree.png similarity index 100% rename from src/blog/2026/04/images/deployment-decision-tree.png rename to nuxt/public/blog/2026/04/images/deployment-decision-tree.png diff --git a/src/blog/2026/04/images/deployment_models.svg b/nuxt/public/blog/2026/04/images/deployment_models.svg similarity index 100% rename from src/blog/2026/04/images/deployment_models.svg rename to nuxt/public/blog/2026/04/images/deployment_models.svg diff --git a/src/blog/2026/04/images/edge-aws-iot-core.png b/nuxt/public/blog/2026/04/images/edge-aws-iot-core.png similarity index 100% rename from src/blog/2026/04/images/edge-aws-iot-core.png rename to nuxt/public/blog/2026/04/images/edge-aws-iot-core.png diff --git a/src/blog/2026/04/images/edge-cloud-or-both.png b/nuxt/public/blog/2026/04/images/edge-cloud-or-both.png similarity index 100% rename from src/blog/2026/04/images/edge-cloud-or-both.png rename to nuxt/public/blog/2026/04/images/edge-cloud-or-both.png diff --git a/src/blog/2026/04/images/exception-table-modbus.png b/nuxt/public/blog/2026/04/images/exception-table-modbus.png similarity index 100% rename from src/blog/2026/04/images/exception-table-modbus.png rename to nuxt/public/blog/2026/04/images/exception-table-modbus.png diff --git a/src/blog/2026/04/images/expert-action-links.webm b/nuxt/public/blog/2026/04/images/expert-action-links.webm similarity index 100% rename from src/blog/2026/04/images/expert-action-links.webm rename to nuxt/public/blog/2026/04/images/expert-action-links.webm diff --git a/src/blog/2026/04/images/filter-node-deadband.png b/nuxt/public/blog/2026/04/images/filter-node-deadband.png similarity index 100% rename from src/blog/2026/04/images/filter-node-deadband.png rename to nuxt/public/blog/2026/04/images/filter-node-deadband.png diff --git a/src/blog/2026/04/images/flowfuse-release-2-29.png b/nuxt/public/blog/2026/04/images/flowfuse-release-2-29.png similarity index 100% rename from src/blog/2026/04/images/flowfuse-release-2-29.png rename to nuxt/public/blog/2026/04/images/flowfuse-release-2-29.png diff --git a/src/blog/2026/04/images/flowfuse-to-aws.webm b/nuxt/public/blog/2026/04/images/flowfuse-to-aws.webm similarity index 100% rename from src/blog/2026/04/images/flowfuse-to-aws.webm rename to nuxt/public/blog/2026/04/images/flowfuse-to-aws.webm diff --git a/src/blog/2026/04/images/flowfuse-uns.png b/nuxt/public/blog/2026/04/images/flowfuse-uns.png similarity index 100% rename from src/blog/2026/04/images/flowfuse-uns.png rename to nuxt/public/blog/2026/04/images/flowfuse-uns.png diff --git a/src/blog/2026/04/images/hybrid-architecture.png b/nuxt/public/blog/2026/04/images/hybrid-architecture.png similarity index 100% rename from src/blog/2026/04/images/hybrid-architecture.png rename to nuxt/public/blog/2026/04/images/hybrid-architecture.png diff --git a/src/blog/2026/04/images/it-vs-ot-who-owns-the-edge.png b/nuxt/public/blog/2026/04/images/it-vs-ot-who-owns-the-edge.png similarity index 100% rename from src/blog/2026/04/images/it-vs-ot-who-owns-the-edge.png rename to nuxt/public/blog/2026/04/images/it-vs-ot-who-owns-the-edge.png diff --git a/src/blog/2026/04/images/modbus-degradation-img.png b/nuxt/public/blog/2026/04/images/modbus-degradation-img.png similarity index 100% rename from src/blog/2026/04/images/modbus-degradation-img.png rename to nuxt/public/blog/2026/04/images/modbus-degradation-img.png diff --git a/src/blog/2026/04/images/modbus-poll-cycle-dead-time.png b/nuxt/public/blog/2026/04/images/modbus-poll-cycle-dead-time.png similarity index 100% rename from src/blog/2026/04/images/modbus-poll-cycle-dead-time.png rename to nuxt/public/blog/2026/04/images/modbus-poll-cycle-dead-time.png diff --git a/src/blog/2026/04/images/modbus-polling-best-practices.jpg b/nuxt/public/blog/2026/04/images/modbus-polling-best-practices.jpg similarity index 100% rename from src/blog/2026/04/images/modbus-polling-best-practices.jpg rename to nuxt/public/blog/2026/04/images/modbus-polling-best-practices.jpg diff --git a/src/blog/2026/04/images/modbus-rtu-and-tcp-physical-layer-image.png b/nuxt/public/blog/2026/04/images/modbus-rtu-and-tcp-physical-layer-image.png similarity index 100% rename from src/blog/2026/04/images/modbus-rtu-and-tcp-physical-layer-image.png rename to nuxt/public/blog/2026/04/images/modbus-rtu-and-tcp-physical-layer-image.png diff --git a/src/blog/2026/04/images/modbus-tcp-connection-cycle.png b/nuxt/public/blog/2026/04/images/modbus-tcp-connection-cycle.png similarity index 100% rename from src/blog/2026/04/images/modbus-tcp-connection-cycle.png rename to nuxt/public/blog/2026/04/images/modbus-tcp-connection-cycle.png diff --git a/src/blog/2026/04/images/mqtt-out-aws-endpoint.png b/nuxt/public/blog/2026/04/images/mqtt-out-aws-endpoint.png similarity index 100% rename from src/blog/2026/04/images/mqtt-out-aws-endpoint.png rename to nuxt/public/blog/2026/04/images/mqtt-out-aws-endpoint.png diff --git a/src/blog/2026/04/images/mqtt-out.png b/nuxt/public/blog/2026/04/images/mqtt-out.png similarity index 100% rename from src/blog/2026/04/images/mqtt-out.png rename to nuxt/public/blog/2026/04/images/mqtt-out.png diff --git a/src/blog/2026/04/images/noisy-sensor-simulation.png b/nuxt/public/blog/2026/04/images/noisy-sensor-simulation.png similarity index 100% rename from src/blog/2026/04/images/noisy-sensor-simulation.png rename to nuxt/public/blog/2026/04/images/noisy-sensor-simulation.png diff --git a/src/blog/2026/04/images/one-event-four-diffrent-records.png b/nuxt/public/blog/2026/04/images/one-event-four-diffrent-records.png similarity index 100% rename from src/blog/2026/04/images/one-event-four-diffrent-records.png rename to nuxt/public/blog/2026/04/images/one-event-four-diffrent-records.png diff --git a/src/blog/2026/04/images/point-to-point-vs-one-reference-point.png b/nuxt/public/blog/2026/04/images/point-to-point-vs-one-reference-point.png similarity index 100% rename from src/blog/2026/04/images/point-to-point-vs-one-reference-point.png rename to nuxt/public/blog/2026/04/images/point-to-point-vs-one-reference-point.png diff --git a/src/blog/2026/04/images/power-of-single-reference-point.png b/nuxt/public/blog/2026/04/images/power-of-single-reference-point.png similarity index 100% rename from src/blog/2026/04/images/power-of-single-reference-point.png rename to nuxt/public/blog/2026/04/images/power-of-single-reference-point.png diff --git a/src/blog/2026/04/images/rosetta-stone.jpg b/nuxt/public/blog/2026/04/images/rosetta-stone.jpg similarity index 100% rename from src/blog/2026/04/images/rosetta-stone.jpg rename to nuxt/public/blog/2026/04/images/rosetta-stone.jpg diff --git a/src/blog/2026/04/images/rosseta-stone-for-factories.png b/nuxt/public/blog/2026/04/images/rosseta-stone-for-factories.png similarity index 100% rename from src/blog/2026/04/images/rosseta-stone-for-factories.png rename to nuxt/public/blog/2026/04/images/rosseta-stone-for-factories.png diff --git a/src/blog/2026/04/images/snapshot-comparision-view-2.29.png b/nuxt/public/blog/2026/04/images/snapshot-comparision-view-2.29.png similarity index 100% rename from src/blog/2026/04/images/snapshot-comparision-view-2.29.png rename to nuxt/public/blog/2026/04/images/snapshot-comparision-view-2.29.png diff --git a/src/blog/2026/04/images/stop-noisy-sensor-data.png b/nuxt/public/blog/2026/04/images/stop-noisy-sensor-data.png similarity index 100% rename from src/blog/2026/04/images/stop-noisy-sensor-data.png rename to nuxt/public/blog/2026/04/images/stop-noisy-sensor-data.png diff --git a/src/blog/2026/04/images/the-real-cost-of-overengineered-systems.png b/nuxt/public/blog/2026/04/images/the-real-cost-of-overengineered-systems.png similarity index 100% rename from src/blog/2026/04/images/the-real-cost-of-overengineered-systems.png rename to nuxt/public/blog/2026/04/images/the-real-cost-of-overengineered-systems.png diff --git a/src/blog/2026/04/images/tls-config.png b/nuxt/public/blog/2026/04/images/tls-config.png similarity index 100% rename from src/blog/2026/04/images/tls-config.png rename to nuxt/public/blog/2026/04/images/tls-config.png diff --git a/src/blog/2026/05/images/all-or-nothing-manufacturing-software.png b/nuxt/public/blog/2026/05/images/all-or-nothing-manufacturing-software.png similarity index 100% rename from src/blog/2026/05/images/all-or-nothing-manufacturing-software.png rename to nuxt/public/blog/2026/05/images/all-or-nothing-manufacturing-software.png diff --git a/src/blog/2026/05/images/expert-application-building.webm b/nuxt/public/blog/2026/05/images/expert-application-building.webm similarity index 100% rename from src/blog/2026/05/images/expert-application-building.webm rename to nuxt/public/blog/2026/05/images/expert-application-building.webm diff --git a/src/blog/2026/05/images/flowfuse-ai-expert-tile.png b/nuxt/public/blog/2026/05/images/flowfuse-ai-expert-tile.png similarity index 100% rename from src/blog/2026/05/images/flowfuse-ai-expert-tile.png rename to nuxt/public/blog/2026/05/images/flowfuse-ai-expert-tile.png diff --git a/src/blog/2026/05/images/flowfuse-expert-building-flow.jpg b/nuxt/public/blog/2026/05/images/flowfuse-expert-building-flow.jpg similarity index 100% rename from src/blog/2026/05/images/flowfuse-expert-building-flow.jpg rename to nuxt/public/blog/2026/05/images/flowfuse-expert-building-flow.jpg diff --git a/src/blog/2026/05/images/flowfuse-release-2-30.png b/nuxt/public/blog/2026/05/images/flowfuse-release-2-30.png similarity index 100% rename from src/blog/2026/05/images/flowfuse-release-2-30.png rename to nuxt/public/blog/2026/05/images/flowfuse-release-2-30.png diff --git a/src/blog/2026/05/images/moc-to-deployment.png b/nuxt/public/blog/2026/05/images/moc-to-deployment.png similarity index 100% rename from src/blog/2026/05/images/moc-to-deployment.png rename to nuxt/public/blog/2026/05/images/moc-to-deployment.png diff --git a/src/blog/2026/05/images/moc-with-snapshot.png b/nuxt/public/blog/2026/05/images/moc-with-snapshot.png similarity index 100% rename from src/blog/2026/05/images/moc-with-snapshot.png rename to nuxt/public/blog/2026/05/images/moc-with-snapshot.png diff --git a/src/blog/2026/05/images/nis2-complience-for-manufacturer-image.png b/nuxt/public/blog/2026/05/images/nis2-complience-for-manufacturer-image.png similarity index 100% rename from src/blog/2026/05/images/nis2-complience-for-manufacturer-image.png rename to nuxt/public/blog/2026/05/images/nis2-complience-for-manufacturer-image.png diff --git a/src/blog/2026/05/images/oee-cta-1.png b/nuxt/public/blog/2026/05/images/oee-cta-1.png similarity index 100% rename from src/blog/2026/05/images/oee-cta-1.png rename to nuxt/public/blog/2026/05/images/oee-cta-1.png diff --git a/src/blog/2026/05/images/oee-is-misleading.png b/nuxt/public/blog/2026/05/images/oee-is-misleading.png similarity index 100% rename from src/blog/2026/05/images/oee-is-misleading.png rename to nuxt/public/blog/2026/05/images/oee-is-misleading.png diff --git a/src/blog/2026/05/images/opcua-security-blog.png b/nuxt/public/blog/2026/05/images/opcua-security-blog.png similarity index 100% rename from src/blog/2026/05/images/opcua-security-blog.png rename to nuxt/public/blog/2026/05/images/opcua-security-blog.png diff --git a/src/blog/2026/05/images/snapshot-function-code-change.png b/nuxt/public/blog/2026/05/images/snapshot-function-code-change.png similarity index 100% rename from src/blog/2026/05/images/snapshot-function-code-change.png rename to nuxt/public/blog/2026/05/images/snapshot-function-code-change.png diff --git a/src/blog/2026/05/images/snapshot-prop-change.png b/nuxt/public/blog/2026/05/images/snapshot-prop-change.png similarity index 100% rename from src/blog/2026/05/images/snapshot-prop-change.png rename to nuxt/public/blog/2026/05/images/snapshot-prop-change.png diff --git a/src/blog/2026/06/images/arch-systems.png b/nuxt/public/blog/2026/06/images/arch-systems.png similarity index 100% rename from src/blog/2026/06/images/arch-systems.png rename to nuxt/public/blog/2026/06/images/arch-systems.png diff --git a/src/blog/2026/06/images/dashboard-view.webm b/nuxt/public/blog/2026/06/images/dashboard-view.webm similarity index 100% rename from src/blog/2026/06/images/dashboard-view.webm rename to nuxt/public/blog/2026/06/images/dashboard-view.webm diff --git a/src/blog/2026/06/images/example-1-diagram.png b/nuxt/public/blog/2026/06/images/example-1-diagram.png similarity index 100% rename from src/blog/2026/06/images/example-1-diagram.png rename to nuxt/public/blog/2026/06/images/example-1-diagram.png diff --git a/src/blog/2026/06/images/example-2-diagram.png b/nuxt/public/blog/2026/06/images/example-2-diagram.png similarity index 100% rename from src/blog/2026/06/images/example-2-diagram.png rename to nuxt/public/blog/2026/06/images/example-2-diagram.png diff --git a/src/blog/2026/06/images/example-3-diagram.png b/nuxt/public/blog/2026/06/images/example-3-diagram.png similarity index 100% rename from src/blog/2026/06/images/example-3-diagram.png rename to nuxt/public/blog/2026/06/images/example-3-diagram.png diff --git a/src/blog/2026/06/images/fixing-plc-communication.png b/nuxt/public/blog/2026/06/images/fixing-plc-communication.png similarity index 100% rename from src/blog/2026/06/images/fixing-plc-communication.png rename to nuxt/public/blog/2026/06/images/fixing-plc-communication.png diff --git a/src/blog/2026/06/images/flowfuse-expert-node-red-5.png b/nuxt/public/blog/2026/06/images/flowfuse-expert-node-red-5.png similarity index 100% rename from src/blog/2026/06/images/flowfuse-expert-node-red-5.png rename to nuxt/public/blog/2026/06/images/flowfuse-expert-node-red-5.png diff --git a/src/blog/2026/06/images/flowfuse-idea-to-architecture.png b/nuxt/public/blog/2026/06/images/flowfuse-idea-to-architecture.png similarity index 100% rename from src/blog/2026/06/images/flowfuse-idea-to-architecture.png rename to nuxt/public/blog/2026/06/images/flowfuse-idea-to-architecture.png diff --git a/src/blog/2026/06/images/flowfuse-release-2-31.jpg b/nuxt/public/blog/2026/06/images/flowfuse-release-2-31.jpg similarity index 100% rename from src/blog/2026/06/images/flowfuse-release-2-31.jpg rename to nuxt/public/blog/2026/06/images/flowfuse-release-2-31.jpg diff --git a/src/blog/2026/06/images/four-moves-framework.png b/nuxt/public/blog/2026/06/images/four-moves-framework.png similarity index 100% rename from src/blog/2026/06/images/four-moves-framework.png rename to nuxt/public/blog/2026/06/images/four-moves-framework.png diff --git a/src/blog/2026/06/images/influxdb-config.png b/nuxt/public/blog/2026/06/images/influxdb-config.png similarity index 100% rename from src/blog/2026/06/images/influxdb-config.png rename to nuxt/public/blog/2026/06/images/influxdb-config.png diff --git a/src/blog/2026/06/images/influxdb-explorer.png b/nuxt/public/blog/2026/06/images/influxdb-explorer.png similarity index 100% rename from src/blog/2026/06/images/influxdb-explorer.png rename to nuxt/public/blog/2026/06/images/influxdb-explorer.png diff --git a/src/blog/2026/06/images/influxdb-write-node-config.png b/nuxt/public/blog/2026/06/images/influxdb-write-node-config.png similarity index 100% rename from src/blog/2026/06/images/influxdb-write-node-config.png rename to nuxt/public/blog/2026/06/images/influxdb-write-node-config.png diff --git a/src/blog/2026/06/images/mqtt-vs-sparkplug-b-cta-2.png b/nuxt/public/blog/2026/06/images/mqtt-vs-sparkplug-b-cta-2.png similarity index 100% rename from src/blog/2026/06/images/mqtt-vs-sparkplug-b-cta-2.png rename to nuxt/public/blog/2026/06/images/mqtt-vs-sparkplug-b-cta-2.png diff --git a/src/blog/2026/06/images/mqtt-vs-sparkplug-cta-1.png b/nuxt/public/blog/2026/06/images/mqtt-vs-sparkplug-cta-1.png similarity index 100% rename from src/blog/2026/06/images/mqtt-vs-sparkplug-cta-1.png rename to nuxt/public/blog/2026/06/images/mqtt-vs-sparkplug-cta-1.png diff --git a/src/blog/2026/06/images/mqtt-vs-sparkplug.png b/nuxt/public/blog/2026/06/images/mqtt-vs-sparkplug.png similarity index 100% rename from src/blog/2026/06/images/mqtt-vs-sparkplug.png rename to nuxt/public/blog/2026/06/images/mqtt-vs-sparkplug.png diff --git a/src/blog/2026/06/images/node-red-5-flowfuse.png b/nuxt/public/blog/2026/06/images/node-red-5-flowfuse.png similarity index 100% rename from src/blog/2026/06/images/node-red-5-flowfuse.png rename to nuxt/public/blog/2026/06/images/node-red-5-flowfuse.png diff --git a/src/blog/2026/06/images/node-red-5-stack-settings.png b/nuxt/public/blog/2026/06/images/node-red-5-stack-settings.png similarity index 100% rename from src/blog/2026/06/images/node-red-5-stack-settings.png rename to nuxt/public/blog/2026/06/images/node-red-5-stack-settings.png diff --git a/src/blog/2026/06/images/node-red-5.png b/nuxt/public/blog/2026/06/images/node-red-5.png similarity index 100% rename from src/blog/2026/06/images/node-red-5.png rename to nuxt/public/blog/2026/06/images/node-red-5.png diff --git a/src/blog/2026/06/images/node-red-con-2026.png b/nuxt/public/blog/2026/06/images/node-red-con-2026.png similarity index 100% rename from src/blog/2026/06/images/node-red-con-2026.png rename to nuxt/public/blog/2026/06/images/node-red-con-2026.png diff --git a/src/blog/2026/06/images/nr-dark-theme.png b/nuxt/public/blog/2026/06/images/nr-dark-theme.png similarity index 100% rename from src/blog/2026/06/images/nr-dark-theme.png rename to nuxt/public/blog/2026/06/images/nr-dark-theme.png diff --git a/src/blog/2026/06/images/offsite-team.jpg b/nuxt/public/blog/2026/06/images/offsite-team.jpg similarity index 100% rename from src/blog/2026/06/images/offsite-team.jpg rename to nuxt/public/blog/2026/06/images/offsite-team.jpg diff --git a/src/blog/2026/06/images/opc-ua-security.png b/nuxt/public/blog/2026/06/images/opc-ua-security.png similarity index 100% rename from src/blog/2026/06/images/opc-ua-security.png rename to nuxt/public/blog/2026/06/images/opc-ua-security.png diff --git a/src/blog/2026/06/images/opcua-application-vs-user-authentication.png b/nuxt/public/blog/2026/06/images/opcua-application-vs-user-authentication.png similarity index 100% rename from src/blog/2026/06/images/opcua-application-vs-user-authentication.png rename to nuxt/public/blog/2026/06/images/opcua-application-vs-user-authentication.png diff --git a/src/blog/2026/06/images/opcua-certificate-trust-validation-flow.png b/nuxt/public/blog/2026/06/images/opcua-certificate-trust-validation-flow.png similarity index 100% rename from src/blog/2026/06/images/opcua-certificate-trust-validation-flow.png rename to nuxt/public/blog/2026/06/images/opcua-certificate-trust-validation-flow.png diff --git a/src/blog/2026/06/images/opcua-config.png b/nuxt/public/blog/2026/06/images/opcua-config.png similarity index 100% rename from src/blog/2026/06/images/opcua-config.png rename to nuxt/public/blog/2026/06/images/opcua-config.png diff --git a/src/blog/2026/06/images/opcua-defense-in-depth-network-zones.png b/nuxt/public/blog/2026/06/images/opcua-defense-in-depth-network-zones.png similarity index 100% rename from src/blog/2026/06/images/opcua-defense-in-depth-network-zones.png rename to nuxt/public/blog/2026/06/images/opcua-defense-in-depth-network-zones.png diff --git a/src/blog/2026/06/images/opcua-gds-push-pull-certificate-management.png b/nuxt/public/blog/2026/06/images/opcua-gds-push-pull-certificate-management.png similarity index 100% rename from src/blog/2026/06/images/opcua-gds-push-pull-certificate-management.png rename to nuxt/public/blog/2026/06/images/opcua-gds-push-pull-certificate-management.png diff --git a/src/blog/2026/06/images/opcua-influxdb-cta-1.png b/nuxt/public/blog/2026/06/images/opcua-influxdb-cta-1.png similarity index 100% rename from src/blog/2026/06/images/opcua-influxdb-cta-1.png rename to nuxt/public/blog/2026/06/images/opcua-influxdb-cta-1.png diff --git a/src/blog/2026/06/images/opcua-manage-pallete.png b/nuxt/public/blog/2026/06/images/opcua-manage-pallete.png similarity index 100% rename from src/blog/2026/06/images/opcua-manage-pallete.png rename to nuxt/public/blog/2026/06/images/opcua-manage-pallete.png diff --git a/src/blog/2026/06/images/opcua-read-node.png b/nuxt/public/blog/2026/06/images/opcua-read-node.png similarity index 100% rename from src/blog/2026/06/images/opcua-read-node.png rename to nuxt/public/blog/2026/06/images/opcua-read-node.png diff --git a/src/blog/2026/06/images/opcua-reverse-connect-vs-traditional.png b/nuxt/public/blog/2026/06/images/opcua-reverse-connect-vs-traditional.png similarity index 100% rename from src/blog/2026/06/images/opcua-reverse-connect-vs-traditional.png rename to nuxt/public/blog/2026/06/images/opcua-reverse-connect-vs-traditional.png diff --git a/src/blog/2026/06/images/opcua-to-influxdb-flow.png b/nuxt/public/blog/2026/06/images/opcua-to-influxdb-flow.png similarity index 100% rename from src/blog/2026/06/images/opcua-to-influxdb-flow.png rename to nuxt/public/blog/2026/06/images/opcua-to-influxdb-flow.png diff --git a/src/blog/2026/06/images/opcua-to-influxdb.png b/nuxt/public/blog/2026/06/images/opcua-to-influxdb.png similarity index 100% rename from src/blog/2026/06/images/opcua-to-influxdb.png rename to nuxt/public/blog/2026/06/images/opcua-to-influxdb.png diff --git a/src/blog/2026/06/images/read-output.png b/nuxt/public/blog/2026/06/images/read-output.png similarity index 100% rename from src/blog/2026/06/images/read-output.png rename to nuxt/public/blog/2026/06/images/read-output.png diff --git a/src/blog/2026/06/images/rtsp-config.png b/nuxt/public/blog/2026/06/images/rtsp-config.png similarity index 100% rename from src/blog/2026/06/images/rtsp-config.png rename to nuxt/public/blog/2026/06/images/rtsp-config.png diff --git a/src/blog/2026/06/images/rtsp-debug-output.png b/nuxt/public/blog/2026/06/images/rtsp-debug-output.png similarity index 100% rename from src/blog/2026/06/images/rtsp-debug-output.png rename to nuxt/public/blog/2026/06/images/rtsp-debug-output.png diff --git a/src/blog/2026/06/images/rtsp-edge-catalog.png b/nuxt/public/blog/2026/06/images/rtsp-edge-catalog.png similarity index 100% rename from src/blog/2026/06/images/rtsp-edge-catalog.png rename to nuxt/public/blog/2026/06/images/rtsp-edge-catalog.png diff --git a/src/blog/2026/06/images/rtsp-feeds-at-edge.png b/nuxt/public/blog/2026/06/images/rtsp-feeds-at-edge.png similarity index 100% rename from src/blog/2026/06/images/rtsp-feeds-at-edge.png rename to nuxt/public/blog/2026/06/images/rtsp-feeds-at-edge.png diff --git a/src/blog/2026/06/images/why-spreadsheets-fail.png b/nuxt/public/blog/2026/06/images/why-spreadsheets-fail.png similarity index 100% rename from src/blog/2026/06/images/why-spreadsheets-fail.png rename to nuxt/public/blog/2026/06/images/why-spreadsheets-fail.png diff --git a/src/blog/2026/07/images/avg-resolution-added.png b/nuxt/public/blog/2026/07/images/avg-resolution-added.png similarity index 100% rename from src/blog/2026/07/images/avg-resolution-added.png rename to nuxt/public/blog/2026/07/images/avg-resolution-added.png diff --git a/src/blog/2026/07/images/build-machine-downtime-tracking-application.png b/nuxt/public/blog/2026/07/images/build-machine-downtime-tracking-application.png similarity index 100% rename from src/blog/2026/07/images/build-machine-downtime-tracking-application.png rename to nuxt/public/blog/2026/07/images/build-machine-downtime-tracking-application.png diff --git a/src/blog/2026/07/images/calibration-asset-table.png b/nuxt/public/blog/2026/07/images/calibration-asset-table.png similarity index 100% rename from src/blog/2026/07/images/calibration-asset-table.png rename to nuxt/public/blog/2026/07/images/calibration-asset-table.png diff --git a/src/blog/2026/07/images/calibration-management-dashboard.png b/nuxt/public/blog/2026/07/images/calibration-management-dashboard.png similarity index 100% rename from src/blog/2026/07/images/calibration-management-dashboard.png rename to nuxt/public/blog/2026/07/images/calibration-management-dashboard.png diff --git a/src/blog/2026/07/images/chat.png b/nuxt/public/blog/2026/07/images/chat.png similarity index 100% rename from src/blog/2026/07/images/chat.png rename to nuxt/public/blog/2026/07/images/chat.png diff --git a/src/blog/2026/07/images/client-data-tab-dashboard.png b/nuxt/public/blog/2026/07/images/client-data-tab-dashboard.png similarity index 100% rename from src/blog/2026/07/images/client-data-tab-dashboard.png rename to nuxt/public/blog/2026/07/images/client-data-tab-dashboard.png diff --git a/src/blog/2026/07/images/clock-drift-blog.png b/nuxt/public/blog/2026/07/images/clock-drift-blog.png similarity index 100% rename from src/blog/2026/07/images/clock-drift-blog.png rename to nuxt/public/blog/2026/07/images/clock-drift-blog.png diff --git a/src/blog/2026/07/images/complete-dashbaord-downtime-logger.png b/nuxt/public/blog/2026/07/images/complete-dashbaord-downtime-logger.png similarity index 100% rename from src/blog/2026/07/images/complete-dashbaord-downtime-logger.png rename to nuxt/public/blog/2026/07/images/complete-dashbaord-downtime-logger.png diff --git a/src/blog/2026/07/images/control-and-monitor-machines.png b/nuxt/public/blog/2026/07/images/control-and-monitor-machines.png similarity index 100% rename from src/blog/2026/07/images/control-and-monitor-machines.png rename to nuxt/public/blog/2026/07/images/control-and-monitor-machines.png diff --git a/src/blog/2026/07/images/current-work-order.png b/nuxt/public/blog/2026/07/images/current-work-order.png similarity index 100% rename from src/blog/2026/07/images/current-work-order.png rename to nuxt/public/blog/2026/07/images/current-work-order.png diff --git a/src/blog/2026/07/images/dark-mode.png b/nuxt/public/blog/2026/07/images/dark-mode.png similarity index 100% rename from src/blog/2026/07/images/dark-mode.png rename to nuxt/public/blog/2026/07/images/dark-mode.png diff --git a/src/blog/2026/07/images/dashboard-drawer.png b/nuxt/public/blog/2026/07/images/dashboard-drawer.png similarity index 100% rename from src/blog/2026/07/images/dashboard-drawer.png rename to nuxt/public/blog/2026/07/images/dashboard-drawer.png diff --git a/src/blog/2026/07/images/dashboard-header-filter.png b/nuxt/public/blog/2026/07/images/dashboard-header-filter.png similarity index 100% rename from src/blog/2026/07/images/dashboard-header-filter.png rename to nuxt/public/blog/2026/07/images/dashboard-header-filter.png diff --git a/src/blog/2026/07/images/defect-day-added.png b/nuxt/public/blog/2026/07/images/defect-day-added.png similarity index 100% rename from src/blog/2026/07/images/defect-day-added.png rename to nuxt/public/blog/2026/07/images/defect-day-added.png diff --git a/src/blog/2026/07/images/defect-monitoring-dashboard.png b/nuxt/public/blog/2026/07/images/defect-monitoring-dashboard.png similarity index 100% rename from src/blog/2026/07/images/defect-monitoring-dashboard.png rename to nuxt/public/blog/2026/07/images/defect-monitoring-dashboard.png diff --git a/src/blog/2026/07/images/demo-thumbnail.jpg b/nuxt/public/blog/2026/07/images/demo-thumbnail.jpg similarity index 100% rename from src/blog/2026/07/images/demo-thumbnail.jpg rename to nuxt/public/blog/2026/07/images/demo-thumbnail.jpg diff --git a/src/blog/2026/07/images/device-agent-install.webm b/nuxt/public/blog/2026/07/images/device-agent-install.webm similarity index 100% rename from src/blog/2026/07/images/device-agent-install.webm rename to nuxt/public/blog/2026/07/images/device-agent-install.webm diff --git a/src/blog/2026/07/images/digital-instructions-dashboard-flowfuse.png b/nuxt/public/blog/2026/07/images/digital-instructions-dashboard-flowfuse.png similarity index 100% rename from src/blog/2026/07/images/digital-instructions-dashboard-flowfuse.png rename to nuxt/public/blog/2026/07/images/digital-instructions-dashboard-flowfuse.png diff --git a/src/blog/2026/07/images/digital-work-instruction-2.png b/nuxt/public/blog/2026/07/images/digital-work-instruction-2.png similarity index 100% rename from src/blog/2026/07/images/digital-work-instruction-2.png rename to nuxt/public/blog/2026/07/images/digital-work-instruction-2.png diff --git a/src/blog/2026/07/images/digital-work-instruction-dashboard.png b/nuxt/public/blog/2026/07/images/digital-work-instruction-dashboard.png similarity index 100% rename from src/blog/2026/07/images/digital-work-instruction-dashboard.png rename to nuxt/public/blog/2026/07/images/digital-work-instruction-dashboard.png diff --git a/src/blog/2026/07/images/downtime-logger.png b/nuxt/public/blog/2026/07/images/downtime-logger.png similarity index 100% rename from src/blog/2026/07/images/downtime-logger.png rename to nuxt/public/blog/2026/07/images/downtime-logger.png diff --git a/src/blog/2026/07/images/fishbone-cta.png b/nuxt/public/blog/2026/07/images/fishbone-cta.png similarity index 100% rename from src/blog/2026/07/images/fishbone-cta.png rename to nuxt/public/blog/2026/07/images/fishbone-cta.png diff --git a/src/blog/2026/07/images/flowfuse-defect-monitoring-dashboard.png b/nuxt/public/blog/2026/07/images/flowfuse-defect-monitoring-dashboard.png similarity index 100% rename from src/blog/2026/07/images/flowfuse-defect-monitoring-dashboard.png rename to nuxt/public/blog/2026/07/images/flowfuse-defect-monitoring-dashboard.png diff --git a/src/blog/2026/07/images/flowfuse-release-2-32.jpg b/nuxt/public/blog/2026/07/images/flowfuse-release-2-32.jpg similarity index 100% rename from src/blog/2026/07/images/flowfuse-release-2-32.jpg rename to nuxt/public/blog/2026/07/images/flowfuse-release-2-32.jpg diff --git a/src/blog/2026/07/images/flowfuse-release-2-33.jpg b/nuxt/public/blog/2026/07/images/flowfuse-release-2-33.jpg similarity index 100% rename from src/blog/2026/07/images/flowfuse-release-2-33.jpg rename to nuxt/public/blog/2026/07/images/flowfuse-release-2-33.jpg diff --git a/src/blog/2026/07/images/form-dropdown.png b/nuxt/public/blog/2026/07/images/form-dropdown.png similarity index 100% rename from src/blog/2026/07/images/form-dropdown.png rename to nuxt/public/blog/2026/07/images/form-dropdown.png diff --git a/src/blog/2026/07/images/form-elements.png b/nuxt/public/blog/2026/07/images/form-elements.png similarity index 100% rename from src/blog/2026/07/images/form-elements.png rename to nuxt/public/blog/2026/07/images/form-elements.png diff --git a/src/blog/2026/07/images/function-config-state-to-commands.png b/nuxt/public/blog/2026/07/images/function-config-state-to-commands.png similarity index 100% rename from src/blog/2026/07/images/function-config-state-to-commands.png rename to nuxt/public/blog/2026/07/images/function-config-state-to-commands.png diff --git a/src/blog/2026/07/images/generic-git-provider.png b/nuxt/public/blog/2026/07/images/generic-git-provider.png similarity index 100% rename from src/blog/2026/07/images/generic-git-provider.png rename to nuxt/public/blog/2026/07/images/generic-git-provider.png diff --git a/src/blog/2026/07/images/gitops-pipeline.png b/nuxt/public/blog/2026/07/images/gitops-pipeline.png similarity index 100% rename from src/blog/2026/07/images/gitops-pipeline.png rename to nuxt/public/blog/2026/07/images/gitops-pipeline.png diff --git a/src/blog/2026/07/images/header-dropdown.png b/nuxt/public/blog/2026/07/images/header-dropdown.png similarity index 100% rename from src/blog/2026/07/images/header-dropdown.png rename to nuxt/public/blog/2026/07/images/header-dropdown.png diff --git a/src/blog/2026/07/images/hitl-approvals.png b/nuxt/public/blog/2026/07/images/hitl-approvals.png similarity index 100% rename from src/blog/2026/07/images/hitl-approvals.png rename to nuxt/public/blog/2026/07/images/hitl-approvals.png diff --git a/src/blog/2026/07/images/insights-mode.png b/nuxt/public/blog/2026/07/images/insights-mode.png similarity index 100% rename from src/blog/2026/07/images/insights-mode.png rename to nuxt/public/blog/2026/07/images/insights-mode.png diff --git a/src/blog/2026/07/images/instructions.png b/nuxt/public/blog/2026/07/images/instructions.png similarity index 100% rename from src/blog/2026/07/images/instructions.png rename to nuxt/public/blog/2026/07/images/instructions.png diff --git a/src/blog/2026/07/images/kpi-cards-calibration.png b/nuxt/public/blog/2026/07/images/kpi-cards-calibration.png similarity index 100% rename from src/blog/2026/07/images/kpi-cards-calibration.png rename to nuxt/public/blog/2026/07/images/kpi-cards-calibration.png diff --git a/src/blog/2026/07/images/logged-in-user-app-bar.png b/nuxt/public/blog/2026/07/images/logged-in-user-app-bar.png similarity index 100% rename from src/blog/2026/07/images/logged-in-user-app-bar.png rename to nuxt/public/blog/2026/07/images/logged-in-user-app-bar.png diff --git a/src/blog/2026/07/images/machine-events.png b/nuxt/public/blog/2026/07/images/machine-events.png similarity index 100% rename from src/blog/2026/07/images/machine-events.png rename to nuxt/public/blog/2026/07/images/machine-events.png diff --git a/src/blog/2026/07/images/motor-on-button-config.png b/nuxt/public/blog/2026/07/images/motor-on-button-config.png similarity index 100% rename from src/blog/2026/07/images/motor-on-button-config.png rename to nuxt/public/blog/2026/07/images/motor-on-button-config.png diff --git a/src/blog/2026/07/images/motor-s7-out.png b/nuxt/public/blog/2026/07/images/motor-s7-out.png similarity index 100% rename from src/blog/2026/07/images/motor-s7-out.png rename to nuxt/public/blog/2026/07/images/motor-s7-out.png diff --git a/src/blog/2026/07/images/pareto-chart-added.png b/nuxt/public/blog/2026/07/images/pareto-chart-added.png similarity index 100% rename from src/blog/2026/07/images/pareto-chart-added.png rename to nuxt/public/blog/2026/07/images/pareto-chart-added.png diff --git a/src/blog/2026/07/images/plc-config.png b/nuxt/public/blog/2026/07/images/plc-config.png similarity index 100% rename from src/blog/2026/07/images/plc-config.png rename to nuxt/public/blog/2026/07/images/plc-config.png diff --git a/src/blog/2026/07/images/plc-program-runtime.png b/nuxt/public/blog/2026/07/images/plc-program-runtime.png similarity index 100% rename from src/blog/2026/07/images/plc-program-runtime.png rename to nuxt/public/blog/2026/07/images/plc-program-runtime.png diff --git a/src/blog/2026/07/images/prep-params-2.png b/nuxt/public/blog/2026/07/images/prep-params-2.png similarity index 100% rename from src/blog/2026/07/images/prep-params-2.png rename to nuxt/public/blog/2026/07/images/prep-params-2.png diff --git a/src/blog/2026/07/images/prep-params.png b/nuxt/public/blog/2026/07/images/prep-params.png similarity index 100% rename from src/blog/2026/07/images/prep-params.png rename to nuxt/public/blog/2026/07/images/prep-params.png diff --git a/src/blog/2026/07/images/read-all-s7-in.png b/nuxt/public/blog/2026/07/images/read-all-s7-in.png similarity index 100% rename from src/blog/2026/07/images/read-all-s7-in.png rename to nuxt/public/blog/2026/07/images/read-all-s7-in.png diff --git a/src/blog/2026/07/images/red-led-switch.png b/nuxt/public/blog/2026/07/images/red-led-switch.png similarity index 100% rename from src/blog/2026/07/images/red-led-switch.png rename to nuxt/public/blog/2026/07/images/red-led-switch.png diff --git a/src/blog/2026/07/images/report-issue.png b/nuxt/public/blog/2026/07/images/report-issue.png similarity index 100% rename from src/blog/2026/07/images/report-issue.png rename to nuxt/public/blog/2026/07/images/report-issue.png diff --git a/src/blog/2026/07/images/root-cause-added.png b/nuxt/public/blog/2026/07/images/root-cause-added.png similarity index 100% rename from src/blog/2026/07/images/root-cause-added.png rename to nuxt/public/blog/2026/07/images/root-cause-added.png diff --git a/src/blog/2026/07/images/runtime-display-motor.png b/nuxt/public/blog/2026/07/images/runtime-display-motor.png similarity index 100% rename from src/blog/2026/07/images/runtime-display-motor.png rename to nuxt/public/blog/2026/07/images/runtime-display-motor.png diff --git a/src/blog/2026/07/images/s7-config-variables-counter.png b/nuxt/public/blog/2026/07/images/s7-config-variables-counter.png similarity index 100% rename from src/blog/2026/07/images/s7-config-variables-counter.png rename to nuxt/public/blog/2026/07/images/s7-config-variables-counter.png diff --git a/src/blog/2026/07/images/scoped-pats.png b/nuxt/public/blog/2026/07/images/scoped-pats.png similarity index 100% rename from src/blog/2026/07/images/scoped-pats.png rename to nuxt/public/blog/2026/07/images/scoped-pats.png diff --git a/src/blog/2026/07/images/set-params-change-node.png b/nuxt/public/blog/2026/07/images/set-params-change-node.png similarity index 100% rename from src/blog/2026/07/images/set-params-change-node.png rename to nuxt/public/blog/2026/07/images/set-params-change-node.png diff --git a/src/blog/2026/07/images/set-params.png b/nuxt/public/blog/2026/07/images/set-params.png similarity index 100% rename from src/blog/2026/07/images/set-params.png rename to nuxt/public/blog/2026/07/images/set-params.png diff --git a/src/blog/2026/07/images/severity-and-disposition-added.png b/nuxt/public/blog/2026/07/images/severity-and-disposition-added.png similarity index 100% rename from src/blog/2026/07/images/severity-and-disposition-added.png rename to nuxt/public/blog/2026/07/images/severity-and-disposition-added.png diff --git a/src/blog/2026/07/images/software-defined-manufacturing.png b/nuxt/public/blog/2026/07/images/software-defined-manufacturing.png similarity index 100% rename from src/blog/2026/07/images/software-defined-manufacturing.png rename to nuxt/public/blog/2026/07/images/software-defined-manufacturing.png diff --git a/src/blog/2026/07/images/stat-cards.png b/nuxt/public/blog/2026/07/images/stat-cards.png similarity index 100% rename from src/blog/2026/07/images/stat-cards.png rename to nuxt/public/blog/2026/07/images/stat-cards.png diff --git a/src/blog/2026/07/images/stats-and-station.png b/nuxt/public/blog/2026/07/images/stats-and-station.png similarity index 100% rename from src/blog/2026/07/images/stats-and-station.png rename to nuxt/public/blog/2026/07/images/stats-and-station.png diff --git a/src/blog/2026/07/images/status-funnel.png b/nuxt/public/blog/2026/07/images/status-funnel.png similarity index 100% rename from src/blog/2026/07/images/status-funnel.png rename to nuxt/public/blog/2026/07/images/status-funnel.png diff --git a/src/blog/2026/07/images/store-filters.png b/nuxt/public/blog/2026/07/images/store-filters.png similarity index 100% rename from src/blog/2026/07/images/store-filters.png rename to nuxt/public/blog/2026/07/images/store-filters.png diff --git a/src/blog/2026/07/images/switch-to-route-events.png b/nuxt/public/blog/2026/07/images/switch-to-route-events.png similarity index 100% rename from src/blog/2026/07/images/switch-to-route-events.png rename to nuxt/public/blog/2026/07/images/switch-to-route-events.png diff --git a/src/blog/2026/07/images/tool-check.png b/nuxt/public/blog/2026/07/images/tool-check.png similarity index 100% rename from src/blog/2026/07/images/tool-check.png rename to nuxt/public/blog/2026/07/images/tool-check.png diff --git a/src/blog/2026/07/images/tracking-equipement-calibration.png b/nuxt/public/blog/2026/07/images/tracking-equipement-calibration.png similarity index 100% rename from src/blog/2026/07/images/tracking-equipement-calibration.png rename to nuxt/public/blog/2026/07/images/tracking-equipement-calibration.png diff --git a/src/blog/2026/07/images/ui-table-stoppages.png b/nuxt/public/blog/2026/07/images/ui-table-stoppages.png similarity index 100% rename from src/blog/2026/07/images/ui-table-stoppages.png rename to nuxt/public/blog/2026/07/images/ui-table-stoppages.png diff --git a/src/blog/2026/07/images/ui-table-with-popup.png b/nuxt/public/blog/2026/07/images/ui-table-with-popup.png similarity index 100% rename from src/blog/2026/07/images/ui-table-with-popup.png rename to nuxt/public/blog/2026/07/images/ui-table-with-popup.png diff --git a/src/blog/2026/07/images/up-next.png b/nuxt/public/blog/2026/07/images/up-next.png similarity index 100% rename from src/blog/2026/07/images/up-next.png rename to nuxt/public/blog/2026/07/images/up-next.png diff --git a/src/blog/2026/07/images/what-is-instrument-calibration.png b/nuxt/public/blog/2026/07/images/what-is-instrument-calibration.png similarity index 100% rename from src/blog/2026/07/images/what-is-instrument-calibration.png rename to nuxt/public/blog/2026/07/images/what-is-instrument-calibration.png diff --git a/src/blog/2026/07/images/what-is-ishikawa-fishbone-diagram.png b/nuxt/public/blog/2026/07/images/what-is-ishikawa-fishbone-diagram.png similarity index 100% rename from src/blog/2026/07/images/what-is-ishikawa-fishbone-diagram.png rename to nuxt/public/blog/2026/07/images/what-is-ishikawa-fishbone-diagram.png diff --git a/src/blog/2026/07/images/why-manufacturing-need-gitops-tile.png b/nuxt/public/blog/2026/07/images/why-manufacturing-need-gitops-tile.png similarity index 100% rename from src/blog/2026/07/images/why-manufacturing-need-gitops-tile.png rename to nuxt/public/blog/2026/07/images/why-manufacturing-need-gitops-tile.png diff --git a/src/blog/2026/08/images/andon-live-dashboard.png b/nuxt/public/blog/2026/08/images/andon-live-dashboard.png similarity index 100% rename from src/blog/2026/08/images/andon-live-dashboard.png rename to nuxt/public/blog/2026/08/images/andon-live-dashboard.png diff --git a/src/blog/2026/08/images/automotive-traceability.png b/nuxt/public/blog/2026/08/images/automotive-traceability.png similarity index 100% rename from src/blog/2026/08/images/automotive-traceability.png rename to nuxt/public/blog/2026/08/images/automotive-traceability.png diff --git a/src/blog/2026/08/images/calibration-management-dashboard.png b/nuxt/public/blog/2026/08/images/calibration-management-dashboard.png similarity index 100% rename from src/blog/2026/08/images/calibration-management-dashboard.png rename to nuxt/public/blog/2026/08/images/calibration-management-dashboard.png diff --git a/src/blog/2026/08/images/connect-your-own-ai-agent.webm b/nuxt/public/blog/2026/08/images/connect-your-own-ai-agent.webm similarity index 100% rename from src/blog/2026/08/images/connect-your-own-ai-agent.webm rename to nuxt/public/blog/2026/08/images/connect-your-own-ai-agent.webm diff --git a/src/blog/2026/08/images/containment-action-cta-2.png b/nuxt/public/blog/2026/08/images/containment-action-cta-2.png similarity index 100% rename from src/blog/2026/08/images/containment-action-cta-2.png rename to nuxt/public/blog/2026/08/images/containment-action-cta-2.png diff --git a/src/blog/2026/08/images/containment-action-guide.png b/nuxt/public/blog/2026/08/images/containment-action-guide.png similarity index 100% rename from src/blog/2026/08/images/containment-action-guide.png rename to nuxt/public/blog/2026/08/images/containment-action-guide.png diff --git a/src/blog/2026/08/images/containment-blog-cta-1.png b/nuxt/public/blog/2026/08/images/containment-blog-cta-1.png similarity index 100% rename from src/blog/2026/08/images/containment-blog-cta-1.png rename to nuxt/public/blog/2026/08/images/containment-blog-cta-1.png diff --git a/src/blog/2026/08/images/control-plan-cta-1.png b/nuxt/public/blog/2026/08/images/control-plan-cta-1.png similarity index 100% rename from src/blog/2026/08/images/control-plan-cta-1.png rename to nuxt/public/blog/2026/08/images/control-plan-cta-1.png diff --git a/src/blog/2026/08/images/control-plan-cta-2.png b/nuxt/public/blog/2026/08/images/control-plan-cta-2.png similarity index 100% rename from src/blog/2026/08/images/control-plan-cta-2.png rename to nuxt/public/blog/2026/08/images/control-plan-cta-2.png diff --git a/src/blog/2026/08/images/control-plans.png b/nuxt/public/blog/2026/08/images/control-plans.png similarity index 100% rename from src/blog/2026/08/images/control-plans.png rename to nuxt/public/blog/2026/08/images/control-plans.png diff --git a/src/blog/2026/08/images/dashboard-table-date-formats.webm b/nuxt/public/blog/2026/08/images/dashboard-table-date-formats.webm similarity index 100% rename from src/blog/2026/08/images/dashboard-table-date-formats.webm rename to nuxt/public/blog/2026/08/images/dashboard-table-date-formats.webm diff --git a/src/blog/2026/08/images/dashboard-theme-dracula.png b/nuxt/public/blog/2026/08/images/dashboard-theme-dracula.png similarity index 100% rename from src/blog/2026/08/images/dashboard-theme-dracula.png rename to nuxt/public/blog/2026/08/images/dashboard-theme-dracula.png diff --git a/src/blog/2026/08/images/dashboard-theme-showcase.webm b/nuxt/public/blog/2026/08/images/dashboard-theme-showcase.webm similarity index 100% rename from src/blog/2026/08/images/dashboard-theme-showcase.webm rename to nuxt/public/blog/2026/08/images/dashboard-theme-showcase.webm diff --git a/src/blog/2026/08/images/dashboard-themes.gif b/nuxt/public/blog/2026/08/images/dashboard-themes.gif similarity index 100% rename from src/blog/2026/08/images/dashboard-themes.gif rename to nuxt/public/blog/2026/08/images/dashboard-themes.gif diff --git a/src/blog/2026/08/images/dashboards-table-timestamps.gif b/nuxt/public/blog/2026/08/images/dashboards-table-timestamps.gif similarity index 100% rename from src/blog/2026/08/images/dashboards-table-timestamps.gif rename to nuxt/public/blog/2026/08/images/dashboards-table-timestamps.gif diff --git a/src/blog/2026/08/images/design-pattern-multi-user.png b/nuxt/public/blog/2026/08/images/design-pattern-multi-user.png similarity index 100% rename from src/blog/2026/08/images/design-pattern-multi-user.png rename to nuxt/public/blog/2026/08/images/design-pattern-multi-user.png diff --git a/src/blog/2026/08/images/design-pattern-single.png b/nuxt/public/blog/2026/08/images/design-pattern-single.png similarity index 100% rename from src/blog/2026/08/images/design-pattern-single.png rename to nuxt/public/blog/2026/08/images/design-pattern-single.png diff --git a/src/blog/2026/08/images/downtime-logger.png b/nuxt/public/blog/2026/08/images/downtime-logger.png similarity index 100% rename from src/blog/2026/08/images/downtime-logger.png rename to nuxt/public/blog/2026/08/images/downtime-logger.png diff --git a/src/blog/2026/08/images/flowfuse-defect-monitoring-dashboard.png b/nuxt/public/blog/2026/08/images/flowfuse-defect-monitoring-dashboard.png similarity index 100% rename from src/blog/2026/08/images/flowfuse-defect-monitoring-dashboard.png rename to nuxt/public/blog/2026/08/images/flowfuse-defect-monitoring-dashboard.png diff --git a/src/blog/2026/08/images/flowfuse-release-3-0.jpg b/nuxt/public/blog/2026/08/images/flowfuse-release-3-0.jpg similarity index 100% rename from src/blog/2026/08/images/flowfuse-release-3-0.jpg rename to nuxt/public/blog/2026/08/images/flowfuse-release-3-0.jpg diff --git a/src/blog/2026/08/images/layered-process-audit-level.png b/nuxt/public/blog/2026/08/images/layered-process-audit-level.png similarity index 100% rename from src/blog/2026/08/images/layered-process-audit-level.png rename to nuxt/public/blog/2026/08/images/layered-process-audit-level.png diff --git a/src/blog/2026/08/images/lpa-cta-1.png b/nuxt/public/blog/2026/08/images/lpa-cta-1.png similarity index 100% rename from src/blog/2026/08/images/lpa-cta-1.png rename to nuxt/public/blog/2026/08/images/lpa-cta-1.png diff --git a/src/blog/2026/08/images/manufacturing-dashbaord-examples.png b/nuxt/public/blog/2026/08/images/manufacturing-dashbaord-examples.png similarity index 100% rename from src/blog/2026/08/images/manufacturing-dashbaord-examples.png rename to nuxt/public/blog/2026/08/images/manufacturing-dashbaord-examples.png diff --git a/src/blog/2026/08/images/manufacturing-quality-dashboard-spc-chart.png b/nuxt/public/blog/2026/08/images/manufacturing-quality-dashboard-spc-chart.png similarity index 100% rename from src/blog/2026/08/images/manufacturing-quality-dashboard-spc-chart.png rename to nuxt/public/blog/2026/08/images/manufacturing-quality-dashboard-spc-chart.png diff --git a/src/blog/2026/08/images/oee-dashboard--1-f77f847f.png b/nuxt/public/blog/2026/08/images/oee-dashboard--1-f77f847f.png similarity index 100% rename from src/blog/2026/08/images/oee-dashboard--1-f77f847f.png rename to nuxt/public/blog/2026/08/images/oee-dashboard--1-f77f847f.png diff --git a/src/blog/2026/08/images/pa-escalation-loop.png b/nuxt/public/blog/2026/08/images/pa-escalation-loop.png similarity index 100% rename from src/blog/2026/08/images/pa-escalation-loop.png rename to nuxt/public/blog/2026/08/images/pa-escalation-loop.png diff --git a/src/blog/2026/08/images/pap-vs-run-rate.png b/nuxt/public/blog/2026/08/images/pap-vs-run-rate.png similarity index 100% rename from src/blog/2026/08/images/pap-vs-run-rate.png rename to nuxt/public/blog/2026/08/images/pap-vs-run-rate.png diff --git a/src/blog/2026/08/images/part-genealogy.png b/nuxt/public/blog/2026/08/images/part-genealogy.png similarity index 100% rename from src/blog/2026/08/images/part-genealogy.png rename to nuxt/public/blog/2026/08/images/part-genealogy.png diff --git a/src/blog/2026/08/images/run-at-rate-calculation-image.png b/nuxt/public/blog/2026/08/images/run-at-rate-calculation-image.png similarity index 100% rename from src/blog/2026/08/images/run-at-rate-calculation-image.png rename to nuxt/public/blog/2026/08/images/run-at-rate-calculation-image.png diff --git a/src/blog/2026/08/images/run-at-rate-cta-1.png b/nuxt/public/blog/2026/08/images/run-at-rate-cta-1.png similarity index 100% rename from src/blog/2026/08/images/run-at-rate-cta-1.png rename to nuxt/public/blog/2026/08/images/run-at-rate-cta-1.png diff --git a/src/blog/2026/08/images/run-at-rate-cta2.png b/nuxt/public/blog/2026/08/images/run-at-rate-cta2.png similarity index 100% rename from src/blog/2026/08/images/run-at-rate-cta2.png rename to nuxt/public/blog/2026/08/images/run-at-rate-cta2.png diff --git a/src/blog/2026/08/images/run-at-rate.png b/nuxt/public/blog/2026/08/images/run-at-rate.png similarity index 100% rename from src/blog/2026/08/images/run-at-rate.png rename to nuxt/public/blog/2026/08/images/run-at-rate.png diff --git a/src/blog/2026/08/images/safe-launch-cta-1.png b/nuxt/public/blog/2026/08/images/safe-launch-cta-1.png similarity index 100% rename from src/blog/2026/08/images/safe-launch-cta-1.png rename to nuxt/public/blog/2026/08/images/safe-launch-cta-1.png diff --git a/src/blog/2026/08/images/safe-launch-cta-2.png b/nuxt/public/blog/2026/08/images/safe-launch-cta-2.png similarity index 100% rename from src/blog/2026/08/images/safe-launch-cta-2.png rename to nuxt/public/blog/2026/08/images/safe-launch-cta-2.png diff --git a/src/blog/2026/08/images/safe-launch-image.png b/nuxt/public/blog/2026/08/images/safe-launch-image.png similarity index 100% rename from src/blog/2026/08/images/safe-launch-image.png rename to nuxt/public/blog/2026/08/images/safe-launch-image.png diff --git a/src/blog/2026/08/images/scada-article-cta.png b/nuxt/public/blog/2026/08/images/scada-article-cta.png similarity index 100% rename from src/blog/2026/08/images/scada-article-cta.png rename to nuxt/public/blog/2026/08/images/scada-article-cta.png diff --git a/src/blog/2026/08/images/scada-basic-diagram.png b/nuxt/public/blog/2026/08/images/scada-basic-diagram.png similarity index 100% rename from src/blog/2026/08/images/scada-basic-diagram.png rename to nuxt/public/blog/2026/08/images/scada-basic-diagram.png diff --git a/src/blog/2026/08/images/scada-flowfuse-extension.png b/nuxt/public/blog/2026/08/images/scada-flowfuse-extension.png similarity index 100% rename from src/blog/2026/08/images/scada-flowfuse-extension.png rename to nuxt/public/blog/2026/08/images/scada-flowfuse-extension.png diff --git a/src/blog/2026/08/images/spc-chart-data-analysis-close-up.png b/nuxt/public/blog/2026/08/images/spc-chart-data-analysis-close-up.png similarity index 100% rename from src/blog/2026/08/images/spc-chart-data-analysis-close-up.png rename to nuxt/public/blog/2026/08/images/spc-chart-data-analysis-close-up.png diff --git a/src/blog/2026/08/images/station-data-flow.png b/nuxt/public/blog/2026/08/images/station-data-flow.png similarity index 100% rename from src/blog/2026/08/images/station-data-flow.png rename to nuxt/public/blog/2026/08/images/station-data-flow.png diff --git a/src/blog/2026/08/images/turtle-diagrm.png b/nuxt/public/blog/2026/08/images/turtle-diagrm.png similarity index 100% rename from src/blog/2026/08/images/turtle-diagrm.png rename to nuxt/public/blog/2026/08/images/turtle-diagrm.png diff --git a/src/blog/2026/08/images/vda-6-3-explained.png b/nuxt/public/blog/2026/08/images/vda-6-3-explained.png similarity index 100% rename from src/blog/2026/08/images/vda-6-3-explained.png rename to nuxt/public/blog/2026/08/images/vda-6-3-explained.png diff --git a/src/blog/2026/08/images/vda-6-3.cta.png b/nuxt/public/blog/2026/08/images/vda-6-3.cta.png similarity index 100% rename from src/blog/2026/08/images/vda-6-3.cta.png rename to nuxt/public/blog/2026/08/images/vda-6-3.cta.png diff --git a/src/blog/2026/08/images/vda5050-tutorial.png b/nuxt/public/blog/2026/08/images/vda5050-tutorial.png similarity index 100% rename from src/blog/2026/08/images/vda5050-tutorial.png rename to nuxt/public/blog/2026/08/images/vda5050-tutorial.png diff --git a/src/blog/2026/08/images/what-is-layered-process-audit-lpa.png b/nuxt/public/blog/2026/08/images/what-is-layered-process-audit-lpa.png similarity index 100% rename from src/blog/2026/08/images/what-is-layered-process-audit-lpa.png rename to nuxt/public/blog/2026/08/images/what-is-layered-process-audit-lpa.png diff --git a/src/blog/2026/08/images/what-is-scada.png b/nuxt/public/blog/2026/08/images/what-is-scada.png similarity index 100% rename from src/blog/2026/08/images/what-is-scada.png rename to nuxt/public/blog/2026/08/images/what-is-scada.png diff --git a/src/blog/2026/08/images/what-is-statistical-process-control.png b/nuxt/public/blog/2026/08/images/what-is-statistical-process-control.png similarity index 100% rename from src/blog/2026/08/images/what-is-statistical-process-control.png rename to nuxt/public/blog/2026/08/images/what-is-statistical-process-control.png diff --git a/src/blog/2026/09/images/5-why-template.png b/nuxt/public/blog/2026/09/images/5-why-template.png similarity index 100% rename from src/blog/2026/09/images/5-why-template.png rename to nuxt/public/blog/2026/09/images/5-why-template.png diff --git a/src/blog/2026/09/images/5-whys-vs-fishbone-diagram.png b/nuxt/public/blog/2026/09/images/5-whys-vs-fishbone-diagram.png similarity index 100% rename from src/blog/2026/09/images/5-whys-vs-fishbone-diagram.png rename to nuxt/public/blog/2026/09/images/5-whys-vs-fishbone-diagram.png diff --git a/src/blog/2026/09/images/5-whys-vs-fishbone.png b/nuxt/public/blog/2026/09/images/5-whys-vs-fishbone.png similarity index 100% rename from src/blog/2026/09/images/5-whys-vs-fishbone.png rename to nuxt/public/blog/2026/09/images/5-whys-vs-fishbone.png diff --git a/src/blog/2026/09/images/ai-in-manufacturing-cta-1.png b/nuxt/public/blog/2026/09/images/ai-in-manufacturing-cta-1.png similarity index 100% rename from src/blog/2026/09/images/ai-in-manufacturing-cta-1.png rename to nuxt/public/blog/2026/09/images/ai-in-manufacturing-cta-1.png diff --git a/src/blog/2026/09/images/ai-in-manufacturing-cta-2.png b/nuxt/public/blog/2026/09/images/ai-in-manufacturing-cta-2.png similarity index 100% rename from src/blog/2026/09/images/ai-in-manufacturing-cta-2.png rename to nuxt/public/blog/2026/09/images/ai-in-manufacturing-cta-2.png diff --git a/src/blog/2026/09/images/ai-in-manufacturing-tile.png b/nuxt/public/blog/2026/09/images/ai-in-manufacturing-tile.png similarity index 100% rename from src/blog/2026/09/images/ai-in-manufacturing-tile.png rename to nuxt/public/blog/2026/09/images/ai-in-manufacturing-tile.png diff --git a/src/blog/2026/09/images/capa-corrective-and-preventive-action.png b/nuxt/public/blog/2026/09/images/capa-corrective-and-preventive-action.png similarity index 100% rename from src/blog/2026/09/images/capa-corrective-and-preventive-action.png rename to nuxt/public/blog/2026/09/images/capa-corrective-and-preventive-action.png diff --git a/src/blog/2026/09/images/capa-cta-1.png b/nuxt/public/blog/2026/09/images/capa-cta-1.png similarity index 100% rename from src/blog/2026/09/images/capa-cta-1.png rename to nuxt/public/blog/2026/09/images/capa-cta-1.png diff --git a/src/blog/2026/09/images/capa-cta-2.png b/nuxt/public/blog/2026/09/images/capa-cta-2.png similarity index 100% rename from src/blog/2026/09/images/capa-cta-2.png rename to nuxt/public/blog/2026/09/images/capa-cta-2.png diff --git a/src/blog/2026/09/images/corrective-vs-preventive.png b/nuxt/public/blog/2026/09/images/corrective-vs-preventive.png similarity index 100% rename from src/blog/2026/09/images/corrective-vs-preventive.png rename to nuxt/public/blog/2026/09/images/corrective-vs-preventive.png diff --git a/src/blog/2026/09/images/extend-the-capablities-of-mes.png b/nuxt/public/blog/2026/09/images/extend-the-capablities-of-mes.png similarity index 100% rename from src/blog/2026/09/images/extend-the-capablities-of-mes.png rename to nuxt/public/blog/2026/09/images/extend-the-capablities-of-mes.png diff --git a/src/blog/2026/09/images/fai-cta2.png b/nuxt/public/blog/2026/09/images/fai-cta2.png similarity index 100% rename from src/blog/2026/09/images/fai-cta2.png rename to nuxt/public/blog/2026/09/images/fai-cta2.png diff --git a/src/blog/2026/09/images/fai-flow.png b/nuxt/public/blog/2026/09/images/fai-flow.png similarity index 100% rename from src/blog/2026/09/images/fai-flow.png rename to nuxt/public/blog/2026/09/images/fai-flow.png diff --git a/src/blog/2026/09/images/fai-process-cta1.png b/nuxt/public/blog/2026/09/images/fai-process-cta1.png similarity index 100% rename from src/blog/2026/09/images/fai-process-cta1.png rename to nuxt/public/blog/2026/09/images/fai-process-cta1.png diff --git a/src/blog/2026/09/images/first-article-inspection-tile.png b/nuxt/public/blog/2026/09/images/first-article-inspection-tile.png similarity index 100% rename from src/blog/2026/09/images/first-article-inspection-tile.png rename to nuxt/public/blog/2026/09/images/first-article-inspection-tile.png diff --git a/src/blog/2026/09/images/fishbone-diagram-template.png b/nuxt/public/blog/2026/09/images/fishbone-diagram-template.png similarity index 100% rename from src/blog/2026/09/images/fishbone-diagram-template.png rename to nuxt/public/blog/2026/09/images/fishbone-diagram-template.png diff --git a/src/blog/2026/09/images/industrial-ai-agent.png b/nuxt/public/blog/2026/09/images/industrial-ai-agent.png similarity index 100% rename from src/blog/2026/09/images/industrial-ai-agent.png rename to nuxt/public/blog/2026/09/images/industrial-ai-agent.png diff --git a/src/blog/2026/09/images/layered-process-audit-checklist.png b/nuxt/public/blog/2026/09/images/layered-process-audit-checklist.png similarity index 100% rename from src/blog/2026/09/images/layered-process-audit-checklist.png rename to nuxt/public/blog/2026/09/images/layered-process-audit-checklist.png diff --git a/src/blog/2026/09/images/mes-buy-vs-build-vs-extend.png b/nuxt/public/blog/2026/09/images/mes-buy-vs-build-vs-extend.png similarity index 100% rename from src/blog/2026/09/images/mes-buy-vs-build-vs-extend.png rename to nuxt/public/blog/2026/09/images/mes-buy-vs-build-vs-extend.png diff --git a/src/blog/2026/09/images/papp-cta.png b/nuxt/public/blog/2026/09/images/papp-cta.png similarity index 100% rename from src/blog/2026/09/images/papp-cta.png rename to nuxt/public/blog/2026/09/images/papp-cta.png diff --git a/src/blog/2026/09/images/process-part-approval-blog-tile.png b/nuxt/public/blog/2026/09/images/process-part-approval-blog-tile.png similarity index 100% rename from src/blog/2026/09/images/process-part-approval-blog-tile.png rename to nuxt/public/blog/2026/09/images/process-part-approval-blog-tile.png diff --git a/src/blog/2026/09/images/root-cause-flow.png b/nuxt/public/blog/2026/09/images/root-cause-flow.png similarity index 100% rename from src/blog/2026/09/images/root-cause-flow.png rename to nuxt/public/blog/2026/09/images/root-cause-flow.png diff --git a/src/public/browserconfig.xml b/nuxt/public/browserconfig.xml similarity index 100% rename from src/public/browserconfig.xml rename to nuxt/public/browserconfig.xml diff --git a/src/changelog/2023/09/images/custom-node-support.png b/nuxt/public/changelog/2023/09/images/custom-node-support.png similarity index 100% rename from src/changelog/2023/09/images/custom-node-support.png rename to nuxt/public/changelog/2023/09/images/custom-node-support.png diff --git a/src/changelog/2023/09/images/select-action.png b/nuxt/public/changelog/2023/09/images/select-action.png similarity index 100% rename from src/changelog/2023/09/images/select-action.png rename to nuxt/public/changelog/2023/09/images/select-action.png diff --git a/src/changelog/2023/09/images/snapshots-devices.png b/nuxt/public/changelog/2023/09/images/snapshots-devices.png similarity index 100% rename from src/changelog/2023/09/images/snapshots-devices.png rename to nuxt/public/changelog/2023/09/images/snapshots-devices.png diff --git a/src/changelog/2023/10/images/Screenshot-Blueprints.png b/nuxt/public/changelog/2023/10/images/Screenshot-Blueprints.png similarity index 100% rename from src/changelog/2023/10/images/Screenshot-Blueprints.png rename to nuxt/public/changelog/2023/10/images/Screenshot-Blueprints.png diff --git a/src/changelog/2023/10/images/Screenshot-alert.png b/nuxt/public/changelog/2023/10/images/Screenshot-alert.png similarity index 100% rename from src/changelog/2023/10/images/Screenshot-alert.png rename to nuxt/public/changelog/2023/10/images/Screenshot-alert.png diff --git a/src/changelog/2023/10/images/Snapshot-Selection.png b/nuxt/public/changelog/2023/10/images/Snapshot-Selection.png similarity index 100% rename from src/changelog/2023/10/images/Snapshot-Selection.png rename to nuxt/public/changelog/2023/10/images/Snapshot-Selection.png diff --git a/src/changelog/2023/10/images/certified-nodes.png b/nuxt/public/changelog/2023/10/images/certified-nodes.png similarity index 100% rename from src/changelog/2023/10/images/certified-nodes.png rename to nuxt/public/changelog/2023/10/images/certified-nodes.png diff --git a/src/changelog/2023/11/images/2fa.png b/nuxt/public/changelog/2023/11/images/2fa.png similarity index 100% rename from src/changelog/2023/11/images/2fa.png rename to nuxt/public/changelog/2023/11/images/2fa.png diff --git a/src/changelog/2023/11/images/devices-in-pipelines.png b/nuxt/public/changelog/2023/11/images/devices-in-pipelines.png similarity index 100% rename from src/changelog/2023/11/images/devices-in-pipelines.png rename to nuxt/public/changelog/2023/11/images/devices-in-pipelines.png diff --git a/src/changelog/2023/12/images/alerts.png b/nuxt/public/changelog/2023/12/images/alerts.png similarity index 100% rename from src/changelog/2023/12/images/alerts.png rename to nuxt/public/changelog/2023/12/images/alerts.png diff --git a/src/changelog/2023/12/images/blueprints-selection.png b/nuxt/public/changelog/2023/12/images/blueprints-selection.png similarity index 100% rename from src/changelog/2023/12/images/blueprints-selection.png rename to nuxt/public/changelog/2023/12/images/blueprints-selection.png diff --git a/src/changelog/2023/12/images/device-group-pipeline.png b/nuxt/public/changelog/2023/12/images/device-group-pipeline.png similarity index 100% rename from src/changelog/2023/12/images/device-group-pipeline.png rename to nuxt/public/changelog/2023/12/images/device-group-pipeline.png diff --git a/src/changelog/2023/12/images/device-groups.png b/nuxt/public/changelog/2023/12/images/device-groups.png similarity index 100% rename from src/changelog/2023/12/images/device-groups.png rename to nuxt/public/changelog/2023/12/images/device-groups.png diff --git a/src/changelog/2024/01/images/Device-Auditlog.png b/nuxt/public/changelog/2024/01/images/Device-Auditlog.png similarity index 100% rename from src/changelog/2024/01/images/Device-Auditlog.png rename to nuxt/public/changelog/2024/01/images/Device-Auditlog.png diff --git a/src/changelog/2024/01/images/device-assignment.png b/nuxt/public/changelog/2024/01/images/device-assignment.png similarity index 100% rename from src/changelog/2024/01/images/device-assignment.png rename to nuxt/public/changelog/2024/01/images/device-assignment.png diff --git a/src/changelog/2024/02/images/Device-auto-snapshot1.png b/nuxt/public/changelog/2024/02/images/Device-auto-snapshot1.png similarity index 100% rename from src/changelog/2024/02/images/Device-auto-snapshot1.png rename to nuxt/public/changelog/2024/02/images/Device-auto-snapshot1.png diff --git a/src/changelog/2024/02/images/Device-auto-snapshot2.png b/nuxt/public/changelog/2024/02/images/Device-auto-snapshot2.png similarity index 100% rename from src/changelog/2024/02/images/Device-auto-snapshot2.png rename to nuxt/public/changelog/2024/02/images/Device-auto-snapshot2.png diff --git a/src/changelog/2024/02/images/device-auditlog.png b/nuxt/public/changelog/2024/02/images/device-auditlog.png similarity index 100% rename from src/changelog/2024/02/images/device-auditlog.png rename to nuxt/public/changelog/2024/02/images/device-auditlog.png diff --git a/src/changelog/2024/02/images/device-onboarding-improvements-1.png b/nuxt/public/changelog/2024/02/images/device-onboarding-improvements-1.png similarity index 100% rename from src/changelog/2024/02/images/device-onboarding-improvements-1.png rename to nuxt/public/changelog/2024/02/images/device-onboarding-improvements-1.png diff --git a/src/changelog/2024/02/images/device-onboarding-improvements-2.png b/nuxt/public/changelog/2024/02/images/device-onboarding-improvements-2.png similarity index 100% rename from src/changelog/2024/02/images/device-onboarding-improvements-2.png rename to nuxt/public/changelog/2024/02/images/device-onboarding-improvements-2.png diff --git a/src/changelog/2024/03/images/bearer-token-authentication.png b/nuxt/public/changelog/2024/03/images/bearer-token-authentication.png similarity index 100% rename from src/changelog/2024/03/images/bearer-token-authentication.png rename to nuxt/public/changelog/2024/03/images/bearer-token-authentication.png diff --git a/src/changelog/2024/03/images/bearer-token-exampe.png b/nuxt/public/changelog/2024/03/images/bearer-token-exampe.png similarity index 100% rename from src/changelog/2024/03/images/bearer-token-exampe.png rename to nuxt/public/changelog/2024/03/images/bearer-token-exampe.png diff --git a/src/changelog/2024/03/images/limits-payload-debug.png b/nuxt/public/changelog/2024/03/images/limits-payload-debug.png similarity index 100% rename from src/changelog/2024/03/images/limits-payload-debug.png rename to nuxt/public/changelog/2024/03/images/limits-payload-debug.png diff --git a/src/changelog/2024/03/images/restart-devices-remotly.png b/nuxt/public/changelog/2024/03/images/restart-devices-remotly.png similarity index 100% rename from src/changelog/2024/03/images/restart-devices-remotly.png rename to nuxt/public/changelog/2024/03/images/restart-devices-remotly.png diff --git a/src/changelog/2024/04/images/Dashboard-Link.png b/nuxt/public/changelog/2024/04/images/Dashboard-Link.png similarity index 100% rename from src/changelog/2024/04/images/Dashboard-Link.png rename to nuxt/public/changelog/2024/04/images/Dashboard-Link.png diff --git a/src/changelog/2024/04/images/device-group-details.png b/nuxt/public/changelog/2024/04/images/device-group-details.png similarity index 100% rename from src/changelog/2024/04/images/device-group-details.png rename to nuxt/public/changelog/2024/04/images/device-group-details.png diff --git a/src/changelog/2024/04/images/device-group-summary.png b/nuxt/public/changelog/2024/04/images/device-group-summary.png similarity index 100% rename from src/changelog/2024/04/images/device-group-summary.png rename to nuxt/public/changelog/2024/04/images/device-group-summary.png diff --git a/src/changelog/2024/04/images/device-npmrc-config.png b/nuxt/public/changelog/2024/04/images/device-npmrc-config.png similarity index 100% rename from src/changelog/2024/04/images/device-npmrc-config.png rename to nuxt/public/changelog/2024/04/images/device-npmrc-config.png diff --git a/src/changelog/2024/05/images/application-snapshots-menu.png b/nuxt/public/changelog/2024/05/images/application-snapshots-menu.png similarity index 100% rename from src/changelog/2024/05/images/application-snapshots-menu.png rename to nuxt/public/changelog/2024/05/images/application-snapshots-menu.png diff --git a/src/changelog/2024/05/images/device-snapshots-menu.png b/nuxt/public/changelog/2024/05/images/device-snapshots-menu.png similarity index 100% rename from src/changelog/2024/05/images/device-snapshots-menu.png rename to nuxt/public/changelog/2024/05/images/device-snapshots-menu.png diff --git a/src/changelog/2024/05/images/healthcheck.png b/nuxt/public/changelog/2024/05/images/healthcheck.png similarity index 100% rename from src/changelog/2024/05/images/healthcheck.png rename to nuxt/public/changelog/2024/05/images/healthcheck.png diff --git a/src/changelog/2024/05/images/instance-snapshots-menu.png b/nuxt/public/changelog/2024/05/images/instance-snapshots-menu.png similarity index 100% rename from src/changelog/2024/05/images/instance-snapshots-menu.png rename to nuxt/public/changelog/2024/05/images/instance-snapshots-menu.png diff --git a/src/changelog/2024/05/images/library-flowviewer.png b/nuxt/public/changelog/2024/05/images/library-flowviewer.png similarity index 100% rename from src/changelog/2024/05/images/library-flowviewer.png rename to nuxt/public/changelog/2024/05/images/library-flowviewer.png diff --git a/src/changelog/2024/05/images/snapshot-download.png b/nuxt/public/changelog/2024/05/images/snapshot-download.png similarity index 100% rename from src/changelog/2024/05/images/snapshot-download.png rename to nuxt/public/changelog/2024/05/images/snapshot-download.png diff --git a/src/changelog/2024/05/images/snapshot-upload.png b/nuxt/public/changelog/2024/05/images/snapshot-upload.png similarity index 100% rename from src/changelog/2024/05/images/snapshot-upload.png rename to nuxt/public/changelog/2024/05/images/snapshot-upload.png diff --git a/src/changelog/2024/06/images/multiline-env-vars.png b/nuxt/public/changelog/2024/06/images/multiline-env-vars.png similarity index 100% rename from src/changelog/2024/06/images/multiline-env-vars.png rename to nuxt/public/changelog/2024/06/images/multiline-env-vars.png diff --git a/src/changelog/2024/06/images/snapshot-compare-flows.png b/nuxt/public/changelog/2024/06/images/snapshot-compare-flows.png similarity index 100% rename from src/changelog/2024/06/images/snapshot-compare-flows.png rename to nuxt/public/changelog/2024/06/images/snapshot-compare-flows.png diff --git a/src/changelog/2024/06/images/snapshot-compare-kebab-menu.png b/nuxt/public/changelog/2024/06/images/snapshot-compare-kebab-menu.png similarity index 100% rename from src/changelog/2024/06/images/snapshot-compare-kebab-menu.png rename to nuxt/public/changelog/2024/06/images/snapshot-compare-kebab-menu.png diff --git a/src/changelog/2024/07/images/applications-search.png b/nuxt/public/changelog/2024/07/images/applications-search.png similarity index 100% rename from src/changelog/2024/07/images/applications-search.png rename to nuxt/public/changelog/2024/07/images/applications-search.png diff --git a/src/changelog/2024/07/images/ask-assistant-json-1a.png b/nuxt/public/changelog/2024/07/images/ask-assistant-json-1a.png similarity index 100% rename from src/changelog/2024/07/images/ask-assistant-json-1a.png rename to nuxt/public/changelog/2024/07/images/ask-assistant-json-1a.png diff --git a/src/changelog/2024/07/images/ask-assistant-json-1b.png b/nuxt/public/changelog/2024/07/images/ask-assistant-json-1b.png similarity index 100% rename from src/changelog/2024/07/images/ask-assistant-json-1b.png rename to nuxt/public/changelog/2024/07/images/ask-assistant-json-1b.png diff --git a/src/changelog/2024/07/images/ask-assistant-json-2a.png b/nuxt/public/changelog/2024/07/images/ask-assistant-json-2a.png similarity index 100% rename from src/changelog/2024/07/images/ask-assistant-json-2a.png rename to nuxt/public/changelog/2024/07/images/ask-assistant-json-2a.png diff --git a/src/changelog/2024/07/images/ask-assistant-json-2b.png b/nuxt/public/changelog/2024/07/images/ask-assistant-json-2b.png similarity index 100% rename from src/changelog/2024/07/images/ask-assistant-json-2b.png rename to nuxt/public/changelog/2024/07/images/ask-assistant-json-2b.png diff --git a/src/changelog/2024/07/images/assistant-dialog-function-node-builder.png b/nuxt/public/changelog/2024/07/images/assistant-dialog-function-node-builder.png similarity index 100% rename from src/changelog/2024/07/images/assistant-dialog-function-node-builder.png rename to nuxt/public/changelog/2024/07/images/assistant-dialog-function-node-builder.png diff --git a/src/changelog/2024/07/images/assistant-function-node-inline-code-lens.png b/nuxt/public/changelog/2024/07/images/assistant-function-node-inline-code-lens.png similarity index 100% rename from src/changelog/2024/07/images/assistant-function-node-inline-code-lens.png rename to nuxt/public/changelog/2024/07/images/assistant-function-node-inline-code-lens.png diff --git a/src/changelog/2024/07/images/assistant-toolbar.png b/nuxt/public/changelog/2024/07/images/assistant-toolbar.png similarity index 100% rename from src/changelog/2024/07/images/assistant-toolbar.png rename to nuxt/public/changelog/2024/07/images/assistant-toolbar.png diff --git a/src/changelog/2024/07/images/assistant-update-nr3.png b/nuxt/public/changelog/2024/07/images/assistant-update-nr3.png similarity index 100% rename from src/changelog/2024/07/images/assistant-update-nr3.png rename to nuxt/public/changelog/2024/07/images/assistant-update-nr3.png diff --git a/src/changelog/2024/07/images/assistant-update-nr4.png b/nuxt/public/changelog/2024/07/images/assistant-update-nr4.png similarity index 100% rename from src/changelog/2024/07/images/assistant-update-nr4.png rename to nuxt/public/changelog/2024/07/images/assistant-update-nr4.png diff --git a/src/changelog/2024/07/images/bulk-delete-1.png b/nuxt/public/changelog/2024/07/images/bulk-delete-1.png similarity index 100% rename from src/changelog/2024/07/images/bulk-delete-1.png rename to nuxt/public/changelog/2024/07/images/bulk-delete-1.png diff --git a/src/changelog/2024/07/images/bulk-menu.png b/nuxt/public/changelog/2024/07/images/bulk-menu.png similarity index 100% rename from src/changelog/2024/07/images/bulk-menu.png rename to nuxt/public/changelog/2024/07/images/bulk-menu.png diff --git a/src/changelog/2024/07/images/bulk-move.png b/nuxt/public/changelog/2024/07/images/bulk-move.png similarity index 100% rename from src/changelog/2024/07/images/bulk-move.png rename to nuxt/public/changelog/2024/07/images/bulk-move.png diff --git a/src/changelog/2024/07/images/edit-snapshots.png b/nuxt/public/changelog/2024/07/images/edit-snapshots.png similarity index 100% rename from src/changelog/2024/07/images/edit-snapshots.png rename to nuxt/public/changelog/2024/07/images/edit-snapshots.png diff --git a/src/changelog/2024/07/images/notifications-inbox-read.png b/nuxt/public/changelog/2024/07/images/notifications-inbox-read.png similarity index 100% rename from src/changelog/2024/07/images/notifications-inbox-read.png rename to nuxt/public/changelog/2024/07/images/notifications-inbox-read.png diff --git a/src/changelog/2024/07/images/notifications-inbox-unread.png b/nuxt/public/changelog/2024/07/images/notifications-inbox-unread.png similarity index 100% rename from src/changelog/2024/07/images/notifications-inbox-unread.png rename to nuxt/public/changelog/2024/07/images/notifications-inbox-unread.png diff --git a/src/changelog/2024/07/images/notifications-inbox.png b/nuxt/public/changelog/2024/07/images/notifications-inbox.png similarity index 100% rename from src/changelog/2024/07/images/notifications-inbox.png rename to nuxt/public/changelog/2024/07/images/notifications-inbox.png diff --git a/src/changelog/2024/08/images/bom.png b/nuxt/public/changelog/2024/08/images/bom.png similarity index 100% rename from src/changelog/2024/08/images/bom.png rename to nuxt/public/changelog/2024/08/images/bom.png diff --git a/src/changelog/2024/08/images/expired-banner.png b/nuxt/public/changelog/2024/08/images/expired-banner.png similarity index 100% rename from src/changelog/2024/08/images/expired-banner.png rename to nuxt/public/changelog/2024/08/images/expired-banner.png diff --git a/src/changelog/2024/08/images/expiring-banner.png b/nuxt/public/changelog/2024/08/images/expiring-banner.png similarity index 100% rename from src/changelog/2024/08/images/expiring-banner.png rename to nuxt/public/changelog/2024/08/images/expiring-banner.png diff --git a/src/changelog/2024/08/images/ldap-group.png b/nuxt/public/changelog/2024/08/images/ldap-group.png similarity index 100% rename from src/changelog/2024/08/images/ldap-group.png rename to nuxt/public/changelog/2024/08/images/ldap-group.png diff --git a/src/changelog/2024/08/images/static-file-service-navigation-visibility/1-selector.png b/nuxt/public/changelog/2024/08/images/static-file-service-navigation-visibility/1-selector.png similarity index 100% rename from src/changelog/2024/08/images/static-file-service-navigation-visibility/1-selector.png rename to nuxt/public/changelog/2024/08/images/static-file-service-navigation-visibility/1-selector.png diff --git a/src/changelog/2024/08/images/static-file-service-navigation-visibility/2-select-static-path.png b/nuxt/public/changelog/2024/08/images/static-file-service-navigation-visibility/2-select-static-path.png similarity index 100% rename from src/changelog/2024/08/images/static-file-service-navigation-visibility/2-select-static-path.png rename to nuxt/public/changelog/2024/08/images/static-file-service-navigation-visibility/2-select-static-path.png diff --git a/src/changelog/2024/08/images/static-file-service-navigation-visibility/3-public-visibility.png b/nuxt/public/changelog/2024/08/images/static-file-service-navigation-visibility/3-public-visibility.png similarity index 100% rename from src/changelog/2024/08/images/static-file-service-navigation-visibility/3-public-visibility.png rename to nuxt/public/changelog/2024/08/images/static-file-service-navigation-visibility/3-public-visibility.png diff --git a/src/changelog/2024/10/images/bulk-notifications.png b/nuxt/public/changelog/2024/10/images/bulk-notifications.png similarity index 100% rename from src/changelog/2024/10/images/bulk-notifications.png rename to nuxt/public/changelog/2024/10/images/bulk-notifications.png diff --git a/src/changelog/2024/10/images/device-group--with-env-vars.png b/nuxt/public/changelog/2024/10/images/device-group--with-env-vars.png similarity index 100% rename from src/changelog/2024/10/images/device-group--with-env-vars.png rename to nuxt/public/changelog/2024/10/images/device-group--with-env-vars.png diff --git a/src/changelog/2024/10/images/snapshot-download--with-options.png b/nuxt/public/changelog/2024/10/images/snapshot-download--with-options.png similarity index 100% rename from src/changelog/2024/10/images/snapshot-download--with-options.png rename to nuxt/public/changelog/2024/10/images/snapshot-download--with-options.png diff --git a/src/changelog/2024/10/images/snapshot-upload--with-options.png b/nuxt/public/changelog/2024/10/images/snapshot-upload--with-options.png similarity index 100% rename from src/changelog/2024/10/images/snapshot-upload--with-options.png rename to nuxt/public/changelog/2024/10/images/snapshot-upload--with-options.png diff --git a/src/changelog/2024/10/images/version-history-snapshots.png b/nuxt/public/changelog/2024/10/images/version-history-snapshots.png similarity index 100% rename from src/changelog/2024/10/images/version-history-snapshots.png rename to nuxt/public/changelog/2024/10/images/version-history-snapshots.png diff --git a/src/changelog/2024/10/images/version-history-timeline.png b/nuxt/public/changelog/2024/10/images/version-history-timeline.png similarity index 100% rename from src/changelog/2024/10/images/version-history-timeline.png rename to nuxt/public/changelog/2024/10/images/version-history-timeline.png diff --git a/src/changelog/2024/11/images/audit-log-child-events.png b/nuxt/public/changelog/2024/11/images/audit-log-child-events.png similarity index 100% rename from src/changelog/2024/11/images/audit-log-child-events.png rename to nuxt/public/changelog/2024/11/images/audit-log-child-events.png diff --git a/src/changelog/2024/11/images/screenshot-mqtt-hierarchy.png b/nuxt/public/changelog/2024/11/images/screenshot-mqtt-hierarchy.png similarity index 100% rename from src/changelog/2024/11/images/screenshot-mqtt-hierarchy.png rename to nuxt/public/changelog/2024/11/images/screenshot-mqtt-hierarchy.png diff --git a/src/changelog/2024/11/images/screenshot-search.png b/nuxt/public/changelog/2024/11/images/screenshot-search.png similarity index 100% rename from src/changelog/2024/11/images/screenshot-search.png rename to nuxt/public/changelog/2024/11/images/screenshot-search.png diff --git a/src/changelog/2024/12/images/enable-iframe.png b/nuxt/public/changelog/2024/12/images/enable-iframe.png similarity index 100% rename from src/changelog/2024/12/images/enable-iframe.png rename to nuxt/public/changelog/2024/12/images/enable-iframe.png diff --git a/src/changelog/2024/12/images/sso-group-prefix-length.png b/nuxt/public/changelog/2024/12/images/sso-group-prefix-length.png similarity index 100% rename from src/changelog/2024/12/images/sso-group-prefix-length.png rename to nuxt/public/changelog/2024/12/images/sso-group-prefix-length.png diff --git a/src/changelog/2024/12/images/team-bom.png b/nuxt/public/changelog/2024/12/images/team-bom.png similarity index 100% rename from src/changelog/2024/12/images/team-bom.png rename to nuxt/public/changelog/2024/12/images/team-bom.png diff --git a/src/changelog/2024/12/images/team-pipeline.png b/nuxt/public/changelog/2024/12/images/team-pipeline.png similarity index 100% rename from src/changelog/2024/12/images/team-pipeline.png rename to nuxt/public/changelog/2024/12/images/team-pipeline.png diff --git a/src/changelog/2024/12/images/upgrade-iframe-dashboard.png b/nuxt/public/changelog/2024/12/images/upgrade-iframe-dashboard.png similarity index 100% rename from src/changelog/2024/12/images/upgrade-iframe-dashboard.png rename to nuxt/public/changelog/2024/12/images/upgrade-iframe-dashboard.png diff --git a/src/changelog/2025/01/images/free-tier-onboarding.png b/nuxt/public/changelog/2025/01/images/free-tier-onboarding.png similarity index 100% rename from src/changelog/2025/01/images/free-tier-onboarding.png rename to nuxt/public/changelog/2025/01/images/free-tier-onboarding.png diff --git a/src/changelog/2025/01/images/hidden-env-var-devices.png b/nuxt/public/changelog/2025/01/images/hidden-env-var-devices.png similarity index 100% rename from src/changelog/2025/01/images/hidden-env-var-devices.png rename to nuxt/public/changelog/2025/01/images/hidden-env-var-devices.png diff --git a/src/changelog/2025/01/images/hidden-env-var-instances.png b/nuxt/public/changelog/2025/01/images/hidden-env-var-instances.png similarity index 100% rename from src/changelog/2025/01/images/hidden-env-var-instances.png rename to nuxt/public/changelog/2025/01/images/hidden-env-var-instances.png diff --git a/src/changelog/2025/01/images/team-level-groups.png b/nuxt/public/changelog/2025/01/images/team-level-groups.png similarity index 100% rename from src/changelog/2025/01/images/team-level-groups.png rename to nuxt/public/changelog/2025/01/images/team-level-groups.png diff --git a/src/changelog/2025/02/images/broker-error-feedback.png b/nuxt/public/changelog/2025/02/images/broker-error-feedback.png similarity index 100% rename from src/changelog/2025/02/images/broker-error-feedback.png rename to nuxt/public/changelog/2025/02/images/broker-error-feedback.png diff --git a/src/changelog/2025/02/images/device-version-history-snapshots.png b/nuxt/public/changelog/2025/02/images/device-version-history-snapshots.png similarity index 100% rename from src/changelog/2025/02/images/device-version-history-snapshots.png rename to nuxt/public/changelog/2025/02/images/device-version-history-snapshots.png diff --git a/src/changelog/2025/02/images/device-version-history-timeline.png b/nuxt/public/changelog/2025/02/images/device-version-history-timeline.png similarity index 100% rename from src/changelog/2025/02/images/device-version-history-timeline.png rename to nuxt/public/changelog/2025/02/images/device-version-history-timeline.png diff --git a/src/changelog/2025/02/images/mqtt-schema-suggestions.png b/nuxt/public/changelog/2025/02/images/mqtt-schema-suggestions.png similarity index 100% rename from src/changelog/2025/02/images/mqtt-schema-suggestions.png rename to nuxt/public/changelog/2025/02/images/mqtt-schema-suggestions.png diff --git a/src/changelog/2025/02/images/new-external-broker.png b/nuxt/public/changelog/2025/02/images/new-external-broker.png similarity index 100% rename from src/changelog/2025/02/images/new-external-broker.png rename to nuxt/public/changelog/2025/02/images/new-external-broker.png diff --git a/src/changelog/2025/02/images/resend-invitation.png b/nuxt/public/changelog/2025/02/images/resend-invitation.png similarity index 100% rename from src/changelog/2025/02/images/resend-invitation.png rename to nuxt/public/changelog/2025/02/images/resend-invitation.png diff --git a/src/changelog/2025/02/images/schema-documentation.png b/nuxt/public/changelog/2025/02/images/schema-documentation.png similarity index 100% rename from src/changelog/2025/02/images/schema-documentation.png rename to nuxt/public/changelog/2025/02/images/schema-documentation.png diff --git a/src/changelog/2025/02/images/topic-and-payload-schema.png b/nuxt/public/changelog/2025/02/images/topic-and-payload-schema.png similarity index 100% rename from src/changelog/2025/02/images/topic-and-payload-schema.png rename to nuxt/public/changelog/2025/02/images/topic-and-payload-schema.png diff --git a/src/changelog/2025/02/images/topic-hierarchy-search.png b/nuxt/public/changelog/2025/02/images/topic-hierarchy-search.png similarity index 100% rename from src/changelog/2025/02/images/topic-hierarchy-search.png rename to nuxt/public/changelog/2025/02/images/topic-hierarchy-search.png diff --git a/src/changelog/2025/03/images/custom-catalogue.png b/nuxt/public/changelog/2025/03/images/custom-catalogue.png similarity index 100% rename from src/changelog/2025/03/images/custom-catalogue.png rename to nuxt/public/changelog/2025/03/images/custom-catalogue.png diff --git a/src/changelog/2025/03/images/custom-node-library.png b/nuxt/public/changelog/2025/03/images/custom-node-library.png similarity index 100% rename from src/changelog/2025/03/images/custom-node-library.png rename to nuxt/public/changelog/2025/03/images/custom-node-library.png diff --git a/src/changelog/2025/03/images/device-agent-local-login-settings.png b/nuxt/public/changelog/2025/03/images/device-agent-local-login-settings.png similarity index 100% rename from src/changelog/2025/03/images/device-agent-local-login-settings.png rename to nuxt/public/changelog/2025/03/images/device-agent-local-login-settings.png diff --git a/src/changelog/2025/03/images/resource-notifications-settings.png b/nuxt/public/changelog/2025/03/images/resource-notifications-settings.png similarity index 100% rename from src/changelog/2025/03/images/resource-notifications-settings.png rename to nuxt/public/changelog/2025/03/images/resource-notifications-settings.png diff --git a/src/changelog/2025/03/images/resource-notifications.png b/nuxt/public/changelog/2025/03/images/resource-notifications.png similarity index 100% rename from src/changelog/2025/03/images/resource-notifications.png rename to nuxt/public/changelog/2025/03/images/resource-notifications.png diff --git a/src/changelog/2025/03/images/snapshot-filter.png b/nuxt/public/changelog/2025/03/images/snapshot-filter.png similarity index 100% rename from src/changelog/2025/03/images/snapshot-filter.png rename to nuxt/public/changelog/2025/03/images/snapshot-filter.png diff --git a/src/changelog/2025/03/images/topic-deletion.png b/nuxt/public/changelog/2025/03/images/topic-deletion.png similarity index 100% rename from src/changelog/2025/03/images/topic-deletion.png rename to nuxt/public/changelog/2025/03/images/topic-deletion.png diff --git a/src/changelog/2025/04/images/browse-logs.png b/nuxt/public/changelog/2025/04/images/browse-logs.png similarity index 100% rename from src/changelog/2025/04/images/browse-logs.png rename to nuxt/public/changelog/2025/04/images/browse-logs.png diff --git a/src/changelog/2025/04/images/create-provisioning-token.png b/nuxt/public/changelog/2025/04/images/create-provisioning-token.png similarity index 100% rename from src/changelog/2025/04/images/create-provisioning-token.png rename to nuxt/public/changelog/2025/04/images/create-provisioning-token.png diff --git a/src/changelog/2025/04/images/git-pipeline-stage.png b/nuxt/public/changelog/2025/04/images/git-pipeline-stage.png similarity index 100% rename from src/changelog/2025/04/images/git-pipeline-stage.png rename to nuxt/public/changelog/2025/04/images/git-pipeline-stage.png diff --git a/src/changelog/2025/05/images/device-agent-import.png b/nuxt/public/changelog/2025/05/images/device-agent-import.png similarity index 100% rename from src/changelog/2025/05/images/device-agent-import.png rename to nuxt/public/changelog/2025/05/images/device-agent-import.png diff --git a/src/changelog/2025/05/images/device-setup-dialog.png b/nuxt/public/changelog/2025/05/images/device-setup-dialog.png similarity index 100% rename from src/changelog/2025/05/images/device-setup-dialog.png rename to nuxt/public/changelog/2025/05/images/device-setup-dialog.png diff --git a/src/changelog/2025/06/images/assistant-0-3-0-flow-explainer.gif b/nuxt/public/changelog/2025/06/images/assistant-0-3-0-flow-explainer.gif similarity index 100% rename from src/changelog/2025/06/images/assistant-0-3-0-flow-explainer.gif rename to nuxt/public/changelog/2025/06/images/assistant-0-3-0-flow-explainer.gif diff --git a/src/changelog/2025/06/images/assistant-0-3-0-ui-template-css.gif b/nuxt/public/changelog/2025/06/images/assistant-0-3-0-ui-template-css.gif similarity index 100% rename from src/changelog/2025/06/images/assistant-0-3-0-ui-template-css.gif rename to nuxt/public/changelog/2025/06/images/assistant-0-3-0-ui-template-css.gif diff --git a/src/changelog/2025/06/images/assistant-0-3-0-ui-template-vue.gif b/nuxt/public/changelog/2025/06/images/assistant-0-3-0-ui-template-vue.gif similarity index 100% rename from src/changelog/2025/06/images/assistant-0-3-0-ui-template-vue.gif rename to nuxt/public/changelog/2025/06/images/assistant-0-3-0-ui-template-vue.gif diff --git a/src/changelog/2025/06/images/assistant-0-3-0-update-nr4.png b/nuxt/public/changelog/2025/06/images/assistant-0-3-0-update-nr4.png similarity index 100% rename from src/changelog/2025/06/images/assistant-0-3-0-update-nr4.png rename to nuxt/public/changelog/2025/06/images/assistant-0-3-0-update-nr4.png diff --git a/src/changelog/2025/06/images/assistant-new-menu.png b/nuxt/public/changelog/2025/06/images/assistant-new-menu.png similarity index 100% rename from src/changelog/2025/06/images/assistant-new-menu.png rename to nuxt/public/changelog/2025/06/images/assistant-new-menu.png diff --git a/src/changelog/2025/06/images/assistant-update-nr3.png b/nuxt/public/changelog/2025/06/images/assistant-update-nr3.png similarity index 100% rename from src/changelog/2025/06/images/assistant-update-nr3.png rename to nuxt/public/changelog/2025/06/images/assistant-update-nr3.png diff --git a/src/changelog/2025/06/images/assistant-update-nr4.png b/nuxt/public/changelog/2025/06/images/assistant-update-nr4.png similarity index 100% rename from src/changelog/2025/06/images/assistant-update-nr4.png rename to nuxt/public/changelog/2025/06/images/assistant-update-nr4.png diff --git a/src/changelog/2025/06/images/flowfuse-assistant-flow-explainer.gif b/nuxt/public/changelog/2025/06/images/flowfuse-assistant-flow-explainer.gif similarity index 100% rename from src/changelog/2025/06/images/flowfuse-assistant-flow-explainer.gif rename to nuxt/public/changelog/2025/06/images/flowfuse-assistant-flow-explainer.gif diff --git a/src/changelog/2025/06/images/instance-performance-memory.png b/nuxt/public/changelog/2025/06/images/instance-performance-memory.png similarity index 100% rename from src/changelog/2025/06/images/instance-performance-memory.png rename to nuxt/public/changelog/2025/06/images/instance-performance-memory.png diff --git a/src/changelog/2025/06/images/instance-performance.png b/nuxt/public/changelog/2025/06/images/instance-performance.png similarity index 100% rename from src/changelog/2025/06/images/instance-performance.png rename to nuxt/public/changelog/2025/06/images/instance-performance.png diff --git a/src/changelog/2025/06/images/new-home-page.png b/nuxt/public/changelog/2025/06/images/new-home-page.png similarity index 100% rename from src/changelog/2025/06/images/new-home-page.png rename to nuxt/public/changelog/2025/06/images/new-home-page.png diff --git a/src/changelog/2025/06/images/team-performance.png b/nuxt/public/changelog/2025/06/images/team-performance.png similarity index 100% rename from src/changelog/2025/06/images/team-performance.png rename to nuxt/public/changelog/2025/06/images/team-performance.png diff --git a/src/changelog/2025/06/images/ui-refresh-1.png b/nuxt/public/changelog/2025/06/images/ui-refresh-1.png similarity index 100% rename from src/changelog/2025/06/images/ui-refresh-1.png rename to nuxt/public/changelog/2025/06/images/ui-refresh-1.png diff --git a/src/changelog/2025/07/images/create-database.png b/nuxt/public/changelog/2025/07/images/create-database.png similarity index 100% rename from src/changelog/2025/07/images/create-database.png rename to nuxt/public/changelog/2025/07/images/create-database.png diff --git a/src/changelog/2025/07/images/import-blueprint.png b/nuxt/public/changelog/2025/07/images/import-blueprint.png similarity index 100% rename from src/changelog/2025/07/images/import-blueprint.png rename to nuxt/public/changelog/2025/07/images/import-blueprint.png diff --git a/src/changelog/2025/07/images/import-flows-browsed.gif b/nuxt/public/changelog/2025/07/images/import-flows-browsed.gif similarity index 100% rename from src/changelog/2025/07/images/import-flows-browsed.gif rename to nuxt/public/changelog/2025/07/images/import-flows-browsed.gif diff --git a/src/changelog/2025/07/images/import-flows-quick-select.gif b/nuxt/public/changelog/2025/07/images/import-flows-quick-select.gif similarity index 100% rename from src/changelog/2025/07/images/import-flows-quick-select.gif rename to nuxt/public/changelog/2025/07/images/import-flows-quick-select.gif diff --git a/src/changelog/2025/07/images/simplified-applications.png b/nuxt/public/changelog/2025/07/images/simplified-applications.png similarity index 100% rename from src/changelog/2025/07/images/simplified-applications.png rename to nuxt/public/changelog/2025/07/images/simplified-applications.png diff --git a/src/changelog/2025/07/images/smart-suggestion.gif b/nuxt/public/changelog/2025/07/images/smart-suggestion.gif similarity index 100% rename from src/changelog/2025/07/images/smart-suggestion.gif rename to nuxt/public/changelog/2025/07/images/smart-suggestion.gif diff --git a/src/changelog/2025/07/images/table-data-sample.png b/nuxt/public/changelog/2025/07/images/table-data-sample.png similarity index 100% rename from src/changelog/2025/07/images/table-data-sample.png rename to nuxt/public/changelog/2025/07/images/table-data-sample.png diff --git a/src/changelog/2025/07/images/tables-node.png b/nuxt/public/changelog/2025/07/images/tables-node.png similarity index 100% rename from src/changelog/2025/07/images/tables-node.png rename to nuxt/public/changelog/2025/07/images/tables-node.png diff --git a/src/changelog/2025/08/images/device-llm-snapshot-description_application-owned.gif b/nuxt/public/changelog/2025/08/images/device-llm-snapshot-description_application-owned.gif similarity index 100% rename from src/changelog/2025/08/images/device-llm-snapshot-description_application-owned.gif rename to nuxt/public/changelog/2025/08/images/device-llm-snapshot-description_application-owned.gif diff --git a/src/changelog/2025/08/images/device-llm-snapshot-description_instance-owned.gif b/nuxt/public/changelog/2025/08/images/device-llm-snapshot-description_instance-owned.gif similarity index 100% rename from src/changelog/2025/08/images/device-llm-snapshot-description_instance-owned.gif rename to nuxt/public/changelog/2025/08/images/device-llm-snapshot-description_instance-owned.gif diff --git a/src/changelog/2025/08/images/device-performance.png b/nuxt/public/changelog/2025/08/images/device-performance.png similarity index 100% rename from src/changelog/2025/08/images/device-performance.png rename to nuxt/public/changelog/2025/08/images/device-performance.png diff --git a/src/changelog/2025/08/images/direct-sso-config.png b/nuxt/public/changelog/2025/08/images/direct-sso-config.png similarity index 100% rename from src/changelog/2025/08/images/direct-sso-config.png rename to nuxt/public/changelog/2025/08/images/direct-sso-config.png diff --git a/src/changelog/2025/08/images/direct-sso.png b/nuxt/public/changelog/2025/08/images/direct-sso.png similarity index 100% rename from src/changelog/2025/08/images/direct-sso.png rename to nuxt/public/changelog/2025/08/images/direct-sso.png diff --git a/src/changelog/2025/08/images/explainer-to-comment-node.gif b/nuxt/public/changelog/2025/08/images/explainer-to-comment-node.gif similarity index 100% rename from src/changelog/2025/08/images/explainer-to-comment-node.gif rename to nuxt/public/changelog/2025/08/images/explainer-to-comment-node.gif diff --git a/src/changelog/2025/08/images/http-cors.png b/nuxt/public/changelog/2025/08/images/http-cors.png similarity index 100% rename from src/changelog/2025/08/images/http-cors.png rename to nuxt/public/changelog/2025/08/images/http-cors.png diff --git a/src/changelog/2025/08/images/mqtt-nodes-1.png b/nuxt/public/changelog/2025/08/images/mqtt-nodes-1.png similarity index 100% rename from src/changelog/2025/08/images/mqtt-nodes-1.png rename to nuxt/public/changelog/2025/08/images/mqtt-nodes-1.png diff --git a/src/changelog/2025/08/images/mqtt-nodes-2.png b/nuxt/public/changelog/2025/08/images/mqtt-nodes-2.png similarity index 100% rename from src/changelog/2025/08/images/mqtt-nodes-2.png rename to nuxt/public/changelog/2025/08/images/mqtt-nodes-2.png diff --git a/src/changelog/2025/08/images/query-assist.gif b/nuxt/public/changelog/2025/08/images/query-assist.gif similarity index 100% rename from src/changelog/2025/08/images/query-assist.gif rename to nuxt/public/changelog/2025/08/images/query-assist.gif diff --git a/src/changelog/2025/08/images/snapshot-description-generation-hosted.gif b/nuxt/public/changelog/2025/08/images/snapshot-description-generation-hosted.gif similarity index 100% rename from src/changelog/2025/08/images/snapshot-description-generation-hosted.gif rename to nuxt/public/changelog/2025/08/images/snapshot-description-generation-hosted.gif diff --git a/src/changelog/2025/08/images/subflow-catalogue.png b/nuxt/public/changelog/2025/08/images/subflow-catalogue.png similarity index 100% rename from src/changelog/2025/08/images/subflow-catalogue.png rename to nuxt/public/changelog/2025/08/images/subflow-catalogue.png diff --git a/src/changelog/2025/08/images/subflow-export.png b/nuxt/public/changelog/2025/08/images/subflow-export.png similarity index 100% rename from src/changelog/2025/08/images/subflow-export.png rename to nuxt/public/changelog/2025/08/images/subflow-export.png diff --git a/src/changelog/2025/09/images/inline-assist-function-node.gif b/nuxt/public/changelog/2025/09/images/inline-assist-function-node.gif similarity index 100% rename from src/changelog/2025/09/images/inline-assist-function-node.gif rename to nuxt/public/changelog/2025/09/images/inline-assist-function-node.gif diff --git a/src/changelog/2025/09/images/inline-assist-query-node.gif b/nuxt/public/changelog/2025/09/images/inline-assist-query-node.gif similarity index 100% rename from src/changelog/2025/09/images/inline-assist-query-node.gif rename to nuxt/public/changelog/2025/09/images/inline-assist-query-node.gif diff --git a/src/changelog/2025/09/images/inline-assist-template-node.gif b/nuxt/public/changelog/2025/09/images/inline-assist-template-node.gif similarity index 100% rename from src/changelog/2025/09/images/inline-assist-template-node.gif rename to nuxt/public/changelog/2025/09/images/inline-assist-template-node.gif diff --git a/src/changelog/2025/09/images/revised-instance-snapshots.gif b/nuxt/public/changelog/2025/09/images/revised-instance-snapshots.gif similarity index 100% rename from src/changelog/2025/09/images/revised-instance-snapshots.gif rename to nuxt/public/changelog/2025/09/images/revised-instance-snapshots.gif diff --git a/src/changelog/2025/09/images/team-broker-schema.png b/nuxt/public/changelog/2025/09/images/team-broker-schema.png similarity index 100% rename from src/changelog/2025/09/images/team-broker-schema.png rename to nuxt/public/changelog/2025/09/images/team-broker-schema.png diff --git a/src/changelog/2025/10/images/ai-nodes-image-depth-node.png b/nuxt/public/changelog/2025/10/images/ai-nodes-image-depth-node.png similarity index 100% rename from src/changelog/2025/10/images/ai-nodes-image-depth-node.png rename to nuxt/public/changelog/2025/10/images/ai-nodes-image-depth-node.png diff --git a/src/changelog/2025/10/images/ai-nodes-onnx-node-custom-model.png b/nuxt/public/changelog/2025/10/images/ai-nodes-onnx-node-custom-model.png similarity index 100% rename from src/changelog/2025/10/images/ai-nodes-onnx-node-custom-model.png rename to nuxt/public/changelog/2025/10/images/ai-nodes-onnx-node-custom-model.png diff --git a/src/changelog/2025/10/images/ai-nodes-onnx-node-tts.png b/nuxt/public/changelog/2025/10/images/ai-nodes-onnx-node-tts.png similarity index 100% rename from src/changelog/2025/10/images/ai-nodes-onnx-node-tts.png rename to nuxt/public/changelog/2025/10/images/ai-nodes-onnx-node-tts.png diff --git a/src/changelog/2025/10/images/application-rbac.png b/nuxt/public/changelog/2025/10/images/application-rbac.png similarity index 100% rename from src/changelog/2025/10/images/application-rbac.png rename to nuxt/public/changelog/2025/10/images/application-rbac.png diff --git a/src/changelog/2025/10/images/bulk-assign-device-groups.gif b/nuxt/public/changelog/2025/10/images/bulk-assign-device-groups.gif similarity index 100% rename from src/changelog/2025/10/images/bulk-assign-device-groups.gif rename to nuxt/public/changelog/2025/10/images/bulk-assign-device-groups.gif diff --git a/src/changelog/2025/10/images/import-flows-on-instance-creation.png b/nuxt/public/changelog/2025/10/images/import-flows-on-instance-creation.png similarity index 100% rename from src/changelog/2025/10/images/import-flows-on-instance-creation.png rename to nuxt/public/changelog/2025/10/images/import-flows-on-instance-creation.png diff --git a/src/changelog/2025/10/images/mcp-nodes-in-catalog.png b/nuxt/public/changelog/2025/10/images/mcp-nodes-in-catalog.png similarity index 100% rename from src/changelog/2025/10/images/mcp-nodes-in-catalog.png rename to nuxt/public/changelog/2025/10/images/mcp-nodes-in-catalog.png diff --git a/src/changelog/2025/10/images/mcp-nodes.png b/nuxt/public/changelog/2025/10/images/mcp-nodes.png similarity index 100% rename from src/changelog/2025/10/images/mcp-nodes.png rename to nuxt/public/changelog/2025/10/images/mcp-nodes.png diff --git a/src/changelog/2025/10/images/settings-page-device-group-management.png b/nuxt/public/changelog/2025/10/images/settings-page-device-group-management.png similarity index 100% rename from src/changelog/2025/10/images/settings-page-device-group-management.png rename to nuxt/public/changelog/2025/10/images/settings-page-device-group-management.png diff --git a/src/changelog/2025/11/images/continue.png b/nuxt/public/changelog/2025/11/images/continue.png similarity index 100% rename from src/changelog/2025/11/images/continue.png rename to nuxt/public/changelog/2025/11/images/continue.png diff --git a/src/changelog/2025/11/images/in-app.png b/nuxt/public/changelog/2025/11/images/in-app.png similarity index 100% rename from src/changelog/2025/11/images/in-app.png rename to nuxt/public/changelog/2025/11/images/in-app.png diff --git a/src/changelog/2025/11/images/sso-expiry-idle.png b/nuxt/public/changelog/2025/11/images/sso-expiry-idle.png similarity index 100% rename from src/changelog/2025/11/images/sso-expiry-idle.png rename to nuxt/public/changelog/2025/11/images/sso-expiry-idle.png diff --git a/src/changelog/2025/12/images/ff-expert-mcp-demo.gif b/nuxt/public/changelog/2025/12/images/ff-expert-mcp-demo.gif similarity index 100% rename from src/changelog/2025/12/images/ff-expert-mcp-demo.gif rename to nuxt/public/changelog/2025/12/images/ff-expert-mcp-demo.gif diff --git a/src/changelog/2025/12/images/scheduled-maintenance-admin.png b/nuxt/public/changelog/2025/12/images/scheduled-maintenance-admin.png similarity index 100% rename from src/changelog/2025/12/images/scheduled-maintenance-admin.png rename to nuxt/public/changelog/2025/12/images/scheduled-maintenance-admin.png diff --git a/src/changelog/2025/12/images/scheduled-maintenance.png b/nuxt/public/changelog/2025/12/images/scheduled-maintenance.png similarity index 100% rename from src/changelog/2025/12/images/scheduled-maintenance.png rename to nuxt/public/changelog/2025/12/images/scheduled-maintenance.png diff --git a/src/changelog/2026/01/images/ff-expert-flows-in-context.gif b/nuxt/public/changelog/2026/01/images/ff-expert-flows-in-context.gif similarity index 100% rename from src/changelog/2026/01/images/ff-expert-flows-in-context.gif rename to nuxt/public/changelog/2026/01/images/ff-expert-flows-in-context.gif diff --git a/src/changelog/2026/01/images/ff-expert-install-node.gif b/nuxt/public/changelog/2026/01/images/ff-expert-install-node.gif similarity index 100% rename from src/changelog/2026/01/images/ff-expert-install-node.gif rename to nuxt/public/changelog/2026/01/images/ff-expert-install-node.gif diff --git a/src/changelog/2026/01/images/ff-expert-manage-palette.png b/nuxt/public/changelog/2026/01/images/ff-expert-manage-palette.png similarity index 100% rename from src/changelog/2026/01/images/ff-expert-manage-palette.png rename to nuxt/public/changelog/2026/01/images/ff-expert-manage-palette.png diff --git a/src/changelog/2026/01/images/ff-expert-palette-context.gif b/nuxt/public/changelog/2026/01/images/ff-expert-palette-context.gif similarity index 100% rename from src/changelog/2026/01/images/ff-expert-palette-context.gif rename to nuxt/public/changelog/2026/01/images/ff-expert-palette-context.gif diff --git a/src/changelog/2026/01/images/mcp-annotations.png b/nuxt/public/changelog/2026/01/images/mcp-annotations.png similarity index 100% rename from src/changelog/2026/01/images/mcp-annotations.png rename to nuxt/public/changelog/2026/01/images/mcp-annotations.png diff --git a/src/changelog/2026/02/images/expert-debug-context.gif b/nuxt/public/changelog/2026/02/images/expert-debug-context.gif similarity index 100% rename from src/changelog/2026/02/images/expert-debug-context.gif rename to nuxt/public/changelog/2026/02/images/expert-debug-context.gif diff --git a/src/changelog/2026/02/images/expert-debug-log-specific.gif b/nuxt/public/changelog/2026/02/images/expert-debug-log-specific.gif similarity index 100% rename from src/changelog/2026/02/images/expert-debug-log-specific.gif rename to nuxt/public/changelog/2026/02/images/expert-debug-log-specific.gif diff --git a/src/changelog/2026/02/images/ff-expert-update-banner.gif b/nuxt/public/changelog/2026/02/images/ff-expert-update-banner.gif similarity index 100% rename from src/changelog/2026/02/images/ff-expert-update-banner.gif rename to nuxt/public/changelog/2026/02/images/ff-expert-update-banner.gif diff --git a/src/changelog/2026/02/images/remote-instance-immersive.gif b/nuxt/public/changelog/2026/02/images/remote-instance-immersive.gif similarity index 100% rename from src/changelog/2026/02/images/remote-instance-immersive.gif rename to nuxt/public/changelog/2026/02/images/remote-instance-immersive.gif diff --git a/src/changelog/2026/02/images/snapshot-restore.png b/nuxt/public/changelog/2026/02/images/snapshot-restore.png similarity index 100% rename from src/changelog/2026/02/images/snapshot-restore.png rename to nuxt/public/changelog/2026/02/images/snapshot-restore.png diff --git a/src/changelog/2026/03/images/azure-token.png b/nuxt/public/changelog/2026/03/images/azure-token.png similarity index 100% rename from src/changelog/2026/03/images/azure-token.png rename to nuxt/public/changelog/2026/03/images/azure-token.png diff --git a/src/changelog/2026/03/images/browser-title-after.png b/nuxt/public/changelog/2026/03/images/browser-title-after.png similarity index 100% rename from src/changelog/2026/03/images/browser-title-after.png rename to nuxt/public/changelog/2026/03/images/browser-title-after.png diff --git a/src/changelog/2026/03/images/browser-title-before.png b/nuxt/public/changelog/2026/03/images/browser-title-before.png similarity index 100% rename from src/changelog/2026/03/images/browser-title-before.png rename to nuxt/public/changelog/2026/03/images/browser-title-before.png diff --git a/src/changelog/2026/03/images/developer-mode-in-editor.png b/nuxt/public/changelog/2026/03/images/developer-mode-in-editor.png similarity index 100% rename from src/changelog/2026/03/images/developer-mode-in-editor.png rename to nuxt/public/changelog/2026/03/images/developer-mode-in-editor.png diff --git a/src/changelog/2026/03/images/snapshot-modal-view.png b/nuxt/public/changelog/2026/03/images/snapshot-modal-view.png similarity index 100% rename from src/changelog/2026/03/images/snapshot-modal-view.png rename to nuxt/public/changelog/2026/03/images/snapshot-modal-view.png diff --git a/src/changelog/2026/03/images/snapshot-toggle.png b/nuxt/public/changelog/2026/03/images/snapshot-toggle.png similarity index 100% rename from src/changelog/2026/03/images/snapshot-toggle.png rename to nuxt/public/changelog/2026/03/images/snapshot-toggle.png diff --git a/src/changelog/2026/04/images/expert-action-links-search.gif b/nuxt/public/changelog/2026/04/images/expert-action-links-search.gif similarity index 100% rename from src/changelog/2026/04/images/expert-action-links-search.gif rename to nuxt/public/changelog/2026/04/images/expert-action-links-search.gif diff --git a/src/changelog/2026/04/images/expert-action-links-select-edit.gif b/nuxt/public/changelog/2026/04/images/expert-action-links-select-edit.gif similarity index 100% rename from src/changelog/2026/04/images/expert-action-links-select-edit.gif rename to nuxt/public/changelog/2026/04/images/expert-action-links-select-edit.gif diff --git a/src/changelog/2026/04/images/ff-instance-url-env-var.png b/nuxt/public/changelog/2026/04/images/ff-instance-url-env-var.png similarity index 100% rename from src/changelog/2026/04/images/ff-instance-url-env-var.png rename to nuxt/public/changelog/2026/04/images/ff-instance-url-env-var.png diff --git a/src/changelog/2026/04/images/immersive-ui-drawer.gif b/nuxt/public/changelog/2026/04/images/immersive-ui-drawer.gif similarity index 100% rename from src/changelog/2026/04/images/immersive-ui-drawer.gif rename to nuxt/public/changelog/2026/04/images/immersive-ui-drawer.gif diff --git a/src/changelog/2026/05/images/ai-opt-out-toggle.png b/nuxt/public/changelog/2026/05/images/ai-opt-out-toggle.png similarity index 100% rename from src/changelog/2026/05/images/ai-opt-out-toggle.png rename to nuxt/public/changelog/2026/05/images/ai-opt-out-toggle.png diff --git a/src/changelog/2026/05/images/expert-application-building.gif b/nuxt/public/changelog/2026/05/images/expert-application-building.gif similarity index 100% rename from src/changelog/2026/05/images/expert-application-building.gif rename to nuxt/public/changelog/2026/05/images/expert-application-building.gif diff --git a/src/changelog/2026/05/images/single-sso-provider.png b/nuxt/public/changelog/2026/05/images/single-sso-provider.png similarity index 100% rename from src/changelog/2026/05/images/single-sso-provider.png rename to nuxt/public/changelog/2026/05/images/single-sso-provider.png diff --git a/src/changelog/2026/06/images/dark-mode.gif b/nuxt/public/changelog/2026/06/images/dark-mode.gif similarity index 100% rename from src/changelog/2026/06/images/dark-mode.gif rename to nuxt/public/changelog/2026/06/images/dark-mode.gif diff --git a/src/changelog/2026/06/images/generic-git-provider.png b/nuxt/public/changelog/2026/06/images/generic-git-provider.png similarity index 100% rename from src/changelog/2026/06/images/generic-git-provider.png rename to nuxt/public/changelog/2026/06/images/generic-git-provider.png diff --git a/src/changelog/2026/07/images/approval-card.png b/nuxt/public/changelog/2026/07/images/approval-card.png similarity index 100% rename from src/changelog/2026/07/images/approval-card.png rename to nuxt/public/changelog/2026/07/images/approval-card.png diff --git a/src/changelog/2026/07/images/chat.png b/nuxt/public/changelog/2026/07/images/chat.png similarity index 100% rename from src/changelog/2026/07/images/chat.png rename to nuxt/public/changelog/2026/07/images/chat.png diff --git a/src/changelog/2026/07/images/dashboard-drawer.png b/nuxt/public/changelog/2026/07/images/dashboard-drawer.png similarity index 100% rename from src/changelog/2026/07/images/dashboard-drawer.png rename to nuxt/public/changelog/2026/07/images/dashboard-drawer.png diff --git a/src/changelog/2026/07/images/device-agent-install.gif b/nuxt/public/changelog/2026/07/images/device-agent-install.gif similarity index 100% rename from src/changelog/2026/07/images/device-agent-install.gif rename to nuxt/public/changelog/2026/07/images/device-agent-install.gif diff --git a/src/changelog/2026/07/images/device-agent-registration.png b/nuxt/public/changelog/2026/07/images/device-agent-registration.png similarity index 100% rename from src/changelog/2026/07/images/device-agent-registration.png rename to nuxt/public/changelog/2026/07/images/device-agent-registration.png diff --git a/src/changelog/2026/07/images/insights-1.png b/nuxt/public/changelog/2026/07/images/insights-1.png similarity index 100% rename from src/changelog/2026/07/images/insights-1.png rename to nuxt/public/changelog/2026/07/images/insights-1.png diff --git a/src/changelog/2026/07/images/insights-2.png b/nuxt/public/changelog/2026/07/images/insights-2.png similarity index 100% rename from src/changelog/2026/07/images/insights-2.png rename to nuxt/public/changelog/2026/07/images/insights-2.png diff --git a/src/changelog/2026/07/images/insights.gif b/nuxt/public/changelog/2026/07/images/insights.gif similarity index 100% rename from src/changelog/2026/07/images/insights.gif rename to nuxt/public/changelog/2026/07/images/insights.gif diff --git a/src/changelog/2026/07/images/make-permanent.gif b/nuxt/public/changelog/2026/07/images/make-permanent.gif similarity index 100% rename from src/changelog/2026/07/images/make-permanent.gif rename to nuxt/public/changelog/2026/07/images/make-permanent.gif diff --git a/src/changelog/2026/07/images/markdown-rendering.png b/nuxt/public/changelog/2026/07/images/markdown-rendering.png similarity index 100% rename from src/changelog/2026/07/images/markdown-rendering.png rename to nuxt/public/changelog/2026/07/images/markdown-rendering.png diff --git a/src/changelog/2026/07/images/plan.png b/nuxt/public/changelog/2026/07/images/plan.png similarity index 100% rename from src/changelog/2026/07/images/plan.png rename to nuxt/public/changelog/2026/07/images/plan.png diff --git a/src/changelog/2026/07/images/questions.png b/nuxt/public/changelog/2026/07/images/questions.png similarity index 100% rename from src/changelog/2026/07/images/questions.png rename to nuxt/public/changelog/2026/07/images/questions.png diff --git a/src/changelog/2026/07/images/scoped-pats.png b/nuxt/public/changelog/2026/07/images/scoped-pats.png similarity index 100% rename from src/changelog/2026/07/images/scoped-pats.png rename to nuxt/public/changelog/2026/07/images/scoped-pats.png diff --git a/src/changelog/2026/07/images/tables-view.png b/nuxt/public/changelog/2026/07/images/tables-view.png similarity index 100% rename from src/changelog/2026/07/images/tables-view.png rename to nuxt/public/changelog/2026/07/images/tables-view.png diff --git a/src/changelog/2026/07/images/team-dashboards.png b/nuxt/public/changelog/2026/07/images/team-dashboards.png similarity index 100% rename from src/changelog/2026/07/images/team-dashboards.png rename to nuxt/public/changelog/2026/07/images/team-dashboards.png diff --git a/src/changelog/2026/07/images/tools-permissions.png b/nuxt/public/changelog/2026/07/images/tools-permissions.png similarity index 100% rename from src/changelog/2026/07/images/tools-permissions.png rename to nuxt/public/changelog/2026/07/images/tools-permissions.png diff --git a/src/changelog/2026/08/images/dashboard-theme-presets.gif b/nuxt/public/changelog/2026/08/images/dashboard-theme-presets.gif similarity index 100% rename from src/changelog/2026/08/images/dashboard-theme-presets.gif rename to nuxt/public/changelog/2026/08/images/dashboard-theme-presets.gif diff --git a/src/changelog/2026/08/images/table-date-columns.gif b/nuxt/public/changelog/2026/08/images/table-date-columns.gif similarity index 100% rename from src/changelog/2026/08/images/table-date-columns.gif rename to nuxt/public/changelog/2026/08/images/table-date-columns.gif diff --git a/src/changelog/2026/09/images/auto-deploy-enable.png b/nuxt/public/changelog/2026/09/images/auto-deploy-enable.png similarity index 100% rename from src/changelog/2026/09/images/auto-deploy-enable.png rename to nuxt/public/changelog/2026/09/images/auto-deploy-enable.png diff --git a/src/changelog/2026/09/images/auto-deployed-and-validated.png b/nuxt/public/changelog/2026/09/images/auto-deployed-and-validated.png similarity index 100% rename from src/changelog/2026/09/images/auto-deployed-and-validated.png rename to nuxt/public/changelog/2026/09/images/auto-deployed-and-validated.png diff --git a/src/changelog/2026/09/images/client-presence-events.gif b/nuxt/public/changelog/2026/09/images/client-presence-events.gif similarity index 100% rename from src/changelog/2026/09/images/client-presence-events.gif rename to nuxt/public/changelog/2026/09/images/client-presence-events.gif diff --git a/src/events/hm25-invite.ics b/nuxt/public/events/hm25-invite.ics similarity index 100% rename from src/events/hm25-invite.ics rename to nuxt/public/events/hm25-invite.ics diff --git a/src/events/images/hm25/hm-25-demo.png b/nuxt/public/events/images/hm25/hm-25-demo.png similarity index 100% rename from src/events/images/hm25/hm-25-demo.png rename to nuxt/public/events/images/hm25/hm-25-demo.png diff --git a/src/events/images/hm25/hm-25-hero.png b/nuxt/public/events/images/hm25/hm-25-hero.png similarity index 100% rename from src/events/images/hm25/hm-25-hero.png rename to nuxt/public/events/images/hm25/hm-25-hero.png diff --git a/src/events/images/hm25/hm_logo.png b/nuxt/public/events/images/hm25/hm_logo.png similarity index 100% rename from src/events/images/hm25/hm_logo.png rename to nuxt/public/events/images/hm25/hm_logo.png diff --git a/src/events/images/hm25/mayker-session-banner.jpg b/nuxt/public/events/images/hm25/mayker-session-banner.jpg similarity index 100% rename from src/events/images/hm25/mayker-session-banner.jpg rename to nuxt/public/events/images/hm25/mayker-session-banner.jpg diff --git a/src/events/images/hm26/ff-talks.png b/nuxt/public/events/images/hm26/ff-talks.png similarity index 100% rename from src/events/images/hm26/ff-talks.png rename to nuxt/public/events/images/hm26/ff-talks.png diff --git a/src/events/images/hm26/hm-26-demo.png b/nuxt/public/events/images/hm26/hm-26-demo.png similarity index 100% rename from src/events/images/hm26/hm-26-demo.png rename to nuxt/public/events/images/hm26/hm-26-demo.png diff --git a/src/events/images/hm26/hm-26-hero.png b/nuxt/public/events/images/hm26/hm-26-hero.png similarity index 100% rename from src/events/images/hm26/hm-26-hero.png rename to nuxt/public/events/images/hm26/hm-26-hero.png diff --git a/src/events/images/hm26/nick-presenting.png b/nuxt/public/events/images/hm26/nick-presenting.png similarity index 100% rename from src/events/images/hm26/nick-presenting.png rename to nuxt/public/events/images/hm26/nick-presenting.png diff --git a/src/events/images/pi26/pi_logo.png b/nuxt/public/events/images/pi26/pi_logo.png similarity index 100% rename from src/events/images/pi26/pi_logo.png rename to nuxt/public/events/images/pi26/pi_logo.png diff --git a/src/events/images/pi26/proveit-session.jpg b/nuxt/public/events/images/pi26/proveit-session.jpg similarity index 100% rename from src/events/images/pi26/proveit-session.jpg rename to nuxt/public/events/images/pi26/proveit-session.jpg diff --git a/src/events/images/pi26/proveit-workshop.jpg b/nuxt/public/events/images/pi26/proveit-workshop.jpg similarity index 100% rename from src/events/images/pi26/proveit-workshop.jpg rename to nuxt/public/events/images/pi26/proveit-workshop.jpg diff --git a/src/events/images/pi26/proveit26-booth.png b/nuxt/public/events/images/pi26/proveit26-booth.png similarity index 100% rename from src/events/images/pi26/proveit26-booth.png rename to nuxt/public/events/images/pi26/proveit26-booth.png diff --git a/src/events/images/pi26/proveit26-hero.png b/nuxt/public/events/images/pi26/proveit26-hero.png similarity index 100% rename from src/events/images/pi26/proveit26-hero.png rename to nuxt/public/events/images/pi26/proveit26-hero.png diff --git a/src/public/favicon-16x16.png b/nuxt/public/favicon-16x16.png similarity index 100% rename from src/public/favicon-16x16.png rename to nuxt/public/favicon-16x16.png diff --git a/src/public/favicon-32x32.png b/nuxt/public/favicon-32x32.png similarity index 100% rename from src/public/favicon-32x32.png rename to nuxt/public/favicon-32x32.png diff --git a/src/public/favicon.ico b/nuxt/public/favicon.ico similarity index 100% rename from src/public/favicon.ico rename to nuxt/public/favicon.ico diff --git a/src/images/404.svg b/nuxt/public/images/404.svg similarity index 100% rename from src/images/404.svg rename to nuxt/public/images/404.svg diff --git a/src/images/600x70-HS-newsletter-header.png b/nuxt/public/images/600x70-HS-newsletter-header.png similarity index 100% rename from src/images/600x70-HS-newsletter-header.png rename to nuxt/public/images/600x70-HS-newsletter-header.png diff --git a/src/images/ai/agents/README.md b/nuxt/public/images/ai/agents/README.md similarity index 100% rename from src/images/ai/agents/README.md rename to nuxt/public/images/ai/agents/README.md diff --git a/src/images/ai/agents/chatgpt.svg b/nuxt/public/images/ai/agents/chatgpt.svg similarity index 100% rename from src/images/ai/agents/chatgpt.svg rename to nuxt/public/images/ai/agents/chatgpt.svg diff --git a/src/images/ai/agents/claude.svg b/nuxt/public/images/ai/agents/claude.svg similarity index 100% rename from src/images/ai/agents/claude.svg rename to nuxt/public/images/ai/agents/claude.svg diff --git a/src/images/ai/agents/flowfuse-expert.svg b/nuxt/public/images/ai/agents/flowfuse-expert.svg similarity index 100% rename from src/images/ai/agents/flowfuse-expert.svg rename to nuxt/public/images/ai/agents/flowfuse-expert.svg diff --git a/src/images/ai/agents/gemini.svg b/nuxt/public/images/ai/agents/gemini.svg similarity index 100% rename from src/images/ai/agents/gemini.svg rename to nuxt/public/images/ai/agents/gemini.svg diff --git a/src/images/ai/agents/microsoft-copilot.svg b/nuxt/public/images/ai/agents/microsoft-copilot.svg similarity index 100% rename from src/images/ai/agents/microsoft-copilot.svg rename to nuxt/public/images/ai/agents/microsoft-copilot.svg diff --git a/src/images/ai/ai-cta.png b/nuxt/public/images/ai/ai-cta.png similarity index 100% rename from src/images/ai/ai-cta.png rename to nuxt/public/images/ai/ai-cta.png diff --git a/src/images/ai/ai-hero.png b/nuxt/public/images/ai/ai-hero.png similarity index 100% rename from src/images/ai/ai-hero.png rename to nuxt/public/images/ai/ai-hero.png diff --git a/src/images/ai/ai-ui.png b/nuxt/public/images/ai/ai-ui.png similarity index 100% rename from src/images/ai/ai-ui.png rename to nuxt/public/images/ai/ai-ui.png diff --git a/src/images/ai/connect-your-own-agent.svg b/nuxt/public/images/ai/connect-your-own-agent.svg similarity index 100% rename from src/images/ai/connect-your-own-agent.svg rename to nuxt/public/images/ai/connect-your-own-agent.svg diff --git a/src/images/ai/schematic-expert.svg b/nuxt/public/images/ai/schematic-expert.svg similarity index 100% rename from src/images/ai/schematic-expert.svg rename to nuxt/public/images/ai/schematic-expert.svg diff --git a/src/images/ai/schematic-external.svg b/nuxt/public/images/ai/schematic-external.svg similarity index 100% rename from src/images/ai/schematic-external.svg rename to nuxt/public/images/ai/schematic-external.svg diff --git a/src/images/arch-icon.png b/nuxt/public/images/arch-icon.png similarity index 100% rename from src/images/arch-icon.png rename to nuxt/public/images/arch-icon.png diff --git a/src/images/bg-flow-gradient-w.png b/nuxt/public/images/bg-flow-gradient-w.png similarity index 100% rename from src/images/bg-flow-gradient-w.png rename to nuxt/public/images/bg-flow-gradient-w.png diff --git a/src/images/bg-nodered-editor.png b/nuxt/public/images/bg-nodered-editor.png similarity index 100% rename from src/images/bg-nodered-editor.png rename to nuxt/public/images/bg-nodered-editor.png diff --git a/src/images/bg-nodered-hexes.png b/nuxt/public/images/bg-nodered-hexes.png similarity index 100% rename from src/images/bg-nodered-hexes.png rename to nuxt/public/images/bg-nodered-hexes.png diff --git a/src/images/blog/community-news.jpeg b/nuxt/public/images/blog/community-news.jpeg similarity index 100% rename from src/images/blog/community-news.jpeg rename to nuxt/public/images/blog/community-news.jpeg diff --git a/src/images/blog/db-comparison.jpg b/nuxt/public/images/blog/db-comparison.jpg similarity index 100% rename from src/images/blog/db-comparison.jpg rename to nuxt/public/images/blog/db-comparison.jpg diff --git a/src/images/blog/nr-quicktips.jpg b/nuxt/public/images/blog/nr-quicktips.jpg similarity index 100% rename from src/images/blog/nr-quicktips.jpg rename to nuxt/public/images/blog/nr-quicktips.jpg diff --git a/src/images/blog/tile-chatgpt-fcn-node.jpg b/nuxt/public/images/blog/tile-chatgpt-fcn-node.jpg similarity index 100% rename from src/images/blog/tile-chatgpt-fcn-node.jpg rename to nuxt/public/images/blog/tile-chatgpt-fcn-node.jpg diff --git a/src/images/blog/tile-ha-nr.jpg b/nuxt/public/images/blog/tile-ha-nr.jpg similarity index 100% rename from src/images/blog/tile-ha-nr.jpg rename to nuxt/public/images/blog/tile-ha-nr.jpg diff --git a/src/images/blog/tile-ibm-cloud-starter-removed--text.png b/nuxt/public/images/blog/tile-ibm-cloud-starter-removed--text.png similarity index 100% rename from src/images/blog/tile-ibm-cloud-starter-removed--text.png rename to nuxt/public/images/blog/tile-ibm-cloud-starter-removed--text.png diff --git a/src/images/blog/tile-ibm-cloud-starter-removed.png b/nuxt/public/images/blog/tile-ibm-cloud-starter-removed.png similarity index 100% rename from src/images/blog/tile-ibm-cloud-starter-removed.png rename to nuxt/public/images/blog/tile-ibm-cloud-starter-removed.png diff --git a/src/images/blog/tile-import-npm.jpeg b/nuxt/public/images/blog/tile-import-npm.jpeg similarity index 100% rename from src/images/blog/tile-import-npm.jpeg rename to nuxt/public/images/blog/tile-import-npm.jpeg diff --git a/src/images/blog/tile-node-red-community-metrics.jpg b/nuxt/public/images/blog/tile-node-red-community-metrics.jpg similarity index 100% rename from src/images/blog/tile-node-red-community-metrics.jpg rename to nuxt/public/images/blog/tile-node-red-community-metrics.jpg diff --git a/src/images/careers/hiring-developer-relations-advocate.png b/nuxt/public/images/careers/hiring-developer-relations-advocate.png similarity index 100% rename from src/images/careers/hiring-developer-relations-advocate.png rename to nuxt/public/images/careers/hiring-developer-relations-advocate.png diff --git a/src/images/careers/hiring-engineering-manager.png b/nuxt/public/images/careers/hiring-engineering-manager.png similarity index 100% rename from src/images/careers/hiring-engineering-manager.png rename to nuxt/public/images/careers/hiring-engineering-manager.png diff --git a/src/images/careers/hiring-solutions-engineer.png b/nuxt/public/images/careers/hiring-solutions-engineer.png similarity index 100% rename from src/images/careers/hiring-solutions-engineer.png rename to nuxt/public/images/careers/hiring-solutions-engineer.png diff --git a/src/images/careers/hiring.jpeg b/nuxt/public/images/careers/hiring.jpeg similarity index 100% rename from src/images/careers/hiring.jpeg rename to nuxt/public/images/careers/hiring.jpeg diff --git a/src/images/cta/aperia-book-demo.png b/nuxt/public/images/cta/aperia-book-demo.png similarity index 100% rename from src/images/cta/aperia-book-demo.png rename to nuxt/public/images/cta/aperia-book-demo.png diff --git a/src/images/cta/arch-systems-book-demo.png b/nuxt/public/images/cta/arch-systems-book-demo.png similarity index 100% rename from src/images/cta/arch-systems-book-demo.png rename to nuxt/public/images/cta/arch-systems-book-demo.png diff --git a/src/images/cta/book-a-demo.png b/nuxt/public/images/cta/book-a-demo.png similarity index 100% rename from src/images/cta/book-a-demo.png rename to nuxt/public/images/cta/book-a-demo.png diff --git a/src/images/cta/power-workplace-book-demo.png b/nuxt/public/images/cta/power-workplace-book-demo.png similarity index 100% rename from src/images/cta/power-workplace-book-demo.png rename to nuxt/public/images/cta/power-workplace-book-demo.png diff --git a/src/images/cta/wenco-book-demo.png b/nuxt/public/images/cta/wenco-book-demo.png similarity index 100% rename from src/images/cta/wenco-book-demo.png rename to nuxt/public/images/cta/wenco-book-demo.png diff --git a/src/images/divider-flow-grey.svg b/nuxt/public/images/divider-flow-grey.svg similarity index 100% rename from src/images/divider-flow-grey.svg rename to nuxt/public/images/divider-flow-grey.svg diff --git a/src/images/divider-flow-red_dark.svg b/nuxt/public/images/divider-flow-red_dark.svg similarity index 100% rename from src/images/divider-flow-red_dark.svg rename to nuxt/public/images/divider-flow-red_dark.svg diff --git a/src/images/divider-flow-red_light.svg b/nuxt/public/images/divider-flow-red_light.svg similarity index 100% rename from src/images/divider-flow-red_light.svg rename to nuxt/public/images/divider-flow-red_light.svg diff --git a/src/images/divider-flow.svg b/nuxt/public/images/divider-flow.svg similarity index 100% rename from src/images/divider-flow.svg rename to nuxt/public/images/divider-flow.svg diff --git a/src/images/education/education_form.jpg b/nuxt/public/images/education/education_form.jpg similarity index 100% rename from src/images/education/education_form.jpg rename to nuxt/public/images/education/education_form.jpg diff --git a/src/images/education/education_hero.jpg b/nuxt/public/images/education/education_hero.jpg similarity index 100% rename from src/images/education/education_hero.jpg rename to nuxt/public/images/education/education_hero.jpg diff --git a/src/images/features/flowfuse-features-hero.png b/nuxt/public/images/features/flowfuse-features-hero.png similarity index 100% rename from src/images/features/flowfuse-features-hero.png rename to nuxt/public/images/features/flowfuse-features-hero.png diff --git a/src/images/ff-bg-flows.svg b/nuxt/public/images/ff-bg-flows.svg similarity index 100% rename from src/images/ff-bg-flows.svg rename to nuxt/public/images/ff-bg-flows.svg diff --git a/src/images/ff-logo--wordmark--light.svg b/nuxt/public/images/ff-logo--wordmark--light.svg similarity index 100% rename from src/images/ff-logo--wordmark--light.svg rename to nuxt/public/images/ff-logo--wordmark--light.svg diff --git a/src/images/ff-minimal-red.svg b/nuxt/public/images/ff-minimal-red.svg similarity index 100% rename from src/images/ff-minimal-red.svg rename to nuxt/public/images/ff-minimal-red.svg diff --git a/src/images/flowfuse-cloud.png b/nuxt/public/images/flowfuse-cloud.png similarity index 100% rename from src/images/flowfuse-cloud.png rename to nuxt/public/images/flowfuse-cloud.png diff --git a/src/images/flowfuse-logo-wordmark-white.svg b/nuxt/public/images/flowfuse-logo-wordmark-white.svg similarity index 100% rename from src/images/flowfuse-logo-wordmark-white.svg rename to nuxt/public/images/flowfuse-logo-wordmark-white.svg diff --git a/src/images/footer-bg.svg b/nuxt/public/images/footer-bg.svg similarity index 100% rename from src/images/footer-bg.svg rename to nuxt/public/images/footer-bg.svg diff --git a/src/images/github-mark.png b/nuxt/public/images/github-mark.png similarity index 100% rename from src/images/github-mark.png rename to nuxt/public/images/github-mark.png diff --git a/src/images/grid.svg b/nuxt/public/images/grid.svg similarity index 100% rename from src/images/grid.svg rename to nuxt/public/images/grid.svg diff --git a/src/images/home-logos/abrasive_technology-logo.svg b/nuxt/public/images/home-logos/abrasive_technology-logo.svg similarity index 100% rename from src/images/home-logos/abrasive_technology-logo.svg rename to nuxt/public/images/home-logos/abrasive_technology-logo.svg diff --git a/src/images/home-logos/agristo-logo.svg b/nuxt/public/images/home-logos/agristo-logo.svg similarity index 100% rename from src/images/home-logos/agristo-logo.svg rename to nuxt/public/images/home-logos/agristo-logo.svg diff --git a/src/images/home-logos/arch-systems-logo.png b/nuxt/public/images/home-logos/arch-systems-logo.png similarity index 100% rename from src/images/home-logos/arch-systems-logo.png rename to nuxt/public/images/home-logos/arch-systems-logo.png diff --git a/src/images/home-logos/ardo-logo.png b/nuxt/public/images/home-logos/ardo-logo.png similarity index 100% rename from src/images/home-logos/ardo-logo.png rename to nuxt/public/images/home-logos/ardo-logo.png diff --git a/src/images/home-logos/bosch-logo.svg b/nuxt/public/images/home-logos/bosch-logo.svg similarity index 100% rename from src/images/home-logos/bosch-logo.svg rename to nuxt/public/images/home-logos/bosch-logo.svg diff --git a/src/images/home-logos/cargill-logo.png b/nuxt/public/images/home-logos/cargill-logo.png similarity index 100% rename from src/images/home-logos/cargill-logo.png rename to nuxt/public/images/home-logos/cargill-logo.png diff --git a/src/images/home-logos/decospan-logo.svg b/nuxt/public/images/home-logos/decospan-logo.svg similarity index 100% rename from src/images/home-logos/decospan-logo.svg rename to nuxt/public/images/home-logos/decospan-logo.svg diff --git a/src/images/home-logos/energinet-logo.png b/nuxt/public/images/home-logos/energinet-logo.png similarity index 100% rename from src/images/home-logos/energinet-logo.png rename to nuxt/public/images/home-logos/energinet-logo.png diff --git a/src/images/home-logos/ensign-energy-logo.png b/nuxt/public/images/home-logos/ensign-energy-logo.png similarity index 100% rename from src/images/home-logos/ensign-energy-logo.png rename to nuxt/public/images/home-logos/ensign-energy-logo.png diff --git a/src/images/home-logos/epcor-logo.png b/nuxt/public/images/home-logos/epcor-logo.png similarity index 100% rename from src/images/home-logos/epcor-logo.png rename to nuxt/public/images/home-logos/epcor-logo.png diff --git a/src/images/home-logos/knobelsdorff-logo.png b/nuxt/public/images/home-logos/knobelsdorff-logo.png similarity index 100% rename from src/images/home-logos/knobelsdorff-logo.png rename to nuxt/public/images/home-logos/knobelsdorff-logo.png diff --git a/src/images/home-logos/l2l-logo.png b/nuxt/public/images/home-logos/l2l-logo.png similarity index 100% rename from src/images/home-logos/l2l-logo.png rename to nuxt/public/images/home-logos/l2l-logo.png diff --git a/src/images/home-logos/milliken-logo.svg b/nuxt/public/images/home-logos/milliken-logo.svg similarity index 100% rename from src/images/home-logos/milliken-logo.svg rename to nuxt/public/images/home-logos/milliken-logo.svg diff --git a/src/images/home-logos/moderna-logo.svg b/nuxt/public/images/home-logos/moderna-logo.svg similarity index 100% rename from src/images/home-logos/moderna-logo.svg rename to nuxt/public/images/home-logos/moderna-logo.svg diff --git a/src/images/home-logos/newell-logo.svg b/nuxt/public/images/home-logos/newell-logo.svg similarity index 100% rename from src/images/home-logos/newell-logo.svg rename to nuxt/public/images/home-logos/newell-logo.svg diff --git a/src/images/home-logos/pem-logo.svg b/nuxt/public/images/home-logos/pem-logo.svg similarity index 100% rename from src/images/home-logos/pem-logo.svg rename to nuxt/public/images/home-logos/pem-logo.svg diff --git a/src/images/home-logos/protolabs-logo.svg b/nuxt/public/images/home-logos/protolabs-logo.svg similarity index 100% rename from src/images/home-logos/protolabs-logo.svg rename to nuxt/public/images/home-logos/protolabs-logo.svg diff --git a/src/images/home-logos/sky-io-logo.svg b/nuxt/public/images/home-logos/sky-io-logo.svg similarity index 100% rename from src/images/home-logos/sky-io-logo.svg rename to nuxt/public/images/home-logos/sky-io-logo.svg diff --git a/src/images/home-logos/topsoe-logo.svg b/nuxt/public/images/home-logos/topsoe-logo.svg similarity index 100% rename from src/images/home-logos/topsoe-logo.svg rename to nuxt/public/images/home-logos/topsoe-logo.svg diff --git a/src/images/home-logos/verduyn-logo.png b/nuxt/public/images/home-logos/verduyn-logo.png similarity index 100% rename from src/images/home-logos/verduyn-logo.png rename to nuxt/public/images/home-logos/verduyn-logo.png diff --git a/src/images/home-logos/walter-logo.svg b/nuxt/public/images/home-logos/walter-logo.svg similarity index 100% rename from src/images/home-logos/walter-logo.svg rename to nuxt/public/images/home-logos/walter-logo.svg diff --git a/src/images/home-logos/wenco-logo.svg b/nuxt/public/images/home-logos/wenco-logo.svg similarity index 100% rename from src/images/home-logos/wenco-logo.svg rename to nuxt/public/images/home-logos/wenco-logo.svg diff --git a/src/images/home-logos/wilson-tool-logo.png b/nuxt/public/images/home-logos/wilson-tool-logo.png similarity index 100% rename from src/images/home-logos/wilson-tool-logo.png rename to nuxt/public/images/home-logos/wilson-tool-logo.png diff --git a/src/images/home-logos/wings-logo.png b/nuxt/public/images/home-logos/wings-logo.png similarity index 100% rename from src/images/home-logos/wings-logo.png rename to nuxt/public/images/home-logos/wings-logo.png diff --git a/src/images/home/home-arch.png b/nuxt/public/images/home/home-arch.png similarity index 100% rename from src/images/home/home-arch.png rename to nuxt/public/images/home/home-arch.png diff --git a/src/images/home/pidd.png b/nuxt/public/images/home/pidd.png similarity index 100% rename from src/images/home/pidd.png rename to nuxt/public/images/home/pidd.png diff --git a/src/images/home/power.png b/nuxt/public/images/home/power.png similarity index 100% rename from src/images/home/power.png rename to nuxt/public/images/home/power.png diff --git a/src/images/hs-email-message.png b/nuxt/public/images/hs-email-message.png similarity index 100% rename from src/images/hs-email-message.png rename to nuxt/public/images/hs-email-message.png diff --git a/src/images/icons/check.svg b/nuxt/public/images/icons/check.svg similarity index 100% rename from src/images/icons/check.svg rename to nuxt/public/images/icons/check.svg diff --git a/src/images/icons/chevron-left.svg b/nuxt/public/images/icons/chevron-left.svg similarity index 100% rename from src/images/icons/chevron-left.svg rename to nuxt/public/images/icons/chevron-left.svg diff --git a/src/images/icons/chevron-right.svg b/nuxt/public/images/icons/chevron-right.svg similarity index 100% rename from src/images/icons/chevron-right.svg rename to nuxt/public/images/icons/chevron-right.svg diff --git a/src/images/icons/magnifying-glass-circle.svg b/nuxt/public/images/icons/magnifying-glass-circle.svg similarity index 100% rename from src/images/icons/magnifying-glass-circle.svg rename to nuxt/public/images/icons/magnifying-glass-circle.svg diff --git a/nuxt/public/images/industries/automotive/1-connect-systems.png b/nuxt/public/images/industries/automotive/1-connect-systems.png index 7938681489..9402e6e17c 100644 Binary files a/nuxt/public/images/industries/automotive/1-connect-systems.png and b/nuxt/public/images/industries/automotive/1-connect-systems.png differ diff --git a/src/images/integrations/palette-manager-install.png b/nuxt/public/images/integrations/palette-manager-install.png similarity index 100% rename from src/images/integrations/palette-manager-install.png rename to nuxt/public/images/integrations/palette-manager-install.png diff --git a/src/images/nav-arrow.svg b/nuxt/public/images/nav-arrow.svg similarity index 100% rename from src/images/nav-arrow.svg rename to nuxt/public/images/nav-arrow.svg diff --git a/src/images/node-red-in-cloud.png b/nuxt/public/images/node-red-in-cloud.png similarity index 100% rename from src/images/node-red-in-cloud.png rename to nuxt/public/images/node-red-in-cloud.png diff --git a/src/images/og-blog.jpg b/nuxt/public/images/og-blog.jpg similarity index 100% rename from src/images/og-blog.jpg rename to nuxt/public/images/og-blog.jpg diff --git a/src/images/og-book-demo.jpeg b/nuxt/public/images/og-book-demo.jpeg similarity index 100% rename from src/images/og-book-demo.jpeg rename to nuxt/public/images/og-book-demo.jpeg diff --git a/src/images/og-social-tile.jpg b/nuxt/public/images/og-social-tile.jpg similarity index 100% rename from src/images/og-social-tile.jpg rename to nuxt/public/images/og-social-tile.jpg diff --git a/src/images/og-webinar.jpg b/nuxt/public/images/og-webinar.jpg similarity index 100% rename from src/images/og-webinar.jpg rename to nuxt/public/images/og-webinar.jpg diff --git a/src/images/openjs_logo.png b/nuxt/public/images/openjs_logo.png similarity index 100% rename from src/images/openjs_logo.png rename to nuxt/public/images/openjs_logo.png diff --git a/src/images/pictograms/404.png b/nuxt/public/images/pictograms/404.png similarity index 100% rename from src/images/pictograms/404.png rename to nuxt/public/images/pictograms/404.png diff --git a/src/images/pictograms/404_blue.png b/nuxt/public/images/pictograms/404_blue.png similarity index 100% rename from src/images/pictograms/404_blue.png rename to nuxt/public/images/pictograms/404_blue.png diff --git a/src/images/pictograms/Bias for Action - 128x@4x.png b/nuxt/public/images/pictograms/Bias for Action - 128x@4x.png similarity index 100% rename from src/images/pictograms/Bias for Action - 128x@4x.png rename to nuxt/public/images/pictograms/Bias for Action - 128x@4x.png diff --git a/src/images/pictograms/Results, Not Hours - 128x@4x.png b/nuxt/public/images/pictograms/Results, Not Hours - 128x@4x.png similarity index 100% rename from src/images/pictograms/Results, Not Hours - 128x@4x.png rename to nuxt/public/images/pictograms/Results, Not Hours - 128x@4x.png diff --git a/src/images/pictograms/Securiy - 128x@4x.png b/nuxt/public/images/pictograms/Securiy - 128x@4x.png similarity index 100% rename from src/images/pictograms/Securiy - 128x@4x.png rename to nuxt/public/images/pictograms/Securiy - 128x@4x.png diff --git a/src/images/pictograms/Sickpay - 128x_1@4x.png b/nuxt/public/images/pictograms/Sickpay - 128x_1@4x.png similarity index 100% rename from src/images/pictograms/Sickpay - 128x_1@4x.png rename to nuxt/public/images/pictograms/Sickpay - 128x_1@4x.png diff --git a/src/images/pictograms/anvil1.png b/nuxt/public/images/pictograms/anvil1.png similarity index 100% rename from src/images/pictograms/anvil1.png rename to nuxt/public/images/pictograms/anvil1.png diff --git a/src/images/pictograms/audit.png b/nuxt/public/images/pictograms/audit.png similarity index 100% rename from src/images/pictograms/audit.png rename to nuxt/public/images/pictograms/audit.png diff --git a/src/images/pictograms/bespoke_red.png b/nuxt/public/images/pictograms/bespoke_red.png similarity index 100% rename from src/images/pictograms/bespoke_red.png rename to nuxt/public/images/pictograms/bespoke_red.png diff --git a/src/images/pictograms/bias_for_action.png b/nuxt/public/images/pictograms/bias_for_action.png similarity index 100% rename from src/images/pictograms/bias_for_action.png rename to nuxt/public/images/pictograms/bias_for_action.png diff --git a/src/images/pictograms/book-a-demo.png b/nuxt/public/images/pictograms/book-a-demo.png similarity index 100% rename from src/images/pictograms/book-a-demo.png rename to nuxt/public/images/pictograms/book-a-demo.png diff --git a/src/images/pictograms/book-a-demo_blue.png b/nuxt/public/images/pictograms/book-a-demo_blue.png similarity index 100% rename from src/images/pictograms/book-a-demo_blue.png rename to nuxt/public/images/pictograms/book-a-demo_blue.png diff --git a/src/images/pictograms/book-a-demo_red.png b/nuxt/public/images/pictograms/book-a-demo_red.png similarity index 100% rename from src/images/pictograms/book-a-demo_red.png rename to nuxt/public/images/pictograms/book-a-demo_red.png diff --git a/src/images/pictograms/briefcase_blue.png b/nuxt/public/images/pictograms/briefcase_blue.png similarity index 100% rename from src/images/pictograms/briefcase_blue.png rename to nuxt/public/images/pictograms/briefcase_blue.png diff --git a/src/images/pictograms/briefcase_red.png b/nuxt/public/images/pictograms/briefcase_red.png similarity index 100% rename from src/images/pictograms/briefcase_red.png rename to nuxt/public/images/pictograms/briefcase_red.png diff --git a/src/images/pictograms/browser.png b/nuxt/public/images/pictograms/browser.png similarity index 100% rename from src/images/pictograms/browser.png rename to nuxt/public/images/pictograms/browser.png diff --git a/src/images/pictograms/browser_red.png b/nuxt/public/images/pictograms/browser_red.png similarity index 100% rename from src/images/pictograms/browser_red.png rename to nuxt/public/images/pictograms/browser_red.png diff --git a/src/images/pictograms/candor.png b/nuxt/public/images/pictograms/candor.png similarity index 100% rename from src/images/pictograms/candor.png rename to nuxt/public/images/pictograms/candor.png diff --git a/src/images/pictograms/candor_red.png b/nuxt/public/images/pictograms/candor_red.png similarity index 100% rename from src/images/pictograms/candor_red.png rename to nuxt/public/images/pictograms/candor_red.png diff --git a/src/images/pictograms/certified-nodes_blue.png b/nuxt/public/images/pictograms/certified-nodes_blue.png similarity index 100% rename from src/images/pictograms/certified-nodes_blue.png rename to nuxt/public/images/pictograms/certified-nodes_blue.png diff --git a/src/images/pictograms/certified.png b/nuxt/public/images/pictograms/certified.png similarity index 100% rename from src/images/pictograms/certified.png rename to nuxt/public/images/pictograms/certified.png diff --git a/src/images/pictograms/certified_blue.png b/nuxt/public/images/pictograms/certified_blue.png similarity index 100% rename from src/images/pictograms/certified_blue.png rename to nuxt/public/images/pictograms/certified_blue.png diff --git a/src/images/pictograms/citizen_dev_red.png b/nuxt/public/images/pictograms/citizen_dev_red.png similarity index 100% rename from src/images/pictograms/citizen_dev_red.png rename to nuxt/public/images/pictograms/citizen_dev_red.png diff --git a/src/images/pictograms/cloud.png b/nuxt/public/images/pictograms/cloud.png similarity index 100% rename from src/images/pictograms/cloud.png rename to nuxt/public/images/pictograms/cloud.png diff --git a/src/images/pictograms/cloud_blue.png b/nuxt/public/images/pictograms/cloud_blue.png similarity index 100% rename from src/images/pictograms/cloud_blue.png rename to nuxt/public/images/pictograms/cloud_blue.png diff --git a/src/images/pictograms/cloud_nr_blue.png b/nuxt/public/images/pictograms/cloud_nr_blue.png similarity index 100% rename from src/images/pictograms/cloud_nr_blue.png rename to nuxt/public/images/pictograms/cloud_nr_blue.png diff --git a/src/images/pictograms/cloud_red.png b/nuxt/public/images/pictograms/cloud_red.png similarity index 100% rename from src/images/pictograms/cloud_red.png rename to nuxt/public/images/pictograms/cloud_red.png diff --git a/src/images/pictograms/code_blue.png b/nuxt/public/images/pictograms/code_blue.png similarity index 100% rename from src/images/pictograms/code_blue.png rename to nuxt/public/images/pictograms/code_blue.png diff --git a/src/images/pictograms/code_red.png b/nuxt/public/images/pictograms/code_red.png similarity index 100% rename from src/images/pictograms/code_red.png rename to nuxt/public/images/pictograms/code_red.png diff --git a/src/images/pictograms/collaboration.png b/nuxt/public/images/pictograms/collaboration.png similarity index 100% rename from src/images/pictograms/collaboration.png rename to nuxt/public/images/pictograms/collaboration.png diff --git a/src/images/pictograms/collaboration_blue.png b/nuxt/public/images/pictograms/collaboration_blue.png similarity index 100% rename from src/images/pictograms/collaboration_blue.png rename to nuxt/public/images/pictograms/collaboration_blue.png diff --git a/src/images/pictograms/collaboration_red.png b/nuxt/public/images/pictograms/collaboration_red.png similarity index 100% rename from src/images/pictograms/collaboration_red.png rename to nuxt/public/images/pictograms/collaboration_red.png diff --git a/src/images/pictograms/community.png b/nuxt/public/images/pictograms/community.png similarity index 100% rename from src/images/pictograms/community.png rename to nuxt/public/images/pictograms/community.png diff --git a/src/images/pictograms/community_red.png b/nuxt/public/images/pictograms/community_red.png similarity index 100% rename from src/images/pictograms/community_red.png rename to nuxt/public/images/pictograms/community_red.png diff --git a/src/images/pictograms/connect_device_blue.png b/nuxt/public/images/pictograms/connect_device_blue.png similarity index 100% rename from src/images/pictograms/connect_device_blue.png rename to nuxt/public/images/pictograms/connect_device_blue.png diff --git a/src/images/pictograms/connect_device_red.png b/nuxt/public/images/pictograms/connect_device_red.png similarity index 100% rename from src/images/pictograms/connect_device_red.png rename to nuxt/public/images/pictograms/connect_device_red.png diff --git a/src/images/pictograms/data_blue.png b/nuxt/public/images/pictograms/data_blue.png similarity index 100% rename from src/images/pictograms/data_blue.png rename to nuxt/public/images/pictograms/data_blue.png diff --git a/src/images/pictograms/data_integration.png b/nuxt/public/images/pictograms/data_integration.png similarity index 100% rename from src/images/pictograms/data_integration.png rename to nuxt/public/images/pictograms/data_integration.png diff --git a/src/images/pictograms/device_blue.png b/nuxt/public/images/pictograms/device_blue.png similarity index 100% rename from src/images/pictograms/device_blue.png rename to nuxt/public/images/pictograms/device_blue.png diff --git a/src/images/pictograms/device_group_blue.png b/nuxt/public/images/pictograms/device_group_blue.png similarity index 100% rename from src/images/pictograms/device_group_blue.png rename to nuxt/public/images/pictograms/device_group_blue.png diff --git a/src/images/pictograms/device_group_red.png b/nuxt/public/images/pictograms/device_group_red.png similarity index 100% rename from src/images/pictograms/device_group_red.png rename to nuxt/public/images/pictograms/device_group_red.png diff --git a/src/images/pictograms/devices1_blue.png b/nuxt/public/images/pictograms/devices1_blue.png similarity index 100% rename from src/images/pictograms/devices1_blue.png rename to nuxt/public/images/pictograms/devices1_blue.png diff --git a/src/images/pictograms/devops_blue.png b/nuxt/public/images/pictograms/devops_blue.png similarity index 100% rename from src/images/pictograms/devops_blue.png rename to nuxt/public/images/pictograms/devops_blue.png diff --git a/src/images/pictograms/edge.png b/nuxt/public/images/pictograms/edge.png similarity index 100% rename from src/images/pictograms/edge.png rename to nuxt/public/images/pictograms/edge.png diff --git a/src/images/pictograms/edge_red.png b/nuxt/public/images/pictograms/edge_red.png similarity index 100% rename from src/images/pictograms/edge_red.png rename to nuxt/public/images/pictograms/edge_red.png diff --git a/src/images/pictograms/education.png b/nuxt/public/images/pictograms/education.png similarity index 100% rename from src/images/pictograms/education.png rename to nuxt/public/images/pictograms/education.png diff --git a/src/images/pictograms/enterprise.png b/nuxt/public/images/pictograms/enterprise.png similarity index 100% rename from src/images/pictograms/enterprise.png rename to nuxt/public/images/pictograms/enterprise.png diff --git a/src/images/pictograms/enterprise_blue.png b/nuxt/public/images/pictograms/enterprise_blue.png similarity index 100% rename from src/images/pictograms/enterprise_blue.png rename to nuxt/public/images/pictograms/enterprise_blue.png diff --git a/src/images/pictograms/enterprise_red.png b/nuxt/public/images/pictograms/enterprise_red.png similarity index 100% rename from src/images/pictograms/enterprise_red.png rename to nuxt/public/images/pictograms/enterprise_red.png diff --git a/src/images/pictograms/envelope_blue.png b/nuxt/public/images/pictograms/envelope_blue.png similarity index 100% rename from src/images/pictograms/envelope_blue.png rename to nuxt/public/images/pictograms/envelope_blue.png diff --git a/src/images/pictograms/envelope_open_blue.png b/nuxt/public/images/pictograms/envelope_open_blue.png similarity index 100% rename from src/images/pictograms/envelope_open_blue.png rename to nuxt/public/images/pictograms/envelope_open_blue.png diff --git a/src/images/pictograms/envelope_red.png b/nuxt/public/images/pictograms/envelope_red.png similarity index 100% rename from src/images/pictograms/envelope_red.png rename to nuxt/public/images/pictograms/envelope_red.png diff --git a/src/images/pictograms/equipment.png b/nuxt/public/images/pictograms/equipment.png similarity index 100% rename from src/images/pictograms/equipment.png rename to nuxt/public/images/pictograms/equipment.png diff --git a/src/images/pictograms/eu.png b/nuxt/public/images/pictograms/eu.png similarity index 100% rename from src/images/pictograms/eu.png rename to nuxt/public/images/pictograms/eu.png diff --git a/src/images/pictograms/factory.png b/nuxt/public/images/pictograms/factory.png similarity index 100% rename from src/images/pictograms/factory.png rename to nuxt/public/images/pictograms/factory.png diff --git a/src/images/pictograms/feature-data-sharing.png b/nuxt/public/images/pictograms/feature-data-sharing.png similarity index 100% rename from src/images/pictograms/feature-data-sharing.png rename to nuxt/public/images/pictograms/feature-data-sharing.png diff --git a/src/images/pictograms/hub_spokes_blue.png b/nuxt/public/images/pictograms/hub_spokes_blue.png similarity index 100% rename from src/images/pictograms/hub_spokes_blue.png rename to nuxt/public/images/pictograms/hub_spokes_blue.png diff --git a/src/images/pictograms/hub_spokes_red.png b/nuxt/public/images/pictograms/hub_spokes_red.png similarity index 100% rename from src/images/pictograms/hub_spokes_red.png rename to nuxt/public/images/pictograms/hub_spokes_red.png diff --git a/src/images/pictograms/instance_blue.png b/nuxt/public/images/pictograms/instance_blue.png similarity index 100% rename from src/images/pictograms/instance_blue.png rename to nuxt/public/images/pictograms/instance_blue.png diff --git a/src/images/pictograms/iteration.png b/nuxt/public/images/pictograms/iteration.png similarity index 100% rename from src/images/pictograms/iteration.png rename to nuxt/public/images/pictograms/iteration.png diff --git a/src/images/pictograms/library_blue.png b/nuxt/public/images/pictograms/library_blue.png similarity index 100% rename from src/images/pictograms/library_blue.png rename to nuxt/public/images/pictograms/library_blue.png diff --git a/src/images/pictograms/light_bulb_blue.png b/nuxt/public/images/pictograms/light_bulb_blue.png similarity index 100% rename from src/images/pictograms/light_bulb_blue.png rename to nuxt/public/images/pictograms/light_bulb_blue.png diff --git a/src/images/pictograms/low-code_red.png b/nuxt/public/images/pictograms/low-code_red.png similarity index 100% rename from src/images/pictograms/low-code_red.png rename to nuxt/public/images/pictograms/low-code_red.png diff --git a/src/images/pictograms/no_credit_card.png b/nuxt/public/images/pictograms/no_credit_card.png similarity index 100% rename from src/images/pictograms/no_credit_card.png rename to nuxt/public/images/pictograms/no_credit_card.png diff --git a/src/images/pictograms/node_catalog.png b/nuxt/public/images/pictograms/node_catalog.png similarity index 100% rename from src/images/pictograms/node_catalog.png rename to nuxt/public/images/pictograms/node_catalog.png diff --git a/src/images/pictograms/node_catalog_red.png b/nuxt/public/images/pictograms/node_catalog_red.png similarity index 100% rename from src/images/pictograms/node_catalog_red.png rename to nuxt/public/images/pictograms/node_catalog_red.png diff --git a/src/images/pictograms/opensource.png b/nuxt/public/images/pictograms/opensource.png similarity index 100% rename from src/images/pictograms/opensource.png rename to nuxt/public/images/pictograms/opensource.png diff --git a/src/images/pictograms/opensource_blue.png b/nuxt/public/images/pictograms/opensource_blue.png similarity index 100% rename from src/images/pictograms/opensource_blue.png rename to nuxt/public/images/pictograms/opensource_blue.png diff --git a/src/images/pictograms/optimism.png b/nuxt/public/images/pictograms/optimism.png similarity index 100% rename from src/images/pictograms/optimism.png rename to nuxt/public/images/pictograms/optimism.png diff --git a/src/images/pictograms/orchestration_blue.png b/nuxt/public/images/pictograms/orchestration_blue.png similarity index 100% rename from src/images/pictograms/orchestration_blue.png rename to nuxt/public/images/pictograms/orchestration_blue.png diff --git a/src/images/pictograms/orchestration_red.png b/nuxt/public/images/pictograms/orchestration_red.png similarity index 100% rename from src/images/pictograms/orchestration_red.png rename to nuxt/public/images/pictograms/orchestration_red.png diff --git a/src/images/pictograms/parental_leave.png b/nuxt/public/images/pictograms/parental_leave.png similarity index 100% rename from src/images/pictograms/parental_leave.png rename to nuxt/public/images/pictograms/parental_leave.png diff --git a/src/images/pictograms/parental_leave_blue.png b/nuxt/public/images/pictograms/parental_leave_blue.png similarity index 100% rename from src/images/pictograms/parental_leave_blue.png rename to nuxt/public/images/pictograms/parental_leave_blue.png diff --git a/src/images/pictograms/pipeline_blue.png b/nuxt/public/images/pictograms/pipeline_blue.png similarity index 100% rename from src/images/pictograms/pipeline_blue.png rename to nuxt/public/images/pictograms/pipeline_blue.png diff --git a/src/images/pictograms/pipeline_red.png b/nuxt/public/images/pictograms/pipeline_red.png similarity index 100% rename from src/images/pictograms/pipeline_red.png rename to nuxt/public/images/pictograms/pipeline_red.png diff --git a/src/images/pictograms/remote.png b/nuxt/public/images/pictograms/remote.png similarity index 100% rename from src/images/pictograms/remote.png rename to nuxt/public/images/pictograms/remote.png diff --git a/src/images/pictograms/results.png b/nuxt/public/images/pictograms/results.png similarity index 100% rename from src/images/pictograms/results.png rename to nuxt/public/images/pictograms/results.png diff --git a/src/images/pictograms/reward_red.png b/nuxt/public/images/pictograms/reward_red.png similarity index 100% rename from src/images/pictograms/reward_red.png rename to nuxt/public/images/pictograms/reward_red.png diff --git a/src/images/pictograms/scalable_blue.png b/nuxt/public/images/pictograms/scalable_blue.png similarity index 100% rename from src/images/pictograms/scalable_blue.png rename to nuxt/public/images/pictograms/scalable_blue.png diff --git a/src/images/pictograms/scalable_pictogram_blue.png b/nuxt/public/images/pictograms/scalable_pictogram_blue.png similarity index 100% rename from src/images/pictograms/scalable_pictogram_blue.png rename to nuxt/public/images/pictograms/scalable_pictogram_blue.png diff --git a/src/images/pictograms/scalable_pictogram_red.png b/nuxt/public/images/pictograms/scalable_pictogram_red.png similarity index 100% rename from src/images/pictograms/scalable_pictogram_red.png rename to nuxt/public/images/pictograms/scalable_pictogram_red.png diff --git a/src/images/pictograms/scalable_red.png b/nuxt/public/images/pictograms/scalable_red.png similarity index 100% rename from src/images/pictograms/scalable_red.png rename to nuxt/public/images/pictograms/scalable_red.png diff --git a/src/images/pictograms/security.png b/nuxt/public/images/pictograms/security.png similarity index 100% rename from src/images/pictograms/security.png rename to nuxt/public/images/pictograms/security.png diff --git a/src/images/pictograms/security_pictogram_blue.png b/nuxt/public/images/pictograms/security_pictogram_blue.png similarity index 100% rename from src/images/pictograms/security_pictogram_blue.png rename to nuxt/public/images/pictograms/security_pictogram_blue.png diff --git a/src/images/pictograms/security_pictogram_red.png b/nuxt/public/images/pictograms/security_pictogram_red.png similarity index 100% rename from src/images/pictograms/security_pictogram_red.png rename to nuxt/public/images/pictograms/security_pictogram_red.png diff --git a/src/images/pictograms/security_red.png b/nuxt/public/images/pictograms/security_red.png similarity index 100% rename from src/images/pictograms/security_red.png rename to nuxt/public/images/pictograms/security_red.png diff --git a/src/images/pictograms/small-pipeline_red.png b/nuxt/public/images/pictograms/small-pipeline_red.png similarity index 100% rename from src/images/pictograms/small-pipeline_red.png rename to nuxt/public/images/pictograms/small-pipeline_red.png diff --git a/src/images/pictograms/snapshot_blue.png b/nuxt/public/images/pictograms/snapshot_blue.png similarity index 100% rename from src/images/pictograms/snapshot_blue.png rename to nuxt/public/images/pictograms/snapshot_blue.png diff --git a/src/images/pictograms/speech_red.png b/nuxt/public/images/pictograms/speech_red.png similarity index 100% rename from src/images/pictograms/speech_red.png rename to nuxt/public/images/pictograms/speech_red.png diff --git a/src/images/pictograms/speech_red_b.png b/nuxt/public/images/pictograms/speech_red_b.png similarity index 100% rename from src/images/pictograms/speech_red_b.png rename to nuxt/public/images/pictograms/speech_red_b.png diff --git a/src/images/pictograms/storage_blue.png b/nuxt/public/images/pictograms/storage_blue.png similarity index 100% rename from src/images/pictograms/storage_blue.png rename to nuxt/public/images/pictograms/storage_blue.png diff --git a/src/images/pictograms/storage_red.png b/nuxt/public/images/pictograms/storage_red.png similarity index 100% rename from src/images/pictograms/storage_red.png rename to nuxt/public/images/pictograms/storage_red.png diff --git a/src/images/pictograms/support.png b/nuxt/public/images/pictograms/support.png similarity index 100% rename from src/images/pictograms/support.png rename to nuxt/public/images/pictograms/support.png diff --git a/src/images/pictograms/support_pictogram_red.png b/nuxt/public/images/pictograms/support_pictogram_red.png similarity index 100% rename from src/images/pictograms/support_pictogram_red.png rename to nuxt/public/images/pictograms/support_pictogram_red.png diff --git a/src/images/pictograms/support_red.png b/nuxt/public/images/pictograms/support_red.png similarity index 100% rename from src/images/pictograms/support_red.png rename to nuxt/public/images/pictograms/support_red.png diff --git a/src/images/pictograms/ticket.png b/nuxt/public/images/pictograms/ticket.png similarity index 100% rename from src/images/pictograms/ticket.png rename to nuxt/public/images/pictograms/ticket.png diff --git a/src/images/pictograms/ticket_red.png b/nuxt/public/images/pictograms/ticket_red.png similarity index 100% rename from src/images/pictograms/ticket_red.png rename to nuxt/public/images/pictograms/ticket_red.png diff --git a/src/images/pictograms/time.png b/nuxt/public/images/pictograms/time.png similarity index 100% rename from src/images/pictograms/time.png rename to nuxt/public/images/pictograms/time.png diff --git a/src/images/pictograms/time_red.png b/nuxt/public/images/pictograms/time_red.png similarity index 100% rename from src/images/pictograms/time_red.png rename to nuxt/public/images/pictograms/time_red.png diff --git a/src/images/pictograms/trusting.png b/nuxt/public/images/pictograms/trusting.png similarity index 100% rename from src/images/pictograms/trusting.png rename to nuxt/public/images/pictograms/trusting.png diff --git a/src/images/pictograms/users_blue.png b/nuxt/public/images/pictograms/users_blue.png similarity index 100% rename from src/images/pictograms/users_blue.png rename to nuxt/public/images/pictograms/users_blue.png diff --git a/src/images/pictograms/vacation.png b/nuxt/public/images/pictograms/vacation.png similarity index 100% rename from src/images/pictograms/vacation.png rename to nuxt/public/images/pictograms/vacation.png diff --git a/src/images/pidd-icon.png b/nuxt/public/images/pidd-icon.png similarity index 100% rename from src/images/pidd-icon.png rename to nuxt/public/images/pidd-icon.png diff --git a/src/images/screen-pseudo-audit.png b/nuxt/public/images/screen-pseudo-audit.png similarity index 100% rename from src/images/screen-pseudo-audit.png rename to nuxt/public/images/screen-pseudo-audit.png diff --git a/src/images/screen-pseudo-devices.png b/nuxt/public/images/screen-pseudo-devices.png similarity index 100% rename from src/images/screen-pseudo-devices.png rename to nuxt/public/images/screen-pseudo-devices.png diff --git a/src/images/screen-pseudo-overview.png b/nuxt/public/images/screen-pseudo-overview.png similarity index 100% rename from src/images/screen-pseudo-overview.png rename to nuxt/public/images/screen-pseudo-overview.png diff --git a/src/images/signl4_logo.png b/nuxt/public/images/signl4_logo.png similarity index 100% rename from src/images/signl4_logo.png rename to nuxt/public/images/signl4_logo.png diff --git a/src/images/signup.png b/nuxt/public/images/signup.png similarity index 100% rename from src/images/signup.png rename to nuxt/public/images/signup.png diff --git a/src/images/solutions/og-solutions-data-integration.jpg b/nuxt/public/images/solutions/og-solutions-data-integration.jpg similarity index 100% rename from src/images/solutions/og-solutions-data-integration.jpg rename to nuxt/public/images/solutions/og-solutions-data-integration.jpg diff --git a/src/images/solutions/og-solutions-device-management.jpg b/nuxt/public/images/solutions/og-solutions-device-management.jpg similarity index 100% rename from src/images/solutions/og-solutions-device-management.jpg rename to nuxt/public/images/solutions/og-solutions-device-management.jpg diff --git a/src/images/solutions/og-solutions-manufacturing.jpg b/nuxt/public/images/solutions/og-solutions-manufacturing.jpg similarity index 100% rename from src/images/solutions/og-solutions-manufacturing.jpg rename to nuxt/public/images/solutions/og-solutions-manufacturing.jpg diff --git a/src/images/stories/abrasive-tech-dashboard-2.png b/nuxt/public/images/stories/abrasive-tech-dashboard-2.png similarity index 100% rename from src/images/stories/abrasive-tech-dashboard-2.png rename to nuxt/public/images/stories/abrasive-tech-dashboard-2.png diff --git a/src/images/stories/abrasive-tech-dashboard.png b/nuxt/public/images/stories/abrasive-tech-dashboard.png similarity index 100% rename from src/images/stories/abrasive-tech-dashboard.png rename to nuxt/public/images/stories/abrasive-tech-dashboard.png diff --git a/src/images/stories/aperia.jpg b/nuxt/public/images/stories/aperia.jpg similarity index 100% rename from src/images/stories/aperia.jpg rename to nuxt/public/images/stories/aperia.jpg diff --git a/src/images/stories/arch_systems.jpeg b/nuxt/public/images/stories/arch_systems.jpeg similarity index 100% rename from src/images/stories/arch_systems.jpeg rename to nuxt/public/images/stories/arch_systems.jpeg diff --git a/src/images/stories/arch_systems_engineer.png b/nuxt/public/images/stories/arch_systems_engineer.png similarity index 100% rename from src/images/stories/arch_systems_engineer.png rename to nuxt/public/images/stories/arch_systems_engineer.png diff --git a/src/images/stories/energinet.jpg b/nuxt/public/images/stories/energinet.jpg similarity index 100% rename from src/images/stories/energinet.jpg rename to nuxt/public/images/stories/energinet.jpg diff --git a/src/images/stories/logos/abrasive-tech-logo-3.png b/nuxt/public/images/stories/logos/abrasive-tech-logo-3.png similarity index 100% rename from src/images/stories/logos/abrasive-tech-logo-3.png rename to nuxt/public/images/stories/logos/abrasive-tech-logo-3.png diff --git a/src/images/stories/logos/abrasive-tech-logo-4.png b/nuxt/public/images/stories/logos/abrasive-tech-logo-4.png similarity index 100% rename from src/images/stories/logos/abrasive-tech-logo-4.png rename to nuxt/public/images/stories/logos/abrasive-tech-logo-4.png diff --git a/src/images/stories/logos/aperia-technologies.png b/nuxt/public/images/stories/logos/aperia-technologies.png similarity index 100% rename from src/images/stories/logos/aperia-technologies.png rename to nuxt/public/images/stories/logos/aperia-technologies.png diff --git a/src/images/stories/logos/arch-systems-logo.png b/nuxt/public/images/stories/logos/arch-systems-logo.png similarity index 100% rename from src/images/stories/logos/arch-systems-logo.png rename to nuxt/public/images/stories/logos/arch-systems-logo.png diff --git a/src/images/stories/logos/logo-neoception.png b/nuxt/public/images/stories/logos/logo-neoception.png similarity index 100% rename from src/images/stories/logos/logo-neoception.png rename to nuxt/public/images/stories/logos/logo-neoception.png diff --git a/src/images/stories/logos/logo_opto22_red.png b/nuxt/public/images/stories/logos/logo_opto22_red.png similarity index 100% rename from src/images/stories/logos/logo_opto22_red.png rename to nuxt/public/images/stories/logos/logo_opto22_red.png diff --git a/src/images/stories/logos/logo_wmo.png b/nuxt/public/images/stories/logos/logo_wmo.png similarity index 100% rename from src/images/stories/logos/logo_wmo.png rename to nuxt/public/images/stories/logos/logo_wmo.png diff --git a/src/images/stories/logos/pidd-logo.jpg b/nuxt/public/images/stories/logos/pidd-logo.jpg similarity index 100% rename from src/images/stories/logos/pidd-logo.jpg rename to nuxt/public/images/stories/logos/pidd-logo.jpg diff --git a/src/images/stories/logos/power-workplace-1.png b/nuxt/public/images/stories/logos/power-workplace-1.png similarity index 100% rename from src/images/stories/logos/power-workplace-1.png rename to nuxt/public/images/stories/logos/power-workplace-1.png diff --git a/src/images/stories/logos/stfi.jpeg b/nuxt/public/images/stories/logos/stfi.jpeg similarity index 100% rename from src/images/stories/logos/stfi.jpeg rename to nuxt/public/images/stories/logos/stfi.jpeg diff --git a/src/images/stories/logos/walter-logo.png b/nuxt/public/images/stories/logos/walter-logo.png similarity index 100% rename from src/images/stories/logos/walter-logo.png rename to nuxt/public/images/stories/logos/walter-logo.png diff --git a/src/images/stories/neoception.png b/nuxt/public/images/stories/neoception.png similarity index 100% rename from src/images/stories/neoception.png rename to nuxt/public/images/stories/neoception.png diff --git a/src/images/stories/opto22.jpg b/nuxt/public/images/stories/opto22.jpg similarity index 100% rename from src/images/stories/opto22.jpg rename to nuxt/public/images/stories/opto22.jpg diff --git a/src/images/stories/pidd-view.png b/nuxt/public/images/stories/pidd-view.png similarity index 100% rename from src/images/stories/pidd-view.png rename to nuxt/public/images/stories/pidd-view.png diff --git a/src/images/stories/power-workplace-diagram.svg b/nuxt/public/images/stories/power-workplace-diagram.svg similarity index 100% rename from src/images/stories/power-workplace-diagram.svg rename to nuxt/public/images/stories/power-workplace-diagram.svg diff --git a/src/images/stories/stfi-augmented-reality.jpg b/nuxt/public/images/stories/stfi-augmented-reality.jpg similarity index 100% rename from src/images/stories/stfi-augmented-reality.jpg rename to nuxt/public/images/stories/stfi-augmented-reality.jpg diff --git a/src/images/stories/stfi-mobile-robot.png b/nuxt/public/images/stories/stfi-mobile-robot.png similarity index 100% rename from src/images/stories/stfi-mobile-robot.png rename to nuxt/public/images/stories/stfi-mobile-robot.png diff --git a/src/images/stories/stfi-node-red-flow-opcua.png b/nuxt/public/images/stories/stfi-node-red-flow-opcua.png similarity index 100% rename from src/images/stories/stfi-node-red-flow-opcua.png rename to nuxt/public/images/stories/stfi-node-red-flow-opcua.png diff --git a/src/images/stories/un-wmo.jpg b/nuxt/public/images/stories/un-wmo.jpg similarity index 100% rename from src/images/stories/un-wmo.jpg rename to nuxt/public/images/stories/un-wmo.jpg diff --git a/src/images/stories/waler-architecture.png b/nuxt/public/images/stories/waler-architecture.png similarity index 100% rename from src/images/stories/waler-architecture.png rename to nuxt/public/images/stories/waler-architecture.png diff --git a/src/images/stories/walter-flow.png b/nuxt/public/images/stories/walter-flow.png similarity index 100% rename from src/images/stories/walter-flow.png rename to nuxt/public/images/stories/walter-flow.png diff --git a/src/images/stories/walter.png b/nuxt/public/images/stories/walter.png similarity index 100% rename from src/images/stories/walter.png rename to nuxt/public/images/stories/walter.png diff --git a/src/images/thumbnail-nick-flowfuse.png b/nuxt/public/images/thumbnail-nick-flowfuse.png similarity index 100% rename from src/images/thumbnail-nick-flowfuse.png rename to nuxt/public/images/thumbnail-nick-flowfuse.png diff --git a/src/images/walter-icon.png b/nuxt/public/images/walter-icon.png similarity index 100% rename from src/images/walter-icon.png rename to nuxt/public/images/walter-icon.png diff --git a/src/images/webinars/ai-on-the-factory-floor.jpg b/nuxt/public/images/webinars/ai-on-the-factory-floor.jpg similarity index 100% rename from src/images/webinars/ai-on-the-factory-floor.jpg rename to nuxt/public/images/webinars/ai-on-the-factory-floor.jpg diff --git a/src/images/webinars/ama-april.jpg b/nuxt/public/images/webinars/ama-april.jpg similarity index 100% rename from src/images/webinars/ama-april.jpg rename to nuxt/public/images/webinars/ama-april.jpg diff --git a/src/images/webinars/ama-feb.jpg b/nuxt/public/images/webinars/ama-feb.jpg similarity index 100% rename from src/images/webinars/ama-feb.jpg rename to nuxt/public/images/webinars/ama-feb.jpg diff --git a/src/images/webinars/ama-march.jpg b/nuxt/public/images/webinars/ama-march.jpg similarity index 100% rename from src/images/webinars/ama-march.jpg rename to nuxt/public/images/webinars/ama-march.jpg diff --git a/src/images/webinars/ama-may.jpg b/nuxt/public/images/webinars/ama-may.jpg similarity index 100% rename from src/images/webinars/ama-may.jpg rename to nuxt/public/images/webinars/ama-may.jpg diff --git a/src/images/webinars/be-an-industry-4-0-hero-from-shop-floor-data-to-real-time-dashboards.jpg b/nuxt/public/images/webinars/be-an-industry-4-0-hero-from-shop-floor-data-to-real-time-dashboards.jpg similarity index 100% rename from src/images/webinars/be-an-industry-4-0-hero-from-shop-floor-data-to-real-time-dashboards.jpg rename to nuxt/public/images/webinars/be-an-industry-4-0-hero-from-shop-floor-data-to-real-time-dashboards.jpg diff --git a/src/images/webinars/blueprints-build-faster-with-node-red-on-flowfuse.jpg b/nuxt/public/images/webinars/blueprints-build-faster-with-node-red-on-flowfuse.jpg similarity index 100% rename from src/images/webinars/blueprints-build-faster-with-node-red-on-flowfuse.jpg rename to nuxt/public/images/webinars/blueprints-build-faster-with-node-red-on-flowfuse.jpg diff --git a/src/images/webinars/bringing-ai-to-nodered.jpg b/nuxt/public/images/webinars/bringing-ai-to-nodered.jpg similarity index 100% rename from src/images/webinars/bringing-ai-to-nodered.jpg rename to nuxt/public/images/webinars/bringing-ai-to-nodered.jpg diff --git a/src/images/webinars/building-a-foundation-for-enterprise-agility-and-process-optimization.jpg b/nuxt/public/images/webinars/building-a-foundation-for-enterprise-agility-and-process-optimization.jpg similarity index 100% rename from src/images/webinars/building-a-foundation-for-enterprise-agility-and-process-optimization.jpg rename to nuxt/public/images/webinars/building-a-foundation-for-enterprise-agility-and-process-optimization.jpg diff --git a/src/images/webinars/building-node-red-applications-for-scalability-and-high-availability-webinar-june.jpg b/nuxt/public/images/webinars/building-node-red-applications-for-scalability-and-high-availability-webinar-june.jpg similarity index 100% rename from src/images/webinars/building-node-red-applications-for-scalability-and-high-availability-webinar-june.jpg rename to nuxt/public/images/webinars/building-node-red-applications-for-scalability-and-high-availability-webinar-june.jpg diff --git a/src/images/webinars/building-unified-namespace-uns-using-node-red-and-mqtt-webinar-2024-march.jpg b/nuxt/public/images/webinars/building-unified-namespace-uns-using-node-red-and-mqtt-webinar-2024-march.jpg similarity index 100% rename from src/images/webinars/building-unified-namespace-uns-using-node-red-and-mqtt-webinar-2024-march.jpg rename to nuxt/public/images/webinars/building-unified-namespace-uns-using-node-red-and-mqtt-webinar-2024-march.jpg diff --git a/src/images/webinars/celebrate-10-years-of-node-red-webinar-september.jpg b/nuxt/public/images/webinars/celebrate-10-years-of-node-red-webinar-september.jpg similarity index 100% rename from src/images/webinars/celebrate-10-years-of-node-red-webinar-september.jpg rename to nuxt/public/images/webinars/celebrate-10-years-of-node-red-webinar-september.jpg diff --git a/src/images/webinars/connect-integrate-visualise-industrial-production-metrics-with-node-red.jpg b/nuxt/public/images/webinars/connect-integrate-visualise-industrial-production-metrics-with-node-red.jpg similarity index 100% rename from src/images/webinars/connect-integrate-visualise-industrial-production-metrics-with-node-red.jpg rename to nuxt/public/images/webinars/connect-integrate-visualise-industrial-production-metrics-with-node-red.jpg diff --git a/src/images/webinars/dashboard-2-0-where-we-are-and-whats-next-webinar-october.jpg b/nuxt/public/images/webinars/dashboard-2-0-where-we-are-and-whats-next-webinar-october.jpg similarity index 100% rename from src/images/webinars/dashboard-2-0-where-we-are-and-whats-next-webinar-october.jpg rename to nuxt/public/images/webinars/dashboard-2-0-where-we-are-and-whats-next-webinar-october.jpg diff --git a/src/images/webinars/develop-manage-and-deploy-complex-node-red-projects-at-scale-with-flowfuse.jpg b/nuxt/public/images/webinars/develop-manage-and-deploy-complex-node-red-projects-at-scale-with-flowfuse.jpg similarity index 100% rename from src/images/webinars/develop-manage-and-deploy-complex-node-red-projects-at-scale-with-flowfuse.jpg rename to nuxt/public/images/webinars/develop-manage-and-deploy-complex-node-red-projects-at-scale-with-flowfuse.jpg diff --git a/src/images/webinars/devops-for-node-red-an-introduction-webinar.jpg b/nuxt/public/images/webinars/devops-for-node-red-an-introduction-webinar.jpg similarity index 100% rename from src/images/webinars/devops-for-node-red-an-introduction-webinar.jpg rename to nuxt/public/images/webinars/devops-for-node-red-an-introduction-webinar.jpg diff --git a/src/images/webinars/enterprise-grade-edge-device-fleet-management-balena-and-flowfuse-webinar-january-2024.jpg b/nuxt/public/images/webinars/enterprise-grade-edge-device-fleet-management-balena-and-flowfuse-webinar-january-2024.jpg similarity index 100% rename from src/images/webinars/enterprise-grade-edge-device-fleet-management-balena-and-flowfuse-webinar-january-2024.jpg rename to nuxt/public/images/webinars/enterprise-grade-edge-device-fleet-management-balena-and-flowfuse-webinar-january-2024.jpg diff --git a/src/images/webinars/flowFuse-blueprints-your-pathway-enhanced-manufacturing-webinar-nov-23.jpg b/nuxt/public/images/webinars/flowFuse-blueprints-your-pathway-enhanced-manufacturing-webinar-nov-23.jpg similarity index 100% rename from src/images/webinars/flowFuse-blueprints-your-pathway-enhanced-manufacturing-webinar-nov-23.jpg rename to nuxt/public/images/webinars/flowFuse-blueprints-your-pathway-enhanced-manufacturing-webinar-nov-23.jpg diff --git a/src/images/webinars/flowfuse-and-hivemq-powering-the-core-components-of-a-unified-namespace.jpg b/nuxt/public/images/webinars/flowfuse-and-hivemq-powering-the-core-components-of-a-unified-namespace.jpg similarity index 100% rename from src/images/webinars/flowfuse-and-hivemq-powering-the-core-components-of-a-unified-namespace.jpg rename to nuxt/public/images/webinars/flowfuse-and-hivemq-powering-the-core-components-of-a-unified-namespace.jpg diff --git a/src/images/webinars/flowfuse-mqtt-broker-for-industrial-transformation.jpg b/nuxt/public/images/webinars/flowfuse-mqtt-broker-for-industrial-transformation.jpg similarity index 100% rename from src/images/webinars/flowfuse-mqtt-broker-for-industrial-transformation.jpg rename to nuxt/public/images/webinars/flowfuse-mqtt-broker-for-industrial-transformation.jpg diff --git a/src/images/webinars/from-node-red-to-flowfuse-it-ot-integration-and-automation-in-container-terminals.jpg b/nuxt/public/images/webinars/from-node-red-to-flowfuse-it-ot-integration-and-automation-in-container-terminals.jpg similarity index 100% rename from src/images/webinars/from-node-red-to-flowfuse-it-ot-integration-and-automation-in-container-terminals.jpg rename to nuxt/public/images/webinars/from-node-red-to-flowfuse-it-ot-integration-and-automation-in-container-terminals.jpg diff --git a/src/images/webinars/getting-started-with-node-red-dashboard-webinar-may.jpg b/nuxt/public/images/webinars/getting-started-with-node-red-dashboard-webinar-may.jpg similarity index 100% rename from src/images/webinars/getting-started-with-node-red-dashboard-webinar-may.jpg rename to nuxt/public/images/webinars/getting-started-with-node-red-dashboard-webinar-may.jpg diff --git a/src/images/webinars/getting-started-with-opc-ua-and-node-red-webinar-august.jpg b/nuxt/public/images/webinars/getting-started-with-opc-ua-and-node-red-webinar-august.jpg similarity index 100% rename from src/images/webinars/getting-started-with-opc-ua-and-node-red-webinar-august.jpg rename to nuxt/public/images/webinars/getting-started-with-opc-ua-and-node-red-webinar-august.jpg diff --git a/src/images/webinars/how-to-deploy-node-red-to-hundreds-of-plcs-and-iot-edge-devices-webinar-july.jpg b/nuxt/public/images/webinars/how-to-deploy-node-red-to-hundreds-of-plcs-and-iot-edge-devices-webinar-july.jpg similarity index 100% rename from src/images/webinars/how-to-deploy-node-red-to-hundreds-of-plcs-and-iot-edge-devices-webinar-july.jpg rename to nuxt/public/images/webinars/how-to-deploy-node-red-to-hundreds-of-plcs-and-iot-edge-devices-webinar-july.jpg diff --git a/src/images/webinars/industrial-iot-solutions.jpg b/nuxt/public/images/webinars/industrial-iot-solutions.jpg similarity index 100% rename from src/images/webinars/industrial-iot-solutions.jpg rename to nuxt/public/images/webinars/industrial-iot-solutions.jpg diff --git a/src/images/webinars/integrating-external-ai-agents-in-industrial-workflows.jpg b/nuxt/public/images/webinars/integrating-external-ai-agents-in-industrial-workflows.jpg similarity index 100% rename from src/images/webinars/integrating-external-ai-agents-in-industrial-workflows.jpg rename to nuxt/public/images/webinars/integrating-external-ai-agents-in-industrial-workflows.jpg diff --git a/src/images/webinars/intro-to-node-red-5-minutes-to-your-first-program-webinar-feb-2023.jpg b/nuxt/public/images/webinars/intro-to-node-red-5-minutes-to-your-first-program-webinar-feb-2023.jpg similarity index 100% rename from src/images/webinars/intro-to-node-red-5-minutes-to-your-first-program-webinar-feb-2023.jpg rename to nuxt/public/images/webinars/intro-to-node-red-5-minutes-to-your-first-program-webinar-feb-2023.jpg diff --git a/src/images/webinars/live-from-the-shop-floor-scaling-from-digital to-smart-with-flowfuse-and-revolution-pi.jpg b/nuxt/public/images/webinars/live-from-the-shop-floor-scaling-from-digital to-smart-with-flowfuse-and-revolution-pi.jpg similarity index 100% rename from src/images/webinars/live-from-the-shop-floor-scaling-from-digital to-smart-with-flowfuse-and-revolution-pi.jpg rename to nuxt/public/images/webinars/live-from-the-shop-floor-scaling-from-digital to-smart-with-flowfuse-and-revolution-pi.jpg diff --git a/src/images/webinars/making-industry-work-leveraging-opc-ua-at-scale.jpg b/nuxt/public/images/webinars/making-industry-work-leveraging-opc-ua-at-scale.jpg similarity index 100% rename from src/images/webinars/making-industry-work-leveraging-opc-ua-at-scale.jpg rename to nuxt/public/images/webinars/making-industry-work-leveraging-opc-ua-at-scale.jpg diff --git a/src/images/webinars/managing-distributed-node-red-deployments.jpg b/nuxt/public/images/webinars/managing-distributed-node-red-deployments.jpg similarity index 100% rename from src/images/webinars/managing-distributed-node-red-deployments.jpg rename to nuxt/public/images/webinars/managing-distributed-node-red-deployments.jpg diff --git a/src/images/webinars/modbus-communications-modernization.jpg b/nuxt/public/images/webinars/modbus-communications-modernization.jpg similarity index 100% rename from src/images/webinars/modbus-communications-modernization.jpg rename to nuxt/public/images/webinars/modbus-communications-modernization.jpg diff --git a/src/images/webinars/ncd-io-and-flowfuse.jpg b/nuxt/public/images/webinars/ncd-io-and-flowfuse.jpg similarity index 100% rename from src/images/webinars/ncd-io-and-flowfuse.jpg rename to nuxt/public/images/webinars/ncd-io-and-flowfuse.jpg diff --git a/src/images/webinars/new-year-celebration-sync-music-with-fireworks-or-light-shows-webinar-december.jpg b/nuxt/public/images/webinars/new-year-celebration-sync-music-with-fireworks-or-light-shows-webinar-december.jpg similarity index 100% rename from src/images/webinars/new-year-celebration-sync-music-with-fireworks-or-light-shows-webinar-december.jpg rename to nuxt/public/images/webinars/new-year-celebration-sync-music-with-fireworks-or-light-shows-webinar-december.jpg diff --git a/src/images/webinars/node-red-dashboard-crash-course.jpg b/nuxt/public/images/webinars/node-red-dashboard-crash-course.jpg similarity index 100% rename from src/images/webinars/node-red-dashboard-crash-course.jpg rename to nuxt/public/images/webinars/node-red-dashboard-crash-course.jpg diff --git a/src/images/webinars/node-red-why-and-when-for-cloud-and-edge.jpg b/nuxt/public/images/webinars/node-red-why-and-when-for-cloud-and-edge.jpg similarity index 100% rename from src/images/webinars/node-red-why-and-when-for-cloud-and-edge.jpg rename to nuxt/public/images/webinars/node-red-why-and-when-for-cloud-and-edge.jpg diff --git a/src/images/webinars/operationalizing-node-rED-webinar-sep-24.jpeg b/nuxt/public/images/webinars/operationalizing-node-rED-webinar-sep-24.jpeg similarity index 100% rename from src/images/webinars/operationalizing-node-rED-webinar-sep-24.jpeg rename to nuxt/public/images/webinars/operationalizing-node-rED-webinar-sep-24.jpeg diff --git a/src/images/webinars/simplifying-opc-ua.jpg b/nuxt/public/images/webinars/simplifying-opc-ua.jpg similarity index 100% rename from src/images/webinars/simplifying-opc-ua.jpg rename to nuxt/public/images/webinars/simplifying-opc-ua.jpg diff --git a/src/images/webinars/skys-journey-to-faster-data-delivery-with-flowfuse.jpg b/nuxt/public/images/webinars/skys-journey-to-faster-data-delivery-with-flowfuse.jpg similarity index 100% rename from src/images/webinars/skys-journey-to-faster-data-delivery-with-flowfuse.jpg rename to nuxt/public/images/webinars/skys-journey-to-faster-data-delivery-with-flowfuse.jpg diff --git a/src/images/webinars/the-agile-factory-on-the-connected-edge.jpg b/nuxt/public/images/webinars/the-agile-factory-on-the-connected-edge.jpg similarity index 100% rename from src/images/webinars/the-agile-factory-on-the-connected-edge.jpg rename to nuxt/public/images/webinars/the-agile-factory-on-the-connected-edge.jpg diff --git a/src/images/webinars/the-bus-factor-in-real-life.jpg b/nuxt/public/images/webinars/the-bus-factor-in-real-life.jpg similarity index 100% rename from src/images/webinars/the-bus-factor-in-real-life.jpg rename to nuxt/public/images/webinars/the-bus-factor-in-real-life.jpg diff --git a/src/images/webinars/the-ptc-tpg-deal.jpg b/nuxt/public/images/webinars/the-ptc-tpg-deal.jpg similarity index 100% rename from src/images/webinars/the-ptc-tpg-deal.jpg rename to nuxt/public/images/webinars/the-ptc-tpg-deal.jpg diff --git a/src/images/webinars/turning-data-into-knowledge.jpg b/nuxt/public/images/webinars/turning-data-into-knowledge.jpg similarity index 100% rename from src/images/webinars/turning-data-into-knowledge.jpg rename to nuxt/public/images/webinars/turning-data-into-knowledge.jpg diff --git a/src/images/webinars/webinar-elevating-nodered-flowfuse-paltform-update-2.jpg b/nuxt/public/images/webinars/webinar-elevating-nodered-flowfuse-paltform-update-2.jpg similarity index 100% rename from src/images/webinars/webinar-elevating-nodered-flowfuse-paltform-update-2.jpg rename to nuxt/public/images/webinars/webinar-elevating-nodered-flowfuse-paltform-update-2.jpg diff --git a/src/images/webinars/webinar-elevating-nodered-flowfuse-paltform-update.jpg b/nuxt/public/images/webinars/webinar-elevating-nodered-flowfuse-paltform-update.jpg similarity index 100% rename from src/images/webinars/webinar-elevating-nodered-flowfuse-paltform-update.jpg rename to nuxt/public/images/webinars/webinar-elevating-nodered-flowfuse-paltform-update.jpg diff --git a/src/images/webinars/webinar-how-flowfuse-enables-a-future-proof-uns-it-ot-architecture.jpg b/nuxt/public/images/webinars/webinar-how-flowfuse-enables-a-future-proof-uns-it-ot-architecture.jpg similarity index 100% rename from src/images/webinars/webinar-how-flowfuse-enables-a-future-proof-uns-it-ot-architecture.jpg rename to nuxt/public/images/webinars/webinar-how-flowfuse-enables-a-future-proof-uns-it-ot-architecture.jpg diff --git a/src/images/webinars/webinar-mqtt-vs-opc-ua.jpg b/nuxt/public/images/webinars/webinar-mqtt-vs-opc-ua.jpg similarity index 100% rename from src/images/webinars/webinar-mqtt-vs-opc-ua.jpg rename to nuxt/public/images/webinars/webinar-mqtt-vs-opc-ua.jpg diff --git a/src/images/webinars/webinar-node-red-wago.jpg b/nuxt/public/images/webinars/webinar-node-red-wago.jpg similarity index 100% rename from src/images/webinars/webinar-node-red-wago.jpg rename to nuxt/public/images/webinars/webinar-node-red-wago.jpg diff --git a/src/images/webinars/webinar-the-power-of-integration-flowfuse-platform-update.jpg b/nuxt/public/images/webinars/webinar-the-power-of-integration-flowfuse-platform-update.jpg similarity index 100% rename from src/images/webinars/webinar-the-power-of-integration-flowfuse-platform-update.jpg rename to nuxt/public/images/webinars/webinar-the-power-of-integration-flowfuse-platform-update.jpg diff --git a/src/js/nav-tracking.js b/nuxt/public/js/nav-tracking.js similarity index 94% rename from src/js/nav-tracking.js rename to nuxt/public/js/nav-tracking.js index f6d5dfd13e..5adbafb46f 100644 --- a/src/js/nav-tracking.js +++ b/nuxt/public/js/nav-tracking.js @@ -16,9 +16,8 @@ * zone and section come from `data-nav-zone` / `data-nav-section` attributes * rather than styling classes, so the instrumentation survives a restyle. * - * Served at /js/nav-tracking.js on both stacks from this single source: 11ty - * passes it through, and the Nuxt build copies the 11ty output into - * nuxt/public/ (see the prod:eleventy-nuxt script). + * Served as-is from nuxt/public/js/, and loaded by app.head.script in + * nuxt/nuxt.config.ts. */ (function () { 'use strict' diff --git a/src/js/signup-popup.js b/nuxt/public/js/signup-popup.js similarity index 100% rename from src/js/signup-popup.js rename to nuxt/public/js/signup-popup.js diff --git a/src/landing/images/building-applications.png b/nuxt/public/landing/images/building-applications.png similarity index 100% rename from src/landing/images/building-applications.png rename to nuxt/public/landing/images/building-applications.png diff --git a/src/landing/images/edge-hero.png b/nuxt/public/landing/images/edge-hero.png similarity index 100% rename from src/landing/images/edge-hero.png rename to nuxt/public/landing/images/edge-hero.png diff --git a/src/landing/images/factory-efficiency.png b/nuxt/public/landing/images/factory-efficiency.png similarity index 100% rename from src/landing/images/factory-efficiency.png rename to nuxt/public/landing/images/factory-efficiency.png diff --git a/src/landing/images/hero-enterprise.png b/nuxt/public/landing/images/hero-enterprise.png similarity index 100% rename from src/landing/images/hero-enterprise.png rename to nuxt/public/landing/images/hero-enterprise.png diff --git a/src/landing/images/hero-line-control.png b/nuxt/public/landing/images/hero-line-control.png similarity index 100% rename from src/landing/images/hero-line-control.png rename to nuxt/public/landing/images/hero-line-control.png diff --git a/src/landing/images/hero-plant.png b/nuxt/public/landing/images/hero-plant.png similarity index 100% rename from src/landing/images/hero-plant.png rename to nuxt/public/landing/images/hero-plant.png diff --git a/src/landing/images/how-enterprise.png b/nuxt/public/landing/images/how-enterprise.png similarity index 100% rename from src/landing/images/how-enterprise.png rename to nuxt/public/landing/images/how-enterprise.png diff --git a/src/landing/images/line-solution.png b/nuxt/public/landing/images/line-solution.png similarity index 100% rename from src/landing/images/line-solution.png rename to nuxt/public/landing/images/line-solution.png diff --git a/src/landing/images/low-code-whitepaper.png b/nuxt/public/landing/images/low-code-whitepaper.png similarity index 100% rename from src/landing/images/low-code-whitepaper.png rename to nuxt/public/landing/images/low-code-whitepaper.png diff --git a/src/landing/images/opcua-landing-image.png b/nuxt/public/landing/images/opcua-landing-image.png similarity index 100% rename from src/landing/images/opcua-landing-image.png rename to nuxt/public/landing/images/opcua-landing-image.png diff --git a/src/landing/images/plc-landing-image.png b/nuxt/public/landing/images/plc-landing-image.png similarity index 100% rename from src/landing/images/plc-landing-image.png rename to nuxt/public/landing/images/plc-landing-image.png diff --git a/src/landing/images/unified-real-time-data-platform.png b/nuxt/public/landing/images/unified-real-time-data-platform.png similarity index 100% rename from src/landing/images/unified-real-time-data-platform.png rename to nuxt/public/landing/images/unified-real-time-data-platform.png diff --git a/src/landing/images/use-cases-plant.png b/nuxt/public/landing/images/use-cases-plant.png similarity index 100% rename from src/landing/images/use-cases-plant.png rename to nuxt/public/landing/images/use-cases-plant.png diff --git a/src/public/mstile-144x144.png b/nuxt/public/mstile-144x144.png similarity index 100% rename from src/public/mstile-144x144.png rename to nuxt/public/mstile-144x144.png diff --git a/src/public/mstile-150x150.png b/nuxt/public/mstile-150x150.png similarity index 100% rename from src/public/mstile-150x150.png rename to nuxt/public/mstile-150x150.png diff --git a/src/public/mstile-310x150.png b/nuxt/public/mstile-310x150.png similarity index 100% rename from src/public/mstile-310x150.png rename to nuxt/public/mstile-310x150.png diff --git a/src/public/mstile-310x310.png b/nuxt/public/mstile-310x310.png similarity index 100% rename from src/public/mstile-310x310.png rename to nuxt/public/mstile-310x310.png diff --git a/src/public/mstile-70x70.png b/nuxt/public/mstile-70x70.png similarity index 100% rename from src/public/mstile-70x70.png rename to nuxt/public/mstile-70x70.png diff --git a/src/resources/images/Whitepaper_Accelerating-Industrial-Innovation-With-Low-Code-Platforms.png b/nuxt/public/resources/images/Whitepaper_Accelerating-Industrial-Innovation-With-Low-Code-Platforms.png similarity index 100% rename from src/resources/images/Whitepaper_Accelerating-Industrial-Innovation-With-Low-Code-Platforms.png rename to nuxt/public/resources/images/Whitepaper_Accelerating-Industrial-Innovation-With-Low-Code-Platforms.png diff --git a/src/resources/images/Whitepaper_Accelerating-Innovation-in-Manufacturing-with-FlowFuse.png b/nuxt/public/resources/images/Whitepaper_Accelerating-Innovation-in-Manufacturing-with-FlowFuse.png similarity index 100% rename from src/resources/images/Whitepaper_Accelerating-Innovation-in-Manufacturing-with-FlowFuse.png rename to nuxt/public/resources/images/Whitepaper_Accelerating-Innovation-in-Manufacturing-with-FlowFuse.png diff --git a/src/resources/images/Whitepaper_Open-Source-in-Manufacturing.png b/nuxt/public/resources/images/Whitepaper_Open-Source-in-Manufacturing.png similarity index 100% rename from src/resources/images/Whitepaper_Open-Source-in-Manufacturing.png rename to nuxt/public/resources/images/Whitepaper_Open-Source-in-Manufacturing.png diff --git a/src/resources/images/eBook_Ultimate-Guide-to-Building-Applications-with-FlowFuse-Dashboard-for-Node-RED.png b/nuxt/public/resources/images/eBook_Ultimate-Guide-to-Building-Applications-with-FlowFuse-Dashboard-for-Node-RED.png similarity index 100% rename from src/resources/images/eBook_Ultimate-Guide-to-Building-Applications-with-FlowFuse-Dashboard-for-Node-RED.png rename to nuxt/public/resources/images/eBook_Ultimate-Guide-to-Building-Applications-with-FlowFuse-Dashboard-for-Node-RED.png diff --git a/src/resources/images/ebook_-The-Ultimate-Beginner-Guide-to-a-Professional-Node-RED.png b/nuxt/public/resources/images/ebook_-The-Ultimate-Beginner-Guide-to-a-Professional-Node-RED.png similarity index 100% rename from src/resources/images/ebook_-The-Ultimate-Beginner-Guide-to-a-Professional-Node-RED.png rename to nuxt/public/resources/images/ebook_-The-Ultimate-Beginner-Guide-to-a-Professional-Node-RED.png diff --git a/src/resources/images/whitepaper_uns.png b/nuxt/public/resources/images/whitepaper_uns.png similarity index 100% rename from src/resources/images/whitepaper_uns.png rename to nuxt/public/resources/images/whitepaper_uns.png diff --git a/src/public/safari-pinned-tab.svg b/nuxt/public/safari-pinned-tab.svg similarity index 100% rename from src/public/safari-pinned-tab.svg rename to nuxt/public/safari-pinned-tab.svg diff --git a/src/vs/images/flowfuse-tulip.png b/nuxt/public/vs/images/flowfuse-tulip.png similarity index 100% rename from src/vs/images/flowfuse-tulip.png rename to nuxt/public/vs/images/flowfuse-tulip.png diff --git a/src/vs/images/flowfuse-vs-ignition-hero.png b/nuxt/public/vs/images/flowfuse-vs-ignition-hero.png similarity index 100% rename from src/vs/images/flowfuse-vs-ignition-hero.png rename to nuxt/public/vs/images/flowfuse-vs-ignition-hero.png diff --git a/src/vs/images/flowfuse-vs-litmus-hero.png b/nuxt/public/vs/images/flowfuse-vs-litmus-hero.png similarity index 100% rename from src/vs/images/flowfuse-vs-litmus-hero.png rename to nuxt/public/vs/images/flowfuse-vs-litmus-hero.png diff --git a/src/vs/images/kepware.png b/nuxt/public/vs/images/kepware.png similarity index 100% rename from src/vs/images/kepware.png rename to nuxt/public/vs/images/kepware.png diff --git a/src/webinars/2025/simplifying-opc-ua/opc-ua-webinar-flows.zip b/nuxt/public/webinars/2025/simplifying-opc-ua/opc-ua-webinar-flows.zip similarity index 100% rename from src/webinars/2025/simplifying-opc-ua/opc-ua-webinar-flows.zip rename to nuxt/public/webinars/2025/simplifying-opc-ua/opc-ua-webinar-flows.zip diff --git a/src/whitepaper/images/before-after-ff-uns.png b/nuxt/public/whitepaper/images/before-after-ff-uns.png similarity index 100% rename from src/whitepaper/images/before-after-ff-uns.png rename to nuxt/public/whitepaper/images/before-after-ff-uns.png diff --git a/src/images/solutions/ff-uns.png b/nuxt/public/whitepaper/images/ff-uns.png similarity index 100% rename from src/images/solutions/ff-uns.png rename to nuxt/public/whitepaper/images/ff-uns.png diff --git a/src/whitepaper/images/flowfuse-architecture.svg b/nuxt/public/whitepaper/images/flowfuse-architecture.svg similarity index 100% rename from src/whitepaper/images/flowfuse-architecture.svg rename to nuxt/public/whitepaper/images/flowfuse-architecture.svg diff --git a/src/whitepaper/images/node-red-manufacturing-architecture.png b/nuxt/public/whitepaper/images/node-red-manufacturing-architecture.png similarity index 100% rename from src/whitepaper/images/node-red-manufacturing-architecture.png rename to nuxt/public/whitepaper/images/node-red-manufacturing-architecture.png diff --git a/src/whitepaper/images/open-source-world.png b/nuxt/public/whitepaper/images/open-source-world.png similarity index 100% rename from src/whitepaper/images/open-source-world.png rename to nuxt/public/whitepaper/images/open-source-world.png diff --git a/src/whitepaper/images/oss-risks-remedies.png b/nuxt/public/whitepaper/images/oss-risks-remedies.png similarity index 100% rename from src/whitepaper/images/oss-risks-remedies.png rename to nuxt/public/whitepaper/images/oss-risks-remedies.png diff --git a/src/whitepaper/images/oss.png b/nuxt/public/whitepaper/images/oss.png similarity index 100% rename from src/whitepaper/images/oss.png rename to nuxt/public/whitepaper/images/oss.png diff --git a/src/whitepaper/images/topic-architecture.png b/nuxt/public/whitepaper/images/topic-architecture.png similarity index 100% rename from src/whitepaper/images/topic-architecture.png rename to nuxt/public/whitepaper/images/topic-architecture.png diff --git a/src/whitepaper/images/uns.png b/nuxt/public/whitepaper/images/uns.png similarity index 100% rename from src/whitepaper/images/uns.png rename to nuxt/public/whitepaper/images/uns.png diff --git a/src/whitepaper/images/uns.svg b/nuxt/public/whitepaper/images/uns.svg similarity index 100% rename from src/whitepaper/images/uns.svg rename to nuxt/public/whitepaper/images/uns.svg diff --git a/src/whitepaper/images/whitepaper-manufacturing.png b/nuxt/public/whitepaper/images/whitepaper-manufacturing.png similarity index 100% rename from src/whitepaper/images/whitepaper-manufacturing.png rename to nuxt/public/whitepaper/images/whitepaper-manufacturing.png diff --git a/src/whitepaper/images/whitepaper-oss-manufacturing.jpg b/nuxt/public/whitepaper/images/whitepaper-oss-manufacturing.jpg similarity index 100% rename from src/whitepaper/images/whitepaper-oss-manufacturing.jpg rename to nuxt/public/whitepaper/images/whitepaper-oss-manufacturing.jpg diff --git a/nuxt/redirects.ts b/nuxt/redirects.ts index fbecdbeff4..522fa3ef66 100644 --- a/nuxt/redirects.ts +++ b/nuxt/redirects.ts @@ -99,6 +99,10 @@ export const redirects: Record<string, NitroRouteRules> = { '/solutions/uns/': { redirect: { to: '/use-cases/uns/', statusCode: 301 } }, '/certified-nodes/': { redirect: { to: '/integrations/?certified=1', statusCode: 301 } }, '/certified-nodes/**': { redirect: { to: '/integrations/?certified=1', statusCode: 301 } }, + // 11ty copied every `images/` directory under src/ to the output, including the one in + // its template tree, so these industry illustrations were also served from this path. + // The same files are at /images/industries/. + '/_includes/images/industries/**': { redirect: { to: '/images/industries/**', statusCode: 301 } }, '/docs/install/local/': { redirect: { to: '/docs/install/introduction/', statusCode: 301 } }, '/docs/install/email_providers/': { redirect: { to: '/docs/install/email-providers/', statusCode: 301 } }, '/docs/admin/user_management/': { redirect: { to: '/docs/admin/user-management/', statusCode: 301 } }, diff --git a/nuxt/server/api/__sitemap__/content-urls.get.ts b/nuxt/server/api/__sitemap__/content-urls.get.ts index f32d343235..a41efd99a7 100644 --- a/nuxt/server/api/__sitemap__/content-urls.get.ts +++ b/nuxt/server/api/__sitemap__/content-urls.get.ts @@ -65,20 +65,20 @@ const CONTENT_SOURCES: ContentSource[] = [ lastmod: entry => stringField(entry, 'updated'), images: entry => [stringField(entry, 'image')].filter((path): path is string => Boolean(path)), }, - { collection: 'changelog', fileRoot: 'src' }, + { collection: 'changelog', fileRoot: 'nuxt/content' }, { collection: 'blog', - fileRoot: 'src', + fileRoot: 'nuxt/content', // Prefer the author-set `lastUpdated` frontmatter field - the same one the blog // page itself uses for its "Updated" date and JSON-LD dateModified - over the git // history date, so an editorial update date isn't silently overridden by whatever // last touched the file (a repo-wide lint fix, a typo pass elsewhere, etc). - lastmod: entry => stringField(entry, 'lastUpdated') ?? getGitLastmod(REPO_ROOT, `src/${entry.stem}.md`), + lastmod: entry => stringField(entry, 'lastUpdated') ?? getGitLastmod(REPO_ROOT, `nuxt/content/${entry.stem}.md`), images: entry => [stringField(entry, 'image')].filter((path): path is string => Boolean(path)), }, { collection: 'stories', - fileRoot: 'src', + fileRoot: 'nuxt/content', images: entry => [stringField(entry, 'image')].filter((path): path is string => Boolean(path)), }, { diff --git a/src/_includes/analytics/body.html b/nuxt/server/assets/analytics/body.html similarity index 100% rename from src/_includes/analytics/body.html rename to nuxt/server/assets/analytics/body.html diff --git a/src/_includes/analytics/head.html b/nuxt/server/assets/analytics/head.html similarity index 100% rename from src/_includes/analytics/head.html rename to nuxt/server/assets/analytics/head.html diff --git a/nuxt/server/middleware/legacy.ts b/nuxt/server/middleware/legacy.ts deleted file mode 100644 index dc8ccb13e3..0000000000 --- a/nuxt/server/middleware/legacy.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { defineEventHandler, proxyRequest } from 'h3' - -// Routes that are handled by Nuxt pages (not proxied to 11ty). -// Extend this list as pages are migrated. Trailing slashes are matched automatically. -// Note: /sitemap-legacy.xml is deliberately NOT listed here — it only exists in -// nuxt/public/ after a production build, so in dev it must keep proxying to 11ty's _site/. -const NUXT_ROUTES = new Set(['/', '/about', '/ai', '/terms', '/privacy-policy', '/integrations', '/sitemap.xml', '/robots.txt', '/llms.txt', '/llms-full.txt', '/contact-us', '/book-demo', '/support', '/professional-services', '/dashboard/tags-and-canvas-feedback']) - -// Path prefixes handled by Nuxt. Used for dynamic routes like /integrations/{id}. -const NUXT_ROUTE_PREFIXES = ['/integrations/', '/raw/'] - -// Route prefixes handled by Nuxt (all paths starting with these are served by Nuxt). -// /application-guide and /free-consultation no longer have pages of their own (the guides -// moved under /docs, /free-consultation was retired outright - it had no internal links -// left once its one referring blog post pointed at /contact-us/ instead) - but they stay -// listed so their 301s in nuxt/redirects.ts are served by Nitro in dev rather than being -// proxied to 11ty, which has nothing there either. -const NUXT_PREFIXES = ['/handbook', '/ebooks', '/whitepaper', '/pricing', '/docs', '/changelog', '/application-guide', '/blog', '/product', '/customer-stories', '/thank-you', '/resources', '/webinars', '/free-consultation', '/vs', '/landing', '/use-cases', '/partners', '/industries', '/blueprints', '/events', '/platform', '/node-red'] - -// Top-level routes still on 11ty, not yet ported to Nuxt (everything not listed above -// already falls through to the 11ty proxy by default). Remove entries here as they migrate: -// /careers, /community, /events, /free-consultation, /platform, /webinars - -// New pages should never grow that fallback set: nuxt/lib/legacy-pages.test.mjs fails -// `npm test` if a PR adds a new .njk file under src/ that doesn't already exist on main, -// regardless of which route it's under — so there's nothing to keep in sync with the -// list above, it's informational only. - -export default defineEventHandler(async (event) => { - if (process.env.NODE_ENV !== 'development') return - - const path = event.path ?? '/' - - // Let Nuxt handle its own internal assets and API routes - if (path.startsWith('/_nuxt/') || path.startsWith('/api/') || path.startsWith('/__') || path.startsWith('/_studio') || path.startsWith('/_og/')) return - - // Let Nuxt handle migrated pages (strip trailing slash and query string before matching) - const queryIndex = path.indexOf('?') - const pathWithoutQuery = queryIndex === -1 ? path : path.slice(0, queryIndex) - const normalised = pathWithoutQuery.replace(/\/$/, '') || '/' - if (NUXT_ROUTES.has(normalised)) return - if (NUXT_ROUTE_PREFIXES.some(prefix => pathWithoutQuery.startsWith(prefix))) return - - // Changelog and blog post images still live alongside their markdown in src/{changelog,blog}/**/images - // and are only synced into nuxt/public by the 11ty passthrough during a production build - - // proxy them to 11ty in dev even though /changelog and /blog are Nuxt-handled prefixes. - if (/^\/(changelog|blog)\/\d{4}\/\d{2}\/images\//.test(normalised)) return proxyRequest(event, `http://localhost:8080${path}`) - - // Same story for src/resources/images/** (whitepaper/ebook cover images whose files - // still live in the 11ty tree) - /resources is otherwise a Nuxt prefix. - if (normalised.startsWith('/resources/images/')) return proxyRequest(event, `http://localhost:8080${path}`) - -// - // The documentation below /node-red/ moved into /docs/, and every old URL now 301s - // from nuxt/redirects-node-red.ts. Those are Nitro route rules, so the request has to - // reach Nitro in dev rather than being proxied to 11ty, which no longer has the pages. - // /node-red itself is a Nuxt page now, so the whole prefix is listed above and the - // carve-out that used to keep just that path on 11ty is gone. - - // src/vs/images/** are still 11ty-owned files: they only reach nuxt/public/ through the - // passthrough in a production build, so dev has to ask 11ty for them even though /vs is - // a Nuxt prefix now. - if (/^\/vs\/images\//.test(normalised)) { - return proxyRequest(event, `http://localhost:8080${path}`) - } - - // Let Nuxt handle migrated path prefixes - if (NUXT_PREFIXES.some(prefix => normalised === prefix || normalised.startsWith(prefix + '/'))) return - - // Proxy everything else to the 11ty dev server - return proxyRequest(event, `http://localhost:8080${path}`) -}) diff --git a/nuxt/server/routes/blog/index.xml.ts b/nuxt/server/routes/blog/index.xml.ts index 5c33c3a34b..9168f1dc93 100644 --- a/nuxt/server/routes/blog/index.xml.ts +++ b/nuxt/server/routes/blog/index.xml.ts @@ -1,5 +1,5 @@ import { queryCollection } from '@nuxt/content/server' -import site from '../../../../src/_data/site.json' +import site from '../../../data/site.json' // @ts-ignore untyped module import { planBadges } from '../../../lib/feature-catalog.mjs' // @ts-ignore untyped module diff --git a/nuxt/utils/navIcons.ts b/nuxt/utils/navIcons.ts index 9a016d5d77..eb74bccdab 100644 --- a/nuxt/utils/navIcons.ts +++ b/nuxt/utils/navIcons.ts @@ -1,82 +1,81 @@ -// Icon markup for the marketing nav, keyed exactly as src/_data/chrome.json spells it, +// Icon markup for the marketing nav, keyed exactly as nuxt/data/chrome.json spells it, // plus the handful of keys page content asks for by name through <NavIcon>. // -// These are the same files Eleventy's `navoption` shortcode reads, so both -// renderers draw the identical glyph from one source. The imports are listed -// explicitly rather than globbed: an eager glob of the icon directory would -// inline all of it (~137 KB, including large unused art) into the client bundle. +// The imports are listed explicitly rather than globbed: an eager glob of the icon +// directory would inline all of it (~137 KB, including large unused art) into the +// client bundle. // -// Adding a nav entry with a new icon means adding one line here. nuxt/lib/chrome.test.mjs +// Adding a nav entry with a new icon means adding its import and its map entry here. nuxt/lib/chrome.test.mjs // fails if chrome.json names a key this map does not cover, so CI will tell you. -import iAcademicCap from '../../src/_includes/components/icons/academic-cap.svg?raw' -import iAirplane from '../../src/_includes/components/icons/airplane.svg?raw' -import iArrowRight from '../../src/_includes/components/icons/arrow-right.svg?raw' -import iArrowTrendingUp from '../../src/_includes/components/icons/arrow-trending-up.svg?raw' -import iArrowsPointingOut from '../../src/_includes/components/icons/arrows-pointing-out.svg?raw' -import iArrowsRightLeft from '../../src/_includes/components/icons/arrows-right-left.svg?raw' -import iBellAlert from '../../src/_includes/components/icons/bell-alert.svg?raw' -import iBolt from '../../src/_includes/components/icons/bolt.svg?raw' -import iBookOpen from '../../src/_includes/components/icons/book-open.svg?raw' -import iBuildingLibrary from '../../src/_includes/components/icons/building-library.svg?raw' -import iBuildingOffice2 from '../../src/_includes/components/icons/building-office-2.svg?raw' -import iCamera from '../../src/_includes/components/icons/camera.svg?raw' -import iCar from '../../src/_includes/components/icons/car.svg?raw' -import iCase from '../../src/_includes/components/icons/case.svg?raw' -import iCertificate from '../../src/_includes/components/icons/certificate.svg?raw' -import iChart from '../../src/_includes/components/icons/chart.svg?raw' +import iAcademicCap from '../assets/nav-icons/academic-cap.svg?raw' +import iAirplane from '../assets/nav-icons/airplane.svg?raw' +import iArrowRight from '../assets/nav-icons/arrow-right.svg?raw' +import iArrowTrendingUp from '../assets/nav-icons/arrow-trending-up.svg?raw' +import iArrowsPointingOut from '../assets/nav-icons/arrows-pointing-out.svg?raw' +import iArrowsRightLeft from '../assets/nav-icons/arrows-right-left.svg?raw' +import iBellAlert from '../assets/nav-icons/bell-alert.svg?raw' +import iBolt from '../assets/nav-icons/bolt.svg?raw' +import iBookOpen from '../assets/nav-icons/book-open.svg?raw' +import iBuildingLibrary from '../assets/nav-icons/building-library.svg?raw' +import iBuildingOffice2 from '../assets/nav-icons/building-office-2.svg?raw' +import iCamera from '../assets/nav-icons/camera.svg?raw' +import iCar from '../assets/nav-icons/car.svg?raw' +import iCase from '../assets/nav-icons/case.svg?raw' +import iCertificate from '../assets/nav-icons/certificate.svg?raw' +import iChart from '../assets/nav-icons/chart.svg?raw' -import iCloud from '../../src/_includes/components/icons/cloud.svg?raw' -import iLink from '../../src/_includes/components/icons/link.svg?raw' -import iCodeblock from '../../src/_includes/components/icons/codeblock.svg?raw' -import iChat from '../../src/_includes/components/icons/chat.svg?raw' +import iCloud from '../assets/nav-icons/cloud.svg?raw' +import iLink from '../assets/nav-icons/link.svg?raw' +import iCodeblock from '../assets/nav-icons/codeblock.svg?raw' +import iChat from '../assets/nav-icons/chat.svg?raw' -import iCubeTransparent from '../../src/_includes/components/icons/cube-transparent.svg?raw' -import iClipboardDocumentCheck from '../../src/_includes/components/icons/clipboard-document-check.svg?raw' -import iClock from '../../src/_includes/components/icons/clock.svg?raw' -import iComputerDesktop from '../../src/_includes/components/icons/computer-desktop.svg?raw' -import iData from '../../src/_includes/components/icons/data.svg?raw' -import iDatabase from '../../src/_includes/components/icons/database.svg?raw' -import iDocumentCheck from '../../src/_includes/components/icons/document-check.svg?raw' -import iFactory from '../../src/_includes/components/icons/factory.svg?raw' -import iGlobeAlt from '../../src/_includes/components/icons/globe-alt.svg?raw' -import iLock from '../../src/_includes/components/icons/lock.svg?raw' -import iChatBubbleLeftRightSm from '../../src/_includes/components/icons/chat-bubble-left-right-sm.svg?raw' -import iCheckBadge from '../../src/_includes/components/icons/check-badge.svg?raw' -import iChip from '../../src/_includes/components/icons/chip.svg?raw' -import iCircleStack from '../../src/_includes/components/icons/circle-stack.svg?raw' -import iCodeBracket from '../../src/_includes/components/icons/code-bracket.svg?raw' -import iCog from '../../src/_includes/components/icons/cog.svg?raw' -import iCog6Tooth from '../../src/_includes/components/icons/cog-6-tooth.svg?raw' -import iDashboard from '../../src/_includes/components/icons/dashboard.svg?raw' -import iDeviceAgent from '../../src/_includes/components/icons/device-agent.svg?raw' -import iDocumentText from '../../src/_includes/components/icons/document-text.svg?raw' -import iDollar from '../../src/_includes/components/icons/dollar.svg?raw' -import iFlowfuse from '../../src/_includes/components/icons/flowfuse.svg?raw' -import iFoodBeverage from '../../src/_includes/components/icons/food-beverage.svg?raw' -import iGithub from '../../src/_includes/components/icons/github.svg?raw' -import iLifebuoy from '../../src/_includes/components/icons/lifebuoy.svg?raw' -import iLockClosed from '../../src/_includes/components/icons/lock-closed.svg?raw' -import iMail from '../../src/_includes/components/icons/mail.svg?raw' -import iNewspaper from '../../src/_includes/components/icons/newspaper.svg?raw' -import iPower from '../../src/_includes/components/icons/power.svg?raw' -import iPresentation from '../../src/_includes/components/icons/presentation.svg?raw' -import iPulse from '../../src/_includes/components/icons/pulse.svg?raw' -import iPuzzlePiece from '../../src/_includes/components/icons/puzzle-piece.svg?raw' -import iRectangleStack from '../../src/_includes/components/icons/rectangle-stack.svg?raw' -import iRocketLaunch from '../../src/_includes/components/icons/rocket-launch.svg?raw' -import iScreen from '../../src/_includes/components/icons/screen.svg?raw' -import iServerStack from '../../src/_includes/components/icons/server-stack.svg?raw' -import iShare from '../../src/_includes/components/icons/share.svg?raw' -import iShieldCheck from '../../src/_includes/components/icons/shield-check.svg?raw' -import iSparkles from '../../src/_includes/components/icons/sparkles.svg?raw' -import iSquaresPlus from '../../src/_includes/components/icons/squares-plus.svg?raw' -import iStar from '../../src/_includes/components/icons/star.svg?raw' -import iUns from '../../src/_includes/components/icons/uns.svg?raw' -import iUserGroup from '../../src/_includes/components/icons/user-group.svg?raw' -import iWifi from '../../src/_includes/components/icons/wifi.svg?raw' -import iWindTurbine from '../../src/_includes/components/icons/wind-turbine.svg?raw' -import iWrenchScrewdriver from '../../src/_includes/components/icons/wrench-screwdriver.svg?raw' +import iCubeTransparent from '../assets/nav-icons/cube-transparent.svg?raw' +import iClipboardDocumentCheck from '../assets/nav-icons/clipboard-document-check.svg?raw' +import iClock from '../assets/nav-icons/clock.svg?raw' +import iComputerDesktop from '../assets/nav-icons/computer-desktop.svg?raw' +import iData from '../assets/nav-icons/data.svg?raw' +import iDatabase from '../assets/nav-icons/database.svg?raw' +import iDocumentCheck from '../assets/nav-icons/document-check.svg?raw' +import iFactory from '../assets/nav-icons/factory.svg?raw' +import iGlobeAlt from '../assets/nav-icons/globe-alt.svg?raw' +import iLock from '../assets/nav-icons/lock.svg?raw' +import iChatBubbleLeftRightSm from '../assets/nav-icons/chat-bubble-left-right-sm.svg?raw' +import iCheckBadge from '../assets/nav-icons/check-badge.svg?raw' +import iChip from '../assets/nav-icons/chip.svg?raw' +import iCircleStack from '../assets/nav-icons/circle-stack.svg?raw' +import iCodeBracket from '../assets/nav-icons/code-bracket.svg?raw' +import iCog from '../assets/nav-icons/cog.svg?raw' +import iCog6Tooth from '../assets/nav-icons/cog-6-tooth.svg?raw' +import iDashboard from '../assets/nav-icons/dashboard.svg?raw' +import iDeviceAgent from '../assets/nav-icons/device-agent.svg?raw' +import iDocumentText from '../assets/nav-icons/document-text.svg?raw' +import iDollar from '../assets/nav-icons/dollar.svg?raw' +import iFlowfuse from '../assets/nav-icons/flowfuse.svg?raw' +import iFoodBeverage from '../assets/nav-icons/food-beverage.svg?raw' +import iGithub from '../assets/nav-icons/github.svg?raw' +import iLifebuoy from '../assets/nav-icons/lifebuoy.svg?raw' +import iLockClosed from '../assets/nav-icons/lock-closed.svg?raw' +import iMail from '../assets/nav-icons/mail.svg?raw' +import iNewspaper from '../assets/nav-icons/newspaper.svg?raw' +import iPower from '../assets/nav-icons/power.svg?raw' +import iPresentation from '../assets/nav-icons/presentation.svg?raw' +import iPulse from '../assets/nav-icons/pulse.svg?raw' +import iPuzzlePiece from '../assets/nav-icons/puzzle-piece.svg?raw' +import iRectangleStack from '../assets/nav-icons/rectangle-stack.svg?raw' +import iRocketLaunch from '../assets/nav-icons/rocket-launch.svg?raw' +import iScreen from '../assets/nav-icons/screen.svg?raw' +import iServerStack from '../assets/nav-icons/server-stack.svg?raw' +import iShare from '../assets/nav-icons/share.svg?raw' +import iShieldCheck from '../assets/nav-icons/shield-check.svg?raw' +import iSparkles from '../assets/nav-icons/sparkles.svg?raw' +import iSquaresPlus from '../assets/nav-icons/squares-plus.svg?raw' +import iStar from '../assets/nav-icons/star.svg?raw' +import iUns from '../assets/nav-icons/uns.svg?raw' +import iUserGroup from '../assets/nav-icons/user-group.svg?raw' +import iWifi from '../assets/nav-icons/wifi.svg?raw' +import iWindTurbine from '../assets/nav-icons/wind-turbine.svg?raw' +import iWrenchScrewdriver from '../assets/nav-icons/wrench-screwdriver.svg?raw' export const navIcons: Record<string, string> = { 'academic-cap': iAcademicCap, diff --git a/nuxt/utils/remark-handbook-links.ts b/nuxt/utils/remark-handbook-links.ts index 59c62313c0..69f5e523de 100644 --- a/nuxt/utils/remark-handbook-links.ts +++ b/nuxt/utils/remark-handbook-links.ts @@ -18,8 +18,8 @@ function posixResolve(base: string, rel: string): string { return '/' + out.filter(Boolean).join('/') } -// Anchors whose markdown lives outside nuxt/content/ but whose pages are still -// served at a matching, trailing-slash Nuxt route (e.g. /changelog/YYYY/MM/slug/). +// Sections whose pages are served at a trailing-slash route matching the markdown's +// path under nuxt/content/ (e.g. /changelog/YYYY/MM/slug/). const ANCHORS = ['/handbook/', '/changelog/', '/blog/'] // Converts relative image/link URLs in handbook/changelog/blog markdown to absolute paths. diff --git a/package-lock.json b/package-lock.json index 6fa9b63f93..00abd74982 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,26 +12,15 @@ "nuxt" ], "dependencies": { - "@11ty/eleventy-fetch": "^4.0.0", "@flowfuse/flow-renderer": "^0.5.0", "@netlify/blobs": "^10.7.9", "@octokit/auth-app": "^8.3.0", - "@xmldom/xmldom": "^0.8.15", "algoliasearch": "^4.25.3", - "codeowners": "^5.1.1", - "eleventy-plugin-toc": "^1.1.5", "js-yaml": "^4.3.2", - "markdown-it-attrs": "^4.1.6", - "xpath": "^0.0.34" + "markdown-it-attrs": "^4.1.6" }, "devDependencies": { - "@11ty/eleventy": "^3.1.2", - "@11ty/eleventy-img": "^3.1.8", - "@11ty/eleventy-navigation": "^0.3.5", - "@11ty/eleventy-plugin-rss": "^1.2.0", - "@11ty/eleventy-plugin-syntaxhighlight": "^4.2.0", "@flowforge/forge-ui-components": "^0.2.2", - "@kevingimbel/eleventy-plugin-mermaid": "^2.0.0", "@parcel/watcher": "2.5.6", "@resvg/resvg-js": "2.6.2", "@tailwindcss/postcss": "^4.0.0", @@ -40,12 +29,9 @@ "@types/markdown-it-attrs": "^4.1.3", "@types/markdown-it-footnote": "^3.0.4", "chokidar": "^3.6.0", - "concurrently": "^9.0.0", "del-cli": "^5.0.0", "dotenv-cli": "^7.4.4", - "eleventy-plugin-code-clipboard": "git+https://github.com/joepavitt/eleventy-plugin-code-clipboard.git", "esbuild": "0.28.1", - "html-minifier-terser": "^7.2.0", "markdown-it-anchor": "^8.6.7", "markdown-it-footnote": "^3.0.3", "netlify-plugin-cache": "^1.0.3", @@ -58,422 +44,12 @@ "postcss-cli": "^9.0.1", "postcss-minify": "^1.1.0", "rollup": "4.60.3", - "seedrandom": "^3.0.5", "spacetime": "^7.4.7", "tailwindcss": "^4.0.0", "terser": "^5.9.0", "vanilla-cookieconsent": "^3.0.0" } }, - "node_modules/@11ty/dependency-tree": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-4.0.2.tgz", - "integrity": "sha512-RTF6VTZHatYf7fSZBUN3RKwiUeJh5dhWV61gDPrHhQF2/gzruAkYz8yXuvGLx3w3ZBKreGrR+MfYpSVkdbdbLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@11ty/eleventy-utils": "^2.0.1" - } - }, - "node_modules/@11ty/dependency-tree-esm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@11ty/dependency-tree-esm/-/dependency-tree-esm-2.0.4.tgz", - "integrity": "sha512-MYKC0Ac77ILr1HnRJalzKDlb9Z8To3kXQCltx299pUXXUFtJ1RIONtULlknknqW8cLe19DLVgmxVCtjEFm7h0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@11ty/eleventy-utils": "^2.0.7", - "acorn": "^8.15.0", - "dependency-graph": "^1.0.0", - "normalize-path": "^3.0.0" - } - }, - "node_modules/@11ty/eleventy": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-3.1.6.tgz", - "integrity": "sha512-ZlSiR1PLdS2lv7TelBgWAhcvMiLNZkPBlLEb+lh7kGYZ+Mk0bo9qcYgVsewvw9W7Em0RH3wd01h5fAstNDh0zA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@11ty/dependency-tree": "^4.0.2", - "@11ty/dependency-tree-esm": "^2.0.4", - "@11ty/eleventy-dev-server": "^2.0.8", - "@11ty/eleventy-plugin-bundle": "^3.0.7", - "@11ty/eleventy-utils": "^2.0.7", - "@11ty/lodash-custom": "^4.17.21", - "@11ty/posthtml-urls": "^1.0.3", - "@11ty/recursive-copy": "^4.0.4", - "@sindresorhus/slugify": "^2.2.1", - "bcp-47-normalize": "^2.3.0", - "chokidar": "^3.6.0", - "debug": "^4.4.3", - "dependency-graph": "^1.0.0", - "entities": "^6.0.1", - "filesize": "^10.1.6", - "gray-matter": "^4.0.3", - "iso-639-1": "^3.1.5", - "js-yaml": "^4.1.1", - "kleur": "^4.1.5", - "liquidjs": "^10.27.0", - "luxon": "^3.7.2", - "markdown-it": "^14.2.0", - "minimist": "^1.2.8", - "moo": "0.5.2", - "node-retrieve-globals": "^6.0.1", - "nunjucks": "^3.2.4", - "picomatch": "^4.0.4", - "please-upgrade-node": "^3.2.0", - "posthtml": "^0.16.7", - "posthtml-match-helper": "^2.0.3", - "semver": "^7.8.1", - "slugify": "^1.6.9", - "tinyglobby": "^0.2.16" - }, - "bin": { - "eleventy": "cmd.cjs" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" - } - }, - "node_modules/@11ty/eleventy-dev-server": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-dev-server/-/eleventy-dev-server-2.0.8.tgz", - "integrity": "sha512-15oC5M1DQlCaOMUq4limKRYmWiGecDaGwryr7fTE/oM9Ix8siqMvWi+I8VjsfrGr+iViDvWcH/TVI6D12d93mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@11ty/eleventy-utils": "^2.0.1", - "chokidar": "^3.6.0", - "debug": "^4.4.0", - "finalhandler": "^1.3.1", - "mime": "^3.0.0", - "minimist": "^1.2.8", - "morphdom": "^2.7.4", - "please-upgrade-node": "^3.2.0", - "send": "^1.1.0", - "ssri": "^11.0.0", - "urlpattern-polyfill": "^10.0.0", - "ws": "^8.18.1" - }, - "bin": { - "eleventy-dev-server": "cmd.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" - } - }, - "node_modules/@11ty/eleventy-fetch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-4.0.1.tgz", - "integrity": "sha512-yIiLM5ziBmg86i4TlXpBdcIygJHvh/GgPJyAiFOckO9H4y9cQDM8eIcJCUQ4Mum0NEVui/OjhEut2R08xw0vlQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "flat-cache": "^3.0.4", - "node-fetch": "^2.6.7", - "p-queue": "^6.6.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" - } - }, - "node_modules/@11ty/eleventy-img": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-img/-/eleventy-img-3.1.8.tgz", - "integrity": "sha512-9xVqbykggQAHTSiZEo6nUayS8l8nkM7RU8dCjGzikCc8FXSW/E17ytq7SaDngo24D3LZdD+3Gheh4zSeidrImA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@11ty/eleventy-fetch": "^4.0.0", - "brotli-size": "^4.0.0", - "debug": "^4.3.4", - "entities": "^4.5.0", - "image-size": "^1.0.2", - "p-queue": "^6.6.2", - "sharp": "^0.32.6" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" - } - }, - "node_modules/@11ty/eleventy-img/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@11ty/eleventy-img/node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@11ty/eleventy-img/node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@11ty/eleventy-img/node_modules/tar-fs": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.3.tgz", - "integrity": "sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/@11ty/eleventy-navigation": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-navigation/-/eleventy-navigation-0.3.5.tgz", - "integrity": "sha512-4aKW5aIQDFed8xs1G1pWcEiFPcDSwZtA4IH1eERtoJ+Xy+/fsoe0pzbDmw84bHZ9ACny5jblENhfZhcCxklqQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dependency-graph": "^0.11.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" - } - }, - "node_modules/@11ty/eleventy-navigation/node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/@11ty/eleventy-plugin-bundle": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-3.0.7.tgz", - "integrity": "sha512-QK1tRFBhQdZASnYU8GMzpTdsMMFLVAkuU0gVVILqNyp09xJJZb81kAS3AFrNrwBCsgLxTdWHJ8N64+OTTsoKkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@11ty/eleventy-utils": "^2.0.2", - "debug": "^4.4.0", - "posthtml-match-helper": "^2.0.3" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" - } - }, - "node_modules/@11ty/eleventy-plugin-rss": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-rss/-/eleventy-plugin-rss-1.2.0.tgz", - "integrity": "sha512-YzFnSH/5pObcFnqZ2sAQ782WmpOZHj1+xB9ydY/0j7BZ2jUNahn53VmwCB/sBRwXA/Fbwwj90q1MLo01Ru0UaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "posthtml": "^0.16.6", - "posthtml-urls": "1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" - } - }, - "node_modules/@11ty/eleventy-plugin-syntaxhighlight": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-syntaxhighlight/-/eleventy-plugin-syntaxhighlight-4.2.0.tgz", - "integrity": "sha512-Hf/26vyLvkAM1RCCoSNRHhWWhTOiBxJj4RMaerPXgWEGN9NEio2Xo7lCV527A/dCJN96gIWzjfHqTIk396zf6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "linkedom": "^0.14.19", - "prismjs": "^1.29.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" - } - }, - "node_modules/@11ty/eleventy-utils": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-2.0.7.tgz", - "integrity": "sha512-6QE+duqSQ0GY9rENXYb4iPR4AYGdrFpqnmi59tFp9VrleOl0QSh8VlBr2yd6dlhkdtj7904poZW5PvGr9cMiJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" - } - }, - "node_modules/@11ty/eleventy/node_modules/linkify-it": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", - "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/@11ty/eleventy/node_modules/markdown-it": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", - "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.5.0", - "linkify-it": "^5.0.2", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/@11ty/eleventy/node_modules/markdown-it/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@11ty/eleventy/node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@11ty/lodash-custom": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@11ty/lodash-custom/-/lodash-custom-4.17.21.tgz", - "integrity": "sha512-Mqt6im1xpb1Ykn3nbcCovWXK3ggywRJa+IXIdoz4wIIK+cvozADH63lexcuPpGS/gJ6/m2JxyyXDyupkMr5DHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" - } - }, - "node_modules/@11ty/posthtml-urls": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@11ty/posthtml-urls/-/posthtml-urls-1.0.3.tgz", - "integrity": "sha512-1YvhnkaNlFnnJic1rBMWmTC2adbuy+JQiBfl1Hecr1Wjjik1pQZmGyk/eC9zKX/FQv52s2Nht1Gi/UwhYqrBeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "evaluate-value": "^2.0.0", - "http-equiv-refresh": "^2.0.1", - "list-to-array": "^1.1.0", - "parse-srcset": "^1.0.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@11ty/recursive-copy": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@11ty/recursive-copy/-/recursive-copy-4.0.4.tgz", - "integrity": "sha512-oI7m8pa7/IAU/3lqRU9vjBbs20iKFo7x+1K9kT3aVira6scc1X9MjBdgLCHzLJeJ7iB6wydioA+kr9/qPnvmlQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "errno": "^1.0.0", - "junk": "^3.1.0", - "minimatch": "^3.1.5", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@ai-sdk/gateway": { "version": "3.0.194", "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.194.tgz", @@ -1336,6 +912,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1347,6 +924,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1357,6 +935,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1383,6 +962,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1399,6 +979,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1415,6 +996,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1431,6 +1013,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1447,6 +1030,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1463,6 +1047,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1479,6 +1064,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1495,6 +1081,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1511,6 +1098,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1527,6 +1115,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1543,6 +1132,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1559,6 +1149,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1575,6 +1166,7 @@ "cpu": [ "mips64el" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1591,6 +1183,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1607,6 +1200,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1623,6 +1217,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1639,6 +1234,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1655,6 +1251,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1671,6 +1268,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1687,6 +1285,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1703,6 +1302,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1719,6 +1319,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1735,6 +1336,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1751,6 +1353,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1767,6 +1370,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1783,6 +1387,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2135,9 +1740,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2155,9 +1757,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2175,9 +1774,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2195,9 +1791,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2215,9 +1808,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2235,9 +1825,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2255,9 +1842,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2275,9 +1859,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2295,9 +1876,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -2321,9 +1899,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -2347,9 +1922,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -2373,9 +1945,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -2399,9 +1968,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -2425,9 +1991,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -2451,9 +2014,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -2477,9 +2037,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -2827,16 +2384,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@kevingimbel/eleventy-plugin-mermaid": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@kevingimbel/eleventy-plugin-mermaid/-/eleventy-plugin-mermaid-2.2.1.tgz", - "integrity": "sha512-aVza2Z4Mmba214Qj/BIwkpVYC6tio1QP3G+3T1FO1k1Ui/KOOIrUEVE7Gy1StCQVlGnDa5KqHgVGMsvGj3+xWQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "htmlencode": "^0.0.4" - } - }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", @@ -2889,6 +2436,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.3.tgz", "integrity": "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -3040,6 +2588,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -3053,6 +2602,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -3062,6 +2612,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -4676,9 +4227,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4696,9 +4244,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4716,9 +4261,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4736,9 +4278,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4756,9 +4295,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4776,9 +4312,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4796,9 +4329,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4816,9 +4346,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4922,6 +4449,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4938,6 +4466,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4954,6 +4483,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4970,6 +4500,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4986,6 +4517,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5002,6 +4534,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5018,6 +4551,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5034,9 +4568,7 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5053,9 +4585,7 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5072,9 +4602,7 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5091,9 +4619,7 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5110,9 +4636,7 @@ "cpu": [ "riscv64" ], - "libc": [ - "musl" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5129,9 +4653,7 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5148,9 +4670,7 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5167,9 +4687,7 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5186,6 +4704,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5202,6 +4721,7 @@ "cpu": [ "wasm32" ], + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -5220,6 +4740,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5236,6 +4757,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5252,6 +4774,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5398,9 +4921,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5418,9 +4938,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -5438,9 +4955,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5458,9 +4972,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5478,9 +4989,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -5498,9 +5006,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5518,9 +5023,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5538,9 +5040,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -5765,9 +5264,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5789,9 +5285,6 @@ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -5813,9 +5306,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5837,9 +5327,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -5861,9 +5348,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5885,9 +5369,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -6175,9 +5656,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -6194,9 +5672,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -6213,9 +5688,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -6232,9 +5704,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -6379,9 +5848,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -6398,9 +5864,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -6417,9 +5880,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -6436,9 +5896,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -6455,9 +5912,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -6474,9 +5928,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -6730,6 +6181,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6743,6 +6195,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6756,6 +6209,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6769,6 +6223,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6782,6 +6237,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6795,6 +6251,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6808,9 +6265,7 @@ "cpu": [ "arm" ], - "libc": [ - "glibc" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6824,9 +6279,7 @@ "cpu": [ "arm" ], - "libc": [ - "musl" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6840,9 +6293,7 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6856,9 +6307,7 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6872,9 +6321,7 @@ "cpu": [ "loong64" ], - "libc": [ - "glibc" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6888,9 +6335,7 @@ "cpu": [ "loong64" ], - "libc": [ - "musl" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6904,9 +6349,7 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6920,9 +6363,7 @@ "cpu": [ "ppc64" ], - "libc": [ - "musl" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6936,9 +6377,7 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6952,9 +6391,7 @@ "cpu": [ "riscv64" ], - "libc": [ - "musl" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6968,9 +6405,7 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6984,9 +6419,7 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7000,9 +6433,7 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7016,6 +6447,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7029,6 +6461,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7042,6 +6475,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7055,6 +6489,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7068,6 +6503,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7081,6 +6517,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7268,39 +6705,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@sindresorhus/slugify": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", - "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/transliterate": "^1.0.0", - "escape-string-regexp": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sindresorhus/transliterate": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz", - "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", @@ -7478,9 +6882,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -7498,9 +6899,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -7518,9 +6916,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -7538,9 +6933,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -7783,9 +7175,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "(MIT OR Apache-2.0)", "optional": true, "os": [ @@ -7802,9 +7191,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "(MIT OR Apache-2.0)", "optional": true, "os": [ @@ -7821,9 +7207,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "(MIT OR Apache-2.0)", "optional": true, "os": [ @@ -7840,9 +7223,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "(MIT OR Apache-2.0)", "optional": true, "os": [ @@ -8587,6 +7967,7 @@ "version": "0.10.3", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -9699,22 +9080,6 @@ "node": ">=18.0.0" } }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.15.tgz", - "integrity": "sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/a-sync-waterfall": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", - "dev": true, - "license": "MIT" - }, "node_modules/abbrev": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", @@ -9760,19 +9125,6 @@ "acorn": "^8" } }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -9884,13 +9236,6 @@ "node": ">=14" } }, - "node_modules/any-promise": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", - "integrity": "sha512-lqzY9o+BbeGHRCOyxQkt/Tgvz0IZhTmQiA+LxQW8wSNpcTbj8K+0cZiSEvbpNZZP9/11Gy7dnLO3GNWUXO4d1g==", - "dev": true, - "license": "MIT" - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -10094,13 +9439,6 @@ "node": ">=0.10.0" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "license": "MIT" - }, "node_modules/ast-kit": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", @@ -10249,6 +9587,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, "node_modules/bare-events": { @@ -10370,48 +9709,6 @@ "node": ">=6.0.0" } }, - "node_modules/bcp-47": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.1.tgz", - "integrity": "sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/bcp-47-match": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", - "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/bcp-47-normalize": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-2.3.0.tgz", - "integrity": "sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "bcp-47": "^2.0.0", - "bcp-47-match": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/better-sqlite3": { "version": "12.11.1", "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.11.1.tgz", @@ -10516,12 +9813,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, "license": "ISC" }, "node_modules/brace-expansion": { "version": "1.1.18", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -10541,19 +9840,6 @@ "node": ">=8" } }, - "node_modules/brotli-size": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/brotli-size/-/brotli-size-4.0.0.tgz", - "integrity": "sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer": "0.1.1" - }, - "engines": { - "node": ">= 10.16.0" - } - }, "node_modules/browserslist": { "version": "4.28.8", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", @@ -10770,17 +10056,6 @@ "node": "*" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -10878,36 +10153,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -10961,60 +10206,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/cheerio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", - "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.1.0", - "parse5": "^7.3.0", - "parse5-htmlparser2-tree-adapter": "^7.1.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^7.19.0", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=20.18.1" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio/node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -11095,19 +10286,6 @@ "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", "license": "MIT" }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, "node_modules/clean-git-ref": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", @@ -11136,64 +10314,24 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz", - "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==", - "devOptional": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/codeowners": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/codeowners/-/codeowners-5.1.1.tgz", - "integrity": "sha512-NKsnAQQBhdsfkm7xZb073MTlzfz9kmE9iyjIcsfU9kZMPq2E7e+O42HD+yFTIu3f1CwvnBsSFdSLjv5k6CRIZg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.walk": "^1.2.6", - "commander": "^6.2.1", - "find-up": "^2.1.0", - "ignore": "^3.3.10", - "is-directory": "^0.3.1", - "lodash.intersection": "^4.4.0", - "lodash.maxby": "^4.6.0", - "lodash.padend": "^4.6.1", - "true-case-path": "^1.0.3" - }, - "bin": { - "codeowners": "index.js" - } - }, - "node_modules/codeowners/node_modules/ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "license": "MIT" - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=12.5.0" + "node": ">=12" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz", + "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" } }, "node_modules/color-convert": { @@ -11215,17 +10353,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "node_modules/colortranslator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/colortranslator/-/colortranslator-5.0.0.tgz", @@ -11383,7 +10510,10 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 6" } @@ -11436,32 +10566,8 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/concurrently": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.4.tgz", - "integrity": "sha512-TZ0CEhyzvFjgtAvHTusDMgj7wNdihCh7LLLrzdUOXIhdlnL2JBBGA9eJxR24rtqgmdjh3OA3hrN1rCHj6HM8qA==", "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "4.1.2", - "rxjs": "7.8.2", - "shell-quote": "1.9.0", - "supports-color": "8.1.1", - "tree-kill": "1.2.2", - "yargs": "17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } + "license": "MIT" }, "node_modules/confbox": { "version": "0.2.4", @@ -11621,22 +10727,6 @@ "node": ">=16" } }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/css-to-react-native": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", @@ -11662,18 +10752,6 @@ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -11809,13 +10887,6 @@ "dev": true, "license": "CC0-1.0" }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true, - "license": "MIT" - }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -12649,16 +11720,6 @@ "node": ">= 0.8" } }, - "node_modules/dependency-graph": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -12755,6 +11816,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -12769,6 +11831,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -12781,6 +11844,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, "funding": [ { "type": "github", @@ -12793,6 +11857,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -12817,6 +11882,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -12827,17 +11893,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/dot-prop": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", @@ -12919,12 +11974,6 @@ "node": ">= 0.4" } }, - "node_modules/duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==", - "dev": true - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -12946,24 +11995,6 @@ "dev": true, "license": "ISC" }, - "node_modules/eleventy-plugin-code-clipboard": { - "version": "0.1.1", - "resolved": "git+ssh://git@github.com/joepavitt/eleventy-plugin-code-clipboard.git#76903af62557a2e050edf1710a7fde24040795db", - "dev": true, - "license": "MIT", - "dependencies": { - "uglify-js": "^3.14.5" - } - }, - "node_modules/eleventy-plugin-toc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/eleventy-plugin-toc/-/eleventy-plugin-toc-1.1.5.tgz", - "integrity": "sha512-Fo5AZZSBH8CKvz0axJQA9nmnTFOflAMFrngaKER4rOz3C6oDwqxK8N+kNFepmIsieTPkrH+iREWLJ+/9j5JjUg==", - "license": "ISC", - "dependencies": { - "cheerio": "^1.0.0-rc.10" - } - }, "node_modules/embla-carousel": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", @@ -13114,19 +12145,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } - }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -13199,19 +12217,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/errno": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/errno/-/errno-1.0.0.tgz", - "integrity": "sha512-3zV5mFS1E8/1bPxt/B0xxzI1snsg3uSCIh6Zo1qKg6iMw93hzPANk9oBFzSFBFrwuVoQuE3rLoouAUfwOAj1wQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -13359,30 +12364,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esm-import-transformer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/esm-import-transformer/-/esm-import-transformer-3.0.5.tgz", - "integrity": "sha512-1GKLvfuMnnpI75l8c6sHoz0L3Z872xL5akGuBudgqTDPv4Vy6f2Ec7jEMKTxlqWl/3kSvNbHELeimJtnqgYniw==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.15.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -13400,16 +12381,6 @@ "node": ">= 0.6" } }, - "node_modules/evaluate-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/evaluate-value/-/evaluate-value-2.0.0.tgz", - "integrity": "sha512-VonfiuDJc0z4sOO7W0Pd130VLsXN6vmBWZlrog1mCb/o7o/Nl5Lr25+Kj/nkCCAhG+zqeeGjxhkK9oHpkgTHhQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -13420,12 +12391,6 @@ "node": ">=6" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -13502,19 +12467,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fast-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", @@ -13627,6 +12579,7 @@ "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -13662,16 +12615,6 @@ "devOptional": true, "license": "MIT" }, - "node_modules/filesize": { - "version": "10.1.6", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", - "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 10.4.0" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -13685,54 +12628,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/flat": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/flat/-/flat-6.0.1.tgz", @@ -13746,26 +12641,6 @@ "node": ">=18" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", - "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", - "license": "ISC" - }, "node_modules/flowfuse-website-nuxt": { "resolved": "nuxt", "link": true @@ -13969,6 +12844,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, "license": "ISC" }, "node_modules/fsevents": { @@ -14324,46 +13200,6 @@ "dev": true, "license": "ISC" }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz", - "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/gzip-size": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz", @@ -14420,16 +13256,6 @@ "node": ">=6" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -14915,58 +13741,6 @@ "node": ">=10" } }, - "node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/html-minifier-terser/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/html-void-elements": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", @@ -14989,17 +13763,11 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/htmlencode": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/htmlencode/-/htmlencode-0.0.4.tgz", - "integrity": "sha512-0uDvNVpzj/E2TfvLLyyXhKBRvF1y84aZsyRxRXFsQobnHaL4pcaXk+Y9cnFlvnxrBLeXDNq/VJBD+ngdBgQG1w==", - "dev": true, - "license": "MIT" - }, "node_modules/htmlparser2": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -15019,22 +13787,13 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-equiv-refresh": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-equiv-refresh/-/http-equiv-refresh-2.0.1.tgz", - "integrity": "sha512-XJpDL/MLkV3dKwLzHwr2dY05dYNfBNlyPu4STQ8WvKCFdc6vC5tPXuq28of663+gHVg03C+16pHHs/+FmmDjcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http-errors": { @@ -15156,22 +13915,6 @@ "dev": true, "license": "MIT" }, - "node_modules/image-size": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", - "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", - "dev": true, - "license": "MIT", - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, "node_modules/import-in-the-middle": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-3.3.3.tgz", @@ -15228,6 +13971,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -15238,6 +13982,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "devOptional": true, "license": "ISC" }, "node_modules/ini": { @@ -15396,9 +14141,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -15416,9 +14158,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -15436,9 +14175,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -15456,9 +14192,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -15476,9 +14209,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -15496,9 +14226,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -15516,9 +14243,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -15536,9 +14260,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -15556,9 +14277,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -15582,9 +14300,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -15608,9 +14323,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -15634,9 +14346,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -15660,9 +14369,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -15686,9 +14392,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -15712,9 +14415,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -15738,9 +14438,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -15975,15 +14672,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -16000,16 +14688,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -16119,13 +14797,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-json": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", - "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", - "dev": true, - "license": "ISC" - }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -16277,16 +14948,6 @@ "dev": true, "license": "ISC" }, - "node_modules/iso-639-1": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-3.1.6.tgz", - "integrity": "sha512-ZFar/L4ngX7wZh2QX+Fiftmuf0igWJsrJtfizrovWifF1gAWkfmRa5Z1m0LQZbm0hKCHRDYhLRSLFrSqNe4EJA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, "node_modules/isomorphic-git": { "version": "1.41.3", "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.41.3.tgz", @@ -16417,12 +15078,6 @@ "node": ">=6" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", @@ -16483,16 +15138,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/junk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", - "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/katex": { "version": "0.16.47", "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", @@ -16518,15 +15163,6 @@ "node": ">= 12" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/khroma": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", @@ -16823,9 +15459,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -16847,9 +15480,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -16871,9 +15501,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -16895,9 +15522,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -16992,53 +15616,6 @@ "dev": true, "license": "MIT" }, - "node_modules/linkedom": { - "version": "0.14.26", - "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.14.26.tgz", - "integrity": "sha512-mK6TrydfFA7phrnp+1j57ycBwFI5bGSW6YXlw9acHoqF+mP/y+FooEYYyniOt5Ot57FSKB3iwmnuQ1UUyNLm5A==", - "dev": true, - "license": "ISC", - "dependencies": { - "css-select": "^5.1.0", - "cssom": "^0.5.0", - "html-escaper": "^3.0.3", - "htmlparser2": "^8.0.1", - "uhyphen": "^0.2.0" - } - }, - "node_modules/linkedom/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/linkedom/node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, "node_modules/linkify-it": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-6.1.0.tgz", @@ -17066,44 +15643,6 @@ "dev": true, "license": "MIT" }, - "node_modules/liquidjs": { - "version": "10.29.0", - "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.29.0.tgz", - "integrity": "sha512-pCVOhs6FLAR8su3ItJ07diN26t6W5dHQRnmTMy8HPyTFuv1+oSCVJIGp5pGjfQyOZfh50KswvKtMTp6p4JEIdw==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^10.0.0" - }, - "bin": { - "liquid": "bin/liquid.js", - "liquidjs": "bin/liquid.js" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/liquidjs" - } - }, - "node_modules/liquidjs/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/list-to-array": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/list-to-array/-/list-to-array-1.1.0.tgz", - "integrity": "sha512-+dAZZ2mM+/m+vY9ezfoueVvrgnHIGi5FvgSymbIgJOFwiznWyA59mav95L+Mc6xPtL3s9gm5eNTlNtxJLbNM1g==", - "dev": true, - "license": "MIT" - }, "node_modules/listhen": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.10.1.tgz", @@ -17184,19 +15723,6 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/lodash": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", @@ -17210,24 +15736,6 @@ "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "license": "MIT" }, - "node_modules/lodash.intersection": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.intersection/-/lodash.intersection-4.4.0.tgz", - "integrity": "sha512-N+L0cCfnqMv6mxXtSPeKt+IavbOBBSiAEkKyLasZ8BVcP9YXQgxLO12oPR8OyURwKV8l5vJKiE1M8aS70heuMg==", - "license": "MIT" - }, - "node_modules/lodash.maxby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.maxby/-/lodash.maxby-4.6.0.tgz", - "integrity": "sha512-QfTqQTwzmKxLy7VZlbx2M/ipWv8DCQ2F5BI/MRxLharOQ5V78yMSuB+JE+EuUM22txYfj09R2Q7hUlEYj7KdNg==", - "license": "MIT" - }, - "node_modules/lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", - "license": "MIT" - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -17238,16 +15746,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -17261,16 +15759,6 @@ "node": ">=10" } }, - "node_modules/luxon": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/magic-regexp": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/magic-regexp/-/magic-regexp-0.10.0.tgz", @@ -18522,19 +17010,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -18599,6 +17074,7 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -18714,20 +17190,6 @@ "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", "license": "MIT" }, - "node_modules/moo": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/morphdom": { - "version": "2.7.8", - "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.8.tgz", - "integrity": "sha512-D/fR4xgGUyVRbdMGU6Nejea1RFzYxYtyurG4Fbv2Fi/daKlWKuXGLOdXtl+3eIwL110cI2hz1ZojGICjjFLgTg==", - "dev": true, - "license": "MIT" - }, "node_modules/motion-dom": { "version": "12.43.0", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.43.0.tgz", @@ -19060,17 +17522,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/node-abi": { "version": "3.94.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.94.0.tgz", @@ -19111,6 +17562,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -19171,18 +17623,6 @@ "node": ">=18" } }, - "node_modules/node-retrieve-globals": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-6.0.1.tgz", - "integrity": "sha512-j0DeFuZ/Wg3VlklfbxUgZF/mdHMTEiEipBb3q0SpMMbHaV3AVfoUQF8UGxh1s/yjqO0TgRZd4Pi/x2yRqoQ4Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.14.1", - "acorn-walk": "^8.3.4", - "esm-import-transformer": "^3.0.3" - } - }, "node_modules/nodemon": { "version": "2.0.22", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", @@ -19437,6 +17877,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" @@ -19445,42 +17886,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nunjucks": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", - "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" - }, - "bin": { - "nunjucks-precompile": "bin/precompile" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "chokidar": "^3.3.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/nunjucks/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/nuxt": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-4.5.2.tgz", @@ -19940,9 +18345,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -19964,9 +18366,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -19988,9 +18387,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -20012,9 +18408,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -20259,9 +18652,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -20279,9 +18669,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -20299,9 +18686,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -20319,9 +18703,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -20339,9 +18720,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -20359,9 +18737,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -20379,9 +18754,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -20399,9 +18771,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -20419,9 +18788,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -20445,9 +18811,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -20471,9 +18834,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -20497,9 +18857,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -20523,9 +18880,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -20549,9 +18903,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -20575,9 +18926,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -20601,9 +18949,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -21166,6 +19511,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "devOptional": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -21361,41 +19707,8 @@ "optional": true }, "rolldown": { - "optional": true - } - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" + "optional": true + } } }, "node_modules/p-map": { @@ -21414,43 +19727,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -21471,17 +19747,6 @@ "dev": true, "license": "(MIT AND Zlib)" }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/parse-css-color": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/parse-css-color/-/parse-css-color-0.2.1.tgz", @@ -21597,55 +19862,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-parser-stream/node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/parse5/node_modules/entities": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", @@ -21669,17 +19885,6 @@ "node": ">= 0.8" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -21693,15 +19898,6 @@ "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", "license": "MIT" }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/path-expression-matcher": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", @@ -21722,6 +19918,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -21845,16 +20042,6 @@ "pathe": "^2.0.3" } }, - "node_modules/please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver-compare": "^1.0.0" - } - }, "node_modules/points-on-curve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", @@ -22512,266 +20699,98 @@ }, "node_modules/postcss-reporter": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", - "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "thenby": "^1.3.4" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-8.0.4.tgz", - "integrity": "sha512-cmxRK3zz5BLFO/r/crOHy4QosyNCHpyAG9fOjtOSAEKkajcAK5xyURRWcotPOXcz88VbzIrYJCWVAGjrX4GeJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^4.0.2" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.26" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-8.0.3.tgz", - "integrity": "sha512-uKwlnCNyKmny7yFPOnQJAN82Er0WzGQbSlpZHTKTqlTQsvZF+skA4ANMHqKh+68jQYet6IotH3dtxs1VdyBdxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.1.5" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.26" - } - }, - "node_modules/postcss-unique-selectors/node_modules/postcss-selector-parser": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", - "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/posthtml": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.7.tgz", - "integrity": "sha512-7Hc+IvlQ7hlaIfQFZnxlRl0jnpWq2qwibORBhQYIb0QbNtuicc5ZxvKkVT71HJ4Py1wSZ/3VR1r8LfkCtoCzhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "posthtml-parser": "^0.11.0", - "posthtml-render": "^3.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/posthtml-match-helper": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/posthtml-match-helper/-/posthtml-match-helper-2.0.3.tgz", - "integrity": "sha512-p9oJgTdMF2dyd7WE54QI1LvpBIkNkbSiiECKezNnDVYhGhD1AaOnAkw0Uh0y5TW+OHO8iBdSqnd8Wkpb6iUqmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "posthtml": "^0.16.6" - } - }, - "node_modules/posthtml-parser": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", - "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "htmlparser2": "^7.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/posthtml-parser/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/posthtml-parser/node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/posthtml-parser/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/posthtml-parser/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/posthtml-parser/node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/posthtml-parser/node_modules/htmlparser2": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", - "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", "dev": true, "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, { "type": "github", - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.2", - "domutils": "^2.8.0", - "entities": "^3.0.1" + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/posthtml-render": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", - "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "license": "MIT", "dependencies": { - "is-json": "^2.0.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/posthtml-urls": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/posthtml-urls/-/posthtml-urls-1.0.0.tgz", - "integrity": "sha512-CMJ0L009sGQVUuYM/g6WJdscsq6ooAwhUuF6CDlYPMLxKp2rmCYVebEU+wZGxnQstGJhZPMvXsRhtqekILd5/w==", + "node_modules/postcss-svgo": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-8.0.4.tgz", + "integrity": "sha512-cmxRK3zz5BLFO/r/crOHy4QosyNCHpyAG9fOjtOSAEKkajcAK5xyURRWcotPOXcz88VbzIrYJCWVAGjrX4GeJw==", "dev": true, "license": "MIT", "dependencies": { - "http-equiv-refresh": "^1.0.0", - "list-to-array": "^1.1.0", - "parse-srcset": "^1.0.2", - "promise-each": "^2.2.0" + "postcss-value-parser": "^4.2.0", + "svgo": "^4.0.2" }, "engines": { - "node": ">= 4" + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" } }, - "node_modules/posthtml-urls/node_modules/http-equiv-refresh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-equiv-refresh/-/http-equiv-refresh-1.0.0.tgz", - "integrity": "sha512-TScO04soylRN9i/QdOdgZyhydXg9z6XdaGzEyOgDKycePeDeTT4KvigjBcI+tgfTlieLWauGORMq5F1eIDa+1w==", + "node_modules/postcss-unique-selectors": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-8.0.3.tgz", + "integrity": "sha512-uKwlnCNyKmny7yFPOnQJAN82Er0WzGQbSlpZHTKTqlTQsvZF+skA4ANMHqKh+68jQYet6IotH3dtxs1VdyBdxw==", "dev": true, "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.1.5" + }, "engines": { - "node": ">= 0.10" + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-unique-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", + "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, "node_modules/powershell-utils": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", @@ -22836,16 +20855,6 @@ "node": ">= 0.8" } }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -22863,16 +20872,6 @@ "dev": true, "license": "MIT" }, - "node_modules/promise-each": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/promise-each/-/promise-each-2.2.0.tgz", - "integrity": "sha512-67roqt1k3QDA41DZ8xi0V+rF3GoaMiX7QilbXu0vXimut+9RcKBNZ/t60xCRgcsihmNUsEjh48xLfNqOrKblUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^0.1.0" - } - }, "node_modules/proper-lockfile": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", @@ -23061,13 +21060,6 @@ "dev": true, "license": "MIT" }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "license": "MIT" - }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -23112,20 +21104,11 @@ ], "license": "MIT" }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.3" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -23695,16 +21678,6 @@ "vue": ">= 3.4.0" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/remark-emoji": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-5.0.2.tgz", @@ -23904,6 +21877,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -23915,6 +21889,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -23931,6 +21906,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -24329,6 +22305,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -24354,16 +22331,6 @@ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", "license": "BSD-3-Clause" }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -24560,27 +22527,6 @@ "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", "license": "MIT" }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", - "dev": true, - "license": "MIT" - }, "node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", @@ -24593,13 +22539,6 @@ "node": ">=10" } }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, - "license": "MIT" - }, "node_modules/send": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", @@ -24903,23 +22842,6 @@ "url": "https://github.com/steveukx/git-js?sponsor=1" } }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "dev": true, - "license": "MIT" - }, "node_modules/simple-update-notifier": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", @@ -25000,16 +22922,6 @@ "node": ">=8" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/slugify": { "version": "1.6.9", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz", @@ -25143,13 +23055,6 @@ "dev": true, "license": "CC0-1.0" }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/srvx": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.12.5.tgz", @@ -25164,19 +23069,6 @@ "node": ">=20.16.0" } }, - "node_modules/ssri": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-11.0.0.tgz", - "integrity": "sha512-aZpUoMN/Jj2MqA4vMCeiKGnc/8SuSyHbGSBdgFbZxP8OJGF/lFkIuElzPxsN0q8TQQ+prw3P4EDfB3TBHHgfXw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, "node_modules/standard-as-callback": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", @@ -25302,16 +23194,6 @@ "node": ">=8" } }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -25436,22 +23318,6 @@ "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", "license": "MIT" }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -25891,17 +23757,8 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } + "license": "MIT" }, "node_modules/trim-lines": { "version": "3.0.1", @@ -25948,36 +23805,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "license": "Apache-2.0", - "dependencies": { - "glob": "^7.1.2" - } - }, - "node_modules/true-case-path/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/ts-dedent": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz", @@ -26068,26 +23895,6 @@ "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", "license": "MIT" }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uhyphen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", - "integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==", - "dev": true, - "license": "ISC" - }, "node_modules/ultrahtml": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz", @@ -26154,15 +23961,6 @@ "dev": true, "license": "MIT" }, - "node_modules/undici": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", - "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, "node_modules/undici-types": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", @@ -26492,16 +24290,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/unplugin": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.3.0.tgz", @@ -27476,9 +25264,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -27499,9 +25284,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -27522,9 +25304,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -27545,9 +25324,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -27844,6 +25620,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/webpack-virtual-modules": { @@ -27853,32 +25630,11 @@ "devOptional": true, "license": "MIT" }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -27980,6 +25736,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "devOptional": true, "license": "ISC" }, "node_modules/ws": { @@ -28062,15 +25819,6 @@ "node": ">=0.4.0" } }, - "node_modules/xpath": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.34.tgz", - "integrity": "sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==", - "license": "MIT", - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/xss": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.15.tgz", diff --git a/package.json b/package.json index a37dc60f9f..48a3d1adc0 100644 --- a/package.json +++ b/package.json @@ -11,42 +11,23 @@ ], "scripts": { "test": "node --test nuxt/server/lib/*.test.mjs nuxt/lib/*.test.mjs", - "dev": "concurrently \"npm run dev:eleventy\" \"npm run dev:docs\" \"npm run dev:postcss\" \"npm run dev:postcss-nuxt\" \"dotenv -- npm run dev --workspace=nuxt\"", - "start": "npm-run-all2 clean:dev build:js --parallel dev:*", - "build:js": "terser -c -m -o _site/js/cc.min.js node_modules/vanilla-cookieconsent/dist/cookieconsent.umd.js src/js/cookieconsent-config.js && cp node_modules/@flowfuse/flow-renderer/index.min.js _site/js/flowrenderer.min.js", - "build": "dotenv -v NODE_ENV=production -- npm-run-all2 clean build:js --parallel prod:*", - "build:skip-images": "dotenv -v SKIP_IMAGES=true -- npm run build", - "clean:dev": "dotenv -- npx del-cli '_site/!(img)' && dotenv -- npx mkdirp '_site/js/flows'", - "clean": "dotenv -- npx del-cli '_site/!(img)' && dotenv -- mkdir -p '_site/js'", + "dev": "npm-run-all2 --parallel dev:*", "dev:blueprints": "node scripts/watch_blueprints.js", "dev:docs": "node scripts/watch_docs.mjs", - "dev:netlify": "npx netlify dev -c \"dotenv -- npx @11ty/eleventy --serve --quiet --incremental\"", - "dev:postcss": "dotenv -v TAILWIND_MODE=watch -- npx postcss ./src/css/style.css -o ./_site/css/style.css --config ./postcss.config.js -w", - "dev:postcss-nuxt": "dotenv -v TAILWIND_MODE=watch -- npx postcss ./src/css/style.css -o ./nuxt/public/css/style.css --config ./postcss.config.js -w", + "dev:postcss-nuxt": "dotenv -v TAILWIND_MODE=watch -- npx postcss ./nuxt/assets/css/style.css -o ./nuxt/public/css/style.css --config ./postcss.config.js -w", "blueprints": "node scripts/sync_blueprints.mjs", "docs": "node scripts/sync_docs.mjs", "index:algolia": "node scripts/index-algolia.js", - "dev:eleventy": "dotenv -- npx @11ty/eleventy --serve --port 8080 --quiet", "dev:nuxt": "dotenv -- npm run dev --workspace=nuxt", - "old_dev:eleventy": "dotenv -v NODE_ENV=development -- ELEVENTY_ENV=development npx @11ty/eleventy --serve --quiet", - "prod:eleventy": "npx @11ty/eleventy", - "prod:postcss": "postcss ./src/css/style.css -o ./_site/css/style.css --config ./postcss.config.js", - "clean:nuxt": "npx del-cli 'nuxt/public/!(img|handbook|images|docs|blueprints)' 'nuxt/.output' 'nuxt/.netlify' && npx mkdirp 'nuxt/public/js' 'nuxt/public/css'", - "build:js:nuxt": "terser -c -m -o nuxt/public/js/cc.min.js node_modules/vanilla-cookieconsent/dist/cookieconsent.umd.js src/js/cookieconsent-config.js && cp node_modules/@flowfuse/flow-renderer/index.min.js nuxt/public/js/flowrenderer.min.js", - "prod:postcss-nuxt": "postcss ./src/css/style.css -o ./nuxt/public/css/style.css --config ./postcss.config.js", - "prod:eleventy-nuxt": "npx @11ty/eleventy --output=./nuxt/public/", + "clean:nuxt": "npx del-cli 'nuxt/public/css' 'nuxt/public/js/cc.min.js' 'nuxt/public/js/flowrenderer.min.js' 'nuxt/.output' 'nuxt/.netlify' && npx mkdirp 'nuxt/public/js' 'nuxt/public/css'", + "build:js:nuxt": "terser -c -m -o nuxt/public/js/cc.min.js node_modules/vanilla-cookieconsent/dist/cookieconsent.umd.js nuxt/assets/js/cookieconsent-config.js && cp node_modules/@flowfuse/flow-renderer/index.min.js nuxt/public/js/flowrenderer.min.js", + "prod:postcss-nuxt": "postcss ./nuxt/assets/css/style.css -o ./nuxt/public/css/style.css --config ./postcss.config.js", "prod:nuxt": "npm run build --workspace=nuxt", - "build:nuxt": "dotenv -v NODE_ENV=production -- npm-run-all2 clean:nuxt build:js:nuxt prod:postcss-nuxt prod:eleventy-nuxt prod:nuxt", - "build:nuxt:skip-images": "dotenv -v SKIP_IMAGES=true -v NODE_ENV=production -- npm-run-all2 clean:nuxt build:js:nuxt prod:postcss-nuxt prod:eleventy-nuxt prod:nuxt" + "build:nuxt": "dotenv -v NODE_ENV=production -- npm-run-all2 clean:nuxt build:js:nuxt prod:postcss-nuxt prod:nuxt", + "build:nuxt:skip-images": "dotenv -v SKIP_IMAGES=true -v NODE_ENV=production -- npm-run-all2 clean:nuxt build:js:nuxt prod:postcss-nuxt prod:nuxt" }, "devDependencies": { - "@11ty/eleventy": "^3.1.2", - "@11ty/eleventy-img": "^3.1.8", - "@11ty/eleventy-navigation": "^0.3.5", - "@11ty/eleventy-plugin-rss": "^1.2.0", - "@11ty/eleventy-plugin-syntaxhighlight": "^4.2.0", "@flowforge/forge-ui-components": "^0.2.2", - "@kevingimbel/eleventy-plugin-mermaid": "^2.0.0", "@parcel/watcher": "2.5.6", "@resvg/resvg-js": "2.6.2", "@tailwindcss/postcss": "^4.0.0", @@ -55,12 +36,9 @@ "@types/markdown-it-attrs": "^4.1.3", "@types/markdown-it-footnote": "^3.0.4", "chokidar": "^3.6.0", - "concurrently": "^9.0.0", "del-cli": "^5.0.0", "dotenv-cli": "^7.4.4", - "eleventy-plugin-code-clipboard": "git+https://github.com/joepavitt/eleventy-plugin-code-clipboard.git", "esbuild": "0.28.1", - "html-minifier-terser": "^7.2.0", "markdown-it-anchor": "^8.6.7", "markdown-it-footnote": "^3.0.3", "netlify-plugin-cache": "^1.0.3", @@ -73,7 +51,6 @@ "postcss-cli": "^9.0.1", "postcss-minify": "^1.1.0", "rollup": "4.60.3", - "seedrandom": "^3.0.5", "spacetime": "^7.4.7", "tailwindcss": "^4.0.0", "terser": "^5.9.0", @@ -98,16 +75,11 @@ "unhead": "^3.2.3" }, "dependencies": { - "@11ty/eleventy-fetch": "^4.0.0", "@flowfuse/flow-renderer": "^0.5.0", "@netlify/blobs": "^10.7.9", "@octokit/auth-app": "^8.3.0", - "@xmldom/xmldom": "^0.8.15", "algoliasearch": "^4.25.3", - "codeowners": "^5.1.1", - "eleventy-plugin-toc": "^1.1.5", "js-yaml": "^4.3.2", - "markdown-it-attrs": "^4.1.6", - "xpath": "^0.0.34" + "markdown-it-attrs": "^4.1.6" } } diff --git a/scripts/index-algolia.js b/scripts/index-algolia.js index 016e858dd2..bdb33a5849 100644 --- a/scripts/index-algolia.js +++ b/scripts/index-algolia.js @@ -3,7 +3,7 @@ const fs = require("fs/promises"); const path = require("path"); const algoliasearch = require("algoliasearch"); -const site = require("../src/_data/site.json"); +const site = require("../nuxt/data/site.json"); const { isSearchUrl, extractHeadingRecords, diff --git a/src/_data/blogPosts.js b/src/_data/blogPosts.js deleted file mode 100644 index 14d37c43fe..0000000000 --- a/src/_data/blogPosts.js +++ /dev/null @@ -1,42 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const yaml = require('js-yaml'); - -// Blog posts are rendered by Nuxt (src/blog/**/*.md is .eleventyignore'd), so they no -// longer appear in 11ty's `collections.posts`. This reads their frontmatter directly, -// for consumers that still need blog post data at 11ty build time (e.g. related-resources.njk). -function walk(dir) { - let results = []; - for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { - const fullPath = path.join(dir, entry.name); - if (entry.isDirectory()) { - results = results.concat(walk(fullPath)); - } else if (entry.name.endsWith('.md')) { - results.push(fullPath); - } - } - return results; -} - -module.exports = () => { - const blogDir = path.join(__dirname, '..', 'blog'); - const devModePosts = process.env.CONTEXT !== 'production'; - - return walk(blogDir) - .map((file) => { - const raw = fs.readFileSync(file, 'utf-8'); - const match = raw.match(/^---[ \t]*\r?\n([\s\S]*?)\r?\n---/); - if (!match) return null; - const data = yaml.load(match[1]) || {}; - const relative = path.relative(blogDir, file).replace(/\.md$/, '').replace(/\\/g, '/'); - return { - title: data.title, - description: data.description, - date: data.date ? new Date(data.date) : new Date(0), - url: `/blog/${relative}/` - }; - }) - .filter(Boolean) - .filter(post => devModePosts || post.date <= new Date()) - .sort((a, b) => b.date - a.date); -}; diff --git a/src/_data/certifiedNodes.js b/src/_data/certifiedNodes.js deleted file mode 100644 index 1fe6944f03..0000000000 --- a/src/_data/certifiedNodes.js +++ /dev/null @@ -1,118 +0,0 @@ -const EleventyFetch = require("@11ty/eleventy-fetch"); - -/* - Build-time mirror of the FlowFuse Certified Nodes catalogues. - - These are the same two feeds the Nuxt /integrations page reads (see - CERTIFIED_HUB_API / CERTIFIED_EDGE_API in nuxt/types/integrations.ts). While - the site is mid-migration the two halves have separate data layers, so this - file deliberately duplicates the fetch rather than importing across the - boundary. Keep the URLs and the docs-path rules below in sync with - nuxt/utils/integrations.ts. -*/ -const CATALOGUES = [ - { - collection: "hub", - label: "Hub", - url: "https://ff-certified-nodes.flowfuse.cloud/ff-it.json", - }, - { - collection: "edge", - label: "Edge", - url: "https://ff-certified-nodes.flowfuse.cloud/ff-ot.json", - }, -]; - -/* - Mirrors DOCS_URL_OVERRIDES in nuxt/utils/integrations.ts. A catalogue entry's - `url` is whatever the publisher set, which for opcua is Sterfive's repository - rather than the FlowFuse documentation page. Entries here win over `url`. -*/ -const DOCS_PATH_OVERRIDES = { - "@flowfuse-certified-nodes/opcua": "/docs/flowfuse-nodes/edge/opcua/", -}; - -/* - The catalogues do not currently carry a display `name`, and the ids are - lowercase slugs, so title-casing alone produces "Opcua" and "Rtsp". Acronyms - cannot be inferred, so they are spelled out here. A node missing from this map - still renders, using the title-cased slug, which reads correctly for names - that are ordinary words ("Redis", "Modbus", "Kafka"). -*/ -const NAME_OVERRIDES = { - "@flowfuse-certified-nodes/opcua": "OPC UA", - "@flowfuse-certified-nodes/rtsp": "RTSP", - "@flowfuse-certified-nodes/cip-suite": "CIP Suite", - "@flowfuse-certified-nodes/ffcn-kafka": "Kafka", -}; - -// Last resort when there is neither an override nor a catalogue `name`: -// "@flowfuse-certified-nodes/cip-suite" becomes "Cip Suite". -function displayNameFromId(id) { - return id - .split("/") - .pop() - .split("-") - .map((word) => word.replace(/^\w/, (c) => c.toUpperCase())) - .join(" "); -} - -// Only flowfuse.com links become on-site paths. Anything else (a GitHub repo, a -// vendor site) is not a documentation page we control, so it is discarded and -// the collection index is used instead. -function docsPathFromCatalogueUrl(url) { - if (!url) { - return undefined; - } - try { - const parsed = new URL(url); - if (parsed.hostname !== "flowfuse.com" && parsed.hostname !== "www.flowfuse.com") { - return undefined; - } - return parsed.pathname.endsWith("/") ? parsed.pathname : `${parsed.pathname}/`; - } catch { - return undefined; - } -} - -module.exports = async function () { - const byId = {}; - const all = []; - - for (const catalogue of CATALOGUES) { - let data; - try { - data = await EleventyFetch(catalogue.url, { - duration: "4h", - type: "json", - }); - } catch (error) { - // A catalogue being unreachable must not fail the build. Callouts for - // its nodes simply do not render until the next successful fetch. - console.warn(`[certifiedNodes] skipping ${catalogue.url}: ${error.message}`); - continue; - } - - for (const module of data.modules || []) { - const node = { - id: module.id, - name: NAME_OVERRIDES[module.id] || module.name || displayNameFromId(module.id), - description: module.description, - version: module.version, - collection: catalogue.collection, - collectionLabel: catalogue.label, - collectionIndex: `/docs/flowfuse-nodes/${catalogue.collection}/`, - docsPath: - DOCS_PATH_OVERRIDES[module.id] || - docsPathFromCatalogueUrl(module.url) || - `/docs/flowfuse-nodes/${catalogue.collection}/`, - }; - byId[node.id] = node; - all.push(node); - } - } - - all.sort((a, b) => a.name.localeCompare(b.name)); - - return { byId, all }; -}; diff --git a/src/_data/ctaDestinations.json b/src/_data/ctaDestinations.json deleted file mode 100644 index c0319ab5bb..0000000000 --- a/src/_data/ctaDestinations.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "signUp": { - "event": "cta-sign-up", - "hrefSuffix": "/account/create", - "label": "Try it out", - "navLabel": "Free Trial", - "navPositions": ["main-nav", "mobile-cta-bar"] - }, - "signIn": { - "event": "cta-sign-in", - "hrefSuffix": "", - "label": "Sign In" - }, - "contactUs": { - "event": "cta-contact-us", - "href": "/contact-us/", - "label": "Contact Us" - }, - "bookDemo": { - "event": "cta-book-demo", - "href": "/book-demo/", - "label": "Book a Demo" - }, - "pricing": { - "event": "cta-pricing", - "href": "/pricing/", - "label": "View Pricing" - } -} diff --git a/src/_data/docs_banner.yaml b/src/_data/docs_banner.yaml deleted file mode 100644 index 185224b453..0000000000 --- a/src/_data/docs_banner.yaml +++ /dev/null @@ -1,8 +0,0 @@ -- type: "New Whitepaper" - title: "UNS - Decoupling data producers and consumers" - buttonText: "Download now" - link: "https://eu1.hubs.ly/H0fY8Vl0" - reference: "docs_banner-whitepaper_uns" - expire: "2025-04-30T23:59:00Z" - eventTime: - secondaryText: "A Practical Guide to Unified Namespace with FlowFuse" diff --git a/src/_data/eleventyComputed.js b/src/_data/eleventyComputed.js deleted file mode 100644 index fb22e8586f..0000000000 --- a/src/_data/eleventyComputed.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = { - meta: { - title: (data) => { - const title = data.title || data.meta?.title || data.page.fileSlug - if (title) { - return title[0].toUpperCase() + title.substring(1) - } else { - return title - } - } - }, - people: (data) => { - return {...data.team, ...data.guests} - } -} diff --git a/src/_data/features.json b/src/_data/features.json deleted file mode 100644 index 11aadd5514..0000000000 --- a/src/_data/features.json +++ /dev/null @@ -1,65 +0,0 @@ - [{ - "title": "Simplified Hosting and Maintenance", - "imageFolder": "./images/pictograms/", - "imageFile": "cloud_nr_blue.png", - "imageAlt": " Node-RED hosted in the cloud.", - "content": "Experience ease of use with <a href='https://app.flowfuse.com'>FlowFuse Cloud</a>, handling all your hosting needs. Forget the complexities of maintaining your development environment; we've got it covered." - }, - { - "title": "Centralised Instance Management", - "imageFolder": "./images/pictograms/", - "imageFile": "instance_blue.png", - "imageAlt": " three Node-RED instances grouped in a single place.", - "content": "FlowFuse enables seamless management of multiple instances from a single platform, streamlining your development and coordination efforts." - }, - { - "title": "Scalable High Availability", - "imageFolder": "./images/pictograms/", - "imageFile": "scalable_pictogram_blue.png", - "imageAlt": " scalability.", - "content": "Node-RED applications can be run in <a href='/blog/2023/05/bringing-high-availability-to-node-red/'>High Availability</a> mode to allow the applications to scale up to meet spikes in demand. Even with instance failures, we ensure continuous operations by automatically switching to another Node-RED instance." - }, - { - "title": "Data Sharing and Storage", - "imageFolder": "./images/pictograms/", - "imageFile": "connect_device_blue.png", - "imageAlt": " data sharing and storage", - "content": "FlowFuse adds to a Node-RED environment the ability to share information between instances and persistent data. <a href='/docs/user/projectnodes/#flowfuse-project-nodes'>FlowFuse Project Nodes</a> facilitate data and message exchange between Node-RED projects, ideal for edge-to-cloud communication." - },{ - "title": "Remote Device Management at the Edge", - "imageFolder": "./images/pictograms/", - "imageFile": "edge_blue.png", - "imageAlt": " edge management.", - "content": "FlowFuse allows you to deploy and manage Node-RED instances out to <a href='/use-cases/remote-device-management/'>edge devices</a>. This allows you to deploy the exact same instance out to hundreds or thousands of edge devices and monitor their status." - },{ - "title": "Software Delivery Pipelines", - "imageFolder": "./images/pictograms/", - "imageFile": "pipeline_blue.png", - "imageAlt": " a DevOps pipeline.", - "content": "<a href='/docs/user/devops-pipelines/#devops-pipelines'>DevOps pipelines</a> can be set up to stage Node-RED instances that have different development stages such as test, development and production." - },{ - "title": "Version History", - "imageFolder": "./images/pictograms/", - "imageFile": "snapshot_blue.png", - "imageAlt": " snapshots.", - "content": "<a href='/docs/user/snapshots/#snapshots'>Snapshots</a> of Node-RED instances can be taken to create a version history of the development work. Previous snapshot versions can be rolled back at any time." - },{ - "title": "Team Collaboration", - "imageFolder": "../images/pictograms/", - "imageFile": "users_blue.png", - "imageAlt": " a team.", - "content": "Different development team members are able to share and develop on the same Node-RED instance making collaboration easier. <a href='/blog/2024/04/role-based-access-control-rbac-for-node-red-with-flowfuse'>Role based access control (RBAC)</a> allows for restrictions on what team members can access and do while using the FlowFuse platform." - },{ - "title": "Built-in Security", - "imageFolder": "../images/pictograms/", - "imageFile": "security_pictogram_blue.png", - "imageAlt": " a lock.", - "content": "All Node-RED instances are accessed using TLS/SSL. Single Sign-on (SSO) allows for users to sign in to FlowFuse using an existing SAML identity provider and Audit logs keep track of all changes that occur to a Node-RED instance and which user was responsible for the change." - },{ - "title": "Certified Nodes", - "imageFolder": "../images/pictograms/", - "imageFile": "certified-nodes_blue.png", - "imageAlt": " certifying badge.", - "content": "Our curated collection of certified nodes, ensuring top-notch quality, security, and support. <a href='/integrations/?certified=1'>Explore our certified nodes</a> and benefit from a robust ecosystem while maintaining operational reliability." - } -] diff --git a/src/_data/heroImages.js b/src/_data/heroImages.js deleted file mode 100644 index d3b0c46081..0000000000 --- a/src/_data/heroImages.js +++ /dev/null @@ -1,11 +0,0 @@ -const path = require('path'); -const fs = require('fs'); -const config = require('../images/home/hero/config.json'); - -module.exports = () => config - .filter(({ file }) => fs.existsSync(path.join(__dirname, '../images/home/hero', file))) - .map(({ file, alt, mobileOverlay }) => ({ - src: `./images/home/hero/${file}`, - alt, - mobileOverlay: !!mobileOverlay - })); diff --git a/src/_data/nodeRed/reasons.json b/src/_data/nodeRed/reasons.json deleted file mode 100644 index bd3b66915a..0000000000 --- a/src/_data/nodeRed/reasons.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - "Node-RED’s <strong>visual programming</strong> makes it possible for non-developers to build real applications.", - "A <strong>large library of nodes and flows</strong> make it trivial to connect different types of analog and digital services, including industrial protocols (OPC-UA, Modbus, Siemens S7), databases, weather services, etc.", - "Node-RED dashboard makes it <strong>easy to visualize data in dashboards</strong>. Unlike other dashboards, <a href=\"/blog/2023/03/comparinig-dashboards\" target=\"_blank\">Node-RED dashboards</a> can include action and events that respond to the data" -] \ No newline at end of file diff --git a/src/_includes/base.js b/src/_includes/base.js deleted file mode 100644 index 3f6872809d..0000000000 --- a/src/_includes/base.js +++ /dev/null @@ -1,180 +0,0 @@ -/** - * Base.js, included on all pages - * Blocks some third party scripts and sets all dynamically added scripts to use defer - */ - -// Third party injected scripts that are not wanted -const blockedScripts = [ - // /hs-banner.com/ HubSpot cookie banner that's loaded even if not used -] - -function needsToBeBlocked(src) { - return blockedScripts.some((blockedScript) => blockedScript.test(src)) -} - -// Patch document.createElement to allow blocking of unwanted scripts injected externally -const createElementBackup = document.createElement -document.createElement = function(...args) { - // If this is not a script tag, bypass - if(args[0].toLowerCase() !== 'script') { - // Binding to document is essential - return createElementBackup.bind(document)(...args) - } - - const scriptElt = createElementBackup.bind(document)(...args) - - const originalSetAttribute = scriptElt.setAttribute.bind(scriptElt) - - // Always set the defer flag - originalSetAttribute('defer', 'defer') - - // Define getters / setters to ensure that the script type is properly set - Object.defineProperties(scriptElt, { - 'src': { - get() { - return scriptElt.getAttribute('src') - }, - set(value) { - if(needsToBeBlocked(value, scriptElt.type)) { - originalSetAttribute('type', 'javascript/blocked') - } - originalSetAttribute('src', value) - return true - } - }, - 'type': { - set(value) { - const typeValue = - needsToBeBlocked(scriptElt.src, scriptElt.type) ? - 'javascript/blocked' : - value - originalSetAttribute('type', typeValue) - return true - } - } - }) - - // Monkey patch the setAttribute function so that the setter is called instead. - scriptElt.setAttribute = function(name, value) { - if(name === 'type' || name === 'src') - scriptElt[name] = value - else - HTMLScriptElement.prototype.setAttribute.call(scriptElt, name, value) - } - - return scriptElt -} - -function hsFallback (element) { - if (element && element.parentNode) { - const existingFallback = element.parentNode.querySelector('.ff-hubspot-consent-fallback') - if (existingFallback) { - existingFallback.classList.remove('hidden') - return - } - - const errorSection = document.createElement('section'); - errorSection.classList.add('ff-hubspot-consent-fallback'); - errorSection.innerHTML = ` - <p><strong>Unable to load HubSpot content.</strong></p> - `; - element.parentNode.insertBefore(errorSection, element.nextSibling); - } -} - -function loadHubSpotFormsScript () { - if (window.hbspt?.forms?.create) { - return Promise.resolve(window.hbspt) - } - - if (window._ffHubSpotFormsPromise) { - return window._ffHubSpotFormsPromise - } - - window._ffHubSpotFormsPromise = new Promise((resolve, reject) => { - const existing = document.getElementById('ff-hs-forms-script') - - if (existing) { - existing.addEventListener('load', () => resolve(window.hbspt), { once: true }) - existing.addEventListener('error', () => reject(new Error('HubSpot forms script failed to load')), { once: true }) - return - } - - const script = document.createElement('script') - script.id = 'ff-hs-forms-script' - script.async = true - script.charset = 'utf-8' - script.src = 'https://js-eu1.hsforms.net/forms/embed/v2.js' - script.onload = () => resolve(window.hbspt) - script.onerror = () => reject(new Error('HubSpot forms script failed to load')) - document.head.appendChild(script) - }).catch((err) => { - window._ffHubSpotFormsPromise = null - throw err - }) - - return window._ffHubSpotFormsPromise -} - -function ffCreateHubSpotForm (config) { - if (!config || !config.formId) { - return - } - - const targetElement = config.target ? document.querySelector(config.target) : null - const fallbackElement = config.fallbackSelector ? document.querySelector(config.fallbackSelector) : null - if (config.target && !targetElement) { - return - } - - if (targetElement?.dataset.ffHsFormLoaded === 'true') { - return - } - - if (targetElement && targetElement.querySelector('iframe, form, .hbspt-form')) { - targetElement.dataset.ffHsFormLoaded = 'true' - return - } - - loadHubSpotFormsScript().then(() => { - if (!window.hbspt?.forms?.create) { - if (fallbackElement) { - fallbackElement.classList.remove('hidden') - } else if (targetElement) { - hsFallback(targetElement) - } - return - } - // Keep local helper-only keys out of HubSpot's context object. - const { fallbackSelector, ...hubspotConfig } = config - window.hbspt.forms.create(hubspotConfig) - if (targetElement) { - targetElement.dataset.ffHsFormLoaded = 'true' - } - if (fallbackElement) { - fallbackElement.classList.add('hidden') - } - }).catch(() => { - if (fallbackElement) { - fallbackElement.classList.remove('hidden') - } else if (targetElement) { - hsFallback(targetElement) - } - }) -} - -window.ffCreateHubSpotForm = ffCreateHubSpotForm - -// Mobile nav: dropdown sections expand on tap, not hover -document.addEventListener('DOMContentLoaded', function () { - document.querySelectorAll('header .ff-nav-dropdown > span').forEach(function (trigger) { - trigger.addEventListener('click', function (e) { - if (window.innerWidth < 768) { - e.preventDefault() - e.stopPropagation() - // Toggle this section on its own; other open sections stay open - trigger.parentElement.classList.toggle('mobile-expanded') - } - }) - }) -}) diff --git a/src/_includes/benefits.njk b/src/_includes/benefits.njk deleted file mode 100644 index cb4e129805..0000000000 --- a/src/_includes/benefits.njk +++ /dev/null @@ -1,26 +0,0 @@ -<div class="flex flex-wrap justify-center mt-12 md:mt-20"> - <div class="company-value"> - {% image "./images/pictograms/remote_blue.png", "Icon representing Fully Remote", [128] %} - <h3>Fully Remote</h3> - </div> - <div class="company-value"> - {% image "./images/pictograms/vacation_blue.png", "Icon representing Unlimited Vacation", [128] %} - <h3>Unlimited Vacation</h3> - </div> - <div class="company-value"> - {% image "./images/pictograms/time_blue.png", "Icon representing Flexible Hours", [128] %} - <h3>Flexible Hours</h3> - </div> - <div class="company-value"> - {% image "./images/pictograms/education_blue.png", "Icon representing Education Budget", [128] %} - <h3>Education Budget</h3> - </div> - <div class="company-value"> - {% image "./images/pictograms/equipment_blue.png", "Icon representing Equipment", [128] %} - <h3>Equipment</h3> - </div> - <div class="company-value"> - {% image "./images/pictograms/parental_leave_blue.png", "Icon representing Paid Parental Leave", [128] %} - <h3>Paid Parental Leave</h3> - </div> -</div> diff --git a/src/_includes/common-cta.njk b/src/_includes/common-cta.njk deleted file mode 100644 index 023aefb16e..0000000000 --- a/src/_includes/common-cta.njk +++ /dev/null @@ -1,33 +0,0 @@ -{% from "components/cta/cta-sign-up.njk" import ctaSignUp %} -{% from "components/cta/cta-contact-us.njk" import ctaContactUs %} -<div class="w-full bg-white pt-12 pb-10"> - <h3 class="flex items-center text-center justify-center"> - <div class="flex flex-col leading-9 text-3xl mb-4 red-gradient font-semibold"> - Ready to get started with FlowFuse? - </div> - </h3> - <div class="container m-auto max-w-lg md:max-w-5xl grid grid-cols-1 md:grid-cols-2 gap-3 px-6 py-8 mb-10"> - <div class="features-card"> - <div> - <label class="flex items-center text-center justify-center font-medium text-2xl text-gray-800 mt-5">On Premise</label> - <p class="mb-6 mt-6"> - Install FlowFuse on your own hardware for increased deployment flexibility. Install it on-premises and manage the deployment yourself. - </p> - </div> - <div class="flex flex-col items-center"> - {{ ctaContactUs('primary-outlined', 'secondary', extraClass='align-baseline w-full') }} - </div> - </div> - <div class="features-card"> - <div> - <label class="flex items-center text-center justify-center font-medium text-2xl text-gray-800 mt-5">FlowFuse Cloud</label> - <p class="mb-6 mt-6"> - Our managed hosted solution, maintained and supported by the FlowFuse team. Experience flexibility, scalability, and expert assistance to drive your business forward. - </p> - </div> - <div class="flex flex-col items-center"> - {{ ctaSignUp(site, 'primary', 'secondary', extraClass='align-baseline w-full') }} - </div> - </div> - </div> -</div> \ No newline at end of file diff --git a/src/_includes/components/ai-chat-interface.njk b/src/_includes/components/ai-chat-interface.njk deleted file mode 100644 index 6c57ba245f..0000000000 --- a/src/_includes/components/ai-chat-interface.njk +++ /dev/null @@ -1,52 +0,0 @@ -<div class="ai-chat-container mx-auto mt-6 sm:mt-10 max-w-4xl"> - <div class="ai-chat-box"> - <div class="textarea-wrapper relative mb-4 h-40 p-4 pb-12 rounded-lg overflow-hidden"> - <textarea - placeholder="Tell us what you are trying to build and the FlowFuse Expert will create a guide to get you up and running quickly" - class="w-full h-full bg-transparent border-0 focus:outline-none text-gray-600 placeholder-gray-400 resize-none" - aria-label="Describe your workflow" - ></textarea> - <div class="absolute bottom-3 left-4 text-[10px] font-light text-gray-500 pr-36 line-clamp-2"> - AI uses FlowFuse's knowledge base - </div> - <button id="tell-me-how-btn" class="absolute bottom-3 right-4 ff-btn ff-btn--highlight uppercase whitespace-nowrap px-6 py-3" onclick="if(typeof capture === 'function') capture('cta-ai-get-started', {'position': 'ff-expert'})"> - Get Started - </button> - </div> - </div> - - <div class="ai-prompts mt-4"> - <div class="wrapper flex flex-wrap gap-2 mb-3"> - {# content injected#} - </div> - </div> -</div> - -<script> -document.addEventListener('DOMContentLoaded', function() { - const homeTextarea = document.querySelector('textarea[aria-label="Describe your workflow"]'); - if (homeTextarea) { - // Auto-focus the homepage textarea when page loads - homeTextarea.focus(); - - // Responsive placeholder text - const fullPlaceholder = "Tell us what you are trying to build and the FlowFuse Expert will create a guide to get you up and running quickly"; - const shortPlaceholder = "Tell us what you are trying to build"; - - function updatePlaceholder() { - // Use 480px breakpoint to target mobile phones - if (window.innerWidth < 480) { - homeTextarea.placeholder = shortPlaceholder; - } else { - homeTextarea.placeholder = fullPlaceholder; - } - } - - // Set initial placeholder - updatePlaceholder(); - - // Update on window resize - window.addEventListener('resize', updatePlaceholder); - } -}); -</script> diff --git a/src/_includes/components/ai-expert-modal.njk b/src/_includes/components/ai-expert-modal.njk deleted file mode 100644 index 63c5527753..0000000000 --- a/src/_includes/components/ai-expert-modal.njk +++ /dev/null @@ -1,76 +0,0 @@ -<script src="https://cdn.jsdelivr.net/npm/dompurify@3.3.0/dist/purify.min.js"></script> -<!-- FlowFuse Expert Modal --> - -<div id="ai-expert-modal" class="fixed inset-0 bg-black/50 hidden items-center justify-center p-0 md:p-4 md:px-8 md:py-8 z-[9999]" role="dialog" aria-modal="true" aria-labelledby="ai-expert-modal-title"> - <!-- Modal Content --> - <div class="bg-white rounded-none md:rounded-lg shadow-xl w-full max-w-4xl h-full md:h-full flex flex-col relative"> - - <!-- Header --> - <div class="ai-chat-box"><div class="textarea-wrapper modal-header flex items-center justify-between px-4 py-3 rounded-t-none md:rounded-t-lg h-auto rounded-b-none mb-0"> - <div class="flex items-center gap-1"> - <!-- FlowFuse Logo --> - <div class="w-24 h-6"> - {% include "components/flowfuse-wordmark.njk" %} - </div> - <h2 id="ai-expert-modal-title" class="text-base font-semibold text-gray-700 -mb-1">Expert</h2> - </div> - <button id="close-modal" class="text-gray-500 hover:text-gray-600" aria-label="Close dialog"> - <svg width="24" height="24" viewBox="0 0 24 24" fill="none"> - <path d="M18 6L6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> - <path d="M6 6l12 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> - </svg> - </button> - </div></div> - - <!-- Chat Content --> - <div class="flex-1 p-4 overflow-y-auto"> - <!-- Info Message --> - <div class="bg-indigo-100 rounded-lg mb-6 py-3 px-4"> - <p class="text-indigo-700 text-sm m-0"> - AI agent has access to all of FlowFuse's - <a href="/docs" class="underline">documentation and knowledge</a>, - <a href="/blog" class="underline">blogposts</a>, and more. - </p> - </div> - - <!-- Chat Messages Container --> - <div id="chat-messages" class="space-y-4 overflow-auto"> - <!-- Messages will be added here dynamically --> - </div> - - </div> - - <!-- Input Area --> - <div class="p-4 bg-white rounded-b-none md:rounded-b-lg border-t border-gray-200"> - <div id="action-buttons-container" class="pb-4 flex justify-between"> - <button id="clear-conversation" class="bg-white border border-indigo-300 rounded-full text-sm py-2 px-3 disabled:opacity-50 disabled:cursor-not-allowed" disabled> - Start over - </button> - <div id="right-buttons" class="flex gap-2"> - <button id="continue-to-app" class="textarea-wrapper bg-white rounded-full text-sm py-2 px-3 disabled:opacity-50 disabled:cursor-not-allowed transition-colors hidden inline-flex items-center gap-1"> - Continue chat in <img src="/images/ff-minimal-red.svg" alt="FlowFuse" class="w-5 h-5 inline-block"> - </button> - <button id="stop-generation" class="bg-white border border-indigo-300 rounded-full text-sm flex items-center gap-2 py-2 px-3 hidden"> - <div class="w-3 h-3 bg-gray-800 rounded-sm"></div> - Stop - </button> - <button id="send-message" class="bg-indigo-600 text-white border border-indigo-600 rounded-full text-sm py-2 px-3 disabled:opacity-50 disabled:cursor-not-allowed hover:bg-indigo-700 transition-colors" disabled> - Send - </button> - </div> - </div> - <div class="relative"> - <textarea - id="modal-input" - placeholder="Give more details in regards to your intended workflow to tailor it to your use case" - class="w-full p-4 border-2 border-gray-300 rounded-lg resize-none focus:outline-none focus:border-indigo-500 text-gray-900 h-24 text-sm disabled:cursor-not-allowed disabled:bg-gray-50 disabled:text-gray-500" - ></textarea> - </div> - </div> - - </div> -</div> - - -<!-- JavaScript for Modal Functionality --> -<script src="/js/ai-expert-modal.js"></script> diff --git a/src/_includes/components/certified-node-callout.liquid b/src/_includes/components/certified-node-callout.liquid deleted file mode 100644 index 917af503bf..0000000000 --- a/src/_includes/components/certified-node-callout.liquid +++ /dev/null @@ -1,61 +0,0 @@ -{%- comment -%} - Cross-links a /node-red topic page to the FlowFuse Certified Nodes that cover - the same technology. - - This file is Liquid, not Nunjucks: pages under src/node-red are markdown, and - Eleventy renders markdown with Liquid, so `{% set %}` and friends are not - available here. The equivalent block on the /node-red hub page is inline - Nunjucks in index.njk because that page is .njk. - - Every tag below uses whitespace control. markdown-it ends an HTML block at the - first blank line, and a bare `{% if %}` on its own line leaves a line of - spaces behind, which counts as blank. Without the dashes the tail of this - callout gets parsed as markdown and comes out wrapped in stray <p> tags. - - Usage: add a `certified` list of catalogue ids to the page front matter, then - include this file where the callout should appear: - - --- - certified: - - "@flowfuse-certified-nodes/opcua" - certifiedIntro: "Optional sentence replacing the default lede." - certifiedTitle: "Optional heading replacing the default." - --- - {% include "components/certified-node-callout.liquid" %} - - Names, descriptions and documentation links come from the live catalogues via - src/_data/certifiedNodes.js, so a node is only ever named once, by id. Ids - that are not in the catalogue are skipped, so a page can list a node before it - ships without rendering an empty or broken block. -{%- endcomment -%} -{%- assign certifiedMatches = 0 -%} -{%- for certifiedId in certified -%} - {%- assign certifiedCandidate = certifiedNodes.byId[certifiedId] -%} - {%- if certifiedCandidate -%}{%- assign certifiedMatches = certifiedMatches | plus: 1 -%}{%- endif -%} -{%- endfor -%} -{%- if certifiedMatches > 0 -%} -{%- comment -%} - The title is a <p>, not a heading. eleventy-plugin-toc collects every h2/h3/h4 - in the rendered content, so a heading here would insert this component into - the host page's Table of Contents and document outline as though it were one - of the tutorial's own sections. -{%- endcomment -%} -<aside class="certified-callout not-prose" aria-label="FlowFuse Certified Nodes"> -<span class="certified-eyebrow">{%- include "components/icons/certified-node.svg" -%}<span>FlowFuse Certified</span></span> -<p class="certified-callout--title">{% if certifiedTitle %}{{ certifiedTitle }}{% elsif certifiedMatches > 1 %}Certified nodes for this in production{% else %}A certified node for this in production{% endif %}</p> -<p class="certified-callout--lede">{% if certifiedIntro %}{{ certifiedIntro }}{% else %}The community packages on this page are a good place to learn. For production, FlowFuse certifies and maintains the following:{% endif %}</p> -<ul class="certified-callout--list"> -{%- for certifiedId in certified -%} -{%- assign node = certifiedNodes.byId[certifiedId] -%} -{%- if node -%} -<li class="certified-callout--item"> -<a class="certified-callout--name" href="{{ node.docsPath }}" onclick="capture('certified-node-click', {node: '{{ node.id }}', collection: '{{ node.collection }}', page: location.pathname})">{{ node.name }}</a> -<span class="certified-pill">{%- include "components/icons/certified-node.svg" -%}<span>{{ node.collectionLabel }}</span></span> -{%- if node.description -%}<p class="certified-callout--description">{{ node.description }}</p>{%- endif -%} -</li> -{%- endif -%} -{%- endfor -%} -</ul> -<p class="certified-callout--foot">Certified nodes are vetted for reliability, security and current documentation, have a named owner accountable for them, and are patched by FlowFuse after release. <a href="/contact-us/">Talk to us about access</a>.</p> -</aside> -{%- endif -%} diff --git a/src/_includes/components/chat.njk b/src/_includes/components/chat.njk deleted file mode 100644 index d307f9befc..0000000000 --- a/src/_includes/components/chat.njk +++ /dev/null @@ -1,3 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"> - <path stroke-linecap="round" stroke-linejoin="round" d="M20.25 8.511c.884.284 1.5 1.128 1.5 2.097v4.286c0 1.136-.847 2.1-1.98 2.193-.34.027-.68.052-1.02.072v3.091l-3-3c-1.354 0-2.694-.055-4.02-.163a2.115 2.115 0 0 1-.825-.242m9.345-8.334a2.126 2.126 0 0 0-.476-.095 48.64 48.64 0 0 0-8.048 0c-1.131.094-1.976 1.057-1.976 2.192v4.286c0 .837.46 1.58 1.155 1.951m9.345-8.334V6.637c0-1.621-1.152-3.026-2.76-3.235A48.455 48.455 0 0 0 11.25 3c-2.115 0-4.198.137-6.24.402-1.608.209-2.76 1.614-2.76 3.235v6.226c0 1.621 1.152 3.026 2.76 3.235.577.075 1.157.14 1.74.194V21l4.155-4.155" /> -</svg> \ No newline at end of file diff --git a/src/_includes/components/cta/cta-book-demo.njk b/src/_includes/components/cta/cta-book-demo.njk deleted file mode 100644 index 4081cbf059..0000000000 --- a/src/_includes/components/cta/cta-book-demo.njk +++ /dev/null @@ -1,15 +0,0 @@ -{% from "components/cta/cta-button.njk" import ctaButton %} -{# - Fixed destination, copy, and tracked event - only the look (variant) and - where it lives on the page (position) vary per insertion. Mirrors - nuxt/components/CtaBookDemo.vue. Already the one destination that was - consistently named 'cta-book-demo' across all of 11ty, so no rename needed - here - just centralising the markup. - - Event/href/label come from src/_data/ctaDestinations.json - the single - source of truth shared with the Nuxt component. -#} -{% macro ctaBookDemo(variant, position, color=none, icon=false, uppercase=none, padded=false, extraClass='') %} -{%- set dest = ctaDestinations.bookDemo -%} -{{ ctaButton(dest.event, dest.href, dest.label, variant, position, color, icon, uppercase, padded, extraClass) }} -{%- endmacro %} diff --git a/src/_includes/components/cta/cta-button.njk b/src/_includes/components/cta/cta-button.njk deleted file mode 100644 index 4358f09b82..0000000000 --- a/src/_includes/components/cta/cta-button.njk +++ /dev/null @@ -1,57 +0,0 @@ -{# - Internal building block for the destination-specific CTA macros in this - folder (cta-sign-up.njk, cta-sign-in.njk, cta-contact-us.njk, - cta-book-demo.njk). Not meant to be included directly elsewhere - event - name, href, and copy are fixed per destination on purpose, so this macro - only ever handles *how it looks*. - - Mirrors nuxt/components/cta/CtaButton.vue - event names and the - {position, variant} capture payload must stay identical to the Nuxt side so - PostHog reports can group clicks from both halves of the site under one - event name. No `plan` param here (unlike Nuxt's CtaButton): that's only - used on the pricing table, which is Nuxt-only - no 11ty caller needs it. -#} -{% macro ctaButton(event, href, label, variant, position, color=none, icon=false, uppercase=none, padded=false, extraClass='') %} -{%- set isNavText = variant == 'nav-text' -%} -{%- set isGhost = variant == 'ghost' -%} -{#- Vue's CtaButton defaults uppercase to `!isNavTextVariant` when the caller - doesn't pass it; `none` here is that same "not passed" sentinel. -#} -{%- set showUppercase = uppercase if uppercase != none else not isNavText -%} -{%- set caseClass = 'uppercase' if showUppercase else 'normal-case' -%} -{%- if isNavText -%} - {#- ff-nav-freetrial (header "Free Trial") vs a plain inline link (utility - bar "Sign In") both come through as extraClass from the caller, same - as Nuxt. Font-weight is deliberately NOT set here (unlike Nuxt's - CtaButton, which hardcodes font-normal): Nuxt can get away with that - because Nuxt UI merges its `ui.base` and the caller's `class` through - tailwind-merge, which resolves a font-normal/font-medium clash by - override intent (the caller's class always wins). A plain <a class=""> - here has no such merge step - two conflicting font-weight utilities - on the same element resolve by whichever rule Tailwind happened to - emit later in the compiled stylesheet, not by which one is "meant" to - win, so hardcoding font-normal previously fought Sign In's own - font-medium (from extraClass) and silently won, undoing it. Free - Trial still renders font-normal correctly without this - it comes - from the pre-existing `.ff-website header .cta a { font-normal }` - rule in style.css, which matches directly on the element and beats - inheritance cleanly (no utility-class collision involved). -#} - {%- set padClass = 'px-3 py-4' if padded else 'p-0' -%} - {%- set classes = caseClass ~ ' no-underline ' ~ padClass -%} -{%- elif isGhost -%} - {%- set classes = 'ff-btn ff-btn--ghost ff-btn--ghost-' ~ (color if color else 'primary') ~ ' ' ~ caseClass -%} -{%- else -%} - {%- set classes = 'ff-btn ff-btn--' ~ variant ~ ' ' ~ caseClass -%} -{%- endif -%} -{%- if extraClass -%}{%- set classes = classes ~ ' ' ~ extraClass -%}{%- endif -%} -{%- set captureProps = {'position': position, 'variant': variant} -%} -{#- The label+icon span is ONLY added when there's actually an icon to lay - out next to - a plain label stays a bare text node like before. Wrapping - unconditionally broke header CTAs: several `header ul span` / `header - span` rules (see style.css, written for the mega-menu's own label spans) - target any <span> under `header` with an explicit `:not(.ff-nav-label)` - escape hatch - a generic wrapper span here has neither that class nor - .ff-icon, so it got caught by those rules (forced padding, dark text) - instead of the button's own white/ff-btn styling. Icon usages (hero, - "Try it out", why-flowfuse) all live outside <header>, so this is safe. -#} -<a class="{{ classes }}" href="{{ href }}" onclick='capture("{{ event }}", {{ captureProps | json | safe }})'>{% if isNavText %}<span class="ff-nav-label">{{ label }}</span>{% elif icon %}<span class="inline-flex items-center gap-2">{{ label }}{% include "components/icons/arrow-right.svg" %}</span>{% else %}{{ label }}{% endif %}</a> -{%- endmacro %} diff --git a/src/_includes/components/cta/cta-contact-us.njk b/src/_includes/components/cta/cta-contact-us.njk deleted file mode 100644 index d2c8897992..0000000000 --- a/src/_includes/components/cta/cta-contact-us.njk +++ /dev/null @@ -1,18 +0,0 @@ -{% from "components/cta/cta-button.njk" import ctaButton %} -{# - Fixed destination, copy, and tracked event - only the look (variant) and - where it lives on the page (position) vary per insertion. Mirrors - nuxt/components/CtaContactUs.vue. - - Event/href/label come from src/_data/ctaDestinations.json - the single - source of truth shared with the Nuxt component. - - Standardises on the 'cta-contact-us' event name used by Nuxt - previously - 11ty fired five different names for this same destination (cta-talk-us, - cta-talk-to-sales, cta-talk-to-expert, cta-contact, plus this one), which - made it impossible to report "all Contact Us clicks" as a single metric. -#} -{% macro ctaContactUs(variant, position, color=none, icon=false, uppercase=none, padded=false, extraClass='') %} -{%- set dest = ctaDestinations.contactUs -%} -{{ ctaButton(dest.event, dest.href, dest.label, variant, position, color, icon, uppercase, padded, extraClass) }} -{%- endmacro %} diff --git a/src/_includes/components/cta/cta-pricing.njk b/src/_includes/components/cta/cta-pricing.njk deleted file mode 100644 index eaec678c18..0000000000 --- a/src/_includes/components/cta/cta-pricing.njk +++ /dev/null @@ -1,13 +0,0 @@ -{% from "components/cta/cta-button.njk" import ctaButton %} -{# - Fixed destination, copy, and tracked event - only the look (variant) and - where it lives on the page (position) vary per insertion. Mirrors - nuxt/components/CtaPricing.vue. - - Event/href/label come from src/_data/ctaDestinations.json - the single - source of truth shared with the Nuxt component. -#} -{% macro ctaPricing(variant, position, color=none, icon=false, uppercase=none, padded=false, extraClass='') %} -{%- set dest = ctaDestinations.pricing -%} -{{ ctaButton(dest.event, dest.href, dest.label, variant, position, color, icon, uppercase, padded, extraClass) }} -{%- endmacro %} diff --git a/src/_includes/components/cta/cta-sign-in.njk b/src/_includes/components/cta/cta-sign-in.njk deleted file mode 100644 index c020606fe0..0000000000 --- a/src/_includes/components/cta/cta-sign-in.njk +++ /dev/null @@ -1,16 +0,0 @@ -{% from "components/cta/cta-button.njk" import ctaButton %} -{# - Fixed destination, copy, and tracked event - only the look (variant) and - where it lives on the page (position) vary per insertion. Mirrors - nuxt/components/CtaSignIn.vue. - - Event/href-suffix/label come from src/_data/ctaDestinations.json - the - single source of truth shared with the Nuxt component. - - First 11ty usage to give the Sign In link any tracking at all - it - previously had no capture() call anywhere on the site. -#} -{% macro ctaSignIn(site, variant, position, color=none, icon=false, uppercase=none, padded=false, extraClass='') %} -{%- set dest = ctaDestinations.signIn -%} -{{ ctaButton(dest.event, site.appURL ~ dest.hrefSuffix, dest.label, variant, position, color, icon, uppercase, padded, extraClass) }} -{%- endmacro %} diff --git a/src/_includes/components/cta/cta-sign-up.njk b/src/_includes/components/cta/cta-sign-up.njk deleted file mode 100644 index 48bc53a31f..0000000000 --- a/src/_includes/components/cta/cta-sign-up.njk +++ /dev/null @@ -1,25 +0,0 @@ -{% from "components/cta/cta-button.njk" import ctaButton %} -{# - Fixed destination, copy, and tracked event - only the look (variant) and - where it lives on the page (position) vary per insertion. Mirrors - nuxt/components/CtaSignUp.vue. - - Event/href-suffix/label all come from src/_data/ctaDestinations.json - the - single source of truth shared with the Nuxt component, which imports the - same file - so the two never drift apart on those without both being - updated at once. - - `site` is passed explicitly (rather than relied on via `with context` - import) so this macro works the same regardless of how it's imported. - `ctaDestinations` isn't a parameter: it's a Nunjucks global (see - .eleventy.js), so it doesn't need one. -#} -{% macro ctaSignUp(site, variant, position, color=none, icon=false, uppercase=none, padded=false, extraClass='') %} -{#- Copy varies by placement, per the PostHog CTA analysis referenced in - CtaSignUp.vue: "Free Trial" in the nav, "Try it out" everywhere else. - Fixed lookup, not a caller-supplied prop, so callers can't reintroduce - arbitrary copy variants - only `position` decides. -#} -{%- set dest = ctaDestinations.signUp -%} -{%- set label = dest.navLabel if position in dest.navPositions else dest.label -%} -{{ ctaButton(dest.event, site.appURL ~ dest.hrefSuffix, label, variant, position, color, icon, uppercase, padded, extraClass) }} -{%- endmacro %} diff --git a/src/_includes/components/discord.njk b/src/_includes/components/discord.njk deleted file mode 100644 index ba083d1d8a..0000000000 --- a/src/_includes/components/discord.njk +++ /dev/null @@ -1,4 +0,0 @@ -<svg class="fill-current hover:text-red-hero h-5" width="22" height="17" viewBox="0 0 22 17" fill="none" xmlns="http://www.w3.org/2000/svg"> - <path d="M18.6361 1.39641C17.1907 0.734661 15.6648 0.265193 14.0973 0C13.8828 0.38343 13.6888 0.777928 13.5159 1.18184C11.8463 0.930252 10.1484 0.930252 8.47881 1.18184C8.30587 0.77797 8.1118 0.383476 7.8974 0C6.32897 0.267433 4.80205 0.738015 3.35518 1.39987C0.482757 5.64967 -0.29591 9.79391 0.0934235 13.8793C1.77558 15.1222 3.6584 16.0674 5.66003 16.6739C6.11074 16.0677 6.50956 15.4246 6.85226 14.7514C6.20135 14.5083 5.57311 14.2084 4.9748 13.8551C5.13227 13.7409 5.28627 13.6232 5.43508 13.509C7.17601 14.3277 9.07613 14.7522 11 14.7522C12.9238 14.7522 14.8239 14.3277 16.5648 13.509C16.7154 13.6319 16.8694 13.7495 17.0251 13.8551C16.4257 14.209 15.7963 14.5095 15.1442 14.7532C15.4865 15.426 15.8853 16.0686 16.3364 16.6739C18.3398 16.0698 20.224 15.1251 21.9065 13.881C22.3633 9.14329 21.1261 5.03711 18.6361 1.39641ZM7.34541 11.3668C6.26047 11.3668 5.36414 10.3822 5.36414 9.17097C5.36414 7.95971 6.22932 6.96648 7.34195 6.96648C8.45458 6.96648 9.34399 7.95971 9.32496 9.17097C9.30593 10.3822 8.45112 11.3668 7.34541 11.3668ZM14.6545 11.3668C13.5678 11.3668 12.675 10.3822 12.675 9.17097C12.675 7.95971 13.5401 6.96648 14.6545 6.96648C15.7689 6.96648 16.6514 7.95971 16.6323 9.17097C16.6133 10.3822 15.7602 11.3668 14.6545 11.3668Z"/> -</svg> - \ No newline at end of file diff --git a/src/_includes/components/divider-flow--top-grey.njk b/src/_includes/components/divider-flow--top-grey.njk deleted file mode 100644 index 4a6807d1fa..0000000000 --- a/src/_includes/components/divider-flow--top-grey.njk +++ /dev/null @@ -1,5 +0,0 @@ -<div class="ff-divider ff-divider--shallow"> - <svg xmlns="http://www.w3.org/2000/svg" width="1442" height="144" fill="none" viewBox="0 0 1442 144" preserveAspectRatio="none"> - <path fill="#374151" d="M0 0c498.518 0 866 144 1442 144H0V0z"/> - </svg> -</div> \ No newline at end of file diff --git a/src/_includes/components/divider-flow--top-red--dark.njk b/src/_includes/components/divider-flow--top-red--dark.njk deleted file mode 100644 index eae0aa4ee7..0000000000 --- a/src/_includes/components/divider-flow--top-red--dark.njk +++ /dev/null @@ -1,6 +0,0 @@ -<div class="ff-divider ff-divider--shallow"> - <svg xmlns="http://www.w3.org/2000/svg" width="1442" height="172" fill="none" viewBox="0 0 1442 172" preserveAspectRatio="none"> - <path fill="#BC3838" d="M0 172h414.325c147.535-40.967 259.941-58.893 262.567-59.31-2.726.428-124.054 18.996-359.155-27.05C79.934 39.062 0 0 0 0v172z"/> - <path fill="#1F2937" d="M726.395 105.629C484.848 138.752 242.394 172 0 172h1442V40c-237.01 0-475.86 32.753-715.605 65.629z"/> - </svg> -</div> \ No newline at end of file diff --git a/src/_includes/components/divider-flow--top-red--light.njk b/src/_includes/components/divider-flow--top-red--light.njk deleted file mode 100644 index 973b7cfc12..0000000000 --- a/src/_includes/components/divider-flow--top-red--light.njk +++ /dev/null @@ -1,6 +0,0 @@ -<div class="ff-divider ff-divider--shallow"> - <svg xmlns="http://www.w3.org/2000/svg" width="1442" height="172" fill="none" viewBox="0 0 1442 172" preserveAspectRatio="none"> - <path fill="#BC3838" d="M0 172h414.325c147.535-40.967 259.941-58.893 262.567-59.31-2.726.428-124.054 18.996-359.155-27.05C79.934 39.062 0 0 0 0v172z"/> - <path fill="#F9FAFB" d="M726.395 105.629C484.848 138.752 242.394 172 0 172h1442V40c-237.01 0-475.86 32.753-715.605 65.629z"/> - </svg> -</div> \ No newline at end of file diff --git a/src/_includes/components/divider-grey-wires-left--dark.njk b/src/_includes/components/divider-grey-wires-left--dark.njk deleted file mode 100644 index cbecceb14d..0000000000 --- a/src/_includes/components/divider-grey-wires-left--dark.njk +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 982 70"> - <path stroke="#374151" stroke-width="4" d="M982 35H0m773 0c-115 0-88 27-188 27m-99-27c-115 0-88 27-188 27"/> - <rect width="12" height="12" x="591" y="68" fill="#1F2937" stroke="#374151" stroke-width="4" rx="2" transform="rotate(180 591 68)"/> - <rect width="12" height="12" x="304" y="68" fill="#1F2937" stroke="#374151" stroke-width="4" rx="2" transform="rotate(180 304 68)"/> - <path stroke="#374151" stroke-width="4" d="M605 35C490 35 517 8 417 8"/> - <rect width="12" height="12" x="-2" y="2" fill="#1F2937" stroke="#374151" stroke-width="4" rx="2" transform="matrix(-1 0 0 1 421 0)"/> -</svg> diff --git a/src/_includes/components/divider-grey-wires-left.njk b/src/_includes/components/divider-grey-wires-left.njk deleted file mode 100644 index 4d551c1afe..0000000000 --- a/src/_includes/components/divider-grey-wires-left.njk +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 982 70"> - <path stroke="#E5E7EB" stroke-width="4" d="M982 35H0m773 0c-115 0-88 27-188 27m-99-27c-115 0-88 27-188 27"/> - <rect width="12" height="12" x="591" y="68" fill="#fff" stroke="#E5E7EB" stroke-width="4" rx="2" transform="rotate(180 591 68)"/> - <rect width="12" height="12" x="304" y="68" fill="#fff" stroke="#E5E7EB" stroke-width="4" rx="2" transform="rotate(180 304 68)"/> - <path stroke="#E5E7EB" stroke-width="4" d="M605 35C490 35 517 8 417 8"/> - <rect width="12" height="12" x="-2" y="2" fill="#fff" stroke="#E5E7EB" stroke-width="4" rx="2" transform="matrix(-1 0 0 1 421 0)"/> -</svg> diff --git a/src/_includes/components/divider-grey-wires-right--dark.njk b/src/_includes/components/divider-grey-wires-right--dark.njk deleted file mode 100644 index fd5bdc9046..0000000000 --- a/src/_includes/components/divider-grey-wires-right--dark.njk +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 982 70"> - <path stroke="#374151" stroke-width="4" d="M0 35h982m-773 0c115 0 88-27 188-27m99 27c115 0 88-27 188-27"/> - <rect width="12" height="12" x="391" y="2" fill="#1F2937" stroke="#374151" stroke-width="4" rx="2"/> - <rect width="12" height="12" x="678" y="2" fill="#1F2937" stroke="#374151" stroke-width="4" rx="2"/> - <path stroke="#374151" stroke-width="4" d="M377 35c115 0 88 27 188 27"/> - <rect width="12" height="12" x="2" y="-2" fill="#1F2937" stroke="#374151" stroke-width="4" rx="2" transform="matrix(1 0 0 -1 557 66)"/> -</svg> diff --git a/src/_includes/components/divider-grey-wires-right.njk b/src/_includes/components/divider-grey-wires-right.njk deleted file mode 100644 index 81b5b8cc4e..0000000000 --- a/src/_includes/components/divider-grey-wires-right.njk +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 982 70"> - <path stroke="#E5E7EB" stroke-width="4" d="M0 35h982m-773 0c115 0 88-27 188-27m99 27c115 0 88-27 188-27"/> - <rect width="12" height="12" x="391" y="2" fill="#fff" stroke="#E5E7EB" stroke-width="4" rx="2"/> - <rect width="12" height="12" x="678" y="2" fill="#fff" stroke="#E5E7EB" stroke-width="4" rx="2"/> - <path stroke="#E5E7EB" stroke-width="4" d="M377 35c115 0 88 27 188 27"/> - <rect width="12" height="12" x="2" y="-2" fill="#fff" stroke="#E5E7EB" stroke-width="4" rx="2" transform="matrix(1 0 0 -1 557 66)"/> -</svg> diff --git a/src/_includes/components/dividers/divider-flow--top-grey.svg b/src/_includes/components/dividers/divider-flow--top-grey.svg deleted file mode 100644 index 5440c54f1e..0000000000 --- a/src/_includes/components/dividers/divider-flow--top-grey.svg +++ /dev/null @@ -1,3 +0,0 @@ - <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 1442 144" preserveAspectRatio="none"> - <path fill="currentColor" d="M0 0c498.518 0 866 144 1442 144H0V0z"/> - </svg> \ No newline at end of file diff --git a/src/_includes/components/dividers/light-grey-curve-inverted.svg b/src/_includes/components/dividers/light-grey-curve-inverted.svg deleted file mode 100644 index 681e7cbf5d..0000000000 --- a/src/_includes/components/dividers/light-grey-curve-inverted.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg viewBox="0 0 1440 42" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M1440 42C1440 42 1260 13.6494 705.498 13.6493C150.998 13.6493 0 41.9999 0 41.9999L3.62803e-06 0.5L1440 0.500126L1440 42Z" fill="currentColor"/> -</svg> diff --git a/src/_includes/components/dividers/light-grey-curve.svg b/src/_includes/components/dividers/light-grey-curve.svg deleted file mode 100644 index 9a8adc6e22..0000000000 --- a/src/_includes/components/dividers/light-grey-curve.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg viewBox="0 0 1440 43" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M0 0C0 0 180 28.3506 734.5 28.3506C1289 28.3506 1440 0 1440 0V42.5H0V0Z" fill="currentColor"/> -</svg> diff --git a/src/_includes/components/dividers/light-white-curve.svg b/src/_includes/components/dividers/light-white-curve.svg deleted file mode 100644 index 49672d0508..0000000000 --- a/src/_includes/components/dividers/light-white-curve.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg viewBox="0 0 1440 43" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M1440.5 0.5H0.5V43H1440.5V0.5Z" fill="white"/> -<path d="M0.5 0.5C0.5 0.5 180.5 28.85 735 28.85C1289.5 28.85 1440.5 0.5 1440.5 0.5V43H0.5V0.5Z" fill="#F9F8FB"/> -</svg> diff --git a/src/_includes/components/external.njk b/src/_includes/components/external.njk deleted file mode 100644 index 2f3c891902..0000000000 --- a/src/_includes/components/external.njk +++ /dev/null @@ -1,3 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full"> - <path stroke-linecap="round" stroke-linejoin="round" d="M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25" /> -</svg> diff --git a/src/_includes/components/facebook.njk b/src/_includes/components/facebook.njk deleted file mode 100644 index 832935d85d..0000000000 --- a/src/_includes/components/facebook.njk +++ /dev/null @@ -1 +0,0 @@ -<svg class="fill-current h-5 hover:text-red-hero" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M21.4286 0H2.57143C1.88944 0 1.23539 0.270918 0.753154 0.753154C0.270918 1.23539 0 1.88944 0 2.57143L0 21.4286C0 22.1106 0.270918 22.7646 0.753154 23.2468C1.23539 23.7291 1.88944 24 2.57143 24H9.92411V15.8405H6.54911V12H9.92411V9.07286C9.92411 5.74339 11.9063 3.90429 14.9421 3.90429C16.3961 3.90429 17.9164 4.16357 17.9164 4.16357V7.43143H16.2413C14.5907 7.43143 14.0759 8.45571 14.0759 9.50625V12H17.7605L17.1713 15.8405H14.0759V24H21.4286C22.1106 24 22.7646 23.7291 23.2468 23.2468C23.7291 22.7646 24 22.1106 24 21.4286V2.57143C24 1.88944 23.7291 1.23539 23.2468 0.753154C22.7646 0.270918 22.1106 0 21.4286 0Z"/></svg> diff --git a/src/_includes/components/feature-addon.svg b/src/_includes/components/feature-addon.svg deleted file mode 100644 index bf019016f6..0000000000 --- a/src/_includes/components/feature-addon.svg +++ /dev/null @@ -1 +0,0 @@ -<svg title="Add On" class="ff-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M12 4v16m8-8H4"/></svg> \ No newline at end of file diff --git a/src/_includes/components/feature-check.svg b/src/_includes/components/feature-check.svg deleted file mode 100644 index 53eb9d6a4a..0000000000 --- a/src/_includes/components/feature-check.svg +++ /dev/null @@ -1 +0,0 @@ -<svg title="Available Now" class="ff-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" d="M5 13l4 4L19 7"/></svg> \ No newline at end of file diff --git a/src/_includes/components/feature-optional.svg b/src/_includes/components/feature-optional.svg deleted file mode 100644 index c854ad7c16..0000000000 --- a/src/_includes/components/feature-optional.svg +++ /dev/null @@ -1 +0,0 @@ -<svg fill="none" title="Optional" viewBox="-2 -2 32 32" xmlns="http://www.w3.org/2000/svg"><path d="m7.97 9c.733-1.553 2.707-2.667 5.03-2.667 2.947 0 5.333 1.791 5.333 4 0 1.867-1.704 3.434-4.008 3.876-.722.139-1.325.72-1.325 1.458m0 4h.013m11.987-6.667a12 12 0 1 1 -24.002 0 12 12 0 0 1 24.002 0z" stroke-linecap="round" stroke-linejoin="round"/></svg> \ No newline at end of file diff --git a/src/_includes/components/feature-time.svg b/src/_includes/components/feature-time.svg deleted file mode 100644 index b05146d582..0000000000 --- a/src/_includes/components/feature-time.svg +++ /dev/null @@ -1 +0,0 @@ -<svg title="On the Roadmap" class="ff-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> \ No newline at end of file diff --git a/src/_includes/components/ff-logo--wordmark--grey.svg b/src/_includes/components/ff-logo--wordmark--grey.svg deleted file mode 100644 index cc8224d1b7..0000000000 --- a/src/_includes/components/ff-logo--wordmark--grey.svg +++ /dev/null @@ -1,28 +0,0 @@ -<svg class="max-h-full w-full" viewBox="0 0 402 70" fill="none" xmlns="http://www.w3.org/2000/svg"> -<mask id="mask0_174_1492" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="402" height="70"> -<path d="M402 0H0V70H402V0Z" fill="white"/> -</mask> -<g mask="url(#mask0_174_1492)"> -<mask id="mask1_174_1492" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="402" height="70"> -<path d="M402 0.0299988H0V69.97H402V0.0299988Z" fill="white"/> -</mask> -<g mask="url(#mask1_174_1492)"> -<mask id="mask2_174_1492" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="402" height="70"> -<path d="M402 0.0299988H0V69.97H402V0.0299988Z" fill="white"/> -</mask> -<g mask="url(#mask2_174_1492)"> -<path d="M118.949 9.94H95.2691C93.6191 9.94 92.2391 10.49 91.4191 11.32C90.3191 12.42 90.0391 13.52 90.0391 15.17V55.65C90.0391 57.3 90.5891 58.4 91.4191 59.23C92.2491 60.06 93.6191 60.33 95.5491 60.33C96.3791 60.33 97.4791 60.33 98.2991 60.05C99.1291 60.05 99.6791 59.77 100.229 59.77V40.22H113.719C114.819 40.22 115.649 39.94 116.469 39.12C117.019 38.29 117.569 37.47 117.569 36.09C117.569 35.26 117.569 34.44 117.289 33.89C117.009 33.34 116.739 32.79 116.459 32.24H100.489V18.2H116.739C117.839 18.2 118.669 17.92 119.489 17.1C120.039 16.27 120.589 15.17 120.589 13.8C120.589 12.97 120.589 12.15 120.309 11.6C119.479 10.77 119.209 10.5 118.929 9.95" fill="#1F2937"/> -<path d="M131.06 9.94C130.23 9.94 129.41 9.94 128.58 10.22C127.75 10.5 127.2 10.5 126.65 10.5V55.38C126.65 57.03 127.2 58.13 128.03 58.96C128.86 59.51 130.23 60.06 132.16 60.06C133.26 60.06 134.09 60.06 134.91 59.78C135.74 59.78 136.29 59.5 136.84 59.23V14.62C136.84 12.97 136.29 11.87 135.46 11.04C134.08 10.21 132.71 9.94 131.05 9.94" fill="#1F2937"/> -<path d="M175.39 22.61C172.36 20.96 168.78 20.13 164.93 20.13C161.08 20.13 157.5 20.96 154.47 22.61C151.44 24.26 149.24 26.74 147.31 29.77C145.66 32.8 144.83 36.38 144.83 40.51C144.83 44.64 145.66 48.22 147.31 51.25C148.96 54.28 151.16 56.48 154.19 58.13C157.22 59.78 160.8 60.61 164.65 60.61C168.78 60.61 172.36 59.78 175.11 58.13C178.14 56.48 180.34 54 181.99 50.97C183.64 47.94 184.47 44.36 184.47 40.23C184.47 36.1 183.64 32.52 181.99 29.49C180.89 26.74 178.41 24.26 175.38 22.61M172.36 49.59C170.71 51.79 168.23 52.89 165.2 52.89C162.17 52.89 159.69 51.79 158.04 49.59C156.39 47.39 155.29 44.36 155.29 40.23C155.29 36.38 156.12 33.35 158.04 30.87C159.69 28.67 162.17 27.57 165.2 27.57C168.23 27.57 170.71 28.67 172.36 30.87C174.01 33.07 175.11 36.1 175.11 40.23C174.83 44.36 174.01 47.39 172.36 49.59Z" fill="#1F2937"/> -<path d="M281.949 9.94H258.269C256.619 9.94 255.239 10.49 254.419 11.32C253.319 12.42 253.039 13.52 253.039 15.17V55.65C253.039 57.3 253.589 58.4 254.419 59.23C255.249 60.06 256.619 60.33 258.549 60.33C259.379 60.33 260.479 60.33 261.299 60.05C262.129 60.05 262.679 59.77 263.229 59.77V40.22H276.719C277.819 40.22 278.649 39.94 279.469 39.12C280.019 38.29 280.569 37.47 280.569 36.09C280.569 35.26 280.569 34.44 280.289 33.89C280.009 33.34 279.739 32.79 279.459 32.24H263.489V18.2H279.739C280.839 18.2 281.669 17.92 282.489 17.1C283.039 16.27 283.589 15.17 283.589 13.8C283.589 12.97 283.589 12.15 283.309 11.6C282.479 10.77 282.209 10.5 281.929 9.95" fill="#1F2937"/> -<path d="M243.95 21.51C243.12 20.96 242.02 20.68 240.65 20.68C239 20.68 237.62 20.96 236.24 21.78C235.41 26.74 234.59 31.69 233.49 36.92C232.39 41.88 231.56 46.83 230.46 51.24H230.18C229.9 50.14 229.35 48.21 228.8 45.46C227.97 42.98 227.15 39.95 226.32 36.65C225.22 33.35 224.39 30.04 223.29 26.46C223.01 25.36 222.46 24.81 221.36 24.26C220.53 23.71 219.16 23.71 217.78 23.71C216.68 23.71 215.85 23.71 215.03 23.99C214.21 24.27 213.38 24.54 212.83 25.09C211.73 28.67 210.63 32.25 209.53 35.83C208.43 39.41 207.6 42.44 206.78 45.19C205.96 47.94 205.4 49.87 205.13 51.25H204.85C204.57 50.42 204.3 49.05 204.02 47.4C203.74 45.75 203.19 43.82 202.64 41.62C202.09 39.42 201.54 36.94 201.26 33.91C200.71 31.16 200.16 28.13 199.88 25.1C199.6 23.45 199.05 22.35 198.23 21.8C197.4 21.25 196.3 20.7 194.93 20.7C193.83 20.7 192.73 20.98 191.9 21.25C190.52 21.53 189.97 22.08 189.42 22.63C189.7 24.56 190.25 27.04 190.8 29.79C191.35 32.54 191.9 35.3 192.73 38.05C193.28 40.8 194.11 43.56 194.66 46.31C195.21 49.06 196.04 51.27 196.59 53.19C197.14 55.12 197.69 56.77 198.24 57.87C198.79 58.7 199.34 59.52 200.72 59.8C201.82 60.35 203.2 60.35 204.57 60.35C205.94 60.35 207.05 60.35 207.87 60.07C208.7 59.79 209.52 59.52 210.07 58.97C210.62 57.32 211.45 54.84 212.27 52.36C213.1 49.61 214.2 46.85 215.02 43.82C215.85 40.79 216.95 37.76 217.5 34.73C218.33 37.76 219.15 40.51 219.98 43.54C220.81 46.57 221.63 49.32 222.46 51.8C223.29 54.28 224.11 56.48 224.66 58.13C225.21 59.78 227.14 60.61 230.44 60.61C231.82 60.61 232.92 60.33 233.74 60.06C234.84 59.78 235.67 59.51 235.94 58.96C236.49 57.86 236.77 56.48 237.59 54.55C238.14 52.62 238.69 50.7 239.52 48.22C240.07 46.02 240.9 43.54 241.45 41.06C242 38.58 242.55 36.1 243.1 33.9C243.65 31.7 243.93 29.77 244.48 28.12C244.76 26.47 245.03 25.09 245.03 24.54C245.31 22.89 244.75 22.06 243.93 21.51" fill="#1F2937"/> -<path d="M316.92 20.68C316.09 20.68 315.27 20.68 314.44 20.96C313.61 21.24 313.06 21.24 312.51 21.24V50.98C311.96 51.26 310.86 51.81 309.76 52.08C308.66 52.36 307.01 52.63 305.35 52.63C302.6 52.63 300.67 52.08 299.02 50.7C297.64 49.32 296.82 47.4 296.82 44.64V25.37C296.82 23.72 296.27 22.34 295.44 21.79C294.61 21.24 293.24 20.69 291.31 20.69C290.21 20.69 289.38 20.69 288.56 20.97C287.73 21.25 287.18 21.25 286.91 21.25V44.65C286.91 48.23 287.74 51.26 289.11 53.74C290.49 55.94 292.69 57.87 295.44 58.97C298.19 60.07 301.5 60.62 305.08 60.62C308.11 60.62 310.86 60.34 313.34 59.79C315.82 59.24 317.75 58.41 319.12 57.59C320.22 56.76 321.05 56.21 321.6 55.39C322.15 54.56 322.15 53.46 322.15 52.36V25.38C322.15 23.73 321.6 22.35 320.77 21.8C319.94 20.97 318.84 20.7 316.92 20.7" fill="#1F2937"/> -<path d="M347.76 36.65L343.63 35.55C341.98 35.27 340.88 34.72 340.05 33.9C339.22 33.35 338.95 32.52 338.95 31.42C338.95 30.04 339.5 29.22 340.88 28.39C341.98 27.84 343.91 27.29 345.84 27.29C347.22 27.29 348.59 27.57 349.97 27.84C351.35 28.12 352.72 28.39 353.82 28.94C354.92 29.49 355.75 29.77 356.57 30.32C357.12 29.77 357.67 29.22 357.95 28.67C358.23 27.84 358.5 27.29 358.5 26.19C358.5 24.81 357.95 23.71 356.85 22.89C355.75 22.06 354.1 21.24 352.17 20.69C350.24 20.14 347.76 19.86 345.29 19.86C340.33 19.86 336.48 20.96 333.73 23.16C330.98 25.36 329.6 28.12 329.6 31.42C329.6 34.45 330.43 36.93 332.35 38.58C334.28 40.51 337.03 41.88 340.89 42.71L345.57 43.81C347.22 44.09 348.6 44.64 349.42 45.46C350.25 46.29 350.52 47.11 350.52 48.49C350.52 51.24 348.32 52.9 343.64 52.9C341.16 52.9 338.96 52.62 336.76 51.8C334.83 50.97 332.91 50.15 331.53 49.05C330.7 49.6 330.15 50.15 329.88 50.98C329.33 51.81 329.33 52.63 329.33 53.46C329.33 55.66 330.71 57.31 333.46 58.69C336.21 60.07 339.79 60.62 344.2 60.62C349.43 60.62 353.56 59.52 356.32 57.32C359.08 55.12 360.45 52.36 360.45 48.51C360.45 45.48 359.35 42.73 357.42 40.8C355.22 39.15 352.19 37.5 347.78 36.67L347.76 36.65Z" fill="#1F2937"/> -<path d="M400.899 40.23C401.729 39.4 401.999 38.3 401.999 36.93C401.999 33.63 401.169 30.87 399.799 28.39C398.429 25.91 396.219 23.98 393.469 22.33C390.719 20.95 387.689 20.13 384.109 20.13C381.629 20.13 379.149 20.68 376.679 21.51C374.479 22.34 372.269 23.71 370.619 25.36C368.969 27.01 367.589 29.21 366.489 31.69C365.389 34.17 365.109 37.2 365.109 40.23C365.109 44.64 365.939 48.49 367.859 51.52C369.509 54.55 372.269 57.03 375.289 58.4C378.589 60.05 382.169 60.6 386.299 60.6C389.049 60.6 391.259 60.32 393.459 59.77C395.659 59.22 397.309 58.39 398.419 57.57C399.799 56.47 400.349 55.37 400.349 53.99C400.349 53.16 400.069 52.34 399.799 51.51C399.249 50.68 398.699 50.13 398.149 49.86C397.049 50.69 395.399 51.51 393.469 52.06C391.539 52.61 389.339 53.16 387.139 53.16C383.839 53.16 380.809 52.33 378.599 50.68C376.949 49.3 375.569 47.38 375.019 44.9L397.599 41.6C398.979 41.32 400.079 41.05 400.899 40.22V40.23ZM374.469 38.03C374.749 34.73 375.569 32.25 377.219 30.32C379.149 28.39 381.349 27.29 384.099 27.29C386.849 27.29 388.779 28.12 390.429 29.49C391.809 31.14 392.629 32.79 392.909 35L374.459 38.03H374.469Z" fill="#1F2937"/> -<path d="M38.5508 42.16C45.7108 45.19 52.5908 48.77 60.0308 50.42C63.3308 50.97 66.6408 51.25 69.9408 51.25V33.08H67.1908C57.0008 33.08 47.6408 38.31 38.5508 42.17" fill="#1F2937"/> -<path d="M17.35 47.94C14.05 47.66 10.74 47.66 7.44 47.66H0V64.46C0 67.49 2.48 69.97 5.51 69.97H64.71C67.74 69.97 70.22 67.49 70.22 64.46V62.26C63.06 62.26 55.63 61.43 49.02 58.68C38.28 55.1 28.64 48.22 17.36 47.94" fill="#1F2937"/> -<path d="M64.43 0.0299988H5.51C2.48 0.0299988 0 2.51 0 5.54V36.65C6.61 36.65 13.49 36.93 20.1 36.37C29.19 35.54 37.17 30.59 45.71 27.28C53.42 23.98 61.68 22.05 69.94 22.32V5.54C69.94 2.51 67.46 0.0299988 64.43 0.0299988Z" fill="#1F2937"/> -</g> -</g> -</g> -</svg> diff --git a/src/_includes/components/flowfuse-square.svg b/src/_includes/components/flowfuse-square.svg deleted file mode 100644 index 7ce1777f2d..0000000000 --- a/src/_includes/components/flowfuse-square.svg +++ /dev/null @@ -1,2 +0,0 @@ -<svg enable-background="new 0 0 79.4 79.4" viewBox="0 0 79.4 79.4" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="ffWaveSquare" gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="79.4" y2="0"><stop offset="0" stop-color="#DA3D0B"/><stop offset="0.25" stop-color="#DA3D0B"/><stop offset="0.5" stop-color="#DA3D0B"/><stop offset="0.75" stop-color="#DA3D0B"/><stop offset="1" stop-color="#DA3D0B"/></linearGradient></defs><path fill-rule="evenodd" clip-rule="evenodd" d="M6.28751 0H73.5639C77.022 0 79.8514 2.83457 79.8514 6.29905V25.5112C70.4201 25.1962 60.9888 27.4009 52.1863 31.1803C49.3488 32.2807 46.5646 33.5413 43.7871 34.7989C37.0251 37.8605 30.3032 40.904 22.9494 41.5737C17.2809 42.047 11.435 41.9869 5.67825 41.9277C3.77251 41.9082 1.87653 41.8887 0 41.8887V6.29905C0 2.83457 2.82938 0 6.28751 0ZM44.0131 48.1865C45.9468 49.0061 47.863 49.861 49.7741 50.7136L49.7742 50.7136C55.9409 53.4649 62.0544 56.1924 68.5343 57.635C72.3069 58.2649 76.0794 58.5799 79.8519 58.5799V37.793H76.7081C67.2021 37.793 58.326 41.7897 49.7365 45.6572L49.7363 45.6573C47.8155 46.5222 45.909 47.3806 44.0131 48.1865ZM19.8057 54.8032C16.0332 54.4883 12.2606 54.4883 8.48814 54.4883H0V73.7004C0 77.1649 2.82938 79.9994 6.28751 79.9994H73.8782C77.3364 79.9994 80.1657 77.1649 80.1657 73.7004V71.1808C71.992 71.1808 63.5038 70.2359 55.9588 67.0864C51.7804 65.691 47.7481 63.8567 43.7373 62.0322L43.7373 62.0322C35.9794 58.5031 28.3023 55.0108 19.8057 54.8032Z" fill="url(#ffWaveSquare)"/> -<path d="M79.8514 37.7939V25.1958C70.4201 24.8808 60.9888 27.0855 52.1863 30.8649C42.4407 34.6444 33.3238 40.3135 22.9494 41.2584C15.4044 41.8883 7.54501 41.5733 0 41.5733V54.4864H8.48814C12.2606 54.4864 16.0331 54.4864 19.8057 54.8013C32.695 55.1163 43.6982 62.9901 55.6445 67.0845C63.1895 70.234 71.6776 71.1789 79.8514 71.1789V58.5807C76.0789 58.5807 72.3064 58.2658 68.5338 57.6359C60.0457 55.7462 52.1863 51.6518 44.0126 48.1873C54.387 43.778 65.0757 37.7939 76.7076 37.7939H79.8514Z" fill="white"/></svg> \ No newline at end of file diff --git a/src/_includes/components/flowfuse-wordmark-footer.njk b/src/_includes/components/flowfuse-wordmark-footer.njk deleted file mode 100644 index 38ebde749b..0000000000 --- a/src/_includes/components/flowfuse-wordmark-footer.njk +++ /dev/null @@ -1,58 +0,0 @@ -<svg class="h-full w-full" viewBox="0 0 402 70" xmlns="http://www.w3.org/2000/svg"> - <defs> - <linearGradient id="ffWaveWordmarkFooter" gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="402" y2="0"> - <stop offset="0" stop-color="#1F2937" /> - <stop offset="0.25" stop-color="#1F2937" /> - <stop offset="0.5" stop-color="#1F2937" /> - <stop offset="0.75" stop-color="#1F2937" /> - <stop offset="1" stop-color="#1F2937" /> - </linearGradient> - </defs> - <mask id="ffFooterMask0" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="402" height="70"> - <path d="M402 0H0V70H402V0Z" fill="white" /> - </mask> - <g mask="url(#ffFooterMask0)"> - <mask id="ffFooterMask1" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="402" - height="70"> - <path d="M402 0H0V70H402V0Z" fill="white" /> - </mask> - <g mask="url(#ffFooterMask1)"> - <path - d="M118.95 9.98H95.3695C93.7495 9.98 92.4595 10.47 91.4795 11.44C90.4995 12.41 90.0195 13.71 90.0195 15.32V55.38C90.0195 57.05 90.4495 58.24 91.3095 58.94C92.1695 59.64 93.5495 59.99 95.4395 59.99C96.3595 59.99 97.2495 59.92 98.1095 59.79C98.9695 59.66 99.6195 59.53 100.05 59.43V39.87H113.6C114.73 39.87 115.62 39.51 116.27 38.78C116.92 38.05 117.24 37.01 117.24 35.66C117.24 34.85 117.12 34.11 116.88 33.43C116.64 32.76 116.38 32.2 116.11 31.77H100.05V18.15H116.35C117.48 18.15 118.37 17.79 119.02 17.06C119.67 16.33 119.99 15.27 119.99 13.86C119.99 13.05 119.88 12.3 119.67 11.59C119.45 10.89 119.21 10.35 118.94 9.97" - fill="url(#ffWaveWordmarkFooter)" /> - <path - d="M130.979 9.98001C130.059 9.98001 129.199 10.06 128.389 10.22C127.579 10.38 126.959 10.52 126.529 10.62V55.53C126.529 57.2 126.969 58.36 127.859 59.01C128.749 59.66 130.079 59.98 131.869 59.98C132.839 59.98 133.719 59.91 134.499 59.78C135.279 59.65 135.889 59.5 136.319 59.34V14.52C136.319 12.85 135.889 11.68 135.029 11C134.169 10.33 132.819 9.99001 130.979 9.99001" - fill="url(#ffWaveWordmarkFooter)" /> - <path - d="M175.521 22.61C172.531 20.94 169.041 20.1 165.041 20.1C161.041 20.1 157.611 20.94 154.601 22.61C151.591 24.28 149.241 26.63 147.571 29.65C145.901 32.67 145.061 36.26 145.061 40.41C145.061 44.56 145.881 48.15 147.531 51.17C149.171 54.19 151.501 56.53 154.521 58.17C157.531 59.81 161.041 60.64 165.041 60.64C169.041 60.64 172.611 59.82 175.601 58.17C178.591 56.52 180.901 54.18 182.551 51.13C184.191 48.08 185.011 44.51 185.011 40.41C185.011 36.31 184.171 32.67 182.501 29.65C180.831 26.63 178.501 24.28 175.511 22.61M172.271 49.6C170.521 51.78 168.111 52.88 165.041 52.88C161.971 52.88 159.561 51.8 157.811 49.65C156.061 47.49 155.181 44.42 155.181 40.42C155.181 36.42 156.071 33.41 157.851 31.19C159.631 28.98 162.031 27.87 165.041 27.87C168.051 27.87 170.521 28.98 172.271 31.19C174.021 33.4 174.901 36.48 174.901 40.42C174.901 44.36 174.021 47.42 172.271 49.6Z" - fill="url(#ffWaveWordmarkFooter)" /> - <path - d="M281.95 9.98H258.37C256.75 9.98 255.46 10.47 254.48 11.44C253.51 12.41 253.02 13.71 253.02 15.32V55.38C253.02 57.05 253.45 58.24 254.31 58.94C255.17 59.64 256.55 59.99 258.44 59.99C259.36 59.99 260.25 59.92 261.11 59.79C261.97 59.66 262.62 59.53 263.05 59.43V39.87H276.6C277.73 39.87 278.62 39.51 279.27 38.78C279.92 38.05 280.24 37.01 280.24 35.66C280.24 34.85 280.12 34.11 279.88 33.43C279.64 32.76 279.38 32.2 279.11 31.77H263.05V18.15H279.35C280.48 18.15 281.37 17.79 282.02 17.06C282.67 16.33 282.99 15.27 282.99 13.86C282.99 13.05 282.88 12.3 282.67 11.59C282.45 10.89 282.21 10.35 281.94 9.97" - fill="url(#ffWaveWordmarkFooter)" /> - <path - d="M243.98 21.39C243.12 20.8 242.01 20.5 240.66 20.5C239.04 20.5 237.59 20.88 236.29 21.63C235.59 26.59 234.71 31.61 233.66 36.68C232.61 41.75 231.59 46.53 230.62 51H230.22C229.95 49.76 229.45 47.87 228.72 45.34C227.99 42.81 227.14 39.91 226.17 36.64C225.2 33.38 224.17 30.02 223.09 26.56C222.77 25.59 222.13 24.87 221.19 24.42C220.25 23.96 219.08 23.73 217.67 23.73C216.59 23.73 215.64 23.84 214.83 24.05C214.02 24.27 213.26 24.59 212.56 25.02C211.48 28.63 210.42 32.2 209.36 35.7C208.31 39.21 207.39 42.32 206.61 45.05C205.83 47.77 205.27 49.76 204.95 51H204.63C204.41 50.14 204.11 48.88 203.74 47.24C203.36 45.6 202.93 43.64 202.45 41.37C201.96 39.1 201.46 36.57 200.95 33.76C200.44 30.95 199.94 28.01 199.46 24.94C199.19 23.32 198.65 22.18 197.84 21.5C197.03 20.83 195.92 20.49 194.52 20.49C193.39 20.49 192.37 20.71 191.48 21.14C190.59 21.57 189.88 22.06 189.34 22.6C189.72 24.65 190.19 27 190.76 29.64C191.33 32.28 191.95 35.01 192.62 37.81C193.29 40.62 193.97 43.33 194.64 45.94C195.31 48.56 195.97 50.86 196.62 52.86C197.27 54.86 197.84 56.4 198.32 57.47C198.75 58.33 199.53 59 200.67 59.45C201.8 59.91 203.1 60.14 204.56 60.14C205.85 60.14 206.95 60 207.84 59.73C208.73 59.46 209.44 59.11 209.99 58.68C210.64 56.9 211.4 54.67 212.29 52C213.18 49.33 214.1 46.44 215.04 43.34C215.98 40.24 216.83 37.2 217.59 34.24C218.4 37.15 219.23 40.11 220.09 43.1C220.95 46.09 221.8 48.87 222.64 51.44C223.48 54 224.22 56.09 224.87 57.71C225.41 59.33 227.33 60.14 230.61 60.14C231.85 60.14 233 59.99 234.05 59.69C235.1 59.4 235.88 59.06 236.36 58.68C236.79 57.6 237.3 56.15 237.9 54.31C238.49 52.48 239.13 50.4 239.8 48.08C240.47 45.76 241.14 43.36 241.78 40.88C242.43 38.4 243 36.05 243.52 33.84C244.03 31.63 244.45 29.67 244.78 27.97C245.1 26.27 245.26 25.07 245.26 24.37C245.26 22.97 244.83 21.97 243.97 21.38" - fill="url(#ffWaveWordmarkFooter)" /> - <path - d="M316.89 20.67C315.97 20.67 315.11 20.75 314.3 20.91C313.49 21.07 312.87 21.21 312.44 21.31V51.17C311.79 51.55 310.87 51.91 309.69 52.26C308.5 52.61 307.05 52.78 305.32 52.78C302.62 52.78 300.52 52.15 299.01 50.88C297.5 49.61 296.74 47.55 296.74 44.69V25.27C296.74 23.49 296.32 22.28 295.48 21.63C294.64 20.98 293.31 20.66 291.47 20.66C290.5 20.66 289.61 20.74 288.8 20.9C287.99 21.06 287.4 21.2 287.02 21.3V44.85C287.02 48.52 287.75 51.51 289.2 53.83C290.66 56.15 292.76 57.85 295.51 58.93C298.26 60.01 301.5 60.55 305.22 60.55C308.3 60.55 311.02 60.24 313.4 59.62C315.77 59 317.71 58.23 319.22 57.32C320.35 56.62 321.14 55.86 321.57 55.06C322 54.25 322.22 53.23 322.22 51.98V25.27C322.22 23.49 321.79 22.28 320.93 21.63C320.07 20.98 318.72 20.66 316.88 20.66" - fill="url(#ffWaveWordmarkFooter)" /> - <path - d="M347.659 36.62L343.449 35.57C341.779 35.19 340.589 34.67 339.889 33.99C339.189 33.32 338.839 32.52 338.839 31.6C338.839 30.3 339.459 29.32 340.699 28.64C341.939 27.97 343.609 27.63 345.719 27.63C347.119 27.63 348.509 27.78 349.889 28.07C351.269 28.37 352.519 28.74 353.649 29.2C354.779 29.66 355.669 30.1 356.319 30.53C356.909 30.1 357.409 29.53 357.819 28.83C358.219 28.13 358.429 27.32 358.429 26.4C358.429 25.05 357.849 23.91 356.689 22.96C355.529 22.02 353.939 21.29 351.909 20.78C349.889 20.27 347.579 20.01 344.989 20.01C340.019 20.01 336.169 21.1 333.419 23.29C330.669 25.48 329.289 28.24 329.289 31.59C329.289 34.61 330.219 37.04 332.079 38.87C333.939 40.71 336.809 42.05 340.699 42.92L345.469 44.13C347.199 44.51 348.459 45.06 349.269 45.79C350.079 46.52 350.479 47.5 350.479 48.74C350.479 51.6 348.159 53.03 343.519 53.03C340.979 53.03 338.719 52.64 336.719 51.86C334.719 51.08 332.969 50.2 331.459 49.23C330.759 49.72 330.189 50.33 329.759 51.09C329.329 51.85 329.109 52.68 329.109 53.6C329.109 55.71 330.489 57.4 333.239 58.7C335.989 60 339.519 60.64 343.839 60.64C349.119 60.64 353.159 59.57 355.939 57.44C358.719 55.31 360.109 52.38 360.109 48.66C360.109 45.53 359.119 42.99 357.149 41.02C355.179 39.05 352.009 37.58 347.639 36.61" - fill="url(#ffWaveWordmarkFooter)" /> - <path - d="M400.87 40.23C401.63 39.5 402 38.38 402 36.87C402 33.63 401.24 30.75 399.73 28.21C398.22 25.67 396.13 23.68 393.46 22.22C390.79 20.76 387.7 20.04 384.19 20.04C381.6 20.04 379.16 20.46 376.87 21.29C374.58 22.12 372.55 23.38 370.8 25.05C369.05 26.72 367.67 28.8 366.67 31.28C365.67 33.76 365.17 36.65 365.17 39.94C365.17 44.47 366.06 48.27 367.84 51.35C369.62 54.43 372.12 56.73 375.32 58.27C378.53 59.81 382.21 60.58 386.37 60.58C389.07 60.58 391.45 60.31 393.53 59.77C395.61 59.23 397.26 58.46 398.51 57.46C399.75 56.46 400.37 55.29 400.37 53.94C400.37 53.08 400.14 52.28 399.68 51.55C399.22 50.82 398.64 50.24 397.94 49.81C396.75 50.62 395.2 51.36 393.29 52.04C391.37 52.71 389.29 53.05 387.02 53.05C383.62 53.05 380.82 52.21 378.6 50.54C376.85 49.22 375.65 47.31 374.98 44.84L397.69 41.55C399.04 41.39 400.09 40.95 400.85 40.22M374.36 37.99C374.53 34.74 375.47 32.2 377.2 30.39C379.06 28.45 381.39 27.48 384.2 27.48C387.01 27.48 388.98 28.25 390.43 29.79C391.89 31.33 392.69 33.15 392.86 35.25L374.36 37.99Z" - fill="url(#ffWaveWordmarkFooter)" /> - <path - d="M38.6096 42.28C45.7596 45.31 52.6296 48.9 60.0596 50.56C63.3596 51.11 66.7096 51.38 69.9996 51.38V33.16H67.2496C57.0696 33.16 47.6796 38.41 38.5996 42.27" - fill="url(#ffWaveWordmarkFooter)" /> - <path - d="M17.43 48.08C14.13 47.81 10.82 47.81 7.53 47.81H0V64.54C0 67.56 2.45 70.01 5.47 70.01H64.53C67.55 70.01 70 67.56 70 64.54V62.43C62.86 62.43 55.39 61.51 48.78 58.75C38.34 55.17 28.71 48.36 17.43 48.08Z" - fill="url(#ffWaveWordmarkFooter)" /> - <path - d="M64.53 0H5.47C2.45 0 0 2.45 0 5.47V36.49C6.61 36.49 13.58 36.76 20.18 36.21C29.26 35.39 37.23 30.42 45.76 27.11C53.46 23.8 61.75 21.86 70 22.14V5.47C70 2.45 67.55 0 64.53 0Z" - fill="url(#ffWaveWordmarkFooter)" /> - <path - d="M70 33.17V22.13C61.75 21.86 53.46 23.8 45.76 27.1C37.23 30.41 29.26 35.38 20.18 36.2C13.58 36.76 6.61 36.48 0 36.48V47.79H7.54C10.83 47.79 14.14 47.79 17.44 48.06C28.72 48.33 38.34 55.15 48.79 58.73C55.4 61.49 62.87 62.41 70.01 62.41V51.37C66.72 51.37 63.37 51.1 60.07 50.55C52.64 48.88 45.77 45.3 38.62 42.27C47.7 38.4 57.08 33.16 67.27 33.16H70.02L70 33.17Z" - fill="white" /> - </g> - </g> -</svg> \ No newline at end of file diff --git a/src/_includes/components/flowfuse-wordmark.njk b/src/_includes/components/flowfuse-wordmark.njk deleted file mode 100644 index 6dba8f8275..0000000000 --- a/src/_includes/components/flowfuse-wordmark.njk +++ /dev/null @@ -1,58 +0,0 @@ -<svg class="h-full w-full" viewBox="0 0 402 70" xmlns="http://www.w3.org/2000/svg"> - <defs> - <linearGradient id="ffWaveWordmark" gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="402" y2="0"> - <stop offset="0" stop-color="#DA3D0B" /> - <stop offset="0.25" stop-color="#DA3D0B" /> - <stop offset="0.5" stop-color="#DA3D0B" /> - <stop offset="0.75" stop-color="#DA3D0B" /> - <stop offset="1" stop-color="#DA3D0B" /> - </linearGradient> - </defs> - <mask id="mask0_171_1177" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="402" height="70"> - <path d="M402 0H0V70H402V0Z" fill="white" /> - </mask> - <g mask="url(#mask0_171_1177)"> - <mask id="mask1_171_1177" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="402" - height="70"> - <path d="M402 0H0V70H402V0Z" fill="white" /> - </mask> - <g mask="url(#mask1_171_1177)"> - <path - d="M118.95 9.98H95.3695C93.7495 9.98 92.4595 10.47 91.4795 11.44C90.4995 12.41 90.0195 13.71 90.0195 15.32V55.38C90.0195 57.05 90.4495 58.24 91.3095 58.94C92.1695 59.64 93.5495 59.99 95.4395 59.99C96.3595 59.99 97.2495 59.92 98.1095 59.79C98.9695 59.66 99.6195 59.53 100.05 59.43V39.87H113.6C114.73 39.87 115.62 39.51 116.27 38.78C116.92 38.05 117.24 37.01 117.24 35.66C117.24 34.85 117.12 34.11 116.88 33.43C116.64 32.76 116.38 32.2 116.11 31.77H100.05V18.15H116.35C117.48 18.15 118.37 17.79 119.02 17.06C119.67 16.33 119.99 15.27 119.99 13.86C119.99 13.05 119.88 12.3 119.67 11.59C119.45 10.89 119.21 10.35 118.94 9.97" - fill="url(#ffWaveWordmark)" /> - <path - d="M130.979 9.98001C130.059 9.98001 129.199 10.06 128.389 10.22C127.579 10.38 126.959 10.52 126.529 10.62V55.53C126.529 57.2 126.969 58.36 127.859 59.01C128.749 59.66 130.079 59.98 131.869 59.98C132.839 59.98 133.719 59.91 134.499 59.78C135.279 59.65 135.889 59.5 136.319 59.34V14.52C136.319 12.85 135.889 11.68 135.029 11C134.169 10.33 132.819 9.99001 130.979 9.99001" - fill="url(#ffWaveWordmark)" /> - <path - d="M175.521 22.61C172.531 20.94 169.041 20.1 165.041 20.1C161.041 20.1 157.611 20.94 154.601 22.61C151.591 24.28 149.241 26.63 147.571 29.65C145.901 32.67 145.061 36.26 145.061 40.41C145.061 44.56 145.881 48.15 147.531 51.17C149.171 54.19 151.501 56.53 154.521 58.17C157.531 59.81 161.041 60.64 165.041 60.64C169.041 60.64 172.611 59.82 175.601 58.17C178.591 56.52 180.901 54.18 182.551 51.13C184.191 48.08 185.011 44.51 185.011 40.41C185.011 36.31 184.171 32.67 182.501 29.65C180.831 26.63 178.501 24.28 175.511 22.61M172.271 49.6C170.521 51.78 168.111 52.88 165.041 52.88C161.971 52.88 159.561 51.8 157.811 49.65C156.061 47.49 155.181 44.42 155.181 40.42C155.181 36.42 156.071 33.41 157.851 31.19C159.631 28.98 162.031 27.87 165.041 27.87C168.051 27.87 170.521 28.98 172.271 31.19C174.021 33.4 174.901 36.48 174.901 40.42C174.901 44.36 174.021 47.42 172.271 49.6Z" - fill="url(#ffWaveWordmark)" /> - <path - d="M281.95 9.98H258.37C256.75 9.98 255.46 10.47 254.48 11.44C253.51 12.41 253.02 13.71 253.02 15.32V55.38C253.02 57.05 253.45 58.24 254.31 58.94C255.17 59.64 256.55 59.99 258.44 59.99C259.36 59.99 260.25 59.92 261.11 59.79C261.97 59.66 262.62 59.53 263.05 59.43V39.87H276.6C277.73 39.87 278.62 39.51 279.27 38.78C279.92 38.05 280.24 37.01 280.24 35.66C280.24 34.85 280.12 34.11 279.88 33.43C279.64 32.76 279.38 32.2 279.11 31.77H263.05V18.15H279.35C280.48 18.15 281.37 17.79 282.02 17.06C282.67 16.33 282.99 15.27 282.99 13.86C282.99 13.05 282.88 12.3 282.67 11.59C282.45 10.89 282.21 10.35 281.94 9.97" - fill="url(#ffWaveWordmark)" /> - <path - d="M243.98 21.39C243.12 20.8 242.01 20.5 240.66 20.5C239.04 20.5 237.59 20.88 236.29 21.63C235.59 26.59 234.71 31.61 233.66 36.68C232.61 41.75 231.59 46.53 230.62 51H230.22C229.95 49.76 229.45 47.87 228.72 45.34C227.99 42.81 227.14 39.91 226.17 36.64C225.2 33.38 224.17 30.02 223.09 26.56C222.77 25.59 222.13 24.87 221.19 24.42C220.25 23.96 219.08 23.73 217.67 23.73C216.59 23.73 215.64 23.84 214.83 24.05C214.02 24.27 213.26 24.59 212.56 25.02C211.48 28.63 210.42 32.2 209.36 35.7C208.31 39.21 207.39 42.32 206.61 45.05C205.83 47.77 205.27 49.76 204.95 51H204.63C204.41 50.14 204.11 48.88 203.74 47.24C203.36 45.6 202.93 43.64 202.45 41.37C201.96 39.1 201.46 36.57 200.95 33.76C200.44 30.95 199.94 28.01 199.46 24.94C199.19 23.32 198.65 22.18 197.84 21.5C197.03 20.83 195.92 20.49 194.52 20.49C193.39 20.49 192.37 20.71 191.48 21.14C190.59 21.57 189.88 22.06 189.34 22.6C189.72 24.65 190.19 27 190.76 29.64C191.33 32.28 191.95 35.01 192.62 37.81C193.29 40.62 193.97 43.33 194.64 45.94C195.31 48.56 195.97 50.86 196.62 52.86C197.27 54.86 197.84 56.4 198.32 57.47C198.75 58.33 199.53 59 200.67 59.45C201.8 59.91 203.1 60.14 204.56 60.14C205.85 60.14 206.95 60 207.84 59.73C208.73 59.46 209.44 59.11 209.99 58.68C210.64 56.9 211.4 54.67 212.29 52C213.18 49.33 214.1 46.44 215.04 43.34C215.98 40.24 216.83 37.2 217.59 34.24C218.4 37.15 219.23 40.11 220.09 43.1C220.95 46.09 221.8 48.87 222.64 51.44C223.48 54 224.22 56.09 224.87 57.71C225.41 59.33 227.33 60.14 230.61 60.14C231.85 60.14 233 59.99 234.05 59.69C235.1 59.4 235.88 59.06 236.36 58.68C236.79 57.6 237.3 56.15 237.9 54.31C238.49 52.48 239.13 50.4 239.8 48.08C240.47 45.76 241.14 43.36 241.78 40.88C242.43 38.4 243 36.05 243.52 33.84C244.03 31.63 244.45 29.67 244.78 27.97C245.1 26.27 245.26 25.07 245.26 24.37C245.26 22.97 244.83 21.97 243.97 21.38" - fill="url(#ffWaveWordmark)" /> - <path - d="M316.89 20.67C315.97 20.67 315.11 20.75 314.3 20.91C313.49 21.07 312.87 21.21 312.44 21.31V51.17C311.79 51.55 310.87 51.91 309.69 52.26C308.5 52.61 307.05 52.78 305.32 52.78C302.62 52.78 300.52 52.15 299.01 50.88C297.5 49.61 296.74 47.55 296.74 44.69V25.27C296.74 23.49 296.32 22.28 295.48 21.63C294.64 20.98 293.31 20.66 291.47 20.66C290.5 20.66 289.61 20.74 288.8 20.9C287.99 21.06 287.4 21.2 287.02 21.3V44.85C287.02 48.52 287.75 51.51 289.2 53.83C290.66 56.15 292.76 57.85 295.51 58.93C298.26 60.01 301.5 60.55 305.22 60.55C308.3 60.55 311.02 60.24 313.4 59.62C315.77 59 317.71 58.23 319.22 57.32C320.35 56.62 321.14 55.86 321.57 55.06C322 54.25 322.22 53.23 322.22 51.98V25.27C322.22 23.49 321.79 22.28 320.93 21.63C320.07 20.98 318.72 20.66 316.88 20.66" - fill="url(#ffWaveWordmark)" /> - <path - d="M347.659 36.62L343.449 35.57C341.779 35.19 340.589 34.67 339.889 33.99C339.189 33.32 338.839 32.52 338.839 31.6C338.839 30.3 339.459 29.32 340.699 28.64C341.939 27.97 343.609 27.63 345.719 27.63C347.119 27.63 348.509 27.78 349.889 28.07C351.269 28.37 352.519 28.74 353.649 29.2C354.779 29.66 355.669 30.1 356.319 30.53C356.909 30.1 357.409 29.53 357.819 28.83C358.219 28.13 358.429 27.32 358.429 26.4C358.429 25.05 357.849 23.91 356.689 22.96C355.529 22.02 353.939 21.29 351.909 20.78C349.889 20.27 347.579 20.01 344.989 20.01C340.019 20.01 336.169 21.1 333.419 23.29C330.669 25.48 329.289 28.24 329.289 31.59C329.289 34.61 330.219 37.04 332.079 38.87C333.939 40.71 336.809 42.05 340.699 42.92L345.469 44.13C347.199 44.51 348.459 45.06 349.269 45.79C350.079 46.52 350.479 47.5 350.479 48.74C350.479 51.6 348.159 53.03 343.519 53.03C340.979 53.03 338.719 52.64 336.719 51.86C334.719 51.08 332.969 50.2 331.459 49.23C330.759 49.72 330.189 50.33 329.759 51.09C329.329 51.85 329.109 52.68 329.109 53.6C329.109 55.71 330.489 57.4 333.239 58.7C335.989 60 339.519 60.64 343.839 60.64C349.119 60.64 353.159 59.57 355.939 57.44C358.719 55.31 360.109 52.38 360.109 48.66C360.109 45.53 359.119 42.99 357.149 41.02C355.179 39.05 352.009 37.58 347.639 36.61" - fill="url(#ffWaveWordmark)" /> - <path - d="M400.87 40.23C401.63 39.5 402 38.38 402 36.87C402 33.63 401.24 30.75 399.73 28.21C398.22 25.67 396.13 23.68 393.46 22.22C390.79 20.76 387.7 20.04 384.19 20.04C381.6 20.04 379.16 20.46 376.87 21.29C374.58 22.12 372.55 23.38 370.8 25.05C369.05 26.72 367.67 28.8 366.67 31.28C365.67 33.76 365.17 36.65 365.17 39.94C365.17 44.47 366.06 48.27 367.84 51.35C369.62 54.43 372.12 56.73 375.32 58.27C378.53 59.81 382.21 60.58 386.37 60.58C389.07 60.58 391.45 60.31 393.53 59.77C395.61 59.23 397.26 58.46 398.51 57.46C399.75 56.46 400.37 55.29 400.37 53.94C400.37 53.08 400.14 52.28 399.68 51.55C399.22 50.82 398.64 50.24 397.94 49.81C396.75 50.62 395.2 51.36 393.29 52.04C391.37 52.71 389.29 53.05 387.02 53.05C383.62 53.05 380.82 52.21 378.6 50.54C376.85 49.22 375.65 47.31 374.98 44.84L397.69 41.55C399.04 41.39 400.09 40.95 400.85 40.22M374.36 37.99C374.53 34.74 375.47 32.2 377.2 30.39C379.06 28.45 381.39 27.48 384.2 27.48C387.01 27.48 388.98 28.25 390.43 29.79C391.89 31.33 392.69 33.15 392.86 35.25L374.36 37.99Z" - fill="url(#ffWaveWordmark)" /> - <path - d="M38.6096 42.28C45.7596 45.31 52.6296 48.9 60.0596 50.56C63.3596 51.11 66.7096 51.38 69.9996 51.38V33.16H67.2496C57.0696 33.16 47.6796 38.41 38.5996 42.27" - fill="url(#ffWaveWordmark)" /> - <path - d="M17.43 48.08C14.13 47.81 10.82 47.81 7.53 47.81H0V64.54C0 67.56 2.45 70.01 5.47 70.01H64.53C67.55 70.01 70 67.56 70 64.54V62.43C62.86 62.43 55.39 61.51 48.78 58.75C38.34 55.17 28.71 48.36 17.43 48.08Z" - fill="url(#ffWaveWordmark)" /> - <path - d="M64.53 0H5.47C2.45 0 0 2.45 0 5.47V36.49C6.61 36.49 13.58 36.76 20.18 36.21C29.26 35.39 37.23 30.42 45.76 27.11C53.46 23.8 61.75 21.86 70 22.14V5.47C70 2.45 67.55 0 64.53 0Z" - fill="url(#ffWaveWordmark)" /> - <path - d="M70 33.17V22.13C61.75 21.86 53.46 23.8 45.76 27.1C37.23 30.41 29.26 35.38 20.18 36.2C13.58 36.76 6.61 36.48 0 36.48V47.79H7.54C10.83 47.79 14.14 47.79 17.44 48.06C28.72 48.33 38.34 55.15 48.79 58.73C55.4 61.49 62.87 62.41 70.01 62.41V51.37C66.72 51.37 63.37 51.1 60.07 50.55C52.64 48.88 45.77 45.3 38.62 42.27C47.7 38.4 57.08 33.16 67.27 33.16H70.02L70 33.17Z" - fill="white" /> - </g> - </g> -</svg> \ No newline at end of file diff --git a/src/_includes/components/github.njk b/src/_includes/components/github.njk deleted file mode 100644 index 8787b7bdfd..0000000000 --- a/src/_includes/components/github.njk +++ /dev/null @@ -1 +0,0 @@ -<svg class="fill-current hover:text-red-hero h-5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg> \ No newline at end of file diff --git a/src/_includes/components/hm-promo-banner.njk b/src/_includes/components/hm-promo-banner.njk deleted file mode 100644 index 0693194d7a..0000000000 --- a/src/_includes/components/hm-promo-banner.njk +++ /dev/null @@ -1,42 +0,0 @@ -<div id="hm-promo-banner" - class="hm-promo-banner fixed bottom-6 right-6 w-[340px] max-w-[calc(100vw-48px)] bg-gradient-to-tl from-gray-800 to-gray-600 rounded-xl border-1 border-gray-300 shadow-[0_8px_32px_rgba(0,0,0,0.28)] z-[9000] hidden md:block" - role="complementary" aria-label="Hannover Messe 2026 promotion"> - - <button id="hm-promo-banner-close" - class="absolute top-3 right-3 bg-transparent border-0 cursor-pointer text-gray-400 hover:text-white p-1 flex items-center justify-center" - aria-label="Close promotional banner"> - <svg width="16" height="16" viewBox="0 0 24 24" fill="none" aria-hidden="true"> - <path d="M18 6L6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> - <path d="M6 6l12 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> - </svg> - </button> - - <div class="p-6"> - <div class="flex items-start justify-between gap-3 mb-6"> - <div class="shrink-0 hm-promo-banner__hm-logo"> - {% image "./events/images/hm25/hm_logo.png", "Hannover Messe 2026", [80] %} - </div> - <h2 class="text-white text-xl font-semibold">Join us at Hannover Messe 2026</h2> - </div> - <div> - <div class="prose ff-prose"> - <ul> - <li class="text-gray-200">Live <span class="font-medium">demos + hands-on workshop</span> with Nick O'Leary</li> - <li class="text-gray-200"><span class="font-medium">12 short talks</span> on real industrial use cases</li> - <li class="text-gray-200 italic mb-6">Limited spots</li> - </ul> - </div> - </div> - - <div class="flex flex-col"> - <a class="ff-btn ff-btn--highlight" - href="/events/hannover-messe-2026#special-sessions" - rel="noopener noreferrer" - onclick="if(typeof capture==='function') capture('hm-banner-click', {'target': 'cta-primary', 'label': 'save-your-spot', 'page': location.pathname, 'location': 'floating-banner'})"> - SAVE YOUR SPOT - </a> - </div> - </div> -</div> - -<script src="/js/hm-promo-banner.js" defer></script> diff --git a/src/_includes/components/industry-use-cases.njk b/src/_includes/components/industry-use-cases.njk deleted file mode 100644 index bba113f752..0000000000 --- a/src/_includes/components/industry-use-cases.njk +++ /dev/null @@ -1,27 +0,0 @@ -{# ============================================================ - USE CASES FOR THIS INDUSTRY - derived grid. - Lists every use-case page whose `industries[]` front-matter - contains the current page's fileSlug. Mapping source of truth: - the Use Cases Asana project (Industry field). - ============================================================ #} -{% set industrySlug = page.fileSlug %} -<div class="w-full py-16 sm:py-24 px-6 bg-gray-50 border-y border-gray-100"> - <div class="max-w-screen-lg mx-auto"> - <h2 class="max-md:text-center">Use cases in <span class="text-indigo-600">{{ industryDisplayName or hero.eyebrow or title }}</span></h2> - <p class="mt-4 max-w-3xl text-gray-600">Operational workflow patterns teams in this industry build and own with FlowFuse.</p> - <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 mt-10"> - {% for uc in collections["use-case"] | sort(false, true, "data.title") %} - {% if uc.data.industries and industrySlug in uc.data.industries %} - <a href="{{ uc.url }}" class="group hover:no-underline flex flex-col gap-3 rounded-xl border border-gray-200 p-6 bg-white hover:border-indigo-300 hover:shadow-sm transition-all"> - <h3 class="m-0 text-gray-800 group-hover:text-indigo-600 transition-colors">{{ uc.data.title }}</h3> - <p class="m-0 text-gray-600 text-sm flex-grow">{{ uc.data.problem }}</p> - <span class="mt-2 text-blue-600 text-sm flex items-center gap-1.5 group-hover:underline"> - View use case - <span class="shrink-0">{% include "components/icons/arrow-long-right.svg" %}</span> - </span> - </a> - {% endif %} - {% endfor %} - </div> - </div> -</div> diff --git a/src/_includes/components/linkedin.njk b/src/_includes/components/linkedin.njk deleted file mode 100644 index 6f3c853bff..0000000000 --- a/src/_includes/components/linkedin.njk +++ /dev/null @@ -1 +0,0 @@ -<svg class="fill-current h-5 hover:text-red-hero" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0v24h24v-24h-24zm8 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.397-2.586 7-2.777 7 2.476v6.759z"/></svg> diff --git a/src/_includes/components/linkedin.svg b/src/_includes/components/linkedin.svg deleted file mode 100644 index a8db23a143..0000000000 --- a/src/_includes/components/linkedin.svg +++ /dev/null @@ -1 +0,0 @@ -<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v24h24v-24zm8 19h-3v-11h3zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.397-2.586 7-2.777 7 2.476z"/></svg> \ No newline at end of file diff --git a/src/_includes/components/mail.njk b/src/_includes/components/mail.njk deleted file mode 100644 index c6dc43050c..0000000000 --- a/src/_includes/components/mail.njk +++ /dev/null @@ -1,4 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor"> - <path d="M2.003 5.884L10 9.882l7.997-3.998A2 2 0 0016 4H4a2 2 0 00-1.997 1.884z" /> - <path d="M18 8.118l-8 4-8-4V14a2 2 0 002 2h12a2 2 0 002-2V8.118z" /> -</svg> diff --git a/src/_includes/components/nav-highlight.njk b/src/_includes/components/nav-highlight.njk deleted file mode 100644 index c66dca9bd0..0000000000 --- a/src/_includes/components/nav-highlight.njk +++ /dev/null @@ -1,13 +0,0 @@ -{# Mega-dropdown highlight card: the linked page's marketing image with a - short title underneath. Expects `hl` set by the caller: - {% set hl = navHighlights.platform %}{% include "components/nav-highlight.njk" %} - Content is configured in src/_data/navHighlights.js (marketing-owned). - Card image: hl.image override, else the linked page's `image:` front - matter (its marketing image), else the generic og-blog fallback. #} -{% set hlImage = hl.image or (collections.all | pageImageForUrl(hl.link)) or "/images/og-blog.jpg" %} -<li class="mega-highlight"> - <a href="{{ hl.link }}" class="mega-highlight-card"> - <span class="mega-highlight-title">{{ hl.title }}</span> - <span class="mega-highlight-media"><img src="{{ hlImage }}" alt="" loading="lazy"></span> - </a> -</li> diff --git a/src/_includes/components/reddit.njk b/src/_includes/components/reddit.njk deleted file mode 100644 index 9b1921d308..0000000000 --- a/src/_includes/components/reddit.njk +++ /dev/null @@ -1 +0,0 @@ -<svg class="fill-current h-5 hover:text-red-hero" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M14.238 15.348c.085.084.085.221 0 .306-.465.462-1.194.687-2.231.687l-.008-.002-.008.002c-1.036 0-1.766-.225-2.231-.688-.085-.084-.085-.221 0-.305.084-.084.222-.084.307 0 .379.377 1.008.561 1.924.561l.008.002.008-.002c.915 0 1.544-.184 1.924-.561.085-.084.223-.084.307 0zm-3.44-2.418c0-.507-.414-.919-.922-.919-.509 0-.923.412-.923.919 0 .506.414.918.923.918.508.001.922-.411.922-.918zm13.202-.93c0 6.627-5.373 12-12 12s-12-5.373-12-12 5.373-12 12-12 12 5.373 12 12zm-5-.129c0-.851-.695-1.543-1.55-1.543-.417 0-.795.167-1.074.435-1.056-.695-2.485-1.137-4.066-1.194l.865-2.724 2.343.549-.003.034c0 .696.569 1.262 1.268 1.262.699 0 1.267-.566 1.267-1.262s-.568-1.262-1.267-1.262c-.537 0-.994.335-1.179.804l-2.525-.592c-.11-.027-.223.037-.257.145l-.965 3.038c-1.656.02-3.155.466-4.258 1.181-.277-.255-.644-.415-1.05-.415-.854.001-1.549.693-1.549 1.544 0 .566.311 1.056.768 1.325-.03.164-.05.331-.05.5 0 2.281 2.805 4.137 6.253 4.137s6.253-1.856 6.253-4.137c0-.16-.017-.317-.044-.472.486-.261.82-.766.82-1.353zm-4.872.141c-.509 0-.922.412-.922.919 0 .506.414.918.922.918s.922-.412.922-.918c0-.507-.413-.919-.922-.919z"/></svg> diff --git a/src/_includes/components/related-resources.njk b/src/_includes/components/related-resources.njk deleted file mode 100644 index be23cded38..0000000000 --- a/src/_includes/components/related-resources.njk +++ /dev/null @@ -1,55 +0,0 @@ -{# ============================================================ - RELATED RESOURCES - Three columns: Case studies / eBooks and Whitepapers / Blog. - Content opts in via a dedicated front matter field: - usecase: - - production-monitoring - The layout passes `useCaseSlug` (e.g. "production-monitoring"). - ============================================================ #} - -{% set caseStudies = [] %} -{% set whitepapers = [] %} -{% set blogPosts = [] %} -{% for item in collections.all %} - {% if item.data.usecase and useCaseSlug in item.data.usecase %} - {% if "/customer-stories/" in item.url %} - {% set caseStudies = (caseStudies.push(item), caseStudies) %} - {% elif "/ebooks/" in item.url or "/whitepaper/" in item.url %} - {% set whitepapers = (whitepapers.push(item), whitepapers) %} - {% elif "/blog/" in item.url %} - {% set blogPosts = (blogPosts.push(item), blogPosts) %} - {% endif %} - {% endif %} -{% endfor %} - -{% set columns = [ - {heading: "Case studies", items: caseStudies}, - {heading: "eBooks and Whitepapers", items: whitepapers}, - {heading: "Blog", items: blogPosts} -] %} - -<div class="w-full py-16 sm:py-24 px-6 bg-gray-50 border-y border-gray-100"> - <div class="max-w-screen-lg mx-auto"> - <h2 class="max-md:text-center">Related resources</h2> - <div class="grid grid-cols-1 md:grid-cols-3 gap-8 mt-10"> - {% for column in columns %} - <div> - <h4 class="text-gray-800 border-b border-gray-200 pb-3 mb-4">{{ column.heading }}</h4> - {% if column.items.length %} - <ul class="flex flex-col gap-3 list-none p-0 m-0"> - {% for item in column.items %} - <li> - <a href="{{ item.url }}" class="inline-block text-indigo-600 hover:text-indigo-800">{{ item.data.title or item.data.meta.title or item.data.contentTitle | safe }}</a> - </li> - {% endfor %} - </ul> - {% else %} - <div class="rounded-lg border border-dashed border-gray-300 bg-white p-6 text-center"> - <p class="m-0 text-gray-400 text-sm">More coming soon</p> - </div> - {% endif %} - </div> - {% endfor %} - </div> - </div> -</div> diff --git a/src/_includes/components/rss.njk b/src/_includes/components/rss.njk deleted file mode 100644 index c92b3fc708..0000000000 --- a/src/_includes/components/rss.njk +++ /dev/null @@ -1 +0,0 @@ -<svg class="fill-current hover:text-red-hero" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24"><path d="M6.503 20.752c0 1.794-1.456 3.248-3.251 3.248-1.796 0-3.252-1.454-3.252-3.248 0-1.794 1.456-3.248 3.252-3.248 1.795.001 3.251 1.454 3.251 3.248zm-6.503-12.572v4.811c6.05.062 10.96 4.966 11.022 11.009h4.817c-.062-8.71-7.118-15.758-15.839-15.82zm0-3.368c10.58.046 19.152 8.594 19.183 19.188h4.817c-.03-13.231-10.755-23.954-24-24v4.812z"/></svg> \ No newline at end of file diff --git a/src/_includes/components/rss.svg b/src/_includes/components/rss.svg deleted file mode 100644 index 689aaac07c..0000000000 --- a/src/_includes/components/rss.svg +++ /dev/null @@ -1 +0,0 @@ -<svg height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg"><path d="m6.503 20.752c0 1.794-1.456 3.248-3.251 3.248-1.796 0-3.252-1.454-3.252-3.248s1.456-3.248 3.252-3.248c1.795.001 3.251 1.454 3.251 3.248zm-6.503-12.572v4.811c6.05.062 10.96 4.966 11.022 11.009h4.817c-.062-8.71-7.118-15.758-15.839-15.82zm0-3.368c10.58.046 19.152 8.594 19.183 19.188h4.817c-.03-13.231-10.755-23.954-24-24z"/></svg> \ No newline at end of file diff --git a/src/_includes/components/top-utility-bar.njk b/src/_includes/components/top-utility-bar.njk deleted file mode 100644 index 94b8a0e3d2..0000000000 --- a/src/_includes/components/top-utility-bar.njk +++ /dev/null @@ -1,55 +0,0 @@ -{% from "components/cta/cta-sign-in.njk" import ctaSignIn %} -{# Slim top utility bar: rotating announcements (left) + quick links (right). - Pattern adapted from tailscale.com's slim top bar. The announcement slot - rotates through every entry in src/_data/events.yaml; entries without an - `expire` (the standing promos) stay visible indefinitely, while dated - entries drop off once expired. Implements the intent of website PR #5067. #} -<!-- Utility bar styles live in src/css/style.css so the Nuxt component shares them. --> -<div class="ff-utility-bar w-full bg-indigo-700 text-indigo-100 text-sm px-6" data-nav-zone="utility"> - <div class="mx-auto max-screen-none lg:max-w-screen-xl 2xl:max-w-[1920px] flex items-center justify-between gap-4 py-3"> - <!-- Announcements (rotating): entries with no `expire` stay visible indefinitely --> - <div class="ff-utility-announce min-w-0 flex-1 flex items-center"> - {% for event in events %} - {% if not event.expire or (event.expire | isFutureDate) %} - <a href="{{ event.link }}" class="ff-utility-item group inline-flex items-center gap-2 min-w-0 no-underline hover:no-underline text-indigo-100 hover:text-white"> - <span class="shrink-0 font-semibold">{{ event.type }}</span> - <span class="hidden sm:block">-</span> - <span class="truncate">{{ event.title }}</span> - <span class="shrink-0 hidden sm:inline-flex items-center gap-1 font-medium text-white underline underline-offset-2"> - {{ event.buttonText }} - <span class="transition-transform group-hover:translate-x-0.5">→</span> - </span> - </a> - {% endif %} - {% endfor %} - </div> - <!-- Mobile Sign In (quick-links nav below is hidden under md) --> - {{ ctaSignIn(site, 'nav-text', 'utility-bar-mobile', extraClass='md:hidden shrink-0 text-indigo-100 hover:text-white no-underline hover:no-underline font-medium') }} - <!-- Quick links (right) --> - <nav class="hidden md:flex items-center gap-5 shrink-0" aria-label="Quick links"> - <a href="/about/" class="text-indigo-100 hover:text-white no-underline hover:no-underline">About us</a> - <a href="/blog/" class="text-indigo-100 hover:text-white no-underline hover:no-underline">Blog</a> - <a href="/docs/" class="text-indigo-100 hover:text-white no-underline hover:no-underline">Docs</a> - <a href="/support/" class="text-indigo-100 hover:text-white no-underline hover:no-underline">Support</a> - <a href="/platform/device-agent/" class="text-indigo-100 hover:text-white no-underline hover:no-underline">Install on edge</a> - <span class="h-4 w-px bg-indigo-400/40" aria-hidden="true"></span> - {{ ctaSignIn(site, 'nav-text', 'utility-bar', extraClass='text-indigo-100 hover:text-white no-underline hover:no-underline font-medium') }} - </nav> - </div> -</div> -<script> - (function () { - var items = document.querySelectorAll('.ff-utility-announce > .ff-utility-item'); - if (items.length === 0) return; - var i = 0; - for (var k = 0; k < items.length; k++) { - items[k].style.display = (k === 0 ? 'inline-flex' : 'none'); - } - if (items.length < 2) return; - setInterval(function () { - items[i].style.display = 'none'; - i = (i + 1) % items.length; - items[i].style.display = 'inline-flex'; - }, 7000); - })(); -</script> diff --git a/src/_includes/components/twitter.njk b/src/_includes/components/twitter.njk deleted file mode 100644 index bd7aac9285..0000000000 --- a/src/_includes/components/twitter.njk +++ /dev/null @@ -1,3 +0,0 @@ -<svg class="fill-current hover:text-red-hero h-5" width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg"> - <path d="M10.2011 7.14188L16.2071 0H14.7839L9.5689 6.2012L5.40369 0H0.599609L6.89822 9.37731L0.599609 16.8667H2.02292L7.5301 10.318L11.9289 16.8667H16.7329L10.2008 7.14188H10.2011ZM8.25172 9.45992L7.61354 8.52616L2.53576 1.09606H4.72188L8.8197 7.09238L9.45788 8.02615L14.7846 15.8205H12.5985L8.25172 9.46028V9.45992Z"/> - </svg> \ No newline at end of file diff --git a/src/_includes/components/twitter.svg b/src/_includes/components/twitter.svg deleted file mode 100644 index 95dc56afdb..0000000000 --- a/src/_includes/components/twitter.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M10.2011 7.14188L16.2071 0H14.7839L9.5689 6.2012L5.40369 0H0.599609L6.89822 9.37731L0.599609 16.8667H2.02292L7.5301 10.318L11.9289 16.8667H16.7329L10.2008 7.14188H10.2011ZM8.25172 9.45992L7.61354 8.52616L2.53576 1.09606H4.72188L8.8197 7.09238L9.45788 8.02615L14.7846 15.8205H12.5985L8.25172 9.46028V9.45992Z" fill="white"/> -</svg> diff --git a/src/_includes/components/use-case-links.njk b/src/_includes/components/use-case-links.njk deleted file mode 100644 index 23ee4065f1..0000000000 --- a/src/_includes/components/use-case-links.njk +++ /dev/null @@ -1,23 +0,0 @@ -{# ============================================================ - USE CASE LINKS - systematic cross-link cards. - The host page declares which use cases to feature: - {% set featuredUseCases = ["slug-a", "slug-b"] %} - {% include "components/use-case-links.njk" %} - Card content (title, problem line, url) derives from each - use-case page's own front matter, so copy lives in one place. - ============================================================ #} -{% if featuredUseCases %} -<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 mt-10"> - {% for slug in featuredUseCases %} - {% for uc in collections["use-case"] %} - {% if uc.fileSlug == slug %} - <a href="{{ uc.url }}" class="group hover:no-underline flex flex-col gap-3 rounded-xl border border-gray-200 p-6 bg-white hover:border-indigo-300 hover:shadow-sm transition-all"> - <h3 class="m-0 text-gray-800 group-hover:text-indigo-600 transition-colors">{{ uc.data.title }}</h3> - <p class="m-0 text-gray-600 text-sm flex-grow">{{ uc.data.problem }}</p> - <span class="mt-2 text-indigo-600 text-sm font-semibold flex items-center gap-2">View use case <span class="w-4 h-4">{% include "components/icons/arrow-right.svg" %}</span></span> - </a> - {% endif %} - {% endfor %} - {% endfor %} -</div> -{% endif %} diff --git a/src/_includes/components/youtube.njk b/src/_includes/components/youtube.njk deleted file mode 100644 index 7ff06c3b44..0000000000 --- a/src/_includes/components/youtube.njk +++ /dev/null @@ -1,3 +0,0 @@ -<svg class="fill-current h-5 hover:text-red-hero" width="28" height="20" viewBox="0 0 28 20" fill="none" xmlns="http://www.w3.org/2000/svg"> - <path d="M27.3016 2.97749C26.9889 1.80488 26.0709 0.88338 24.9028 0.569489C22.7854 0 14.3001 0 14.3001 0C14.3001 0 5.81476 0 3.69957 0.569489C2.53142 0.88338 1.61342 1.80488 1.30072 2.97749C0.733398 5.10074 0.733398 9.53333 0.733398 9.53333C0.733398 9.53333 0.733398 13.9659 1.30072 16.0892C1.61342 17.2618 2.53142 18.1833 3.69957 18.4972C5.81476 19.0667 14.3001 19.0667 14.3001 19.0667C14.3001 19.0667 22.7854 19.0667 24.9006 18.4972C26.0687 18.1833 26.9867 17.2618 27.2994 16.0892C27.8667 13.9659 27.8667 9.53333 27.8667 9.53333C27.8667 9.53333 27.8667 5.10074 27.2994 2.97749H27.3016ZM11.5863 13.6184V5.44826L18.6354 9.53333L11.5863 13.6184Z"/> - </svg> \ No newline at end of file diff --git a/src/_includes/components/youtube.svg b/src/_includes/components/youtube.svg deleted file mode 100644 index 74905f5365..0000000000 --- a/src/_includes/components/youtube.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="28" height="20" viewBox="0 0 28 20" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M27.3016 2.97749C26.9889 1.80488 26.0709 0.88338 24.9028 0.569489C22.7854 0 14.3001 0 14.3001 0C14.3001 0 5.81476 0 3.69957 0.569489C2.53142 0.88338 1.61342 1.80488 1.30072 2.97749C0.733398 5.10074 0.733398 9.53333 0.733398 9.53333C0.733398 9.53333 0.733398 13.9659 1.30072 16.0892C1.61342 17.2618 2.53142 18.1833 3.69957 18.4972C5.81476 19.0667 14.3001 19.0667 14.3001 19.0667C14.3001 19.0667 22.7854 19.0667 24.9006 18.4972C26.0687 18.1833 26.9867 17.2618 27.2994 16.0892C27.8667 13.9659 27.8667 9.53333 27.8667 9.53333C27.8667 9.53333 27.8667 5.10074 27.2994 2.97749H27.3016ZM11.5863 13.6184V5.44826L18.6354 9.53333L11.5863 13.6184Z"/> -</svg> diff --git a/src/_includes/core-nodes/http-response-use-case.md b/src/_includes/core-nodes/http-response-use-case.md deleted file mode 100644 index e01158caae..0000000000 --- a/src/_includes/core-nodes/http-response-use-case.md +++ /dev/null @@ -1,52 +0,0 @@ -## What is the HTTP Response node in Node-RED? - -The HTTP Response node allows you to send tailored HTTP responses back to clients that make requests to your application. It enables you to customize status codes, headers, and response bodies, facilitating dynamic communication between your application and its users. - -## Configuring HTTP Response node - -- **Status code:** This field allows you to specify the HTTP status code to be included in the response. You can also set it with `msg.statusCode`. For more information on status codes, refer to [MDN Docs on HTTP response status codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status). -- **Headers:** With this field you can add any custom HTTP headers to be included in the response. Headers provide additional information about the data being transferred between the client and server. You might use headers to specify the content type (Content-Type), set cookies, or provide caching directives. to set headers dynamically you can use `msg.headers` with JSON object containing headers. -- **Cookies:** To set cookies, you need to pass `msg.cookies` to the response node. The `msg.cookies` object should contain key-value pairs where the keys represent the names of the cookies, The value can be either a string to set the value of the cookie with default options, or it can be an object of options - -The valid options include: - -- **domain:** (String) Optional. Specifies the domain name for the cookie. -- **expires:** (Date) Optional. Specifies the expiration date for the cookie in GMT. If not specified or set to 0, it creates a session cookie. Setting the expiry to 0 means the cookie has no defined expiration time and will be discarded at the end of the browsing session. -- **maxAge:** (Number) Optional. Specifies the expiry date as relative to the current time in milliseconds. -- **path:** (String) Optional. Specifies the path for the cookie. Defaults to '/'. -- **value:** (String) Required. Specifies the value to use for the cookie. - -To delete a cookie, set its value to `null`. - -**Note: The messages sent to this node must originate from an HTTP input node** - -## Usecases - -1. **Building RESTful APIs**: Use the HTTP Response node to send appropriate responses to incoming API requests. Customize status codes, headers, and response bodies based on the API endpoint and request parameters. -Authentication and Authorization: - -2. **Implement authentication and authorization mechanisms in your application.** Utilize the HTTP Response node to set cookies upon successful authentication and to enforce access control by sending 401 Unauthorized or 403 Forbidden responses when necessary. - -3. **Dynamic Content Generation:** Generate dynamic content for web applications and APIs. Respond to client requests with dynamically generated data by setting the response body dynamically in the HTTP Response node based on user input or backend computations. - -4. **Error Handling:** Handle errors gracefully by configuring the HTTP Response node to send appropriate error responses. Use different status codes (e.g., 404 Not Found, 500 Internal Server Error) and include relevant error messages in the response body to aid troubleshooting and debugging. - -5. **Session Management:** Manage user sessions by setting cookies with session identifiers and expiration dates using the HTTP Response node. Maintain user state across multiple requests and ensure secure session handling to enhance the user experience and application security. - -6. **Content Negotiation:** Implement content negotiation mechanisms to serve different representations of resources (e.g., JSON, XML) based on client preferences. Use the HTTP Response node to set appropriate Content-Type headers and deliver the requested content format to the client. - -7. **Cross-Origin Resource Sharing (CORS):** Enable Cross-Origin Resource Sharing (CORS) in your application to allow controlled access to resources from different origins. Configure the HTTP Response node to include CORS headers (e.g., Access-Control-Allow-Origin, Access-Control-Allow-Methods) to define the permitted cross-origin requests. - -## Examples - -1. In the example flow below, we demonstrate how you can set cookies using the HTTP Response node. - -{% renderFlow %} -[{"id":"6eda375547f05f47","type":"group","z":"b5ea6d2a.6e7bb","style":{"stroke":"#b2b3bd","stroke-opacity":"1","fill":"#f2f3fb","fill-opacity":"0.5","label":true,"label-position":"nw","color":"#32333b"},"nodes":["2bd5d08c8203ed60","75ed75867c5f6920","fe6a06ebc6814dde","80b9896e7089da9b"],"x":174,"y":99,"w":612,"h":162},{"id":"2bd5d08c8203ed60","type":"http response","z":"b5ea6d2a.6e7bb","g":"6eda375547f05f47","name":"","statusCode":"200","headers":{},"x":700,"y":220,"wires":[]},{"id":"75ed75867c5f6920","type":"http in","z":"b5ea6d2a.6e7bb","g":"6eda375547f05f47","name":"","url":"/test","method":"get","upload":false,"swaggerDoc":"","x":260,"y":220,"wires":[["fe6a06ebc6814dde"]]},{"id":"fe6a06ebc6814dde","type":"change","z":"b5ea6d2a.6e7bb","g":"6eda375547f05f47","name":"set cookies","rules":[{"t":"set","p":"cookies","pt":"msg","to":"{\"name\":\"nick\",\"session\":{\"value\":\"1234\",\"maxAge\":900000}}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":220,"wires":[["2bd5d08c8203ed60"]]},{"id":"80b9896e7089da9b","type":"comment","z":"b5ea6d2a.6e7bb","g":"6eda375547f05f47","name":"Setting cookies using response node","info":"","x":480,"y":140,"wires":[]}] -{% endrenderFlow %} - -2. In the following example, we demonstrate how you can send a response back to the requesting client and set headers using the HTTP Response node. - -{% renderFlow %} -[{"id":"e7285a491834f67f","type":"group","z":"246014ec93295463","style":{"stroke":"#b2b3bd","stroke-opacity":"1","fill":"#f2f3fb","fill-opacity":"0.5","label":true,"label-position":"nw","color":"#32333b"},"nodes":["2bd5d08c8203ed60","75ed75867c5f6920","80b9896e7089da9b","414c874caa4abe9c"],"x":254,"y":199,"w":532,"h":162},{"id":"2bd5d08c8203ed60","type":"http response","z":"246014ec93295463","g":"e7285a491834f67f","name":"","statusCode":"200","headers":{"content-type":"text/html"},"x":700,"y":320,"wires":[]},{"id":"75ed75867c5f6920","type":"http in","z":"246014ec93295463","g":"e7285a491834f67f","name":"","url":"/test","method":"get","upload":false,"swaggerDoc":"","x":340,"y":320,"wires":[["414c874caa4abe9c"]]},{"id":"80b9896e7089da9b","type":"comment","z":"246014ec93295463","g":"e7285a491834f67f","name":"Sending html as response data","info":"","x":510,"y":240,"wires":[]},{"id":"414c874caa4abe9c","type":"template","z":"246014ec93295463","g":"e7285a491834f67f","name":"","field":"payload","fieldType":"msg","format":"html","syntax":"mustache","template":"<!DOCTYPE html>\n<html>\n<head>\n <title>Simple HTML Example\n\n\n

    This is a Header

    \n

    This is a paragraph of text under the header.

    \n\n","output":"str","x":520,"y":320,"wires":[["2bd5d08c8203ed60"]]}] -{% endrenderFlow %} diff --git a/src/_includes/core-nodes/mqtt-broker-config-use-case.md b/src/_includes/core-nodes/mqtt-broker-config-use-case.md deleted file mode 100644 index 8c0bba72d9..0000000000 --- a/src/_includes/core-nodes/mqtt-broker-config-use-case.md +++ /dev/null @@ -1,51 +0,0 @@ -## What is the MQTT-broker config Node in Node-RED Used For? - -The MQTT-Broker config node in Node-RED is used to define the connection settings for an MQTT broker. This will create a single connection to the broker which can then be reused by MQTT In and MQTT Out nodes. - -## Configuring the MQTT-broker Node - -### Connection - -- **Server**: The hostname or IP address of the MQTT broker, The node can be configured to use a WebSocket connection. To do so, the Server field should be configured with a full URI for the connection. For example, `ws://broker.example.com:1883.` -- **Port**: The port number of the MQTT broker (default is 1883 for non-TLS and 8883 for TLS). -- **Connect automatically**: If enabled, the node will automatically connect to the broker when Node-RED starts. -- **Protocol**: The version of the MQTT protocol to use. - - **MQTT V3.1.1 (legacy)** - - **MQTT V3.1.1** - - **MQTT V5** -- **Use TLS**: Enabling this option node will use TLS, for more information TLS refer to [TLS node docs](/docs/node-red/core-nodes/network/tls/) -- **Client ID**: The client identifier to use when connecting to the broker. If left blank, a random ID will be generated. -- **Keep Alive**: This setting defines the interval (in seconds) at which the MQTT client sends a "keep alive" message to the broker to maintain the connection. It ensures that the connection remains active even if there is no other data being transmitted. If you set this to 0, the client will not send keep-alive messages. -- **Session**: - - **Use clean session**: If enabled, the broker will not store session information across connections. - -### Security - -- **Username**: The username to authenticate with the broker. -- **Password**: The password to authenticate with the broker. - -### Messages - -- **Message sent on connection (birth message)**: - - **Topic**: The MQTT topic to publish the birth message to. - - **Payload**: The payload of the birth message. - - **Retain**: Whether the message should be retained by the broker. - - **QoS**: The Quality of Service level for the birth message. - -- **Message sent before disconnecting**: - - **Topic**: The MQTT topic to publish the will message to. - - **Payload**: The payload of the will message. - - **Retain**: Whether the message should be retained by the broker. - - **QoS**: The Quality of Service level for the will message. - -- **Message sent on unexpected disconnection**: - - **Topic**: The MQTT topic to publish the last will message to. - - **Payload**: The payload of the last will message. - - **Retain**: Whether the message should be retained by the broker. - - **QoS**: The Quality of Service level for the last will message. - -## Usecases - -1. **Setting Up the Broker**: Use the MQTT-Broker config node to specify the broker details, such as server address, port, and security credentials. This node can be used to add a broker for MQTT nodes, ensuring that all MQTT-In and MQTT-Out nodes share the same configuration. - -2. **Centralized Configuration Management:** By using the MQTT-Broker config node, you can manage connection settings in one place. If the broker details change, you only need to update the configuration in the config node, and all associated nodes will use the updated settings. \ No newline at end of file diff --git a/src/_includes/core-nodes/tpc-out-use-case.md b/src/_includes/core-nodes/tpc-out-use-case.md deleted file mode 100644 index 64b28e7fa0..0000000000 --- a/src/_includes/core-nodes/tpc-out-use-case.md +++ /dev/null @@ -1,41 +0,0 @@ -# What is TCP-Out Nodes in Node-RED ? - -TCP-Out nodes in Node-RED facilitate communication over TCP/IP networks by providing options to connect to remote TCP ports, accept incoming connections, or reply to messages received from a TCP In node. - -If you dont know what is TCP, refer to [What is TCP](/docs/node-red/core-nodes/network/tcp-in/#what-is-udp/). - -## Configuring TCP-Out Node - -To configure a TCP-Out node in Node-RED, follow these steps: - -1. **Type**: Choose the type of connection: - - **Listen on**: Set up the node to listen for incoming connections. - - **Connect to**: Specify the host and port to connect to. - - **at host:** Enter the host address or domain name to connect to. - - **Reply to TCP**: Configure the node to reply to incoming TCP messages. - -2. **Port**: Specify the port number for the TCP connection. - -3. **Enable Secure (SSL/TLS) Connection**: Activate SSL/TLS for secure communication. If enabled, Node-RED provides a TLS config node for configuring TLS settings. Refer to the [TLS config node](/docs/node-red/core-nodes/network/tls/) documentation for details on configurations. - -4. **Close Connection After Each Message is Sent**: Choose whether to close the connection after sending each message. - -5. **Decode Base64 Message**: Enable this option if you expect incoming messages to be encoded in Base64 format. - -**Note: The default TCP nodes have been removed from the Node-RED palette in the FlowFuse Cloud due to limitations in routing connections to the container running Node-RED inside the FlowFuse platform** - -## Usecases - -1. **Bidirectional Communication:** Reply to messages received from TCP In nodes, enabling bidirectional communication between nodes in a flow. - -2. **Sending Data to Remote Servers**: Connect to external servers or services to send data over TCP/IP. - -3. **Building TCP Servers**: Listen for incoming connections and process data from remote clients. - -### Examples - -1. In the example flow below, we demonstrate how to utilize the TCP-Out node to Reply to messages received from TCP In nodes. - -{% renderFlow %} -[{"id":"7a40a42225c1bcd7","type":"group","z":"5b972161c4e0464e","style":{"stroke":"#999999","stroke-opacity":"1","fill":"none","fill-opacity":"1","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["e286c8cf0f18b990","279de14c4fcb638c","15e102f80cf28535","c4d2ad15a31bd520","aaea81c136a207e0","64a84ea2a47d4ccf","e9d80655226685f3","0d400b0bcd290e30","dc8d47a4e642899f","4ed5c064fef77a4b"],"x":274,"y":219,"w":672,"h":382},{"id":"e286c8cf0f18b990","type":"tcp in","z":"5b972161c4e0464e","g":"7a40a42225c1bcd7","name":"TCP Server","server":"server","host":"","port":"2000","datamode":"stream","datatype":"utf8","newline":"","topic":"","trim":false,"base64":false,"tls":"","x":370,"y":320,"wires":[["aaea81c136a207e0"]]},{"id":"279de14c4fcb638c","type":"inject","z":"5b972161c4e0464e","g":"7a40a42225c1bcd7","name":"Send data to tcp server","props":[{"p":"payload"}],"repeat":"2","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":430,"y":440,"wires":[["15e102f80cf28535"]]},{"id":"15e102f80cf28535","type":"tcp request","z":"5b972161c4e0464e","g":"7a40a42225c1bcd7","name":"TCP request","server":"127.0.0.1","port":"2000","out":"sit","ret":"string","splitc":" ","newline":"","trim":false,"tls":"","x":650,"y":440,"wires":[["c4d2ad15a31bd520"]]},{"id":"c4d2ad15a31bd520","type":"debug","z":"5b972161c4e0464e","g":"7a40a42225c1bcd7","name":"debug 2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":840,"y":440,"wires":[]},{"id":"aaea81c136a207e0","type":"debug","z":"5b972161c4e0464e","g":"7a40a42225c1bcd7","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":820,"y":320,"wires":[]},{"id":"64a84ea2a47d4ccf","type":"comment","z":"5b972161c4e0464e","g":"7a40a42225c1bcd7","name":"Creating TCP server uisng TCP In node","info":"","x":610,"y":260,"wires":[]},{"id":"e9d80655226685f3","type":"inject","z":"5b972161c4e0464e","g":"7a40a42225c1bcd7","name":"","props":[{"p":"payload"}],"repeat":"5","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":390,"y":560,"wires":[["0d400b0bcd290e30"]]},{"id":"0d400b0bcd290e30","type":"tcp out","z":"5b972161c4e0464e","g":"7a40a42225c1bcd7","name":"","host":"","port":"","beserver":"reply","base64":false,"end":false,"tls":"","x":830,"y":560,"wires":[]},{"id":"dc8d47a4e642899f","type":"comment","z":"5b972161c4e0464e","g":"7a40a42225c1bcd7","name":"Sending data to tcp server","info":"","x":590,"y":360,"wires":[]},{"id":"4ed5c064fef77a4b","type":"comment","z":"5b972161c4e0464e","g":"7a40a42225c1bcd7","name":"Sending data to client ","info":"","x":580,"y":520,"wires":[]}] -{% endrenderFlow %} \ No newline at end of file diff --git a/src/_includes/cta-get-started.njk b/src/_includes/cta-get-started.njk deleted file mode 100644 index 5e7e972756..0000000000 --- a/src/_includes/cta-get-started.njk +++ /dev/null @@ -1,10 +0,0 @@ -{% from "components/cta/cta-book-demo.njk" import ctaBookDemo %} -{#- Every caller of this include sets cta.buttonLink to /book-demo/ - the - fixed CtaBookDemo destination/copy/event replace the old data-driven - buttonLink/buttonText/event trio, so only cta.title/description (and - cta.position, for tracking) still come from the caller. -#} -
    -

    {{ cta.title }}

    -

    {{ cta.description }}

    - {{ ctaBookDemo('highlight', cta.position) }} -
    diff --git a/src/_includes/explore-more-content.njk b/src/_includes/explore-more-content.njk deleted file mode 100644 index c9a0fc8214..0000000000 --- a/src/_includes/explore-more-content.njk +++ /dev/null @@ -1,66 +0,0 @@ -{% if readingResources and readingResources == "stories" %} - {% include "stories-block.njk" %} -

    Learn more about how FlowFuse helps with your industrial data applications

    - {% endif %} -
    -
    -
    - -
    - {% image "./images/home/blog.png", "Image of hands typing on laptop working on Node-RED flows", [448] %} -
    -
    -

    Latest on the blog

    - {%- for item in collections[collectionName or 'posts'] | sort(attribute='item.date') | reverse | limit(3) -%} - -

    - - {{ item.data.title }} - -

    -
    - {%- endfor -%} -
    - - See all - {% include "components/icons/arrow-long-right.svg" %} - -
    -
    - {%- for item in collections.webinar | sort(attribute='item.date') | reverse | limit(1) -%} -
    - -
    - {% image "./images/home/webinar.png", "Image of hands typing on laptop working on Node-RED flows", [448] %} -
    -
    -

    {% if item.date | isFutureDate %}Upcoming{% else %}Latest{% endif %} Webinar

    -
    -

    {{ item.data.title }}

    -
    -
    - - {% if item.date | isFutureDate %} - - {% endif %} -
    -
    - {% if item.date | isFutureDate %}REGISTER NOW{% else %}WATCH WEBINAR{% - endif %} - {%- endfor -%} -
    -
    -
    -
    - {% image "./images/home/newsletter.png", "Image of hands typing on laptop working on Node-RED flows", [448] %} -
    -

    Newsletter

    -

    Sign up for our monthly email updates

    -
    -
    - {% include hubspot.script %} -
    -
    -
    diff --git a/src/_includes/faq.njk b/src/_includes/faq.njk deleted file mode 100644 index 281c2a0880..0000000000 --- a/src/_includes/faq.njk +++ /dev/null @@ -1,54 +0,0 @@ -
    -
    - {% if faqSubtitle %} -

    {{ faqTitle | safe }}

    - {% endif %} - {% if faqSubtitle %} - - {% endif %} -
    -
    - {% for faq in meta.faq %} -
    -

    - -

    - -
    - {% endfor %} -
    -
    -
    -
    - - diff --git a/src/_includes/get-started.njk b/src/_includes/get-started.njk deleted file mode 100644 index bc82276149..0000000000 --- a/src/_includes/get-started.njk +++ /dev/null @@ -1,28 +0,0 @@ -{% from "components/cta/cta-sign-up.njk" import ctaSignUp %} -{% from "components/cta/cta-contact-us.njk" import ctaContactUs %} -
    -

    Get Started with FlowFuse

    -

    Explore our pricing

    -
    -
    -
    -
    -
    - {% include "components/icons/cloud.svg" %} -
    -

    FlowFuse Cloud

    -

    Our managed hosted solution, maintained and supported by the FlowFuse team. Experience flexibility, scalability, and expert assistance to drive your business forward.

    -
    - {{ ctaSignUp(site, 'highlight', 'secondary', extraClass='mt-4 inline-block self-center sm:self-start') }} -
    -
    -
    -
    - {% include "components/icons/building-office-2.svg" %} -
    -

    On Premise

    -

    Deploy FlowFuse on your hardware for enhanced flexibility. Opt for self-hosted deployment with FlowFuse, enabling on-premises installation and full control over your deployment process.

    -
    - {{ ctaContactUs('primary', 'secondary', extraClass='mt-4 mb-6 sm:mb-0 inline-block self-center sm:self-start') }} -
    -
    \ No newline at end of file diff --git a/src/_includes/hardware/accessing-node-red-editor.md b/src/_includes/hardware/accessing-node-red-editor.md deleted file mode 100644 index 05076f3b54..0000000000 --- a/src/_includes/hardware/accessing-node-red-editor.md +++ /dev/null @@ -1,8 +0,0 @@ -## Accessing Node-RED Editor. - -1. Login into your FlowFuse account. -2. Click on the remote instances option in the left sidebar. -3. Click on the device and enable the developer mode by clicking on the top right-corner switch. -4. Once Developer Mode is enabled, click on the Open Editor option located next to the that switch. - -For more information refer to [FlowFuse documentation](/docs/user/introduction/#working-with-devices) \ No newline at end of file diff --git a/src/_includes/hardware/device-registration.md b/src/_includes/hardware/device-registration.md deleted file mode 100644 index 1c0057a077..0000000000 --- a/src/_includes/hardware/device-registration.md +++ /dev/null @@ -1,28 +0,0 @@ -### Registering the Device to Connect to FlowFuse - -Once you have installed the FlowFuse Device Agent, you need to register the hardware to connect it to your FlowFuse team. - -For instructions on how to register the hardware with your FlowFuse team, follow the documentation: [Register your Remote Instance](/docs/device-agent/register/). - -When registering your hardware, you will be presented with a dialog containing a one-time passcode command that the Device Agent uses to retrieve its configuration. **Make sure to copy it.** - -!["Dialog containing a one-time passcode command that the Device Agent can use to retrieve its configuration"](./images/configuration-dailog-with-one-time-code.png "Dialog containing a one-time passcode command that the Device Agent can use to retrieve its configuration"){data-zoomable} - -### Connecting Device - -Execute the command you have copied with sudo as shown below - -```bash -sudo flowfuse-device-agent -o https://app.flowfuse.com -``` - -Once executed, you should see an output similar to the one below, indicating that the FlowFuse Device Agent has been successfully configured: - -```bash -[AGENT] 3/21/2025 7:09:25 PM [info] Entering Device setup... -[AGENT] 3/21/2025 7:09:27 PM [info] Device setup was successful -[AGENT] 3/21/2025 7:09:27 PM [info] To start the Device Agent with the new configuration, run the following command: -[AGENT] 3/21/2025 7:09:27 PM [info] flowfuse-device-agent -``` - -Now, you can check the remote instance in the FlowFuse platform, where its status should be displayed as **"running."**. diff --git a/src/_includes/hardware/starting-device-agent-as-service-sysv.md b/src/_includes/hardware/starting-device-agent-as-service-sysv.md deleted file mode 100644 index b08ff58c73..0000000000 --- a/src/_includes/hardware/starting-device-agent-as-service-sysv.md +++ /dev/null @@ -1,79 +0,0 @@ -### Starting the FlowFuse Device Agent as a Service - -The system on this device typically utilizes SysVinit as its service management framework, responsible for starting, stopping, and managing background services during system boot and shutdown. On SysVinit-based systems, the FlowFuse Device Agent can be configured to run as a service at system startup by creating and enabling a custom init script. - -Create a script file named flowfuse-device-agent-init with the following content: - -``` -#!/bin/sh -### BEGIN INIT INFO -# Provides: flowfuse-device-agent -# Required-Start: $network SoftPAC -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Start the FlowFuse Device Agent at boot -# Description: Allow FlowFuse to manage Node-RED on this device -### END INIT INFO - -PROGRAM="/usr/bin/flowfuse-device-agent" -PIDFILE="/var/run/flowfuse-device-agent.pid" - -start() { - echo "Starting flowfuse-device-agent..." - $PROGRAM & - echo $! > $PIDFILE - echo "flowfuse-device-agent started." -} - -stop() { - echo "Stopping flowfuse-device-agent..." - kill $(cat $PIDFILE) - rm -f $PIDFILE - echo "flowfuse-device-agent stopped." -} - -status() { - if [ -f $PIDFILE ]; then - PID=$(cat $PIDFILE) - if ps -p $PID > /dev/null; then - echo "flowfuse-device-agent is running (PID: $PID)." - else - echo "flowfuse-device-agent is not running." - fi - else - echo "flowfuse-device-agent is not running." - fi -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - restart) - stop - start - ;; - status) - status - ;; - *) - echo "Usage: /etc/init.d/flowfuse-device-agent {start|stop|restart|status}" - exit 1 - ;; -esac - -exit 0 -``` - -Run the following commands to install and enable the service: - -```bash -sudo cp flowfuse-device-agent-init /etc/init.d/flowfuse-device-agent -sudo chmod +x /etc/init.d/flowfuse-device-agent -sudo update-rc.d flowfuse-device-agent defaults -``` - -This will register the script to start the FlowFuse Device Agent automatically at boot. \ No newline at end of file diff --git a/src/_includes/hardware/system/debian-ff-install.md b/src/_includes/hardware/system/debian-ff-install.md deleted file mode 100644 index 078b6e5492..0000000000 --- a/src/_includes/hardware/system/debian-ff-install.md +++ /dev/null @@ -1,25 +0,0 @@ -### Installing FlowFuse Device Agent - -Before we start, it is recommended to update and upgrade your system to ensure all your packages are up to date: - -```bash -sudo apt update && sudo apt upgrade -y -``` - -Next, let's install the FlowFuse device agent with the following script. - -```bash -bash <(curl -sL https://raw.githubusercontent.com/FlowFuse/device-agent/main/service/raspbian-install-device-agent.sh) -``` - -This script installs the Node.js runtime (if not already installed), sets up the FlowFuse device agent, and configures the device to automatically run the FlowFuse agent on boot and restart it in case of a crash. - -To verify that the service is running, use the following command: - -```bash -sudo systemctl status flowfuse-device-agent.service -``` - -If running, you should see a result similar to the one shown in the image below: - -!["Status of the FlowFuse Device Agent systemd service"](./images/systemctl-status.png "Status of the FlowFuse Device Agent systemd service"){data-zoomable} \ No newline at end of file diff --git a/src/_includes/hardware/system/opto-22-groove-rio.md b/src/_includes/hardware/system/opto-22-groove-rio.md deleted file mode 100644 index d6828b74c9..0000000000 --- a/src/_includes/hardware/system/opto-22-groove-rio.md +++ /dev/null @@ -1,10 +0,0 @@ -### Installing FlowFuse Device Agent - -Before starting the installation, it is recommended to update your system to -ensure that all your packages are up to date. You can use groov manage, which -acts as the command central for your groov RIO devices. For detailed -instructions on how to update the system, [watch this video](https://www.opto22.com/support/resources-tools/videos/playlist-what-is-groov-epic?wchannelid=61lkudfc8c&wmediaid=mxzzp2kudx). - -This guide is written for the firmware version of: `4.0.2-b.194`. Node.JS 20 is -available on the device, and you should be good to go to register the edge device -on FlowFuse. \ No newline at end of file diff --git a/src/_includes/hubspot/consent-fallback.njk b/src/_includes/hubspot/consent-fallback.njk deleted file mode 100644 index 64108342e3..0000000000 --- a/src/_includes/hubspot/consent-fallback.njk +++ /dev/null @@ -1,24 +0,0 @@ - \ No newline at end of file diff --git a/src/_includes/hubspot/hs-book-meeting.njk b/src/_includes/hubspot/hs-book-meeting.njk deleted file mode 100644 index 5e2dcb4f44..0000000000 --- a/src/_includes/hubspot/hs-book-meeting.njk +++ /dev/null @@ -1,23 +0,0 @@ -{% set fallbackId = 'meetings-consent-placeholder' %} -{% set contentType = 'meeting calendar' %} -{% include "hubspot/consent-fallback.njk" %} - diff --git a/src/_includes/hubspot/hs-form.njk b/src/_includes/hubspot/hs-form.njk deleted file mode 100644 index 1f96cd94c6..0000000000 --- a/src/_includes/hubspot/hs-form.njk +++ /dev/null @@ -1,31 +0,0 @@ -{% set hubspotData = hubspot or {} %} -{% set hubspotFormId = formId or hubspotData.formId %} -{% set formTargetId = targetId or ('hs-form-' + (hubspotFormId | replace('-', ''))) %} -{% set fallbackId = formTargetId + '-fallback' %} -{% set contentType = 'form' %} -{% set hubspotRegion = region or hubspotData.region or 'eu1' %} -{% set hubspotPortalId = portalId or hubspotData.portalId or '26586079' %} -{% set onFormSubmittedHandler = onFormSubmitted or hubspotData.onFormSubmitted %} -{% set ctaValue = cta or hubspotData.cta %} -{% set referenceValue = hubspotData.reference or title %} - -
    -{% include "hubspot/consent-fallback.njk" %} - diff --git a/src/_includes/images/industries/aerospace-components-problem.svg b/src/_includes/images/industries/aerospace-components-problem.svg deleted file mode 100644 index 836de7eeae..0000000000 --- a/src/_includes/images/industries/aerospace-components-problem.svg +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/images/industries/aerospace-components-solution.svg b/src/_includes/images/industries/aerospace-components-solution.svg deleted file mode 100644 index 9bb495b9ed..0000000000 --- a/src/_includes/images/industries/aerospace-components-solution.svg +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/images/industries/automotive-problem.svg b/src/_includes/images/industries/automotive-problem.svg deleted file mode 100644 index b60239ad52..0000000000 --- a/src/_includes/images/industries/automotive-problem.svg +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/images/industries/automotive-solution.svg b/src/_includes/images/industries/automotive-solution.svg deleted file mode 100644 index 77a60cd7db..0000000000 --- a/src/_includes/images/industries/automotive-solution.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/images/industries/aviation-aerospace-problem.svg b/src/_includes/images/industries/aviation-aerospace-problem.svg deleted file mode 100644 index 416686ebb5..0000000000 --- a/src/_includes/images/industries/aviation-aerospace-problem.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/images/industries/aviation-aerospace-solution.svg b/src/_includes/images/industries/aviation-aerospace-solution.svg deleted file mode 100644 index d9cbde11a8..0000000000 --- a/src/_includes/images/industries/aviation-aerospace-solution.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/images/industries/electronics-appliances-problem.svg b/src/_includes/images/industries/electronics-appliances-problem.svg deleted file mode 100644 index e9b039f445..0000000000 --- a/src/_includes/images/industries/electronics-appliances-problem.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/images/industries/electronics-appliances-solution.svg b/src/_includes/images/industries/electronics-appliances-solution.svg deleted file mode 100644 index dc19460a24..0000000000 --- a/src/_includes/images/industries/electronics-appliances-solution.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/images/industries/food-beverage-problem.svg b/src/_includes/images/industries/food-beverage-problem.svg deleted file mode 100644 index d3c45e6176..0000000000 --- a/src/_includes/images/industries/food-beverage-problem.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/images/industries/food-beverage-solution.svg b/src/_includes/images/industries/food-beverage-solution.svg deleted file mode 100644 index 948a774b47..0000000000 --- a/src/_includes/images/industries/food-beverage-solution.svg +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/images/industries/life-sciences-problem.svg b/src/_includes/images/industries/life-sciences-problem.svg deleted file mode 100644 index f38d816014..0000000000 --- a/src/_includes/images/industries/life-sciences-problem.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/images/industries/life-sciences-solution.svg b/src/_includes/images/industries/life-sciences-solution.svg deleted file mode 100644 index cfc01ab45d..0000000000 --- a/src/_includes/images/industries/life-sciences-solution.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/images/industries/renewable-problem.svg b/src/_includes/images/industries/renewable-problem.svg deleted file mode 100644 index 447e092e5d..0000000000 --- a/src/_includes/images/industries/renewable-problem.svg +++ /dev/null @@ -1,20 +0,0 @@ - diff --git a/src/_includes/images/industries/renewable-solution.svg b/src/_includes/images/industries/renewable-solution.svg deleted file mode 100644 index 3433f5e8f2..0000000000 --- a/src/_includes/images/industries/renewable-solution.svg +++ /dev/null @@ -1,39 +0,0 @@ - diff --git a/src/_includes/images/industries/semiconductors-problem.svg b/src/_includes/images/industries/semiconductors-problem.svg deleted file mode 100644 index c70c014878..0000000000 --- a/src/_includes/images/industries/semiconductors-problem.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/images/industries/semiconductors-solution.svg b/src/_includes/images/industries/semiconductors-solution.svg deleted file mode 100644 index 12cee127e7..0000000000 --- a/src/_includes/images/industries/semiconductors-solution.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/_includes/jsonld.njk b/src/_includes/jsonld.njk deleted file mode 100644 index 919b7677f0..0000000000 --- a/src/_includes/jsonld.njk +++ /dev/null @@ -1,162 +0,0 @@ -{% set authorSlug = authors[0] if authors and authors.length else null %} -{% set author = people[authorSlug] if authorSlug else null %} - - diff --git a/src/_includes/layouts/abm-landing.njk b/src/_includes/layouts/abm-landing.njk deleted file mode 100644 index 1c78feb388..0000000000 --- a/src/_includes/layouts/abm-landing.njk +++ /dev/null @@ -1,176 +0,0 @@ ---- -layout: page -nohero: true ---- -{% from "components/cta/cta-sign-up.njk" import ctaSignUp %} -{% from "components/cta/cta-book-demo.njk" import ctaBookDemo %} - -
    -
    -
    -
    -

    - {{ heroTitle | safe }} -

    -
    -

    - {{ meta.description | safe }} -

    -
      - {% for value in values %} -
    • {{ value }}
    • - {% endfor %} -
    -
    - -
    -
    -
    - {% set imageSrc = ["./", image ] | join %} - {% image imageSrc, imageDescription, [496] %} -
    -
    -
    - {{ ctaBookDemo('primary', 'hero-mobile', extraClass='w-full mt-12 min-h-[40px]') }} - {{ ctaSignUp(site, 'ghost', 'hero-mobile', icon=true, extraClass='flex flex-col w-full m-auto sm:mt-12') }} -
    -
    -
    -
    - -

    {{ problem.title | safe }}

    - {% for paragraph in problem.description %} -

    {{ paragraph | safe }}

    - {% endfor %} -
    -
    - -
    -
    -

    {{ solution.title | safe }}

    -

    {{ solution.description | safe }}

    -
    - {% for benefit in solution.benefits %} -
    -
    -
    -
    - {% include benefit.svgPath %} -
    -
    -
    -
    {{ benefit.title }} -
    -
    -
    -
    -
    -

    {{ benefit.description | safe }}

    -
    -
    -
    - {% endfor %} -
    -
    -
    -
    -
    - -

    {{ testimonialsTitle | safe }}

    -
    -
    - {% include "testimonials.njk" %} -
    -
    - -
    -
    - {% include "social-proof.njk" %} -
    -
    - -

    {{ useCases.title | safe }}

    -
    -
    -
    - {% for item in useCases.case %} -
    -
    {{ item.title }}
    -

    {{ item.description }}

    -
    - {% endfor %} -
    - - -
    -
    -
    -
    - -
    -
    -

    {{ how.title | safe }}

    -
    - {% for step in how.steps %} -
    -
    -
    -
    Step {{ loop.index }}
    -
    -

    {{ step.title }}

    -
    -
    -
    -

    {{ step.description | safe }}

    -
    -
    - - {% if not loop.last %} - -
    - {% include "components/icons/chevron-down.svg" %} -
    - {% endif %} -
    - {% endfor %} -
    -
    -
    - -
    -
    -

    {{ features.title | safe }}

    - -
    - {% for feature in features.features %} -
    -
    - {% include feature.svgPath %} -
    - {{ feature.title }} -
    - {% endfor %} -
    -
    -
    -
    - -
    -

    {{ ctaSection.title }}

    -

    {{ ctaSection.description }}

    -
    - {{ ctaBookDemo('primary', 'secondary', extraClass='min-h-[40px]') }} - {{ ctaSignUp(site, 'primary-outlined', 'secondary', extraClass='min-h-[40px]') }} -
    -
    -
    diff --git a/src/_includes/layouts/base.njk b/src/_includes/layouts/base.njk deleted file mode 100644 index 57d5597607..0000000000 --- a/src/_includes/layouts/base.njk +++ /dev/null @@ -1,449 +0,0 @@ ---- -meta: - language: en-US - type: page - site: - name: FlowFuse - description: {{ messaging.title }} - url: https://flowfuse.com - logo: - src: https://flowfuse.com/handbook/images/logos/ff-logo--square--dark.png - width: 396 - height: 215 - author: - name: FlowFuse - image: - src: https://flowfuse.com/handbook/images/logos/ff-logo--square--dark.png -eleventyComputed: - meta: - url: "{{ page.url | url | toAbsoluteUrl }}" - title: "{{ meta.title }}" - description: "{{ meta.description }}" - modified: "{{ page.date }}" - keywords: "{{ meta.keywords }}" ---- - -{% from "components/cta/cta-sign-up.njk" import ctaSignUp %} -{% from "components/cta/cta-sign-in.njk" import ctaSignIn %} -{% from "components/cta/cta-book-demo.njk" import ctaBookDemo %} - - - - - - - - - - - - - - - - - - - {% if meta.keywords %} - - {% elif keywords %} - - {% elif tags %} - {% set filtered_tags = tags | reject('equalto', 'posts') | reject('equalto', 'node-red') | list %} - - {% else %} - - {% endif %} - - - {% if metaTitle %} - {{ metaTitle }} | FlowFuse - {% elif navTitle %} - {{ navTitle }} • FlowFuse{% if page.url and page.url.match('\/handbook\/.+') %} Handbook{% endif %}{% if page.url and page.url.match('\/docs\/.+') %} Docs{% endif %} - {% elif meta and meta.title %} - {{ meta.title }} • FlowFuse{% if page.url and page.url.match('\/handbook\/.+') %} Handbook{% endif %}{% if page.url and page.url.match('\/docs\/.+') %} Docs{% endif %} - {% elif title %} - {{ title }} • FlowFuse{% if page.url and page.url.match('\/handbook\/.+') %} Handbook{% endif %}{% if page.url and page.url.match('\/docs\/.+') %} Docs{% endif %} - {% else %} - {% set extractedTitle = content | extractH1Content %} - {% if extractedTitle and page.url != '/' %} - {{ extractedTitle }} • FlowFuse{% if page.url and page.url.match('\/handbook\/.+') %} Handbook{% endif %}{% if page.url and page.url.match('\/docs\/.+') %} Docs{% endif %} - {% else %} - FlowFuse • {{ site.messaging.tagLine | replace('<br />', ' ' ) }} - {% endif %} - {% endif %} - - - - - {% if meta and meta.description %} - - {% elif description %} - - {% else %} - - {% endif %} - - {% if skipIndex -%} - - {%- endif %} - - - {% if metaTitle %} - - {% elif navTitle %} - - {% elif meta and meta.title %} - - {% elif title %} - - {% else %} - - {% endif %} - - - {% if meta and meta.description %} - - {% elif description %} - - {% else %} - - {% endif %} - - - - - {% if image %} - - - {% else %} - - - {% endif %} - - {% if tags and 'posts' in tags %} - - - - {% if team[authors|first] and team[authors|first].twitter %} - - {% else %} - - {% endif %} - {% else %} - - - - - {% endif %} - - {% if nav %} - - {% endif %} - - {% if type == 'post' %} - - {% if date %} - - {% endif %} - {% if lastUpdated %} - - {% elif date %} - - {% endif %} - {% endif %} - - {% if searchTitle %} - - {% endif %} - - {% set js %}{% include "base.js" %}{% endset %} - - - {% include "jsonld.njk" %} - - - - - - - - {%- if not DEV_MODE -%} - {% include "analytics/head.html" %} - {%- endif -%} - - - Skip to main content - - {% include "../components/top-utility-bar.njk" %} - -
    - - - -
    - -
    -
    - -
    - {{ content | safe }} -
    -
    -
    - - {% include "components/hm-promo-banner.njk" %} - -
    -
    - -
    - {%- for sec in chrome.footer.sections %} -
    -

    {{ sec.title }}

    -
    - {%- for grp in sec.groups %} - -

    {{ grp.title }}

    - -
    - {%- endfor %} -
    -
    - {%- endfor %} - - -
    - -
    -
    - -
    -
    - {%- for grp in chrome.footer.company.grid %} -
    - -
    - {%- endfor %} -
    -
    -
      - {%- for item in chrome.footer.company.trailing.links %} -
    • {{ item.label }}
    • - {%- endfor %} -
    -
    -
    -
    - -
    -
    - Copyright {% year %} FlowFuse Inc. All Rights Reserved. - - Privacy - - Terms - - Cookie preferences -
    - -
    - - - - - - - - -{%- if not DEV_MODE -%} -{% include "analytics/body.html" %} -{%- endif -%} - diff --git a/src/_includes/layouts/common-js.njk b/src/_includes/layouts/common-js.njk deleted file mode 100644 index c96323f1c3..0000000000 --- a/src/_includes/layouts/common-js.njk +++ /dev/null @@ -1,212 +0,0 @@ - - - - - -{% initClipboardJS %} - - - - - - - - - - - - - - -{% include "medium-zoom.min.njk" %} - - - diff --git a/src/_includes/layouts/landing-comparison.njk b/src/_includes/layouts/landing-comparison.njk deleted file mode 100644 index 50aca98eb4..0000000000 --- a/src/_includes/layouts/landing-comparison.njk +++ /dev/null @@ -1,120 +0,0 @@ ---- -layout: page -nohero: true -hubspot: - script: "hubspot/hs-form.njk" ---- - -
    - - -
    -
    - -
    -

    - {{ hero.headline }} {{ hero.headlineHighlight }} -

    -

    {{ hero.intro1 | safe }}

    -

    {{ hero.intro2 | safe }}

    - -
    - -
    -
    - {% set heroImageSrc = ["./", hero.image] | join %} - {% image heroImageSrc, hero.imageAlt, [496] %} -
    -
    - - - {{ hero.buttonText }} - - -
    -
    - - -
    -
    -
    - - -
    -
    -

    {{ leftCard.title | safe }}

    -
    -
      - {% for item in leftCard.items %} -
    • -
      -
      {% include item.icon %}
      -
      - {{ item.text | safe }} -
    • - {% endfor %} -
    -
    - - -
    -
    -

    {{ rightCard.title | safe }}

    -
    -
      - {% for item in rightCard.items %} -
    • -
      -
      {% include item.icon %}
      -
      - {{ item.text | safe }} -
    • - {% endfor %} -
    -
    - -
    -
    -
    - - -
    -
    -
    - - -
    -
    -
    -
    {% include "components/icons/light-bulb.svg" %}
    -
    -

    Key takeaway

    -
    -

    {{ takeaway.para1 | safe }}

    -

    {{ takeaway.para2 | safe }}

    -
    - - -
    -
    -
    -
    {% include "components/icons/document-text.svg" %}
    -
    -

    {{ form.title }}

    -
    - {% include hubspot.script %} -
    - -
    -
    -
    - -
    - -{% include "smooth-scroll.njk" %} diff --git a/src/_includes/layouts/mql-contact.njk b/src/_includes/layouts/mql-contact.njk deleted file mode 100644 index c4f7cadc06..0000000000 --- a/src/_includes/layouts/mql-contact.njk +++ /dev/null @@ -1,53 +0,0 @@ ---- -layout: layouts/page.njk -hideTitle: true ---- -
    -
    - - -
    -

    {{ title }}

    -

    {{ description | safe }}

    -
    - - -
    - {% if hubspot.script == "hubspot/hs-form.njk" %} -
    - {% include hubspot.script %} -
    - {% else %} - {% include hubspot.script %} - {% endif %} -
    - - -
    -
    - {% for channel in otherChannels %} -
    -
    -
    - {% set iconPath = "components/icons/" + channel.icon + ".svg" %} - {% include iconPath %} -
    -

    {{ channel.title }}

    -
    -

    {{ channel.description }}

    - - {{ channel.buttonText }} - {% include "components/icons/arrow-long-right.svg" %} - -
    - {% endfor %} -
    -
    - - -
    - {% include "social-proof.njk" %} -
    - -
    -
    diff --git a/src/_includes/layouts/nohero.njk b/src/_includes/layouts/nohero.njk deleted file mode 100644 index 8c4056fd73..0000000000 --- a/src/_includes/layouts/nohero.njk +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: layouts/page.njk -nohero: true ---- -
    - {{ content | safe }} -
    diff --git a/src/_includes/layouts/page.njk b/src/_includes/layouts/page.njk deleted file mode 100644 index cf28c999a3..0000000000 --- a/src/_includes/layouts/page.njk +++ /dev/null @@ -1,44 +0,0 @@ ---- -layout: layouts/base.njk ---- - -
    - {% if (title and not hideTitle) %} -
    - {% if nohero %} -
    -
    -

    {{ title }}

    -
    - {% elif heroimg %} -
    -
    -

    {{ title }}

    - {% if subtitle %} -

    {{ subtitle | safe }}

    - {% endif %} - {% if (description and not hideDescription) %} -

    {{ description | safe }}

    - {% endif %} -
    - {% if heroimg %} - - {% endif %} - {% else %} -
    -
    -

    {{ title }}

    -

    {{ subtitle | safe }}

    -

    {{ description | safe }}

    -
    - {% endif %} -
    -
    - {% endif %} -
    - {{ content | safe }} -
    -
    \ No newline at end of file diff --git a/src/_includes/layouts/redirect.njk b/src/_includes/layouts/redirect.njk deleted file mode 100644 index ff329dcc9b..0000000000 --- a/src/_includes/layouts/redirect.njk +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - You should be redirected to {{ redirect.to }} - - diff --git a/src/_includes/layouts/story.njk b/src/_includes/layouts/story.njk deleted file mode 100644 index 8c4afb7a93..0000000000 --- a/src/_includes/layouts/story.njk +++ /dev/null @@ -1,125 +0,0 @@ ---- -layout: layouts/base.njk ---- -{% from "components/cta/cta-book-demo.njk" import ctaBookDemo %} -
    - {% if title %} -
    -
    -
    - -

    {{ title }}

    - {% if subtitle %} -

    {{ subtitle | safe }}

    - {% endif %} -
    -
    -
    - {% endif %} -
    -
    - - {% include "components/icons/chevron-left.svg" %} - Back to Customer Stories - -
    -
    -
    - {% if story.quote %} - - {{story.quote}} - - {% endif %} - {{ content | safe }} -
    -
    -
    -
    - {% if story.logo %} - -
    - {% endif %} -
    -

    Challenge

    -

    {{ story.challenge }}

    -
    -
    -

    Solution

    -

    {{ story.solution }}

    - {% if story.products.length > 0 %} -
    -
    using:
    -
    -
    - - {% endif %} -
    -
    -

    Results

    -
      - {% for result in story.results %} -
    • - {{ result }} -
    • - {% endfor %} -
    -
    - {{ ctaBookDemo('primary', 'story-cta', extraClass='md:self-end align-baseline w-full mt-3') }} -
    - {% if hubspot.formId %} -
    -
    -

    Download Case Study

    - {% include "hubspot/hs-form.njk" %} -
    -
    - {% endif %} -
    -
    -

    Read more stories

    - {% include "stories-block.njk" %} -
    -
    -
    - - - -{% initClipboardJS %} - - - - - -{% include "medium-zoom.min.njk" %} \ No newline at end of file diff --git a/src/_includes/layouts/toc.njk b/src/_includes/layouts/toc.njk deleted file mode 100644 index 82fdde168e..0000000000 --- a/src/_includes/layouts/toc.njk +++ /dev/null @@ -1,8 +0,0 @@ -{% if content | toc %} -
    -

    Table of Contents

    -
    - {{ content | toc | safe }} -
    -
    -{% endif %} \ No newline at end of file diff --git a/src/_includes/layouts/webinar.njk b/src/_includes/layouts/webinar.njk deleted file mode 100644 index 2e31573d4d..0000000000 --- a/src/_includes/layouts/webinar.njk +++ /dev/null @@ -1,79 +0,0 @@ ---- -layout: layouts/base.njk ---- - -
    - {% if title %} -
    -
    - -

    {{ title }}

    - {% if subtitle %} -

    {{ subtitle | safe }}

    - {% endif %} -
    - - - -
    -
    -
    - {% endif %} -
    -
    -
    - - {% include "components/icons/chevron-left.svg" %} - Back to Webinars - - {% if video %} - - {% else %} - {% if image %} -
    - {% set imageSrc = ["./", image ] | join %} - {% set imageDescription = ["Image representing ", title] | join %} - {% image imageSrc, imageDescription, [706] %} -
    - {% endif %} - {% endif %} -
    -
    - {{ content | safe }} -
    -
    - {% if meta.faq %} -
    -
    -

    Frequently Asked Questions

    -
    - {% set type = 'post' %} - {% include "faq.njk" %} -
    - {% endif %} -
    -
    - {% if date | dateInFuture and not hubspot.downloadFormId %} -
    -

    Register Here:

    - {% set cta = 'cta-webinar-register' %} - {% include "hubspot/hs-form.njk" %} -
    - {% endif %} -
    -

    Presented by:

    - {% for host in hosts %} - {% renderTeamMember people[host] %} - {% endfor %} - {% if hubspot.downloadFormId %} -
    -

    Download webinar slides

    - {% set formId = hubspot.downloadFormId %} - {% set cta = 'cta-webinar-download-slides' %} - {% include "hubspot/hs-form.njk" %} -
    - {% endif %} -
    -
    -
    -
    diff --git a/src/_includes/medium-zoom.min.njk b/src/_includes/medium-zoom.min.njk deleted file mode 100644 index dbfdbd815a..0000000000 --- a/src/_includes/medium-zoom.min.njk +++ /dev/null @@ -1,19 +0,0 @@ - - \ No newline at end of file diff --git a/src/_includes/navigation-items-list.njk b/src/_includes/navigation-items-list.njk deleted file mode 100644 index 70b6f4967c..0000000000 --- a/src/_includes/navigation-items-list.njk +++ /dev/null @@ -1,7 +0,0 @@ -
      - {% for item in collections.all %} - {% if item.data.eleventyNavigation.parent == eleventyNavigation.key %} -
    • {{ item.data.meta.title }}: {{ item.data.meta.description }}
    • - {% endif %} - {% endfor %} -
    diff --git a/src/_includes/sign-up-url.njk b/src/_includes/sign-up-url.njk deleted file mode 100644 index 1f3ba6ba73..0000000000 --- a/src/_includes/sign-up-url.njk +++ /dev/null @@ -1 +0,0 @@ -{{- site.appURL -}}/account/create \ No newline at end of file diff --git a/src/_includes/smooth-scroll.njk b/src/_includes/smooth-scroll.njk deleted file mode 100644 index 77e8f5a67a..0000000000 --- a/src/_includes/smooth-scroll.njk +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/src/_includes/social-proof.njk b/src/_includes/social-proof.njk deleted file mode 100644 index 4c668fea93..0000000000 --- a/src/_includes/social-proof.njk +++ /dev/null @@ -1,22 +0,0 @@ -{% if socialProofEyebrow != false %} -
    -

    {{ socialProofEyebrow if socialProofEyebrow else "Over 36,000 users have trusted FlowFuse" }}

    -
    -{% endif %} - - - \ No newline at end of file diff --git a/src/_includes/stories-block.njk b/src/_includes/stories-block.njk deleted file mode 100644 index 51f62a61ef..0000000000 --- a/src/_includes/stories-block.njk +++ /dev/null @@ -1,7 +0,0 @@ -
      - {% from "stories/customer-story.njk" import storyTile %} - - {%- for item in collections.stories | excludeCurrent(page.url) | shuffle | limit(3) -%} - {{ storyTile(title=item.data.title, url="/customer-stories/" ~ item.fileSlug ~ "/", brand=item.data.story.brand, logo=item.data.logo, image=item.data.image) }} - {%- endfor -%} -
    \ No newline at end of file diff --git a/src/_includes/stories/customer-story.njk b/src/_includes/stories/customer-story.njk deleted file mode 100644 index 2ced395acc..0000000000 --- a/src/_includes/stories/customer-story.njk +++ /dev/null @@ -1,42 +0,0 @@ -{% macro storyTile(title, url, brand, logo, image) %} -
  • - -
    -
    - {% if image %} -
    -
    - {% set imageSrc = [image ] | join %} - {% set imageDescription = ["Image representing ", title] | join %} - - {{ imageDescription }} - -
    - {% if logo %} -
    - {% set imageSrc = [logo] | join %} - {% set imageDescription = ["Image representing ", brand, " logo"] | join %} - - {{ imageDescription }} - -
    - {% endif %} -
    - {% else %} -
    - {% set imageSrc = "/images/og-blog.jpg" %} - {% set imageDescription = "Image with logo and the slogan: Elevate Node-RED with Flowfuse" %} - - {{ imageDescription }} - -
    - {% endif %} -
    -
    - -

    {{ title }}

    -
    -
    -
    -
  • -{% endmacro %} \ No newline at end of file diff --git a/src/_includes/summary.njk b/src/_includes/summary.njk deleted file mode 100644 index e41bd43db8..0000000000 --- a/src/_includes/summary.njk +++ /dev/null @@ -1,4 +0,0 @@ -{% set summary = item.data.excerpt or item.data.description or item.data.meta.description %} -{% if summary %} -{{ summary | md | stripLinks | safe }} -{% endif %} \ No newline at end of file diff --git a/src/_includes/testimonials.njk b/src/_includes/testimonials.njk deleted file mode 100755 index 442ad39e84..0000000000 --- a/src/_includes/testimonials.njk +++ /dev/null @@ -1,93 +0,0 @@ - -
    -
    - {%- for t in testimonials -%} - - {%- endfor -%} -
    - {% if browseAllUrl %} - - {{ browseAllText | default("Browse all customer stories") }} - {% include "components/icons/arrow-long-right.svg" %} - - {% endif %} -
    - - \ No newline at end of file diff --git a/src/_includes/values.njk b/src/_includes/values.njk deleted file mode 100644 index d0b5577dd1..0000000000 --- a/src/_includes/values.njk +++ /dev/null @@ -1,22 +0,0 @@ -
    -
    - {% image "./images/pictograms/results_blue.png", "Icon representing Results", [128] %} -

    Results

    -
    -
    - {% image "./images/pictograms/iteration_blue.png", "Icon representing Iterative Improvement", [128] %} -

    Iterative Improvement

    -
    -
    - {% image "./images/pictograms/community_blue.png", "Icon representing Collaborative Community", [128] %} -

    Collaborative Community

    -
    -
    - {% image "./images/pictograms/candor_blue.png", "Icon representing Constructive Candor", [128] %} -

    Constructive Candor

    -
    -
    - {% image "./images/pictograms/trusting_blue.png", "Icon representing Customer Empathy", [128] %} -

    Customer Empathy

    -
    -
    diff --git a/src/css/style.eleventy.nav.css b/src/css/style.eleventy.nav.css deleted file mode 100644 index 6a9869bb61..0000000000 --- a/src/css/style.eleventy.nav.css +++ /dev/null @@ -1,95 +0,0 @@ - -@layer components { - -.eleventy-nav { - border-right: 1px solid right; - text-transform: capitalize; - --nav-weight: 500; - --nav-color: var(--color-gray-700); - --nav-bg: transparent; - --nav-pl: 1rem; - background-color: transparent; - padding-top: 0.25rem; - max-height: calc(100vh - 1.5rem); - overflow-y: auto; - @apply sticky top-14 pl-2 sm:pl-6 xl:pl-0; -} - -.has-children > ul > li:not(.has-children) { - --nav-bg: transparent; - color: var(--nav-color); - --nav-weight: 300; - --nav-pl: 1.25rem; - margin-left: 1.25rem; -} - -.has-children > ul > li.has-children { - margin-left: 1.25rem; -} - -.eleventy-nav li > a, -.eleventy-nav li > div { - @apply flex justify-between items-stretch my-1; - font-weight: var(--nav-weight); - background-color: var(--nav-bg); - border-left: 4px solid; - border-color: var(--nav-bg); - flex-grow: 1; - color: var(--nav-color) !important; - padding-right: var(--nav-pl); - padding-left: var(--nav-pl); - @apply py-1.5; -} - -.eleventy-nav li > div > a { - color: var(--nav-color) !important; -} - -.eleventy-nav li div:hover, -.eleventy-nav li > a:hover { - background-color: var(--color-gray-200); -} - -.eleventy-nav li.active > a, -.eleventy-nav li.active.has-children > div, -.eleventy-nav .has-children > ul > li.active:not(.has-children) > a { - background-color: var(--color-gray-100); - border-color: var(--color-indigo-600); -} - -.has-children { - display: flex; - flex-direction: column; -} - -.link-chevron-container { - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; -} - -.link-chevron-container > a { - flex-grow: 1; -} - -.link-chevron-container > span.chevron { - display: inline-block; - width: 24px; - height: 24px; - padding: 3px; - margin-right: 10px; - cursor: pointer; - transition: transform 0.3s ease; -} - -.chevron { - margin-top: auto; - margin-bottom: auto; -} - -.chevron.rotated { - transform: rotate(180deg); -} - -} /* end @layer components */ diff --git a/src/customer-stories/customer-stories.json b/src/customer-stories/customer-stories.json deleted file mode 100644 index d94c082cd9..0000000000 --- a/src/customer-stories/customer-stories.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "tags": [ - "stories" - ], - "layout": "layouts/story.njk", - "nav": "customer-stories", - "searchTitle": "Customer Stories", - "permalink": false -} diff --git a/src/images/about/about.png b/src/images/about/about.png deleted file mode 100644 index 7682dcc420..0000000000 Binary files a/src/images/about/about.png and /dev/null differ diff --git a/src/images/about/investors/cota-capital.png b/src/images/about/investors/cota-capital.png deleted file mode 100644 index 40f26c5dac..0000000000 Binary files a/src/images/about/investors/cota-capital.png and /dev/null differ diff --git a/src/images/about/investors/opencore.png b/src/images/about/investors/opencore.png deleted file mode 100644 index 178a9480bc..0000000000 Binary files a/src/images/about/investors/opencore.png and /dev/null differ diff --git a/src/images/about/investors/uncorrelated.png b/src/images/about/investors/uncorrelated.png deleted file mode 100644 index 41358d5136..0000000000 Binary files a/src/images/about/investors/uncorrelated.png and /dev/null differ diff --git a/src/images/about/investors/westwave.png b/src/images/about/investors/westwave.png deleted file mode 100644 index 4aa3f27ec3..0000000000 Binary files a/src/images/about/investors/westwave.png and /dev/null differ diff --git a/src/images/abrasive-technology-icon.png b/src/images/abrasive-technology-icon.png deleted file mode 100644 index dceaaf3a22..0000000000 Binary files a/src/images/abrasive-technology-icon.png and /dev/null differ diff --git a/src/images/dashboard/bar-chart.gif b/src/images/dashboard/bar-chart.gif deleted file mode 100644 index 8212af6d27..0000000000 Binary files a/src/images/dashboard/bar-chart.gif and /dev/null differ diff --git a/src/images/dashboard/dashboard-flowfuse.png b/src/images/dashboard/dashboard-flowfuse.png deleted file mode 100644 index d176671ace..0000000000 Binary files a/src/images/dashboard/dashboard-flowfuse.png and /dev/null differ diff --git a/src/images/dashboard/donut-chart.gif b/src/images/dashboard/donut-chart.gif deleted file mode 100644 index 763f43a47e..0000000000 Binary files a/src/images/dashboard/donut-chart.gif and /dev/null differ diff --git a/src/images/dashboard/line-chart.gif b/src/images/dashboard/line-chart.gif deleted file mode 100644 index 641cb0b6cd..0000000000 Binary files a/src/images/dashboard/line-chart.gif and /dev/null differ diff --git a/src/images/ebooks/ebook_dashboard.png b/src/images/ebooks/ebook_dashboard.png deleted file mode 100644 index 445cace43c..0000000000 Binary files a/src/images/ebooks/ebook_dashboard.png and /dev/null differ diff --git a/src/images/ff-logo--wordmark--white.svg b/src/images/ff-logo--wordmark--white.svg deleted file mode 100644 index 4c588db574..0000000000 --- a/src/images/ff-logo--wordmark--white.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/images/flowfuse-icon.png b/src/images/flowfuse-icon.png deleted file mode 100644 index 33474d5c0d..0000000000 Binary files a/src/images/flowfuse-icon.png and /dev/null differ diff --git a/src/images/home/blog.png b/src/images/home/blog.png deleted file mode 100644 index 62b4a77af5..0000000000 Binary files a/src/images/home/blog.png and /dev/null differ diff --git a/src/images/home/collect.png b/src/images/home/collect.png deleted file mode 100644 index 86ce6d3c06..0000000000 Binary files a/src/images/home/collect.png and /dev/null differ diff --git a/src/images/home/collect_graphic.png b/src/images/home/collect_graphic.png deleted file mode 100644 index e7a9f3e4fa..0000000000 Binary files a/src/images/home/collect_graphic.png and /dev/null differ diff --git a/src/images/home/connect.png b/src/images/home/connect.png deleted file mode 100644 index 5aa27b5660..0000000000 Binary files a/src/images/home/connect.png and /dev/null differ diff --git a/src/images/home/connect_graphic.png b/src/images/home/connect_graphic.png deleted file mode 100644 index 384d4e30f1..0000000000 Binary files a/src/images/home/connect_graphic.png and /dev/null differ diff --git a/src/images/home/data-silos.jpg b/src/images/home/data-silos.jpg deleted file mode 100644 index 6f260f8fae..0000000000 Binary files a/src/images/home/data-silos.jpg and /dev/null differ diff --git a/src/images/home/flowfuse-home-ui.png b/src/images/home/flowfuse-home-ui.png deleted file mode 100644 index dc792ce984..0000000000 Binary files a/src/images/home/flowfuse-home-ui.png and /dev/null differ diff --git a/src/images/home/hero/config.json b/src/images/home/hero/config.json deleted file mode 100644 index ee452c678a..0000000000 --- a/src/images/home/hero/config.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - { "file": "hero-1.jpg", "alt": "Industrial manufacturing facility", "mobileOverlay": true }, - { "file": "hero-2.jpg", "alt": "Industrial shipping port with cargo containers and cranes", "mobileOverlay": true }, - { "file": "hero-3.jpg", "alt": "Large-scale solar panel array at an industrial energy facility", "mobileOverlay": false } -] diff --git a/src/images/home/hero/hero-1.jpg b/src/images/home/hero/hero-1.jpg deleted file mode 100644 index 35f3eb12d9..0000000000 Binary files a/src/images/home/hero/hero-1.jpg and /dev/null differ diff --git a/src/images/home/hero/hero-2.jpg b/src/images/home/hero/hero-2.jpg deleted file mode 100644 index 0b84b462eb..0000000000 Binary files a/src/images/home/hero/hero-2.jpg and /dev/null differ diff --git a/src/images/home/hero/hero-3.jpg b/src/images/home/hero/hero-3.jpg deleted file mode 100644 index a6a2e52899..0000000000 Binary files a/src/images/home/hero/hero-3.jpg and /dev/null differ diff --git a/src/images/home/home-dashboard.png b/src/images/home/home-dashboard.png deleted file mode 100644 index f099c3cc6a..0000000000 Binary files a/src/images/home/home-dashboard.png and /dev/null differ diff --git a/src/images/home/home-data-integration.png b/src/images/home/home-data-integration.png deleted file mode 100644 index 32db38409d..0000000000 Binary files a/src/images/home/home-data-integration.png and /dev/null differ diff --git a/src/images/home/home-edge-connectivity.png b/src/images/home/home-edge-connectivity.png deleted file mode 100644 index a16574caeb..0000000000 Binary files a/src/images/home/home-edge-connectivity.png and /dev/null differ diff --git a/src/images/home/home-itot-middleware.png b/src/images/home/home-itot-middleware.png deleted file mode 100644 index 97a3bf0d53..0000000000 Binary files a/src/images/home/home-itot-middleware.png and /dev/null differ diff --git a/src/images/home/home-mes.png b/src/images/home/home-mes.png deleted file mode 100644 index 8206a05ccd..0000000000 Binary files a/src/images/home/home-mes.png and /dev/null differ diff --git a/src/images/home/home-node-red.png b/src/images/home/home-node-red.png deleted file mode 100644 index 69b039ea7a..0000000000 Binary files a/src/images/home/home-node-red.png and /dev/null differ diff --git a/src/images/home/home-pipeline.png b/src/images/home/home-pipeline.png deleted file mode 100644 index 26b847fecd..0000000000 Binary files a/src/images/home/home-pipeline.png and /dev/null differ diff --git a/src/images/home/home-scada.png b/src/images/home/home-scada.png deleted file mode 100644 index 628f84fb95..0000000000 Binary files a/src/images/home/home-scada.png and /dev/null differ diff --git a/src/images/home/home-solution-background.svg b/src/images/home/home-solution-background.svg deleted file mode 100644 index e93165f8fd..0000000000 --- a/src/images/home/home-solution-background.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/images/home/home-uns.png b/src/images/home/home-uns.png deleted file mode 100644 index eb0162f90f..0000000000 Binary files a/src/images/home/home-uns.png and /dev/null differ diff --git a/src/images/home/interact_graphic.png b/src/images/home/interact_graphic.png deleted file mode 100644 index 330eaba361..0000000000 Binary files a/src/images/home/interact_graphic.png and /dev/null differ diff --git a/src/images/home/newsletter.png b/src/images/home/newsletter.png deleted file mode 100644 index 3eb8841f91..0000000000 Binary files a/src/images/home/newsletter.png and /dev/null differ diff --git a/src/images/home/visualise_graphic.png b/src/images/home/visualise_graphic.png deleted file mode 100644 index 48330c5feb..0000000000 Binary files a/src/images/home/visualise_graphic.png and /dev/null differ diff --git a/src/images/home/webinar.png b/src/images/home/webinar.png deleted file mode 100644 index 6fb71d4ddd..0000000000 Binary files a/src/images/home/webinar.png and /dev/null differ diff --git a/src/images/industries/aerospace-components-use-case-1.jpg b/src/images/industries/aerospace-components-use-case-1.jpg deleted file mode 100644 index a7d875161a..0000000000 Binary files a/src/images/industries/aerospace-components-use-case-1.jpg and /dev/null differ diff --git a/src/images/industries/aerospace-components-use-case-2.jpg b/src/images/industries/aerospace-components-use-case-2.jpg deleted file mode 100644 index 3a8a75f428..0000000000 Binary files a/src/images/industries/aerospace-components-use-case-2.jpg and /dev/null differ diff --git a/src/images/industries/aerospace-components-use-case-3.jpg b/src/images/industries/aerospace-components-use-case-3.jpg deleted file mode 100644 index a386d09ec8..0000000000 Binary files a/src/images/industries/aerospace-components-use-case-3.jpg and /dev/null differ diff --git a/src/images/industries/aerospace-components.jpg b/src/images/industries/aerospace-components.jpg deleted file mode 100644 index 2efd7dbdb1..0000000000 Binary files a/src/images/industries/aerospace-components.jpg and /dev/null differ diff --git a/src/images/industries/automotive-changeover.jpg b/src/images/industries/automotive-changeover.jpg deleted file mode 100644 index 79635c9e39..0000000000 Binary files a/src/images/industries/automotive-changeover.jpg and /dev/null differ diff --git a/src/images/industries/automotive-dashboards.jpg b/src/images/industries/automotive-dashboards.jpg deleted file mode 100644 index 8f79da6e42..0000000000 Binary files a/src/images/industries/automotive-dashboards.jpg and /dev/null differ diff --git a/src/images/industries/automotive-line-stoppage.jpg b/src/images/industries/automotive-line-stoppage.jpg deleted file mode 100644 index 299bfa7026..0000000000 Binary files a/src/images/industries/automotive-line-stoppage.jpg and /dev/null differ diff --git a/src/images/industries/automotive.jpg b/src/images/industries/automotive.jpg deleted file mode 100644 index 520b89286f..0000000000 Binary files a/src/images/industries/automotive.jpg and /dev/null differ diff --git a/src/images/industries/automotive/1-connect-systems.png b/src/images/industries/automotive/1-connect-systems.png deleted file mode 100644 index 9402e6e17c..0000000000 Binary files a/src/images/industries/automotive/1-connect-systems.png and /dev/null differ diff --git a/src/images/industries/automotive/2-monitor-production.png b/src/images/industries/automotive/2-monitor-production.png deleted file mode 100644 index 3640c5b8ab..0000000000 Binary files a/src/images/industries/automotive/2-monitor-production.png and /dev/null differ diff --git a/src/images/industries/automotive/3-reduce-downtime.png b/src/images/industries/automotive/3-reduce-downtime.png deleted file mode 100644 index 444e1fbeaf..0000000000 Binary files a/src/images/industries/automotive/3-reduce-downtime.png and /dev/null differ diff --git a/src/images/industries/automotive/4-quality-traceability.png b/src/images/industries/automotive/4-quality-traceability.png deleted file mode 100644 index bdf715dc9c..0000000000 Binary files a/src/images/industries/automotive/4-quality-traceability.png and /dev/null differ diff --git a/src/images/industries/automotive/headshot-lidiya-shutaya-metaltec-and-pen.png b/src/images/industries/automotive/headshot-lidiya-shutaya-metaltec-and-pen.png deleted file mode 100644 index 9f516e9716..0000000000 Binary files a/src/images/industries/automotive/headshot-lidiya-shutaya-metaltec-and-pen.png and /dev/null differ diff --git a/src/images/industries/aviation-aerospace-use-case-1.jpg b/src/images/industries/aviation-aerospace-use-case-1.jpg deleted file mode 100644 index 004cb7d51e..0000000000 Binary files a/src/images/industries/aviation-aerospace-use-case-1.jpg and /dev/null differ diff --git a/src/images/industries/aviation-aerospace-use-case-2.jpg b/src/images/industries/aviation-aerospace-use-case-2.jpg deleted file mode 100644 index 741aed4169..0000000000 Binary files a/src/images/industries/aviation-aerospace-use-case-2.jpg and /dev/null differ diff --git a/src/images/industries/aviation-aerospace-use-case-3.jpg b/src/images/industries/aviation-aerospace-use-case-3.jpg deleted file mode 100644 index 3fee37e04f..0000000000 Binary files a/src/images/industries/aviation-aerospace-use-case-3.jpg and /dev/null differ diff --git a/src/images/industries/aviation-aerospace.jpg b/src/images/industries/aviation-aerospace.jpg deleted file mode 100644 index f5b6434994..0000000000 Binary files a/src/images/industries/aviation-aerospace.jpg and /dev/null differ diff --git a/src/images/industries/electronics-appliances-use-case-1.jpg b/src/images/industries/electronics-appliances-use-case-1.jpg deleted file mode 100644 index f943a30097..0000000000 Binary files a/src/images/industries/electronics-appliances-use-case-1.jpg and /dev/null differ diff --git a/src/images/industries/electronics-appliances-use-case-2.jpg b/src/images/industries/electronics-appliances-use-case-2.jpg deleted file mode 100644 index 80c2be2230..0000000000 Binary files a/src/images/industries/electronics-appliances-use-case-2.jpg and /dev/null differ diff --git a/src/images/industries/electronics-appliances-use-case-3.jpg b/src/images/industries/electronics-appliances-use-case-3.jpg deleted file mode 100644 index f7d801709f..0000000000 Binary files a/src/images/industries/electronics-appliances-use-case-3.jpg and /dev/null differ diff --git a/src/images/industries/electronics-appliances.jpg b/src/images/industries/electronics-appliances.jpg deleted file mode 100644 index d3eeab765e..0000000000 Binary files a/src/images/industries/electronics-appliances.jpg and /dev/null differ diff --git a/src/images/industries/food-beverage-use-case-1.jpg b/src/images/industries/food-beverage-use-case-1.jpg deleted file mode 100644 index 39b5425baf..0000000000 Binary files a/src/images/industries/food-beverage-use-case-1.jpg and /dev/null differ diff --git a/src/images/industries/food-beverage-use-case-2.jpg b/src/images/industries/food-beverage-use-case-2.jpg deleted file mode 100644 index 8a6a9038f5..0000000000 Binary files a/src/images/industries/food-beverage-use-case-2.jpg and /dev/null differ diff --git a/src/images/industries/food-beverage-use-case-3.jpg b/src/images/industries/food-beverage-use-case-3.jpg deleted file mode 100644 index c075d2459b..0000000000 Binary files a/src/images/industries/food-beverage-use-case-3.jpg and /dev/null differ diff --git a/src/images/industries/food-beverage.jpg b/src/images/industries/food-beverage.jpg deleted file mode 100644 index 74feae946b..0000000000 Binary files a/src/images/industries/food-beverage.jpg and /dev/null differ diff --git a/src/images/industries/life-sciences-use-case-1.jpg b/src/images/industries/life-sciences-use-case-1.jpg deleted file mode 100644 index c5c37be6cc..0000000000 Binary files a/src/images/industries/life-sciences-use-case-1.jpg and /dev/null differ diff --git a/src/images/industries/life-sciences-use-case-2.jpg b/src/images/industries/life-sciences-use-case-2.jpg deleted file mode 100644 index 43e92d4736..0000000000 Binary files a/src/images/industries/life-sciences-use-case-2.jpg and /dev/null differ diff --git a/src/images/industries/life-sciences-use-case-3.jpg b/src/images/industries/life-sciences-use-case-3.jpg deleted file mode 100644 index b27b91b17b..0000000000 Binary files a/src/images/industries/life-sciences-use-case-3.jpg and /dev/null differ diff --git a/src/images/industries/life-sciences.jpg b/src/images/industries/life-sciences.jpg deleted file mode 100644 index f709d4e312..0000000000 Binary files a/src/images/industries/life-sciences.jpg and /dev/null differ diff --git a/src/images/industries/renewable-energies.png b/src/images/industries/renewable-energies.png deleted file mode 100644 index c847c00ecf..0000000000 Binary files a/src/images/industries/renewable-energies.png and /dev/null differ diff --git a/src/images/industries/renewable-incident-workflow.png b/src/images/industries/renewable-incident-workflow.png deleted file mode 100644 index 5973958e93..0000000000 Binary files a/src/images/industries/renewable-incident-workflow.png and /dev/null differ diff --git a/src/images/industries/renewable-solar.png b/src/images/industries/renewable-solar.png deleted file mode 100644 index e8052b6739..0000000000 Binary files a/src/images/industries/renewable-solar.png and /dev/null differ diff --git a/src/images/industries/renewable-turbine.png b/src/images/industries/renewable-turbine.png deleted file mode 100644 index 953e428376..0000000000 Binary files a/src/images/industries/renewable-turbine.png and /dev/null differ diff --git a/src/images/industries/semiconductors-use-case-1.jpg b/src/images/industries/semiconductors-use-case-1.jpg deleted file mode 100644 index 112bf31e6a..0000000000 Binary files a/src/images/industries/semiconductors-use-case-1.jpg and /dev/null differ diff --git a/src/images/industries/semiconductors-use-case-2.jpg b/src/images/industries/semiconductors-use-case-2.jpg deleted file mode 100644 index 934a1ca3bf..0000000000 Binary files a/src/images/industries/semiconductors-use-case-2.jpg and /dev/null differ diff --git a/src/images/industries/semiconductors-use-case-3.jpg b/src/images/industries/semiconductors-use-case-3.jpg deleted file mode 100644 index 525fe40963..0000000000 Binary files a/src/images/industries/semiconductors-use-case-3.jpg and /dev/null differ diff --git a/src/images/industries/semiconductors-use-case-4.jpg b/src/images/industries/semiconductors-use-case-4.jpg deleted file mode 100644 index eb67b92b54..0000000000 Binary files a/src/images/industries/semiconductors-use-case-4.jpg and /dev/null differ diff --git a/src/images/industries/semiconductors-use-case-5.jpg b/src/images/industries/semiconductors-use-case-5.jpg deleted file mode 100644 index 30e978cfb5..0000000000 Binary files a/src/images/industries/semiconductors-use-case-5.jpg and /dev/null differ diff --git a/src/images/industries/semiconductors-use-case-6.jpg b/src/images/industries/semiconductors-use-case-6.jpg deleted file mode 100644 index 8b4d9e290d..0000000000 Binary files a/src/images/industries/semiconductors-use-case-6.jpg and /dev/null differ diff --git a/src/images/industries/semiconductors.jpg b/src/images/industries/semiconductors.jpg deleted file mode 100644 index 2daea9b2a8..0000000000 Binary files a/src/images/industries/semiconductors.jpg and /dev/null differ diff --git a/src/images/learning_nr.png b/src/images/learning_nr.png deleted file mode 100644 index 226bb519a5..0000000000 Binary files a/src/images/learning_nr.png and /dev/null differ diff --git a/src/images/node-red-hexagon.png b/src/images/node-red-hexagon.png deleted file mode 100644 index 011a4d9c9e..0000000000 Binary files a/src/images/node-red-hexagon.png and /dev/null differ diff --git a/src/images/partners/ff-certified-device.svg b/src/images/partners/ff-certified-device.svg deleted file mode 100644 index 1b50f6a9c6..0000000000 --- a/src/images/partners/ff-certified-device.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Ce - r - t - ified - Device - - - \ No newline at end of file diff --git a/src/images/partners/logo-40hero.png b/src/images/partners/logo-40hero.png deleted file mode 100644 index c99281ef86..0000000000 Binary files a/src/images/partners/logo-40hero.png and /dev/null differ diff --git a/src/images/partners/logo-aws.png b/src/images/partners/logo-aws.png deleted file mode 100644 index 116355add7..0000000000 Binary files a/src/images/partners/logo-aws.png and /dev/null differ diff --git a/src/images/partners/logo-digital-o.png b/src/images/partners/logo-digital-o.png deleted file mode 100644 index e49ef5a9de..0000000000 Binary files a/src/images/partners/logo-digital-o.png and /dev/null differ diff --git a/src/images/partners/logo-gallarus.png b/src/images/partners/logo-gallarus.png deleted file mode 100644 index 4c402f7aff..0000000000 Binary files a/src/images/partners/logo-gallarus.png and /dev/null differ diff --git a/src/images/partners/logo-idoneos.png b/src/images/partners/logo-idoneos.png deleted file mode 100644 index 8285d71cd8..0000000000 Binary files a/src/images/partners/logo-idoneos.png and /dev/null differ diff --git a/src/images/partners/logo-iniationware.png b/src/images/partners/logo-iniationware.png deleted file mode 100644 index ef28dc5c6c..0000000000 Binary files a/src/images/partners/logo-iniationware.png and /dev/null differ diff --git a/src/images/partners/logo-mayker.png b/src/images/partners/logo-mayker.png deleted file mode 100644 index ca05d185bc..0000000000 Binary files a/src/images/partners/logo-mayker.png and /dev/null differ diff --git a/src/images/partners/logo-ncd-io.png b/src/images/partners/logo-ncd-io.png deleted file mode 100644 index fcb7fea422..0000000000 Binary files a/src/images/partners/logo-ncd-io.png and /dev/null differ diff --git a/src/images/partners/logo-rexroth.png b/src/images/partners/logo-rexroth.png deleted file mode 100644 index f636cefe6d..0000000000 Binary files a/src/images/partners/logo-rexroth.png and /dev/null differ diff --git a/src/images/partners/logo-wago.png b/src/images/partners/logo-wago.png deleted file mode 100644 index fa675a580f..0000000000 Binary files a/src/images/partners/logo-wago.png and /dev/null differ diff --git a/src/images/partners/nr-ctrlx.png b/src/images/partners/nr-ctrlx.png deleted file mode 100644 index 51e4e786fa..0000000000 Binary files a/src/images/partners/nr-ctrlx.png and /dev/null differ diff --git a/src/images/pictograms/bias_for_action_blue.png b/src/images/pictograms/bias_for_action_blue.png deleted file mode 100644 index 127dbd23d1..0000000000 Binary files a/src/images/pictograms/bias_for_action_blue.png and /dev/null differ diff --git a/src/images/pictograms/browser_blue.png b/src/images/pictograms/browser_blue.png deleted file mode 100644 index 42c0d72baf..0000000000 Binary files a/src/images/pictograms/browser_blue.png and /dev/null differ diff --git a/src/images/pictograms/candor_blue.png b/src/images/pictograms/candor_blue.png deleted file mode 100644 index 14d7727c84..0000000000 Binary files a/src/images/pictograms/candor_blue.png and /dev/null differ diff --git a/src/images/pictograms/community_blue.png b/src/images/pictograms/community_blue.png deleted file mode 100644 index fa6bb506e6..0000000000 Binary files a/src/images/pictograms/community_blue.png and /dev/null differ diff --git a/src/images/pictograms/data_integration_blue.png b/src/images/pictograms/data_integration_blue.png deleted file mode 100644 index 40f7a4818c..0000000000 Binary files a/src/images/pictograms/data_integration_blue.png and /dev/null differ diff --git a/src/images/pictograms/edge_blue.png b/src/images/pictograms/edge_blue.png deleted file mode 100644 index 967f86e152..0000000000 Binary files a/src/images/pictograms/edge_blue.png and /dev/null differ diff --git a/src/images/pictograms/education_blue.png b/src/images/pictograms/education_blue.png deleted file mode 100644 index 02b9bd35b4..0000000000 Binary files a/src/images/pictograms/education_blue.png and /dev/null differ diff --git a/src/images/pictograms/equipment_blue.png b/src/images/pictograms/equipment_blue.png deleted file mode 100644 index 2f37e6651a..0000000000 Binary files a/src/images/pictograms/equipment_blue.png and /dev/null differ diff --git a/src/images/pictograms/factory_blue.png b/src/images/pictograms/factory_blue.png deleted file mode 100644 index de5908ff7c..0000000000 Binary files a/src/images/pictograms/factory_blue.png and /dev/null differ diff --git a/src/images/pictograms/iteration_blue.png b/src/images/pictograms/iteration_blue.png deleted file mode 100644 index 8ab63a0fc1..0000000000 Binary files a/src/images/pictograms/iteration_blue.png and /dev/null differ diff --git a/src/images/pictograms/node_catalog_blue.png b/src/images/pictograms/node_catalog_blue.png deleted file mode 100644 index 4855425669..0000000000 Binary files a/src/images/pictograms/node_catalog_blue.png and /dev/null differ diff --git a/src/images/pictograms/opensource_red.png b/src/images/pictograms/opensource_red.png deleted file mode 100644 index d37bfc0ea8..0000000000 Binary files a/src/images/pictograms/opensource_red.png and /dev/null differ diff --git a/src/images/pictograms/remote_blue.png b/src/images/pictograms/remote_blue.png deleted file mode 100644 index eb8fa3de47..0000000000 Binary files a/src/images/pictograms/remote_blue.png and /dev/null differ diff --git a/src/images/pictograms/results_blue.png b/src/images/pictograms/results_blue.png deleted file mode 100644 index ad0478156e..0000000000 Binary files a/src/images/pictograms/results_blue.png and /dev/null differ diff --git a/src/images/pictograms/security_blue.png b/src/images/pictograms/security_blue.png deleted file mode 100644 index 1768ca98ae..0000000000 Binary files a/src/images/pictograms/security_blue.png and /dev/null differ diff --git a/src/images/pictograms/speech_blue.png b/src/images/pictograms/speech_blue.png deleted file mode 100644 index b1d40e84f9..0000000000 Binary files a/src/images/pictograms/speech_blue.png and /dev/null differ diff --git a/src/images/pictograms/support_blue.png b/src/images/pictograms/support_blue.png deleted file mode 100644 index 4faa6a3e09..0000000000 Binary files a/src/images/pictograms/support_blue.png and /dev/null differ diff --git a/src/images/pictograms/ticket_blue.png b/src/images/pictograms/ticket_blue.png deleted file mode 100644 index f44d23eb5c..0000000000 Binary files a/src/images/pictograms/ticket_blue.png and /dev/null differ diff --git a/src/images/pictograms/time_blue.png b/src/images/pictograms/time_blue.png deleted file mode 100644 index 2549745598..0000000000 Binary files a/src/images/pictograms/time_blue.png and /dev/null differ diff --git a/src/images/pictograms/trusting_blue.png b/src/images/pictograms/trusting_blue.png deleted file mode 100644 index 233bd52f09..0000000000 Binary files a/src/images/pictograms/trusting_blue.png and /dev/null differ diff --git a/src/images/pictograms/vacation_blue.png b/src/images/pictograms/vacation_blue.png deleted file mode 100644 index 309b6269f2..0000000000 Binary files a/src/images/pictograms/vacation_blue.png and /dev/null differ diff --git a/src/images/power-workplace-icon.png b/src/images/power-workplace-icon.png deleted file mode 100644 index fd03d385c9..0000000000 Binary files a/src/images/power-workplace-icon.png and /dev/null differ diff --git a/src/images/pseudo-editor.png b/src/images/pseudo-editor.png deleted file mode 100644 index a37ea7df27..0000000000 Binary files a/src/images/pseudo-editor.png and /dev/null differ diff --git a/src/images/services/engineering-and-architecture-services.png b/src/images/services/engineering-and-architecture-services.png deleted file mode 100644 index 01b24e8c6f..0000000000 Binary files a/src/images/services/engineering-and-architecture-services.png and /dev/null differ diff --git a/src/images/services/training.png b/src/images/services/training.png deleted file mode 100644 index 8c8506ea9d..0000000000 Binary files a/src/images/services/training.png and /dev/null differ diff --git a/src/images/solutions/data-integration.png b/src/images/solutions/data-integration.png deleted file mode 100644 index 9959837ffa..0000000000 Binary files a/src/images/solutions/data-integration.png and /dev/null differ diff --git a/src/images/solutions/flowfuse-uns.png b/src/images/solutions/flowfuse-uns.png deleted file mode 100644 index 55cac98171..0000000000 Binary files a/src/images/solutions/flowfuse-uns.png and /dev/null differ diff --git a/src/images/solutions/markitechture-manufacturing.png b/src/images/solutions/markitechture-manufacturing.png deleted file mode 100644 index d23484184b..0000000000 Binary files a/src/images/solutions/markitechture-manufacturing.png and /dev/null differ diff --git a/src/images/solutions/mes-hero.png b/src/images/solutions/mes-hero.png deleted file mode 100644 index 2fab328fa0..0000000000 Binary files a/src/images/solutions/mes-hero.png and /dev/null differ diff --git a/src/images/solutions/oee-dashboard--1.png b/src/images/solutions/oee-dashboard--1.png deleted file mode 100644 index 5c15c26d9d..0000000000 Binary files a/src/images/solutions/oee-dashboard--1.png and /dev/null differ diff --git a/src/images/solutions/scada-hero.png b/src/images/solutions/scada-hero.png deleted file mode 100644 index 99b50afd38..0000000000 Binary files a/src/images/solutions/scada-hero.png and /dev/null differ diff --git a/src/images/solutions/scada-how-diagram.png b/src/images/solutions/scada-how-diagram.png deleted file mode 100644 index 26120a47e3..0000000000 Binary files a/src/images/solutions/scada-how-diagram.png and /dev/null differ diff --git a/src/images/solutions/scada-how-flow.png b/src/images/solutions/scada-how-flow.png deleted file mode 100644 index 1daf7390d3..0000000000 Binary files a/src/images/solutions/scada-how-flow.png and /dev/null differ diff --git a/src/images/solutions/webinar-july-2023_video_tile.jpg b/src/images/solutions/webinar-july-2023_video_tile.jpg deleted file mode 100644 index e0b22e52ee..0000000000 Binary files a/src/images/solutions/webinar-july-2023_video_tile.jpg and /dev/null differ diff --git a/src/images/stories/abrasive_tech.jpg b/src/images/stories/abrasive_tech.jpg deleted file mode 100644 index 90d2de5e0d..0000000000 Binary files a/src/images/stories/abrasive_tech.jpg and /dev/null differ diff --git a/src/images/stories/large-us-manufacturing.jpg b/src/images/stories/large-us-manufacturing.jpg deleted file mode 100644 index a6c021a8fa..0000000000 Binary files a/src/images/stories/large-us-manufacturing.jpg and /dev/null differ diff --git a/src/images/stories/stfi-future-textile.jpg b/src/images/stories/stfi-future-textile.jpg deleted file mode 100644 index 445814f098..0000000000 Binary files a/src/images/stories/stfi-future-textile.jpg and /dev/null differ diff --git a/src/images/team/headshot-Travis-Elliot.png b/src/images/team/headshot-Travis-Elliot.png deleted file mode 100644 index dd35fcdd5a..0000000000 Binary files a/src/images/team/headshot-Travis-Elliot.png and /dev/null differ diff --git a/src/images/team/headshot-alejandro.png b/src/images/team/headshot-alejandro.png deleted file mode 100644 index 631f74693b..0000000000 Binary files a/src/images/team/headshot-alejandro.png and /dev/null differ diff --git a/src/images/team/headshot-andrea.png b/src/images/team/headshot-andrea.png deleted file mode 100644 index 1415e034b5..0000000000 Binary files a/src/images/team/headshot-andrea.png and /dev/null differ diff --git a/src/images/team/headshot-andrew.png b/src/images/team/headshot-andrew.png deleted file mode 100644 index bf8741eb2c..0000000000 Binary files a/src/images/team/headshot-andrew.png and /dev/null differ diff --git a/src/images/team/headshot-anthony-sargeant.png b/src/images/team/headshot-anthony-sargeant.png deleted file mode 100644 index d1b1a6638c..0000000000 Binary files a/src/images/team/headshot-anthony-sargeant.png and /dev/null differ diff --git a/src/images/team/headshot-ben.png b/src/images/team/headshot-ben.png deleted file mode 100644 index 470c289fc7..0000000000 Binary files a/src/images/team/headshot-ben.png and /dev/null differ diff --git a/src/images/team/headshot-boris.png b/src/images/team/headshot-boris.png deleted file mode 100644 index 6c25bbd4ee..0000000000 Binary files a/src/images/team/headshot-boris.png and /dev/null differ diff --git a/src/images/team/headshot-dan.png b/src/images/team/headshot-dan.png deleted file mode 100644 index 39ec6ca4c0..0000000000 Binary files a/src/images/team/headshot-dan.png and /dev/null differ diff --git a/src/images/team/headshot-dimitrie.png b/src/images/team/headshot-dimitrie.png deleted file mode 100644 index 0d569d30c6..0000000000 Binary files a/src/images/team/headshot-dimitrie.png and /dev/null differ diff --git a/src/images/team/headshot-drew-gatti.png b/src/images/team/headshot-drew-gatti.png deleted file mode 100644 index 03be306731..0000000000 Binary files a/src/images/team/headshot-drew-gatti.png and /dev/null differ diff --git a/src/images/team/headshot-esme.png b/src/images/team/headshot-esme.png deleted file mode 100644 index 3ab4f7320c..0000000000 Binary files a/src/images/team/headshot-esme.png and /dev/null differ diff --git a/src/images/team/headshot-etienne.png b/src/images/team/headshot-etienne.png deleted file mode 100644 index 583ccb60fd..0000000000 Binary files a/src/images/team/headshot-etienne.png and /dev/null differ diff --git a/src/images/team/headshot-grey.png b/src/images/team/headshot-grey.png deleted file mode 100644 index d84e4d858a..0000000000 Binary files a/src/images/team/headshot-grey.png and /dev/null differ diff --git a/src/images/team/headshot-harshad.jpg b/src/images/team/headshot-harshad.jpg deleted file mode 100644 index 39b5eb0568..0000000000 Binary files a/src/images/team/headshot-harshad.jpg and /dev/null differ diff --git a/src/images/team/headshot-jamie.png b/src/images/team/headshot-jamie.png deleted file mode 100644 index be95f10e8a..0000000000 Binary files a/src/images/team/headshot-jamie.png and /dev/null differ diff --git a/src/images/team/headshot-joe.png b/src/images/team/headshot-joe.png deleted file mode 100644 index ab06f74073..0000000000 Binary files a/src/images/team/headshot-joe.png and /dev/null differ diff --git a/src/images/team/headshot-john.png b/src/images/team/headshot-john.png deleted file mode 100644 index eb3aac4922..0000000000 Binary files a/src/images/team/headshot-john.png and /dev/null differ diff --git a/src/images/team/headshot-joyce.jpg b/src/images/team/headshot-joyce.jpg deleted file mode 100644 index da9e8a4907..0000000000 Binary files a/src/images/team/headshot-joyce.jpg and /dev/null differ diff --git a/src/images/team/headshot-kasheef.png b/src/images/team/headshot-kasheef.png deleted file mode 100644 index d335cf9c7b..0000000000 Binary files a/src/images/team/headshot-kasheef.png and /dev/null differ diff --git a/src/images/team/headshot-kin.png b/src/images/team/headshot-kin.png deleted file mode 100644 index 49dc7a8b13..0000000000 Binary files a/src/images/team/headshot-kin.png and /dev/null differ diff --git a/src/images/team/headshot-klaus.png b/src/images/team/headshot-klaus.png deleted file mode 100644 index b0be90c378..0000000000 Binary files a/src/images/team/headshot-klaus.png and /dev/null differ diff --git a/src/images/team/headshot-kristopher.png b/src/images/team/headshot-kristopher.png deleted file mode 100644 index 95fe647b58..0000000000 Binary files a/src/images/team/headshot-kristopher.png and /dev/null differ diff --git a/src/images/team/headshot-kudzai-manditereza.png b/src/images/team/headshot-kudzai-manditereza.png deleted file mode 100644 index 43763ec875..0000000000 Binary files a/src/images/team/headshot-kudzai-manditereza.png and /dev/null differ diff --git a/src/images/team/headshot-kurt-braun.png b/src/images/team/headshot-kurt-braun.png deleted file mode 100644 index d769ed8115..0000000000 Binary files a/src/images/team/headshot-kurt-braun.png and /dev/null differ diff --git a/src/images/team/headshot-mandeep.png b/src/images/team/headshot-mandeep.png deleted file mode 100644 index e6f5817574..0000000000 Binary files a/src/images/team/headshot-mandeep.png and /dev/null differ diff --git a/src/images/team/headshot-marian.png b/src/images/team/headshot-marian.png deleted file mode 100644 index ce4ce5c7d3..0000000000 Binary files a/src/images/team/headshot-marian.png and /dev/null differ diff --git a/src/images/team/headshot-michael.png b/src/images/team/headshot-michael.png deleted file mode 100644 index 37acf0a22d..0000000000 Binary files a/src/images/team/headshot-michael.png and /dev/null differ diff --git a/src/images/team/headshot-michaelp.png b/src/images/team/headshot-michaelp.png deleted file mode 100644 index 63d5bbb88b..0000000000 Binary files a/src/images/team/headshot-michaelp.png and /dev/null differ diff --git a/src/images/team/headshot-nick.png b/src/images/team/headshot-nick.png deleted file mode 100644 index 6384e0ad67..0000000000 Binary files a/src/images/team/headshot-nick.png and /dev/null differ diff --git a/src/images/team/headshot-noley.png b/src/images/team/headshot-noley.png deleted file mode 100644 index a719319af4..0000000000 Binary files a/src/images/team/headshot-noley.png and /dev/null differ diff --git a/src/images/team/headshot-noubar.png b/src/images/team/headshot-noubar.png deleted file mode 100644 index 0df79ac20f..0000000000 Binary files a/src/images/team/headshot-noubar.png and /dev/null differ diff --git a/src/images/team/headshot-pablo.png b/src/images/team/headshot-pablo.png deleted file mode 100644 index 5d017059d2..0000000000 Binary files a/src/images/team/headshot-pablo.png and /dev/null differ diff --git a/src/images/team/headshot-piotr.png b/src/images/team/headshot-piotr.png deleted file mode 100644 index 5700410c9b..0000000000 Binary files a/src/images/team/headshot-piotr.png and /dev/null differ diff --git a/src/images/team/headshot-quintijn.png b/src/images/team/headshot-quintijn.png deleted file mode 100644 index 9de3690198..0000000000 Binary files a/src/images/team/headshot-quintijn.png and /dev/null differ diff --git a/src/images/team/headshot-raymond.png b/src/images/team/headshot-raymond.png deleted file mode 100644 index 960a1208cc..0000000000 Binary files a/src/images/team/headshot-raymond.png and /dev/null differ diff --git a/src/images/team/headshot-rhythm.png b/src/images/team/headshot-rhythm.png deleted file mode 100644 index 80e7e271a1..0000000000 Binary files a/src/images/team/headshot-rhythm.png and /dev/null differ diff --git a/src/images/team/headshot-rob.png b/src/images/team/headshot-rob.png deleted file mode 100644 index c97978f543..0000000000 Binary files a/src/images/team/headshot-rob.png and /dev/null differ diff --git a/src/images/team/headshot-serban.png b/src/images/team/headshot-serban.png deleted file mode 100644 index 410e93abe6..0000000000 Binary files a/src/images/team/headshot-serban.png and /dev/null differ diff --git a/src/images/team/headshot-steve.png b/src/images/team/headshot-steve.png deleted file mode 100644 index 7668c3a8d7..0000000000 Binary files a/src/images/team/headshot-steve.png and /dev/null differ diff --git a/src/images/team/headshot-sumit.png b/src/images/team/headshot-sumit.png deleted file mode 100644 index f1fdc8d131..0000000000 Binary files a/src/images/team/headshot-sumit.png and /dev/null differ diff --git a/src/images/team/headshot-trent.png b/src/images/team/headshot-trent.png deleted file mode 100644 index 9df68c80d8..0000000000 Binary files a/src/images/team/headshot-trent.png and /dev/null differ diff --git a/src/images/team/headshot-yndira.png b/src/images/team/headshot-yndira.png deleted file mode 100644 index c3b6e12b85..0000000000 Binary files a/src/images/team/headshot-yndira.png and /dev/null differ diff --git a/src/images/team/headshot-zj.png b/src/images/team/headshot-zj.png deleted file mode 100644 index d0e7e7e326..0000000000 Binary files a/src/images/team/headshot-zj.png and /dev/null differ diff --git a/src/images/webinars/multi-user-dashboard-with-node-red-dashboard-2-0-webinar-2024-february.jpg b/src/images/webinars/multi-user-dashboard-with-node-red-dashboard-2-0-webinar-2024-february.jpg deleted file mode 100644 index ecf4235f2c..0000000000 Binary files a/src/images/webinars/multi-user-dashboard-with-node-red-dashboard-2-0-webinar-2024-february.jpg and /dev/null differ diff --git a/src/images/why-flowfuse/flowfuse-homepage-mobile.png b/src/images/why-flowfuse/flowfuse-homepage-mobile.png deleted file mode 100644 index 94388a05fa..0000000000 Binary files a/src/images/why-flowfuse/flowfuse-homepage-mobile.png and /dev/null differ diff --git a/src/images/why-flowfuse/flowfuse-homepage.png b/src/images/why-flowfuse/flowfuse-homepage.png deleted file mode 100644 index 68c01914c3..0000000000 Binary files a/src/images/why-flowfuse/flowfuse-homepage.png and /dev/null differ diff --git a/src/images/why-flowfuse/from-prototype-to-production.png b/src/images/why-flowfuse/from-prototype-to-production.png deleted file mode 100644 index 85f0aa571b..0000000000 Binary files a/src/images/why-flowfuse/from-prototype-to-production.png and /dev/null differ diff --git a/src/images/why-flowfuse/node-red+flowfuse.png b/src/images/why-flowfuse/node-red+flowfuse.png deleted file mode 100644 index 124519f060..0000000000 Binary files a/src/images/why-flowfuse/node-red+flowfuse.png and /dev/null differ diff --git a/src/js/ai-expert-modal.js b/src/js/ai-expert-modal.js deleted file mode 100644 index 929770b371..0000000000 --- a/src/js/ai-expert-modal.js +++ /dev/null @@ -1,1565 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - const modal = document.getElementById('ai-expert-modal'); - const closeBtn = document.getElementById('close-modal'); - const tellMeHowBtn = document.getElementById('tell-me-how-btn'); - const chatMessages = document.getElementById('chat-messages'); - const modalInput = document.getElementById('modal-input'); - let transferPayload = [] - let flowsStore = {} - - // Debug: Check if button was found - if (!tellMeHowBtn) { - console.error('FlowFuse Expert: Tell Me How button not found!'); - } - - // Message storage array - let messages = []; - - // Session ID for chat isolation - let sessionId = null; - - // Variables for stopping generation - let currentAbortController = null; - let isGenerating = false; - - // Transaction ID for preventing race conditions - let lastTransactionId = null; - - // Auto-scroll management - let autoScrollEnabled = true; - const scrollThreshold = 50; // pixels from bottom to consider "at bottom" - - // Loading messages system - const loadingMessages = [ - "Please wait, this can take up to 20 seconds", - "Searching through our documentation", - "Thinking through your question" - ]; - let currentLoadingMessageIndex = 0; - let loadingMessageInterval = null; - - function copyToClipboard(text) { - navigator.clipboard.writeText(text) - .then(() => { - console.log('copied'); - }) - .catch(err => { - console.error('Failed to copy text:', err); - }); - } - - let flowInteractionHandler = function (e) { - if (e.target.closest('.copy')) { - const flowTarget = e.target.closest('[data-flow-id]')?.getAttribute('data-flow-id'); - if (flowTarget && flowsStore[flowTarget]) { - copyToClipboard(flowsStore[flowTarget]); - const copyButton = e.target.closest('.copy'); - const copySvg = copyButton.querySelector('.copy-svg'); - const checkSvg = copyButton.querySelector('.check-svg'); - copySvg.classList.add('hidden'); - checkSvg.classList.remove('hidden'); - setTimeout(() => { - copySvg.classList.remove('hidden'); - checkSvg.classList.add('hidden'); - }, 2000); - } - } - - if (e.target.closest('.expand')) { - const flowSection = e.target.closest('[data-flow-id]'); - if (flowSection) { - const preElement = flowSection.querySelector('pre'); - const preContainer = preElement?.parentElement; - const downChevron = flowSection.querySelector('.down-arrow'); - const upChevron = flowSection.querySelector('.up-arrow'); - if (preElement && preContainer) { - preElement.classList.toggle('hidden'); - preContainer.classList.toggle('mt-3'); - downChevron.classList.toggle('hidden'); - upChevron.classList.toggle('hidden'); - } - } - } - }; - - // Centralized function to manage input state based on isGenerating - function updateInputState() { - const clearBtn = document.getElementById('clear-conversation'); - const stopBtn = document.getElementById('stop-generation'); - const sendBtn = document.getElementById('send-message'); - const exportBtn = document.getElementById('continue-to-app'); - - if (isGenerating) { - modalInput.disabled = true; - // Disable clear button during generation - if (clearBtn) clearBtn.disabled = true; - // Show stop button, hide send button - if (stopBtn) stopBtn.classList.remove('hidden'); - if (sendBtn) sendBtn.classList.add('hidden'); - } else { - modalInput.disabled = false; - modalInput.focus(); - // Enable clear button only if there are messages - const hasMessages = messages.length > 0; - if (clearBtn) clearBtn.disabled = !hasMessages; - // Hide stop button, show send button if there are messages - if (stopBtn) stopBtn.classList.add('hidden'); - if (sendBtn) { - // Enable/disable send button based on textarea content - const hasContent = modalInput.value.trim().length > 0; - sendBtn.disabled = !hasContent; - sendBtn.classList.remove('hidden'); - } - exportBtn.disabled= false; - } - } - - // Check if user is at bottom of scroll container - function isAtBottom() { - const container = chatMessages.parentElement; // Get the scrollable container - return container.scrollHeight - container.scrollTop - container.clientHeight < scrollThreshold; - } - - // Scroll to bottom if auto-scroll is enabled - function scrollToBottom() { - if (autoScrollEnabled) { - const container = chatMessages.parentElement; - container.scrollTop = container.scrollHeight; - } - } - - // Set up scroll detection on the chat container - const chatContainer = chatMessages.parentElement; - chatContainer.addEventListener('scroll', function() { - // Check if user is at bottom - if (isAtBottom()) { - // Re-enable auto-scroll when user scrolls to bottom - autoScrollEnabled = true; - } else { - // Disable auto-scroll when user scrolls up - autoScrollEnabled = false; - } - }); - - // Open modal - if (tellMeHowBtn) { - tellMeHowBtn.addEventListener('click', function(e) { - e.preventDefault(); - const textarea = document.querySelector('textarea[aria-label="Describe your workflow"]'); - const userText = textarea ? textarea.value : ''; - const promptText = userText.trim(); - openModal(promptText); - }); - } - - // Close modal - if (closeBtn) { - closeBtn.addEventListener('click', closeModal); - } - modal.addEventListener('click', function(e) { - if (e.target === modal) closeModal(); - }); - - // Escape key close + focus trap: scoped to modal element - modal.addEventListener('keydown', function(e) { - if (e.key === 'Escape') { - closeModal(); - return; - } - if (e.key !== 'Tab') return; - var focusableElements = modal.querySelectorAll( - 'button:not([disabled]), ' + - 'textarea:not([disabled]), ' + - 'input:not([disabled]), ' + - 'a[href], ' + - '[tabindex]:not([tabindex="-1"])' - ); - var focusable = Array.from(focusableElements).filter(function(el) { - return el.offsetParent !== null; // visible elements only - }); - if (focusable.length === 0) return; - var first = focusable[0]; - var last = focusable[focusable.length - 1]; - if (e.shiftKey) { - if (document.activeElement === first) { - e.preventDefault(); - last.focus(); - } - } else { - if (document.activeElement === last) { - e.preventDefault(); - first.focus(); - } - } - }); - - // Handle prompt pill clicks - document.addEventListener('click', function(e) { - if (e.target.classList.contains('prompt-pill') && e.target.dataset.prompt) { - e.preventDefault(); - const promptText = e.target.dataset.prompt; - if (typeof capture === 'function') capture('expert-prompt-pill-clicked', { prompt_title: e.target.textContent.trim(), page: location.pathname }); - openModal(promptText); - } - }); - - const prompts = [ - { - "title": "Build Unified Namespace Architecture", - "prompt": "Create a Unified Namespace (UNS) architecture using MQTT that organizes industrial data by ISA-95 hierarchy (Enterprise > Site > Area > Line > Cell), subscribe to data from multiple sources (PLCs, OPC-UA servers, REST APIs), transform it into a standardized topic structure, and publish to a central MQTT broker for use by dashboards, MES systems, and analytics platforms." - }, - { - "title": "Convert Data to Sparkplug B", - "prompt": "Subscribe to industrial data from MQTT, OPC-UA servers, or PLCs, transform it into Sparkplug B format with proper namespace, data types, and birth/death certificates, and publish to MQTT broker for consumption by historians, SCADA systems like Ignition, or cloud analytics platforms." - }, - { - "title": "Track Machine Downtime & Reasons", - "prompt": "Monitor PLC tags or machine signals to detect when equipment transitions to stopped state, capture downtime start/end timestamps, prompt operators to categorize downtime reasons (maintenance, changeover, material shortage, etc.), calculate total downtime duration, and log events to database or publish to MQTT for OEE analysis and reporting." - }, - { - "title": "Calculate OEE Metrics", - "prompt": "Read production count, machine state, and target rate from PLC tags or MQTT topics, calculate Overall Equipment Effectiveness (OEE) using the formula: Availability × Performance × Quality, track good parts vs total parts produced, identify downtime periods, aggregate metrics by shift or day, and display results on dashboard or send to MES system for reporting." - }, - { - "title": "Monitor PLCs & Alert on Issues", - "prompt": "Continuously monitor PLC connections, OPC-UA server availability, and critical machine tags, detect connection failures or tag value anomalies, send immediate notifications via email, Slack, Microsoft Teams, or SMS when issues occur, log all alerts to database with timestamps, and create recovery workflows to attempt reconnection or escalate to maintenance teams." - }, - { - "title": "Send PLC/SCADA Data to Cloud", - "prompt": "Connect to PLCs via Modbus TCP, OPC-UA, or SCADA systems, read process variables and machine states at regular intervals (e.g., every 10-30 seconds), transform and batch the data, send to cloud platforms (AWS IoT Core, Azure IoT Hub, or Azure Event Hub) via MQTT or HTTPS, with local caching to handle network outages and ensure no data loss." - }, - { - "title": "Build Production Dashboard", - "prompt": "Query production data from PLCs, databases, or MQTT topics, display real-time metrics including current production count, target vs actual, cycle time, machine status, and downtime, create visualizations using gauges, trend charts, and status indicators, organize by production line or cell, and deploy to operator terminals or hallway monitors for shop floor visibility." - }, - { - "title": "Track Cycle Time per Machine", - "prompt": "Monitor machine cycle start and cycle complete signals from PLCs, calculate time duration for each cycle, track setup time separately from run time, aggregate cycle times by part number or production order, calculate machine utilization percentage, log data to SQL database with timestamps, and use for cost of goods sold (COGS) calculations and ERP accuracy improvement." - }, - { - "title": "Monitor Errors & Notify Team", - "prompt": "Subscribe to error tags from PLCs, OPC-UA servers, or application logs, detect when error conditions occur or error codes change, parse error details and severity levels, send formatted notifications to appropriate channels (email for low priority, Slack or Teams for medium, SMS for critical), log all errors to database for trend analysis, and integrate with ticketing systems like JIRA for automated work order creation." - }, - { - "title": "Sync MES & ERP Systems", - "prompt": "Query production data from MES system (work orders, production counts, quality results, downtime events), transform to match ERP data schema (SAP, Microsoft Dynamics, or other), push updates to ERP via REST API or database writes, handle bi-directional sync for work order status and inventory levels, implement error handling and retry logic, and maintain audit trail of all synchronization events." - }, - { - "title": "Sync Database to Cloud APIs", - "prompt": "Poll local SQL database (PostgreSQL, MySQL, SQL Server) for new or updated records, extract production data, quality metrics, or inventory changes, transform to JSON format, send via HTTPS POST to cloud REST APIs or Azure Event Hub, use Project Link nodes to securely connect cloud FlowFuse instance to on-premise database, implement change detection to avoid duplicate sends, and handle API rate limits with queuing." - }, - { - "title": "Display OEE Dashboard", - "prompt": "Subscribe to production count, downtime events, and quality data from MQTT or database, calculate real-time OEE metrics (Availability, Performance, Quality), display current OEE percentage with gauge widget, show trend charts for OEE over time (last hour, shift, day), break down OEE components to identify bottlenecks, add shift selection and date range filters, and enable PDF report generation for end-of-shift summaries." - }, - { - "title": "Stream to AWS/Azure IoT Hub", - "prompt": "Connect to industrial data sources (Modbus, OPC-UA, MQTT), sample data at configured intervals, format as JSON payloads with device metadata and timestamps, publish to AWS IoT Core or Azure IoT Hub via MQTT with TLS encryption, implement device twin synchronization for configuration management, trigger cloud-side Lambda or Azure Functions for serverless data processing, and store in cloud time-series database." - }, - { - "title": "Write PLC Data to Database", - "prompt": "Connect to PLC via Modbus TCP, OPC-UA, or Ethernet/IP protocol, read specified tags (temperatures, pressures, production counts, machine states), poll at regular intervals (e.g., every 10 seconds or on change), transform tag values to database-friendly format, write to SQL database (PostgreSQL, MySQL, SQL Server) using INSERT or UPSERT operations, create time-series table structure with timestamps, and implement connection pooling for performance." - }, - { - "title": "Connect SCADA to MES", - "prompt": "Subscribe to SCADA system data points via OPC-UA or MQTT, extract real-time process variables, alarms, and batch data, transform to MES-compatible format (ISA-95 model), push production events to MES system (work order progress, downtime, quality checks) via REST API or database writes, enable bi-directional communication for MES to update SCADA setpoints or recipe parameters, and handle state synchronization." - }, - { - "title": "Convert OPC-UA to MQTT", - "prompt": "Connect to OPC-UA server as client, browse available nodes or configure specific NodeIDs to monitor, subscribe to data changes, extract tag name, value, quality, and timestamp, map OPC-UA node hierarchy to MQTT topic structure (e.g., site/area/line/device/tag), publish to MQTT broker with QoS 1 for guaranteed delivery, preserve data types and units, and implement reconnection logic for reliability." - }, - { - "title": "Publish PLC Data to MQTT", - "prompt": "Read PLC tags via Modbus, OPC-UA, or proprietary protocol, sample values at defined intervals or on change of value, format as JSON payloads with metadata (device ID, location, timestamp), publish to MQTT broker organized by topic hierarchy (enterprise/site/area/cell/tag), use retained messages for current state values, implement MQTT birth/death messages to indicate connection status, and ensure secure TLS connection." - }, - { - "title": "Create OPC-UA Server Gateway", - "prompt": "Connect to devices using Modbus TCP, Modbus RTU, Ethernet/IP, or serial protocols, read device data points and map to OPC-UA address space, configure OPC-UA server node with proper namespace and node structure, expose PLC data as OPC-UA server for SCADA systems or historians to connect to, implement security (username/password or certificates), and provide standardized interface to legacy equipment." - }, - { - "title": "Store REST API Data in Database", - "prompt": "Poll REST API endpoints at scheduled intervals (e.g., every 5 minutes), parse JSON or XML responses, extract relevant fields (order status, inventory levels, customer data), transform to match database schema, write to SQL database tables using INSERT or UPDATE operations, handle pagination for large datasets, implement error handling for API failures, and log API response times for monitoring." - }, - { - "title": "Store MQTT Data in InfluxDB/Historian", - "prompt": "Subscribe to MQTT topics containing sensor data, production metrics, or machine states, parse message payloads (JSON or binary), extract timestamp and tag values, write to time-series database (InfluxDB, TimescaleDB, or proprietary historian) with proper tags for filtering (site, line, machine), implement batching for write efficiency, handle backpressure during high data rates, and configure retention policies for data lifecycle management." - }, - { - "title": "Display Real-Time Sensor Dashboard", - "prompt": "Subscribe to temperature, pressure, flow, vibration, or other sensor data from MQTT or database queries, display real-time values with gauge widgets showing current readings and min/max ranges, create trend charts showing last hour or shift of data, add threshold indicators and color-coded alerts when values exceed limits, organize by sensor location or equipment, and update displays every 1-5 seconds for true real-time visibility." - }, - { - "title": "Send Data to Azure Event Hub", - "prompt": "Collect telemetry, alerts, and production events from edge devices and PLCs, batch messages to optimize throughput, format as JSON with event metadata, publish to Azure Event Hub partition using AMQP or HTTPS protocol, implement local caching to queue messages during network outages, configure retry logic with exponential backoff, and integrate with downstream Azure services like Stream Analytics or Azure Functions for processing." - }, - { - "title": "Build Operator Terminal Display", - "prompt": "Query current machine status, active work order, production count, and cycle progress from PLC or MES system, display on tablet or HMI screens at operator workstations, show work instructions that automatically advance based on production step, provide buttons for operators to log downtime reasons or quality issues, display real-time alerts and notifications, and update every few seconds to keep operators informed of production state." - }, - { - "title": "Monitor Energy Consumption", - "prompt": "Read energy meter data via Modbus TCP or BACnet protocol, collect kWh consumption, power factor, current, and voltage measurements every 30-60 seconds, calculate energy usage by time period (hour, shift, day), display consumption trends with line charts, compare energy usage across machines or production lines, calculate cost based on utility rates, set threshold alerts for unusual consumption spikes, and export data for sustainability reporting." - }, - { - "title": "Alert When Thresholds Exceeded", - "prompt": "Monitor sensor values (temperature, pressure, vibration, current) or KPIs (OEE, cycle time, downtime) from MQTT topics or database queries, compare against configured threshold limits (high/low warning and critical levels), detect when values exceed thresholds for sustained duration to avoid false alarms, send formatted notifications to Slack channels or Microsoft Teams with alert details, severity level, and current value, and include links to dashboards for troubleshooting." - }, - { - "title": "Upload Data Files to S3/Azure Blob", - "prompt": "Export production data from local database to CSV or JSON files on scheduled intervals (hourly, daily), compress files to reduce transfer size, upload to AWS S3 bucket or Azure Blob Storage using secure credentials, organize by date-based folder structure (year/month/day), verify successful upload with checksums, delete local files after confirmed cloud storage, and trigger downstream cloud analytics pipelines or data lake ingestion." - }, - { - "title": "Combine PLC Tags to Machine State", - "prompt": "Read multiple PLC tags (motor running, conveyor active, door closed, e-stop status, alarm active), apply business logic to determine overall machine state (running, idle, setup, maintenance, fault), create derived 'machine state' tag published to MQTT or written to database, implement state transition rules with minimum duration to avoid flapping, log all state changes with timestamps, and use aggregated state for OEE calculations and dashboards." - }, - { - "title": "Track Production vs Target", - "prompt": "Retrieve production target from MES, ERP, or manual entry for current shift and part number, monitor actual production count from PLC trigger or part counter, calculate real-time percentage of target achieved (actual/target × 100), display on dashboard with progress bar and numeric indicator, calculate projected end-of-shift count based on current rate, alert supervisors when falling behind target (e.g., <90% by midshift), and log performance metrics to database." - }, - { - "title": "Sync Edge to Cloud Database", - "prompt": "Run FlowFuse instance on edge device or factory network, collect production data locally to SQL database or InfluxDB, use FlowFuse Project Link to establish secure connection to cloud instance, periodically sync new or updated records from edge database to cloud database (AWS RDS, Azure SQL, or cloud-hosted PostgreSQL), implement incremental sync with change tracking to minimize data transfer, handle bi-directional sync if cloud sends configuration or setpoints back to edge." - }, - { - "title": "Push ERP Data to MES", - "prompt": "Connect to ERP system (SAP, Microsoft Dynamics, Oracle) via REST API or database connector, query work orders, bill of materials, routing steps, and production schedules, transform ERP data structure to match MES system requirements (ISA-95 format), push to MES via API calls or database inserts, handle data mapping for part numbers, operations, and resource assignments, implement scheduled sync (every 5-15 minutes) or event-driven triggers, and log all transfers for audit trail." - }, - { - "title": "Convert Modbus to MQTT", - "prompt": "Connect to Modbus TCP or Modbus RTU devices (PLCs, sensors, drives), configure register addresses to read (holding registers, input registers, coils), poll devices at regular intervals (1-10 seconds), parse register values and apply scaling/offsets to engineering units, map each register to MQTT topic using hierarchical naming (site/line/device/register), publish to MQTT broker with JSON payloads including value, unit, timestamp, and quality status, and implement device offline detection." - }, - { - "title": "Dashboard for Multiple Production Lines", - "prompt": "Query production status for all machines or lines from MQTT topics or database, display grid layout with one card per machine showing current status (running/stopped/fault), production count, cycle time, and last downtime reason, color-code machines by state (green=running, yellow=idle, red=fault), auto-refresh every 5-10 seconds, provide drill-down to individual machine details, filter by department or production area, and deploy to large monitors visible from shop floor." - }, - { - "title": "Monitor Vibration for Maintenance", - "prompt": "Collect vibration sensor data from IIoT gateways or data loggers via MQTT, analyze vibration frequency and amplitude, compare against baseline and threshold values to detect anomalies indicating bearing wear or imbalance, use FFT analysis or machine learning models to identify failure patterns, create alerts when vibration exceeds warning thresholds, automatically generate work orders in CMMS system, and log all vibration trends to InfluxDB for historical analysis." - }, - { - "title": "Generate PDF Production Reports", - "prompt": "At end of shift, query production database for shift metrics (total production, downtime events, OEE, quality results, operator notes), populate PDF template with charts, tables, and summary statistics, include shift identifier (day/night, A/B/C crew), add company branding and formatting, generate PDF file with timestamp in filename, save to network share or send via email to supervisors and management, and archive reports to cloud storage (S3) for long-term retention." - }, - { - "title": "Connect SCADA to Cloud", - "prompt": "Subscribe to SCADA system data via OPC-UA server or MQTT publish, extract process values, alarms, batch events, and operator actions, buffer data locally to handle network interruptions, transform to cloud-compatible JSON format, push to cloud platform (AWS, Azure, GCP) via HTTPS REST API or cloud-specific IoT services, implement security with TLS encryption and token-based authentication, and enable cloud-based analytics and long-term storage without impacting SCADA performance." - }, - { - "title": "Manage Production Recipes", - "prompt": "Store production recipes (setpoints, parameters, steps) in database or MES system, provide UI for operators to select recipe by part number or product SKU, retrieve recipe parameters (temperatures, speeds, pressures, times), send setpoints to PLC via OPC-UA writes or Modbus register writes, verify PLC confirms receipt and parameters are applied, log recipe changes and timestamps, implement version control for recipe updates, and track which recipe was used for each production batch." - }, - { - "title": "Monitor OPC-UA Connection Health", - "prompt": "Continuously monitor OPC-UA server connections, detect when client connection drops or server becomes unavailable, implement automatic reconnection with exponential backoff, send alerts via email or Slack when connection lost for more than configured threshold (e.g., 5 minutes), log connection status changes with timestamps to database, track connection uptime percentage for SLA reporting, and create dashboard showing status of all OPC-UA connections across the facility." - }, - { - "title": "Structure Data Using ISA-95", - "prompt": "Organize industrial data according to ISA-95 hierarchical model: Enterprise > Site > Area > Production Line > Work Cell > Equipment, map data sources (PLCs, OPC-UA, databases) to appropriate hierarchy levels, create MQTT topic structure or database schema following ISA-95 naming (e.g., Enterprise/Site/Area/Line/Cell/Equipment/Tag), ensure production events, work orders, and material flows align with model, enable consistent data access across MES, ERP, and analytics systems." - }, - { - "title": "Track Quality & Calculate Yield", - "prompt": "Monitor quality inspection results from vision systems, CMMs, or operator input terminals, log good parts count and reject count with failure codes, calculate first-pass yield (good parts / total parts × 100%), track defects by category (dimensional, cosmetic, functional), correlate quality issues with production parameters (speed, temperature) to identify root causes, display quality trends on dashboard, alert when yield drops below threshold (e.g., <95%), and integrate with MES for batch genealogy." - }, - { - "title": "Build Andon/Alert Board", - "prompt": "Subscribe to machine fault signals, operator call buttons, and material shortage alerts, display active alerts on large screen visible across production floor, prioritize by severity (critical red, warning yellow, info green), show alert location (line, cell, machine), include timestamp and duration, enable operators to acknowledge or close alerts via touch interface, log all alerts to database with response times, and send notifications to supervisors for unacknowledged alerts older than threshold time." - }, - { - "title": "Gateway Modbus to OPC-UA", - "prompt": "Connect to Modbus TCP or RTU devices, read holding registers and input registers, create OPC-UA server with namespace matching device type, map Modbus registers to OPC-UA nodes with proper data types and engineering units, enable SCADA systems and historians to connect via standardized OPC-UA client, implement security (username/password or certificates), and provide modern OPC-UA interface to legacy Modbus equipment without device replacement." - }, - { - "title": "Collect LoRaWAN Sensor Data", - "prompt": "Receive LoRaWAN gateway data via MQTT or HTTP webhook, decode sensor payloads (temperature, humidity, pressure, GPS, battery level), validate data quality and timestamp, calculate derived values (leak detection, environmental conditions), publish processed data to central MQTT broker or write to time-series database, set up alerts for out-of-range values or low battery warnings, and create dashboard for remote monitoring of distributed sensors across facility or outdoor sites." - }, - { - "title": "Bridge Serial Devices to MQTT", - "prompt": "Connect to serial devices (RS-232, RS-485) using USB-to-serial adapters or serial ports, configure baud rate, parity, and protocol (ASCII, binary), parse incoming serial data streams, extract sensor values or device status, format as JSON payloads, publish to MQTT broker organized by device ID and data type, handle bi-directional communication to send commands to serial devices, and implement error handling for communication timeouts or checksum failures." - }, - { - "title": "Track Production Costs & Margins", - "prompt": "Capture actual cycle time and setup time from PLC signals, retrieve labor rates and machine hour rates from ERP, calculate actual production cost per part (labor cost + machine cost + material cost), compare against standard cost from ERP, identify variances and margin impact, track by work order or part number, aggregate costs by shift or day, display on dashboard showing profitability by product line, and export cost data to finance systems for accurate COGS calculation." - }, - { - "title": "Bridge Bluetooth Devices to MQTT", - "prompt": "Scan for Bluetooth Low Energy (BLE) devices broadcasting sensor data or beacon signals, connect and pair with devices using device IDs, subscribe to BLE characteristics for temperature, humidity, proximity, or custom data, parse BLE advertisement packets or notification data, convert to JSON format with device metadata, publish to MQTT broker for integration with broader IoT platform, handle device reconnection when out of range, and manage battery-powered device sleep cycles." - } - ] - const INITIAL_SUGGESTIONS_COUNT = 5 - const ADDITIONAL_SUGGESTIONS_COUNT = 10 - - // Populate prompt pills dynamically - pick 5 random prompts - const promptsWrapper = document.querySelector('.ai-prompts > .wrapper'); - if (promptsWrapper) { - // Randomly select 5 prompts - const shuffled = [...prompts].sort(() => 0.5 - Math.random()); - const selectedPrompts = shuffled.slice(0, INITIAL_SUGGESTIONS_COUNT); - function createPromptButton({appendClass, attr, text, title}) { - const button = document.createElement('button'); - button.className = `${appendClass} text-left px-4 py-2 bg-white backdrop-blur rounded-full text-sm text-gray-500 hover:bg-white hover:shadow-sm transition-all border hover:border-indigo-600 border-indigo-200 whitespace-nowrap overflow-hidden text-ellipsis`; - if (attr) { - button.setAttribute('data-prompt', attr); - } - if (title) { - button.title = title; - } - button.textContent = text; - - return button - } - - selectedPrompts.forEach(prompt => { - promptsWrapper.appendChild(createPromptButton({ - appendClass: 'prompt-pill', - attr: prompt.prompt, - text: prompt.title, - title: prompt.title - })); - }); - - // add the show more button - const showMoreButton = createPromptButton({ - appendClass: 'show-more-pill', - text: 'Show more...', - }) - promptsWrapper.appendChild(showMoreButton); - - showMoreButton.addEventListener('click', () => { - // Get the remaining prompts that weren't in the initial selection - const remainingPrompts = prompts.filter(p => !selectedPrompts.includes(p)); - - // Randomly select 8 from the remaining prompts - const shuffledRemaining = [...remainingPrompts].sort(() => 0.5 - Math.random()); - const additionalPrompts = shuffledRemaining.slice(0, ADDITIONAL_SUGGESTIONS_COUNT); - - // Add the 8 new prompts before the "Show more..." button - additionalPrompts.forEach(prompt => { - const additionalPromptButton = createPromptButton({ - appendClass: 'prompt-pill', - attr: prompt.prompt, - text: prompt.title, - title: prompt.title - }); - promptsWrapper.insertBefore(additionalPromptButton, showMoreButton); - }); - - showMoreButton.classList.add('hidden'); - }) - } - - function openModal(userText) { - // Generate new session ID for this chat session - sessionId = crypto.randomUUID(); - transferPayload = [] - - // Reset auto-scroll to enabled when opening modal - autoScrollEnabled = true; - - // Ensure input is enabled when modal opens - isGenerating = false; - - // Only show welcome message if there are no messages yet AND no user text provided - if (messages.length === 0 && !userText) { - showWelcomeMessage(); - } - updateInputState(); - - // Check if View Transitions API is supported - if (document.startViewTransition && typeof document.startViewTransition === 'function') { - - // Get elements for transition - const homeTextarea = document.querySelector('textarea[aria-label="Describe your workflow"]'); - const homeTextareaWrapper = homeTextarea ? homeTextarea.closest('.textarea-wrapper') : null; - // Target the entire input area div that contains textarea and footer text - const modalInputSection = modal.querySelector('.p-4.bg-white.rounded-b-none.md\\:rounded-b-lg'); - - - // Set transition name on home wrapper BEFORE starting transition (for "before" snapshot) - if (homeTextareaWrapper) { - homeTextareaWrapper.style.viewTransitionName = 'morphing-content'; - } - - // Use View Transitions API for smooth morphing - try { - const transition = document.startViewTransition(() => { - - // Remove transition name from home wrapper - homeTextareaWrapper.style.viewTransitionName = ''; - - // Hide the home wrapper - homeTextareaWrapper.style.display = 'none'; - - // Move modal to document.body and show it - document.body.appendChild(modal); - modal.classList.remove('hidden'); - modal.classList.add('flex'); - - // Give the modal input section the transition name (for "after" snapshot) - if (modalInputSection) { - modalInputSection.style.viewTransitionName = 'morphing-content'; - } - - }); - - - transition.finished.then(() => { - - // Prevent body scroll - document.body.style.overflow = 'hidden'; - - // Clean up transition names after animation - if (homeTextareaWrapper) { - homeTextareaWrapper.style.viewTransitionName = ''; - } - if (modalInputSection) { - modalInputSection.style.viewTransitionName = ''; - } - - // Move focus into the modal for accessibility - if (!userText) { - modalInput.focus(); - } - - // Start chat if user provided text - if (userText) { - startChat(userText); - } - }).catch(err => { - console.error('Transition failed:', err); - }); - } catch (error) { - console.error('Error starting transition:', error); - // Fallback to immediate modal show - if (homeTextareaWrapper) { - homeTextareaWrapper.style.display = 'none'; - } - document.body.appendChild(modal); - modal.classList.remove('hidden'); - modal.classList.add('flex'); - document.body.style.overflow = 'hidden'; - // Move focus into the modal for accessibility - if (!userText) { - modalInput.focus(); - } - if (userText) { - modalInput.value = userText; - startChat(userText); - } - } - } else { - // Fallback for browsers without View Transitions support - const homeTextarea = document.querySelector('textarea[aria-label="Describe your workflow"]'); - const homeTextareaWrapper = homeTextarea ? homeTextarea.closest('.textarea-wrapper') : null; - - - // Hide home textarea to avoid duplication - if (homeTextareaWrapper) { - homeTextareaWrapper.style.display = 'none'; - } - - // Show modal immediately (no animation) - document.body.appendChild(modal); - modal.classList.remove('hidden'); - modal.classList.add('flex'); - document.body.style.overflow = 'hidden'; - - // Move focus into the modal for accessibility - if (!userText) { - modalInput.focus(); - } - - if (userText) { - startChat(userText); - } - } - } - - function closeModal() { - const homeTextarea = document.querySelector('textarea[aria-label="Describe your workflow"]'); - const homeTextareaWrapper = homeTextarea ? homeTextarea.closest('.textarea-wrapper') : null; - const modalInputSection = modal.querySelector('.p-4.bg-white.rounded-b-none.md\\:rounded-b-lg'); - - // Check if View Transitions API is supported - if (document.startViewTransition && typeof document.startViewTransition === 'function') { - // Set transition name on modal input section (for "before" snapshot) - if (modalInputSection) { - modalInputSection.style.viewTransitionName = 'morphing-content'; - } - - // Use View Transitions for smooth reverse morph - const transition = document.startViewTransition(() => { - // Remove transition name from modal - if (modalInputSection) { - modalInputSection.style.viewTransitionName = ''; - } - - // Hide modal - modal.classList.add('hidden'); - modal.classList.remove('flex'); - - // Show home wrapper with transition name (for "after" snapshot) - if (homeTextareaWrapper) { - homeTextareaWrapper.style.display = ''; - homeTextareaWrapper.style.viewTransitionName = 'morphing-content'; - } - }); - - transition.finished.then(() => { - // Clean up after transition - document.body.style.overflow = ''; - if (homeTextareaWrapper) { - homeTextareaWrapper.style.viewTransitionName = ''; - } - - // Reset modal state - clearMessages(); - modalInput.value = ''; - sessionId = null; // Clear session ID - transferPayload = [] - lastTransactionId = null; // Clear transaction ID - }); - } else { - // Fallback for browsers without View Transitions - modal.classList.add('hidden'); - modal.classList.remove('flex'); - document.body.style.overflow = ''; - - // Restore home textarea - if (homeTextareaWrapper) { - homeTextareaWrapper.style.display = ''; - } - - // Reset state - clearMessages(); - modalInput.value = ''; - sessionId = null; // Clear session ID - transferPayload = [] - lastTransactionId = null; // Clear transaction ID - } - flowsStore = {} - document.removeEventListener('click', flowInteractionHandler) - - } - - async function startChat(message) { - // Mark as generating and update UI - isGenerating = true; - updateInputState(); - - // Add user message - addMessage(message, 'human'); - - // Start AI response - const aiMessageIndex = addProgressiveMessage('', 'ai'); - - try { - // Make API call - const response = await sendChatMessage(message); - - // Check if response is valid - if (!response || !response.answer) { - console.error('Invalid response from server:', response); - throw new Error('Invalid response from server'); - } - - // Check if this response is from the most recent transaction - if (response.transactionId !== lastTransactionId) { - // Ignore response from cancelled/outdated request - return; - } - - // Handle multi-message vs single message responses - const answers = Array.isArray(response.answer) ? response.answer : [response.answer]; - if (answers.length >= 1) { - // Stop loading animation first - const loadingElement = chatMessages.children[aiMessageIndex]; - if (loadingElement) { - const loadingBubble = loadingElement.querySelector('.ai-loading'); - if (loadingBubble) { - stopLoadingMessageRotation(); - } - } - - // Wait a bit to ensure loading dots are visible - await new Promise(resolve => setTimeout(resolve, 300)); - - // Remove the loading message from DOM and array - messages.splice(aiMessageIndex, 1); - const aiMessageElements = chatMessages.children; - if (aiMessageElements[aiMessageIndex]) { - chatMessages.removeChild(aiMessageElements[aiMessageIndex]); - } - - // Now add each message from the response - answers.forEach(answer => { - addAIMessageFromObject(answer); - }); - } else { - // Fallback for old single message format - treat as single chat message - const messageText = typeof response.answer === 'string' ? response.answer : response.answer[0]?.content || 'No response'; - const words = messageText.split(' '); - let currentText = ''; - - for (let i = 0; i < words.length; i++) { - // Check if generation was stopped or transaction changed - if (!isGenerating || response.transactionId !== lastTransactionId) { - break; - } - - currentText += (i > 0 ? ' ' : '') + words[i]; - updateMessage(aiMessageIndex, currentText); - - // Small delay between words for streaming effect - await new Promise(resolve => setTimeout(resolve, 50)); - } - } - } catch (error) { - if (error.name === 'AbortError') { - // Update message to show it was stopped - updateMessage(aiMessageIndex, messages[aiMessageIndex].content + ' Stopped your request'); - } else { - // Handle other errors - updateMessage(aiMessageIndex, 'Sorry, an error occurred while generating the response.'); - } - } - - // Mark generation as complete - isGenerating = false; - currentAbortController = null; - updateInputState(); - } - - function addMessage(content, type) { - // Add to messages array - const message = { content, type }; - messages.push(message); - - // Create DOM element - const messageDiv = document.createElement('div'); - messageDiv.className = `flex ${type === 'human' ? 'justify-end' : 'justify-start'} mb-4 overflow-auto`; - - const messageBubble = document.createElement('div'); - messageBubble.className = `max-w-xs lg:max-w-md px-4 py-2 rounded-lg ${ - type === 'human' - ? 'bg-indigo-600 text-white rounded-br-sm' - : 'bg-gray-100 text-gray-800 rounded-bl-sm' - }`; - - // If it's an AI message with empty content, show loading animation - if (type === 'ai' && content === '') { - messageBubble.innerHTML = ` -
    - -
    - - - -
    -
    - `; - messageBubble.classList.add('ai-loading'); - - // Start loading sequence: dots first, then messages - startLoadingSequence(messageBubble); - } else { - messageBubble.textContent = content; - } - - messageDiv.appendChild(messageBubble); - chatMessages.appendChild(messageDiv); - - // Scroll to bottom using auto-scroll function - scrollToBottom(); - - // Return the index of the newly added message - return messages.length - 1; - } - - function clearMessages() { - // Clear messages array - messages = []; - - // Clear DOM - chatMessages.innerHTML = ''; - } - - async function showWelcomeMessage() { - // Add welcome message using addMessage to maintain array/DOM sync - const messageIndex = addMessage('', 'ai'); - - // Get the message bubble element that was just created - const messageDiv = chatMessages.children[messageIndex]; - const messageBubble = messageDiv.querySelector('div:last-child'); - - // Animate the typing of the welcome message - const welcomeText = 'Hello! I am here to help you get started with FlowFuse and Node-RED. Please tell me what you are hoping to achieve.'; - const words = welcomeText.split(' '); - let currentText = ''; - - for (let i = 0; i < words.length; i++) { - currentText += (i > 0 ? ' ' : '') + words[i]; - messageBubble.textContent = currentText; - messages[messageIndex].content = currentText; // Update the messages array too - scrollToBottom(); - - // Small delay between words for typing effect - await new Promise(resolve => setTimeout(resolve, 50)); - } - } - - async function clearConversation() { - // Stop any ongoing generation - if (currentAbortController) { - currentAbortController.abort(); - } - isGenerating = false; - - // Clear transaction ID to ignore any subsequent responses - lastTransactionId = null; - - // Stop loading message rotation - stopLoadingMessageRotation(); - - // Clear all messages - clearMessages(); - - // Reset session ID for fresh conversation - sessionId = crypto.randomUUID(); - - // Reset auto-scroll - autoScrollEnabled = true; - - // Show welcome message with typing animation - await showWelcomeMessage(); - - // Hide right buttons - const stopBtn = document.getElementById('stop-generation'); - const sendBtn = document.getElementById('send-message'); - if (stopBtn) stopBtn.classList.add('hidden'); - - // Update input state (clear button will be disabled since messages array is empty) - updateInputState(); - flowsStore = {} - } - - async function sendChatMessage(query) { - const exportBtn = document.getElementById('continue-to-app'); - exportBtn.disabled = true - - // Generate unique transaction ID for this request - const transactionId = crypto.randomUUID(); - lastTransactionId = transactionId; - - try { - // Create abort controller for this request - currentAbortController = new AbortController(); - - // Note: This API may only work in production (flowfuse.com domain) - // For local development, we'll get simulated responses - const response = await fetch('https://expert.flowfuse.com/v4/expert', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Chat-Session-ID': sessionId, - 'X-Chat-Transaction-ID': transactionId - }, - body: JSON.stringify({ query }), - signal: currentAbortController.signal - }); - - if (!response.ok) { - // Treat HTTP errors as API unavailable - fall through to simulation - throw new Error(`API unavailable: ${response.status}`); - } - - transferPayload.push({query}) - const data = await response.json(); - - exportBtn.classList.remove('hidden') - - transferPayload.push(data) - - // Extract transaction ID from response header (if available) - const responseTransactionId = response.headers.get('X-Chat-Transaction-ID') || transactionId; - - return { - answer: data.answer, - transactionId: responseTransactionId, - isMultiMessage: Array.isArray(data.answer) - }; - } catch (error) { - // Handle abort error (user clicked stop) - if (error.name === 'AbortError') { - throw error; // Re-throw abort errors to be handled by caller - } - - console.warn('Chat API not available (likely due to CORS in development):', error); - - // Fallback to simulated response for local development - const simulatedResponses = { - default: "Sorry, something went wrong trying to answer your question. Please try again.", - summary: "We discussed FlowFuse implementation strategies and Node-RED workflow development." - }; - - // Check if query contains "rich" to test rich response format - if (query.toLowerCase().includes('rich') || query.toLowerCase().includes('test')) { - const simulatedMessagesArray = [ - { - kind: "guide", - title: "Convert MQTT raw values to voltage and save in FlowFuse Tables", - summary: "This guide explains how to convert raw MQTT values (0-4096) to voltage values (0-12V) and save them in FlowFuse Tables with an ID derived from the MQTT topic using Node-RED in FlowFuse.", - steps: [ - { - title: "Subscribe to MQTT topic", - detail: "Use the MQTT input node in Node-RED to subscribe to the relevant MQTT topic that provides raw values." - }, - { - title: "Extract ID from MQTT topic", - detail: "Use a Function node to parse the MQTT topic string and compute an ID. For example, extract a unique part of the topic to use as the ID." - }, - { - title: "Convert raw value to voltage", - detail: "In the same or a subsequent Function node, convert the raw value (0-4096) to voltage (0-12V) using the formula: voltage = (raw_value / 4096) * 12." - }, - { - title: "Save data in FlowFuse Tables", - detail: "Use the FlowFuse Tables node to insert the data object into a table. Configure the node with the appropriate table name and ensure the ID is used as a key." - } - ], - resources: [ - { - title: "Using MQTT with Node-RED", - url: "https://flowfuse.com/blog/2024/06/how-to-use-mqtt-in-node-red/", - type: "docs" - }, - { - title: "FlowFuse Tables for Industrial IoT", - url: "https://flowfuse.com/blog/2025/08/time-series-dashboard-flowfuse-postgresql/", - type: "blog" - }, - { - title: "Latest Features Changelog", - url: "https://flowfuse.com/changelog/", - type: "changelog" - } - ], - nodePackages: [ - { - name: "@flowfuse/node-red-dashboard" - }, - { - name: "node-red-contrib-mqtt-broker" - } - ] - }, - { - kind: "chat", - title: "Additional Information", - content: "I hope this guide helps you get started! Let me know if you have any questions about implementing this workflow or need clarification on any of the steps." - } - ]; - - const simulatedResult = { - answer: simulatedMessagesArray, - transactionId: transactionId, - isMultiMessage: true - }; - return simulatedResult; - } - - // Check if this is a summary request - const simulatedAnswer = query.includes('summary') ? simulatedResponses.summary : simulatedResponses.default; - - const simulatedResult = { - answer: [{ - kind: "chat", - content: simulatedAnswer - }], - transactionId: transactionId, - isMultiMessage: true - }; - return simulatedResult; - } - } - - function updateMessage(messageIndex, newContent) { - // Update the message in the array - if (messageIndex >= 0 && messageIndex < messages.length) { - messages[messageIndex].content = newContent; - - // Find the correct DOM element index - // If there's a welcome message, we need to offset by 1 - const hasWelcomeMessage = chatMessages.children.length > messages.length; - const domIndex = hasWelcomeMessage ? messageIndex + 1 : messageIndex; - - // Update the corresponding DOM element - const messageElements = chatMessages.children; - if (messageElements[domIndex]) { - const messageBubble = messageElements[domIndex].querySelector('div'); - messageBubble.textContent = newContent; - } - - // Scroll to bottom during streaming updates - scrollToBottom(); - } - } - - function addProgressiveMessage(content, type) { - // Add initial message and return its index - addMessage(content, type); - return messages.length - 1; // Return index of the newly added message - } - - function addAIMessageFromObject(aiMessage) { - if (typeof aiMessage === 'string') { - aiMessage = { kind: 'chat', content: aiMessage }; - } - // Add to messages array - const message = { content: '', type: 'ai', isHTML: true }; - messages.push(message); - - // Create DOM element - const messageDiv = document.createElement('div'); - messageDiv.className = 'flex justify-start mb-4'; - - const messageBubble = document.createElement('div'); - let paddingClass = (aiMessage.kind === 'guide' || aiMessage.kind === 'resources') ? 'py-4' : 'py-2'; - messageBubble.className = `max-w-[90%] px-4 ${paddingClass} rounded-lg bg-gray-100 text-gray-800 rounded-bl-sm rich-content overflow-auto`; - - // Render content based on message kind - let htmlContent = ''; - if (aiMessage.kind === 'guide' || aiMessage.kind === 'resources') { - htmlContent = renderRichContent(aiMessage); - } else if (aiMessage.kind === 'chat') { - htmlContent = renderChatContent(aiMessage); - } - - // Update message content and DOM - const sanitizedHtml = DOMPurify.sanitize(htmlContent, { ADD_ATTR: ['target'] }); - message.content = sanitizedHtml; - messageBubble.innerHTML = sanitizedHtml; - - messageDiv.appendChild(messageBubble); - chatMessages.appendChild(messageDiv); - - // Scroll to bottom - scrollToBottom(); - - return messages.length - 1; // Return index of the newly added message - } - - function startLoadingSequence(messageBubble) { - // Clear any existing interval - if (loadingMessageInterval) { - clearInterval(loadingMessageInterval); - } - - // Show just dots for the first 5 seconds - setTimeout(() => { - // After 5 seconds, start showing messages with dots - const loadingTextElement = messageBubble.querySelector('.loading-text'); - if (loadingTextElement && messageBubble.classList.contains('ai-loading')) { - // Show the first message - currentLoadingMessageIndex = 0; - loadingTextElement.textContent = loadingMessages[currentLoadingMessageIndex]; - loadingTextElement.classList.remove('hidden'); - loadingTextElement.classList.add('inline', 'mr-2'); - - // Start rotating messages every 5 seconds - loadingMessageInterval = setInterval(() => { - if (messageBubble.classList.contains('ai-loading')) { - currentLoadingMessageIndex = (currentLoadingMessageIndex + 1) % loadingMessages.length; - const textElement = messageBubble.querySelector('.loading-text'); - if (textElement) { - textElement.textContent = loadingMessages[currentLoadingMessageIndex]; - } - } - }, 6000); - } - }, 8000); - } - - function stopLoadingMessageRotation() { - if (loadingMessageInterval) { - clearInterval(loadingMessageInterval); - loadingMessageInterval = null; - } - } - - function renderChatContent(chatMessage) { - let html = ''; - - // Content (no title for chat messages) - if (chatMessage.content) { - const sanitizedContent = DOMPurify.sanitize(chatMessage.content, { ADD_ATTR: ['target'] }); - html += `

    ${sanitizedContent}

    `; - } - - return html; - } - - function addUTMParameters(url) { - try { - const urlObj = new URL(url); - urlObj.searchParams.set('utm_campaign', '215266513-FlowFuse Expert'); - return urlObj.toString(); - } catch (e) { - // If URL parsing fails, return original URL - return url; - } - } - - function renderRichContent(richAnswer) { - let html = ''; - - // Setup Guide label for guide messages - let headerText = 'Result' - - if (richAnswer.kind === 'guide') headerText = 'Setup Guide' - if (richAnswer.kind === 'resources') headerText = 'Resources'; - - html += `
    ${headerText}
    `; - - // Title - if (richAnswer.title) { - html += `

    ${richAnswer.title}

    `; - } - - // Summary text (if any) - if (richAnswer.summary) { // typically a guide has a summary - html += `

    ${richAnswer.summary}

    `; - } - - // Content text (if any) - if (richAnswer.content) { // typically a resources response has this field - html += `

    ${richAnswer.content}

    `; - } - - // Steps - if (richAnswer.steps && richAnswer.steps.length > 0) { - html += '
    '; - html += '

    Steps:

    '; - html += '
      '; - - richAnswer.steps.forEach((step, index) => { - html += ` -
    1. - ${index + 1} -
      -
      ${step.title}
      -

      ${step.detail}

      -
      -
    2. `; - }); - - html += '
    '; - html += '
    '; - } - - // Node Packages - if (richAnswer.nodePackages && richAnswer.nodePackages.length > 0) { - html += '
    '; - html += '

    Required Node Packages

    '; - html += '
    '; - richAnswer.nodePackages.forEach(pkg => { - const url = pkg.url || pkg.metadata?.source; - const defLocation = 'https://flows.nodered.org/search?type=node'; - const packageName = pkg.name || pkg.id || pkg.metadata?.id; - const nodeUrl = url || (packageName ? `https://flows.nodered.org/node/${packageName}` : defLocation); - const nodeUrlWithUTM = addUTMParameters(nodeUrl); - const faviconUrl = `https://www.google.com/s2/favicons?domain=${new URL(nodeUrl).hostname}`; - - html += ` - -
    - -
    -
    ${packageName || nodeUrl}
    -

    ${nodeUrl}

    -
    -
    -
    `; - }); - - html += '
    '; - html += '
    '; - } - - // Resources - if (richAnswer.resources && richAnswer.resources.length > 0) { - html += '
    '; - html += '

    Related Resources

    '; - html += '
    '; - - richAnswer.resources.forEach(resource => { - const url = resource.url || resource.metadata?.source; - const title = resource.title || resource.metadata?.title || url; - const faviconUrl = `https://www.google.com/s2/favicons?domain=${new URL(url).hostname}`; - const resourceUrlWithUTM = addUTMParameters(url); - - html += ` - -
    - -
    -
    ${title}
    -

    ${url}

    -
    -
    -
    `; - }); - - html += '
    '; - html += '
    '; - } - - // Flows - if (richAnswer.flows && richAnswer.flows.length > 0) { - html += '
    '; - html += '

    Example Flows

    '; - html += '
      '; - - richAnswer.flows.forEach(flow => { - if (!flow || typeof flow !== 'object' || !flow.metadata || !Array.isArray(flow.metadata.flows) || flow.metadata.flows.length === 0) return; - const flowId = `flow-${crypto.randomUUID()}` - let flowsJSON = JSON.stringify(flow.metadata.flows, null, 2); - flowsStore[flowId] = flowsJSON; - html += ` -
    • -
      -
      - - - - - - - - - - - - - -
      -
      -
      ${flow.title}
      -
      - - -
      -
      -

      - Category: - ${flow.metadata?.category} -

      -
      -
      -
      - -
      -
      -
    • ` - }); - - html += '
    '; - html += '
    '; - } - - return html; - } - - // Stop generation - const stopGenerationBtn = document.getElementById('stop-generation'); - if (stopGenerationBtn) { - stopGenerationBtn.addEventListener('click', function() { - // Stop the current generation - isGenerating = false; - - // Clear transaction ID to ignore any subsequent responses - lastTransactionId = null; - - // Stop loading message rotation - stopLoadingMessageRotation(); - - // Abort the current API request if it exists - if (currentAbortController) { - currentAbortController.abort(); - } - - updateInputState(); - }); - } - - // Send message - const sendMessageBtn = document.getElementById('send-message'); - if (sendMessageBtn) { - sendMessageBtn.addEventListener('click', async function() { - const message = modalInput.value.trim(); - if (!message) return; // Don't send empty messages - - // Clear the input - modalInput.value = ''; - - // Add user message - addMessage(message, 'human'); - - // Mark as generating and update UI - isGenerating = true; - updateInputState(); - - // Start AI response - const aiMessageIndex = addProgressiveMessage('', 'ai'); - - try { - // Make API call - const response = await sendChatMessage(message); - - // Check if response is valid - if (!response || !response.answer) { - throw new Error('Invalid response from server'); - } - - // Check if this response is from the most recent transaction - if (response.transactionId !== lastTransactionId) { - // Ignore response from cancelled/outdated request - return; - } - - // Handle multi-message vs single message responses - if (response.isMultiMessage && Array.isArray(response.answer)) { - // Stop loading animation first - const loadingElement = chatMessages.children[aiMessageIndex]; - if (loadingElement) { - const loadingBubble = loadingElement.querySelector('.ai-loading'); - if (loadingBubble) { - stopLoadingMessageRotation(); - } - } - - // Wait a bit to ensure loading dots are visible - await new Promise(resolve => setTimeout(resolve, 300)); - - // Remove the loading message from DOM and array - messages.splice(aiMessageIndex, 1); - const aiMessageElements = chatMessages.children; - if (aiMessageElements[aiMessageIndex]) { - chatMessages.removeChild(aiMessageElements[aiMessageIndex]); - } - - // Now add each message from the response - response.answer.forEach(messageObj => { - addAIMessageFromObject(messageObj); - }); - } else { - // Fallback for old single message format - treat as single chat message - const messageText = typeof response.answer === 'string' ? response.answer : response.answer[0]?.content || 'No response'; - const words = messageText.split(' '); - let currentText = ''; - - for (let i = 0; i < words.length; i++) { - // Check if generation was stopped or transaction changed - if (!isGenerating || response.transactionId !== lastTransactionId) { - break; - } - - currentText += (i > 0 ? ' ' : '') + words[i]; - updateMessage(aiMessageIndex, currentText); - await new Promise(resolve => setTimeout(resolve, 30)); - } - } - } catch (error) { - if (error.name === 'AbortError') { - // Update message to show it was stopped - updateMessage(aiMessageIndex, messages[aiMessageIndex].content + ' Stopped your request'); - } else { - // Handle other errors - updateMessage(aiMessageIndex, 'Sorry, an error occurred while generating the response.'); - } - } - - // Mark generation as complete - isGenerating = false; - currentAbortController = null; - updateInputState(); - }); - } - - // Update send button when typing - modalInput.addEventListener('input', function() { - updateInputState(); - }); - - // Enter key to send message - modalInput.addEventListener('keydown', async function(e) { - if (e.key === 'Enter' && !e.shiftKey) { - e.preventDefault(); - const message = modalInput.value.trim(); - if (message) { - modalInput.value = ''; - - - // Re-enable auto-scroll when user sends a new message - autoScrollEnabled = true; - - // Add user message - addMessage(message, 'human'); - - // Mark as generating and update UI - isGenerating = true; - updateInputState(); - - // Start AI response - const aiMessageIndex = addProgressiveMessage('', 'ai'); - - try { - // Make API call - const response = await sendChatMessage(message); - - // Check if response is valid - if (!response || !response.answer) { - throw new Error('Invalid response from server'); - } - - // Check if this response is from the most recent transaction - if (response.transactionId !== lastTransactionId) { - // Ignore response from cancelled/outdated request - return; - } - - // Handle multi-message vs single message responses - if (response.isMultiMessage && Array.isArray(response.answer)) { - // Stop loading animation first - const loadingElement = chatMessages.children[aiMessageIndex]; - if (loadingElement) { - const loadingBubble = loadingElement.querySelector('.ai-loading'); - if (loadingBubble) { - stopLoadingMessageRotation(); - } - } - - // Wait a bit to ensure loading dots are visible - await new Promise(resolve => setTimeout(resolve, 300)); - - // Remove the loading message from DOM and array - messages.splice(aiMessageIndex, 1); - const aiMessageElements = chatMessages.children; - if (aiMessageElements[aiMessageIndex]) { - chatMessages.removeChild(aiMessageElements[aiMessageIndex]); - } - - // Now add each message from the response - response.answer.forEach(messageObj => { - addAIMessageFromObject(messageObj); - }); - } else { - // Fallback for old single message format - treat as single chat message - const messageText = typeof response.answer === 'string' ? response.answer : response.answer[0]?.content || 'No response'; - const words = messageText.split(' '); - let currentText = ''; - - for (let i = 0; i < words.length; i++) { - // Check if generation was stopped or transaction changed - if (!isGenerating || response.transactionId !== lastTransactionId) { - break; - } - - currentText += (i > 0 ? ' ' : '') + words[i]; - updateMessage(aiMessageIndex, currentText); - await new Promise(resolve => setTimeout(resolve, 30)); - } - } - } catch (error) { - if (error.name === 'AbortError') { - // Update message to show it was stopped - updateMessage(aiMessageIndex, messages[aiMessageIndex].content + ' Stopped your request'); - } else { - // Handle other errors - updateMessage(aiMessageIndex, 'Sorry, an error occurred while generating the response.'); - } - } - - // Mark generation as complete - isGenerating = false; - currentAbortController = null; - updateInputState(); - } - } - }); - - // Add click handler for flow copy buttons & code blocks - document.addEventListener('click', flowInteractionHandler); - - - // Clear conversation event listener - const clearConversationBtn = document.getElementById('clear-conversation'); - if (clearConversationBtn) { - clearConversationBtn.addEventListener('click', clearConversation); - } - - let target - let messageHandler - // Determine app URL based on hostname - const appURL = window.location.hostname === 'localhost' - ? 'http://localhost:3000' - : 'https://app.flowfuse.com'; - - document.getElementById('continue-to-app').addEventListener('click', function handler() { - // Reuse existing target window or create new one if it doesn't exist or was closed - if (!target || target.closed) { - target = window.open(appURL, 'flowfuse-app'); - } else { - // If window exists and is open, bring it to focus - target.focus(); - } - - // Only create the messageHandler if it doesn't exist - if (!messageHandler) { - messageHandler = function(event) { - // Verify the origin for security - if (event.origin !== appURL) { - return; - } - // Check message type - if (event.data.type === 'onLoad' && event.data.status === 'ready') { - // Now you can send messages to the target - target.postMessage({ - source : 'flowfuse-website', - scope : 'flowfuse-expert', - action : 'set-context', - payload: { - data: transferPayload, - sessionId - } - }, - appURL - ) - } else if (event.data.type === 'flowfuse-expert-response' && event.data.action === 'confirm') { - // Remove message handler after successful context response - window.removeEventListener('message', messageHandler) - messageHandler = null - closeModal() - } - }; - // Add the event listener only once - window.addEventListener('message', messageHandler); - } - }); -}); diff --git a/src/js/hm-promo-banner.js b/src/js/hm-promo-banner.js deleted file mode 100644 index 240306541a..0000000000 --- a/src/js/hm-promo-banner.js +++ /dev/null @@ -1,118 +0,0 @@ -(function () { - 'use strict'; - - var STORAGE_KEY = 'hm_banner_dismissed'; - var MOBILE_BP = 768; - var SHOW_DELAY = 3000; - var EXPIRY_DATE = new Date('2026-04-20T14:00:00Z'); - - var chatObserver = null; - var bannerWasShown = false; // tracks whether the banner has been shown this session - var hasResizeListener = false; - - function adjustForChat(banner) { - var chat = document.getElementById('hubspot-messages-iframe-container'); - if (chat && chat.offsetHeight > 0) { - banner.style.bottom = (chat.offsetHeight + 16) + 'px'; - } else { - banner.style.bottom = ''; - } - } - - function watchChatBubble(banner) { - var chat = document.getElementById('hubspot-messages-iframe-container'); - if (chat) { - chatObserver = new MutationObserver(function () { - adjustForChat(banner); - setTimeout(function () { adjustForChat(banner); }, 500); - }); - chatObserver.observe(chat, { attributes: true, attributeFilter: ['style', 'class'] }); - adjustForChat(banner); - setTimeout(function () { adjustForChat(banner); }, 500); - return; - } - - chatObserver = new MutationObserver(function (mutations) { - mutations.forEach(function (mutation) { - mutation.addedNodes.forEach(function (node) { - // Guard against text nodes and other non-element nodes - if (node.nodeType === 1 && node.id === 'hubspot-messages-iframe-container') { - chatObserver.disconnect(); - chatObserver.observe(node, { attributes: true, attributeFilter: ['style', 'class'] }); - adjustForChat(banner); - setTimeout(function () { adjustForChat(banner); }, 500); - } - }); - }); - }); - chatObserver.observe(document.body, { childList: true }); - } - - function showBanner(banner) { - if (banner.classList.contains('hm-promo-banner--visible')) return; - banner.classList.add('hm-promo-banner--visible'); - bannerWasShown = true; - if (typeof capture === 'function') { - capture('hm-banner-shown', { page: location.pathname, location: 'floating-banner' }); - } - } - - function init() { - if (new Date() >= EXPIRY_DATE) return; - if (window.innerWidth < MOBILE_BP) return; - if (sessionStorage.getItem(STORAGE_KEY)) return; - - var banner = document.getElementById('hm-promo-banner'); - if (!banner) return; - - // Resize: hide on mobile, restore on desktop if banner was shown and not dismissed - if (!hasResizeListener) { - window.addEventListener('resize', function () { - if (window.innerWidth < MOBILE_BP) { - banner.classList.remove('hm-promo-banner--visible'); - } else if (bannerWasShown && !sessionStorage.getItem(STORAGE_KEY)) { - banner.classList.add('hm-promo-banner--visible'); - } - }); - hasResizeListener = true; - } - - setTimeout(function () { - if (window.innerWidth < MOBILE_BP) return; - showBanner(banner); - adjustForChat(banner); - watchChatBubble(banner); - }, SHOW_DELAY); - - var closeBtn = document.getElementById('hm-promo-banner-close'); - if (closeBtn) { - closeBtn.addEventListener('click', function () { - dismiss(banner, 'close-button'); - }); - } - - document.addEventListener('keydown', function (e) { - if (e.key === 'Escape' && banner.classList.contains('hm-promo-banner--visible')) { - dismiss(banner, 'esc-key'); - } - }); - } - - function dismiss(banner, method) { - banner.classList.remove('hm-promo-banner--visible'); - sessionStorage.setItem(STORAGE_KEY, 'true'); - if (chatObserver) { - chatObserver.disconnect(); - chatObserver = null; - } - if (typeof capture === 'function') { - capture('hm-banner-dismissed', { page: location.pathname, method: method, location: 'floating-banner' }); - } - } - - if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', init); - } else { - init(); - } -})(); diff --git a/src/sitemap.njk b/src/sitemap.njk deleted file mode 100644 index bd9d644402..0000000000 --- a/src/sitemap.njk +++ /dev/null @@ -1,21 +0,0 @@ ---- -permalink: /sitemap-legacy.xml -eleventyExcludeFromCollections: true ---- - - -{%- for page in collections.all -%} - {%- if page.data.skipIndex != true %} - - {{ page.url | url | toAbsoluteUrl }} - {{ (page.data.lastUpdated or page.date) | toDate | dateToRfc3339 }} - {{ page.data.sitemapPriority | default(0.6) }} - - {%- endif %} -{%- endfor %} - - https://app.flowfuse.com/account/create/ - {{ currentDateISO }} - 0.9 - - \ No newline at end of file diff --git a/src/webinars/webinars.json b/src/webinars/webinars.json deleted file mode 100644 index a86e35bc1f..0000000000 --- a/src/webinars/webinars.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tags": [ - "webinar", "event" - ], - "layout": "layouts/webinar.njk", - "nav": "webinars", - "searchTitle": "Webinars" -} diff --git a/src/whitepaper/images/ff-uns.png b/src/whitepaper/images/ff-uns.png deleted file mode 100644 index 564c26cf16..0000000000 Binary files a/src/whitepaper/images/ff-uns.png and /dev/null differ