@hale-bopp/valentino-engine 1.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/bin/commands/init.d.ts +3 -0
  3. package/dist/bin/commands/init.d.ts.map +1 -0
  4. package/dist/bin/commands/init.js +428 -0
  5. package/dist/bin/commands/init.js.map +1 -0
  6. package/dist/bin/commands/llms.d.ts +2 -0
  7. package/dist/bin/commands/llms.d.ts.map +1 -0
  8. package/dist/bin/commands/llms.js +84 -0
  9. package/dist/bin/commands/llms.js.map +1 -0
  10. package/dist/bin/commands/validate.d.ts.map +1 -1
  11. package/dist/bin/commands/validate.js +152 -11
  12. package/dist/bin/commands/validate.js.map +1 -1
  13. package/dist/bin/valentino.js +10 -0
  14. package/dist/bin/valentino.js.map +1 -1
  15. package/dist/core/animation.d.ts +18 -0
  16. package/dist/core/animation.d.ts.map +1 -0
  17. package/dist/core/animation.js +91 -0
  18. package/dist/core/animation.js.map +1 -0
  19. package/dist/core/encoding.d.ts +32 -0
  20. package/dist/core/encoding.d.ts.map +1 -0
  21. package/dist/core/encoding.js +112 -0
  22. package/dist/core/encoding.js.map +1 -0
  23. package/dist/core/extension-registry.d.ts +64 -0
  24. package/dist/core/extension-registry.d.ts.map +1 -0
  25. package/dist/core/extension-registry.js +62 -0
  26. package/dist/core/extension-registry.js.map +1 -0
  27. package/dist/core/guardrails-cms.d.ts +70 -0
  28. package/dist/core/guardrails-cms.d.ts.map +1 -0
  29. package/dist/core/guardrails-cms.js +299 -0
  30. package/dist/core/guardrails-cms.js.map +1 -0
  31. package/dist/core/hero-contract.js +2 -2
  32. package/dist/core/hero-contract.js.map +1 -1
  33. package/dist/core/hero-contract.test.js +9 -2
  34. package/dist/core/hero-contract.test.js.map +1 -1
  35. package/dist/core/llms-generator.d.ts +36 -0
  36. package/dist/core/llms-generator.d.ts.map +1 -0
  37. package/dist/core/llms-generator.js +95 -0
  38. package/dist/core/llms-generator.js.map +1 -0
  39. package/dist/core/media.d.ts +24 -0
  40. package/dist/core/media.d.ts.map +1 -0
  41. package/dist/core/media.js +16 -0
  42. package/dist/core/media.js.map +1 -0
  43. package/dist/core/page-status.d.ts +18 -0
  44. package/dist/core/page-status.d.ts.map +1 -0
  45. package/dist/core/page-status.js +33 -0
  46. package/dist/core/page-status.js.map +1 -0
  47. package/dist/core/redirects.d.ts +19 -0
  48. package/dist/core/redirects.d.ts.map +1 -0
  49. package/dist/core/redirects.js +17 -0
  50. package/dist/core/redirects.js.map +1 -0
  51. package/dist/core/rhythm.d.ts.map +1 -1
  52. package/dist/core/rhythm.js +20 -1
  53. package/dist/core/rhythm.js.map +1 -1
  54. package/dist/core/rhythm.test.js +6 -6
  55. package/dist/core/rhythm.test.js.map +1 -1
  56. package/dist/core/section-integrity.d.ts.map +1 -1
  57. package/dist/core/section-integrity.js +10 -0
  58. package/dist/core/section-integrity.js.map +1 -1
  59. package/dist/core/section-integrity.test.js +12 -0
  60. package/dist/core/section-integrity.test.js.map +1 -1
  61. package/dist/core/seo.d.ts +26 -0
  62. package/dist/core/seo.d.ts.map +1 -0
  63. package/dist/core/seo.js +49 -0
  64. package/dist/core/seo.js.map +1 -0
  65. package/dist/core/types.d.ts +30 -1
  66. package/dist/core/types.d.ts.map +1 -1
  67. package/dist/index.d.ts +20 -1
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +18 -0
  70. package/dist/index.js.map +1 -1
  71. package/package.json +1 -1
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Generate llms.txt — compact site index (L0 Matrioska).
3
+ * Max ~50 lines: header, pages list, capabilities.
4
+ */
5
+ export function generateLlmsTxt(manifest, options) {
6
+ const lines = [];
7
+ const { siteName, tagline, capabilities, resolveContent } = options;
8
+ // Header
9
+ lines.push(`# ${siteName}`);
10
+ if (tagline)
11
+ lines.push(`> ${tagline}`);
12
+ lines.push('');
13
+ // Pages — only published/visible pages with navigation
14
+ const visiblePages = manifest.pages.filter((p) => p.status !== 'draft' && p.nav);
15
+ if (visiblePages.length > 0) {
16
+ lines.push('## Pages');
17
+ for (const page of visiblePages) {
18
+ const label = resolveContent && page.nav?.labelKey
19
+ ? resolveContent(page.nav.labelKey) || page.id
20
+ : page.id;
21
+ const titleKey = page.titleKey;
22
+ const desc = titleKey && resolveContent
23
+ ? resolveContent(titleKey) || ''
24
+ : '';
25
+ const suffix = desc && desc !== label ? ` — ${desc}` : '';
26
+ lines.push(`- ${page.route}: ${label}${suffix}`);
27
+ }
28
+ lines.push('');
29
+ }
30
+ // Capabilities
31
+ if (capabilities && capabilities.length > 0) {
32
+ lines.push('## Capabilities');
33
+ for (const cap of capabilities) {
34
+ lines.push(`- ${cap}`);
35
+ }
36
+ lines.push('');
37
+ }
38
+ return lines.join('\n');
39
+ }
40
+ /**
41
+ * Generate llms-full.txt — detailed per-page breakdown (L1 Matrioska).
42
+ * Includes section types, SEO metadata, and page purpose.
43
+ */
44
+ export function generateLlmsFullTxt(manifest, options) {
45
+ const lines = [];
46
+ const { siteName, tagline, baseUrl, resolveContent, specsById } = options;
47
+ // Header
48
+ lines.push(`# ${siteName} — Full Site Map`);
49
+ if (tagline)
50
+ lines.push(`> ${tagline}`);
51
+ if (baseUrl)
52
+ lines.push(`> ${baseUrl}`);
53
+ lines.push('');
54
+ // All non-draft pages
55
+ const pages = manifest.pages.filter((p) => p.status !== 'draft');
56
+ for (const page of pages) {
57
+ const label = resolveContent && page.nav?.labelKey
58
+ ? resolveContent(page.nav.labelKey) || page.id
59
+ : page.id;
60
+ const url = baseUrl ? `${baseUrl}${page.route}` : page.route;
61
+ lines.push(`## ${label}`);
62
+ lines.push(`- URL: ${url}`);
63
+ lines.push(`- Route: ${page.route}`);
64
+ // SEO from spec
65
+ const spec = specsById?.get(page.id);
66
+ if (spec?.seo) {
67
+ if (spec.seo.metaTitle)
68
+ lines.push(`- Title: ${spec.seo.metaTitle}`);
69
+ if (spec.seo.metaDescription)
70
+ lines.push(`- Description: ${spec.seo.metaDescription}`);
71
+ }
72
+ // Section breakdown
73
+ if (spec?.sections && spec.sections.length > 0) {
74
+ const sectionTypes = spec.sections.map((s) => s.type);
75
+ const uniqueTypes = [...new Set(sectionTypes)];
76
+ lines.push(`- Sections (${spec.sections.length}): ${uniqueTypes.join(', ')}`);
77
+ }
78
+ // Navigation info
79
+ if (page.nav) {
80
+ lines.push(`- Navigation: visible (order ${page.nav.order ?? 'auto'})`);
81
+ }
82
+ else {
83
+ lines.push('- Navigation: hidden');
84
+ }
85
+ lines.push('');
86
+ }
87
+ // Languages
88
+ if (manifest.defaultLanguage) {
89
+ lines.push(`## Languages`);
90
+ lines.push(`- Default: ${manifest.defaultLanguage}`);
91
+ lines.push('');
92
+ }
93
+ return lines.join('\n');
94
+ }
95
+ //# sourceMappingURL=llms-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-generator.js","sourceRoot":"","sources":["../../src/core/llms-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Media — Pure types and resolver for media assets.
3
+ * Migrated from easyway-portal runtime-pages.ts (PBI #606).
4
+ * No DOM, no I/O — pure functions only.
5
+ * The consumer is responsible for loading the manifest (fetch/fs).
6
+ */
7
+ export type MediaAsset = {
8
+ key: string;
9
+ file: string;
10
+ alt?: string;
11
+ type?: string;
12
+ tags?: string[];
13
+ width?: number;
14
+ height?: number;
15
+ };
16
+ export type MediaManifest = {
17
+ version: string;
18
+ assets: MediaAsset[];
19
+ };
20
+ /** Resolve a media asset URL by key from an already-loaded manifest. */
21
+ export declare function resolveMediaUrl(manifest: MediaManifest, key: string): string | null;
22
+ /** Resolve a full media asset object by key from an already-loaded manifest. */
23
+ export declare function resolveMediaAsset(manifest: MediaManifest, key: string): MediaAsset | null;
24
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/core/media.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,EAAE,CAAC;CACxB,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnF;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAEzF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Media — Pure types and resolver for media assets.
3
+ * Migrated from easyway-portal runtime-pages.ts (PBI #606).
4
+ * No DOM, no I/O — pure functions only.
5
+ * The consumer is responsible for loading the manifest (fetch/fs).
6
+ */
7
+ /** Resolve a media asset URL by key from an already-loaded manifest. */
8
+ export function resolveMediaUrl(manifest, key) {
9
+ const asset = manifest.assets.find((a) => a.key === key);
10
+ return asset ? asset.file : null;
11
+ }
12
+ /** Resolve a full media asset object by key from an already-loaded manifest. */
13
+ export function resolveMediaAsset(manifest, key) {
14
+ return manifest.assets.find((a) => a.key === key) || null;
15
+ }
16
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/core/media.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,wEAAwE;AACxE,MAAM,UAAU,eAAe,CAAC,QAAuB,EAAE,GAAW;IAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,QAAuB,EAAE,GAAW;IAClE,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Page Status — Pure logic for draft/published/scheduled workflow.
3
+ * Migrated from easyway-portal runtime-pages.ts (PBI #606).
4
+ * No DOM, no I/O — pure functions only.
5
+ */
6
+ import type { ManifestPageV1 } from './types.js';
7
+ export type PageStatus = 'draft' | 'published' | 'scheduled';
8
+ export declare function getPageStatus(page: ManifestPageV1): PageStatus;
9
+ export declare function getPublishAt(page: ManifestPageV1): Date | null;
10
+ /**
11
+ * Determines if a page should be visible to end users.
12
+ * @param page - manifest page entry
13
+ * @param options.devMode - if true, all pages are visible (default: false)
14
+ */
15
+ export declare function isPageVisible(page: ManifestPageV1, options?: {
16
+ devMode?: boolean;
17
+ }): boolean;
18
+ //# sourceMappingURL=page-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-status.d.ts","sourceRoot":"","sources":["../../src/core/page-status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,CAAC;AAE7D,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,CAI9D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAI9D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAU5F"}
@@ -0,0 +1,33 @@
1
+ export function getPageStatus(page) {
2
+ if (page.status === 'draft')
3
+ return 'draft';
4
+ if (page.publishAt)
5
+ return 'scheduled';
6
+ return 'published';
7
+ }
8
+ export function getPublishAt(page) {
9
+ if (!page.publishAt)
10
+ return null;
11
+ const d = new Date(page.publishAt);
12
+ return isNaN(d.getTime()) ? null : d;
13
+ }
14
+ /**
15
+ * Determines if a page should be visible to end users.
16
+ * @param page - manifest page entry
17
+ * @param options.devMode - if true, all pages are visible (default: false)
18
+ */
19
+ export function isPageVisible(page, options) {
20
+ if (options?.devMode)
21
+ return true;
22
+ const status = getPageStatus(page);
23
+ if (status === 'draft')
24
+ return false;
25
+ if (status === 'scheduled') {
26
+ const publishAt = getPublishAt(page);
27
+ if (!publishAt)
28
+ return true; // Invalid date → treat as published
29
+ return new Date() >= publishAt;
30
+ }
31
+ return true;
32
+ }
33
+ //# sourceMappingURL=page-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-status.js","sourceRoot":"","sources":["../../src/core/page-status.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,aAAa,CAAC,IAAoB;IAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5C,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO,WAAW,CAAC;IACvC,OAAO,WAAW,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAoB;IAC7C,IAAI,CAAC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAoB,EAAE,OAA+B;IAC/E,IAAI,OAAO,EAAE,OAAO;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,CAAC,oCAAoC;QACjE,OAAO,IAAI,IAAI,EAAE,IAAI,SAAS,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Redirects — Pure logic for URL redirect matching.
3
+ * Migrated from easyway-portal runtime-pages.ts (PBI #606).
4
+ * No DOM, no I/O — pure functions only.
5
+ */
6
+ export type RedirectRule = {
7
+ from: string;
8
+ to: string;
9
+ };
10
+ export type RedirectsConfig = {
11
+ version: string;
12
+ rules: RedirectRule[];
13
+ };
14
+ /**
15
+ * Find a redirect rule matching the given pathname.
16
+ * Normalizes trailing slashes before matching.
17
+ */
18
+ export declare function findRedirect(pathname: string, rules: RedirectRule[]): string | null;
19
+ //# sourceMappingURL=redirects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirects.d.ts","sourceRoot":"","sources":["../../src/core/redirects.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AACxD,MAAM,MAAM,eAAe,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,GAAG,IAAI,CAMnF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Redirects — Pure logic for URL redirect matching.
3
+ * Migrated from easyway-portal runtime-pages.ts (PBI #606).
4
+ * No DOM, no I/O — pure functions only.
5
+ */
6
+ /**
7
+ * Find a redirect rule matching the given pathname.
8
+ * Normalizes trailing slashes before matching.
9
+ */
10
+ export function findRedirect(pathname, rules) {
11
+ const normalized = pathname.endsWith('/') && pathname !== '/'
12
+ ? pathname.slice(0, -1)
13
+ : pathname;
14
+ const match = rules.find((r) => r.from === normalized);
15
+ return match ? match.to : null;
16
+ }
17
+ //# sourceMappingURL=redirects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirects.js","sourceRoot":"","sources":["../../src/core/redirects.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAqB;IAChE,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,GAAG;QACzD,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,QAAQ,CAAC;IACf,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"rhythm.d.ts","sourceRoot":"","sources":["../../src/core/rhythm.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG1D,MAAM,MAAM,aAAa,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC7B,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,iBAAiB,CA2D/D"}
1
+ {"version":3,"file":"rhythm.d.ts","sourceRoot":"","sources":["../../src/core/rhythm.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG1D,MAAM,MAAM,aAAa,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC7B,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,iBAAiB,CA+E/D"}
@@ -50,7 +50,7 @@ export function probeRhythm(spec) {
50
50
  continue;
51
51
  const prevSurface = prev.presentation?.surface || 'default';
52
52
  const currSurface = curr.presentation?.surface || 'default';
53
- if (prevSurface === currSurface && prevSurface !== 'default') {
53
+ if (prevSurface === currSurface) {
54
54
  warnings.push({
55
55
  index: i,
56
56
  sectionType: curr.type,
@@ -59,6 +59,25 @@ export function probeRhythm(spec) {
59
59
  });
60
60
  }
61
61
  }
62
+ // Rule 4: Surface monotony — warn if >50% non-spacer sections share the same surface
63
+ const nonSpacerSections = sections.filter(s => s.type !== 'spacer');
64
+ if (nonSpacerSections.length >= 4) {
65
+ const surfaceCounts = new Map();
66
+ for (const s of nonSpacerSections) {
67
+ const surface = s.presentation?.surface || 'default';
68
+ surfaceCounts.set(surface, (surfaceCounts.get(surface) || 0) + 1);
69
+ }
70
+ for (const [surface, count] of surfaceCounts) {
71
+ if (count > nonSpacerSections.length * 0.5) {
72
+ warnings.push({
73
+ index: 0,
74
+ sectionType: nonSpacerSections[0].type,
75
+ rule: 'surface-monotony',
76
+ message: `${count} of ${nonSpacerSections.length} sections use surface "${surface}" — vary surfaces for visual rhythm.`,
77
+ });
78
+ }
79
+ }
80
+ }
62
81
  return {
63
82
  valid: warnings.length === 0,
64
83
  warnings,
@@ -1 +1 @@
1
- {"version":3,"file":"rhythm.js","sourceRoot":"","sources":["../../src/core/rhythm.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAcvD;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,IAAgB;IACxC,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAE/B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACrC,CAAC;IAED,6BAA6B;IAC7B,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC7D,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,MAAM;YACnB,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,+BAA+B,SAAS,+BAA+B;SACnF,CAAC,CAAC;IACP,CAAC;IAED,4CAA4C;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAChF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAEhF,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YAC3D,QAAQ,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,CAAC;gBACR,WAAW,EAAE,IAAI,CAAC,IAAI;gBACtB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,qBAAqB,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,SAAS,CAAC,KAAK,IAAI,CAAC,IAAI,0BAA0B,UAAU,4CAA4C;aAC5J,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,sCAAsC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QAE/D,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,IAAI,SAAS,CAAC;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,IAAI,SAAS,CAAC;QAE5D,IAAI,WAAW,KAAK,WAAW,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC3D,QAAQ,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,CAAC;gBACR,WAAW,EAAE,IAAI,CAAC,IAAI;gBACtB,IAAI,EAAE,6BAA6B;gBACnC,OAAO,EAAE,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,WAAW,yDAAyD;aACtI,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO;QACH,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC;QAC5B,QAAQ;KACX,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"rhythm.js","sourceRoot":"","sources":["../../src/core/rhythm.ts"],"names":[],"mappings":"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"}
@@ -9,11 +9,11 @@ describe('probeRhythm', () => {
9
9
  expect(result.valid).toBe(true);
10
10
  expect(result.warnings).toHaveLength(0);
11
11
  });
12
- it('returns valid for hero-first sequence', () => {
12
+ it('returns valid for hero-first sequence with varied surfaces', () => {
13
13
  const result = probeRhythm(makeSpec([
14
- { type: 'hero', titleKey: 'h' },
15
- { type: 'cards', variant: 'catalog', items: [] },
16
- { type: 'cta', titleKey: 'c' },
14
+ { type: 'hero', titleKey: 'h', presentation: { surface: 'shell-dark', rhythmProfile: 'hero' } },
15
+ { type: 'cards', variant: 'catalog', items: [], presentation: { surface: 'muted', rhythmProfile: 'feature' } },
16
+ { type: 'cta', titleKey: 'c', presentation: { surface: 'accent', rhythmProfile: 'transition' } },
17
17
  ]));
18
18
  expect(result.valid).toBe(true);
19
19
  });
@@ -48,13 +48,13 @@ describe('probeRhythm', () => {
48
48
  ]));
49
49
  expect(result.warnings).toContainEqual(expect.objectContaining({ rule: 'spacer-between-same-surface' }));
50
50
  });
51
- it('does not warn on same default surface', () => {
51
+ it('warns on same default surface without spacer', () => {
52
52
  const result = probeRhythm(makeSpec([
53
53
  { type: 'cards', variant: 'catalog', items: [] },
54
54
  { type: 'comparison', titleKey: 't', left: { titleKey: 'l', itemsKeys: [] }, right: { titleKey: 'r', itemsKeys: [] } },
55
55
  ]));
56
56
  const surfaceWarnings = result.warnings.filter(w => w.rule === 'spacer-between-same-surface');
57
- expect(surfaceWarnings).toHaveLength(0);
57
+ expect(surfaceWarnings).toHaveLength(1);
58
58
  });
59
59
  it('does not warn when spacer separates same surface', () => {
60
60
  const result = probeRhythm(makeSpec([
@@ -1 +1 @@
1
- {"version":3,"file":"rhythm.test.js","sourceRoot":"","sources":["../../src/core/rhythm.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rhythm.test.js","sourceRoot":"","sources":["../../src/core/rhythm.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"section-integrity.d.ts","sourceRoot":"","sources":["../../src/core/section-integrity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAChC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,eAAe,CA8D9E"}
1
+ {"version":3,"file":"section-integrity.d.ts","sourceRoot":"","sources":["../../src/core/section-integrity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAChC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,eAAe,CA0E9E"}
@@ -19,6 +19,11 @@ export function probeSectionIntegrity(sections) {
19
19
  const warnings = [];
20
20
  sections.forEach((section, index) => {
21
21
  switch (section.type) {
22
+ case 'hero':
23
+ if (!section.titleKey) {
24
+ warnings.push({ index, sectionType: 'hero', rule: 'hero-title-required', message: 'Hero section is missing titleKey.' });
25
+ }
26
+ break;
22
27
  case 'cards':
23
28
  if (!section.items || section.items.length === 0) {
24
29
  warnings.push({ index, sectionType: 'cards', rule: 'cards-items-required', message: 'Cards section has no items.' });
@@ -62,6 +67,11 @@ export function probeSectionIntegrity(sections) {
62
67
  warnings.push({ index, sectionType: 'action-form', rule: 'action-form-fields-required', message: 'Action-form section has no fields.' });
63
68
  }
64
69
  break;
70
+ case 'mermaid-diagram':
71
+ if (!section.mermaidCode || section.mermaidCode.trim().length === 0) {
72
+ warnings.push({ index, sectionType: 'mermaid-diagram', rule: 'mermaid-code-required', message: 'Mermaid-diagram section has no mermaidCode.' });
73
+ }
74
+ break;
65
75
  }
66
76
  });
67
77
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"section-integrity.js","sourceRoot":"","sources":["../../src/core/section-integrity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"section-integrity.js","sourceRoot":"","sources":["../../src/core/section-integrity.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,18 @@ describe('probeSectionIntegrity', () => {
4
4
  it('returns valid for empty sections', () => {
5
5
  expect(probeSectionIntegrity([]).valid).toBe(true);
6
6
  });
7
+ it('warns on hero without titleKey', () => {
8
+ const result = probeSectionIntegrity([
9
+ { type: 'hero' },
10
+ ]);
11
+ expect(result.warnings).toContainEqual(expect.objectContaining({ rule: 'hero-title-required' }));
12
+ });
13
+ it('passes for valid hero', () => {
14
+ const result = probeSectionIntegrity([
15
+ { type: 'hero', titleKey: 'h' },
16
+ ]);
17
+ expect(result.valid).toBe(true);
18
+ });
7
19
  it('passes for valid cards', () => {
8
20
  const result = probeSectionIntegrity([
9
21
  { type: 'cards', variant: 'catalog', items: [{ titleKey: 't' }] },
@@ -1 +1 @@
1
- {"version":3,"file":"section-integrity.test.js","sourceRoot":"","sources":["../../src/core/section-integrity.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"section-integrity.test.js","sourceRoot":"","sources":["../../src/core/section-integrity.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SEO — Pure types for page-level SEO metadata.
3
+ * Migrated from easyway-portal runtime-pages.ts (PBI #606).
4
+ * DOM manipulation (applyPageSeo, applySchemaOrg) stays in the portal consumer.
5
+ * Only types live here.
6
+ */
7
+ export type SeoSpec = {
8
+ metaTitle?: string;
9
+ metaDescription?: string;
10
+ ogImage?: string;
11
+ canonical?: string;
12
+ };
13
+ /**
14
+ * Build a Schema.org WebPage object from pure data.
15
+ * Returns a plain object — the consumer decides how to inject it (DOM, SSR, etc.).
16
+ */
17
+ export declare function buildWebPageSchema(options: {
18
+ title: string;
19
+ url: string;
20
+ description?: string;
21
+ image?: string;
22
+ breadcrumbName?: string;
23
+ breadcrumbBaseUrl?: string;
24
+ sectionTypes?: string[];
25
+ }): Record<string, unknown>;
26
+ //# sourceMappingURL=seo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../src/core/seo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,OAAO,GAAG;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqC1B"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * SEO — Pure types for page-level SEO metadata.
3
+ * Migrated from easyway-portal runtime-pages.ts (PBI #606).
4
+ * DOM manipulation (applyPageSeo, applySchemaOrg) stays in the portal consumer.
5
+ * Only types live here.
6
+ */
7
+ /**
8
+ * Build a Schema.org WebPage object from pure data.
9
+ * Returns a plain object — the consumer decides how to inject it (DOM, SSR, etc.).
10
+ */
11
+ export function buildWebPageSchema(options) {
12
+ const schema = {
13
+ '@context': 'https://schema.org',
14
+ '@type': 'WebPage',
15
+ 'name': options.title,
16
+ 'url': options.url,
17
+ };
18
+ if (options.description)
19
+ schema.description = options.description;
20
+ if (options.image)
21
+ schema.primaryImageOfPage = { '@type': 'ImageObject', 'url': options.image };
22
+ // Breadcrumb
23
+ if (options.breadcrumbName && options.breadcrumbBaseUrl) {
24
+ schema.breadcrumb = {
25
+ '@type': 'BreadcrumbList',
26
+ 'itemListElement': [
27
+ { '@type': 'ListItem', 'position': 1, 'name': 'Home', 'item': options.breadcrumbBaseUrl + '/' },
28
+ { '@type': 'ListItem', 'position': 2, 'name': options.breadcrumbName, 'item': options.url },
29
+ ],
30
+ };
31
+ }
32
+ // Adaptive mainEntity based on section types
33
+ if (options.sectionTypes) {
34
+ if (options.sectionTypes.includes('form')) {
35
+ schema.mainEntity = { '@type': 'ContactPoint', 'contactType': 'customer service' };
36
+ }
37
+ else if (options.sectionTypes.includes('cards')) {
38
+ schema.mainEntity = {
39
+ '@type': 'ItemList',
40
+ 'numberOfItems': options.sectionTypes.filter((t) => t === 'cards').length,
41
+ };
42
+ }
43
+ else if (options.sectionTypes.includes('advisor')) {
44
+ schema.mainEntity = { '@type': 'Service', 'name': options.title, 'serviceType': 'AI Advisory' };
45
+ }
46
+ }
47
+ return schema;
48
+ }
49
+ //# sourceMappingURL=seo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.js","sourceRoot":"","sources":["../../src/core/seo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAQlC;IACG,MAAM,MAAM,GAA4B;QACpC,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,OAAO,CAAC,KAAK;QACrB,KAAK,EAAE,OAAO,CAAC,GAAG;KACrB,CAAC;IAEF,IAAI,OAAO,CAAC,WAAW;QAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAClE,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,kBAAkB,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhG,aAAa;IACb,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QACtD,MAAM,CAAC,UAAU,GAAG;YAChB,OAAO,EAAE,gBAAgB;YACzB,iBAAiB,EAAE;gBACf,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,iBAAiB,GAAG,GAAG,EAAE;gBAC/F,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE;aAC9F;SACJ,CAAC;IACN,CAAC;IAED,6CAA6C;IAC7C,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,UAAU,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC;QACvF,CAAC;aAAM,IAAI,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,UAAU,GAAG;gBAChB,OAAO,EAAE,UAAU;gBACnB,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,MAAM;aAC5E,CAAC;QACN,CAAC;aAAM,IAAI,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,UAAU,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;QACpG,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -39,8 +39,19 @@ export type SectionPresentationSpec = {
39
39
  presetId?: string;
40
40
  transitionProfileId?: string;
41
41
  };
42
+ export type AnimationPreset = 'fade-up' | 'fade-in' | 'slide-left' | 'slide-right' | 'scale-in' | 'none';
43
+ export type AnimationDelay = 'none' | 'stagger';
44
+ export type AnimationTrigger = 'viewport' | 'immediate';
45
+ export type AnimationSpec = {
46
+ entrance?: AnimationPreset;
47
+ delay?: AnimationDelay;
48
+ trigger?: AnimationTrigger;
49
+ /** Duration in ms (default 400) */
50
+ duration?: number;
51
+ };
42
52
  export type SectionPresentationBase = {
43
53
  presentation?: SectionPresentationSpec;
54
+ animation?: AnimationSpec;
44
55
  };
45
56
  export type LayoutMapMeasureToken = 'compact' | 'reading' | 'wide' | 'full';
46
57
  export type LayoutMapVariantToken = 'default' | 'lego' | 'panel-right';
@@ -343,12 +354,20 @@ export type AdvisorSection = SectionPresentationBase & {
343
354
  responseLabels?: AdvisorResponseLabelsSpec;
344
355
  prompts: AdvisorPromptSpec[];
345
356
  };
357
+ export type MermaidDiagramSection = SectionPresentationBase & {
358
+ type: 'mermaid-diagram';
359
+ layoutMap?: LayoutMapSpec;
360
+ titleKey?: string;
361
+ descKey?: string;
362
+ mermaidCode: string;
363
+ height?: 'auto' | 'sm' | 'md' | 'lg';
364
+ };
346
365
  export type ValentinoCatalogSection = SectionPresentationBase & {
347
366
  type: 'valentino-catalog';
348
367
  titleKey: string;
349
368
  descriptionKey?: string;
350
369
  };
351
- export type SectionSpec = HeroSection | CardsSection | ComparisonSection | CtaSection | FormSection | ManifestoSection | SpacerSection | ShowcaseIntroSection | ComponentShowcaseSection | AgentDashboardSection | AgentGraphSection | AgentListSection | DataListSection | ActionFormSection | StatsSection | HowItWorksSection | AdvisorSection | ValentinoCatalogSection;
370
+ export type SectionSpec = HeroSection | CardsSection | ComparisonSection | CtaSection | FormSection | ManifestoSection | SpacerSection | ShowcaseIntroSection | ComponentShowcaseSection | AgentDashboardSection | AgentGraphSection | AgentListSection | DataListSection | ActionFormSection | StatsSection | HowItWorksSection | AdvisorSection | MermaidDiagramSection | ValentinoCatalogSection;
352
371
  export type PageProfileSpec = 'home-signature' | 'product-surface' | 'advisor-surface' | 'conversion-form' | 'reading-manifesto' | 'use-case-hub';
353
372
  export type PageSpecV1 = {
354
373
  version: '1';
@@ -363,6 +382,8 @@ export type PageSpecV1 = {
363
382
  chrome?: {
364
383
  floatingDock?: boolean;
365
384
  };
385
+ /** Page-level SEO metadata (PBI #598) */
386
+ seo?: import('./seo.js').SeoSpec;
366
387
  sections: SectionSpec[];
367
388
  };
368
389
  export type ValentinoGovernanceTier = 'standard' | 'custom-governed';
@@ -403,6 +424,12 @@ export type ManifestPageV1 = {
403
424
  labelKey: string;
404
425
  order: number;
405
426
  };
427
+ /** Page lifecycle status (CMS workflow, PBI #595) */
428
+ status?: 'draft' | 'published';
429
+ /** ISO 8601 timestamp for scheduled publishing (PBI #596) */
430
+ publishAt?: string;
431
+ /** Page-level SEO metadata (PBI #598) */
432
+ seo?: import('./seo.js').SeoSpec;
406
433
  };
407
434
  export type NavInteractionModeV1 = 'hover' | 'click';
408
435
  export type NavPanelVariantV1 = 'dropdown' | 'mega';
@@ -450,6 +477,8 @@ export type NavigationConfigV1 = {
450
477
  export type PagesManifestV1 = {
451
478
  version: '1';
452
479
  defaultLanguage?: string;
480
+ /** When true, all pages show maintenance screen in production (PBI #603) */
481
+ maintenanceMode?: boolean;
453
482
  navigation?: NavigationConfigV1;
454
483
  pages: ManifestPageV1[];
455
484
  };