@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.
- package/CHANGELOG.md +42 -0
- package/dist/bin/commands/init.d.ts +3 -0
- package/dist/bin/commands/init.d.ts.map +1 -0
- package/dist/bin/commands/init.js +428 -0
- package/dist/bin/commands/init.js.map +1 -0
- package/dist/bin/commands/llms.d.ts +2 -0
- package/dist/bin/commands/llms.d.ts.map +1 -0
- package/dist/bin/commands/llms.js +84 -0
- package/dist/bin/commands/llms.js.map +1 -0
- package/dist/bin/commands/validate.d.ts.map +1 -1
- package/dist/bin/commands/validate.js +152 -11
- package/dist/bin/commands/validate.js.map +1 -1
- package/dist/bin/valentino.js +10 -0
- package/dist/bin/valentino.js.map +1 -1
- package/dist/core/animation.d.ts +18 -0
- package/dist/core/animation.d.ts.map +1 -0
- package/dist/core/animation.js +91 -0
- package/dist/core/animation.js.map +1 -0
- package/dist/core/encoding.d.ts +32 -0
- package/dist/core/encoding.d.ts.map +1 -0
- package/dist/core/encoding.js +112 -0
- package/dist/core/encoding.js.map +1 -0
- package/dist/core/extension-registry.d.ts +64 -0
- package/dist/core/extension-registry.d.ts.map +1 -0
- package/dist/core/extension-registry.js +62 -0
- package/dist/core/extension-registry.js.map +1 -0
- package/dist/core/guardrails-cms.d.ts +70 -0
- package/dist/core/guardrails-cms.d.ts.map +1 -0
- package/dist/core/guardrails-cms.js +299 -0
- package/dist/core/guardrails-cms.js.map +1 -0
- package/dist/core/hero-contract.js +2 -2
- package/dist/core/hero-contract.js.map +1 -1
- package/dist/core/hero-contract.test.js +9 -2
- package/dist/core/hero-contract.test.js.map +1 -1
- package/dist/core/llms-generator.d.ts +36 -0
- package/dist/core/llms-generator.d.ts.map +1 -0
- package/dist/core/llms-generator.js +95 -0
- package/dist/core/llms-generator.js.map +1 -0
- package/dist/core/media.d.ts +24 -0
- package/dist/core/media.d.ts.map +1 -0
- package/dist/core/media.js +16 -0
- package/dist/core/media.js.map +1 -0
- package/dist/core/page-status.d.ts +18 -0
- package/dist/core/page-status.d.ts.map +1 -0
- package/dist/core/page-status.js +33 -0
- package/dist/core/page-status.js.map +1 -0
- package/dist/core/redirects.d.ts +19 -0
- package/dist/core/redirects.d.ts.map +1 -0
- package/dist/core/redirects.js +17 -0
- package/dist/core/redirects.js.map +1 -0
- package/dist/core/rhythm.d.ts.map +1 -1
- package/dist/core/rhythm.js +20 -1
- package/dist/core/rhythm.js.map +1 -1
- package/dist/core/rhythm.test.js +6 -6
- package/dist/core/rhythm.test.js.map +1 -1
- package/dist/core/section-integrity.d.ts.map +1 -1
- package/dist/core/section-integrity.js +10 -0
- package/dist/core/section-integrity.js.map +1 -1
- package/dist/core/section-integrity.test.js +12 -0
- package/dist/core/section-integrity.test.js.map +1 -1
- package/dist/core/seo.d.ts +26 -0
- package/dist/core/seo.d.ts.map +1 -0
- package/dist/core/seo.js +49 -0
- package/dist/core/seo.js.map +1 -0
- package/dist/core/types.d.ts +30 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +20 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- 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,
|
|
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"}
|
package/dist/core/rhythm.js
CHANGED
|
@@ -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
|
|
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,
|
package/dist/core/rhythm.js.map
CHANGED
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"rhythm.js","sourceRoot":"","sources":["../../src/core/rhythm.ts"],"names":[],"mappings":"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"}
|
package/dist/core/rhythm.test.js
CHANGED
|
@@ -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('
|
|
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(
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,SAAS,QAAQ,CAAC,QAAe;IAC7B,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,
|
|
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,
|
|
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"}
|
package/dist/core/seo.js
ADDED
|
@@ -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"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -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
|
};
|