@homepages/template-kit 0.4.0 → 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.
Files changed (114) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/README.md +38 -27
  3. package/dist/base.css +6 -4
  4. package/dist/cli/dev/fill-state.js +5 -3
  5. package/dist/cli/link/overlay.js +1 -1
  6. package/dist/cli/new/scaffold/template/sections/hero/fixtures.ts +7 -7
  7. package/dist/contracts/slot-catalog.d.ts +2 -2
  8. package/dist/contracts/slot-catalog.js +3 -1
  9. package/dist/eslint/rules/no-raw-element.js +3 -2
  10. package/dist/fixtures/helpers.d.ts +23 -0
  11. package/dist/fixtures/helpers.js +50 -0
  12. package/dist/fixtures/sample-property.d.ts +7 -17
  13. package/dist/fixtures/sample-property.js +179 -57
  14. package/dist/fixtures/scenario.d.ts +20 -0
  15. package/dist/fixtures/scenarios/for-rent-condo.d.ts +5 -0
  16. package/dist/fixtures/scenarios/for-rent-condo.js +364 -0
  17. package/dist/fixtures/scenarios/index.d.ts +8 -0
  18. package/dist/fixtures/scenarios/index.js +13 -0
  19. package/dist/fixtures/scenarios/luxury-multi-unit.d.ts +5 -0
  20. package/dist/fixtures/scenarios/luxury-multi-unit.js +19 -0
  21. package/dist/fixtures/scenarios/sparse-single-family.d.ts +5 -0
  22. package/dist/fixtures/scenarios/sparse-single-family.js +233 -0
  23. package/dist/fixtures.d.ts +8 -2
  24. package/dist/fixtures.js +7 -2
  25. package/dist/index.d.ts +3 -2
  26. package/dist/index.js +2 -1
  27. package/dist/island-runtime.js +22 -7
  28. package/dist/islands/wrap.d.ts +1 -0
  29. package/dist/islands/wrap.js +1 -1
  30. package/dist/package.js +1 -1
  31. package/dist/primitives/Image.d.ts +1 -1
  32. package/dist/primitives/Video.d.ts +38 -0
  33. package/dist/primitives/Video.js +63 -0
  34. package/dist/primitives/index.d.ts +2 -1
  35. package/dist/rules/registry.js +3 -3
  36. package/dist/schema/index.d.ts +2 -2
  37. package/dist/schema/runtime-values.d.ts +20 -1
  38. package/dist/schema/section-props.d.ts +8 -1
  39. package/dist/schema/section-schema.d.ts +2 -2
  40. package/dist/schema/slot-types.d.ts +15 -1
  41. package/dist/schema/slot-types.js +34 -0
  42. package/dist/schema/synthesize-nullable.js +1 -0
  43. package/{docs → guide}/INDEX.md +7 -6
  44. package/{docs → guide}/check.md +2 -2
  45. package/{docs → guide}/islands.md +6 -1
  46. package/{docs → guide}/llms.txt +34 -14
  47. package/{docs → guide}/overview.md +4 -4
  48. package/{docs → guide}/pack.md +2 -2
  49. package/{docs → guide}/primitives.md +59 -11
  50. package/{docs → guide}/recipes/INDEX.md +1 -0
  51. package/{docs → guide}/recipes/collection-slot.md +10 -8
  52. package/guide/recipes/fixture-states.md +109 -0
  53. package/{docs → guide}/recipes/image-slot-crop.md +5 -3
  54. package/guide/recipes/pick-a-scenario.md +119 -0
  55. package/{docs → guide}/rules/INDEX.md +2 -2
  56. package/{docs → guide}/rules/fixtures-invalid.md +2 -2
  57. package/{docs → guide}/rules/no-raw-element.md +13 -8
  58. package/{docs → guide}/rules/render-invariant.md +4 -3
  59. package/{docs → guide}/schema-system.md +97 -16
  60. package/{docs → guide}/theme-and-css.md +3 -2
  61. package/guide/upgrading.md +61 -0
  62. package/{docs → guide}/vocabulary.md +3 -1
  63. package/package.json +9 -3
  64. package/dist/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -77
  65. package/dist/node_modules/magic-string/dist/magic-string.es.js +0 -939
  66. package/docs/recipes/fixture-states.md +0 -68
  67. /package/{docs → guide}/assets.md +0 -0
  68. /package/{docs → guide}/dev.md +0 -0
  69. /package/{docs → guide}/eslint.md +0 -0
  70. /package/{docs → guide}/new.md +0 -0
  71. /package/{docs → guide}/quickstart.md +0 -0
  72. /package/{docs → guide}/recipes/bind-property-fact.md +0 -0
  73. /package/{docs → guide}/recipes/fill-spec-decision.md +0 -0
  74. /package/{docs → guide}/recipes/interactive-island.md +0 -0
  75. /package/{docs → guide}/recipes/organize-section-folder.md +0 -0
  76. /package/{docs → guide}/recipes/prepare-submission.md +0 -0
  77. /package/{docs → guide}/recipes/second-template.md +0 -0
  78. /package/{docs → guide}/recipes/select-slot.md +0 -0
  79. /package/{docs → guide}/recipes/static-asset.md +0 -0
  80. /package/{docs → guide}/recipes/third-party-package.md +0 -0
  81. /package/{docs → guide}/rules/audit-severity.md +0 -0
  82. /package/{docs → guide}/rules/bundle-binary-asset.md +0 -0
  83. /package/{docs → guide}/rules/bundle-incomplete.md +0 -0
  84. /package/{docs → guide}/rules/css-reason.md +0 -0
  85. /package/{docs → guide}/rules/determinism-drift.md +0 -0
  86. /package/{docs → guide}/rules/image-bare-needs-reason.md +0 -0
  87. /package/{docs → guide}/rules/license-denied.md +0 -0
  88. /package/{docs → guide}/rules/lockfile-missing.md +0 -0
  89. /package/{docs → guide}/rules/lockfile-stale.md +0 -0
  90. /package/{docs → guide}/rules/manifest-invalid.md +0 -0
  91. /package/{docs → guide}/rules/missing-slot-marker.md +0 -0
  92. /package/{docs → guide}/rules/no-bare-css-import.md +0 -0
  93. /package/{docs → guide}/rules/no-client-directive-in-contract.md +0 -0
  94. /package/{docs → guide}/rules/no-client-runtime-in-server.md +0 -0
  95. /package/{docs → guide}/rules/no-css-import-from-render-path.md +0 -0
  96. /package/{docs → guide}/rules/no-hex.md +0 -0
  97. /package/{docs → guide}/rules/no-inline-style.md +0 -0
  98. /package/{docs → guide}/rules/no-nondeterminism.md +0 -0
  99. /package/{docs → guide}/rules/no-templates.md +0 -0
  100. /package/{docs → guide}/rules/parse-error.md +0 -0
  101. /package/{docs → guide}/rules/props-from-schema.md +0 -0
  102. /package/{docs → guide}/rules/schema-invalid.md +0 -0
  103. /package/{docs → guide}/rules/serializable-island-props.md +0 -0
  104. /package/{docs → guide}/rules/server-vs-client.md +0 -0
  105. /package/{docs → guide}/rules/sidebar-order.md +0 -0
  106. /package/{docs → guide}/rules/single-react.md +0 -0
  107. /package/{docs → guide}/rules/size-assets.md +0 -0
  108. /package/{docs → guide}/rules/size-island-bundle.md +0 -0
  109. /package/{docs → guide}/rules/size-renderer-bundle.md +0 -0
  110. /package/{docs → guide}/rules/size-section-css.md +0 -0
  111. /package/{docs → guide}/rules/slot-group-marker.md +0 -0
  112. /package/{docs → guide}/rules/slot-marker-literal.md +0 -0
  113. /package/{docs → guide}/rules/typecheck.md +0 -0
  114. /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
