@homepages/template-kit 0.9.0-dev-20260719205406 → 0.9.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 (146) hide show
  1. package/CHANGELOG.md +60 -59
  2. package/README.md +14 -4
  3. package/dist/contracts/fill-treatments.d.ts +23 -0
  4. package/dist/fixtures/sample-property.d.ts +4 -7
  5. package/dist/fixtures/sample-property.js +41 -97
  6. package/dist/fixtures/scenario.d.ts +1 -1
  7. package/dist/fixtures/scenarios/for-rent-condo.js +24 -44
  8. package/dist/fixtures/scenarios/luxury-multi-unit.js +1 -1
  9. package/dist/fixtures/scenarios/sparse-single-family.js +14 -26
  10. package/dist/fixtures.d.ts +2 -2
  11. package/dist/fixtures.js +1 -2
  12. package/dist/index.d.ts +2 -2
  13. package/dist/index.js +2 -2
  14. package/dist/islands/discover.js +1 -1
  15. package/dist/islands/esbuild-plugin.js +1 -1
  16. package/dist/islands/wrap.d.ts +9 -1
  17. package/dist/manifest.json +940 -0
  18. package/dist/media/pack.d.ts +49 -0
  19. package/dist/media/pack.js +69 -0
  20. package/dist/media/resolve-fixture-media.d.ts +22 -0
  21. package/dist/media/resolve-fixture-media.js +73 -0
  22. package/dist/media/resolve-media.js +195 -0
  23. package/dist/package.js +1 -1
  24. package/dist/schema/property-facts.d.ts +2 -2
  25. package/dist/schema/resolve-section-ref.d.ts +4 -0
  26. package/dist/schema/rows.d.ts +9 -0
  27. package/dist/schema/section-nav.d.ts +5 -1
  28. package/dist/schema/slot-types.d.ts +1 -1
  29. package/dist/ssr.d.ts +19 -2
  30. package/dist/ssr.js +32 -13
  31. package/guide/INDEX.md +5 -0
  32. package/guide/check.md +1 -0
  33. package/guide/dev.md +1 -0
  34. package/guide/llms.txt +11 -3
  35. package/guide/recipes/image-slot-crop.md +6 -6
  36. package/guide/recipes/pick-a-scenario.md +13 -5
  37. package/guide/schema-system.md +36 -12
  38. package/guide/upgrading.md +12 -8
  39. package/package.json +4 -16
  40. package/dist/canvas-core/chrome-css.d.ts +0 -24
  41. package/dist/canvas-core/chrome-css.js +0 -403
  42. package/dist/canvas-core/chrome.d.ts +0 -49
  43. package/dist/canvas-core/chrome.js +0 -147
  44. package/dist/canvas-core/frame.d.ts +0 -20
  45. package/dist/canvas-core/frame.js +0 -23
  46. package/dist/canvas-core/hidden-tabs.d.ts +0 -16
  47. package/dist/canvas-core/hidden-tabs.js +0 -84
  48. package/dist/canvas-core/resolve-target.js +0 -55
  49. package/dist/canvas-core/scroll.d.ts +0 -10
  50. package/dist/canvas-core/scroll.js +0 -15
  51. package/dist/canvas-core/section-dom.d.ts +0 -6
  52. package/dist/canvas-core/section-dom.js +0 -43
  53. package/dist/canvas-core/srcdoc.d.ts +0 -8
  54. package/dist/canvas-core/srcdoc.js +0 -77
  55. package/dist/canvas-core/types.d.ts +0 -76
  56. package/dist/canvas-core.d.ts +0 -9
  57. package/dist/canvas-core.js +0 -9
  58. package/dist/cli/check/config.js +0 -41
  59. package/dist/cli/check/css.js +0 -131
  60. package/dist/cli/check/diagnostics.js +0 -37
  61. package/dist/cli/check/index.js +0 -94
  62. package/dist/cli/check/loader.js +0 -149
  63. package/dist/cli/check/paths.js +0 -15
  64. package/dist/cli/check/relativize.js +0 -18
  65. package/dist/cli/check/render-invariants.js +0 -24
  66. package/dist/cli/check/resolve-tool.js +0 -38
  67. package/dist/cli/check/section-assets.js +0 -58
  68. package/dist/cli/check/stages/deps.js +0 -337
  69. package/dist/cli/check/stages/lint.js +0 -46
  70. package/dist/cli/check/stages/render.js +0 -97
  71. package/dist/cli/check/stages/size.js +0 -274
  72. package/dist/cli/check/stages/tree.js +0 -206
  73. package/dist/cli/check/stages/typecheck.js +0 -46
  74. package/dist/cli/check/stages/validate/catalog-exhaustiveness.js +0 -18
  75. package/dist/cli/check/stages/validate/facts.js +0 -19
  76. package/dist/cli/check/stages/validate/formatter-contract.js +0 -14
  77. package/dist/cli/check/stages/validate/group-contract.js +0 -21
  78. package/dist/cli/check/stages/validate/index.js +0 -66
  79. package/dist/cli/check/stages/validate/list-scalar-contract.js +0 -22
  80. package/dist/cli/check/stages/validate/nav-contract.js +0 -92
  81. package/dist/cli/check/stages/validate/nested-slot-contract.js +0 -12
  82. package/dist/cli/check/stages/validate/object-list-contract.js +0 -31
  83. package/dist/cli/check/stages/validate/orchestrator.js +0 -241
  84. package/dist/cli/check/stages/validate/produced-by-contract.js +0 -18
  85. package/dist/cli/check/stages/validate/row-contract.js +0 -31
  86. package/dist/cli/check/stages/validate/select-contract.js +0 -13
  87. package/dist/cli/check/stages/validate/source-contract.js +0 -21
  88. package/dist/cli/check/stages/validate/variant-contract.js +0 -15
  89. package/dist/cli/check/workspace.js +0 -99
  90. package/dist/cli/dev/build-css.js +0 -97
  91. package/dist/cli/dev/catalog.js +0 -35
  92. package/dist/cli/dev/compose-template.js +0 -39
  93. package/dist/cli/dev/content-override.js +0 -58
  94. package/dist/cli/dev/diagnostics.js +0 -68
  95. package/dist/cli/dev/discover.js +0 -35
  96. package/dist/cli/dev/fill-state.js +0 -77
  97. package/dist/cli/dev/index.js +0 -42
  98. package/dist/cli/dev/inspect.js +0 -38
  99. package/dist/cli/dev/island-bootstrap.js +0 -38
  100. package/dist/cli/dev/island-canvas-bootstrap.js +0 -204
  101. package/dist/cli/dev/island-map.js +0 -35
  102. package/dist/cli/dev/island-transform.js +0 -31
  103. package/dist/cli/dev/manifest-instances.js +0 -31
  104. package/dist/cli/dev/render-section.js +0 -24
  105. package/dist/cli/dev/screenshot-target.js +0 -24
  106. package/dist/cli/dev/section-page.js +0 -91
  107. package/dist/cli/dev/server.js +0 -510
  108. package/dist/cli/dev/slot-schema.js +0 -12
  109. package/dist/cli/dev/structure-summary.js +0 -119
  110. package/dist/cli/dev/tailwind.js +0 -32
  111. package/dist/cli/dev/tsconfig-paths-plugin.js +0 -90
  112. package/dist/cli/dev/vite-server.js +0 -39
  113. package/dist/cli/dev/workspace.js +0 -63
  114. package/dist/cli/link/index.js +0 -74
  115. package/dist/cli/link/overlay.js +0 -59
  116. package/dist/cli/link/watch.js +0 -25
  117. package/dist/cli/new/emit.js +0 -48
  118. package/dist/cli/new/index.js +0 -69
  119. package/dist/cli/new/scaffold/section/_Renderer.tsx +0 -20
  120. package/dist/cli/new/scaffold/section/_fill-spec.ts +0 -18
  121. package/dist/cli/new/scaffold/section/_fixtures.ts +0 -13
  122. package/dist/cli/new/scaffold/section/_schema.ts +0 -24
  123. package/dist/cli/new/scaffold/template/_manifest.json +0 -9
  124. package/dist/cli/new/scaffold/template/sections/hero/ExpandableText.tsx +0 -45
  125. package/dist/cli/new/scaffold/template/sections/hero/Renderer.tsx +0 -40
  126. package/dist/cli/new/scaffold/template/sections/hero/components/Feature.tsx +0 -14
  127. package/dist/cli/new/scaffold/template/sections/hero/fill-spec.ts +0 -29
  128. package/dist/cli/new/scaffold/template/sections/hero/fixtures.ts +0 -41
  129. package/dist/cli/new/scaffold/template/sections/hero/schema.ts +0 -60
  130. package/dist/cli/new/scaffold/template/theme.css +0 -24
  131. package/dist/cli/new/scaffold/template/theme.ts +0 -27
  132. package/dist/cli/new/scaffold-assets.js +0 -20
  133. package/dist/cli/pack/collect.js +0 -44
  134. package/dist/cli/pack/guards.js +0 -57
  135. package/dist/cli/pack/index.js +0 -66
  136. package/dist/cli/pack/manifest.js +0 -15
  137. package/dist/cli/pack/zip.js +0 -86
  138. package/dist/cli/theme/generate.js +0 -43
  139. package/dist/cli/theme/index.js +0 -33
  140. package/dist/cli/theme/load-theme.js +0 -69
  141. package/dist/cli.d.ts +0 -1
  142. package/dist/cli.js +0 -138
  143. package/dist/dev-client/assets/index-CJa9G1Na.css +0 -1
  144. package/dist/dev-client/assets/index-C_1atZs4.js +0 -450
  145. package/dist/dev-client/index.html +0 -13
  146. package/dist/tokens.css +0 -21
