@homepages/template-kit 0.8.1-dev-20260718224903 → 0.9.0-dev-20260719224319
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 +61 -1
- package/README.md +2 -2
- package/dist/canvas-core/chrome-css.d.ts +24 -0
- package/dist/canvas-core/chrome-css.js +403 -0
- package/dist/canvas-core/chrome.d.ts +49 -0
- package/dist/canvas-core/chrome.js +147 -0
- package/dist/canvas-core/frame.d.ts +20 -0
- package/dist/canvas-core/frame.js +23 -0
- package/dist/canvas-core/hidden-tabs.d.ts +16 -0
- package/dist/canvas-core/hidden-tabs.js +84 -0
- package/dist/canvas-core/resolve-target.js +55 -0
- package/dist/canvas-core/scroll.d.ts +10 -0
- package/dist/canvas-core/scroll.js +15 -0
- package/dist/canvas-core/section-dom.d.ts +6 -0
- package/dist/canvas-core/section-dom.js +43 -0
- package/dist/canvas-core/srcdoc.d.ts +8 -0
- package/dist/canvas-core/srcdoc.js +77 -0
- package/dist/canvas-core/types.d.ts +76 -0
- package/dist/canvas-core.d.ts +9 -0
- package/dist/canvas-core.js +9 -0
- package/dist/cli/check/css.js +2 -2
- package/dist/cli/check/loader.js +1 -1
- package/dist/cli/check/stages/deps.js +1 -1
- package/dist/cli/check/stages/render.js +3 -2
- package/dist/cli/check/stages/size.js +2 -2
- package/dist/cli/check/stages/tree.js +1 -1
- package/dist/cli/check/stages/validate/index.js +1 -1
- package/dist/cli/check/stages/validate/nav-contract.js +4 -3
- package/dist/cli/check/stages/validate/orchestrator.js +1 -1
- package/dist/cli/check/workspace.js +2 -2
- package/dist/cli/dev/build-css.js +1 -1
- package/dist/cli/dev/discover.js +2 -2
- package/dist/cli/dev/inspect.js +1 -1
- package/dist/cli/dev/island-bootstrap.js +1 -1
- package/dist/cli/dev/island-canvas-bootstrap.js +37 -5
- package/dist/cli/dev/section-page.js +1 -1
- package/dist/cli/dev/server.js +12 -5
- package/dist/cli/dev/tailwind.js +1 -1
- package/dist/cli/dev/tsconfig-paths-plugin.js +1 -1
- package/dist/cli/dev/workspace.js +2 -2
- package/dist/cli/link/index.js +1 -1
- package/dist/cli/link/overlay.js +1 -1
- package/dist/cli/new/emit.js +1 -1
- package/dist/cli/new/index.js +1 -1
- package/dist/cli/new/scaffold/template/sections/hero/fixtures.ts +4 -4
- package/dist/cli/new/scaffold-assets.js +2 -2
- package/dist/cli/pack/collect.js +1 -1
- package/dist/cli/pack/guards.js +1 -1
- package/dist/cli/pack/index.js +1 -1
- package/dist/cli/theme/generate.js +1 -1
- package/dist/cli/theme/load-theme.js +1 -1
- package/dist/dev-client/assets/index-CJa9G1Na.css +1 -0
- package/dist/dev-client/assets/index-C_1atZs4.js +450 -0
- package/dist/dev-client/index.html +2 -2
- package/dist/fixtures/sample-property.d.ts +4 -7
- package/dist/fixtures/sample-property.js +41 -97
- package/dist/fixtures/scenario.d.ts +1 -1
- package/dist/fixtures/scenarios/for-rent-condo.js +24 -44
- package/dist/fixtures/scenarios/luxury-multi-unit.js +1 -1
- package/dist/fixtures/scenarios/sparse-single-family.js +14 -26
- package/dist/fixtures.d.ts +2 -2
- package/dist/fixtures.js +1 -2
- package/dist/islands/client-directive.d.ts +7 -0
- package/dist/{eslint/is-client-file.js → islands/client-directive.js} +6 -3
- package/dist/islands/detect.d.ts +1 -1
- package/dist/islands/detect.js +1 -1
- package/dist/islands/discover.js +1 -1
- package/dist/islands/esbuild-plugin.js +1 -1
- package/dist/islands/wrap.js +1 -1
- package/dist/manifest.json +940 -0
- package/dist/media/pack.d.ts +49 -0
- package/dist/media/pack.js +69 -0
- package/dist/media/resolve-fixture-media.js +73 -0
- package/dist/media/resolve-media.js +195 -0
- package/dist/package.js +1 -1
- package/dist/rules.d.ts +176 -0
- package/dist/rules.js +209 -0
- package/dist/schema/property-facts.d.ts +2 -2
- package/dist/ssr.d.ts +14 -2
- package/dist/ssr.js +28 -13
- package/dist/tokens.css +21 -0
- package/guide/INDEX.md +2 -2
- package/guide/check.md +5 -5
- package/guide/dev.md +39 -30
- package/guide/eslint.md +13 -10
- package/guide/llms.txt +4 -3
- package/guide/quickstart.md +1 -1
- package/guide/recipes/image-slot-crop.md +6 -6
- package/guide/recipes/pick-a-scenario.md +13 -5
- package/guide/rules/INDEX.md +3 -2
- package/guide/schema-system.md +36 -12
- package/guide/upgrading.md +18 -2
- package/package.json +8 -4
- package/tsconfig.json +1 -1
- package/dist/dev-client/assets/index-3Gn34X_P.js +0 -50
- package/dist/dev-client/assets/index-DxQeiHfu.css +0 -1
- package/dist/eslint/is-client-file.d.ts +0 -4
- package/dist/eslint/rules/image-bare-needs-reason.js +0 -43
- package/dist/eslint/rules/no-client-directive-in-contract.js +0 -31
- package/dist/eslint/rules/no-client-runtime-in-server.js +0 -103
- package/dist/eslint/rules/no-css-import-from-render-path.js +0 -29
- package/dist/eslint/rules/no-hex.js +0 -188
- package/dist/eslint/rules/no-inline-style.js +0 -27
- package/dist/eslint/rules/no-nondeterminism.js +0 -48
- package/dist/eslint/rules/no-raw-element.js +0 -38
- package/dist/eslint/rules/props-from-schema.js +0 -37
- package/dist/eslint/rules/require-island-editor.js +0 -74
- package/dist/eslint/rules/serializable-island-props.js +0 -112
- package/dist/eslint/rules/slot-marker-literal.js +0 -38
- package/dist/eslint.d.ts +0 -6
- package/dist/eslint.js +0 -80
- package/dist/rules/registry.js +0 -16
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
6
|
<title>template-kit dev</title>
|
|
7
|
-
<script type="module" crossorigin src="/dev-client/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/dev-client/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/dev-client/assets/index-C_1atZs4.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/dev-client/assets/index-CJa9G1Na.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
import { ResponsiveImage } from "../contracts/image-descriptor.js";
|
|
2
1
|
//#region src/fixtures/sample-property.d.ts
|
|
3
2
|
type PhotoFixture = {
|
|
4
3
|
id: string;
|
|
5
|
-
url: string;
|
|
6
4
|
alt: string;
|
|
7
5
|
tags: {
|
|
8
6
|
room?: string;
|
|
9
7
|
category?: string;
|
|
10
8
|
};
|
|
11
9
|
};
|
|
12
|
-
declare function mkResponsive(url: string, width: number, height: number): ResponsiveImage;
|
|
13
10
|
type PoiFixture = {
|
|
14
11
|
id: string;
|
|
15
12
|
category: "restaurant" | "park" | "transit" | "shopping" | "coffee" | "fitness";
|
|
@@ -31,14 +28,14 @@ type ContactFixture = {
|
|
|
31
28
|
display_name: string;
|
|
32
29
|
title: string;
|
|
33
30
|
bio: string;
|
|
34
|
-
|
|
31
|
+
headshot_id: string;
|
|
35
32
|
website_url: string;
|
|
36
33
|
email: string;
|
|
37
34
|
phone: string;
|
|
38
35
|
address: string;
|
|
39
36
|
org_name: string;
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
logo_light_id: string | null;
|
|
38
|
+
logo_dark_id: string | null;
|
|
42
39
|
socials: Array<{
|
|
43
40
|
platform: "instagram" | "linkedin" | "x" | "facebook";
|
|
44
41
|
url: string;
|
|
@@ -54,4 +51,4 @@ type AmenityItem = {
|
|
|
54
51
|
items: string[];
|
|
55
52
|
};
|
|
56
53
|
//#endregion
|
|
57
|
-
export { AmenityItem, ContactFixture, PhotoFixture, PoiFixture
|
|
54
|
+
export { AmenityItem, ContactFixture, PhotoFixture, PoiFixture };
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
//#region src/fixtures/sample-property.ts
|
|
2
|
-
const PHOTO_BASE = "https://example.invalid/photos/queensway";
|
|
3
2
|
const galleryPhotos = [
|
|
4
3
|
{
|
|
5
|
-
id: "
|
|
6
|
-
url: `${PHOTO_BASE}/01-lobby.jpg`,
|
|
4
|
+
id: "dev_upl_queensway_01_lobby",
|
|
7
5
|
alt: "Lobby with terrazzo flooring and chandeliers.",
|
|
8
6
|
tags: {
|
|
9
7
|
room: "lobby",
|
|
@@ -11,8 +9,7 @@ const galleryPhotos = [
|
|
|
11
9
|
}
|
|
12
10
|
},
|
|
13
11
|
{
|
|
14
|
-
id: "
|
|
15
|
-
url: `${PHOTO_BASE}/02-gym-a.jpg`,
|
|
12
|
+
id: "dev_upl_queensway_02_gym_a",
|
|
16
13
|
alt: "Gym with cardio equipment and floor-to-ceiling mirrors.",
|
|
17
14
|
tags: {
|
|
18
15
|
room: "gym",
|
|
@@ -20,8 +17,7 @@ const galleryPhotos = [
|
|
|
20
17
|
}
|
|
21
18
|
},
|
|
22
19
|
{
|
|
23
|
-
id: "
|
|
24
|
-
url: `${PHOTO_BASE}/03-gym-b.jpg`,
|
|
20
|
+
id: "dev_upl_queensway_03_gym_b",
|
|
25
21
|
alt: "Gym free-weights area.",
|
|
26
22
|
tags: {
|
|
27
23
|
room: "gym",
|
|
@@ -29,8 +25,7 @@ const galleryPhotos = [
|
|
|
29
25
|
}
|
|
30
26
|
},
|
|
31
27
|
{
|
|
32
|
-
id: "
|
|
33
|
-
url: `${PHOTO_BASE}/04-living-a.jpg`,
|
|
28
|
+
id: "dev_upl_queensway_04_living_a",
|
|
34
29
|
alt: "Living area with bay windows and original mouldings.",
|
|
35
30
|
tags: {
|
|
36
31
|
room: "living",
|
|
@@ -38,8 +33,7 @@ const galleryPhotos = [
|
|
|
38
33
|
}
|
|
39
34
|
},
|
|
40
35
|
{
|
|
41
|
-
id: "
|
|
42
|
-
url: `${PHOTO_BASE}/05-living-b.jpg`,
|
|
36
|
+
id: "dev_upl_queensway_05_living_b",
|
|
43
37
|
alt: "Living area facing the fireplace.",
|
|
44
38
|
tags: {
|
|
45
39
|
room: "living",
|
|
@@ -47,8 +41,7 @@ const galleryPhotos = [
|
|
|
47
41
|
}
|
|
48
42
|
},
|
|
49
43
|
{
|
|
50
|
-
id: "
|
|
51
|
-
url: `${PHOTO_BASE}/06-kitchen-a.jpg`,
|
|
44
|
+
id: "dev_upl_queensway_06_kitchen_a",
|
|
52
45
|
alt: "Kitchen with quartz waterfall island.",
|
|
53
46
|
tags: {
|
|
54
47
|
room: "kitchen",
|
|
@@ -56,8 +49,7 @@ const galleryPhotos = [
|
|
|
56
49
|
}
|
|
57
50
|
},
|
|
58
51
|
{
|
|
59
|
-
id: "
|
|
60
|
-
url: `${PHOTO_BASE}/07-kitchen-b.jpg`,
|
|
52
|
+
id: "dev_upl_queensway_07_kitchen_b",
|
|
61
53
|
alt: "Kitchen breakfast nook by the window.",
|
|
62
54
|
tags: {
|
|
63
55
|
room: "kitchen",
|
|
@@ -65,8 +57,7 @@ const galleryPhotos = [
|
|
|
65
57
|
}
|
|
66
58
|
},
|
|
67
59
|
{
|
|
68
|
-
id: "
|
|
69
|
-
url: `${PHOTO_BASE}/08-dining.jpg`,
|
|
60
|
+
id: "dev_upl_queensway_08_dining",
|
|
70
61
|
alt: "Dining area set for six.",
|
|
71
62
|
tags: {
|
|
72
63
|
room: "dining",
|
|
@@ -74,8 +65,7 @@ const galleryPhotos = [
|
|
|
74
65
|
}
|
|
75
66
|
},
|
|
76
67
|
{
|
|
77
|
-
id: "
|
|
78
|
-
url: `${PHOTO_BASE}/09-living-c.jpg`,
|
|
68
|
+
id: "dev_upl_queensway_09_living_c",
|
|
79
69
|
alt: "Living area with statement art wall.",
|
|
80
70
|
tags: {
|
|
81
71
|
room: "living",
|
|
@@ -83,8 +73,7 @@ const galleryPhotos = [
|
|
|
83
73
|
}
|
|
84
74
|
},
|
|
85
75
|
{
|
|
86
|
-
id: "
|
|
87
|
-
url: `${PHOTO_BASE}/10-living-d.jpg`,
|
|
76
|
+
id: "dev_upl_queensway_10_living_d",
|
|
88
77
|
alt: "Living area opening onto private terrace.",
|
|
89
78
|
tags: {
|
|
90
79
|
room: "living",
|
|
@@ -92,8 +81,7 @@ const galleryPhotos = [
|
|
|
92
81
|
}
|
|
93
82
|
},
|
|
94
83
|
{
|
|
95
|
-
id: "
|
|
96
|
-
url: `${PHOTO_BASE}/11-living-e.jpg`,
|
|
84
|
+
id: "dev_upl_queensway_11_living_e",
|
|
97
85
|
alt: "Sunken living area with built-in shelving.",
|
|
98
86
|
tags: {
|
|
99
87
|
room: "living",
|
|
@@ -101,8 +89,7 @@ const galleryPhotos = [
|
|
|
101
89
|
}
|
|
102
90
|
},
|
|
103
91
|
{
|
|
104
|
-
id: "
|
|
105
|
-
url: `${PHOTO_BASE}/12-living-f.jpg`,
|
|
92
|
+
id: "dev_upl_queensway_12_living_f",
|
|
106
93
|
alt: "Living area corner with reading chair.",
|
|
107
94
|
tags: {
|
|
108
95
|
room: "living",
|
|
@@ -110,8 +97,7 @@ const galleryPhotos = [
|
|
|
110
97
|
}
|
|
111
98
|
},
|
|
112
99
|
{
|
|
113
|
-
id: "
|
|
114
|
-
url: `${PHOTO_BASE}/13-master-bedroom.jpg`,
|
|
100
|
+
id: "dev_upl_queensway_13_master_bedroom",
|
|
115
101
|
alt: "Primary bedroom with king bed and skylight.",
|
|
116
102
|
tags: {
|
|
117
103
|
room: "bedroom",
|
|
@@ -119,8 +105,7 @@ const galleryPhotos = [
|
|
|
119
105
|
}
|
|
120
106
|
},
|
|
121
107
|
{
|
|
122
|
-
id: "
|
|
123
|
-
url: `${PHOTO_BASE}/14-master-bath-a.jpg`,
|
|
108
|
+
id: "dev_upl_queensway_14_master_bath_a",
|
|
124
109
|
alt: "Spa-style primary bath with freestanding tub.",
|
|
125
110
|
tags: {
|
|
126
111
|
room: "bath",
|
|
@@ -128,8 +113,7 @@ const galleryPhotos = [
|
|
|
128
113
|
}
|
|
129
114
|
},
|
|
130
115
|
{
|
|
131
|
-
id: "
|
|
132
|
-
url: `${PHOTO_BASE}/15-master-bath-b.jpg`,
|
|
116
|
+
id: "dev_upl_queensway_15_master_bath_b",
|
|
133
117
|
alt: "Primary bath double vanity and shower.",
|
|
134
118
|
tags: {
|
|
135
119
|
room: "bath",
|
|
@@ -137,8 +121,7 @@ const galleryPhotos = [
|
|
|
137
121
|
}
|
|
138
122
|
},
|
|
139
123
|
{
|
|
140
|
-
id: "
|
|
141
|
-
url: `${PHOTO_BASE}/16-common-bath.jpg`,
|
|
124
|
+
id: "dev_upl_queensway_16_common_bath",
|
|
142
125
|
alt: "Common bath with marble subway tile.",
|
|
143
126
|
tags: {
|
|
144
127
|
room: "bath",
|
|
@@ -146,8 +129,7 @@ const galleryPhotos = [
|
|
|
146
129
|
}
|
|
147
130
|
},
|
|
148
131
|
{
|
|
149
|
-
id: "
|
|
150
|
-
url: `${PHOTO_BASE}/17-entrance.jpg`,
|
|
132
|
+
id: "dev_upl_queensway_17_entrance",
|
|
151
133
|
alt: "Entrance foyer with original mosaic floor.",
|
|
152
134
|
tags: {
|
|
153
135
|
room: "entry",
|
|
@@ -155,8 +137,7 @@ const galleryPhotos = [
|
|
|
155
137
|
}
|
|
156
138
|
},
|
|
157
139
|
{
|
|
158
|
-
id: "
|
|
159
|
-
url: `${PHOTO_BASE}/18-patio.jpg`,
|
|
140
|
+
id: "dev_upl_queensway_18_patio",
|
|
160
141
|
alt: "Patio with built-in seating and planters.",
|
|
161
142
|
tags: {
|
|
162
143
|
room: "patio",
|
|
@@ -164,8 +145,7 @@ const galleryPhotos = [
|
|
|
164
145
|
}
|
|
165
146
|
},
|
|
166
147
|
{
|
|
167
|
-
id: "
|
|
168
|
-
url: `${PHOTO_BASE}/19-outdoor-deck.jpg`,
|
|
148
|
+
id: "dev_upl_queensway_19_outdoor_deck",
|
|
169
149
|
alt: "Outdoor deck with sunset view.",
|
|
170
150
|
tags: {
|
|
171
151
|
room: "deck",
|
|
@@ -173,8 +153,7 @@ const galleryPhotos = [
|
|
|
173
153
|
}
|
|
174
154
|
},
|
|
175
155
|
{
|
|
176
|
-
id: "
|
|
177
|
-
url: `${PHOTO_BASE}/20-exterior-hero.jpg`,
|
|
156
|
+
id: "dev_upl_queensway_20_exterior_hero",
|
|
178
157
|
alt: "Mansard victorian facade at golden hour.",
|
|
179
158
|
tags: {
|
|
180
159
|
room: "exterior-front",
|
|
@@ -183,56 +162,21 @@ const galleryPhotos = [
|
|
|
183
162
|
}
|
|
184
163
|
];
|
|
185
164
|
const allPhotos = galleryPhotos;
|
|
186
|
-
|
|
187
|
-
320,
|
|
188
|
-
640,
|
|
189
|
-
960,
|
|
190
|
-
1200,
|
|
191
|
-
1600,
|
|
192
|
-
2048
|
|
193
|
-
];
|
|
194
|
-
function mkResponsive(url, width, height) {
|
|
195
|
-
const widths = RUNG_WIDTHS.filter((w) => w <= width);
|
|
196
|
-
if (widths.length === 0) widths.push(width);
|
|
197
|
-
const ladder = (ext) => widths.map((w) => `${url}.${w}.${ext} ${w}w`).join(", ");
|
|
198
|
-
return {
|
|
199
|
-
sources: [
|
|
200
|
-
{
|
|
201
|
-
type: "image/avif",
|
|
202
|
-
srcset: ladder("avif")
|
|
203
|
-
},
|
|
204
|
-
{
|
|
205
|
-
type: "image/webp",
|
|
206
|
-
srcset: ladder("webp")
|
|
207
|
-
},
|
|
208
|
-
{
|
|
209
|
-
type: "image/jpeg",
|
|
210
|
-
srcset: ladder("jpg")
|
|
211
|
-
}
|
|
212
|
-
],
|
|
213
|
-
width,
|
|
214
|
-
height
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
const FP_BASE = "https://example.invalid/floorplans/queensway";
|
|
218
|
-
function fp(id, url, alt, floorLabel, position) {
|
|
165
|
+
function fp(id, floorLabel, position) {
|
|
219
166
|
return {
|
|
220
167
|
id,
|
|
221
|
-
url,
|
|
222
|
-
alt,
|
|
223
168
|
floor_label: floorLabel,
|
|
224
|
-
position
|
|
225
|
-
responsive: mkResponsive(url, 1024, 1024)
|
|
169
|
+
position
|
|
226
170
|
};
|
|
227
171
|
}
|
|
228
|
-
const FLOORPLAN_3BR = (suffix) => [fp(`
|
|
229
|
-
const FLOORPLAN_2BR = (suffix) => [fp(`
|
|
172
|
+
const FLOORPLAN_3BR = (suffix) => [fp(`dev_efp_queensway_3br_${suffix}_l1`, "Main Floor", 0), fp(`dev_efp_queensway_3br_${suffix}_l2`, "Upper Floor", 1)];
|
|
173
|
+
const FLOORPLAN_2BR = (suffix) => [fp(`dev_efp_queensway_2br_${suffix}_l1`, null, 0)];
|
|
230
174
|
const FLOORPLAN_4BR = (suffix) => [
|
|
231
|
-
fp(`
|
|
232
|
-
fp(`
|
|
233
|
-
fp(`
|
|
175
|
+
fp(`dev_efp_queensway_4br_${suffix}_l1`, "Main Floor", 0),
|
|
176
|
+
fp(`dev_efp_queensway_4br_${suffix}_l2`, "Upper Floor", 1),
|
|
177
|
+
fp(`dev_efp_queensway_4br_${suffix}_l3`, "Penthouse", 2)
|
|
234
178
|
];
|
|
235
|
-
const FLOORPLAN_STUDIO = (suffix) => [fp(`
|
|
179
|
+
const FLOORPLAN_STUDIO = (suffix) => [fp(`dev_efp_queensway_studio_${suffix}_l1`, null, 0)];
|
|
236
180
|
function unit(position, unitLabel, beds, baths, sqft, price, notes, description, features, floorPlans) {
|
|
237
181
|
return {
|
|
238
182
|
unit_id: `unit_${String(position + 1).padStart(2, "0")}`,
|
|
@@ -645,14 +589,14 @@ const sampleContacts = [
|
|
|
645
589
|
display_name: "James Donovan",
|
|
646
590
|
title: "Listing Agent",
|
|
647
591
|
bio: "James Donovan is a 15-year veteran of the Boston real estate market, specializing in historic multi-family conversions in Jamaica Plain and the South End. He has closed over $400M in residential transactions and is known for white-glove attention to multi-unit listings.",
|
|
648
|
-
|
|
592
|
+
headshot_id: "dev_lib_james_donovan",
|
|
649
593
|
website_url: "https://okane-marketing.example.invalid",
|
|
650
594
|
email: "info@homepages.io",
|
|
651
595
|
phone: "(617) 555-1068",
|
|
652
596
|
address: "677 Centre St, Suite 200, Jamaica Plain, MA 02130",
|
|
653
597
|
org_name: "Okane Marketing",
|
|
654
|
-
|
|
655
|
-
|
|
598
|
+
logo_light_id: "dev_lib_okane_logo_light",
|
|
599
|
+
logo_dark_id: "dev_lib_okane_logo_dark",
|
|
656
600
|
socials: [
|
|
657
601
|
{
|
|
658
602
|
platform: "instagram",
|
|
@@ -682,14 +626,14 @@ const sampleContacts = [
|
|
|
682
626
|
display_name: "Elena Marsh",
|
|
683
627
|
title: "Buyer's Agent",
|
|
684
628
|
bio: "Elena Marsh has guided over 120 buyer clients through the Boston multi-family market since joining the team in 2018, with a focus on Jamaica Plain, Roslindale, and West Roxbury first-time and investor purchases. She is a certified condo-conversion specialist and negotiates every offer personally.",
|
|
685
|
-
|
|
629
|
+
headshot_id: "dev_lib_elena_marsh",
|
|
686
630
|
website_url: "https://okane-marketing.example.invalid",
|
|
687
631
|
email: "elena@homepages.io",
|
|
688
632
|
phone: "(617) 555-2214",
|
|
689
633
|
address: "677 Centre St, Suite 200, Jamaica Plain, MA 02130",
|
|
690
634
|
org_name: "Okane Marketing",
|
|
691
|
-
|
|
692
|
-
|
|
635
|
+
logo_light_id: "dev_lib_okane_logo_light",
|
|
636
|
+
logo_dark_id: "dev_lib_okane_logo_dark",
|
|
693
637
|
socials: [{
|
|
694
638
|
platform: "instagram",
|
|
695
639
|
url: "https://instagram.com/elenamarsh.realty/"
|
|
@@ -708,14 +652,14 @@ const sampleContacts = [
|
|
|
708
652
|
display_name: "Marcus Webb",
|
|
709
653
|
title: "Director of Sales",
|
|
710
654
|
bio: "Marcus Webb leads the team's dispositions practice, working with investors and owner-occupants on multi-unit acquisitions and conversions across greater Boston. A former general contractor, he brings a builder's eye to every walkthrough and has overseen more than 60 multi-family closings.",
|
|
711
|
-
|
|
655
|
+
headshot_id: "dev_lib_marcus_webb",
|
|
712
656
|
website_url: "https://okane-marketing.example.invalid",
|
|
713
657
|
email: "marcus@homepages.io",
|
|
714
658
|
phone: "(617) 555-3357",
|
|
715
659
|
address: "677 Centre St, Suite 200, Jamaica Plain, MA 02130",
|
|
716
660
|
org_name: "Okane Marketing",
|
|
717
|
-
|
|
718
|
-
|
|
661
|
+
logo_light_id: "dev_lib_okane_logo_light",
|
|
662
|
+
logo_dark_id: "dev_lib_okane_logo_dark",
|
|
719
663
|
socials: [{
|
|
720
664
|
platform: "linkedin",
|
|
721
665
|
url: "https://linkedin.com/in/marcus-webb-realty/"
|
|
@@ -824,10 +768,10 @@ const sampleProperty = {
|
|
|
824
768
|
phone: c.fields.phone,
|
|
825
769
|
address: c.fields.address,
|
|
826
770
|
website_url: c.fields.website_url,
|
|
827
|
-
avatar_upload_id:
|
|
771
|
+
avatar_upload_id: c.fields.headshot_id,
|
|
828
772
|
org_name: c.fields.org_name,
|
|
829
|
-
logo_light_upload_id: c.fields.
|
|
830
|
-
logo_dark_upload_id: c.fields.
|
|
773
|
+
logo_light_upload_id: c.fields.logo_light_id,
|
|
774
|
+
logo_dark_upload_id: c.fields.logo_dark_id,
|
|
831
775
|
instagram_url: c.fields.socials.find((s) => s.platform === "instagram")?.url ?? null,
|
|
832
776
|
linkedin_url: c.fields.socials.find((s) => s.platform === "linkedin")?.url ?? null,
|
|
833
777
|
x_url: c.fields.socials.find((s) => s.platform === "x")?.url ?? null,
|
|
@@ -836,4 +780,4 @@ const sampleProperty = {
|
|
|
836
780
|
};
|
|
837
781
|
|
|
838
782
|
//#endregion
|
|
839
|
-
export { allPhotos,
|
|
783
|
+
export { allPhotos, sampleAmenities, sampleContacts, samplePois, sampleProperty };
|
|
@@ -3,7 +3,7 @@ import { AmenityItem, ContactFixture, PhotoFixture, PoiFixture } from "./sample-
|
|
|
3
3
|
//#region src/fixtures/scenario.d.ts
|
|
4
4
|
type ScenarioKey = "luxuryMultiUnit" | "sparseSingleFamily" | "forRentCondo";
|
|
5
5
|
type MediaFixture = {
|
|
6
|
-
|
|
6
|
+
video_id: string | null;
|
|
7
7
|
tour_3d_url: string | null;
|
|
8
8
|
};
|
|
9
9
|
type Scenario = {
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import { mkResponsive } from "../sample-property.js";
|
|
2
|
-
|
|
3
1
|
//#region src/fixtures/scenarios/for-rent-condo.ts
|
|
4
|
-
const PHOTO_BASE = "https://example.invalid/photos/pearl-street";
|
|
5
2
|
const photos = [
|
|
6
3
|
{
|
|
7
|
-
id: "
|
|
8
|
-
url: `${PHOTO_BASE}/01-exterior-front.jpg`,
|
|
4
|
+
id: "dev_upl_pearl_street_01_exterior_front",
|
|
9
5
|
alt: "Brick townhome exterior with a street-facing entry stoop.",
|
|
10
6
|
tags: {
|
|
11
7
|
room: "exterior-front",
|
|
@@ -13,8 +9,7 @@ const photos = [
|
|
|
13
9
|
}
|
|
14
10
|
},
|
|
15
11
|
{
|
|
16
|
-
id: "
|
|
17
|
-
url: `${PHOTO_BASE}/02-living.jpg`,
|
|
12
|
+
id: "dev_upl_pearl_street_02_living",
|
|
18
13
|
alt: "Living room with tall windows and exposed-beam ceiling.",
|
|
19
14
|
tags: {
|
|
20
15
|
room: "living",
|
|
@@ -22,8 +17,7 @@ const photos = [
|
|
|
22
17
|
}
|
|
23
18
|
},
|
|
24
19
|
{
|
|
25
|
-
id: "
|
|
26
|
-
url: `${PHOTO_BASE}/03-dining.jpg`,
|
|
20
|
+
id: "dev_upl_pearl_street_03_dining",
|
|
27
21
|
alt: "Open dining area beside the kitchen island.",
|
|
28
22
|
tags: {
|
|
29
23
|
room: "dining",
|
|
@@ -31,8 +25,7 @@ const photos = [
|
|
|
31
25
|
}
|
|
32
26
|
},
|
|
33
27
|
{
|
|
34
|
-
id: "
|
|
35
|
-
url: `${PHOTO_BASE}/04-kitchen.jpg`,
|
|
28
|
+
id: "dev_upl_pearl_street_04_kitchen",
|
|
36
29
|
alt: "Kitchen with stainless appliances and quartz counters.",
|
|
37
30
|
tags: {
|
|
38
31
|
room: "kitchen",
|
|
@@ -40,8 +33,7 @@ const photos = [
|
|
|
40
33
|
}
|
|
41
34
|
},
|
|
42
35
|
{
|
|
43
|
-
id: "
|
|
44
|
-
url: `${PHOTO_BASE}/05-primary-bedroom.jpg`,
|
|
36
|
+
id: "dev_upl_pearl_street_05_primary_bedroom",
|
|
45
37
|
alt: "Primary bedroom with a walk-in closet.",
|
|
46
38
|
tags: {
|
|
47
39
|
room: "bedroom",
|
|
@@ -49,8 +41,7 @@ const photos = [
|
|
|
49
41
|
}
|
|
50
42
|
},
|
|
51
43
|
{
|
|
52
|
-
id: "
|
|
53
|
-
url: `${PHOTO_BASE}/06-second-bedroom.jpg`,
|
|
44
|
+
id: "dev_upl_pearl_street_06_second_bedroom",
|
|
54
45
|
alt: "Second bedroom used as a home office.",
|
|
55
46
|
tags: {
|
|
56
47
|
room: "bedroom",
|
|
@@ -58,8 +49,7 @@ const photos = [
|
|
|
58
49
|
}
|
|
59
50
|
},
|
|
60
51
|
{
|
|
61
|
-
id: "
|
|
62
|
-
url: `${PHOTO_BASE}/07-primary-bath.jpg`,
|
|
52
|
+
id: "dev_upl_pearl_street_07_primary_bath",
|
|
63
53
|
alt: "Primary bath with a glass-enclosed shower.",
|
|
64
54
|
tags: {
|
|
65
55
|
room: "bath",
|
|
@@ -67,8 +57,7 @@ const photos = [
|
|
|
67
57
|
}
|
|
68
58
|
},
|
|
69
59
|
{
|
|
70
|
-
id: "
|
|
71
|
-
url: `${PHOTO_BASE}/08-powder-room.jpg`,
|
|
60
|
+
id: "dev_upl_pearl_street_08_powder_room",
|
|
72
61
|
alt: "Powder room off the main hallway.",
|
|
73
62
|
tags: {
|
|
74
63
|
room: "bath",
|
|
@@ -76,8 +65,7 @@ const photos = [
|
|
|
76
65
|
}
|
|
77
66
|
},
|
|
78
67
|
{
|
|
79
|
-
id: "
|
|
80
|
-
url: `${PHOTO_BASE}/09-balcony.jpg`,
|
|
68
|
+
id: "dev_upl_pearl_street_09_balcony",
|
|
81
69
|
alt: "Private balcony overlooking a landscaped courtyard.",
|
|
82
70
|
tags: {
|
|
83
71
|
room: "balcony",
|
|
@@ -85,8 +73,7 @@ const photos = [
|
|
|
85
73
|
}
|
|
86
74
|
},
|
|
87
75
|
{
|
|
88
|
-
id: "
|
|
89
|
-
url: `${PHOTO_BASE}/10-rooftop-deck.jpg`,
|
|
76
|
+
id: "dev_upl_pearl_street_10_rooftop_deck",
|
|
90
77
|
alt: "Shared rooftop deck with skyline views.",
|
|
91
78
|
tags: {
|
|
92
79
|
room: "rooftop",
|
|
@@ -94,7 +81,6 @@ const photos = [
|
|
|
94
81
|
}
|
|
95
82
|
}
|
|
96
83
|
];
|
|
97
|
-
const FP_BASE = "https://example.invalid/floorplans/pearl-street";
|
|
98
84
|
const units = [{
|
|
99
85
|
unit_id: "unit_04",
|
|
100
86
|
unit_label: "Unit 4",
|
|
@@ -113,19 +99,13 @@ const units = [{
|
|
|
113
99
|
],
|
|
114
100
|
position: 0,
|
|
115
101
|
floor_plans: [{
|
|
116
|
-
id: "
|
|
117
|
-
url: `${FP_BASE}/unit04-main.png`,
|
|
118
|
-
alt: "Unit 4 floor plan — main floor (living, dining, kitchen).",
|
|
102
|
+
id: "dev_efp_pearl_street_unit04_main",
|
|
119
103
|
floor_label: "Main Floor",
|
|
120
|
-
position: 0
|
|
121
|
-
responsive: mkResponsive(`${FP_BASE}/unit04-main.png`, 1024, 1024)
|
|
104
|
+
position: 0
|
|
122
105
|
}, {
|
|
123
|
-
id: "
|
|
124
|
-
url: `${FP_BASE}/unit04-upper.png`,
|
|
125
|
-
alt: "Unit 4 floor plan — upper floor (bedrooms, baths).",
|
|
106
|
+
id: "dev_efp_pearl_street_unit04_upper",
|
|
126
107
|
floor_label: "Upper Floor",
|
|
127
|
-
position: 1
|
|
128
|
-
responsive: mkResponsive(`${FP_BASE}/unit04-upper.png`, 1024, 1024)
|
|
108
|
+
position: 1
|
|
129
109
|
}]
|
|
130
110
|
}];
|
|
131
111
|
const pois = [
|
|
@@ -277,14 +257,14 @@ const contacts = [{
|
|
|
277
257
|
display_name: "Ngozi Okafor",
|
|
278
258
|
title: "Leasing Agent",
|
|
279
259
|
bio: "Ngozi Okafor leases condos and townhomes across Denver's Speer, Uptown, and Governor's Park neighborhoods, with a focus on responsive turnarounds for one-year leases and relocation clients.",
|
|
280
|
-
|
|
260
|
+
headshot_id: "dev_lib_ngozi_okafor",
|
|
281
261
|
website_url: "https://bluebird-realty-group.example.invalid",
|
|
282
262
|
email: "ngozi@homepages.io",
|
|
283
263
|
phone: "(720) 555-0173",
|
|
284
264
|
address: "845 Pearl Street, Denver, CO 80203",
|
|
285
265
|
org_name: "Bluebird Realty Group",
|
|
286
|
-
|
|
287
|
-
|
|
266
|
+
logo_light_id: "dev_lib_bluebird_logo_light",
|
|
267
|
+
logo_dark_id: "dev_lib_bluebird_logo_dark",
|
|
288
268
|
socials: [{
|
|
289
269
|
platform: "instagram",
|
|
290
270
|
url: "https://instagram.com/ngozileases/"
|
|
@@ -299,14 +279,14 @@ const contacts = [{
|
|
|
299
279
|
display_name: "Marco Bianchi",
|
|
300
280
|
title: "Property Manager",
|
|
301
281
|
bio: "Marco Bianchi manages day-to-day operations and maintenance for the Pearl Street townhome portfolio, coordinating move-ins, repairs, and lease renewals for residents.",
|
|
302
|
-
|
|
282
|
+
headshot_id: "dev_lib_marco_bianchi",
|
|
303
283
|
website_url: "https://bluebird-realty-group.example.invalid",
|
|
304
284
|
email: "marco@homepages.io",
|
|
305
285
|
phone: "(720) 555-0184",
|
|
306
286
|
address: "845 Pearl Street, Denver, CO 80203",
|
|
307
287
|
org_name: "Bluebird Realty Group",
|
|
308
|
-
|
|
309
|
-
|
|
288
|
+
logo_light_id: "dev_lib_bluebird_logo_light",
|
|
289
|
+
logo_dark_id: "dev_lib_bluebird_logo_dark",
|
|
310
290
|
socials: [{
|
|
311
291
|
platform: "linkedin",
|
|
312
292
|
url: "https://linkedin.com/in/marco-bianchi-pm/"
|
|
@@ -343,10 +323,10 @@ const facts = {
|
|
|
343
323
|
phone: c.fields.phone,
|
|
344
324
|
address: c.fields.address,
|
|
345
325
|
website_url: c.fields.website_url,
|
|
346
|
-
avatar_upload_id:
|
|
326
|
+
avatar_upload_id: c.fields.headshot_id,
|
|
347
327
|
org_name: c.fields.org_name,
|
|
348
|
-
logo_light_upload_id: c.fields.
|
|
349
|
-
logo_dark_upload_id: c.fields.
|
|
328
|
+
logo_light_upload_id: c.fields.logo_light_id,
|
|
329
|
+
logo_dark_upload_id: c.fields.logo_dark_id,
|
|
350
330
|
instagram_url: c.fields.socials.find((s) => s.platform === "instagram")?.url ?? null,
|
|
351
331
|
linkedin_url: c.fields.socials.find((s) => s.platform === "linkedin")?.url ?? null,
|
|
352
332
|
x_url: c.fields.socials.find((s) => s.platform === "x")?.url ?? null,
|
|
@@ -362,7 +342,7 @@ const forRentCondo = {
|
|
|
362
342
|
amenities,
|
|
363
343
|
contacts,
|
|
364
344
|
media: {
|
|
365
|
-
|
|
345
|
+
video_id: "dev_vid_pearl_street_tour",
|
|
366
346
|
tour_3d_url: null
|
|
367
347
|
}
|
|
368
348
|
};
|
|
@@ -10,7 +10,7 @@ const luxuryMultiUnit = {
|
|
|
10
10
|
amenities: sampleAmenities,
|
|
11
11
|
contacts: sampleContacts,
|
|
12
12
|
media: {
|
|
13
|
-
|
|
13
|
+
video_id: "dev_vid_queensway_walkthrough",
|
|
14
14
|
tour_3d_url: "https://my.matterport.com/show/?m=SxQL3iGyoDo"
|
|
15
15
|
}
|
|
16
16
|
};
|