@hale-bopp/valentino-engine 1.0.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 (144) hide show
  1. package/AGENTS.md +49 -0
  2. package/CHANGELOG.md +22 -0
  3. package/LICENSE +21 -0
  4. package/README.md +108 -0
  5. package/dist/bin/commands/audit.d.ts +2 -0
  6. package/dist/bin/commands/audit.d.ts.map +1 -0
  7. package/dist/bin/commands/audit.js +24 -0
  8. package/dist/bin/commands/audit.js.map +1 -0
  9. package/dist/bin/commands/catalog.d.ts +2 -0
  10. package/dist/bin/commands/catalog.d.ts.map +1 -0
  11. package/dist/bin/commands/catalog.js +21 -0
  12. package/dist/bin/commands/catalog.js.map +1 -0
  13. package/dist/bin/commands/contrast.d.ts +2 -0
  14. package/dist/bin/commands/contrast.d.ts.map +1 -0
  15. package/dist/bin/commands/contrast.js +22 -0
  16. package/dist/bin/commands/contrast.js.map +1 -0
  17. package/dist/bin/commands/guardrails.d.ts +2 -0
  18. package/dist/bin/commands/guardrails.d.ts.map +1 -0
  19. package/dist/bin/commands/guardrails.js +18 -0
  20. package/dist/bin/commands/guardrails.js.map +1 -0
  21. package/dist/bin/commands/manifest.d.ts +2 -0
  22. package/dist/bin/commands/manifest.d.ts.map +1 -0
  23. package/dist/bin/commands/manifest.js +21 -0
  24. package/dist/bin/commands/manifest.js.map +1 -0
  25. package/dist/bin/commands/probe.d.ts +2 -0
  26. package/dist/bin/commands/probe.d.ts.map +1 -0
  27. package/dist/bin/commands/probe.js +59 -0
  28. package/dist/bin/commands/probe.js.map +1 -0
  29. package/dist/bin/commands/validate.d.ts +2 -0
  30. package/dist/bin/commands/validate.d.ts.map +1 -0
  31. package/dist/bin/commands/validate.js +19 -0
  32. package/dist/bin/commands/validate.js.map +1 -0
  33. package/dist/bin/valentino.d.ts +7 -0
  34. package/dist/bin/valentino.d.ts.map +1 -0
  35. package/dist/bin/valentino.js +62 -0
  36. package/dist/bin/valentino.js.map +1 -0
  37. package/dist/core/catalog.d.ts +13 -0
  38. package/dist/core/catalog.d.ts.map +1 -0
  39. package/dist/core/catalog.js +63 -0
  40. package/dist/core/catalog.js.map +1 -0
  41. package/dist/core/catalog.test.d.ts +2 -0
  42. package/dist/core/catalog.test.d.ts.map +1 -0
  43. package/dist/core/catalog.test.js +115 -0
  44. package/dist/core/catalog.test.js.map +1 -0
  45. package/dist/core/contrast.d.ts +42 -0
  46. package/dist/core/contrast.d.ts.map +1 -0
  47. package/dist/core/contrast.js +98 -0
  48. package/dist/core/contrast.js.map +1 -0
  49. package/dist/core/contrast.test.d.ts +2 -0
  50. package/dist/core/contrast.test.d.ts.map +1 -0
  51. package/dist/core/contrast.test.js +82 -0
  52. package/dist/core/contrast.test.js.map +1 -0
  53. package/dist/core/css-named-colors.d.ts +7 -0
  54. package/dist/core/css-named-colors.d.ts.map +1 -0
  55. package/dist/core/css-named-colors.js +45 -0
  56. package/dist/core/css-named-colors.js.map +1 -0
  57. package/dist/core/guardrails.d.ts +16 -0
  58. package/dist/core/guardrails.d.ts.map +1 -0
  59. package/dist/core/guardrails.js +55 -0
  60. package/dist/core/guardrails.js.map +1 -0
  61. package/dist/core/guardrails.test.d.ts +2 -0
  62. package/dist/core/guardrails.test.d.ts.map +1 -0
  63. package/dist/core/guardrails.test.js +88 -0
  64. package/dist/core/guardrails.test.js.map +1 -0
  65. package/dist/core/hero-contract.d.ts +21 -0
  66. package/dist/core/hero-contract.d.ts.map +1 -0
  67. package/dist/core/hero-contract.js +70 -0
  68. package/dist/core/hero-contract.js.map +1 -0
  69. package/dist/core/hero-contract.test.d.ts +2 -0
  70. package/dist/core/hero-contract.test.d.ts.map +1 -0
  71. package/dist/core/hero-contract.test.js +71 -0
  72. package/dist/core/hero-contract.test.js.map +1 -0
  73. package/dist/core/manifest.d.ts +8 -0
  74. package/dist/core/manifest.d.ts.map +1 -0
  75. package/dist/core/manifest.js +17 -0
  76. package/dist/core/manifest.js.map +1 -0
  77. package/dist/core/manifest.test.d.ts +2 -0
  78. package/dist/core/manifest.test.d.ts.map +1 -0
  79. package/dist/core/manifest.test.js +45 -0
  80. package/dist/core/manifest.test.js.map +1 -0
  81. package/dist/core/page-spec.d.ts +14 -0
  82. package/dist/core/page-spec.d.ts.map +1 -0
  83. package/dist/core/page-spec.js +20 -0
  84. package/dist/core/page-spec.js.map +1 -0
  85. package/dist/core/page-spec.test.d.ts +2 -0
  86. package/dist/core/page-spec.test.d.ts.map +1 -0
  87. package/dist/core/page-spec.test.js +38 -0
  88. package/dist/core/page-spec.test.js.map +1 -0
  89. package/dist/core/presentation.d.ts +9 -0
  90. package/dist/core/presentation.d.ts.map +1 -0
  91. package/dist/core/presentation.js +65 -0
  92. package/dist/core/presentation.js.map +1 -0
  93. package/dist/core/presentation.test.d.ts +2 -0
  94. package/dist/core/presentation.test.d.ts.map +1 -0
  95. package/dist/core/presentation.test.js +63 -0
  96. package/dist/core/presentation.test.js.map +1 -0
  97. package/dist/core/rhythm.d.ts +25 -0
  98. package/dist/core/rhythm.d.ts.map +1 -0
  99. package/dist/core/rhythm.js +67 -0
  100. package/dist/core/rhythm.js.map +1 -0
  101. package/dist/core/rhythm.test.d.ts +2 -0
  102. package/dist/core/rhythm.test.d.ts.map +1 -0
  103. package/dist/core/rhythm.test.js +69 -0
  104. package/dist/core/rhythm.test.js.map +1 -0
  105. package/dist/core/section-integrity.d.ts +30 -0
  106. package/dist/core/section-integrity.d.ts.map +1 -0
  107. package/dist/core/section-integrity.js +72 -0
  108. package/dist/core/section-integrity.js.map +1 -0
  109. package/dist/core/section-integrity.test.d.ts +2 -0
  110. package/dist/core/section-integrity.test.d.ts.map +1 -0
  111. package/dist/core/section-integrity.test.js +83 -0
  112. package/dist/core/section-integrity.test.js.map +1 -0
  113. package/dist/core/types.d.ts +456 -0
  114. package/dist/core/types.d.ts.map +1 -0
  115. package/dist/core/types.js +7 -0
  116. package/dist/core/types.js.map +1 -0
  117. package/dist/index.d.ts +21 -0
  118. package/dist/index.d.ts.map +1 -0
  119. package/dist/index.js +23 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/mcp/index.d.ts +2 -0
  122. package/dist/mcp/index.d.ts.map +1 -0
  123. package/dist/mcp/index.js +126 -0
  124. package/dist/mcp/index.js.map +1 -0
  125. package/dist/skills/design-guidelines.d.ts +6 -0
  126. package/dist/skills/design-guidelines.d.ts.map +1 -0
  127. package/dist/skills/design-guidelines.js +11 -0
  128. package/dist/skills/design-guidelines.js.map +1 -0
  129. package/dist/skills/index.d.ts +7 -0
  130. package/dist/skills/index.d.ts.map +1 -0
  131. package/dist/skills/index.js +7 -0
  132. package/dist/skills/index.js.map +1 -0
  133. package/dist/skills/premium-design.d.ts +6 -0
  134. package/dist/skills/premium-design.d.ts.map +1 -0
  135. package/dist/skills/premium-design.js +11 -0
  136. package/dist/skills/premium-design.js.map +1 -0
  137. package/dist/skills/web-guardrails.d.ts +6 -0
  138. package/dist/skills/web-guardrails.d.ts.map +1 -0
  139. package/dist/skills/web-guardrails.js +11 -0
  140. package/dist/skills/web-guardrails.js.map +1 -0
  141. package/package.json +69 -0
  142. package/skills/valentino-premium-design.md +10 -0
  143. package/skills/valentino-web-guardrails.md +9 -0
  144. package/skills/web-design-guidelines.md +9 -0