@@ -0,0 +1,940 @@
1
+ {
2
+ "version": 1,
3
+ "license": {
4
+ "spdx": "CC0-1.0",
5
+ "source": "Generated placeholders (packages/dev-media/scripts/generate-placeholders.mjs)",
6
+ "notes": "Synthetic stand-ins at the inventory's required dimensions, not photography. Replacing them with licensed media changes assets/ and each entry's width/height and nothing else — ids, tags, and sets are fixed by the derived contract."
7
+ },
8
+ "assets": [
9
+ {
10
+ "id": "dev_upl_pearl_street_01_exterior_front",
11
+ "kind": "photo",
12
+ "name": "01-exterior-front.jpg",
13
+ "caption": "Brick townhome exterior with a street-facing entry stoop.",
14
+ "tags": {
15
+ "room": "exterior-front",
16
+ "category": "exterior"
17
+ },
18
+ "file": "assets/photo/pearl_street_01_exterior_front.png",
19
+ "width": 2048,
20
+ "height": 1453
21
+ },
22
+ {
23
+ "id": "dev_upl_pearl_street_02_living",
24
+ "kind": "photo",
25
+ "name": "02-living.jpg",
26
+ "caption": "Living room with tall windows and exposed-beam ceiling.",
27
+ "tags": {
28
+ "room": "living",
29
+ "category": "interior"
30
+ },
31
+ "file": "assets/photo/pearl_street_02_living.png",
32
+ "width": 2048,
33
+ "height": 1453
34
+ },
35
+ {
36
+ "id": "dev_upl_pearl_street_03_dining",
37
+ "kind": "photo",
38
+ "name": "03-dining.jpg",
39
+ "caption": "Open dining area beside the kitchen island.",
40
+ "tags": {
41
+ "room": "dining",
42
+ "category": "interior"
43
+ },
44
+ "file": "assets/photo/pearl_street_03_dining.png",
45
+ "width": 2048,
46
+ "height": 1453
47
+ },
48
+ {
49
+ "id": "dev_upl_pearl_street_04_kitchen",
50
+ "kind": "photo",
51
+ "name": "04-kitchen.jpg",
52
+ "caption": "Kitchen with stainless appliances and quartz counters.",
53
+ "tags": {
54
+ "room": "kitchen",
55
+ "category": "interior"
56
+ },
57
+ "file": "assets/photo/pearl_street_04_kitchen.png",
58
+ "width": 2048,
59
+ "height": 1453
60
+ },
61
+ {
62
+ "id": "dev_upl_pearl_street_05_primary_bedroom",
63
+ "kind": "photo",
64
+ "name": "05-primary-bedroom.jpg",
65
+ "caption": "Primary bedroom with a walk-in closet.",
66
+ "tags": {
67
+ "room": "bedroom",
68
+ "category": "interior"
69
+ },
70
+ "file": "assets/photo/pearl_street_05_primary_bedroom.png",
71
+ "width": 2048,
72
+ "height": 1453
73
+ },
74
+ {
75
+ "id": "dev_upl_pearl_street_06_second_bedroom",
76
+ "kind": "photo",
77
+ "name": "06-second-bedroom.jpg",
78
+ "caption": "Second bedroom used as a home office.",
79
+ "tags": {
80
+ "room": "bedroom",
81
+ "category": "interior"
82
+ },
83
+ "file": "assets/photo/pearl_street_06_second_bedroom.png",
84
+ "width": 2048,
85
+ "height": 1453
86
+ },
87
+ {
88
+ "id": "dev_upl_pearl_street_07_primary_bath",
89
+ "kind": "photo",
90
+ "name": "07-primary-bath.jpg",
91
+ "caption": "Primary bath with a glass-enclosed shower.",
92
+ "tags": {
93
+ "room": "bath",
94
+ "category": "interior"
95
+ },
96
+ "file": "assets/photo/pearl_street_07_primary_bath.png",
97
+ "width": 2048,
98
+ "height": 1453
99
+ },
100
+ {
101
+ "id": "dev_upl_pearl_street_08_powder_room",
102
+ "kind": "photo",
103
+ "name": "08-powder-room.jpg",
104
+ "caption": "Powder room off the main hallway.",
105
+ "tags": {
106
+ "room": "bath",
107
+ "category": "interior"
108
+ },
109
+ "file": "assets/photo/pearl_street_08_powder_room.png",
110
+ "width": 2048,
111
+ "height": 1453
112
+ },
113
+ {
114
+ "id": "dev_upl_pearl_street_09_balcony",
115
+ "kind": "photo",
116
+ "name": "09-balcony.jpg",
117
+ "caption": "Private balcony overlooking a landscaped courtyard.",
118
+ "tags": {
119
+ "room": "balcony",
120
+ "category": "exterior"
121
+ },
122
+ "file": "assets/photo/pearl_street_09_balcony.png",
123
+ "width": 2048,
124
+ "height": 1453
125
+ },
126
+ {
127
+ "id": "dev_upl_pearl_street_10_rooftop_deck",
128
+ "kind": "photo",
129
+ "name": "10-rooftop-deck.jpg",
130
+ "caption": "Shared rooftop deck with skyline views.",
131
+ "tags": {
132
+ "room": "rooftop",
133
+ "category": "exterior"
134
+ },
135
+ "file": "assets/photo/pearl_street_10_rooftop_deck.png",
136
+ "width": 2048,
137
+ "height": 1453
138
+ },
139
+ {
140
+ "id": "dev_upl_queensway_01_lobby",
141
+ "kind": "photo",
142
+ "name": "01-lobby.jpg",
143
+ "caption": "Lobby with terrazzo flooring and chandeliers.",
144
+ "tags": {
145
+ "room": "lobby",
146
+ "category": "interior"
147
+ },
148
+ "file": "assets/photo/queensway_01_lobby.png",
149
+ "width": 2048,
150
+ "height": 1365
151
+ },
152
+ {
153
+ "id": "dev_upl_queensway_02_gym_a",
154
+ "kind": "photo",
155
+ "name": "02-gym-a.jpg",
156
+ "caption": "Gym with cardio equipment and floor-to-ceiling mirrors.",
157
+ "tags": {
158
+ "room": "gym",
159
+ "category": "interior"
160
+ },
161
+ "file": "assets/photo/queensway_02_gym_a.png",
162
+ "width": 2048,
163
+ "height": 1365
164
+ },
165
+ {
166
+ "id": "dev_upl_queensway_03_gym_b",
167
+ "kind": "photo",
168
+ "name": "03-gym-b.jpg",
169
+ "caption": "Gym free-weights area.",
170
+ "tags": {
171
+ "room": "gym",
172
+ "category": "interior"
173
+ },
174
+ "file": "assets/photo/queensway_03_gym_b.png",
175
+ "width": 2048,
176
+ "height": 1365
177
+ },
178
+ {
179
+ "id": "dev_upl_queensway_04_living_a",
180
+ "kind": "photo",
181
+ "name": "04-living-a.jpg",
182
+ "caption": "Living area with bay windows and original mouldings.",
183
+ "tags": {
184
+ "room": "living",
185
+ "category": "interior"
186
+ },
187
+ "file": "assets/photo/queensway_04_living_a.png",
188
+ "width": 2048,
189
+ "height": 1365
190
+ },
191
+ {
192
+ "id": "dev_upl_queensway_05_living_b",
193
+ "kind": "photo",
194
+ "name": "05-living-b.jpg",
195
+ "caption": "Living area facing the fireplace.",
196
+ "tags": {
197
+ "room": "living",
198
+ "category": "interior"
199
+ },
200
+ "file": "assets/photo/queensway_05_living_b.png",
201
+ "width": 2048,
202
+ "height": 1365
203
+ },
204
+ {
205
+ "id": "dev_upl_queensway_06_kitchen_a",
206
+ "kind": "photo",
207
+ "name": "06-kitchen-a.jpg",
208
+ "caption": "Kitchen with quartz waterfall island.",
209
+ "tags": {
210
+ "room": "kitchen",
211
+ "category": "interior"
212
+ },
213
+ "file": "assets/photo/queensway_06_kitchen_a.png",
214
+ "width": 2048,
215
+ "height": 1365
216
+ },
217
+ {
218
+ "id": "dev_upl_queensway_07_kitchen_b",
219
+ "kind": "photo",
220
+ "name": "07-kitchen-b.jpg",
221
+ "caption": "Kitchen breakfast nook by the window.",
222
+ "tags": {
223
+ "room": "kitchen",
224
+ "category": "interior"
225
+ },
226
+ "file": "assets/photo/queensway_07_kitchen_b.png",
227
+ "width": 2048,
228
+ "height": 1365
229
+ },
230
+ {
231
+ "id": "dev_upl_queensway_08_dining",
232
+ "kind": "photo",
233
+ "name": "08-dining.jpg",
234
+ "caption": "Dining area set for six.",
235
+ "tags": {
236
+ "room": "dining",
237
+ "category": "interior"
238
+ },
239
+ "file": "assets/photo/queensway_08_dining.png",
240
+ "width": 2048,
241
+ "height": 1365
242
+ },
243
+ {
244
+ "id": "dev_upl_queensway_09_living_c",
245
+ "kind": "photo",
246
+ "name": "09-living-c.jpg",
247
+ "caption": "Living area with statement art wall.",
248
+ "tags": {
249
+ "room": "living",
250
+ "category": "interior"
251
+ },
252
+ "file": "assets/photo/queensway_09_living_c.png",
253
+ "width": 2048,
254
+ "height": 1365
255
+ },
256
+ {
257
+ "id": "dev_upl_queensway_10_living_d",
258
+ "kind": "photo",
259
+ "name": "10-living-d.jpg",
260
+ "caption": "Living area opening onto private terrace.",
261
+ "tags": {
262
+ "room": "living",
263
+ "category": "interior"
264
+ },
265
+ "file": "assets/photo/queensway_10_living_d.png",
266
+ "width": 2048,
267
+ "height": 1365
268
+ },
269
+ {
270
+ "id": "dev_upl_queensway_11_living_e",
271
+ "kind": "photo",
272
+ "name": "11-living-e.jpg",
273
+ "caption": "Sunken living area with built-in shelving.",
274
+ "tags": {
275
+ "room": "living",
276
+ "category": "interior"
277
+ },
278
+ "file": "assets/photo/queensway_11_living_e.png",
279
+ "width": 2048,
280
+ "height": 1365
281
+ },
282
+ {
283
+ "id": "dev_upl_queensway_12_living_f",
284
+ "kind": "photo",
285
+ "name": "12-living-f.jpg",
286
+ "caption": "Living area corner with reading chair.",
287
+ "tags": {
288
+ "room": "living",
289
+ "category": "interior"
290
+ },
291
+ "file": "assets/photo/queensway_12_living_f.png",
292
+ "width": 2048,
293
+ "height": 1365
294
+ },
295
+ {
296
+ "id": "dev_upl_queensway_13_master_bedroom",
297
+ "kind": "photo",
298
+ "name": "13-master-bedroom.jpg",
299
+ "caption": "Primary bedroom with king bed and skylight.",
300
+ "tags": {
301
+ "room": "bedroom",
302
+ "category": "interior"
303
+ },
304
+ "file": "assets/photo/queensway_13_master_bedroom.png",
305
+ "width": 2048,
306
+ "height": 1365
307
+ },
308
+ {
309
+ "id": "dev_upl_queensway_14_master_bath_a",
310
+ "kind": "photo",
311
+ "name": "14-master-bath-a.jpg",
312
+ "caption": "Spa-style primary bath with freestanding tub.",
313
+ "tags": {
314
+ "room": "bath",
315
+ "category": "interior"
316
+ },
317
+ "file": "assets/photo/queensway_14_master_bath_a.png",
318
+ "width": 2048,
319
+ "height": 1365
320
+ },
321
+ {
322
+ "id": "dev_upl_queensway_15_master_bath_b",
323
+ "kind": "photo",
324
+ "name": "15-master-bath-b.jpg",
325
+ "caption": "Primary bath double vanity and shower.",
326
+ "tags": {
327
+ "room": "bath",
328
+ "category": "interior"
329
+ },
330
+ "file": "assets/photo/queensway_15_master_bath_b.png",
331
+ "width": 2048,
332
+ "height": 1365
333
+ },
334
+ {
335
+ "id": "dev_upl_queensway_16_common_bath",
336
+ "kind": "photo",
337
+ "name": "16-common-bath.jpg",
338
+ "caption": "Common bath with marble subway tile.",
339
+ "tags": {
340
+ "room": "bath",
341
+ "category": "interior"
342
+ },
343
+ "file": "assets/photo/queensway_16_common_bath.png",
344
+ "width": 2048,
345
+ "height": 1365
346
+ },
347
+ {
348
+ "id": "dev_upl_queensway_17_entrance",
349
+ "kind": "photo",
350
+ "name": "17-entrance.jpg",
351
+ "caption": "Entrance foyer with original mosaic floor.",
352
+ "tags": {
353
+ "room": "entry",
354
+ "category": "interior"
355
+ },
356
+ "file": "assets/photo/queensway_17_entrance.png",
357
+ "width": 2048,
358
+ "height": 1365
359
+ },
360
+ {
361
+ "id": "dev_upl_queensway_18_patio",
362
+ "kind": "photo",
363
+ "name": "18-patio.jpg",
364
+ "caption": "Patio with built-in seating and planters.",
365
+ "tags": {
366
+ "room": "patio",
367
+ "category": "exterior"
368
+ },
369
+ "file": "assets/photo/queensway_18_patio.png",
370
+ "width": 2048,
371
+ "height": 1365
372
+ },
373
+ {
374
+ "id": "dev_upl_queensway_19_outdoor_deck",
375
+ "kind": "photo",
376
+ "name": "19-outdoor-deck.jpg",
377
+ "caption": "Outdoor deck with sunset view.",
378
+ "tags": {
379
+ "room": "deck",
380
+ "category": "exterior"
381
+ },
382
+ "file": "assets/photo/queensway_19_outdoor_deck.png",
383
+ "width": 2048,
384
+ "height": 1365
385
+ },
386
+ {
387
+ "id": "dev_upl_queensway_20_exterior_hero",
388
+ "kind": "photo",
389
+ "name": "20-exterior-hero.jpg",
390
+ "caption": "Mansard victorian facade at golden hour.",
391
+ "tags": {
392
+ "room": "exterior-front",
393
+ "category": "exterior"
394
+ },
395
+ "file": "assets/photo/queensway_20_exterior_hero.png",
396
+ "width": 2048,
397
+ "height": 1453
398
+ },
399
+ {
400
+ "id": "dev_upl_tuscan_road_01_exterior_front",
401
+ "kind": "photo",
402
+ "name": "01-exterior-front.jpg",
403
+ "caption": "Center-hall colonial facade with a covered front porch.",
404
+ "tags": {
405
+ "room": "exterior-front",
406
+ "category": "exterior"
407
+ },
408
+ "file": "assets/photo/tuscan_road_01_exterior_front.png",
409
+ "width": 2048,
410
+ "height": 1365
411
+ },
412
+ {
413
+ "id": "dev_upl_tuscan_road_02_living",
414
+ "kind": "photo",
415
+ "name": "02-living.jpg",
416
+ "caption": "Living room with a bay window and original hardwood floors.",
417
+ "tags": {
418
+ "room": "living",
419
+ "category": "interior"
420
+ },
421
+ "file": "assets/photo/tuscan_road_02_living.png",
422
+ "width": 2048,
423
+ "height": 1365
424
+ },
425
+ {
426
+ "id": "dev_upl_tuscan_road_03_kitchen",
427
+ "kind": "photo",
428
+ "name": "03-kitchen.jpg",
429
+ "caption": "Updated kitchen with white shaker cabinets and butcher-block counters.",
430
+ "tags": {
431
+ "room": "kitchen",
432
+ "category": "interior"
433
+ },
434
+ "file": "assets/photo/tuscan_road_03_kitchen.png",
435
+ "width": 2048,
436
+ "height": 1365
437
+ },
438
+ {
439
+ "id": "dev_upl_tuscan_road_04_bedroom",
440
+ "kind": "photo",
441
+ "name": "04-bedroom.jpg",
442
+ "caption": "Primary bedroom with double-hung windows and a ceiling fan.",
443
+ "tags": {
444
+ "room": "bedroom",
445
+ "category": "interior"
446
+ },
447
+ "file": "assets/photo/tuscan_road_04_bedroom.png",
448
+ "width": 2048,
449
+ "height": 1365
450
+ },
451
+ {
452
+ "id": "dev_upl_tuscan_road_05_backyard",
453
+ "kind": "photo",
454
+ "name": "05-backyard.jpg",
455
+ "caption": "Fenced backyard with a paver patio and mature shade trees.",
456
+ "tags": {
457
+ "room": "backyard",
458
+ "category": "exterior"
459
+ },
460
+ "file": "assets/photo/tuscan_road_05_backyard.png",
461
+ "width": 2048,
462
+ "height": 1365
463
+ },
464
+ {
465
+ "id": "dev_efp_pearl_street_unit04_main",
466
+ "kind": "plan",
467
+ "name": "unit04-main.png",
468
+ "caption": "Unit 4 floor plan — main floor (living, dining, kitchen).",
469
+ "tags": {},
470
+ "file": "assets/plan/pearl_street_unit04_main.png",
471
+ "width": 1024,
472
+ "height": 1024
473
+ },
474
+ {
475
+ "id": "dev_efp_pearl_street_unit04_upper",
476
+ "kind": "plan",
477
+ "name": "unit04-upper.png",
478
+ "caption": "Unit 4 floor plan — upper floor (bedrooms, baths).",
479
+ "tags": {},
480
+ "file": "assets/plan/pearl_street_unit04_upper.png",
481
+ "width": 1024,
482
+ "height": 1024
483
+ },
484
+ {
485
+ "id": "dev_efp_queensway_2br_11_l1",
486
+ "kind": "plan",
487
+ "name": "2br-11-l1.png",
488
+ "caption": "2BR layout.",
489
+ "tags": {},
490
+ "file": "assets/plan/queensway_2br_11_l1.png",
491
+ "width": 1024,
492
+ "height": 1024
493
+ },
494
+ {
495
+ "id": "dev_efp_queensway_2br_2_l1",
496
+ "kind": "plan",
497
+ "name": "2br-2-l1.png",
498
+ "caption": "2BR layout.",
499
+ "tags": {},
500
+ "file": "assets/plan/queensway_2br_2_l1.png",
501
+ "width": 1024,
502
+ "height": 1024
503
+ },
504
+ {
505
+ "id": "dev_efp_queensway_2br_4_l1",
506
+ "kind": "plan",
507
+ "name": "2br-4-l1.png",
508
+ "caption": "2BR layout.",
509
+ "tags": {},
510
+ "file": "assets/plan/queensway_2br_4_l1.png",
511
+ "width": 1024,
512
+ "height": 1024
513
+ },
514
+ {
515
+ "id": "dev_efp_queensway_2br_6_l1",
516
+ "kind": "plan",
517
+ "name": "2br-6-l1.png",
518
+ "caption": "2BR layout.",
519
+ "tags": {},
520
+ "file": "assets/plan/queensway_2br_6_l1.png",
521
+ "width": 1024,
522
+ "height": 1024
523
+ },
524
+ {
525
+ "id": "dev_efp_queensway_2br_8_l1",
526
+ "kind": "plan",
527
+ "name": "2br-8-l1.png",
528
+ "caption": "2BR layout.",
529
+ "tags": {},
530
+ "file": "assets/plan/queensway_2br_8_l1.png",
531
+ "width": 1024,
532
+ "height": 1024
533
+ },
534
+ {
535
+ "id": "dev_efp_queensway_3br_1_l1",
536
+ "kind": "plan",
537
+ "name": "3br-1-l1.png",
538
+ "caption": "3BR layout — main floor.",
539
+ "tags": {},
540
+ "file": "assets/plan/queensway_3br_1_l1.png",
541
+ "width": 1024,
542
+ "height": 1024
543
+ },
544
+ {
545
+ "id": "dev_efp_queensway_3br_1_l2",
546
+ "kind": "plan",
547
+ "name": "3br-1-l2.png",
548
+ "caption": "3BR layout — upper floor.",
549
+ "tags": {},
550
+ "file": "assets/plan/queensway_3br_1_l2.png",
551
+ "width": 1024,
552
+ "height": 1024
553
+ },
554
+ {
555
+ "id": "dev_efp_queensway_3br_10_l1",
556
+ "kind": "plan",
557
+ "name": "3br-10-l1.png",
558
+ "caption": "3BR layout — main floor.",
559
+ "tags": {},
560
+ "file": "assets/plan/queensway_3br_10_l1.png",
561
+ "width": 1024,
562
+ "height": 1024
563
+ },
564
+ {
565
+ "id": "dev_efp_queensway_3br_10_l2",
566
+ "kind": "plan",
567
+ "name": "3br-10-l2.png",
568
+ "caption": "3BR layout — upper floor.",
569
+ "tags": {},
570
+ "file": "assets/plan/queensway_3br_10_l2.png",
571
+ "width": 1024,
572
+ "height": 1024
573
+ },
574
+ {
575
+ "id": "dev_efp_queensway_3br_5_l1",
576
+ "kind": "plan",
577
+ "name": "3br-5-l1.png",
578
+ "caption": "3BR layout — main floor.",
579
+ "tags": {},
580
+ "file": "assets/plan/queensway_3br_5_l1.png",
581
+ "width": 1024,
582
+ "height": 1024
583
+ },
584
+ {
585
+ "id": "dev_efp_queensway_3br_5_l2",
586
+ "kind": "plan",
587
+ "name": "3br-5-l2.png",
588
+ "caption": "3BR layout — upper floor.",
589
+ "tags": {},
590
+ "file": "assets/plan/queensway_3br_5_l2.png",
591
+ "width": 1024,
592
+ "height": 1024
593
+ },
594
+ {
595
+ "id": "dev_efp_queensway_4br_12_l1",
596
+ "kind": "plan",
597
+ "name": "4br-12-l1.png",
598
+ "caption": "4BR layout — main floor.",
599
+ "tags": {},
600
+ "file": "assets/plan/queensway_4br_12_l1.png",
601
+ "width": 1024,
602
+ "height": 1024
603
+ },
604
+ {
605
+ "id": "dev_efp_queensway_4br_12_l2",
606
+ "kind": "plan",
607
+ "name": "4br-12-l2.png",
608
+ "caption": "4BR layout — upper floor.",
609
+ "tags": {},
610
+ "file": "assets/plan/queensway_4br_12_l2.png",
611
+ "width": 1024,
612
+ "height": 1024
613
+ },
614
+ {
615
+ "id": "dev_efp_queensway_4br_12_l3",
616
+ "kind": "plan",
617
+ "name": "4br-12-l3.png",
618
+ "caption": "4BR layout — penthouse.",
619
+ "tags": {},
620
+ "file": "assets/plan/queensway_4br_12_l3.png",
621
+ "width": 1024,
622
+ "height": 1024
623
+ },
624
+ {
625
+ "id": "dev_efp_queensway_4br_3_l1",
626
+ "kind": "plan",
627
+ "name": "4br-3-l1.png",
628
+ "caption": "4BR layout — main floor.",
629
+ "tags": {},
630
+ "file": "assets/plan/queensway_4br_3_l1.png",
631
+ "width": 1024,
632
+ "height": 1024
633
+ },
634
+ {
635
+ "id": "dev_efp_queensway_4br_3_l2",
636
+ "kind": "plan",
637
+ "name": "4br-3-l2.png",
638
+ "caption": "4BR layout — upper floor.",
639
+ "tags": {},
640
+ "file": "assets/plan/queensway_4br_3_l2.png",
641
+ "width": 1024,
642
+ "height": 1024
643
+ },
644
+ {
645
+ "id": "dev_efp_queensway_4br_3_l3",
646
+ "kind": "plan",
647
+ "name": "4br-3-l3.png",
648
+ "caption": "4BR layout — penthouse.",
649
+ "tags": {},
650
+ "file": "assets/plan/queensway_4br_3_l3.png",
651
+ "width": 1024,
652
+ "height": 1024
653
+ },
654
+ {
655
+ "id": "dev_efp_queensway_4br_7_l1",
656
+ "kind": "plan",
657
+ "name": "4br-7-l1.png",
658
+ "caption": "4BR layout — main floor.",
659
+ "tags": {},
660
+ "file": "assets/plan/queensway_4br_7_l1.png",
661
+ "width": 1024,
662
+ "height": 1024
663
+ },
664
+ {
665
+ "id": "dev_efp_queensway_4br_7_l2",
666
+ "kind": "plan",
667
+ "name": "4br-7-l2.png",
668
+ "caption": "4BR layout — upper floor.",
669
+ "tags": {},
670
+ "file": "assets/plan/queensway_4br_7_l2.png",
671
+ "width": 1024,
672
+ "height": 1024
673
+ },
674
+ {
675
+ "id": "dev_efp_queensway_4br_7_l3",
676
+ "kind": "plan",
677
+ "name": "4br-7-l3.png",
678
+ "caption": "4BR layout — penthouse.",
679
+ "tags": {},
680
+ "file": "assets/plan/queensway_4br_7_l3.png",
681
+ "width": 1024,
682
+ "height": 1024
683
+ },
684
+ {
685
+ "id": "dev_efp_queensway_studio_9_l1",
686
+ "kind": "plan",
687
+ "name": "studio-9-l1.png",
688
+ "caption": "Studio layout.",
689
+ "tags": {},
690
+ "file": "assets/plan/queensway_studio_9_l1.png",
691
+ "width": 1024,
692
+ "height": 1024
693
+ },
694
+ {
695
+ "id": "dev_efp_tuscan_road_main_floor",
696
+ "kind": "plan",
697
+ "name": "main-floor.png",
698
+ "caption": "Full-house floor plan — first and second floor.",
699
+ "tags": {},
700
+ "file": "assets/plan/tuscan_road_main_floor.png",
701
+ "width": 1024,
702
+ "height": 1024
703
+ },
704
+ {
705
+ "id": "dev_lib_bluebird_logo_dark",
706
+ "kind": "library",
707
+ "name": "Bluebird Realty Group — logo (dark)",
708
+ "caption": "Bluebird Realty Group",
709
+ "tags": {
710
+ "role": "logo",
711
+ "variant": "dark"
712
+ },
713
+ "file": "assets/library/bluebird_logo_dark.svg"
714
+ },
715
+ {
716
+ "id": "dev_lib_bluebird_logo_light",
717
+ "kind": "library",
718
+ "name": "Bluebird Realty Group — logo (light)",
719
+ "caption": "Bluebird Realty Group",
720
+ "tags": {
721
+ "role": "logo",
722
+ "variant": "light"
723
+ },
724
+ "file": "assets/library/bluebird_logo_light.svg"
725
+ },
726
+ {
727
+ "id": "dev_lib_elena_marsh",
728
+ "kind": "library",
729
+ "name": "Elena Marsh — headshot",
730
+ "caption": "Elena Marsh",
731
+ "tags": {
732
+ "role": "headshot"
733
+ },
734
+ "file": "assets/library/elena_marsh.png",
735
+ "width": 640,
736
+ "height": 854
737
+ },
738
+ {
739
+ "id": "dev_lib_james_donovan",
740
+ "kind": "library",
741
+ "name": "James Donovan — headshot",
742
+ "caption": "James Donovan",
743
+ "tags": {
744
+ "role": "headshot"
745
+ },
746
+ "file": "assets/library/james_donovan.png",
747
+ "width": 640,
748
+ "height": 854
749
+ },
750
+ {
751
+ "id": "dev_lib_marco_bianchi",
752
+ "kind": "library",
753
+ "name": "Marco Bianchi — headshot",
754
+ "caption": "Marco Bianchi",
755
+ "tags": {
756
+ "role": "headshot"
757
+ },
758
+ "file": "assets/library/marco_bianchi.png",
759
+ "width": 640,
760
+ "height": 854
761
+ },
762
+ {
763
+ "id": "dev_lib_marcus_webb",
764
+ "kind": "library",
765
+ "name": "Marcus Webb — headshot",
766
+ "caption": "Marcus Webb",
767
+ "tags": {
768
+ "role": "headshot"
769
+ },
770
+ "file": "assets/library/marcus_webb.png",
771
+ "width": 640,
772
+ "height": 854
773
+ },
774
+ {
775
+ "id": "dev_lib_ngozi_okafor",
776
+ "kind": "library",
777
+ "name": "Ngozi Okafor — headshot",
778
+ "caption": "Ngozi Okafor",
779
+ "tags": {
780
+ "role": "headshot"
781
+ },
782
+ "file": "assets/library/ngozi_okafor.png",
783
+ "width": 640,
784
+ "height": 854
785
+ },
786
+ {
787
+ "id": "dev_lib_okane_logo_dark",
788
+ "kind": "library",
789
+ "name": "Okane Marketing — logo (dark)",
790
+ "caption": "Okane Marketing",
791
+ "tags": {
792
+ "role": "logo",
793
+ "variant": "dark"
794
+ },
795
+ "file": "assets/library/okane_logo_dark.svg"
796
+ },
797
+ {
798
+ "id": "dev_lib_okane_logo_light",
799
+ "kind": "library",
800
+ "name": "Okane Marketing — logo (light)",
801
+ "caption": "Okane Marketing",
802
+ "tags": {
803
+ "role": "logo",
804
+ "variant": "light"
805
+ },
806
+ "file": "assets/library/okane_logo_light.svg"
807
+ },
808
+ {
809
+ "id": "dev_lib_priya_chandran",
810
+ "kind": "library",
811
+ "name": "Priya Chandran — headshot",
812
+ "caption": "Priya Chandran",
813
+ "tags": {
814
+ "role": "headshot"
815
+ },
816
+ "file": "assets/library/priya_chandran.png",
817
+ "width": 640,
818
+ "height": 854
819
+ },
820
+ {
821
+ "id": "dev_vid_pearl_street_tour",
822
+ "kind": "video",
823
+ "name": "tour.mp4",
824
+ "caption": "Walkthrough tour of the Pearl Street brick townhome",
825
+ "tags": {},
826
+ "file": "assets/video/pearl_street_tour.mp4",
827
+ "width": 2048,
828
+ "height": 1200,
829
+ "poster": "assets/video/pearl_street_tour-poster.png"
830
+ },
831
+ {
832
+ "id": "dev_vid_queensway_walkthrough",
833
+ "kind": "video",
834
+ "name": "walkthrough.mp4",
835
+ "caption": "Walkthrough tour of the Jamaica Plain mansard Victorian",
836
+ "tags": {},
837
+ "file": "assets/video/queensway_walkthrough.mp4",
838
+ "width": 2048,
839
+ "height": 1200,
840
+ "poster": "assets/video/queensway_walkthrough-poster.png"
841
+ }
842
+ ],
843
+ "sets": {
844
+ "forRentCondo": {
845
+ "photo": [
846
+ "dev_upl_pearl_street_01_exterior_front",
847
+ "dev_upl_pearl_street_02_living",
848
+ "dev_upl_pearl_street_03_dining",
849
+ "dev_upl_pearl_street_04_kitchen",
850
+ "dev_upl_pearl_street_05_primary_bedroom",
851
+ "dev_upl_pearl_street_06_second_bedroom",
852
+ "dev_upl_pearl_street_07_primary_bath",
853
+ "dev_upl_pearl_street_08_powder_room",
854
+ "dev_upl_pearl_street_09_balcony",
855
+ "dev_upl_pearl_street_10_rooftop_deck"
856
+ ],
857
+ "plan": [
858
+ "dev_efp_pearl_street_unit04_main",
859
+ "dev_efp_pearl_street_unit04_upper"
860
+ ],
861
+ "library": [
862
+ "dev_lib_marco_bianchi",
863
+ "dev_lib_ngozi_okafor"
864
+ ],
865
+ "video": [
866
+ "dev_vid_pearl_street_tour"
867
+ ]
868
+ },
869
+ "luxuryMultiUnit": {
870
+ "photo": [
871
+ "dev_upl_queensway_01_lobby",
872
+ "dev_upl_queensway_02_gym_a",
873
+ "dev_upl_queensway_03_gym_b",
874
+ "dev_upl_queensway_04_living_a",
875
+ "dev_upl_queensway_05_living_b",
876
+ "dev_upl_queensway_06_kitchen_a",
877
+ "dev_upl_queensway_07_kitchen_b",
878
+ "dev_upl_queensway_08_dining",
879
+ "dev_upl_queensway_09_living_c",
880
+ "dev_upl_queensway_10_living_d",
881
+ "dev_upl_queensway_11_living_e",
882
+ "dev_upl_queensway_12_living_f",
883
+ "dev_upl_queensway_13_master_bedroom",
884
+ "dev_upl_queensway_14_master_bath_a",
885
+ "dev_upl_queensway_15_master_bath_b",
886
+ "dev_upl_queensway_16_common_bath",
887
+ "dev_upl_queensway_17_entrance",
888
+ "dev_upl_queensway_18_patio",
889
+ "dev_upl_queensway_19_outdoor_deck",
890
+ "dev_upl_queensway_20_exterior_hero"
891
+ ],
892
+ "plan": [
893
+ "dev_efp_queensway_2br_11_l1",
894
+ "dev_efp_queensway_2br_2_l1",
895
+ "dev_efp_queensway_2br_4_l1",
896
+ "dev_efp_queensway_2br_6_l1",
897
+ "dev_efp_queensway_2br_8_l1",
898
+ "dev_efp_queensway_3br_1_l1",
899
+ "dev_efp_queensway_3br_1_l2",
900
+ "dev_efp_queensway_3br_10_l1",
901
+ "dev_efp_queensway_3br_10_l2",
902
+ "dev_efp_queensway_3br_5_l1",
903
+ "dev_efp_queensway_3br_5_l2",
904
+ "dev_efp_queensway_4br_12_l1",
905
+ "dev_efp_queensway_4br_12_l2",
906
+ "dev_efp_queensway_4br_12_l3",
907
+ "dev_efp_queensway_4br_3_l1",
908
+ "dev_efp_queensway_4br_3_l2",
909
+ "dev_efp_queensway_4br_3_l3",
910
+ "dev_efp_queensway_4br_7_l1",
911
+ "dev_efp_queensway_4br_7_l2",
912
+ "dev_efp_queensway_4br_7_l3",
913
+ "dev_efp_queensway_studio_9_l1"
914
+ ],
915
+ "library": [
916
+ "dev_lib_elena_marsh",
917
+ "dev_lib_james_donovan",
918
+ "dev_lib_marcus_webb"
919
+ ],
920
+ "video": [
921
+ "dev_vid_queensway_walkthrough"
922
+ ]
923
+ },
924
+ "sparseSingleFamily": {
925
+ "photo": [
926
+ "dev_upl_tuscan_road_01_exterior_front",
927
+ "dev_upl_tuscan_road_02_living",
928
+ "dev_upl_tuscan_road_03_kitchen",
929
+ "dev_upl_tuscan_road_04_bedroom",
930
+ "dev_upl_tuscan_road_05_backyard"
931
+ ],
932
+ "plan": [
933
+ "dev_efp_tuscan_road_main_floor"
934
+ ],
935
+ "library": [
936
+ "dev_lib_priya_chandran"
937
+ ]
938
+ }
939
+ }
940
+ }