@rubytech/create-maxy-code 0.1.60 → 0.1.61
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/package.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +1 -1
- package/payload/platform/plugins/brochures/skills/property-brochure/SKILL.md +26 -3
- package/payload/platform/plugins/brochures/skills/property-brochure/references/registers.md +1 -1
- package/payload/platform/plugins/docs/references/admin-session.md +2 -2
- package/payload/platform/plugins/docs/references/internals.md +1 -1
- package/payload/platform/plugins/docs/references/plugins-guide.md +1 -1
- package/payload/platform/plugins/epc/.claude-plugin/plugin.json +17 -0
- package/payload/platform/plugins/epc/PLUGIN.md +85 -0
- package/payload/platform/plugins/epc/mcp/dist/index.d.ts +2 -0
- package/payload/platform/plugins/epc/mcp/dist/index.d.ts.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/index.js +117 -0
- package/payload/platform/plugins/epc/mcp/dist/index.js.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/crypto.d.ts +3 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/crypto.d.ts.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/crypto.js +72 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/crypto.js.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/epc-api.d.ts +60 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/epc-api.d.ts.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/epc-api.js +181 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/epc-api.js.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/file-crypto.d.ts +3 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/file-crypto.d.ts.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/file-crypto.js +49 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/file-crypto.js.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/key-store.d.ts +15 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/key-store.d.ts.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/key-store.js +130 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/key-store.js.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/neo4j.d.ts +5 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/neo4j.d.ts.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/neo4j.js +38 -0
- package/payload/platform/plugins/epc/mcp/dist/lib/neo4j.js.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/key-deregister.d.ts +4 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/key-deregister.d.ts.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/key-deregister.js +9 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/key-deregister.js.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/key-list.d.ts +4 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/key-list.d.ts.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/key-list.js +10 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/key-list.js.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/key-register.d.ts +5 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/key-register.d.ts.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/key-register.js +36 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/key-register.js.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/lookup.d.ts +10 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/lookup.d.ts.map +1 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/lookup.js +30 -0
- package/payload/platform/plugins/epc/mcp/dist/tools/lookup.js.map +1 -0
- package/payload/platform/plugins/epc/mcp/package-lock.json +2566 -0
- package/payload/platform/plugins/epc/mcp/package.json +21 -0
- package/payload/platform/plugins/epc/mcp/src/__tests__/epc-api.test.ts +251 -0
- package/payload/platform/plugins/epc/mcp/src/__tests__/key-roundtrip.test.ts +113 -0
- package/payload/platform/plugins/epc/mcp/src/__tests__/lookup.test.ts +181 -0
- package/payload/platform/plugins/epc/mcp/src/__tests__/schema-parity.test.ts +54 -0
- package/payload/platform/plugins/epc/mcp/src/index.ts +156 -0
- package/payload/platform/plugins/epc/mcp/src/lib/crypto.ts +79 -0
- package/payload/platform/plugins/epc/mcp/src/lib/epc-api.ts +241 -0
- package/payload/platform/plugins/epc/mcp/src/lib/file-crypto.ts +55 -0
- package/payload/platform/plugins/epc/mcp/src/lib/key-store.ts +172 -0
- package/payload/platform/plugins/epc/mcp/src/lib/neo4j.ts +47 -0
- package/payload/platform/plugins/epc/mcp/src/tools/key-deregister.ts +9 -0
- package/payload/platform/plugins/epc/mcp/src/tools/key-list.ts +10 -0
- package/payload/platform/plugins/epc/mcp/src/tools/key-register.ts +44 -0
- package/payload/platform/plugins/epc/mcp/src/tools/lookup.ts +43 -0
- package/payload/platform/plugins/epc/mcp/tsconfig.json +20 -0
- package/payload/platform/plugins/epc/mcp/vitest.config.ts +8 -0
- package/payload/platform/plugins/preval/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/preval/PLUGIN.md +23 -17
- package/payload/platform/plugins/preval/skills/property-preval/SKILL.md +78 -38
- package/payload/platform/plugins/preval/skills/property-preval/references/render.py +288 -81
- package/payload/platform/plugins/preval/skills/property-preval/references/template-inputs.schema.json +125 -80
- package/payload/platform/plugins/preval/skills/property-preval/references/template.html +184 -124
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +6 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +7 -0
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +8 -0
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/templates/agents/admin/IDENTITY.md +1 -1
- package/payload/platform/templates/agents/admin/SOUL.md +1 -1
- package/payload/premium-plugins/real-agent/BUNDLE.md +4 -2
- package/payload/premium-plugins/real-agent/agents/valuer.md +1 -1
- package/payload/premium-plugins/real-agent/plugins/.claude-plugin/marketplace.json +5 -0
- package/payload/premium-plugins/real-agent/plugins/brochures/skills/property-brochure/SKILL.md +26 -3
- package/payload/premium-plugins/real-agent/plugins/brochures/skills/property-brochure/references/registers.md +1 -1
- package/payload/premium-plugins/real-agent/plugins/epc/.claude-plugin/plugin.json +17 -0
- package/payload/premium-plugins/real-agent/plugins/epc/PLUGIN.md +85 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/index.d.ts +2 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/index.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/index.js +117 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/index.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/crypto.d.ts +3 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/crypto.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/crypto.js +72 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/crypto.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/epc-api.d.ts +60 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/epc-api.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/epc-api.js +181 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/epc-api.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/file-crypto.d.ts +3 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/file-crypto.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/file-crypto.js +49 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/file-crypto.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/key-store.d.ts +15 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/key-store.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/key-store.js +130 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/key-store.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/neo4j.d.ts +5 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/neo4j.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/neo4j.js +38 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/lib/neo4j.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/key-deregister.d.ts +4 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/key-deregister.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/key-deregister.js +9 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/key-deregister.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/key-list.d.ts +4 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/key-list.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/key-list.js +10 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/key-list.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/key-register.d.ts +5 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/key-register.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/key-register.js +36 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/key-register.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/lookup.d.ts +10 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/lookup.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/lookup.js +30 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/dist/tools/lookup.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/package-lock.json +2566 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/package.json +21 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/__tests__/epc-api.test.ts +251 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/__tests__/key-roundtrip.test.ts +113 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/__tests__/lookup.test.ts +181 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/__tests__/schema-parity.test.ts +54 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/index.ts +156 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/crypto.ts +79 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/epc-api.ts +241 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/file-crypto.ts +55 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/key-store.ts +172 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/neo4j.ts +47 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/tools/key-deregister.ts +9 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/tools/key-list.ts +10 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/tools/key-register.ts +44 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/tools/lookup.ts +43 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/tsconfig.json +20 -0
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/vitest.config.ts +8 -0
- package/payload/premium-plugins/real-agent/plugins/preval/.claude-plugin/plugin.json +1 -1
- package/payload/premium-plugins/real-agent/plugins/preval/PLUGIN.md +23 -17
- package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/SKILL.md +78 -38
- package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/references/render.py +288 -81
- package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/references/template-inputs.schema.json +125 -80
- package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/references/template.html +184 -124
- package/payload/server/public/assets/{admin-Bp-BjBCX.js → admin-DhN3G8W7.js} +1 -1
- package/payload/server/public/assets/{data-BGUAGVkV.js → data-B2ZVXOcE.js} +1 -1
- package/payload/server/public/assets/{graph-MvYxZOBF.js → graph-BAMGPHrK.js} +1 -1
- package/payload/server/public/assets/{graph-labels-D865qb3K.js → graph-labels-D9eBbvxo.js} +1 -1
- package/payload/server/public/assets/{page-C2b1nlOc.js → page-CV27Al6Z.js} +1 -1
- package/payload/server/public/assets/{page--hOVRrgN.js → page-DjdVMWCz.js} +1 -1
- package/payload/server/public/data.html +3 -3
- package/payload/server/public/graph.html +3 -3
- package/payload/server/public/index.html +4 -4
- package/payload/server/server.js +3 -16
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8">
|
|
5
|
-
<title>Pre-valuation · <!-- REPLACE: address --> · <!-- REPLACE: generated --></title>
|
|
5
|
+
<title>Pre-valuation · <!-- REPLACE: address --> · <!-- REPLACE: generated --> · <!-- REPLACE: brand_name --></title>
|
|
6
6
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
7
7
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
8
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
9
9
|
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;1,400;1,500;1,600&family=Lora:ital,wght@0,400;0,500;0,600;1,400&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
|
|
10
10
|
<style>
|
|
11
11
|
:root{
|
|
12
|
-
--teal-900
|
|
13
|
-
--teal-950
|
|
14
|
-
--gold-500
|
|
12
|
+
--teal-900:<!-- REPLACE: brand_primary -->;
|
|
13
|
+
--teal-950:<!-- REPLACE: brand_primary_dark -->;
|
|
14
|
+
--gold-500:<!-- REPLACE: brand_accent -->;
|
|
15
15
|
--paper-0:#FFFFFF;
|
|
16
|
-
--paper-25
|
|
16
|
+
--paper-25:<!-- REPLACE: brand_paper -->;
|
|
17
17
|
--paper-50:#FBF8F8;
|
|
18
|
-
--paper-75
|
|
18
|
+
--paper-75:<!-- REPLACE: brand_paper_banded -->;
|
|
19
19
|
--slate-500:#56605F; --slate-600:#6E6E6E;
|
|
20
|
-
--rule-300
|
|
20
|
+
--rule-300:<!-- REPLACE: brand_rule -->;
|
|
21
21
|
|
|
22
22
|
--text-default:var(--teal-900);
|
|
23
23
|
--text-muted:var(--slate-600);
|
|
@@ -35,218 +35,278 @@
|
|
|
35
35
|
}
|
|
36
36
|
*{box-sizing:border-box;margin:0;padding:0}
|
|
37
37
|
html,body{background:var(--rule-300);font-family:var(--body);color:var(--text-default);font-weight:400;-webkit-font-smoothing:antialiased}
|
|
38
|
+
a{color:inherit;text-decoration:none}
|
|
38
39
|
.page{width:210mm;min-height:297mm;height:297mm;margin:8mm auto;background:var(--surface-page);position:relative;overflow:hidden;padding:18mm 16mm;page-break-after:always}
|
|
39
40
|
.page.dark{background:var(--surface-deep);color:var(--text-on-dark)}
|
|
41
|
+
.page.dark .muted{color:#B7C8C8}
|
|
40
42
|
@page{size:A4 portrait;margin:0}
|
|
41
43
|
@media print{html,body{background:transparent} .page{margin:0;box-shadow:none;page-break-after:always}}
|
|
42
44
|
|
|
43
45
|
h1,h2,h3,h4{font-family:var(--display);font-weight:500;line-height:1.15;color:inherit}
|
|
44
|
-
h1{font-
|
|
45
|
-
h2{font-size:
|
|
46
|
+
h1{font-size:48pt;letter-spacing:-1pt;font-style:italic;font-weight:400}
|
|
47
|
+
h2{font-size:26pt;font-style:italic;font-weight:400;margin-bottom:6mm;letter-spacing:-.3pt}
|
|
46
48
|
h3{font-size:14pt;font-weight:500}
|
|
47
49
|
h4{font-family:var(--sans);font-size:8.5pt;font-weight:600;letter-spacing:2.2pt;text-transform:uppercase;color:var(--text-accent)}
|
|
48
50
|
p{font-size:11pt;line-height:1.65;color:inherit;font-family:var(--body)}
|
|
49
51
|
.muted{color:var(--text-muted);font-size:9.5pt;line-height:1.55;font-family:var(--body)}
|
|
50
52
|
.eyebrow{font-family:var(--sans);font-weight:600;font-size:9pt;letter-spacing:3pt;text-transform:uppercase;color:var(--text-accent)}
|
|
53
|
+
.dropcap::first-letter{font-family:var(--display);font-weight:400;font-style:italic;font-size:5em;line-height:.82;float:left;margin:.05em .12em -.08em 0;color:var(--teal-900);letter-spacing:-.04em}
|
|
51
54
|
|
|
52
|
-
|
|
53
|
-
.cover-
|
|
54
|
-
.cover-
|
|
55
|
-
.
|
|
56
|
-
.cover-
|
|
55
|
+
/* --- COVER --- */
|
|
56
|
+
.cover-bg{position:absolute;inset:0;background:url(<!-- REPLACE: subject_hero_path -->) center/cover no-repeat}
|
|
57
|
+
.cover-bg::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(6,68,68,.55) 0%,rgba(6,68,68,.78) 55%,rgba(4,45,45,.94) 100%)}
|
|
58
|
+
.cover-frame{position:absolute;inset:0;padding:18mm 16mm;display:flex;flex-direction:column;justify-content:space-between;z-index:1}
|
|
59
|
+
.cover-hero h1{color:var(--text-on-dark);max-width:170mm}
|
|
60
|
+
.cover-hero .lede{color:var(--gold-500);font-family:var(--display);font-style:italic;font-weight:400;font-size:16pt;letter-spacing:.2pt;margin-top:6mm}
|
|
61
|
+
.cover-meta{display:grid;grid-template-columns:repeat(4,1fr);gap:8mm;border-top:1px solid rgba(255,255,255,.22);padding-top:8mm}
|
|
57
62
|
.cover-meta dt{font-family:var(--sans);font-weight:600;font-size:8pt;letter-spacing:2pt;text-transform:uppercase;color:var(--gold-500);margin-bottom:3mm}
|
|
58
63
|
.cover-meta dd{font-family:var(--display);font-style:italic;font-weight:500;font-size:14pt;color:var(--text-on-dark)}
|
|
64
|
+
.cover-rule{height:1px;background:var(--gold-500);width:30mm}
|
|
65
|
+
.pc-chip{display:inline-flex;align-items:center;padding:2.5mm 6mm;border:1px solid var(--gold-500);border-radius:50px;color:var(--gold-500);font-family:var(--sans);font-weight:600;font-size:10pt;letter-spacing:2.5pt}
|
|
59
66
|
|
|
60
|
-
|
|
61
|
-
.doc-head
|
|
62
|
-
.doc-head .breadcrumb{font-family:var(--sans);font-weight:500;font-size:8pt;letter-spacing:2pt;text-transform:uppercase;color:var(--text-muted)
|
|
67
|
+
/* --- BODY HEAD/FOOT --- */
|
|
68
|
+
.doc-head{display:flex;justify-content:space-between;align-items:flex-end;padding-bottom:6mm;border-bottom:1px solid var(--rule-300);margin-bottom:8mm}
|
|
69
|
+
.doc-head .breadcrumb{font-family:var(--sans);font-weight:500;font-size:8pt;letter-spacing:2pt;text-transform:uppercase;color:var(--text-muted)}
|
|
70
|
+
.doc-foot{position:absolute;bottom:9mm;left:16mm;right:16mm;display:flex;justify-content:space-between;font-family:var(--sans);font-weight:500;font-size:8pt;letter-spacing:1.5pt;text-transform:uppercase;color:var(--text-muted)}
|
|
71
|
+
.page.dark .doc-foot{color:#7FA0A0}
|
|
63
72
|
|
|
64
|
-
|
|
73
|
+
/* --- KPI TILES --- */
|
|
74
|
+
.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:4mm;margin-bottom:6mm}
|
|
75
|
+
.kpis.three{grid-template-columns:repeat(3,1fr)}
|
|
76
|
+
.kpis.cube{grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(2,1fr);gap:4mm;margin-bottom:0;height:100%}
|
|
77
|
+
.kpis.cube .kpi{padding:5mm;display:flex;flex-direction:column;justify-content:space-between}
|
|
65
78
|
.kpi{background:var(--surface-card);border-radius:var(--radius-lg);padding:5mm;border:1px solid var(--rule-300);position:relative;overflow:hidden}
|
|
66
|
-
.kpi::before{content:"";position:absolute;left:0;top:0;bottom:0;width:1.4mm;background:var(--gold-500)}
|
|
79
|
+
.kpi.subject::before{content:"";position:absolute;left:0;top:0;bottom:0;width:1.4mm;background:var(--gold-500)}
|
|
67
80
|
.kpi .label{font-family:var(--sans);font-weight:600;font-size:7pt;letter-spacing:1.7pt;text-transform:uppercase;color:var(--text-muted);margin-bottom:2mm}
|
|
68
81
|
.kpi .value{font-family:var(--display);font-style:italic;font-weight:500;font-size:20pt;color:var(--text-default);line-height:1;letter-spacing:-.3pt}
|
|
69
82
|
.kpi .sub{font-size:8pt;color:var(--text-muted);margin-top:2mm;font-family:var(--body);font-style:italic}
|
|
83
|
+
.kpi.gold{background:var(--teal-900);color:var(--text-on-dark);border:none}
|
|
84
|
+
.kpi.gold .label{color:var(--gold-500)}
|
|
85
|
+
.kpi.gold .value{color:var(--text-on-dark);font-size:22pt}
|
|
86
|
+
.kpi.gold .sub{color:#B7C8C8}
|
|
70
87
|
|
|
71
|
-
|
|
88
|
+
/* --- LAYOUTS --- */
|
|
89
|
+
.two-col{display:grid;grid-template-columns:1.1fr .9fr;gap:8mm;align-items:start}
|
|
72
90
|
.panel{background:var(--surface-card);border-radius:var(--radius-lg);padding:5.5mm;border:1px solid var(--rule-300)}
|
|
73
91
|
.panel.banded{background:var(--surface-banded)}
|
|
74
92
|
.panel h4{margin-bottom:3mm}
|
|
75
93
|
|
|
94
|
+
/* --- VALUATION PANEL --- */
|
|
95
|
+
.val-panel{background:var(--surface-banded);border-radius:var(--radius-lg);padding:7mm;border:1px solid var(--rule-300)}
|
|
96
|
+
.val-row{display:grid;grid-template-columns:1fr auto;align-items:baseline;gap:4mm;padding:3mm 0;border-bottom:1px dashed var(--rule-300)}
|
|
97
|
+
.val-row:last-child{border-bottom:none}
|
|
98
|
+
.val-row .lbl{font-family:var(--sans);font-weight:500;font-size:9pt;letter-spacing:.4pt;color:var(--text-default)}
|
|
99
|
+
.val-row .lbl small{display:block;font-family:var(--body);font-style:italic;font-weight:400;color:var(--text-muted);font-size:8pt;letter-spacing:0;text-transform:none;margin-top:.8mm}
|
|
100
|
+
.val-row .num{font-family:var(--display);font-style:italic;font-weight:500;font-size:18pt;color:var(--text-default);letter-spacing:-.3pt}
|
|
101
|
+
.val-row.headline .num{font-size:22pt;color:var(--teal-900)}
|
|
102
|
+
.val-row.adj .num{font-size:14pt;color:var(--text-muted)}
|
|
103
|
+
.val-row.adj .num.pos{color:#2E7D63}
|
|
104
|
+
.val-row.adj .num.neg{color:#B0463E}
|
|
105
|
+
.val-final{margin-top:5mm;padding:5mm 6mm;background:var(--teal-900);color:var(--text-on-dark);border-radius:var(--radius-lg);display:flex;justify-content:space-between;align-items:baseline;gap:4mm}
|
|
106
|
+
.val-final .lbl{font-family:var(--sans);font-weight:600;font-size:8pt;letter-spacing:2pt;text-transform:uppercase;color:var(--gold-500)}
|
|
107
|
+
.val-final .num{font-family:var(--display);font-style:italic;font-weight:500;font-size:26pt;color:var(--text-on-dark);letter-spacing:-.4pt}
|
|
108
|
+
.val-empty{padding:8mm;text-align:center;font-family:var(--display);font-style:italic;font-size:14pt;color:var(--text-muted)}
|
|
109
|
+
|
|
110
|
+
/* --- TABLES --- */
|
|
76
111
|
table.cmp{width:100%;border-collapse:collapse;font-size:10pt;font-family:var(--body)}
|
|
77
|
-
table.cmp th,table.cmp td{padding:2.
|
|
112
|
+
table.cmp th,table.cmp td{padding:2.4mm 2mm;text-align:left;border-bottom:1px solid var(--rule-300)}
|
|
78
113
|
table.cmp th{font-family:var(--sans);font-weight:600;font-size:7.5pt;letter-spacing:1.8pt;text-transform:uppercase;color:var(--text-muted)}
|
|
79
|
-
table.cmp td.num{font-family:var(--display);font-style:italic;font-weight:500;text-align:right;font-size:
|
|
114
|
+
table.cmp td.num{font-family:var(--display);font-style:italic;font-weight:500;text-align:right;font-size:11.5pt}
|
|
80
115
|
table.cmp tr:last-child td{border-bottom:none}
|
|
81
116
|
|
|
82
|
-
|
|
83
|
-
.ask-
|
|
84
|
-
.ask-tile
|
|
85
|
-
.ask-tile .
|
|
86
|
-
.ask-tile .
|
|
117
|
+
/* --- ASKING TILES (FULL WIDTH) --- */
|
|
118
|
+
.ask-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:4mm}
|
|
119
|
+
.ask-tile{background:var(--surface-card);border:1px solid var(--rule-300);border-radius:var(--radius-md);padding:4mm}
|
|
120
|
+
.ask-tile .addr{font-family:var(--display);font-style:italic;font-weight:500;font-size:12pt;color:var(--text-default);line-height:1.2}
|
|
121
|
+
.ask-tile .price{font-family:var(--display);font-style:italic;font-weight:500;font-size:16pt;color:var(--teal-900);margin-top:2mm;letter-spacing:-.2pt}
|
|
122
|
+
.ask-tile .meta{font-family:var(--sans);font-weight:500;font-size:7pt;letter-spacing:.6pt;color:var(--text-muted);margin-top:2mm;text-transform:uppercase}
|
|
87
123
|
|
|
88
|
-
|
|
124
|
+
/* --- DIST BARS --- */
|
|
125
|
+
.dist{display:flex;flex-direction:column;gap:3mm;margin-top:2mm}
|
|
89
126
|
.dist-row{display:grid;grid-template-columns:40mm 1fr 14mm;align-items:center;gap:3mm}
|
|
90
|
-
.dist-row .name{font-size:
|
|
91
|
-
.dist-row .pct{font-family:var(--display);font-style:italic;font-weight:500;font-size:
|
|
92
|
-
.bar{height:
|
|
127
|
+
.dist-row .name{font-size:10pt;color:var(--text-default);font-family:var(--body)}
|
|
128
|
+
.dist-row .pct{font-family:var(--display);font-style:italic;font-weight:500;font-size:12pt;color:var(--text-default);text-align:right}
|
|
129
|
+
.bar{height:5mm;background:var(--paper-75);border-radius:var(--radius-md);overflow:hidden}
|
|
93
130
|
.bar > span{display:block;height:100%;background:var(--teal-900);border-radius:var(--radius-md)}
|
|
94
131
|
.bar > span.gold{background:var(--gold-500)}
|
|
95
132
|
|
|
96
|
-
|
|
97
|
-
.pill
|
|
133
|
+
/* --- DEMAND GAUGE --- */
|
|
134
|
+
.pill{display:inline-flex;align-items:center;gap:2.5mm;padding:2mm 5mm;border-radius:50px;background:var(--gold-500);color:var(--text-on-dark);font-family:var(--display);font-style:italic;font-weight:500;font-size:11pt;letter-spacing:.3pt}
|
|
135
|
+
.pill::before{content:"";width:2.2mm;height:2.2mm;border-radius:50%;background:#fff}
|
|
136
|
+
.gauge{display:flex;align-items:center;gap:6mm;margin-top:4mm}
|
|
137
|
+
.gauge-track{flex:1;height:5mm;background:var(--paper-75);border-radius:50px;position:relative;overflow:hidden}
|
|
138
|
+
.gauge-fill{position:absolute;inset:0 50% 0 0;background:linear-gradient(90deg,var(--teal-900),var(--gold-500))}
|
|
139
|
+
.gauge-marker{position:absolute;top:-2mm;width:1.2mm;height:9mm;background:var(--text-default);border-radius:2px}
|
|
140
|
+
.gauge-ends{display:flex;justify-content:space-between;font-family:var(--sans);font-weight:500;font-size:7.5pt;letter-spacing:1.5pt;text-transform:uppercase;color:var(--text-muted);margin-top:2mm}
|
|
98
141
|
|
|
99
|
-
|
|
142
|
+
/* --- SPARKLINE --- */
|
|
143
|
+
.spark{width:100%;height:36mm;display:block;background:var(--surface-card);border:1px solid var(--rule-300);border-radius:var(--radius-md)}
|
|
100
144
|
.spark .pl{fill:none;stroke:var(--teal-900);stroke-width:1.4}
|
|
101
145
|
.spark .pl-psf{fill:none;stroke:var(--gold-500);stroke-width:1.4;stroke-dasharray:2 1.5}
|
|
102
146
|
.spark .pt{fill:var(--teal-900)}
|
|
103
147
|
.spark .pt-psf{fill:var(--gold-500)}
|
|
104
148
|
.spark text{font-family:Inter,sans-serif;font-size:5pt;fill:#6E6E6E;letter-spacing:.4pt}
|
|
105
149
|
.spark .axis{stroke:var(--rule-300);stroke-width:.4}
|
|
106
|
-
|
|
107
150
|
.legend{display:flex;gap:6mm;font-family:var(--sans);font-weight:500;font-size:7pt;letter-spacing:1.3pt;text-transform:uppercase;color:var(--text-muted);margin-top:2mm}
|
|
108
151
|
.legend .sw{display:inline-block;width:6mm;height:1mm;vertical-align:middle;margin-right:2mm;background:var(--teal-900)}
|
|
109
152
|
.legend .sw.gold{background:var(--gold-500)}
|
|
110
153
|
|
|
111
|
-
|
|
112
|
-
.
|
|
154
|
+
/* --- AGENT LISTINGS --- */
|
|
155
|
+
.listings{display:grid;grid-template-columns:repeat(2,1fr);gap:4mm;margin-top:3mm}
|
|
156
|
+
.listing{display:grid;grid-template-columns:50mm 1fr;border:1px solid var(--rule-300);border-radius:var(--radius-xl);overflow:hidden;background:var(--surface-card);transition:background 200ms,border-color 200ms}
|
|
157
|
+
.listing:hover{background:var(--paper-50);border-color:var(--gold-500)}
|
|
158
|
+
.listing .photo{position:relative;aspect-ratio:4/3;background:var(--paper-75)}
|
|
159
|
+
.listing .photo img{width:100%;height:100%;object-fit:cover;display:block}
|
|
160
|
+
.listing .photo .badge{position:absolute;left:2mm;top:2mm;background:var(--gold-500);color:#fff;font-family:var(--sans);font-weight:600;font-size:6pt;letter-spacing:1.2pt;text-transform:uppercase;padding:.9mm 2.2mm;border-radius:50px}
|
|
161
|
+
.listing .photo .badge.sold{background:#2E7D63}
|
|
162
|
+
.listing .photo .badge.under{background:#7C5BC4}
|
|
163
|
+
.listing .meta{padding:3mm 4mm;display:flex;flex-direction:column;justify-content:center;gap:.5mm}
|
|
164
|
+
.listing .meta .addr{font-family:var(--display);font-style:italic;font-weight:500;font-size:13pt;color:var(--text-default);line-height:1.15;letter-spacing:-.2pt}
|
|
165
|
+
.listing .meta .price{font-family:var(--display);font-style:italic;font-weight:500;font-size:14pt;color:var(--text-default);margin-top:1mm;line-height:1;letter-spacing:-.2pt}
|
|
166
|
+
.listing .meta .kfs{display:flex;flex-wrap:wrap;gap:1.2mm;margin-top:1.5mm}
|
|
167
|
+
.listing .meta .kfs span{font-family:var(--sans);font-weight:500;font-size:6.5pt;letter-spacing:.4pt;color:var(--text-default);background:var(--paper-75);padding:.8mm 2mm;border-radius:50px}
|
|
113
168
|
|
|
114
|
-
|
|
169
|
+
/* --- SOURCES --- */
|
|
170
|
+
.sources{margin-top:6mm;padding-top:5mm;border-top:1px solid var(--rule-300)}
|
|
115
171
|
.sources h4{margin-bottom:3mm}
|
|
116
172
|
.sources p{font-size:8pt;color:var(--text-muted);line-height:1.55;font-family:var(--body);font-style:italic}
|
|
117
173
|
.sources p + p{margin-top:2.5mm}
|
|
174
|
+
|
|
175
|
+
/* --- WORDMARK FALLBACK --- */
|
|
176
|
+
.wm{display:inline-flex;flex-direction:column;align-items:flex-start;line-height:1;color:var(--teal-900)}
|
|
177
|
+
.wm.light{color:var(--paper-0)}
|
|
178
|
+
.wm-name{font-family:var(--display);font-weight:600;font-style:normal;font-size:34pt;letter-spacing:-1pt;line-height:.9}
|
|
179
|
+
.wm-sub{font-family:var(--sans);font-weight:600;font-size:7pt;letter-spacing:2pt;text-transform:uppercase;margin-top:2mm}
|
|
180
|
+
.wm.small .wm-name{font-size:20pt}
|
|
181
|
+
.wm.small .wm-sub{margin-top:.8mm;font-size:5.5pt;letter-spacing:1.8pt}
|
|
118
182
|
</style>
|
|
119
183
|
</head>
|
|
120
184
|
<body>
|
|
121
185
|
|
|
122
186
|
<!-- PAGE 1 — COVER -->
|
|
123
187
|
<section class="page dark">
|
|
188
|
+
<div class="cover-bg"></div>
|
|
124
189
|
<div class="cover-frame">
|
|
125
190
|
<div>
|
|
126
|
-
|
|
127
|
-
<div class="cover-rule" style="margin-top:6mm"></div>
|
|
191
|
+
<!-- REPLACE: wordmark_light -->
|
|
128
192
|
</div>
|
|
129
|
-
<div>
|
|
130
|
-
<
|
|
131
|
-
<
|
|
132
|
-
<
|
|
193
|
+
<div class="cover-hero">
|
|
194
|
+
<div class="cover-rule"></div>
|
|
195
|
+
<h4 style="color:var(--gold-500);margin:6mm 0 4mm"><!-- REPLACE: brand_name --> · Pre-valuation</h4>
|
|
196
|
+
<h1><!-- REPLACE: address --></h1>
|
|
197
|
+
<p class="lede">A view of what this property is worth — <!-- REPLACE: generated -->.</p>
|
|
198
|
+
<div style="margin-top:8mm"><span class="pc-chip"><!-- REPLACE: postcode --></span></div>
|
|
133
199
|
</div>
|
|
134
200
|
<dl class="cover-meta">
|
|
135
201
|
<div><dt>Report</dt><dd>Pre-valuation</dd></div>
|
|
202
|
+
<div><dt>Address</dt><dd style="font-size:11pt;line-height:1.2"><!-- REPLACE: address_short --></dd></div>
|
|
136
203
|
<div><dt>Postcode</dt><dd><!-- REPLACE: postcode --></dd></div>
|
|
137
204
|
<div><dt>Generated</dt><dd><!-- REPLACE: generated --></dd></div>
|
|
138
205
|
</dl>
|
|
139
206
|
</div>
|
|
140
|
-
<div class="doc-foot" style="z-index:2"><span
|
|
207
|
+
<div class="doc-foot" style="z-index:2"><span><!-- REPLACE: brand_name --> · Property Intelligence</span><span>01</span></div>
|
|
141
208
|
</section>
|
|
142
209
|
|
|
143
|
-
<!-- PAGE 2 — VALUATION -->
|
|
210
|
+
<!-- PAGE 2 — SUBJECT VALUATION -->
|
|
144
211
|
<section class="page">
|
|
145
212
|
<header class="doc-head">
|
|
146
|
-
|
|
147
|
-
<div class="breadcrumb">
|
|
213
|
+
<!-- REPLACE: wordmark_dark -->
|
|
214
|
+
<div class="breadcrumb">Subject valuation · <!-- REPLACE: postcode --> · <!-- REPLACE: generated --></div>
|
|
148
215
|
</header>
|
|
149
|
-
<div class="eyebrow">
|
|
216
|
+
<div class="eyebrow">Subject property</div>
|
|
150
217
|
<h2 style="margin-top:3mm">What this property is worth.</h2>
|
|
151
|
-
<div class="kpis
|
|
152
|
-
<div class="kpi"><div class="label">
|
|
153
|
-
<div class="kpi"><div class="label">
|
|
154
|
-
<div class="kpi"><div class="label">
|
|
155
|
-
<div class="kpi"><div class="label">
|
|
156
|
-
</div>
|
|
157
|
-
<div class="two-col" style="grid-template-columns:1.15fr .85fr">
|
|
158
|
-
<div class="panel banded">
|
|
159
|
-
<h4>Nearest sold comparables</h4>
|
|
160
|
-
<table class="cmp" style="margin-top:3mm">
|
|
161
|
-
<tr><th>Date</th><th>Address</th><th>Type</th><th style="text-align:right">Price</th></tr>
|
|
162
|
-
<!-- REPLACE: sold_comps_rows -->
|
|
163
|
-
</table>
|
|
164
|
-
</div>
|
|
165
|
-
<div class="panel">
|
|
166
|
-
<h4>Live asking comparables</h4>
|
|
167
|
-
<div class="ask-grid" style="margin-top:3mm">
|
|
168
|
-
<!-- REPLACE: asking_comps_tiles -->
|
|
169
|
-
</div>
|
|
170
|
-
</div>
|
|
218
|
+
<div class="kpis">
|
|
219
|
+
<div class="kpi subject"><div class="label">Floor area</div><div class="value"><!-- REPLACE: kpi_subject_sqft --></div><div class="sub"><!-- REPLACE: kpi_subject_sqft_sub --></div></div>
|
|
220
|
+
<div class="kpi subject"><div class="label">Bedrooms</div><div class="value"><!-- REPLACE: kpi_subject_beds --></div><div class="sub">As recorded</div></div>
|
|
221
|
+
<div class="kpi subject"><div class="label">EPC rating</div><div class="value"><!-- REPLACE: kpi_subject_epc --></div><div class="sub"><!-- REPLACE: kpi_subject_epc_sub --></div></div>
|
|
222
|
+
<div class="kpi subject"><div class="label">Type</div><div class="value" style="font-size:16pt"><!-- REPLACE: kpi_subject_type --></div><div class="sub"><!-- REPLACE: kpi_subject_tenure --></div></div>
|
|
171
223
|
</div>
|
|
172
|
-
|
|
224
|
+
<!-- REPLACE: valuation_block -->
|
|
225
|
+
<p class="muted" style="margin-top:6mm;max-width:170mm"><!-- REPLACE: subject_narrative --></p>
|
|
226
|
+
<div class="doc-foot"><span><!-- REPLACE: brand_name --> · Property Intelligence</span><span>02</span></div>
|
|
173
227
|
</section>
|
|
174
228
|
|
|
175
|
-
<!-- PAGE 3 —
|
|
229
|
+
<!-- PAGE 3 — MARKET CONTEXT -->
|
|
176
230
|
<section class="page">
|
|
177
231
|
<header class="doc-head">
|
|
178
|
-
|
|
179
|
-
<div class="breadcrumb">
|
|
232
|
+
<!-- REPLACE: wordmark_dark -->
|
|
233
|
+
<div class="breadcrumb">Market context · <!-- REPLACE: postcode --> · <!-- REPLACE: generated --></div>
|
|
180
234
|
</header>
|
|
181
|
-
<div class="eyebrow">
|
|
182
|
-
<h2 style="margin-top:3mm"><!-- REPLACE:
|
|
183
|
-
<div class="
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
<div class="kpi"><div class="label">
|
|
187
|
-
<div class="kpi"><div class="label">
|
|
235
|
+
<div class="eyebrow">Market summary</div>
|
|
236
|
+
<h2 style="margin-top:3mm"><!-- REPLACE: summary_headline --></h2>
|
|
237
|
+
<div class="summary" style="max-width:170mm"><!-- REPLACE: summary_paragraphs --></div>
|
|
238
|
+
<div style="height:5mm"></div>
|
|
239
|
+
<div class="kpis three">
|
|
240
|
+
<div class="kpi gold"><div class="label">Average asking £</div><div class="value"><!-- REPLACE: kpi_avg_asking --></div><div class="sub">Current listings · <!-- REPLACE: postcode --></div></div>
|
|
241
|
+
<div class="kpi"><div class="label">Average sold £</div><div class="value"><!-- REPLACE: kpi_avg_sold --></div><div class="sub">Completed transactions</div></div>
|
|
242
|
+
<div class="kpi"><div class="label">Price per sq ft</div><div class="value"><!-- REPLACE: kpi_psf --></div><div class="sub">Asking-price basis</div></div>
|
|
188
243
|
</div>
|
|
189
|
-
<div class="two-col">
|
|
190
|
-
<div class="panel">
|
|
191
|
-
<h4>
|
|
192
|
-
<div
|
|
193
|
-
|
|
244
|
+
<div class="two-col" style="align-items:stretch">
|
|
245
|
+
<div class="panel banded" style="display:flex;flex-direction:column">
|
|
246
|
+
<h4>Price growth</h4>
|
|
247
|
+
<div style="display:flex;align-items:baseline;gap:4mm;margin-top:3mm">
|
|
248
|
+
<span style="font-family:var(--display);font-style:italic;font-weight:500;font-size:30pt;color:var(--teal-900);line-height:1;letter-spacing:-.5pt"><!-- REPLACE: kpi_yoy --></span>
|
|
249
|
+
<span class="muted" style="font-style:italic">year on year</span>
|
|
194
250
|
</div>
|
|
251
|
+
<p class="muted" style="margin-top:3mm"><!-- REPLACE: price_growth_note --></p>
|
|
195
252
|
</div>
|
|
196
|
-
<div class="panel
|
|
197
|
-
<h4>
|
|
198
|
-
<
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
253
|
+
<div class="panel" style="display:flex;flex-direction:column">
|
|
254
|
+
<h4>Demand rating</h4>
|
|
255
|
+
<div style="margin-top:3mm"><span class="pill"><!-- REPLACE: demand_rating --></span></div>
|
|
256
|
+
<div class="gauge"><div class="gauge-track"><div class="gauge-fill"></div><div class="gauge-marker" style="left:<!-- REPLACE: gauge_position -->"></div></div></div>
|
|
257
|
+
<div class="gauge-ends"><span>Buyer's market</span><span>Seller's market</span></div>
|
|
258
|
+
<p class="muted" style="margin-top:4mm"><!-- REPLACE: demand_note --></p>
|
|
202
259
|
</div>
|
|
203
260
|
</div>
|
|
204
|
-
<div class="
|
|
261
|
+
<div class="panel" style="margin-top:5mm">
|
|
262
|
+
<h4>7-year price trend · £ and £/sqft</h4>
|
|
263
|
+
<!-- REPLACE: spark_svg -->
|
|
264
|
+
<div class="legend"><span><span class="sw"></span>Average £</span><span><span class="sw gold"></span>£/sqft</span></div>
|
|
265
|
+
</div>
|
|
266
|
+
<div class="doc-foot"><span><!-- REPLACE: brand_name --> · Property Intelligence</span><span>03</span></div>
|
|
205
267
|
</section>
|
|
206
268
|
|
|
207
|
-
<!-- PAGE 4 —
|
|
269
|
+
<!-- PAGE 4 — COMPARABLES (FULL-WIDTH, STACKED) -->
|
|
208
270
|
<section class="page">
|
|
209
271
|
<header class="doc-head">
|
|
210
|
-
|
|
211
|
-
<div class="breadcrumb">
|
|
272
|
+
<!-- REPLACE: wordmark_dark -->
|
|
273
|
+
<div class="breadcrumb">Comparables · <!-- REPLACE: postcode --> · <!-- REPLACE: generated --></div>
|
|
212
274
|
</header>
|
|
213
|
-
<div class="eyebrow">
|
|
214
|
-
<h2 style="margin-top:3mm">
|
|
215
|
-
<div class="
|
|
216
|
-
<
|
|
217
|
-
<
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
<div class="two-col" style="grid-template-columns:1.4fr .6fr">
|
|
222
|
-
<div class="panel">
|
|
223
|
-
<h4>7-year price trend · £ and £/sqft</h4>
|
|
224
|
-
<!-- REPLACE: spark_svg -->
|
|
225
|
-
<div class="legend"><span><span class="sw"></span>Average £</span><span><span class="sw gold"></span>£/sqft</span></div>
|
|
226
|
-
</div>
|
|
227
|
-
<div class="panel banded">
|
|
228
|
-
<h4>Rental side</h4>
|
|
229
|
-
<div style="margin-top:3mm"><span class="pill"><!-- REPLACE: rental_rating --></span></div>
|
|
230
|
-
<table class="cmp" style="margin-top:4mm">
|
|
231
|
-
<tr><td>Days on market</td><td class="num"><!-- REPLACE: rental_dom --></td></tr>
|
|
232
|
-
<tr><td>Turnover / month</td><td class="num"><!-- REPLACE: rental_turnover --></td></tr>
|
|
233
|
-
<tr><td>For rent</td><td class="num"><!-- REPLACE: rental_for_rent --></td></tr>
|
|
234
|
-
</table>
|
|
235
|
-
</div>
|
|
275
|
+
<div class="eyebrow">Evidence</div>
|
|
276
|
+
<h2 style="margin-top:3mm;margin-bottom:5mm">The comparables behind the range.</h2>
|
|
277
|
+
<div class="panel banded">
|
|
278
|
+
<h4>Nearest sold transactions · Land Registry</h4>
|
|
279
|
+
<table class="cmp" style="margin-top:3mm">
|
|
280
|
+
<tr><th>Date</th><th>Address</th><th>Type</th><th style="text-align:right">Price</th></tr>
|
|
281
|
+
<!-- REPLACE: sold_comps_rows -->
|
|
282
|
+
</table>
|
|
236
283
|
</div>
|
|
237
284
|
<div class="panel" style="margin-top:5mm">
|
|
238
|
-
<h4>
|
|
239
|
-
<div class="
|
|
240
|
-
<!-- REPLACE:
|
|
285
|
+
<h4>Live asking comparables</h4>
|
|
286
|
+
<div class="ask-grid" style="margin-top:3mm">
|
|
287
|
+
<!-- REPLACE: asking_comps_tiles -->
|
|
241
288
|
</div>
|
|
242
289
|
</div>
|
|
290
|
+
<div class="doc-foot"><span><!-- REPLACE: brand_name --> · Property Intelligence</span><span>04</span></div>
|
|
291
|
+
</section>
|
|
292
|
+
|
|
293
|
+
<!-- PAGE 5 — AGENT LISTINGS + SOURCES -->
|
|
294
|
+
<section class="page">
|
|
295
|
+
<header class="doc-head">
|
|
296
|
+
<!-- REPLACE: wordmark_dark -->
|
|
297
|
+
<div class="breadcrumb">Recently with <!-- REPLACE: brand_name --> · <!-- REPLACE: postcode --></div>
|
|
298
|
+
</header>
|
|
299
|
+
<div class="eyebrow">Recently with <!-- REPLACE: brand_name --></div>
|
|
300
|
+
<h2 style="margin-top:3mm;margin-bottom:2mm">What we have been delivering nearby.</h2>
|
|
301
|
+
<p class="muted" style="max-width:170mm">A selection of recent sales, properties under offer and live instructions handled by <!-- REPLACE: brand_name -->. If you would like the same outcome on <!-- REPLACE: address_short -->, we would welcome a conversation.</p>
|
|
302
|
+
<div class="listings"><!-- REPLACE: agent_listings_cards --></div>
|
|
243
303
|
<div class="sources">
|
|
244
304
|
<h4>Sources & methodology</h4>
|
|
245
|
-
<p><strong>Sources.</strong> PropertyData (asking, sold, demand, growth, crime, flood, council tax, property-type mix). HM Land Registry (sold transactions). Home Office (recorded crime). Environment Agency (flood risk). Valuation Office Agency (council-tax bands).</p>
|
|
246
|
-
<p><strong>Method.</strong> Twelve PropertyData endpoints called on the postcode derived from the address. £/sqft
|
|
305
|
+
<p><strong>Sources.</strong> PropertyData (asking, sold, demand, growth, crime, flood, council tax, property-type mix). HM Land Registry (sold transactions). Home Office (recorded crime). Environment Agency (flood risk). Valuation Office Agency (council-tax bands). Department for Levelling Up, Housing & Communities — EPC register (subject floor area & energy rating).</p>
|
|
306
|
+
<p><strong>Method.</strong> Twelve PropertyData endpoints called on the postcode derived from the address, plus one EPC lookup on the subject address. Valuation range = subject floor area × the Land Registry 70-percent £/sqft band, with operator-supplied adjustments applied linearly. Live and recent listings shown on the previous page were picked by <!-- REPLACE: brand_name -->.</p>
|
|
247
307
|
<p><strong>Accuracy.</strong> Property data can change rapidly. Figures are estimates — obtain independent professional advice for specific decisions. This pack is not financial or investment advice.</p>
|
|
248
308
|
</div>
|
|
249
|
-
<div class="doc-foot"><span
|
|
309
|
+
<div class="doc-foot"><span><!-- REPLACE: brand_name --> · Generated <!-- REPLACE: generated --> · <!-- REPLACE: postcode --></span><span>05</span></div>
|
|
250
310
|
</section>
|
|
251
311
|
|
|
252
312
|
</body>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,oBAAoB,CAAA;AACrE,OAAO,EAA0E,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAIzH,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAA;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AA6E3D,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACvF,KAAK,EAAE,YAAY,CAAA;IACnB,OAAO,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;CAC/B;AAoHD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,oBAAoB,CAAA;AACrE,OAAO,EAA0E,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAIzH,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAA;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AA6E3D,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACvF,KAAK,EAAE,YAAY,CAAA;IACnB,OAAO,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;CAC/B;AAoHD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CA8sBjD"}
|
|
@@ -308,11 +308,15 @@ export function buildHttpApp(deps) {
|
|
|
308
308
|
const model = typeof body.model === 'string' && /^[A-Za-z0-9._-]{1,64}$/.test(body.model)
|
|
309
309
|
? body.model
|
|
310
310
|
: undefined;
|
|
311
|
+
const initialMessage = typeof body.initialMessage === 'string' && body.initialMessage.length > 0
|
|
312
|
+
? body.initialMessage
|
|
313
|
+
: undefined;
|
|
311
314
|
const aboutOwnerShape = body.aboutOwner == null ? 'absent' : (typeof body.aboutOwner === 'object' ? 'object' : typeof body.aboutOwner);
|
|
312
315
|
const dormantPluginsShape = Array.isArray(body.dormantPlugins)
|
|
313
316
|
? `array(${body.dormantPlugins.length})`
|
|
314
317
|
: body.dormantPlugins == null ? 'absent' : typeof body.dormantPlugins;
|
|
315
|
-
|
|
318
|
+
const initialMessageBytes = typeof body.initialMessage === 'string' ? Buffer.byteLength(body.initialMessage, 'utf8') : 0;
|
|
319
|
+
deps.logger(`spawn-request senderId=${senderId || 'missing'} role=${role || 'missing'} channel=${channel || 'missing'} permissionMode=${typeof body.permissionMode === 'string' ? body.permissionMode : 'default'} channels=${Array.isArray(body.channels) ? body.channels.length : 0} attachmentDir=${typeof body.attachmentDir === 'string' ? 'set' : 'absent'} aboutOwner=${aboutOwnerShape} dormantPlugins=${dormantPluginsShape} tunnelUrl=${typeof body.tunnelUrl === 'string' ? 'set' : (body.tunnelUrl === null ? 'null' : 'absent')} initialMessageBytes=${initialMessageBytes}`);
|
|
316
320
|
if (!senderId || !ROLES.includes(role) || !CHANNELS.includes(channel)) {
|
|
317
321
|
timed(deps.logger, 'POST', '/spawn', 400, Date.now() - start);
|
|
318
322
|
return c.json({ error: 'invalid-arguments', detail: { senderId: !!senderId, role, channel } }, 400);
|
|
@@ -360,6 +364,7 @@ export function buildHttpApp(deps) {
|
|
|
360
364
|
hidden,
|
|
361
365
|
specialist,
|
|
362
366
|
model,
|
|
367
|
+
initialMessage,
|
|
363
368
|
});
|
|
364
369
|
if (!result.ok) {
|
|
365
370
|
if ('rejected' in result) {
|