import {localizationFiles} from '../localization/build.mjs'; import {paidOrderFiles} from '../orders/build.mjs'; import {catalogReleaseExample} from '../catalog-releases/build.mjs'; // @requirements REQ-PRODUCT-BUNDLE-BUDGET import {serviceDirectoryFiles} from '../services/build.mjs'; import {contractActionFiles} from '../contract-actions/build.mjs'; import {googleBasicFiles} from '../google-basic/build.mjs'; import {formPermissionFiles} from '../form-permissions/build.mjs'; import {rightsFiles} from '../rights/build.mjs'; import {styleExamplePages} from './example-design.mjs'; import {discoveryFiles} from '../discovery/build.mjs'; import {scopeGuardFiles} from '../scope-guards/build.mjs'; import {repeatPromptFiles} from '../repeat-prompts/build.mjs'; import { readFile } from 'node:fs/promises'; import { resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; import { compileLegalDocuments,createRetainedReleaseFiles } from 'notabenda/content'; import { renderLegalLinks } from 'notabenda'; import { writeBuildFiles } from '../../packages/notabenda/dist/files.js'; import { choiceFiles } from './choices-build.mjs'; import { agreementFiles } from './terms-build.mjs'; import { authoringExample } from '../authoring/build.mjs'; import { reactFiles } from '../react/build.mjs'; import { astroFiles } from '../astro/build.mjs'; import { embedFiles } from '../embeds/build.mjs'; import {retainedReleaseExample} from '../releases/build.mjs'; import { processingFiles } from '../processing-choices/build.mjs'; import {collectionFiles} from '../collection/build.mjs'; import {indirectCollectionFiles} from '../indirect-collection/build.mjs'; import {guaranteeFiles} from '../guarantees/build.mjs'; import {setupFiles} from '../setup/build.mjs'; import {storageExceptionFiles} from '../storage-exceptions/build.mjs'; import {storageCleanupFiles} from '../storage-cleanup/build.mjs'; import { signalFiles } from '../privacy-signals/build.mjs'; export async function exampleFiles() { const config = JSON.parse(await readFile(new URL('./notabenda.config.json', import.meta.url), 'utf8')); const css = await readFile(new URL('../../packages/notabenda/dist/styles.css', import.meta.url), 'utf8'); const consentCss = await readFile(new URL('../../packages/notabenda/dist/consent.css', import.meta.url), 'utf8'); const darkTheme = '\n@layer example { .nb-page { color-scheme: dark; --nb-page-bg: #10121d; --nb-surface: #171b2b; --nb-soft: #202539; --nb-text: #eef0fc; --nb-muted: #adb5ce; --nb-line: #343b56; --nb-accent: #bdc4ff; --nb-action-bg: #c1c7ff; --nb-action-text: #191d35; --nb-focus: #a5acff; --nb-font: ui-sans-serif, system-ui, sans-serif; --nb-document-width: 46rem; } }\n'; const logo = await readFile(new URL('../../docs/assets/logo.svg', import.meta.url), 'utf8'); const mark = await readFile(new URL('../../docs/assets/mark.svg', import.meta.url), 'utf8'); const build = compileLegalDocuments(config, { mode: 'preview' }); const dark = structuredClone(config); for (const doc of Object.values(dark.documents)) doc.route = '/dark' + doc.route; const darkBuild = compileLegalDocuments(dark, { mode: 'preview', stylesheetUrl: '/assets/dark.css' }); const darkFiles = Object.fromEntries(Object.entries(darkBuild.files).filter(([file]) => file.startsWith('dark/') || file.startsWith('artifacts/'))); const index = `Juniper Notes · Legal pages example
Juniper NotesJuniper Notes examples

Notabenda · Static example

Notabenda examples

Legal pages that feel like part of your site. Built from one configuration, rendered as ordinary HTML, with no scripts or external assets.

Explore the documents

${renderLegalLinks(config)}

Customize the styles

The same renderer supports your fonts, colors, layout, and reviewed content. Try the second theme:

`; const previous=JSON.parse(await readFile(new URL('../releases/previous-preview-releases.json',import.meta.url),'utf8')); const retained={};for(const [siteId,artifacts] of Map.groupBy(previous,artifact=>artifact.manifest.siteId))Object.assign(retained,createRetainedReleaseFiles(artifacts,{siteId,mode:'preview'})); return styleExamplePages({ ...retained,...catalogReleaseExample(config).files,...await indirectCollectionFiles(config),...await guaranteeFiles(),...await paidOrderFiles(), ...build.files, ...darkFiles, ...await serviceDirectoryFiles(config), ...(await authoringExample()).files, ...await choiceFiles(config), ...await agreementFiles(config), ...await reactFiles(config), ...await astroFiles(), ...await embedFiles(config), ...await signalFiles(config), ...await storageCleanupFiles(config), ...await storageExceptionFiles(config), ...await localizationFiles(config), ...await setupFiles(), ...await collectionFiles(config), ...await discoveryFiles(config), ...await repeatPromptFiles(config), ...await scopeGuardFiles(config), ...await rightsFiles(config), ...await processingFiles(config), ...await formPermissionFiles(config), ...await googleBasicFiles(config),...await contractActionFiles(config), ...(await retainedReleaseExample()).files, 'index.html': index.replace('', '

Discovery tooling

Capture and review observed origins and storage names

').replace('', '

Inline collection notices

Privacy information beside the form

Declared storage cleanup

Try exact-key cleanup on withdrawal

Retained document releases

Read current and previous terms

Recorded processing choices

Try the separate opt-out · Review its records

Privacy signals

Try the Global Privacy Control example

Gated media

Try permission-gated frames and images

Live cookie choices

Try the consent controls · Try the dark theme

Terms agreement

Try the agreement flow · Review its records

Astro integration

Try Astro navigation and choices · Static Astro privacy page

React integration

Try React choices · Midnight React theme

Write in Markdown or MDX

Read authored terms · Markdown cookie addendum · Inspect source revisions

'), 'assets/notabenda.css': css, 'assets/logo.svg': logo, 'assets/mark.svg': mark, 'brand/index.html': 'Notabenda · Brand

Notabenda · Brand assets

notabenda

Brand assets

An original folded-note mark and a simple wordmark. Scalable SVGs, no external fonts or assets, Apache-2.0.

Explore the legal pages · Evidence workspace · Document history

', 'assets/dark.css': css + darkTheme, 'assets/consent.css':consentCss, 'assets/consent-dark.css':consentCss + darkTheme, }); } if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { await writeBuildFiles(new URL('./dist', import.meta.url).pathname, await exampleFiles()); console.log('Built fictional light/dark legal pages in examples/static/dist.'); }