@homepages/template-kit 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +83 -0
- package/README.md +38 -27
- package/dist/base.css +6 -4
- package/dist/cli/dev/fill-state.js +5 -3
- package/dist/cli/link/overlay.js +1 -1
- package/dist/cli/new/scaffold/template/sections/hero/fixtures.ts +7 -7
- package/dist/contracts/slot-catalog.d.ts +2 -2
- package/dist/contracts/slot-catalog.js +3 -1
- package/dist/eslint/rules/no-raw-element.js +3 -2
- package/dist/fixtures/helpers.d.ts +23 -0
- package/dist/fixtures/helpers.js +50 -0
- package/dist/fixtures/sample-property.d.ts +7 -17
- package/dist/fixtures/sample-property.js +179 -57
- package/dist/fixtures/scenario.d.ts +20 -0
- package/dist/fixtures/scenarios/for-rent-condo.d.ts +5 -0
- package/dist/fixtures/scenarios/for-rent-condo.js +364 -0
- package/dist/fixtures/scenarios/index.d.ts +8 -0
- package/dist/fixtures/scenarios/index.js +13 -0
- package/dist/fixtures/scenarios/luxury-multi-unit.d.ts +5 -0
- package/dist/fixtures/scenarios/luxury-multi-unit.js +19 -0
- package/dist/fixtures/scenarios/sparse-single-family.d.ts +5 -0
- package/dist/fixtures/scenarios/sparse-single-family.js +233 -0
- package/dist/fixtures.d.ts +8 -2
- package/dist/fixtures.js +7 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- package/dist/island-runtime.js +22 -7
- package/dist/package.js +1 -1
- package/dist/primitives/Image.d.ts +1 -1
- package/dist/primitives/Video.d.ts +38 -0
- package/dist/primitives/Video.js +63 -0
- package/dist/primitives/index.d.ts +2 -1
- package/dist/rules/registry.js +3 -3
- package/dist/schema/index.d.ts +2 -2
- package/dist/schema/runtime-values.d.ts +20 -1
- package/dist/schema/section-props.d.ts +8 -1
- package/dist/schema/section-schema.d.ts +2 -2
- package/dist/schema/slot-types.d.ts +15 -1
- package/dist/schema/slot-types.js +34 -0
- package/dist/schema/synthesize-nullable.js +1 -0
- package/{docs → guide}/INDEX.md +7 -6
- package/{docs → guide}/check.md +2 -2
- package/{docs → guide}/islands.md +6 -1
- package/{docs → guide}/llms.txt +34 -14
- package/{docs → guide}/overview.md +4 -4
- package/{docs → guide}/pack.md +2 -2
- package/{docs → guide}/primitives.md +59 -11
- package/{docs → guide}/recipes/INDEX.md +1 -0
- package/{docs → guide}/recipes/collection-slot.md +10 -8
- package/guide/recipes/fixture-states.md +109 -0
- package/{docs → guide}/recipes/image-slot-crop.md +5 -3
- package/guide/recipes/pick-a-scenario.md +119 -0
- package/{docs → guide}/rules/INDEX.md +2 -2
- package/{docs → guide}/rules/fixtures-invalid.md +2 -2
- package/{docs → guide}/rules/no-raw-element.md +13 -8
- package/{docs → guide}/rules/render-invariant.md +4 -3
- package/{docs → guide}/schema-system.md +97 -16
- package/{docs → guide}/theme-and-css.md +3 -2
- package/guide/upgrading.md +61 -0
- package/{docs → guide}/vocabulary.md +3 -1
- package/package.json +8 -3
- package/docs/recipes/fixture-states.md +0 -68
- /package/{docs → guide}/assets.md +0 -0
- /package/{docs → guide}/dev.md +0 -0
- /package/{docs → guide}/eslint.md +0 -0
- /package/{docs → guide}/new.md +0 -0
- /package/{docs → guide}/quickstart.md +0 -0
- /package/{docs → guide}/recipes/bind-property-fact.md +0 -0
- /package/{docs → guide}/recipes/fill-spec-decision.md +0 -0
- /package/{docs → guide}/recipes/interactive-island.md +0 -0
- /package/{docs → guide}/recipes/organize-section-folder.md +0 -0
- /package/{docs → guide}/recipes/prepare-submission.md +0 -0
- /package/{docs → guide}/recipes/second-template.md +0 -0
- /package/{docs → guide}/recipes/select-slot.md +0 -0
- /package/{docs → guide}/recipes/static-asset.md +0 -0
- /package/{docs → guide}/recipes/third-party-package.md +0 -0
- /package/{docs → guide}/rules/audit-severity.md +0 -0
- /package/{docs → guide}/rules/bundle-binary-asset.md +0 -0
- /package/{docs → guide}/rules/bundle-incomplete.md +0 -0
- /package/{docs → guide}/rules/css-reason.md +0 -0
- /package/{docs → guide}/rules/determinism-drift.md +0 -0
- /package/{docs → guide}/rules/image-bare-needs-reason.md +0 -0
- /package/{docs → guide}/rules/license-denied.md +0 -0
- /package/{docs → guide}/rules/lockfile-missing.md +0 -0
- /package/{docs → guide}/rules/lockfile-stale.md +0 -0
- /package/{docs → guide}/rules/manifest-invalid.md +0 -0
- /package/{docs → guide}/rules/missing-slot-marker.md +0 -0
- /package/{docs → guide}/rules/no-bare-css-import.md +0 -0
- /package/{docs → guide}/rules/no-client-directive-in-contract.md +0 -0
- /package/{docs → guide}/rules/no-client-runtime-in-server.md +0 -0
- /package/{docs → guide}/rules/no-css-import-from-render-path.md +0 -0
- /package/{docs → guide}/rules/no-hex.md +0 -0
- /package/{docs → guide}/rules/no-inline-style.md +0 -0
- /package/{docs → guide}/rules/no-nondeterminism.md +0 -0
- /package/{docs → guide}/rules/no-templates.md +0 -0
- /package/{docs → guide}/rules/parse-error.md +0 -0
- /package/{docs → guide}/rules/props-from-schema.md +0 -0
- /package/{docs → guide}/rules/schema-invalid.md +0 -0
- /package/{docs → guide}/rules/serializable-island-props.md +0 -0
- /package/{docs → guide}/rules/server-vs-client.md +0 -0
- /package/{docs → guide}/rules/sidebar-order.md +0 -0
- /package/{docs → guide}/rules/single-react.md +0 -0
- /package/{docs → guide}/rules/size-assets.md +0 -0
- /package/{docs → guide}/rules/size-island-bundle.md +0 -0
- /package/{docs → guide}/rules/size-renderer-bundle.md +0 -0
- /package/{docs → guide}/rules/size-section-css.md +0 -0
- /package/{docs → guide}/rules/slot-group-marker.md +0 -0
- /package/{docs → guide}/rules/slot-marker-literal.md +0 -0
- /package/{docs → guide}/rules/typecheck.md +0 -0
- /package/{docs → guide}/rules/unlayered-fence.md +0 -0
|
@@ -350,7 +350,10 @@ const samplePois = [
|
|
|
350
350
|
id: "poi_r1",
|
|
351
351
|
category: "restaurant",
|
|
352
352
|
name: "Rozafa Mediterranean Bistro",
|
|
353
|
+
place_id: "gplace_rozafa",
|
|
354
|
+
address: "977 Centre St, Jamaica Plain, MA 02130",
|
|
353
355
|
distance: "0.2 mi",
|
|
356
|
+
distance_m: 320,
|
|
354
357
|
lat: 42.3122,
|
|
355
358
|
lng: -71.1085,
|
|
356
359
|
url: "https://example.invalid/poi/rozafa"
|
|
@@ -359,7 +362,10 @@ const samplePois = [
|
|
|
359
362
|
id: "poi_r2",
|
|
360
363
|
category: "restaurant",
|
|
361
364
|
name: "Dotty's Kitchen & Raw Bar",
|
|
365
|
+
place_id: "gplace_dottys",
|
|
366
|
+
address: "704 Centre St, Jamaica Plain, MA 02130",
|
|
362
367
|
distance: "0.3 mi",
|
|
368
|
+
distance_m: 480,
|
|
363
369
|
lat: 42.3088,
|
|
364
370
|
lng: -71.1132,
|
|
365
371
|
url: "https://example.invalid/poi/dottys"
|
|
@@ -368,7 +374,10 @@ const samplePois = [
|
|
|
368
374
|
id: "poi_r3",
|
|
369
375
|
category: "restaurant",
|
|
370
376
|
name: "Fuji at WoC",
|
|
377
|
+
place_id: "gplace_fuji_woc",
|
|
378
|
+
address: "6 Perkins St, Jamaica Plain, MA 02130",
|
|
371
379
|
distance: "0.4 mi",
|
|
380
|
+
distance_m: 640,
|
|
372
381
|
lat: 42.3135,
|
|
373
382
|
lng: -71.1142,
|
|
374
383
|
url: "https://example.invalid/poi/fuji"
|
|
@@ -377,7 +386,10 @@ const samplePois = [
|
|
|
377
386
|
id: "poi_r4",
|
|
378
387
|
category: "restaurant",
|
|
379
388
|
name: "The Fours Restaurant Quincy",
|
|
389
|
+
place_id: "gplace_the_fours",
|
|
390
|
+
address: "166 Hyde Park Ave, Jamaica Plain, MA 02130",
|
|
380
391
|
distance: "0.5 mi",
|
|
392
|
+
distance_m: 800,
|
|
381
393
|
lat: 42.306,
|
|
382
394
|
lng: -71.107,
|
|
383
395
|
url: "https://example.invalid/poi/the-fours"
|
|
@@ -386,7 +398,10 @@ const samplePois = [
|
|
|
386
398
|
id: "poi_p1",
|
|
387
399
|
category: "park",
|
|
388
400
|
name: "Jamaica Pond",
|
|
401
|
+
place_id: "gplace_jamaica_pond",
|
|
402
|
+
address: "507 Jamaicaway, Jamaica Plain, MA 02130",
|
|
389
403
|
distance: "0.4 mi",
|
|
404
|
+
distance_m: 640,
|
|
390
405
|
lat: 42.317,
|
|
391
406
|
lng: -71.119,
|
|
392
407
|
url: "https://example.invalid/poi/jamaica-pond"
|
|
@@ -395,7 +410,10 @@ const samplePois = [
|
|
|
395
410
|
id: "poi_p2",
|
|
396
411
|
category: "park",
|
|
397
412
|
name: "Arnold Arboretum",
|
|
413
|
+
place_id: "gplace_arnold_arboretum",
|
|
414
|
+
address: "125 Arborway, Jamaica Plain, MA 02130",
|
|
398
415
|
distance: "0.9 mi",
|
|
416
|
+
distance_m: 1450,
|
|
399
417
|
lat: 42.299,
|
|
400
418
|
lng: -71.123,
|
|
401
419
|
url: "https://example.invalid/poi/arboretum"
|
|
@@ -404,7 +422,10 @@ const samplePois = [
|
|
|
404
422
|
id: "poi_p3",
|
|
405
423
|
category: "park",
|
|
406
424
|
name: "Olmsted Park",
|
|
425
|
+
place_id: "gplace_olmsted_park",
|
|
426
|
+
address: "Willow Pond Rd, Boston, MA 02130",
|
|
407
427
|
distance: "0.7 mi",
|
|
428
|
+
distance_m: 1130,
|
|
408
429
|
lat: 42.321,
|
|
409
430
|
lng: -71.113,
|
|
410
431
|
url: "https://example.invalid/poi/olmsted"
|
|
@@ -413,7 +434,10 @@ const samplePois = [
|
|
|
413
434
|
id: "poi_p4",
|
|
414
435
|
category: "park",
|
|
415
436
|
name: "Franklin Park",
|
|
437
|
+
place_id: "gplace_franklin_park",
|
|
438
|
+
address: "1 Franklin Park Rd, Boston, MA 02121",
|
|
416
439
|
distance: "1.2 mi",
|
|
440
|
+
distance_m: 1930,
|
|
417
441
|
lat: 42.302,
|
|
418
442
|
lng: -71.089,
|
|
419
443
|
url: "https://example.invalid/poi/franklin-park"
|
|
@@ -422,7 +446,10 @@ const samplePois = [
|
|
|
422
446
|
id: "poi_t1",
|
|
423
447
|
category: "transit",
|
|
424
448
|
name: "Stony Brook (Orange Line)",
|
|
425
|
-
|
|
449
|
+
place_id: "gplace_stony_brook",
|
|
450
|
+
address: "1 Boylston St, Jamaica Plain, MA 02130",
|
|
451
|
+
distance: "0.7 mi",
|
|
452
|
+
distance_m: 1130,
|
|
426
453
|
lat: 42.317,
|
|
427
454
|
lng: -71.1043,
|
|
428
455
|
url: "https://example.invalid/poi/stony-brook"
|
|
@@ -431,7 +458,10 @@ const samplePois = [
|
|
|
431
458
|
id: "poi_t2",
|
|
432
459
|
category: "transit",
|
|
433
460
|
name: "Forest Hills (Orange Line)",
|
|
461
|
+
place_id: "gplace_forest_hills",
|
|
462
|
+
address: "45 South St, Jamaica Plain, MA 02130",
|
|
434
463
|
distance: "1.0 mi",
|
|
464
|
+
distance_m: 1610,
|
|
435
465
|
lat: 42.3008,
|
|
436
466
|
lng: -71.1137,
|
|
437
467
|
url: "https://example.invalid/poi/forest-hills"
|
|
@@ -440,7 +470,10 @@ const samplePois = [
|
|
|
440
470
|
id: "poi_t3",
|
|
441
471
|
category: "transit",
|
|
442
472
|
name: "Route 39 bus stop",
|
|
473
|
+
place_id: "gplace_route_39_bus",
|
|
474
|
+
address: "Centre St & Seaverns Ave, Jamaica Plain, MA 02130",
|
|
443
475
|
distance: "0.1 mi",
|
|
476
|
+
distance_m: 160,
|
|
444
477
|
lat: 42.3108,
|
|
445
478
|
lng: -71.1112,
|
|
446
479
|
url: "https://example.invalid/poi/bus-39"
|
|
@@ -449,7 +482,10 @@ const samplePois = [
|
|
|
449
482
|
id: "poi_t4",
|
|
450
483
|
category: "transit",
|
|
451
484
|
name: "Commuter Rail — Forest Hills",
|
|
485
|
+
place_id: "gplace_commuter_rail_fh",
|
|
486
|
+
address: "45 South St, Jamaica Plain, MA 02130",
|
|
452
487
|
distance: "1.0 mi",
|
|
488
|
+
distance_m: 1610,
|
|
453
489
|
lat: 42.3007,
|
|
454
490
|
lng: -71.114,
|
|
455
491
|
url: "https://example.invalid/poi/commuter-rail"
|
|
@@ -458,7 +494,10 @@ const samplePois = [
|
|
|
458
494
|
id: "poi_s1",
|
|
459
495
|
category: "shopping",
|
|
460
496
|
name: "Centre Street Shops",
|
|
497
|
+
place_id: "gplace_centre_st_shops",
|
|
498
|
+
address: "650 Centre St, Jamaica Plain, MA 02130",
|
|
461
499
|
distance: "0.2 mi",
|
|
500
|
+
distance_m: 320,
|
|
462
501
|
lat: 42.3125,
|
|
463
502
|
lng: -71.114,
|
|
464
503
|
url: "https://example.invalid/poi/centre-st"
|
|
@@ -467,7 +506,10 @@ const samplePois = [
|
|
|
467
506
|
id: "poi_s2",
|
|
468
507
|
category: "shopping",
|
|
469
508
|
name: "JP Licks Boutique Row",
|
|
509
|
+
place_id: "gplace_boutique_row",
|
|
510
|
+
address: "700 Centre St, Jamaica Plain, MA 02130",
|
|
470
511
|
distance: "0.3 mi",
|
|
512
|
+
distance_m: 480,
|
|
471
513
|
lat: 42.314,
|
|
472
514
|
lng: -71.1118,
|
|
473
515
|
url: "https://example.invalid/poi/boutique-row"
|
|
@@ -476,7 +518,10 @@ const samplePois = [
|
|
|
476
518
|
id: "poi_s3",
|
|
477
519
|
category: "shopping",
|
|
478
520
|
name: "Whole Foods Jamaica Plain",
|
|
479
|
-
|
|
521
|
+
place_id: "gplace_whole_foods_jp",
|
|
522
|
+
address: "415 Centre St, Jamaica Plain, MA 02130",
|
|
523
|
+
distance: "1.0 mi",
|
|
524
|
+
distance_m: 1610,
|
|
480
525
|
lat: 42.3219,
|
|
481
526
|
lng: -71.1098,
|
|
482
527
|
url: "https://example.invalid/poi/wholefoods"
|
|
@@ -485,7 +530,10 @@ const samplePois = [
|
|
|
485
530
|
id: "poi_s4",
|
|
486
531
|
category: "shopping",
|
|
487
532
|
name: "Forest Hills Farmers Market",
|
|
533
|
+
place_id: "gplace_forest_hills_farmers_market",
|
|
534
|
+
address: "40 South St, Jamaica Plain, MA 02130",
|
|
488
535
|
distance: "0.9 mi",
|
|
536
|
+
distance_m: 1450,
|
|
489
537
|
lat: 42.3009,
|
|
490
538
|
lng: -71.1131,
|
|
491
539
|
url: "https://example.invalid/poi/farmers-market"
|
|
@@ -494,7 +542,10 @@ const samplePois = [
|
|
|
494
542
|
id: "poi_c1",
|
|
495
543
|
category: "coffee",
|
|
496
544
|
name: "Canto 6 Bakery",
|
|
497
|
-
|
|
545
|
+
place_id: "gplace_canto_6",
|
|
546
|
+
address: "88 South St, Jamaica Plain, MA 02130",
|
|
547
|
+
distance: "0.3 mi",
|
|
548
|
+
distance_m: 480,
|
|
498
549
|
lat: 42.3133,
|
|
499
550
|
lng: -71.1126,
|
|
500
551
|
url: "https://example.invalid/poi/canto6"
|
|
@@ -503,7 +554,10 @@ const samplePois = [
|
|
|
503
554
|
id: "poi_c2",
|
|
504
555
|
category: "coffee",
|
|
505
556
|
name: "Ula Cafe",
|
|
557
|
+
place_id: "gplace_ula_cafe",
|
|
558
|
+
address: "284 Amory St, Jamaica Plain, MA 02130",
|
|
506
559
|
distance: "0.5 mi",
|
|
560
|
+
distance_m: 800,
|
|
507
561
|
lat: 42.305,
|
|
508
562
|
lng: -71.114,
|
|
509
563
|
url: "https://example.invalid/poi/ula"
|
|
@@ -512,7 +566,10 @@ const samplePois = [
|
|
|
512
566
|
id: "poi_c3",
|
|
513
567
|
category: "coffee",
|
|
514
568
|
name: "Tres Gatos Cafe",
|
|
569
|
+
place_id: "gplace_tres_gatos",
|
|
570
|
+
address: "470 Centre St, Jamaica Plain, MA 02130",
|
|
515
571
|
distance: "0.3 mi",
|
|
572
|
+
distance_m: 480,
|
|
516
573
|
lat: 42.3094,
|
|
517
574
|
lng: -71.1158,
|
|
518
575
|
url: "https://example.invalid/poi/tres-gatos"
|
|
@@ -521,7 +578,10 @@ const samplePois = [
|
|
|
521
578
|
id: "poi_c4",
|
|
522
579
|
category: "coffee",
|
|
523
580
|
name: "J.P. Licks",
|
|
524
|
-
|
|
581
|
+
place_id: "gplace_jp_licks",
|
|
582
|
+
address: "659 Centre St, Jamaica Plain, MA 02130",
|
|
583
|
+
distance: "0.8 mi",
|
|
584
|
+
distance_m: 1290,
|
|
525
585
|
lat: 42.317,
|
|
526
586
|
lng: -71.1186,
|
|
527
587
|
url: "https://example.invalid/poi/jp-licks"
|
|
@@ -530,7 +590,10 @@ const samplePois = [
|
|
|
530
590
|
id: "poi_f1",
|
|
531
591
|
category: "fitness",
|
|
532
592
|
name: "FitRec JP",
|
|
593
|
+
place_id: "gplace_fitrec_jp",
|
|
594
|
+
address: "95 Bickford St, Jamaica Plain, MA 02130",
|
|
533
595
|
distance: "0.3 mi",
|
|
596
|
+
distance_m: 480,
|
|
534
597
|
lat: 42.308,
|
|
535
598
|
lng: -71.1075,
|
|
536
599
|
url: "https://example.invalid/poi/fitrec"
|
|
@@ -539,7 +602,10 @@ const samplePois = [
|
|
|
539
602
|
id: "poi_f2",
|
|
540
603
|
category: "fitness",
|
|
541
604
|
name: "Forge Fitness",
|
|
605
|
+
place_id: "gplace_forge_fitness",
|
|
606
|
+
address: "3187 Washington St, Jamaica Plain, MA 02130",
|
|
542
607
|
distance: "0.6 mi",
|
|
608
|
+
distance_m: 970,
|
|
543
609
|
lat: 42.316,
|
|
544
610
|
lng: -71.105,
|
|
545
611
|
url: "https://example.invalid/poi/forge"
|
|
@@ -548,7 +614,10 @@ const samplePois = [
|
|
|
548
614
|
id: "poi_f3",
|
|
549
615
|
category: "fitness",
|
|
550
616
|
name: "Beacon Yoga",
|
|
617
|
+
place_id: "gplace_beacon_yoga",
|
|
618
|
+
address: "673 Centre St, Jamaica Plain, MA 02130",
|
|
551
619
|
distance: "0.4 mi",
|
|
620
|
+
distance_m: 640,
|
|
552
621
|
lat: 42.314,
|
|
553
622
|
lng: -71.1075,
|
|
554
623
|
url: "https://example.invalid/poi/beacon-yoga"
|
|
@@ -557,42 +626,102 @@ const samplePois = [
|
|
|
557
626
|
id: "poi_f4",
|
|
558
627
|
category: "fitness",
|
|
559
628
|
name: "JP CrossFit",
|
|
629
|
+
place_id: "gplace_jp_crossfit",
|
|
630
|
+
address: "58 Amory St, Jamaica Plain, MA 02130",
|
|
560
631
|
distance: "0.7 mi",
|
|
632
|
+
distance_m: 1130,
|
|
561
633
|
lat: 42.305,
|
|
562
634
|
lng: -71.118,
|
|
563
635
|
url: "https://example.invalid/poi/jp-crossfit"
|
|
564
636
|
}
|
|
565
637
|
];
|
|
566
|
-
const sampleContacts = [
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
638
|
+
const sampleContacts = [
|
|
639
|
+
{
|
|
640
|
+
library_item_id: "li_donovan",
|
|
641
|
+
category: "contact",
|
|
642
|
+
type: "agent",
|
|
643
|
+
position: 0,
|
|
644
|
+
fields: {
|
|
645
|
+
display_name: "James Donovan",
|
|
646
|
+
title: "Listing Agent",
|
|
647
|
+
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
|
+
headshot_url: "https://example.invalid/contacts/james-donovan.jpg",
|
|
649
|
+
website_url: "https://okane-marketing.example.invalid",
|
|
650
|
+
email: "info@homepages.io",
|
|
651
|
+
phone: "(617) 555-1068",
|
|
652
|
+
address: "677 Centre St, Suite 200, Jamaica Plain, MA 02130",
|
|
653
|
+
org_name: "Okane Marketing",
|
|
654
|
+
logo_light: "https://example.invalid/brand/okane-logo-light.svg",
|
|
655
|
+
logo_dark: "https://example.invalid/brand/okane-logo-dark.svg",
|
|
656
|
+
socials: [
|
|
657
|
+
{
|
|
658
|
+
platform: "instagram",
|
|
659
|
+
url: "https://instagram.com/okanemarketing/"
|
|
660
|
+
},
|
|
661
|
+
{
|
|
662
|
+
platform: "linkedin",
|
|
663
|
+
url: "https://linkedin.com/company/okanemarketing/"
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
platform: "x",
|
|
667
|
+
url: "https://x.com/okanemarketing"
|
|
668
|
+
}
|
|
669
|
+
]
|
|
670
|
+
}
|
|
671
|
+
},
|
|
672
|
+
{
|
|
673
|
+
library_item_id: "li_marsh",
|
|
674
|
+
category: "contact",
|
|
675
|
+
type: "agent",
|
|
676
|
+
position: 1,
|
|
677
|
+
fields: {
|
|
678
|
+
display_name: "Elena Marsh",
|
|
679
|
+
title: "Buyer's Agent",
|
|
680
|
+
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.",
|
|
681
|
+
headshot_url: "https://example.invalid/contacts/elena-marsh.jpg",
|
|
682
|
+
website_url: "https://okane-marketing.example.invalid",
|
|
683
|
+
email: "elena@homepages.io",
|
|
684
|
+
phone: "(617) 555-2214",
|
|
685
|
+
address: "677 Centre St, Suite 200, Jamaica Plain, MA 02130",
|
|
686
|
+
org_name: "Okane Marketing",
|
|
687
|
+
logo_light: "https://example.invalid/brand/okane-logo-light.svg",
|
|
688
|
+
logo_dark: "https://example.invalid/brand/okane-logo-dark.svg",
|
|
689
|
+
socials: [{
|
|
582
690
|
platform: "instagram",
|
|
583
|
-
url: "https://instagram.com/
|
|
584
|
-
},
|
|
585
|
-
{
|
|
691
|
+
url: "https://instagram.com/elenamarsh.realty/"
|
|
692
|
+
}, {
|
|
586
693
|
platform: "linkedin",
|
|
587
|
-
url: "https://linkedin.com/
|
|
588
|
-
}
|
|
589
|
-
|
|
694
|
+
url: "https://linkedin.com/in/elena-marsh-realty/"
|
|
695
|
+
}]
|
|
696
|
+
}
|
|
697
|
+
},
|
|
698
|
+
{
|
|
699
|
+
library_item_id: "li_webb",
|
|
700
|
+
category: "contact",
|
|
701
|
+
type: "agent",
|
|
702
|
+
position: 2,
|
|
703
|
+
fields: {
|
|
704
|
+
display_name: "Marcus Webb",
|
|
705
|
+
title: "Director of Sales",
|
|
706
|
+
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.",
|
|
707
|
+
headshot_url: "https://example.invalid/contacts/marcus-webb.jpg",
|
|
708
|
+
website_url: "https://okane-marketing.example.invalid",
|
|
709
|
+
email: "marcus@homepages.io",
|
|
710
|
+
phone: "(617) 555-3357",
|
|
711
|
+
address: "677 Centre St, Suite 200, Jamaica Plain, MA 02130",
|
|
712
|
+
org_name: "Okane Marketing",
|
|
713
|
+
logo_light: "https://example.invalid/brand/okane-logo-light.svg",
|
|
714
|
+
logo_dark: "https://example.invalid/brand/okane-logo-dark.svg",
|
|
715
|
+
socials: [{
|
|
716
|
+
platform: "linkedin",
|
|
717
|
+
url: "https://linkedin.com/in/marcus-webb-realty/"
|
|
718
|
+
}, {
|
|
590
719
|
platform: "x",
|
|
591
|
-
url: "https://x.com/
|
|
592
|
-
}
|
|
593
|
-
|
|
720
|
+
url: "https://x.com/marcuswebbjp"
|
|
721
|
+
}]
|
|
722
|
+
}
|
|
594
723
|
}
|
|
595
|
-
|
|
724
|
+
];
|
|
596
725
|
const sampleAmenities = [
|
|
597
726
|
{
|
|
598
727
|
id: "parking",
|
|
@@ -675,33 +804,26 @@ const sampleProperty = {
|
|
|
675
804
|
year_built: 1885,
|
|
676
805
|
lot_size: "0.18 acres",
|
|
677
806
|
units,
|
|
678
|
-
contacts:
|
|
679
|
-
id: "primary",
|
|
680
|
-
primary:
|
|
681
|
-
name:
|
|
682
|
-
title:
|
|
683
|
-
bio:
|
|
684
|
-
email:
|
|
685
|
-
phone:
|
|
686
|
-
address:
|
|
687
|
-
website_url:
|
|
688
|
-
avatar_upload_id:
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
hero_image: {
|
|
698
|
-
photo_id: galleryPhotos[19].id,
|
|
699
|
-
url: galleryPhotos[19].url,
|
|
700
|
-
alt: galleryPhotos[19].alt
|
|
701
|
-
},
|
|
702
|
-
brand_logo: null,
|
|
703
|
-
listing_status: "for_sale"
|
|
807
|
+
contacts: sampleContacts.map((c, i) => ({
|
|
808
|
+
id: i === 0 ? "primary" : c.library_item_id,
|
|
809
|
+
primary: i === 0,
|
|
810
|
+
name: c.fields.display_name,
|
|
811
|
+
title: c.fields.title,
|
|
812
|
+
bio: c.fields.bio,
|
|
813
|
+
email: c.fields.email,
|
|
814
|
+
phone: c.fields.phone,
|
|
815
|
+
address: c.fields.address,
|
|
816
|
+
website_url: c.fields.website_url,
|
|
817
|
+
avatar_upload_id: `upload_headshot_${c.library_item_id}`,
|
|
818
|
+
org_name: c.fields.org_name,
|
|
819
|
+
logo_light_upload_id: c.fields.logo_light ? `upload_logo_light_${c.library_item_id}` : null,
|
|
820
|
+
logo_dark_upload_id: c.fields.logo_dark ? `upload_logo_dark_${c.library_item_id}` : null,
|
|
821
|
+
instagram_url: c.fields.socials.find((s) => s.platform === "instagram")?.url ?? null,
|
|
822
|
+
linkedin_url: c.fields.socials.find((s) => s.platform === "linkedin")?.url ?? null,
|
|
823
|
+
x_url: c.fields.socials.find((s) => s.platform === "x")?.url ?? null,
|
|
824
|
+
facebook_url: c.fields.socials.find((s) => s.platform === "facebook")?.url ?? null
|
|
825
|
+
}))
|
|
704
826
|
};
|
|
705
827
|
|
|
706
828
|
//#endregion
|
|
707
|
-
export { allPhotos, mkResponsive, sampleAmenities, sampleContacts,
|
|
829
|
+
export { allPhotos, mkResponsive, sampleAmenities, sampleContacts, samplePois, sampleProperty };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PropertyFacts } from "../schema/property-facts.js";
|
|
2
|
+
import { AmenityItem, ContactFixture, PhotoFixture, PoiFixture } from "./sample-property.js";
|
|
3
|
+
//#region src/fixtures/scenario.d.ts
|
|
4
|
+
type ScenarioKey = "luxuryMultiUnit" | "sparseSingleFamily" | "forRentCondo";
|
|
5
|
+
type MediaFixture = {
|
|
6
|
+
video_url: string | null;
|
|
7
|
+
tour_3d_url: string | null;
|
|
8
|
+
};
|
|
9
|
+
type Scenario = {
|
|
10
|
+
key: ScenarioKey;
|
|
11
|
+
label: string;
|
|
12
|
+
facts: PropertyFacts;
|
|
13
|
+
photos: PhotoFixture[];
|
|
14
|
+
pois: PoiFixture[];
|
|
15
|
+
amenities: AmenityItem[];
|
|
16
|
+
contacts: ContactFixture[];
|
|
17
|
+
media: MediaFixture;
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
export { MediaFixture, Scenario, ScenarioKey };
|