package/AGENTS.md ADDED
@@ -0,0 +1,49 @@
1
+ # Agents that use Valentino Engine
2
+
3
+ ## Direct MCP Integration
4
+
5
+ | Agent | Level | How it uses Valentino Engine |
6
+ |-------|-------|-----------------------------|
7
+ | **Agent Valentino** | L3 | Primary consumer — validates page specs, audits CSS, runs probes |
8
+ | **Agent Valentino Design** | L1 | CRO review — uses contrast checker, hero contract validation |
9
+ | **Agent Scrummaster** | L2 | Sprint QA — runs `probe all` on changed page specs |
10
+ | **Agent GEDI** | L1 | Architectural review — consulted by probes via escalation |
11
+
12
+ ## CLI Usage
13
+
14
+ Any agent with shell access can invoke:
15
+
16
+ ```bash
17
+ npx @hale-bopp/valentino audit <file.css>
18
+ npx @hale-bopp/valentino probe all <spec.json>
19
+ npx @hale-bopp/valentino contrast "#000" "#fff" AA
20
+ ```
21
+
22
+ ## MCP Configuration
23
+
24
+ ```json
25
+ {
26
+ "mcp_servers": {
27
+ "valentino-engine": {
28
+ "command": "npx",
29
+ "args": ["@hale-bopp/valentino-engine", "mcp"]
30
+ }
31
+ }
32
+ }
33
+ ```
34
+
35
+ ## 13 MCP Tools
36
+
37
+ | Tool | Description |
38
+ |------|-------------|
39
+ | `valentino_audit_css` | Audit CSS for hardcoded px, hex/rgba, and named colors |
40
+ | `valentino_validate_pagespec` | Validate PageSpecV1 contract |
41
+ | `valentino_check_contrast` | WCAG 2.1 contrast ratio check |
42
+ | `valentino_probe_rhythm` | Section sequence rhythm validation |
43
+ | `valentino_probe_hero` | Hero contract enforcement |
44
+ | `valentino_probe_integrity` | Per-type structural validation |
45
+ | `valentino_probe_all` | All probes combined |
46
+ | `valentino_resolve_catalog` | Resolve spec with catalog |
47
+ | `valentino_resolve_route` | Resolve URL route to page ID |
48
+ | `valentino_get_skill` | Get design skill rules |
49
+ | `valentino_list_guardrails` | List 10 Sovereign Guardrails |
package/CHANGELOG.md ADDED
@@ -0,0 +1,22 @@
1
+ # Changelog
2
+
3
+ ## [1.0.0] — 2026-03-23
4
+
5
+ ### Added
6
+ - **Core Type System**: Full PageSpecV1 type system (18 section types, catalog, manifest, navigation)
7
+ - **Catalog Resolver**: `resolvePageSpecWithCatalog` with blueprint, template, and preset resolution + governance checks
8
+ - **Presentation Resolver**: `resolvePresentation`, `inferRhythmProfile`, `DEFAULT_PRESENTATION`
9
+ - **Manifest Resolver**: `normalizePathname`, `resolvePageIdByRoute`
10
+ - **CSS Guardrails**: `checkNoHardcodedPx`, `checkNoHardcodedColor`, `checkNoNamedColor` (148 CSS colors)
11
+ - **WCAG Contrast**: `checkWcagContrast` with AA/AAA levels
12
+ - **Rhythm Probe**: hero-first, no consecutive same rhythm, spacer rules
13
+ - **Hero Contract**: CTA discipline, single decorative source, copy density, action rail geometry
14
+ - **Section Integrity**: per-type structural validation for 8 section types
15
+ - **CLI**: 7 commands (`audit`, `validate`, `guardrails`, `probe`, `contrast`, `catalog resolve`, `manifest resolve`)
16
+ - **MCP Server**: 13 tools covering all engine capabilities
17
+ - **Test Suite**: 109 tests across 9 suites
18
+
19
+ ### Architecture
20
+ - Zero DOM, zero fetch — pure functions only
21
+ - Framework-agnostic: consumers load data, engine resolves/validates/probes
22
+ - Type system extracted from easyway-portal (single source of truth)
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 EasyWay Platform Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,108 @@
1
+ # Valentino Engine
2
+
3
+ > **Antifragile Open Source UI Design Engine** — part of the [HALE-BOPP](https://dev.azure.com/EasyWayData/EasyWay-DataPortal/_git/hale-bopp-valentino-engine) family.
4
+
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)
6
+ [![npm](https://img.shields.io/npm/v/@hale-bopp/valentino-engine)](https://www.npmjs.com/package/@hale-bopp/valentino-engine)
7
+
8
+ ## What is Valentino Engine?
9
+
10
+ Valentino Engine validates, resolves, and probes **Runtime PageSpec JSON** — the contract that drives UI rendering. It enforces Design Tokens, checks WCAG accessibility, validates page structure, and resolves catalog blueprints — all without framework lock-in.
11
+
12
+ **Zero DOM. Zero fetch. Pure functions only.** You load data, the engine validates and resolves it.
13
+
14
+ ## Quickstart
15
+
16
+ ```bash
17
+ # Audit CSS for guardrail violations (px, hex, named colors)
18
+ npx @hale-bopp/valentino audit ./styles/theme.css
19
+
20
+ # Validate a PageSpec JSON
21
+ npx @hale-bopp/valentino validate ./pages/home.json
22
+
23
+ # Run all structural probes on a page
24
+ npx @hale-bopp/valentino probe all ./pages/home.json
25
+
26
+ # Check WCAG contrast ratio
27
+ npx @hale-bopp/valentino contrast "#333333" "#ffffff" AA
28
+
29
+ # Resolve a spec with a catalog
30
+ npx @hale-bopp/valentino catalog resolve ./pages/home.json --catalog ./catalog.json
31
+
32
+ # List the 10 Sovereign Guardrails
33
+ npx @hale-bopp/valentino guardrails
34
+ ```
35
+
36
+ ## Library API
37
+
38
+ ```typescript
39
+ import {
40
+ // Types (18 section types, full PageSpecV1)
41
+ type PageSpecV1, type SectionSpec, type ValentinoCatalogV1,
42
+
43
+ // Validation
44
+ validatePageSpec, checkWcagContrast,
45
+
46
+ // CSS Guardrails
47
+ checkNoHardcodedPx, checkNoHardcodedColor, checkNoNamedColor,
48
+
49
+ // Probes
50
+ probeRhythm, probeHeroContract, probeSectionIntegrity,
51
+
52
+ // Catalog & Presentation
53
+ resolvePageSpecWithCatalog, resolvePresentation, inferRhythmProfile,
54
+
55
+ // Manifest
56
+ resolvePageIdByRoute,
57
+ } from '@hale-bopp/valentino-engine';
58
+ ```
59
+
60
+ ## MCP Server (13 Tools)
61
+
62
+ Any MCP-compatible AI agent can connect to Valentino Engine:
63
+
64
+ ```json
65
+ {
66
+ "mcp_servers": {
67
+ "valentino-engine": {
68
+ "command": "npx",
69
+ "args": ["@hale-bopp/valentino-engine", "mcp"]
70
+ }
71
+ }
72
+ }
73
+ ```
74
+
75
+ | Tool | Description |
76
+ |------|-------------|
77
+ | `valentino_audit_css` | Audit CSS for hardcoded px, hex/rgba, and named colors |
78
+ | `valentino_validate_pagespec` | Validate PageSpecV1 contract |
79
+ | `valentino_check_contrast` | WCAG 2.1 contrast ratio (AA/AAA) |
80
+ | `valentino_probe_rhythm` | Section sequence rhythm validation |
81
+ | `valentino_probe_hero` | Hero contract (CTA discipline, copy density) |
82
+ | `valentino_probe_integrity` | Per-type structural validation |
83
+ | `valentino_probe_all` | All probes combined |
84
+ | `valentino_resolve_catalog` | Resolve spec with catalog (blueprints, presets) |
85
+ | `valentino_resolve_route` | Resolve URL route to page ID |
86
+ | `valentino_get_skill` | Get design skill rules |
87
+ | `valentino_list_guardrails` | List 10 Sovereign Guardrails |
88
+
89
+ ## The 10 Sovereign Guardrails
90
+
91
+ 1. **WhatIf di Layout** — Wireframe first, code second
92
+ 2. **Component Boundary & Fallbacks** — Error Boundaries on all API bridges
93
+ 3. **Design Token System** — No hardcoded colors or px values
94
+ 4. **L3 Audit before Commit** — ARIA, performance, and dependency check
95
+ 5. **Escalation to GEDI** — Consult GEDI on architectural trade-offs
96
+ 6. **Zero UI-Debt** — Reuse before creating
97
+ 7. **Electrical Socket Pattern** — CSS root variables for all colors
98
+ 8. **Testudo Formation** — No inline padding/margin overrides on containers
99
+ 9. **Tangible Legacy** — No redundant CSS blocks
100
+ 10. **Visual Live Audit** — Playwright MCP or `npm run test:e2e:valentino`
101
+
102
+ ## Contributing
103
+
104
+ PRs welcome! Please link your PR to an ADO Work Item under [Epic #480](https://dev.azure.com/EasyWayData/EasyWay-DataPortal/_workitems/edit/480).
105
+
106
+ ## License
107
+
108
+ [MIT](./LICENSE) — EasyWay Platform Team
@@ -0,0 +1,2 @@
1
+ export declare function runAudit(args: string[]): void;
2
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/audit.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmB7C"}
@@ -0,0 +1,24 @@
1
+ import { readFileSync } from 'fs';
2
+ import { checkNoHardcodedPx, checkNoHardcodedColor, checkNoNamedColor } from '../../core/guardrails.js';
3
+ export function runAudit(args) {
4
+ const file = args[0];
5
+ if (!file) {
6
+ console.error('Usage: valentino audit <path-to-css-file>');
7
+ process.exit(1);
8
+ }
9
+ const css = readFileSync(file, 'utf-8');
10
+ const all = [
11
+ ...checkNoHardcodedPx(css),
12
+ ...checkNoHardcodedColor(css),
13
+ ...checkNoNamedColor(css),
14
+ ];
15
+ if (all.length === 0) {
16
+ console.log('✅ No guardrail violations found.');
17
+ }
18
+ else {
19
+ console.log(`❌ ${all.length} violation(s) found:\n`);
20
+ all.forEach(v => console.log(' •', v));
21
+ process.exit(1);
22
+ }
23
+ }
24
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/bin/commands/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAExG,MAAM,UAAU,QAAQ,CAAC,IAAc;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG;QACR,GAAG,kBAAkB,CAAC,GAAG,CAAC;QAC1B,GAAG,qBAAqB,CAAC,GAAG,CAAC;QAC7B,GAAG,iBAAiB,CAAC,GAAG,CAAC;KAC5B,CAAC;IACF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,wBAAwB,CAAC,CAAC;QACrD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runCatalogResolve(args: string[]): void;
2
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/catalog.ts"],"names":[],"mappings":"AAKA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoBtD"}
@@ -0,0 +1,21 @@
1
+ import { readFileSync } from 'fs';
2
+ import { validatePageSpec } from '../../core/page-spec.js';
3
+ import { resolvePageSpecWithCatalog } from '../../core/catalog.js';
4
+ export function runCatalogResolve(args) {
5
+ const specFile = args[0];
6
+ const catalogIdx = args.indexOf('--catalog');
7
+ const catalogFile = catalogIdx >= 0 ? args[catalogIdx + 1] : undefined;
8
+ if (!specFile || !catalogFile) {
9
+ console.error('Usage: valentino catalog resolve <spec.json> --catalog <catalog.json>');
10
+ process.exit(1);
11
+ }
12
+ const specJson = JSON.parse(readFileSync(specFile, 'utf-8'));
13
+ if (!validatePageSpec(specJson)) {
14
+ console.error('❌ spec file is not a valid PageSpecV1.');
15
+ process.exit(1);
16
+ }
17
+ const catalog = JSON.parse(readFileSync(catalogFile, 'utf-8'));
18
+ const resolved = resolvePageSpecWithCatalog(specJson, catalog);
19
+ console.log(JSON.stringify(resolved, null, 2));
20
+ }
21
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/bin/commands/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAGnE,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvE,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,GAAuB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,0BAA0B,CAAC,QAAsB,EAAE,OAAO,CAAC,CAAC;IAE7E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runContrast(args: string[]): void;
2
+ //# sourceMappingURL=contrast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contrast.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/contrast.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuBhD"}
@@ -0,0 +1,22 @@
1
+ import { checkWcagContrast } from '../../core/contrast.js';
2
+ export function runContrast(args) {
3
+ const fg = args[0];
4
+ const bg = args[1];
5
+ const level = args[2] || 'AA';
6
+ if (!fg || !bg) {
7
+ console.error('Usage: valentino contrast <foreground> <background> [AA|AAA]');
8
+ process.exit(1);
9
+ }
10
+ const result = checkWcagContrast(fg, bg, level);
11
+ if (result.ratio === 0) {
12
+ console.error('❌ Could not parse colors. Use #hex or rgb(r,g,b) format.');
13
+ process.exit(1);
14
+ }
15
+ const status = result.passes ? '✅ PASS' : '❌ FAIL';
16
+ console.log(`${status} — ${result.ratio}:1 (${level} requires ${level === 'AAA' ? '7.0' : '4.5'}:1)`);
17
+ console.log(` Foreground: ${fg}`);
18
+ console.log(` Background: ${bg}`);
19
+ if (!result.passes)
20
+ process.exit(1);
21
+ }
22
+ //# sourceMappingURL=contrast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contrast.js","sourceRoot":"","sources":["../../../src/bin/commands/contrast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,MAAM,UAAU,WAAW,CAAC,IAAc;IACtC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,MAAM,KAAK,GAAI,IAAI,CAAC,CAAC,CAAmB,IAAI,IAAI,CAAC;IAEjD,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAEhD,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,MAAM,MAAM,CAAC,KAAK,OAAO,KAAK,aAAa,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;IACtG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAEnC,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runGuardrails(): void;
2
+ //# sourceMappingURL=guardrails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardrails.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/guardrails.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,IAAI,IAAI,CAgBpC"}
@@ -0,0 +1,18 @@
1
+ export function runGuardrails() {
2
+ const guardrails = [
3
+ '1. WhatIf di Layout — Wireframe first, code second',
4
+ '2. Component Boundary & Fallbacks — Error Boundaries on all API bridges',
5
+ '3. Design Token System — No hardcoded colors or px values',
6
+ '4. L3 Audit before Commit — ARIA, performance, and dependency check',
7
+ '5. Escalation to GEDI — Consult GEDI on architectural trade-offs',
8
+ '6. Zero UI-Debt — Reuse before creating',
9
+ '7. Electrical Socket Pattern — CSS root variables for all colors',
10
+ '8. Testudo Formation — No inline padding/margin overrides on containers',
11
+ '9. Tangible Legacy — No redundant CSS blocks',
12
+ '10. Visual Live Audit — Use MCP browser_screenshot or npm run test:e2e:valentino',
13
+ ];
14
+ console.log('\n🛡️ Valentino Engine — 10 Sovereign Guardrails\n');
15
+ guardrails.forEach(g => console.log(' ', g));
16
+ console.log();
17
+ }
18
+ //# sourceMappingURL=guardrails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardrails.js","sourceRoot":"","sources":["../../../src/bin/commands/guardrails.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa;IACzB,MAAM,UAAU,GAAG;QACf,oDAAoD;QACpD,yEAAyE;QACzE,2DAA2D;QAC3D,qEAAqE;QACrE,kEAAkE;QAClE,yCAAyC;QACzC,kEAAkE;QAClE,yEAAyE;QACzE,8CAA8C;QAC9C,kFAAkF;KACrF,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runManifestResolve(args: string[]): void;
2
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/manifest.ts"],"names":[],"mappings":"AAIA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmBvD"}
@@ -0,0 +1,21 @@
1
+ import { readFileSync } from 'fs';
2
+ import { resolvePageIdByRoute } from '../../core/manifest.js';
3
+ export function runManifestResolve(args) {
4
+ const manifestFile = args[0];
5
+ const routeIdx = args.indexOf('--route');
6
+ const route = routeIdx >= 0 ? args[routeIdx + 1] : undefined;
7
+ if (!manifestFile || !route) {
8
+ console.error('Usage: valentino manifest resolve <manifest.json> --route /path');
9
+ process.exit(1);
10
+ }
11
+ const manifest = JSON.parse(readFileSync(manifestFile, 'utf-8'));
12
+ const pageId = resolvePageIdByRoute(manifest, route);
13
+ if (pageId) {
14
+ console.log(`✅ Route "${route}" → pageId: "${pageId}"`);
15
+ }
16
+ else {
17
+ console.error(`❌ No page found for route "${route}"`);
18
+ process.exit(1);
19
+ }
20
+ }
21
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/bin/commands/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,UAAU,kBAAkB,CAAC,IAAc;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7D,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAoB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAErD,IAAI,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,gBAAgB,MAAM,GAAG,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,8BAA8B,KAAK,GAAG,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runProbe(subcommand: string, args: string[]): void;
2
+ //# sourceMappingURL=probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/probe.ts"],"names":[],"mappings":"AA0BA,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoCjE"}
@@ -0,0 +1,59 @@
1
+ import { readFileSync } from 'fs';
2
+ import { validatePageSpec } from '../../core/page-spec.js';
3
+ import { probeRhythm } from '../../core/rhythm.js';
4
+ import { probeHeroContract } from '../../core/hero-contract.js';
5
+ import { probeSectionIntegrity } from '../../core/section-integrity.js';
6
+ function loadSpec(file) {
7
+ const json = JSON.parse(readFileSync(file, 'utf-8'));
8
+ if (!validatePageSpec(json)) {
9
+ console.error('❌ File is not a valid PageSpecV1.');
10
+ process.exit(1);
11
+ }
12
+ return json;
13
+ }
14
+ function printWarnings(label, warnings) {
15
+ if (warnings.length === 0) {
16
+ console.log(` ✅ ${label}: no issues`);
17
+ return true;
18
+ }
19
+ console.log(` ❌ ${label}: ${warnings.length} issue(s)`);
20
+ warnings.forEach(w => console.log(` • [${w.rule}] ${w.message}`));
21
+ return false;
22
+ }
23
+ export function runProbe(subcommand, args) {
24
+ const file = args[0];
25
+ if (!file) {
26
+ console.error('Usage: valentino probe <rhythm|hero|integrity|all> <path-to-spec.json>');
27
+ process.exit(1);
28
+ }
29
+ const spec = loadSpec(file);
30
+ let allValid = true;
31
+ console.log(`\n🔍 Valentino Probe — ${file}\n`);
32
+ if (subcommand === 'rhythm' || subcommand === 'all') {
33
+ const result = probeRhythm(spec);
34
+ if (!printWarnings('Rhythm', result.warnings))
35
+ allValid = false;
36
+ }
37
+ if (subcommand === 'hero' || subcommand === 'all') {
38
+ const heroes = spec.sections.filter((s) => s.type === 'hero');
39
+ if (heroes.length === 0) {
40
+ console.log(' ⏭️ Hero: no hero section found');
41
+ }
42
+ else {
43
+ for (const hero of heroes) {
44
+ const result = probeHeroContract(hero);
45
+ if (!printWarnings(`Hero (${hero.titleKey})`, result.warnings))
46
+ allValid = false;
47
+ }
48
+ }
49
+ }
50
+ if (subcommand === 'integrity' || subcommand === 'all') {
51
+ const result = probeSectionIntegrity(spec.sections);
52
+ if (!printWarnings('Section Integrity', result.warnings))
53
+ allValid = false;
54
+ }
55
+ console.log();
56
+ if (!allValid)
57
+ process.exit(1);
58
+ }
59
+ //# sourceMappingURL=probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../../src/bin/commands/probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runValidate(args: string[]): void;
2
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/validate.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAchD"}
@@ -0,0 +1,19 @@
1
+ import { readFileSync } from 'fs';
2
+ import { validatePageSpec } from '../../core/page-spec.js';
3
+ export function runValidate(args) {
4
+ const file = args[0];
5
+ if (!file) {
6
+ console.error('Usage: valentino validate <path-to-pagespec.json>');
7
+ process.exit(1);
8
+ }
9
+ const json = JSON.parse(readFileSync(file, 'utf-8'));
10
+ const valid = validatePageSpec(json);
11
+ if (valid) {
12
+ console.log('✅ PageSpec is valid (V1).');
13
+ }
14
+ else {
15
+ console.error('❌ PageSpec is invalid — requires version: "1", id (string), sections (array).');
16
+ process.exit(1);
17
+ }
18
+ }
19
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/bin/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,UAAU,WAAW,CAAC,IAAc;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;QAC/F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Valentino CLI — command router
4
+ * `npx @hale-bopp/valentino <command> [args]`
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=valentino.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valentino.d.ts","sourceRoot":"","sources":["../../src/bin/valentino.ts"],"names":[],"mappings":";AACA;;;GAGG"}
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Valentino CLI — command router
4
+ * `npx @hale-bopp/valentino <command> [args]`
5
+ */
6
+ import { runAudit } from './commands/audit.js';
7
+ import { runValidate } from './commands/validate.js';
8
+ import { runGuardrails } from './commands/guardrails.js';
9
+ import { runProbe } from './commands/probe.js';
10
+ import { runCatalogResolve } from './commands/catalog.js';
11
+ import { runManifestResolve } from './commands/manifest.js';
12
+ import { runContrast } from './commands/contrast.js';
13
+ const [, , command, ...args] = process.argv;
14
+ switch (command) {
15
+ case 'audit':
16
+ runAudit(args);
17
+ break;
18
+ case 'validate':
19
+ runValidate(args);
20
+ break;
21
+ case 'guardrails':
22
+ runGuardrails();
23
+ break;
24
+ case 'probe':
25
+ runProbe(args[0] || 'all', args.slice(1));
26
+ break;
27
+ case 'catalog':
28
+ if (args[0] === 'resolve')
29
+ runCatalogResolve(args.slice(1));
30
+ else {
31
+ console.error('Usage: valentino catalog resolve <spec.json> --catalog <catalog.json>');
32
+ process.exit(1);
33
+ }
34
+ break;
35
+ case 'manifest':
36
+ if (args[0] === 'resolve')
37
+ runManifestResolve(args.slice(1));
38
+ else {
39
+ console.error('Usage: valentino manifest resolve <manifest.json> --route /path');
40
+ process.exit(1);
41
+ }
42
+ break;
43
+ case 'contrast':
44
+ runContrast(args);
45
+ break;
46
+ default:
47
+ console.log(`
48
+ 🎨 Valentino Engine v0.1.0 — Antifragile Open Source UI Design Engine
49
+
50
+ Usage:
51
+ valentino audit <file.css> Audit CSS for guardrail violations
52
+ valentino validate <spec.json> Validate a Runtime PageSpec JSON (V1)
53
+ valentino guardrails List all 10 Sovereign Guardrails
54
+ valentino probe <rhythm|hero|integrity|all> <spec.json> Run validation probes
55
+ valentino contrast <foreground> <background> [AA|AAA] Check WCAG contrast ratio
56
+ valentino catalog resolve <spec.json> --catalog <catalog.json> Resolve spec with catalog
57
+ valentino manifest resolve <manifest.json> --route /path Resolve route to page ID
58
+
59
+ Epic: https://dev.azure.com/EasyWayData/EasyWay-DataPortal/_workitems/edit/480
60
+ `);
61
+ }
62
+ //# sourceMappingURL=valentino.js.map
@@ -0,0 +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;AAErD,MAAM,CAAC,EAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;AAE3C,QAAQ,OAAO,EAAE,CAAC;IACd,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;QACI,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;CAanB,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Catalog Resolver — resolves PageSpec against a ValentinoCatalog.
3
+ * Pure functions, no fetch, no DOM. Consumer loads the catalog.
4
+ * Extracted from easyway-portal (src/utils/valentino-catalog.ts).
5
+ */
6
+ import type { PageSpecV1, SectionPresentationSpec, SectionSpec, ValentinoCatalogV1, PageProfileSpec } from './types.js';
7
+ export declare function mergePresentation(presetPresentation: SectionPresentationSpec | undefined, transitionPresentation: SectionPresentationSpec | undefined, inlinePresentation: SectionPresentationSpec | undefined): SectionPresentationSpec | undefined;
8
+ export declare function isGovernanceAllowed(sectionType: SectionSpec['type'], pageProfile: PageProfileSpec | undefined, governance?: {
9
+ allowedPageProfiles?: PageProfileSpec[];
10
+ allowedSectionTypes?: SectionSpec['type'][];
11
+ }): boolean;
12
+ export declare function resolvePageSpecWithCatalog(pageSpec: PageSpecV1, catalog: ValentinoCatalogV1): PageSpecV1;
13
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/core/catalog.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACR,UAAU,EACV,uBAAuB,EACvB,WAAW,EACX,kBAAkB,EAClB,eAAe,EAClB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,iBAAiB,CAC7B,kBAAkB,EAAE,uBAAuB,GAAG,SAAS,EACvD,sBAAsB,EAAE,uBAAuB,GAAG,SAAS,EAC3D,kBAAkB,EAAE,uBAAuB,GAAG,SAAS,GACxD,uBAAuB,GAAG,SAAS,CAOrC;AAED,wBAAgB,mBAAmB,CAC/B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAChC,WAAW,EAAE,eAAe,GAAG,SAAS,EACxC,UAAU,CAAC,EAAE;IACT,mBAAmB,CAAC,EAAE,eAAe,EAAE,CAAC;IACxC,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;CAC/C,GACF,OAAO,CAYT;AA+BD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,GAAG,UAAU,CAqBxG"}