diff --git a/scripts/verify-build.mjs b/scripts/verify-build.mjs
index df5ce6a..08ba960 100644
--- a/scripts/verify-build.mjs
+++ b/scripts/verify-build.mjs
@@ -12,6 +12,7 @@ const pages = await Promise.all(required.filter((file) => file.endsWith('.html')
for (const { file, html } of pages) {
if (html.includes('{{') || html.includes('{%')) throw new Error(`${file} contains an unresolved template placeholder.`);
if (!/
[^<]+<\/title>/.test(html)) throw new Error(`${file} is missing a title.`);
+ if (!html.includes('data-demo-banner') || !html.includes('href="https://sloanops.com/"')) throw new Error(`${file} is missing the SloanOps demo banner.`);
for (const match of html.matchAll(/(?:src|href)="(\/images\/[^"?#]+)"/g)) await access(resolve(root, `.${match[1]}`));
}
@@ -27,6 +28,10 @@ if (key === 'www') {
if (key === 'blog') {
const publishedPosts = ['first-walk-after-work', 'gentler-grooming-day', 'overnight-care-checklist', 'weekend-care-prep'];
await Promise.all(publishedPosts.map((slug) => access(resolve(root, `posts/${slug}/index.html`))));
+ for (const slug of publishedPosts) {
+ const html = await readFile(resolve(root, `posts/${slug}/index.html`), 'utf8');
+ if (!html.includes('data-demo-banner') || !html.includes('href="https://sloanops.com/"')) throw new Error(`Blog post is missing the SloanOps demo banner: ${slug}.`);
+ }
if (home.includes('Draft only example for editorial review')) throw new Error('Draft blog post appeared in the journal.');
try {
await access(resolve(root, 'posts/draft-only-example/index.html'));
diff --git a/src/components/DemoBanner.astro b/src/components/DemoBanner.astro
new file mode 100644
index 0000000..7bd17ff
--- /dev/null
+++ b/src/components/DemoBanner.astro
@@ -0,0 +1,103 @@
+
+
+
diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro
index ed484c5..b7bb797 100644
--- a/src/layouts/BaseLayout.astro
+++ b/src/layouts/BaseLayout.astro
@@ -1,5 +1,6 @@
---
import '../styles/global.css';
+import DemoBanner from '../components/DemoBanner.astro';
import Header from '../components/Header.astro';
import Footer from '../components/Footer.astro';
import { deployment, isBlog, isProduction, site } from '../lib/site-data.js';
@@ -32,6 +33,7 @@ const structuredData = isBlog ? { '@context': 'https://schema.org', '@type': 'We
+