@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
|
@@ -1,19 +1,160 @@
|
|
|
1
|
-
import { readFileSync } from 'fs';
|
|
1
|
+
import { readFileSync, existsSync } from 'fs';
|
|
2
|
+
import { resolve, dirname } from 'path';
|
|
2
3
|
import { validatePageSpec } from '../../core/page-spec.js';
|
|
4
|
+
import { collectPureCmsWarnings } from '../../core/guardrails-cms.js';
|
|
5
|
+
function findProjectRoot(startDir) {
|
|
6
|
+
let dir = resolve(startDir);
|
|
7
|
+
for (let i = 0; i < 10; i++) {
|
|
8
|
+
if (existsSync(resolve(dir, 'valentino.config.json')))
|
|
9
|
+
return dir;
|
|
10
|
+
if (existsSync(resolve(dir, 'valentino.guardrails.json')))
|
|
11
|
+
return dir;
|
|
12
|
+
const parent = dirname(dir);
|
|
13
|
+
if (parent === dir)
|
|
14
|
+
break;
|
|
15
|
+
dir = parent;
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
function loadGuardrailsProfile(projectRoot) {
|
|
20
|
+
const filePath = resolve(projectRoot, 'valentino.guardrails.json');
|
|
21
|
+
if (!existsSync(filePath))
|
|
22
|
+
return null;
|
|
23
|
+
try {
|
|
24
|
+
return JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function loadJSON(filePath) {
|
|
31
|
+
if (!existsSync(filePath))
|
|
32
|
+
return null;
|
|
33
|
+
try {
|
|
34
|
+
return JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function filterByProfile(warnings, profile) {
|
|
41
|
+
return warnings.filter((w) => {
|
|
42
|
+
// Map warning type to guardrail key
|
|
43
|
+
const key = mapWarningTypeToKey(w.type);
|
|
44
|
+
const override = profile.guardrails[key];
|
|
45
|
+
if (!override)
|
|
46
|
+
return true; // No override → keep as-is
|
|
47
|
+
if (override.severity === 'off')
|
|
48
|
+
return false; // Disabled
|
|
49
|
+
// Upgrade/downgrade severity
|
|
50
|
+
if (override.severity === 'error')
|
|
51
|
+
w.severity = 'error';
|
|
52
|
+
if (override.severity === 'warning')
|
|
53
|
+
w.severity = 'warning';
|
|
54
|
+
return true;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function mapWarningTypeToKey(type) {
|
|
58
|
+
const map = {
|
|
59
|
+
'cms-draft-orphan': 'draft-orphan',
|
|
60
|
+
'cms-publishat-invalid': 'publishAt',
|
|
61
|
+
'cms-publishat-past': 'publishAt',
|
|
62
|
+
'cms-maintenance-mode-active': 'maintenance',
|
|
63
|
+
'cms-no-404-page': '404',
|
|
64
|
+
'cms-redirect-target-missing': 'redirect',
|
|
65
|
+
'cms-redirect-chain': 'redirect',
|
|
66
|
+
'cms-seo-missing': 'seo',
|
|
67
|
+
'cms-language-coverage': 'i18n',
|
|
68
|
+
'cms-media-orphan': 'media',
|
|
69
|
+
'cms-media-missing-alt': 'media',
|
|
70
|
+
'cms-media-oversize': 'media',
|
|
71
|
+
'cms-media-format-legacy': 'media',
|
|
72
|
+
};
|
|
73
|
+
return map[type] || type;
|
|
74
|
+
}
|
|
3
75
|
export function runValidate(args) {
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
76
|
+
const files = args.filter((a) => !a.startsWith('-'));
|
|
77
|
+
const cmsMode = args.includes('--cms') || args.includes('--all');
|
|
78
|
+
const quietMode = args.includes('--quiet');
|
|
79
|
+
if (!files.length) {
|
|
80
|
+
console.error('Usage: valentino validate <spec.json> [spec2.json ...] [--cms] [--all] [--quiet]');
|
|
7
81
|
process.exit(1);
|
|
8
82
|
}
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
83
|
+
// Find project root and guardrails profile
|
|
84
|
+
const projectRoot = findProjectRoot(process.cwd()) || findProjectRoot(dirname(resolve(files[0])));
|
|
85
|
+
const profile = projectRoot ? loadGuardrailsProfile(projectRoot) : null;
|
|
86
|
+
let hasErrors = false;
|
|
87
|
+
let totalWarnings = 0;
|
|
88
|
+
let totalErrors = 0;
|
|
89
|
+
// 1. Validate each page spec
|
|
90
|
+
for (const file of files) {
|
|
91
|
+
const json = loadJSON(resolve(file));
|
|
92
|
+
if (!json) {
|
|
93
|
+
console.error(` ❌ Cannot read: ${file}`);
|
|
94
|
+
hasErrors = true;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const valid = validatePageSpec(json);
|
|
98
|
+
if (!valid) {
|
|
99
|
+
console.error(` ❌ Invalid PageSpec: ${file}`);
|
|
100
|
+
hasErrors = true;
|
|
101
|
+
}
|
|
102
|
+
else if (!quietMode) {
|
|
103
|
+
console.log(` ✅ ${file}`);
|
|
104
|
+
}
|
|
13
105
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
106
|
+
// 2. CMS guardrails (if --cms/--all or if guardrails profile exists)
|
|
107
|
+
if (cmsMode || profile) {
|
|
108
|
+
const manifestPath = projectRoot
|
|
109
|
+
? resolve(projectRoot, 'public/pages/pages.manifest.json')
|
|
110
|
+
: null;
|
|
111
|
+
if (manifestPath && existsSync(manifestPath)) {
|
|
112
|
+
const manifest = loadJSON(manifestPath);
|
|
113
|
+
if (manifest) {
|
|
114
|
+
// Load redirects
|
|
115
|
+
const redirectsPath = resolve(dirname(manifestPath), '..', 'redirects.json');
|
|
116
|
+
const redirectsData = loadJSON(redirectsPath);
|
|
117
|
+
// Load specs for SEO check
|
|
118
|
+
const specsById = new Map();
|
|
119
|
+
for (const page of manifest.pages) {
|
|
120
|
+
const specPath = resolve(dirname(manifestPath), '..', page.spec.replace(/^\//, ''));
|
|
121
|
+
const spec = loadJSON(specPath);
|
|
122
|
+
if (spec)
|
|
123
|
+
specsById.set(page.id, spec);
|
|
124
|
+
}
|
|
125
|
+
let warnings = collectPureCmsWarnings(manifest, {
|
|
126
|
+
redirectRules: redirectsData?.rules,
|
|
127
|
+
specsById,
|
|
128
|
+
});
|
|
129
|
+
// Apply guardrails profile
|
|
130
|
+
if (profile) {
|
|
131
|
+
warnings = filterByProfile(warnings, profile);
|
|
132
|
+
}
|
|
133
|
+
for (const w of warnings) {
|
|
134
|
+
if (w.severity === 'error') {
|
|
135
|
+
console.error(` ❌ [${w.type}] ${w.message}`);
|
|
136
|
+
totalErrors++;
|
|
137
|
+
hasErrors = true;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
console.log(` ⚠ [${w.type}] ${w.message}`);
|
|
141
|
+
totalWarnings++;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Summary
|
|
148
|
+
if (!quietMode) {
|
|
149
|
+
const profileLabel = profile ? ` (profile: ${profile.template})` : '';
|
|
150
|
+
if (totalErrors > 0 || totalWarnings > 0) {
|
|
151
|
+
console.log(`\n ${totalErrors} error(s), ${totalWarnings} warning(s)${profileLabel}`);
|
|
152
|
+
}
|
|
153
|
+
else if (cmsMode || profile) {
|
|
154
|
+
console.log(`\n All checks passed${profileLabel}`);
|
|
155
|
+
}
|
|
17
156
|
}
|
|
157
|
+
if (hasErrors)
|
|
158
|
+
process.exit(1);
|
|
18
159
|
}
|
|
19
160
|
//# sourceMappingURL=validate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/bin/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/bin/commands/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/valentino.js
CHANGED
|
@@ -10,8 +10,13 @@ import { runProbe } from './commands/probe.js';
|
|
|
10
10
|
import { runCatalogResolve } from './commands/catalog.js';
|
|
11
11
|
import { runManifestResolve } from './commands/manifest.js';
|
|
12
12
|
import { runContrast } from './commands/contrast.js';
|
|
13
|
+
import { runInit } from './commands/init.js';
|
|
14
|
+
import { runLlms } from './commands/llms.js';
|
|
13
15
|
const [, , command, ...args] = process.argv;
|
|
14
16
|
switch (command) {
|
|
17
|
+
case 'init':
|
|
18
|
+
runInit(args);
|
|
19
|
+
break;
|
|
15
20
|
case 'audit':
|
|
16
21
|
runAudit(args);
|
|
17
22
|
break;
|
|
@@ -43,11 +48,15 @@ switch (command) {
|
|
|
43
48
|
case 'contrast':
|
|
44
49
|
runContrast(args);
|
|
45
50
|
break;
|
|
51
|
+
case 'llms':
|
|
52
|
+
runLlms(args);
|
|
53
|
+
break;
|
|
46
54
|
default:
|
|
47
55
|
console.log(`
|
|
48
56
|
🎨 Valentino Engine v0.1.0 — Antifragile Open Source UI Design Engine
|
|
49
57
|
|
|
50
58
|
Usage:
|
|
59
|
+
valentino init [name] [--template id] [--lang code] [--git url] Create a new project
|
|
51
60
|
valentino audit <file.css> Audit CSS for guardrail violations
|
|
52
61
|
valentino validate <spec.json> Validate a Runtime PageSpec JSON (V1)
|
|
53
62
|
valentino guardrails List all 10 Sovereign Guardrails
|
|
@@ -55,6 +64,7 @@ Usage:
|
|
|
55
64
|
valentino contrast <foreground> <background> [AA|AAA] Check WCAG contrast ratio
|
|
56
65
|
valentino catalog resolve <spec.json> --catalog <catalog.json> Resolve spec with catalog
|
|
57
66
|
valentino manifest resolve <manifest.json> --route /path Resolve route to page ID
|
|
67
|
+
valentino llms <manifest.json> [--content c.json] [--site N] Generate llms.txt + llms-full.txt
|
|
58
68
|
|
|
59
69
|
Epic: https://dev.azure.com/EasyWayData/EasyWay-DataPortal/_workitems/edit/480
|
|
60
70
|
`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"valentino.js","sourceRoot":"","sources":["../../src/bin/valentino.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"valentino.js","sourceRoot":"","sources":["../../src/bin/valentino.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,EAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;AAE3C,QAAQ,OAAO,EAAE,CAAC;IACd,KAAK,MAAM;QACP,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,MAAM;IAEV,KAAK,OAAO;QACR,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,MAAM;IAEV,KAAK,UAAU;QACX,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM;IAEV,KAAK,YAAY;QACb,aAAa,EAAE,CAAC;QAChB,MAAM;IAEV,KAAK,OAAO;QACR,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM;IAEV,KAAK,SAAS;QACV,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aACvD,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;YACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,MAAM;IAEV,KAAK,UAAU;QACX,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aACxD,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,MAAM;IAEV,KAAK,UAAU;QACX,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM;IAEV,KAAK,MAAM;QACP,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,MAAM;IAEV;QACI,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;CAenB,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Animation Presets — Validation and CSS generation for declarative section animations.
|
|
3
|
+
* No DOM — pure functions only. The consumer applies CSS/IntersectionObserver.
|
|
4
|
+
* PBI #611.
|
|
5
|
+
*/
|
|
6
|
+
import type { AnimationPreset, AnimationSpec, SectionSpec } from './types.js';
|
|
7
|
+
export type AnimationWarning = {
|
|
8
|
+
type: string;
|
|
9
|
+
section: number;
|
|
10
|
+
message: string;
|
|
11
|
+
};
|
|
12
|
+
/** Validate animation specs across all sections of a page. */
|
|
13
|
+
export declare function probeAnimations(sections: SectionSpec[]): AnimationWarning[];
|
|
14
|
+
/** Resolve animation to CSS custom properties for a section. */
|
|
15
|
+
export declare function resolveAnimationCSS(anim: AnimationSpec): Record<string, string>;
|
|
16
|
+
/** List of all valid animation presets. */
|
|
17
|
+
export declare const ANIMATION_PRESETS: readonly AnimationPreset[];
|
|
18
|
+
//# sourceMappingURL=animation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation.d.ts","sourceRoot":"","sources":["../../src/core/animation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9E,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAMF,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,gBAAgB,EAAE,CAsD3E;AAED,gEAAgE;AAChE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoC/E;AAED,2CAA2C;AAC3C,eAAO,MAAM,iBAAiB,EAAE,SAAS,eAAe,EAA4E,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
const VALID_PRESETS = new Set(['fade-up', 'fade-in', 'slide-left', 'slide-right', 'scale-in', 'none']);
|
|
2
|
+
const VALID_DELAYS = new Set(['none', 'stagger']);
|
|
3
|
+
const VALID_TRIGGERS = new Set(['viewport', 'immediate']);
|
|
4
|
+
/** Validate animation specs across all sections of a page. */
|
|
5
|
+
export function probeAnimations(sections) {
|
|
6
|
+
const warnings = [];
|
|
7
|
+
for (let i = 0; i < sections.length; i++) {
|
|
8
|
+
const section = sections[i];
|
|
9
|
+
const anim = section.animation;
|
|
10
|
+
if (!anim)
|
|
11
|
+
continue;
|
|
12
|
+
if (anim.entrance && !VALID_PRESETS.has(anim.entrance)) {
|
|
13
|
+
warnings.push({
|
|
14
|
+
type: 'animation-invalid-preset',
|
|
15
|
+
section: i,
|
|
16
|
+
message: `Section ${i} (${section.type}): unknown animation preset "${anim.entrance}". Valid: ${[...VALID_PRESETS].join(', ')}`,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
if (anim.delay && !VALID_DELAYS.has(anim.delay)) {
|
|
20
|
+
warnings.push({
|
|
21
|
+
type: 'animation-invalid-delay',
|
|
22
|
+
section: i,
|
|
23
|
+
message: `Section ${i} (${section.type}): unknown delay "${anim.delay}". Valid: ${[...VALID_DELAYS].join(', ')}`,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
if (anim.trigger && !VALID_TRIGGERS.has(anim.trigger)) {
|
|
27
|
+
warnings.push({
|
|
28
|
+
type: 'animation-invalid-trigger',
|
|
29
|
+
section: i,
|
|
30
|
+
message: `Section ${i} (${section.type}): unknown trigger "${anim.trigger}". Valid: ${[...VALID_TRIGGERS].join(', ')}`,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (anim.duration !== undefined && (anim.duration < 0 || anim.duration > 5000)) {
|
|
34
|
+
warnings.push({
|
|
35
|
+
type: 'animation-duration-out-of-range',
|
|
36
|
+
section: i,
|
|
37
|
+
message: `Section ${i} (${section.type}): duration ${anim.duration}ms is out of range (0-5000)`,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
// Stagger on non-list sections is a no-op warning
|
|
41
|
+
if (anim.delay === 'stagger') {
|
|
42
|
+
const listTypes = new Set(['cards', 'stats', 'how-it-works', 'data-list', 'component-showcase']);
|
|
43
|
+
if (!listTypes.has(section.type)) {
|
|
44
|
+
warnings.push({
|
|
45
|
+
type: 'animation-stagger-no-effect',
|
|
46
|
+
section: i,
|
|
47
|
+
message: `Section ${i} (${section.type}): "stagger" delay has no effect on non-list sections`,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return warnings;
|
|
53
|
+
}
|
|
54
|
+
/** Resolve animation to CSS custom properties for a section. */
|
|
55
|
+
export function resolveAnimationCSS(anim) {
|
|
56
|
+
const preset = anim.entrance || 'none';
|
|
57
|
+
const duration = anim.duration || 400;
|
|
58
|
+
const delay = anim.delay || 'none';
|
|
59
|
+
if (preset === 'none')
|
|
60
|
+
return {};
|
|
61
|
+
const css = {
|
|
62
|
+
'--v-anim-duration': `${duration}ms`,
|
|
63
|
+
'--v-anim-delay-mode': delay,
|
|
64
|
+
};
|
|
65
|
+
switch (preset) {
|
|
66
|
+
case 'fade-up':
|
|
67
|
+
css['--v-anim-opacity'] = '0';
|
|
68
|
+
css['--v-anim-transform'] = 'translateY(20px)';
|
|
69
|
+
break;
|
|
70
|
+
case 'fade-in':
|
|
71
|
+
css['--v-anim-opacity'] = '0';
|
|
72
|
+
css['--v-anim-transform'] = 'none';
|
|
73
|
+
break;
|
|
74
|
+
case 'slide-left':
|
|
75
|
+
css['--v-anim-opacity'] = '0';
|
|
76
|
+
css['--v-anim-transform'] = 'translateX(40px)';
|
|
77
|
+
break;
|
|
78
|
+
case 'slide-right':
|
|
79
|
+
css['--v-anim-opacity'] = '0';
|
|
80
|
+
css['--v-anim-transform'] = 'translateX(-40px)';
|
|
81
|
+
break;
|
|
82
|
+
case 'scale-in':
|
|
83
|
+
css['--v-anim-opacity'] = '0';
|
|
84
|
+
css['--v-anim-transform'] = 'scale(0.95)';
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
return css;
|
|
88
|
+
}
|
|
89
|
+
/** List of all valid animation presets. */
|
|
90
|
+
export const ANIMATION_PRESETS = ['fade-up', 'fade-in', 'slide-left', 'slide-right', 'scale-in', 'none'];
|
|
91
|
+
//# sourceMappingURL=animation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation.js","sourceRoot":"","sources":["../../src/core/animation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encoding Guardrail — Mojibake detection and typographic validation.
|
|
3
|
+
* Pure functions: takes content strings, returns warnings.
|
|
4
|
+
* No I/O — consumer loads the content files.
|
|
5
|
+
* PBI #629.
|
|
6
|
+
*/
|
|
7
|
+
export type EncodingWarning = {
|
|
8
|
+
type: 'mojibake' | 'typography';
|
|
9
|
+
severity: 'error' | 'warning';
|
|
10
|
+
file: string;
|
|
11
|
+
key: string;
|
|
12
|
+
message: string;
|
|
13
|
+
match: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Detect mojibake in content strings.
|
|
17
|
+
* Returns errors for each mojibake pattern found.
|
|
18
|
+
*/
|
|
19
|
+
export declare function checkMojibake(contentByFile: Map<string, Map<string, string>>): EncodingWarning[];
|
|
20
|
+
/**
|
|
21
|
+
* Check typographic issues in content strings.
|
|
22
|
+
* Filters rules by language ('*' matches all).
|
|
23
|
+
*/
|
|
24
|
+
export declare function checkTypography(contentByFile: Map<string, Map<string, string>>, lang?: string): EncodingWarning[];
|
|
25
|
+
/**
|
|
26
|
+
* Run all encoding checks (mojibake + typography).
|
|
27
|
+
*/
|
|
28
|
+
export declare function checkEncoding(contentByFile: Map<string, Map<string, string>>, lang?: string): EncodingWarning[];
|
|
29
|
+
/** Exported constants for consumer use. */
|
|
30
|
+
export declare const MOJIBAKE_PATTERN_COUNT: number;
|
|
31
|
+
export declare const TYPO_RULE_COUNT: number;
|
|
32
|
+
//# sourceMappingURL=encoding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/core/encoding.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,eAAe,GAAG;IAC1B,IAAI,EAAE,UAAU,GAAG,YAAY,CAAC;IAChC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAmDF;;;GAGG;AACH,wBAAgB,aAAa,CACzB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAChD,eAAe,EAAE,CAwBnB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC3B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC/C,IAAI,CAAC,EAAE,MAAM,GACd,eAAe,EAAE,CA0BnB;AAED;;GAEG;AACH,wBAAgB,aAAa,CACzB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC/C,IAAI,CAAC,EAAE,MAAM,GACd,eAAe,EAAE,CAKnB;AAED,2CAA2C;AAC3C,eAAO,MAAM,sBAAsB,QAA2B,CAAC;AAC/D,eAAO,MAAM,eAAe,QAAoB,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encoding Guardrail — Mojibake detection and typographic validation.
|
|
3
|
+
* Pure functions: takes content strings, returns warnings.
|
|
4
|
+
* No I/O — consumer loads the content files.
|
|
5
|
+
* PBI #629.
|
|
6
|
+
*/
|
|
7
|
+
const MOJIBAKE_PATTERNS = [
|
|
8
|
+
{ pattern: /è/g, label: 'è (Latin-1→UTF-8)', fix: 'è' },
|
|
9
|
+
{ pattern: /é/g, label: 'é (Latin-1→UTF-8)', fix: 'é' },
|
|
10
|
+
{ pattern: /Ã /g, label: 'à (Latin-1→UTF-8)', fix: 'à' },
|
|
11
|
+
{ pattern: /ù/g, label: 'ù (Latin-1→UTF-8)', fix: 'ù' },
|
|
12
|
+
{ pattern: /ò/g, label: 'ò (Latin-1→UTF-8)', fix: 'ò' },
|
|
13
|
+
{ pattern: /ì/g, label: 'ì (Latin-1→UTF-8)', fix: 'ì' },
|
|
14
|
+
{ pattern: /ö/g, label: 'ö (Latin-1→UTF-8)', fix: 'ö' },
|
|
15
|
+
{ pattern: /ü/g, label: 'ü (Latin-1→UTF-8)', fix: 'ü' },
|
|
16
|
+
{ pattern: /ä/g, label: 'ä (Latin-1→UTF-8)', fix: 'ä' },
|
|
17
|
+
{ pattern: /ñ/g, label: 'ñ (Latin-1→UTF-8)', fix: 'ñ' },
|
|
18
|
+
{ pattern: /ç/g, label: 'ç (Latin-1→UTF-8)', fix: 'ç' },
|
|
19
|
+
{ pattern: /’/g, label: 'right single quote (Win-1252)', fix: '\u2019' },
|
|
20
|
+
{ pattern: /“/g, label: 'left double quote (Win-1252)', fix: '\u201C' },
|
|
21
|
+
{ pattern: /â€\u009D/g, label: 'right double quote (Win-1252)', fix: '\u201D' },
|
|
22
|
+
];
|
|
23
|
+
const TYPO_RULES = [
|
|
24
|
+
// Italian
|
|
25
|
+
{ pattern: /\bE'\s/g, lang: 'it', label: "E' instead of È", suggestion: 'Use È (capital E with accent)' },
|
|
26
|
+
{ pattern: /\bperche'\b/gi, lang: 'it', label: "perche' instead of perché", suggestion: 'Use perché' },
|
|
27
|
+
{ pattern: /\bperche\b(?!')/gi, lang: 'it', label: "perche without accent", suggestion: 'Use perché' },
|
|
28
|
+
{ pattern: /\bpiu'\b/gi, lang: 'it', label: "piu' instead of più", suggestion: 'Use più' },
|
|
29
|
+
{ pattern: /\bcioe'\b/gi, lang: 'it', label: "cioe' instead of cioè", suggestion: 'Use cioè' },
|
|
30
|
+
{ pattern: /\bpuo'\b/gi, lang: 'it', label: "puo' instead of può", suggestion: 'Use può' },
|
|
31
|
+
{ pattern: /\bgiacche'\b/gi, lang: 'it', label: "giacche' instead of giacché", suggestion: 'Use giacché' },
|
|
32
|
+
// General typography
|
|
33
|
+
{ pattern: /\.\.\./g, lang: '*', label: 'ASCII ellipsis', suggestion: 'Use … (U+2026)' },
|
|
34
|
+
{ pattern: /--/g, lang: '*', label: 'double hyphen', suggestion: 'Use — (em dash) or – (en dash)' },
|
|
35
|
+
{ pattern: /\s'/g, lang: '*', label: "space before apostrophe", suggestion: 'Remove space before apostrophe' },
|
|
36
|
+
{ pattern: /"([^"]*)"/g, lang: '*', label: 'straight double quotes', suggestion: 'Use \u201C\u201D (curly quotes)' },
|
|
37
|
+
// French
|
|
38
|
+
{ pattern: /\b(\w+)\s*\?/g, lang: 'fr', label: 'missing space before ?', suggestion: 'French requires a space before ?' },
|
|
39
|
+
{ pattern: /\b(\w+)\s*!/g, lang: 'fr', label: 'missing space before !', suggestion: 'French requires a space before !' },
|
|
40
|
+
// German
|
|
41
|
+
{ pattern: /\bfuer\b/gi, lang: 'de', label: 'fuer instead of für', suggestion: 'Use für' },
|
|
42
|
+
{ pattern: /\bueber\b/gi, lang: 'de', label: 'ueber instead of über', suggestion: 'Use über' },
|
|
43
|
+
// Spanish
|
|
44
|
+
{ pattern: /\banio\b/gi, lang: 'es', label: 'anio instead of año', suggestion: 'Use año' },
|
|
45
|
+
];
|
|
46
|
+
/**
|
|
47
|
+
* Detect mojibake in content strings.
|
|
48
|
+
* Returns errors for each mojibake pattern found.
|
|
49
|
+
*/
|
|
50
|
+
export function checkMojibake(contentByFile) {
|
|
51
|
+
const warnings = [];
|
|
52
|
+
for (const [file, entries] of contentByFile) {
|
|
53
|
+
for (const [key, value] of entries) {
|
|
54
|
+
for (const { pattern, label } of MOJIBAKE_PATTERNS) {
|
|
55
|
+
// Reset lastIndex for global patterns
|
|
56
|
+
pattern.lastIndex = 0;
|
|
57
|
+
const match = pattern.exec(value);
|
|
58
|
+
if (match) {
|
|
59
|
+
warnings.push({
|
|
60
|
+
type: 'mojibake',
|
|
61
|
+
severity: 'error',
|
|
62
|
+
file,
|
|
63
|
+
key,
|
|
64
|
+
message: `Mojibake detected: ${label}`,
|
|
65
|
+
match: match[0],
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return warnings;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check typographic issues in content strings.
|
|
75
|
+
* Filters rules by language ('*' matches all).
|
|
76
|
+
*/
|
|
77
|
+
export function checkTypography(contentByFile, lang) {
|
|
78
|
+
const warnings = [];
|
|
79
|
+
const applicableRules = TYPO_RULES.filter((r) => r.lang === '*' || (lang && r.lang === lang));
|
|
80
|
+
for (const [file, entries] of contentByFile) {
|
|
81
|
+
for (const [key, value] of entries) {
|
|
82
|
+
for (const rule of applicableRules) {
|
|
83
|
+
rule.pattern.lastIndex = 0;
|
|
84
|
+
const match = rule.pattern.exec(value);
|
|
85
|
+
if (match) {
|
|
86
|
+
warnings.push({
|
|
87
|
+
type: 'typography',
|
|
88
|
+
severity: 'warning',
|
|
89
|
+
file,
|
|
90
|
+
key,
|
|
91
|
+
message: `${rule.label} — ${rule.suggestion}`,
|
|
92
|
+
match: match[0],
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return warnings;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Run all encoding checks (mojibake + typography).
|
|
102
|
+
*/
|
|
103
|
+
export function checkEncoding(contentByFile, lang) {
|
|
104
|
+
return [
|
|
105
|
+
...checkMojibake(contentByFile),
|
|
106
|
+
...checkTypography(contentByFile, lang),
|
|
107
|
+
];
|
|
108
|
+
}
|
|
109
|
+
/** Exported constants for consumer use. */
|
|
110
|
+
export const MOJIBAKE_PATTERN_COUNT = MOJIBAKE_PATTERNS.length;
|
|
111
|
+
export const TYPO_RULE_COUNT = TYPO_RULES.length;
|
|
112
|
+
//# sourceMappingURL=encoding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/core/encoding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension Registry — Plugin system for valentino-engine consumers.
|
|
3
|
+
* Allows custom section types, guardrails, status values, content/media resolvers,
|
|
4
|
+
* and editor panels to be registered by the consumer without modifying the engine.
|
|
5
|
+
*
|
|
6
|
+
* PBI #606 — Extension points for valentino-engine as standalone product.
|
|
7
|
+
*/
|
|
8
|
+
import type { SectionSpec } from './types.js';
|
|
9
|
+
import type { CmsWarning } from './guardrails-cms.js';
|
|
10
|
+
/** Custom section renderer — consumer provides how to render unknown section types. */
|
|
11
|
+
export type CustomSectionRenderer = (section: SectionSpec, container: unknown) => void;
|
|
12
|
+
/** Custom guardrail — consumer provides additional validation rules. */
|
|
13
|
+
export type CustomGuardrail = (context: GuardrailContext) => CmsWarning[];
|
|
14
|
+
export type GuardrailContext = {
|
|
15
|
+
manifest: unknown;
|
|
16
|
+
specs?: Map<string, unknown>;
|
|
17
|
+
redirectRules?: unknown[];
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
};
|
|
20
|
+
/** Custom content resolver — consumer provides how to load content by key. */
|
|
21
|
+
export type ContentResolver = (key: string, lang?: string) => string | undefined;
|
|
22
|
+
/** Custom media resolver — consumer provides how to resolve media by key. */
|
|
23
|
+
export type MediaResolver = (key: string) => {
|
|
24
|
+
url: string;
|
|
25
|
+
alt?: string;
|
|
26
|
+
} | null;
|
|
27
|
+
/** Custom editor panel definition. */
|
|
28
|
+
export type EditorPanelDef = {
|
|
29
|
+
id: string;
|
|
30
|
+
label: string;
|
|
31
|
+
sectionTypes: string[];
|
|
32
|
+
render: (section: SectionSpec, container: unknown) => void;
|
|
33
|
+
};
|
|
34
|
+
export type ExtensionRegistry = {
|
|
35
|
+
sectionRenderers: Map<string, CustomSectionRenderer>;
|
|
36
|
+
guardrails: Map<string, CustomGuardrail>;
|
|
37
|
+
customStatuses: Set<string>;
|
|
38
|
+
contentResolver: ContentResolver | null;
|
|
39
|
+
mediaResolver: MediaResolver | null;
|
|
40
|
+
editorPanels: Map<string, EditorPanelDef>;
|
|
41
|
+
};
|
|
42
|
+
/** Create a fresh, empty registry. */
|
|
43
|
+
export declare function createExtensionRegistry(): ExtensionRegistry;
|
|
44
|
+
/** Register a custom section renderer for a given section type. */
|
|
45
|
+
export declare function registerSectionRenderer(registry: ExtensionRegistry, sectionType: string, renderer: CustomSectionRenderer): void;
|
|
46
|
+
/** Register a custom guardrail rule. */
|
|
47
|
+
export declare function registerGuardrail(registry: ExtensionRegistry, name: string, guardrail: CustomGuardrail): void;
|
|
48
|
+
/** Register a custom page status value beyond draft/published/scheduled. */
|
|
49
|
+
export declare function registerCustomStatus(registry: ExtensionRegistry, status: string): void;
|
|
50
|
+
/** Set the content resolver (replaces any existing one). */
|
|
51
|
+
export declare function setContentResolver(registry: ExtensionRegistry, resolver: ContentResolver): void;
|
|
52
|
+
/** Set the media resolver (replaces any existing one). */
|
|
53
|
+
export declare function setMediaResolver(registry: ExtensionRegistry, resolver: MediaResolver): void;
|
|
54
|
+
/** Register an editor panel for specific section types. */
|
|
55
|
+
export declare function registerEditorPanel(registry: ExtensionRegistry, panel: EditorPanelDef): void;
|
|
56
|
+
/** Check if a section type has a custom renderer. */
|
|
57
|
+
export declare function hasCustomRenderer(registry: ExtensionRegistry, sectionType: string): boolean;
|
|
58
|
+
/** Get a custom renderer for a section type (or undefined). */
|
|
59
|
+
export declare function getCustomRenderer(registry: ExtensionRegistry, sectionType: string): CustomSectionRenderer | undefined;
|
|
60
|
+
/** Run all custom guardrails and return combined warnings. */
|
|
61
|
+
export declare function runCustomGuardrails(registry: ExtensionRegistry, context: GuardrailContext): CmsWarning[];
|
|
62
|
+
/** Get editor panels applicable to a given section type. */
|
|
63
|
+
export declare function getEditorPanels(registry: ExtensionRegistry, sectionType: string): EditorPanelDef[];
|
|
64
|
+
//# sourceMappingURL=extension-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-registry.d.ts","sourceRoot":"","sources":["../../src/core/extension-registry.ts"],"names":[],"mappings":"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"}
|