- distance: "0.4 mi",
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
- distance: "0.5 mi",
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
- distance: "0.2 mi",
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
- distance: "0.4 mi",
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
- library_item_id: "li_donovan",
568
- category: "contact",
569
- type: "agent",
570
- position: 0,
571
- fields: {
572
- display_name: "James Donovan",
573
- title: "Listing Agent",
574
- 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.",
575
- headshot_url: "https://example.invalid/contacts/james-donovan.jpg",
576
- website_url: "https://homepages.io",
577
- email: "info@homepages.io",
578
- phone: "(603) 555-1068",
579
- address: "3033 Fifth Ave, Suite 100, Boston, MA 92103",
580
- socials: [
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/okanemarketing/"
584
- },
585
- {
691
+ url: "https://instagram.com/elenamarsh.realty/"
692
+ }, {
586
693
  platform: "linkedin",
587
- url: "https://linkedin.com/company/okanemarketing/"
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/okanemarketing"
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: true,
681
- name: sampleContacts[0].fields.display_name,
682
- title: sampleContacts[0].fields.title,
683
- bio: sampleContacts[0].fields.bio,
684
- email: sampleContacts[0].fields.email,
685
- phone: "(603) 555-1068",
686
- address: sampleContacts[0].fields.address,
687
- website_url: sampleContacts[0].fields.website_url,
688
- avatar_upload_id: "upload_headshot_sample",
689
- instagram_url: sampleContacts[0].fields.socials.find((s) => s.platform === "instagram")?.url ?? null,
690
- linkedin_url: sampleContacts[0].fields.socials.find((s) => s.platform === "linkedin")?.url ?? null,
691
- x_url: sampleContacts[0].fields.socials.find((s) => s.platform === "x")?.url ?? null,
692
- facebook_url: sampleContacts[0].fields.socials.find((s) => s.platform === "facebook")?.url ?? null
693
- }]
694
- };
695
- const sampleHeroSlots = {
696
- headline: "A mansard victorian single-family home in the heart of Jamaica Plain",
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, sampleHeroSlots, samplePois, sampleProperty };
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 };
@@ -0,0 +1,5 @@
1
+ import { Scenario } from "../scenario.js";
2
+ //#region src/fixtures/scenarios/for-rent-condo.d.ts
3
+ declare const forRentCondo: Scenario;
4
+ //#endregion
5
+ export { forRentCondo };