@vectoriox/iox-ui 5.77.0 → 5.79.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/design-core/index.d.ts +34 -4
- package/fesm2022/vectoriox-iox-ui-design-core.mjs +34 -4
- package/fesm2022/vectoriox-iox-ui-design-core.mjs.map +1 -1
- package/fesm2022/vectoriox-iox-ui-generation-core.mjs +950 -15
- package/fesm2022/vectoriox-iox-ui-generation-core.mjs.map +1 -1
- package/fesm2022/vectoriox-iox-ui-harness-core.mjs +38 -3
- package/fesm2022/vectoriox-iox-ui-harness-core.mjs.map +1 -1
- package/fesm2022/vectoriox-iox-ui-media-core.mjs +23 -1
- package/fesm2022/vectoriox-iox-ui-media-core.mjs.map +1 -1
- package/fesm2022/vectoriox-iox-ui-scene-core.mjs +3 -6
- package/fesm2022/vectoriox-iox-ui-scene-core.mjs.map +1 -1
- package/generation-core/index.d.ts +585 -8
- package/harness-core/index.d.ts +40 -2
- package/media-core/index.d.ts +19 -1
- package/package.json +1 -1
- package/scene-core/index.d.ts +1 -4
- package/src/design-core/flavor-spec.generated.ts +34 -4
- package/src/generation-core/compose-site.ts +25 -2
- package/src/generation-core/film.ts +91 -0
- package/src/generation-core/patterns.ts +41 -4
- package/src/generation-core/plan-wire.ts +4 -2
- package/src/generation-core/public-api.ts +1 -0
- package/src/generation-core/serialized-node.ts +3 -0
- package/src/generation-core/showcase.ts +32 -7
- package/src/generation-core/site-plan.model.ts +8 -0
- package/src/generation-core/site-spec.generated.ts +738 -1
- package/src/generation-core/validate-site-plan.ts +57 -2
- package/src/harness-core/business-types.ts +3 -0
- package/src/harness-core/generation-view.ts +3 -1
- package/src/harness-core/harness-spec.generated.ts +32 -2
- package/src/harness-core/motion.ts +8 -1
- package/src/media-core/frames.ts +23 -0
- package/src/scene-core/scene-edit.ts +3 -5
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { NEW_NODE_STYLE_DEFAULTS, defaultElementStyleFor, elementStyleById, ownedTraitsOf, applyElementStyle, flavorPackById, parseHexColor, SPEC_AXES, EntranceParam, staggerDelay, LinkType, COLOR_SCHEMES, setColorScheme, resolveDesignChoices, ANIMATE_IDS, auditDesignContrast } from '@vectoriox/iox-ui/design-core';
|
|
2
2
|
import { formPresetById, FORM_PRESETS, ControlType, FORM_NODE_TYPE, collectFormSpec, FIELD_NODE_TYPE } from '@vectoriox/iox-ui/forms-core';
|
|
3
|
+
import { normalizeFrameSequence, filmScreensFor, FILM_PREPARED_PICTURES, FrameExtension } from '@vectoriox/iox-ui/media-core';
|
|
3
4
|
import { SEO_DESCRIPTION_MAX, SEO_TITLE_MAX } from '@vectoriox/iox-ui/seo-core';
|
|
4
5
|
import { pickTabsAutoBinds, pickAccordionAutoBinds, segmentedOptions, ITEM_OPEN_STATE, CardPart, CardRole, CardLayout, CARD_LAYOUTS, CARD_PARTS, BADGE_TONES, buildCardRecipe, findByRole, buildSegmentedRecipe, AccordionRole, buildAccordionRecipe, ACCORDION_WORDS, accordionItems, accordionQuestionOf, accordionAnswerOf, ACCORDION_BIND_PROP, ACCORDION_CONTENT_LIMIT, buildTabsRecipe, TABS_WORDS, tabsTriggers, tabLabelNodeOf, TABS_LABEL_BIND_PROP, tabsPanels, tabPanelTextOf, TABS_TEXT_BIND_PROP, tabPanelImageOf, tabsListOf, tabsPanelsOf, TABS_CONTENT_LIMIT, TABS_IMAGE_BIND_PROP, buildCarouselRecipe, SLIDE_TYPE, buildLightboxRecipe, LIGHTBOX_LABEL, SLIDE_TO_ROW } from '@vectoriox/iox-ui/composite-core';
|
|
5
6
|
import { ELEMENT_ACTION_DESCRIPTORS, resolveActionAvailability } from '@vectoriox/iox-ui/actions-core';
|
|
@@ -18,7 +19,11 @@ const SPEC_SITE_PLAN_SHAPE = {
|
|
|
18
19
|
"contentTypes": "contentType[]",
|
|
19
20
|
"dataSources": "(cmsDataSource | relativeDataSource)[] — merged by alias into the org library",
|
|
20
21
|
"pages": "page[]",
|
|
21
|
-
"globals": "globals"
|
|
22
|
+
"globals": "globals",
|
|
23
|
+
"film?": "film — the owner's film as pictures (SC6b), set by the build and placed by placeFilm; never a model's"
|
|
24
|
+
},
|
|
25
|
+
"film": {
|
|
26
|
+
"sequence": "object — a media-core FrameSequence: where the numbered pictures live, how many, their size"
|
|
22
27
|
},
|
|
23
28
|
"sourceTemplate": {
|
|
24
29
|
"kind": "'template'",
|
|
@@ -414,6 +419,719 @@ const SPEC_SITE_ARCHETYPES = {
|
|
|
414
419
|
}
|
|
415
420
|
};
|
|
416
421
|
const SPEC_SITE_PATTERNS = {
|
|
422
|
+
"hero.scene-depth": {
|
|
423
|
+
"family": "hero",
|
|
424
|
+
"scene": true,
|
|
425
|
+
"label": "Hero — a picture that opens as you scroll",
|
|
426
|
+
"intent": "One strong picture of the work that opens and settles while the page holds still — a first screen that moves, for a studio with a picture worth it.",
|
|
427
|
+
"node": {
|
|
428
|
+
"t": "Section",
|
|
429
|
+
"es": "section",
|
|
430
|
+
"scheme": "inverse",
|
|
431
|
+
"role": "scene",
|
|
432
|
+
"lay": {
|
|
433
|
+
"position": "relative",
|
|
434
|
+
"display": "block",
|
|
435
|
+
"width": "100%",
|
|
436
|
+
"height": "300vh",
|
|
437
|
+
"padding": "0px"
|
|
438
|
+
},
|
|
439
|
+
"c": [
|
|
440
|
+
{
|
|
441
|
+
"t": "Container",
|
|
442
|
+
"role": "scene.stage",
|
|
443
|
+
"lay": {
|
|
444
|
+
"position": "sticky",
|
|
445
|
+
"top": "0px",
|
|
446
|
+
"display": "block",
|
|
447
|
+
"width": "100%",
|
|
448
|
+
"height": "100svh",
|
|
449
|
+
"overflow": "hidden",
|
|
450
|
+
"padding": "0px"
|
|
451
|
+
},
|
|
452
|
+
"c": [
|
|
453
|
+
{
|
|
454
|
+
"t": "Image",
|
|
455
|
+
"es": "media",
|
|
456
|
+
"ph": "image",
|
|
457
|
+
"lay": {
|
|
458
|
+
"position": "absolute",
|
|
459
|
+
"top": "0px",
|
|
460
|
+
"left": "0px",
|
|
461
|
+
"width": "100%",
|
|
462
|
+
"height": "100%",
|
|
463
|
+
"aspectRatio": "auto",
|
|
464
|
+
"borderRadius": "0px",
|
|
465
|
+
"objectFit": "cover"
|
|
466
|
+
},
|
|
467
|
+
"tracks": [
|
|
468
|
+
{
|
|
469
|
+
"prop": "scale",
|
|
470
|
+
"keys": [
|
|
471
|
+
[
|
|
472
|
+
0,
|
|
473
|
+
1.3
|
|
474
|
+
],
|
|
475
|
+
[
|
|
476
|
+
1,
|
|
477
|
+
1
|
|
478
|
+
]
|
|
479
|
+
]
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
"prop": "clip",
|
|
483
|
+
"from": "bottom",
|
|
484
|
+
"keys": [
|
|
485
|
+
[
|
|
486
|
+
0,
|
|
487
|
+
38
|
|
488
|
+
],
|
|
489
|
+
[
|
|
490
|
+
0.42,
|
|
491
|
+
100
|
|
492
|
+
]
|
|
493
|
+
]
|
|
494
|
+
}
|
|
495
|
+
]
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
"t": "Container",
|
|
499
|
+
"es": "media-scrim",
|
|
500
|
+
"lay": {
|
|
501
|
+
"display": "flex",
|
|
502
|
+
"flexDirection": "column",
|
|
503
|
+
"gap": "14px",
|
|
504
|
+
"position": "absolute",
|
|
505
|
+
"left": "0px",
|
|
506
|
+
"bottom": "0px",
|
|
507
|
+
"width": "100%",
|
|
508
|
+
"padding": "48px 32px 56px 32px"
|
|
509
|
+
},
|
|
510
|
+
"c": [
|
|
511
|
+
{
|
|
512
|
+
"t": "Heading",
|
|
513
|
+
"es": "display",
|
|
514
|
+
"level": "h1",
|
|
515
|
+
"slot": "headline",
|
|
516
|
+
"max": 56,
|
|
517
|
+
"fromBusiness": "name",
|
|
518
|
+
"tracks": [
|
|
519
|
+
{
|
|
520
|
+
"prop": "y",
|
|
521
|
+
"keys": [
|
|
522
|
+
[
|
|
523
|
+
0,
|
|
524
|
+
0
|
|
525
|
+
],
|
|
526
|
+
[
|
|
527
|
+
1,
|
|
528
|
+
-6
|
|
529
|
+
]
|
|
530
|
+
]
|
|
531
|
+
}
|
|
532
|
+
]
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
"t": "Text",
|
|
536
|
+
"es": "lead",
|
|
537
|
+
"slot": "lead",
|
|
538
|
+
"max": 180,
|
|
539
|
+
"fromBusiness": "tagline",
|
|
540
|
+
"ph": "copy",
|
|
541
|
+
"tracks": [
|
|
542
|
+
{
|
|
543
|
+
"prop": "opacity",
|
|
544
|
+
"keys": [
|
|
545
|
+
[
|
|
546
|
+
0.45,
|
|
547
|
+
0
|
|
548
|
+
],
|
|
549
|
+
[
|
|
550
|
+
0.6,
|
|
551
|
+
1
|
|
552
|
+
]
|
|
553
|
+
]
|
|
554
|
+
}
|
|
555
|
+
]
|
|
556
|
+
},
|
|
557
|
+
{
|
|
558
|
+
"t": "ButtonBlock",
|
|
559
|
+
"es": "button-primary",
|
|
560
|
+
"href": "/contact",
|
|
561
|
+
"slot": "cta",
|
|
562
|
+
"max": 24,
|
|
563
|
+
"text": "Get in touch",
|
|
564
|
+
"tracks": [
|
|
565
|
+
{
|
|
566
|
+
"prop": "opacity",
|
|
567
|
+
"keys": [
|
|
568
|
+
[
|
|
569
|
+
0.5,
|
|
570
|
+
0
|
|
571
|
+
],
|
|
572
|
+
[
|
|
573
|
+
0.65,
|
|
574
|
+
1
|
|
575
|
+
]
|
|
576
|
+
]
|
|
577
|
+
}
|
|
578
|
+
]
|
|
579
|
+
}
|
|
580
|
+
]
|
|
581
|
+
}
|
|
582
|
+
]
|
|
583
|
+
}
|
|
584
|
+
]
|
|
585
|
+
}
|
|
586
|
+
},
|
|
587
|
+
"hero.scene-object": {
|
|
588
|
+
"family": "hero",
|
|
589
|
+
"scene": true,
|
|
590
|
+
"film": true,
|
|
591
|
+
"label": "Hero — your film plays as you scroll",
|
|
592
|
+
"intent": "The studio's own film plays forward and back with the scroll behind the headline while the page holds still.",
|
|
593
|
+
"node": {
|
|
594
|
+
"t": "Section",
|
|
595
|
+
"es": "section",
|
|
596
|
+
"scheme": "inverse",
|
|
597
|
+
"role": "scene",
|
|
598
|
+
"lay": {
|
|
599
|
+
"position": "relative",
|
|
600
|
+
"display": "block",
|
|
601
|
+
"width": "100%",
|
|
602
|
+
"height": "300vh",
|
|
603
|
+
"padding": "0px"
|
|
604
|
+
},
|
|
605
|
+
"c": [
|
|
606
|
+
{
|
|
607
|
+
"t": "Container",
|
|
608
|
+
"role": "scene.stage",
|
|
609
|
+
"lay": {
|
|
610
|
+
"position": "sticky",
|
|
611
|
+
"top": "0px",
|
|
612
|
+
"display": "block",
|
|
613
|
+
"width": "100%",
|
|
614
|
+
"height": "100svh",
|
|
615
|
+
"overflow": "hidden",
|
|
616
|
+
"padding": "0px"
|
|
617
|
+
},
|
|
618
|
+
"c": [
|
|
619
|
+
{
|
|
620
|
+
"t": "Video",
|
|
621
|
+
"es": "media",
|
|
622
|
+
"film": true,
|
|
623
|
+
"lay": {
|
|
624
|
+
"position": "absolute",
|
|
625
|
+
"top": "0px",
|
|
626
|
+
"left": "0px",
|
|
627
|
+
"width": "100%",
|
|
628
|
+
"height": "100%",
|
|
629
|
+
"aspectRatio": "auto",
|
|
630
|
+
"borderRadius": "0px"
|
|
631
|
+
},
|
|
632
|
+
"tracks": [
|
|
633
|
+
{
|
|
634
|
+
"prop": "play",
|
|
635
|
+
"keys": [
|
|
636
|
+
[
|
|
637
|
+
0,
|
|
638
|
+
0
|
|
639
|
+
],
|
|
640
|
+
[
|
|
641
|
+
1,
|
|
642
|
+
100
|
|
643
|
+
]
|
|
644
|
+
]
|
|
645
|
+
}
|
|
646
|
+
]
|
|
647
|
+
},
|
|
648
|
+
{
|
|
649
|
+
"t": "Container",
|
|
650
|
+
"es": "media-scrim",
|
|
651
|
+
"lay": {
|
|
652
|
+
"display": "flex",
|
|
653
|
+
"flexDirection": "column",
|
|
654
|
+
"gap": "14px",
|
|
655
|
+
"position": "absolute",
|
|
656
|
+
"left": "0px",
|
|
657
|
+
"bottom": "0px",
|
|
658
|
+
"width": "100%",
|
|
659
|
+
"padding": "48px 32px 56px 32px"
|
|
660
|
+
},
|
|
661
|
+
"c": [
|
|
662
|
+
{
|
|
663
|
+
"t": "Heading",
|
|
664
|
+
"es": "display",
|
|
665
|
+
"level": "h1",
|
|
666
|
+
"slot": "headline",
|
|
667
|
+
"max": 56,
|
|
668
|
+
"fromBusiness": "name",
|
|
669
|
+
"tracks": [
|
|
670
|
+
{
|
|
671
|
+
"prop": "y",
|
|
672
|
+
"keys": [
|
|
673
|
+
[
|
|
674
|
+
0,
|
|
675
|
+
0
|
|
676
|
+
],
|
|
677
|
+
[
|
|
678
|
+
1,
|
|
679
|
+
-6
|
|
680
|
+
]
|
|
681
|
+
]
|
|
682
|
+
}
|
|
683
|
+
]
|
|
684
|
+
},
|
|
685
|
+
{
|
|
686
|
+
"t": "Text",
|
|
687
|
+
"es": "lead",
|
|
688
|
+
"slot": "lead",
|
|
689
|
+
"max": 180,
|
|
690
|
+
"fromBusiness": "tagline",
|
|
691
|
+
"ph": "copy",
|
|
692
|
+
"tracks": [
|
|
693
|
+
{
|
|
694
|
+
"prop": "opacity",
|
|
695
|
+
"keys": [
|
|
696
|
+
[
|
|
697
|
+
0.3,
|
|
698
|
+
0
|
|
699
|
+
],
|
|
700
|
+
[
|
|
701
|
+
0.45,
|
|
702
|
+
1
|
|
703
|
+
]
|
|
704
|
+
]
|
|
705
|
+
}
|
|
706
|
+
]
|
|
707
|
+
},
|
|
708
|
+
{
|
|
709
|
+
"t": "ButtonBlock",
|
|
710
|
+
"es": "button-primary",
|
|
711
|
+
"href": "/contact",
|
|
712
|
+
"slot": "cta",
|
|
713
|
+
"max": 24,
|
|
714
|
+
"text": "Get in touch",
|
|
715
|
+
"tracks": [
|
|
716
|
+
{
|
|
717
|
+
"prop": "opacity",
|
|
718
|
+
"keys": [
|
|
719
|
+
[
|
|
720
|
+
0.35,
|
|
721
|
+
0
|
|
722
|
+
],
|
|
723
|
+
[
|
|
724
|
+
0.5,
|
|
725
|
+
1
|
|
726
|
+
]
|
|
727
|
+
]
|
|
728
|
+
}
|
|
729
|
+
]
|
|
730
|
+
}
|
|
731
|
+
]
|
|
732
|
+
}
|
|
733
|
+
]
|
|
734
|
+
}
|
|
735
|
+
]
|
|
736
|
+
}
|
|
737
|
+
},
|
|
738
|
+
"story.scene-chapters": {
|
|
739
|
+
"family": "story",
|
|
740
|
+
"scene": true,
|
|
741
|
+
"label": "Story — three chapters on one held stage",
|
|
742
|
+
"intent": "How you work in three short chapters that take turns over one picture while the page holds still — a process worth slowing down for.",
|
|
743
|
+
"node": {
|
|
744
|
+
"t": "Section",
|
|
745
|
+
"es": "section",
|
|
746
|
+
"scheme": "inverse",
|
|
747
|
+
"role": "scene",
|
|
748
|
+
"lay": {
|
|
749
|
+
"position": "relative",
|
|
750
|
+
"display": "block",
|
|
751
|
+
"width": "100%",
|
|
752
|
+
"height": "400vh",
|
|
753
|
+
"padding": "0px"
|
|
754
|
+
},
|
|
755
|
+
"c": [
|
|
756
|
+
{
|
|
757
|
+
"t": "Container",
|
|
758
|
+
"role": "scene.stage",
|
|
759
|
+
"lay": {
|
|
760
|
+
"position": "sticky",
|
|
761
|
+
"top": "0px",
|
|
762
|
+
"display": "block",
|
|
763
|
+
"width": "100%",
|
|
764
|
+
"height": "100svh",
|
|
765
|
+
"overflow": "hidden",
|
|
766
|
+
"padding": "0px"
|
|
767
|
+
},
|
|
768
|
+
"c": [
|
|
769
|
+
{
|
|
770
|
+
"t": "Image",
|
|
771
|
+
"es": "media",
|
|
772
|
+
"ph": "image",
|
|
773
|
+
"lay": {
|
|
774
|
+
"position": "absolute",
|
|
775
|
+
"top": "0px",
|
|
776
|
+
"left": "0px",
|
|
777
|
+
"width": "100%",
|
|
778
|
+
"height": "100%",
|
|
779
|
+
"aspectRatio": "auto",
|
|
780
|
+
"borderRadius": "0px",
|
|
781
|
+
"objectFit": "cover"
|
|
782
|
+
},
|
|
783
|
+
"tracks": [
|
|
784
|
+
{
|
|
785
|
+
"prop": "scale",
|
|
786
|
+
"keys": [
|
|
787
|
+
[
|
|
788
|
+
0,
|
|
789
|
+
1.12
|
|
790
|
+
],
|
|
791
|
+
[
|
|
792
|
+
1,
|
|
793
|
+
1
|
|
794
|
+
]
|
|
795
|
+
]
|
|
796
|
+
}
|
|
797
|
+
]
|
|
798
|
+
},
|
|
799
|
+
{
|
|
800
|
+
"t": "Container",
|
|
801
|
+
"es": "media-scrim",
|
|
802
|
+
"lay": {
|
|
803
|
+
"position": "absolute",
|
|
804
|
+
"left": "0px",
|
|
805
|
+
"bottom": "0px",
|
|
806
|
+
"width": "100%",
|
|
807
|
+
"height": "62%",
|
|
808
|
+
"padding": "0px"
|
|
809
|
+
},
|
|
810
|
+
"c": [
|
|
811
|
+
{
|
|
812
|
+
"t": "Container",
|
|
813
|
+
"es": "box",
|
|
814
|
+
"lay": {
|
|
815
|
+
"display": "flex",
|
|
816
|
+
"flexDirection": "column",
|
|
817
|
+
"gap": "12px",
|
|
818
|
+
"position": "absolute",
|
|
819
|
+
"left": "32px",
|
|
820
|
+
"right": "32px",
|
|
821
|
+
"bottom": "56px",
|
|
822
|
+
"maxWidth": "640px"
|
|
823
|
+
},
|
|
824
|
+
"tracks": [
|
|
825
|
+
{
|
|
826
|
+
"prop": "opacity",
|
|
827
|
+
"keys": [
|
|
828
|
+
[
|
|
829
|
+
0,
|
|
830
|
+
1
|
|
831
|
+
],
|
|
832
|
+
[
|
|
833
|
+
0.26,
|
|
834
|
+
1
|
|
835
|
+
],
|
|
836
|
+
[
|
|
837
|
+
0.33,
|
|
838
|
+
0
|
|
839
|
+
]
|
|
840
|
+
]
|
|
841
|
+
},
|
|
842
|
+
{
|
|
843
|
+
"prop": "y",
|
|
844
|
+
"keys": [
|
|
845
|
+
[
|
|
846
|
+
0.26,
|
|
847
|
+
0
|
|
848
|
+
],
|
|
849
|
+
[
|
|
850
|
+
0.33,
|
|
851
|
+
-6
|
|
852
|
+
]
|
|
853
|
+
]
|
|
854
|
+
}
|
|
855
|
+
],
|
|
856
|
+
"c": [
|
|
857
|
+
{
|
|
858
|
+
"t": "Text",
|
|
859
|
+
"es": "eyebrow",
|
|
860
|
+
"slot": "eyebrow",
|
|
861
|
+
"max": 32,
|
|
862
|
+
"ph": "copy",
|
|
863
|
+
"text": "How we work"
|
|
864
|
+
},
|
|
865
|
+
{
|
|
866
|
+
"t": "Heading",
|
|
867
|
+
"es": "h2",
|
|
868
|
+
"level": "h2",
|
|
869
|
+
"slot": "title",
|
|
870
|
+
"max": 52,
|
|
871
|
+
"ph": "copy",
|
|
872
|
+
"text": "It starts with a conversation"
|
|
873
|
+
},
|
|
874
|
+
{
|
|
875
|
+
"t": "Text",
|
|
876
|
+
"es": "lead",
|
|
877
|
+
"slot": "text",
|
|
878
|
+
"max": 180,
|
|
879
|
+
"ph": "copy",
|
|
880
|
+
"text": "What the first step is, in a sentence or two."
|
|
881
|
+
}
|
|
882
|
+
]
|
|
883
|
+
},
|
|
884
|
+
{
|
|
885
|
+
"t": "Container",
|
|
886
|
+
"es": "box",
|
|
887
|
+
"lay": {
|
|
888
|
+
"display": "flex",
|
|
889
|
+
"flexDirection": "column",
|
|
890
|
+
"gap": "12px",
|
|
891
|
+
"position": "absolute",
|
|
892
|
+
"left": "32px",
|
|
893
|
+
"right": "32px",
|
|
894
|
+
"bottom": "56px",
|
|
895
|
+
"maxWidth": "640px"
|
|
896
|
+
},
|
|
897
|
+
"tracks": [
|
|
898
|
+
{
|
|
899
|
+
"prop": "opacity",
|
|
900
|
+
"keys": [
|
|
901
|
+
[
|
|
902
|
+
0.33,
|
|
903
|
+
0
|
|
904
|
+
],
|
|
905
|
+
[
|
|
906
|
+
0.4,
|
|
907
|
+
1
|
|
908
|
+
],
|
|
909
|
+
[
|
|
910
|
+
0.6,
|
|
911
|
+
1
|
|
912
|
+
],
|
|
913
|
+
[
|
|
914
|
+
0.67,
|
|
915
|
+
0
|
|
916
|
+
]
|
|
917
|
+
]
|
|
918
|
+
},
|
|
919
|
+
{
|
|
920
|
+
"prop": "y",
|
|
921
|
+
"keys": [
|
|
922
|
+
[
|
|
923
|
+
0.33,
|
|
924
|
+
6
|
|
925
|
+
],
|
|
926
|
+
[
|
|
927
|
+
0.4,
|
|
928
|
+
0
|
|
929
|
+
],
|
|
930
|
+
[
|
|
931
|
+
0.6,
|
|
932
|
+
0
|
|
933
|
+
],
|
|
934
|
+
[
|
|
935
|
+
0.67,
|
|
936
|
+
-6
|
|
937
|
+
]
|
|
938
|
+
]
|
|
939
|
+
}
|
|
940
|
+
],
|
|
941
|
+
"c": [
|
|
942
|
+
{
|
|
943
|
+
"t": "Heading",
|
|
944
|
+
"es": "h2",
|
|
945
|
+
"level": "h2",
|
|
946
|
+
"slot": "title2",
|
|
947
|
+
"max": 52,
|
|
948
|
+
"ph": "copy",
|
|
949
|
+
"text": "Then we make it"
|
|
950
|
+
},
|
|
951
|
+
{
|
|
952
|
+
"t": "Text",
|
|
953
|
+
"es": "lead",
|
|
954
|
+
"slot": "text2",
|
|
955
|
+
"max": 180,
|
|
956
|
+
"ph": "copy",
|
|
957
|
+
"text": "What the middle of the work is, in a sentence or two."
|
|
958
|
+
}
|
|
959
|
+
]
|
|
960
|
+
},
|
|
961
|
+
{
|
|
962
|
+
"t": "Container",
|
|
963
|
+
"es": "box",
|
|
964
|
+
"lay": {
|
|
965
|
+
"display": "flex",
|
|
966
|
+
"flexDirection": "column",
|
|
967
|
+
"gap": "12px",
|
|
968
|
+
"position": "absolute",
|
|
969
|
+
"left": "32px",
|
|
970
|
+
"right": "32px",
|
|
971
|
+
"bottom": "56px",
|
|
972
|
+
"maxWidth": "640px"
|
|
973
|
+
},
|
|
974
|
+
"tracks": [
|
|
975
|
+
{
|
|
976
|
+
"prop": "opacity",
|
|
977
|
+
"keys": [
|
|
978
|
+
[
|
|
979
|
+
0.67,
|
|
980
|
+
0
|
|
981
|
+
],
|
|
982
|
+
[
|
|
983
|
+
0.74,
|
|
984
|
+
1
|
|
985
|
+
],
|
|
986
|
+
[
|
|
987
|
+
1,
|
|
988
|
+
1
|
|
989
|
+
]
|
|
990
|
+
]
|
|
991
|
+
},
|
|
992
|
+
{
|
|
993
|
+
"prop": "y",
|
|
994
|
+
"keys": [
|
|
995
|
+
[
|
|
996
|
+
0.67,
|
|
997
|
+
6
|
|
998
|
+
],
|
|
999
|
+
[
|
|
1000
|
+
0.74,
|
|
1001
|
+
0
|
|
1002
|
+
]
|
|
1003
|
+
]
|
|
1004
|
+
}
|
|
1005
|
+
],
|
|
1006
|
+
"c": [
|
|
1007
|
+
{
|
|
1008
|
+
"t": "Heading",
|
|
1009
|
+
"es": "h2",
|
|
1010
|
+
"level": "h2",
|
|
1011
|
+
"slot": "title3",
|
|
1012
|
+
"max": 52,
|
|
1013
|
+
"ph": "copy",
|
|
1014
|
+
"text": "And it is yours"
|
|
1015
|
+
},
|
|
1016
|
+
{
|
|
1017
|
+
"t": "Text",
|
|
1018
|
+
"es": "lead",
|
|
1019
|
+
"slot": "text3",
|
|
1020
|
+
"max": 180,
|
|
1021
|
+
"ph": "copy",
|
|
1022
|
+
"text": "What the client leaves with, in a sentence or two."
|
|
1023
|
+
}
|
|
1024
|
+
]
|
|
1025
|
+
}
|
|
1026
|
+
]
|
|
1027
|
+
}
|
|
1028
|
+
]
|
|
1029
|
+
}
|
|
1030
|
+
]
|
|
1031
|
+
}
|
|
1032
|
+
},
|
|
1033
|
+
"proof.scene-words": {
|
|
1034
|
+
"family": "proof",
|
|
1035
|
+
"scene": true,
|
|
1036
|
+
"label": "A testimonial that lights word by word",
|
|
1037
|
+
"intent": "One client's words, lit one word at a time while the page holds still — only once the studio has a real quote worth slowing down for.",
|
|
1038
|
+
"node": {
|
|
1039
|
+
"t": "Section",
|
|
1040
|
+
"es": "section",
|
|
1041
|
+
"role": "scene",
|
|
1042
|
+
"lay": {
|
|
1043
|
+
"position": "relative",
|
|
1044
|
+
"display": "block",
|
|
1045
|
+
"width": "100%",
|
|
1046
|
+
"height": "250vh",
|
|
1047
|
+
"padding": "0px"
|
|
1048
|
+
},
|
|
1049
|
+
"c": [
|
|
1050
|
+
{
|
|
1051
|
+
"t": "Container",
|
|
1052
|
+
"role": "scene.stage",
|
|
1053
|
+
"lay": {
|
|
1054
|
+
"position": "sticky",
|
|
1055
|
+
"top": "0px",
|
|
1056
|
+
"display": "flex",
|
|
1057
|
+
"width": "100%",
|
|
1058
|
+
"height": "100svh",
|
|
1059
|
+
"overflow": "hidden",
|
|
1060
|
+
"padding": "32px 32px 32px 32px",
|
|
1061
|
+
"alignItems": "center",
|
|
1062
|
+
"justifyContent": "center"
|
|
1063
|
+
},
|
|
1064
|
+
"c": [
|
|
1065
|
+
{
|
|
1066
|
+
"t": "Container",
|
|
1067
|
+
"es": "box",
|
|
1068
|
+
"lay": {
|
|
1069
|
+
"display": "flex",
|
|
1070
|
+
"flexDirection": "column",
|
|
1071
|
+
"gap": "20px",
|
|
1072
|
+
"maxWidth": "900px",
|
|
1073
|
+
"width": "100%",
|
|
1074
|
+
"margin": "0px auto 0px auto"
|
|
1075
|
+
},
|
|
1076
|
+
"c": [
|
|
1077
|
+
{
|
|
1078
|
+
"t": "Text",
|
|
1079
|
+
"es": "eyebrow",
|
|
1080
|
+
"slot": "eyebrow",
|
|
1081
|
+
"max": 32,
|
|
1082
|
+
"ph": "copy",
|
|
1083
|
+
"text": "What clients say"
|
|
1084
|
+
},
|
|
1085
|
+
{
|
|
1086
|
+
"t": "Heading",
|
|
1087
|
+
"es": "h2",
|
|
1088
|
+
"level": "h2",
|
|
1089
|
+
"ph": "copy",
|
|
1090
|
+
"text": "A sentence a client actually said, in their own words.",
|
|
1091
|
+
"tracks": [
|
|
1092
|
+
{
|
|
1093
|
+
"prop": "words",
|
|
1094
|
+
"keys": [
|
|
1095
|
+
[
|
|
1096
|
+
0.08,
|
|
1097
|
+
0
|
|
1098
|
+
],
|
|
1099
|
+
[
|
|
1100
|
+
0.7,
|
|
1101
|
+
100
|
|
1102
|
+
]
|
|
1103
|
+
]
|
|
1104
|
+
}
|
|
1105
|
+
]
|
|
1106
|
+
},
|
|
1107
|
+
{
|
|
1108
|
+
"t": "Text",
|
|
1109
|
+
"es": "small",
|
|
1110
|
+
"ph": "copy",
|
|
1111
|
+
"text": "[Client name] · [Project, city]",
|
|
1112
|
+
"tracks": [
|
|
1113
|
+
{
|
|
1114
|
+
"prop": "opacity",
|
|
1115
|
+
"keys": [
|
|
1116
|
+
[
|
|
1117
|
+
0.7,
|
|
1118
|
+
0
|
|
1119
|
+
],
|
|
1120
|
+
[
|
|
1121
|
+
0.82,
|
|
1122
|
+
1
|
|
1123
|
+
]
|
|
1124
|
+
]
|
|
1125
|
+
}
|
|
1126
|
+
]
|
|
1127
|
+
}
|
|
1128
|
+
]
|
|
1129
|
+
}
|
|
1130
|
+
]
|
|
1131
|
+
}
|
|
1132
|
+
]
|
|
1133
|
+
}
|
|
1134
|
+
},
|
|
417
1135
|
"nav.inline-cta": {
|
|
418
1136
|
"family": "nav",
|
|
419
1137
|
"label": "Navigation bar",
|
|
@@ -4919,6 +5637,16 @@ const SPEC_SITE_LIBRARY = [
|
|
|
4919
5637
|
"family": "hero",
|
|
4920
5638
|
"composed": true
|
|
4921
5639
|
},
|
|
5640
|
+
{
|
|
5641
|
+
"id": "hero.scene-depth",
|
|
5642
|
+
"family": "hero",
|
|
5643
|
+
"composed": true
|
|
5644
|
+
},
|
|
5645
|
+
{
|
|
5646
|
+
"id": "hero.scene-object",
|
|
5647
|
+
"family": "hero",
|
|
5648
|
+
"composed": true
|
|
5649
|
+
},
|
|
4922
5650
|
{
|
|
4923
5651
|
"id": "proof.logo-strip",
|
|
4924
5652
|
"family": "proof",
|
|
@@ -4939,6 +5667,11 @@ const SPEC_SITE_LIBRARY = [
|
|
|
4939
5667
|
"family": "proof",
|
|
4940
5668
|
"composed": true
|
|
4941
5669
|
},
|
|
5670
|
+
{
|
|
5671
|
+
"id": "proof.scene-words",
|
|
5672
|
+
"family": "proof",
|
|
5673
|
+
"composed": true
|
|
5674
|
+
},
|
|
4942
5675
|
{
|
|
4943
5676
|
"id": "feature.triad",
|
|
4944
5677
|
"family": "feature",
|
|
@@ -4994,6 +5727,11 @@ const SPEC_SITE_LIBRARY = [
|
|
|
4994
5727
|
"family": "story",
|
|
4995
5728
|
"composed": true
|
|
4996
5729
|
},
|
|
5730
|
+
{
|
|
5731
|
+
"id": "story.scene-chapters",
|
|
5732
|
+
"family": "story",
|
|
5733
|
+
"composed": true
|
|
5734
|
+
},
|
|
4997
5735
|
{
|
|
4998
5736
|
"id": "cta.banner",
|
|
4999
5737
|
"family": "cta",
|
|
@@ -10514,11 +11252,19 @@ function patternLinkSlots(pattern) {
|
|
|
10514
11252
|
function patternHasForm(pattern) {
|
|
10515
11253
|
return patternNodes(pattern).some(n => !!n.preset);
|
|
10516
11254
|
}
|
|
10517
|
-
/**
|
|
11255
|
+
/** SC6: the level a Scene needs — the site's How animated, never a section's own `enter` (a Scene takes no entrance). */
|
|
11256
|
+
const SCENE_LEVEL = 'expressive';
|
|
11257
|
+
/** SC6: Scenes on the home page and at most this many other pages, one per page (`validateSitePlan`). */
|
|
11258
|
+
const SCENE_OTHER_PAGES = 1;
|
|
11259
|
+
/** The library's sections (contract `site.library`), each with whether it is composed. */
|
|
10518
11260
|
const SITE_LIBRARY = SPEC_SITE_LIBRARY;
|
|
10519
|
-
/**
|
|
10520
|
-
|
|
10521
|
-
|
|
11261
|
+
/**
|
|
11262
|
+
* The composed library as the model reads it — every pattern, its budgets under `density` (M1-3's manifest). Given the
|
|
11263
|
+
* site's How animated (SC6), the Scenes are listed only at `SCENE_LEVEL`, marked `scene`; without it, all of them.
|
|
11264
|
+
*/
|
|
11265
|
+
function patternManifest(density, options = {}) {
|
|
11266
|
+
const scenes = !('animate' in options) || options.animate === SCENE_LEVEL;
|
|
11267
|
+
return Object.entries(SITE_PATTERNS).filter(([, p]) => !p.film && (scenes || !p.scene)).map(([id, p]) => ({
|
|
10522
11268
|
id, family: p.family, label: p.label, intent: p.intent, ...(p.global ? { global: p.global } : {}),
|
|
10523
11269
|
slots: Object.fromEntries(Object.keys(patternSlotBudgets(p)).map(slot => [slot, slotBudget(p, slot, density)])),
|
|
10524
11270
|
links: patternLinkSlots(p),
|
|
@@ -10526,6 +11272,7 @@ function patternManifest(density) {
|
|
|
10526
11272
|
roles: [...new Set(patternRoleNeeds(p).map(r => `${r.scope}.@${r.role}${r.optional ? OPTIONAL_MARK$2 : ''}`))],
|
|
10527
11273
|
optionalParts: patternOptionalParts(p),
|
|
10528
11274
|
form: patternHasForm(p),
|
|
11275
|
+
...(p.scene ? { scene: true } : {}),
|
|
10529
11276
|
}));
|
|
10530
11277
|
}
|
|
10531
11278
|
/** The bind scopes a pattern reads (`route`, `next`, …) — what its page must provide. */
|
|
@@ -10866,6 +11613,12 @@ var SitePlanIssueCode;
|
|
|
10866
11613
|
SitePlanIssueCode["UnknownNeed"] = "unknown-need";
|
|
10867
11614
|
/** A page key that is a global slot's name (`header`, `footer`): its sections' ids would be the global's. */
|
|
10868
11615
|
SitePlanIssueCode["ReservedPageKey"] = "reserved-page-key";
|
|
11616
|
+
/** SC6: a Scene below How animated Expressive, a second Scene on a page, or Scenes on more than the home page and
|
|
11617
|
+
* one other — the pages answer by choosing another pattern. */
|
|
11618
|
+
SitePlanIssueCode["SceneBudget"] = "scene-budget";
|
|
11619
|
+
/** SC6b: the owner's film — pictures that cannot play, too few to play smoothly, or a film's pattern on a plan with
|
|
11620
|
+
* no film (or twice). Set by the build, never by a model. */
|
|
11621
|
+
SitePlanIssueCode["Film"] = "film";
|
|
10869
11622
|
})(SitePlanIssueCode || (SitePlanIssueCode = {}));
|
|
10870
11623
|
class SitePlanError extends Error {
|
|
10871
11624
|
constructor(issues) {
|
|
@@ -10895,6 +11648,7 @@ const SEED_FIXED_KEYS = shapeKeys(SHAPE['seed']);
|
|
|
10895
11648
|
const CMS_SOURCE_KEYS = shapeKeys(SHAPE['cmsDataSource']);
|
|
10896
11649
|
const RELATIVE_SOURCE_KEYS = shapeKeys(SHAPE['relativeDataSource']);
|
|
10897
11650
|
const PAGE_KEYS = shapeKeys(SHAPE['page']);
|
|
11651
|
+
const FILM_KEYS = shapeKeys(SHAPE['film']);
|
|
10898
11652
|
const SECTION_KEYS = shapeKeys(SHAPE['section']);
|
|
10899
11653
|
const GLOBAL_POSITION = {
|
|
10900
11654
|
[GlobalSlot.Header]: PatternGlobalPosition.Before,
|
|
@@ -11322,6 +12076,63 @@ function validatePages(c, list, types, sources, density) {
|
|
|
11322
12076
|
if (homes.length !== 1)
|
|
11323
12077
|
c.add(SitePlanIssueCode.Home, 'pages', `exactly one page is the home page (found ${homes.length})`);
|
|
11324
12078
|
}
|
|
12079
|
+
/** SC6 (premium-sites plan, APPROVED 2026-11-05): who may hold the page — Scenes only at Expressive, one per page, on the
|
|
12080
|
+
* home page and at most one other. A Scene past that is an issue at its pattern, so the pages choose another. */
|
|
12081
|
+
function validateScenes(c, pages, animate) {
|
|
12082
|
+
let otherPages = 0;
|
|
12083
|
+
pages.forEach((raw, i) => {
|
|
12084
|
+
if (!isPlainObject(raw) || !Array.isArray(raw['sections']))
|
|
12085
|
+
return;
|
|
12086
|
+
let onPage = 0;
|
|
12087
|
+
const counted = raw['isHome'] === true;
|
|
12088
|
+
raw['sections'].forEach((s, j) => {
|
|
12089
|
+
const pattern = isPlainObject(s) && typeof s['pattern'] === 'string' ? patternById(s['pattern']) : null;
|
|
12090
|
+
if (!pattern?.scene)
|
|
12091
|
+
return;
|
|
12092
|
+
const at = `pages[${i}].sections[${j}].pattern`;
|
|
12093
|
+
if (animate !== SCENE_LEVEL)
|
|
12094
|
+
return c.add(SitePlanIssueCode.SceneBudget, at, `"${s['pattern']}" holds the page as it scrolls — only on a site whose How animated is Expressive (this one is ${animate ?? 'unset'})`);
|
|
12095
|
+
if (++onPage > 1)
|
|
12096
|
+
return c.add(SitePlanIssueCode.SceneBudget, at, 'one Scene per page — choose a section that does not hold the page');
|
|
12097
|
+
if (!counted && onPage === 1 && ++otherPages > SCENE_OTHER_PAGES)
|
|
12098
|
+
c.add(SitePlanIssueCode.SceneBudget, at, `Scenes on the home page and at most ${SCENE_OTHER_PAGES} other page — choose a section that does not hold the page`);
|
|
12099
|
+
});
|
|
12100
|
+
});
|
|
12101
|
+
}
|
|
12102
|
+
/** SC6b: a film plays only when its pictures can (and smoothly over the shortest hold); its pattern only with a film, once. */
|
|
12103
|
+
function validateFilm(c, film, pages) {
|
|
12104
|
+
let playable = false;
|
|
12105
|
+
if (film !== undefined) {
|
|
12106
|
+
if (!isPlainObject(film)) {
|
|
12107
|
+
c.add(SitePlanIssueCode.Shape, 'film', 'must be an object');
|
|
12108
|
+
}
|
|
12109
|
+
else {
|
|
12110
|
+
c.keys(film, FILM_KEYS, 'film');
|
|
12111
|
+
const sequence = normalizeFrameSequence(film['sequence']);
|
|
12112
|
+
if (!sequence)
|
|
12113
|
+
c.add(SitePlanIssueCode.Film, 'film.sequence', 'not a film\'s pictures (a media-core FrameSequence)');
|
|
12114
|
+
else if (filmScreensFor(sequence.wide.count) === null)
|
|
12115
|
+
c.add(SitePlanIssueCode.Film, 'film.sequence', `${sequence.wide.count} pictures — too few to play smoothly`);
|
|
12116
|
+
else
|
|
12117
|
+
playable = true;
|
|
12118
|
+
}
|
|
12119
|
+
}
|
|
12120
|
+
let placed = 0;
|
|
12121
|
+
pages.forEach((raw, i) => {
|
|
12122
|
+
if (!isPlainObject(raw) || !Array.isArray(raw['sections']))
|
|
12123
|
+
return;
|
|
12124
|
+
raw['sections'].forEach((s, j) => {
|
|
12125
|
+
const pattern = isPlainObject(s) && typeof s['pattern'] === 'string' ? patternById(s['pattern']) : null;
|
|
12126
|
+
if (!pattern?.film)
|
|
12127
|
+
return;
|
|
12128
|
+
const path = `pages[${i}].sections[${j}].pattern`;
|
|
12129
|
+
if (!playable)
|
|
12130
|
+
c.add(SitePlanIssueCode.Film, path, `"${s['pattern']}" plays the owner's film — this plan has none`);
|
|
12131
|
+
else if (++placed > 1)
|
|
12132
|
+
c.add(SitePlanIssueCode.Film, path, 'the film plays once on a site');
|
|
12133
|
+
});
|
|
12134
|
+
});
|
|
12135
|
+
}
|
|
11325
12136
|
function validatePageSeo(c, seo, path) {
|
|
11326
12137
|
if (seo === undefined)
|
|
11327
12138
|
return;
|
|
@@ -11374,6 +12185,8 @@ function validateSitePlan(plan) {
|
|
|
11374
12185
|
const design = isPlainObject(plan['design']) ? plan['design'] : {};
|
|
11375
12186
|
validatePages(c, c.array(plan, 'pages', ''), types, sources, typeof design['density'] === 'string' ? design['density'] : null);
|
|
11376
12187
|
validateGlobals(c, plan['globals']);
|
|
12188
|
+
validateScenes(c, c.array(plan, 'pages', ''), typeof design['animate'] === 'string' ? design['animate'] : null);
|
|
12189
|
+
validateFilm(c, plan['film'], c.array(plan, 'pages', ''));
|
|
11377
12190
|
return { valid: c.issues.length === 0, issues: c.issues };
|
|
11378
12191
|
}
|
|
11379
12192
|
/** Throw a `SitePlanError` carrying every issue unless the plan is valid. */
|
|
@@ -11506,6 +12319,79 @@ function planEntrances(input) {
|
|
|
11506
12319
|
});
|
|
11507
12320
|
}
|
|
11508
12321
|
|
|
12322
|
+
/**
|
|
12323
|
+
* The owner's film on a built site (premium sites SC6b). The owner gives a video in Analysis; the wizard's browser makes
|
|
12324
|
+
* it pictures (cms-client `FramesPrepareService`); the build places it. A model never picks the film's pattern — the
|
|
12325
|
+
* manifest and the plan wire leave it out — so ONE pure placement decides where it goes, run by the wizard to draw the
|
|
12326
|
+
* Plan and by the server to build: they cannot disagree.
|
|
12327
|
+
*/
|
|
12328
|
+
/** The pattern a film plays in: the one whose Video is marked `film` in the contract. */
|
|
12329
|
+
const FILM_PATTERN = Object.entries(SITE_PATTERNS).find(([, p]) => p.film)?.[0] ?? '';
|
|
12330
|
+
/** Why a film stays off the site. Each is said to the owner on the Plan step. */
|
|
12331
|
+
var FilmUnplaced;
|
|
12332
|
+
(function (FilmUnplaced) {
|
|
12333
|
+
/** How animated is below Expressive: no section holds the page there. */
|
|
12334
|
+
FilmUnplaced["NotExpressive"] = "notExpressive";
|
|
12335
|
+
/** The home page does not open with a hero to play it in. */
|
|
12336
|
+
FilmUnplaced["NoHero"] = "noHero";
|
|
12337
|
+
/** The home page already holds the page elsewhere (one Scene per page). */
|
|
12338
|
+
FilmUnplaced["AnotherScene"] = "anotherScene";
|
|
12339
|
+
/** Too few pictures to play smoothly over the shortest hold (media-core `FILM_MIN_PICTURES`). */
|
|
12340
|
+
FilmUnplaced["TooShort"] = "tooShort";
|
|
12341
|
+
})(FilmUnplaced || (FilmUnplaced = {}));
|
|
12342
|
+
/** Where a film WOULD play on this plan (the Plan step asks before the pictures exist). */
|
|
12343
|
+
function filmPlacement(plan) {
|
|
12344
|
+
if (plan.design.animate !== SCENE_LEVEL)
|
|
12345
|
+
return { unplaced: FilmUnplaced.NotExpressive };
|
|
12346
|
+
const page = plan.pages.findIndex(p => p.isHome);
|
|
12347
|
+
const sections = page >= 0 ? plan.pages[page].sections : [];
|
|
12348
|
+
const first = patternById(sections[0]?.pattern);
|
|
12349
|
+
if (!first || first.family !== FILM_FAMILY)
|
|
12350
|
+
return { unplaced: FilmUnplaced.NoHero };
|
|
12351
|
+
if (sections.slice(1).some(s => patternById(s.pattern)?.scene))
|
|
12352
|
+
return { unplaced: FilmUnplaced.AnotherScene };
|
|
12353
|
+
return { target: { page, section: 0 } };
|
|
12354
|
+
}
|
|
12355
|
+
const FILM_FAMILY = SITE_PATTERNS[FILM_PATTERN]?.family ?? 'hero';
|
|
12356
|
+
/**
|
|
12357
|
+
* The plan with the owner's film in it: `film` set, and the home page's hero becomes the film's pattern, keeping the
|
|
12358
|
+
* hero's words and links that the film's pattern has. A film that cannot play (unreadable, too few pictures) or a plan
|
|
12359
|
+
* with no place for it leaves the plan as it was — the hero keeps its picture, and the builder can add the film later.
|
|
12360
|
+
*/
|
|
12361
|
+
function placeFilm(plan, sequence) {
|
|
12362
|
+
const film = normalizeFrameSequence(sequence);
|
|
12363
|
+
if (!film || filmScreensFor(film.wide.count) === null)
|
|
12364
|
+
return { plan, unplaced: FilmUnplaced.TooShort };
|
|
12365
|
+
const placement = filmPlacement(plan);
|
|
12366
|
+
if (!placement.target)
|
|
12367
|
+
return { plan, unplaced: placement.unplaced };
|
|
12368
|
+
const { page, section } = placement.target;
|
|
12369
|
+
const pages = plan.pages.map((p, i) => i !== page ? p : {
|
|
12370
|
+
...p,
|
|
12371
|
+
sections: p.sections.map((s, j) => (j === section ? filmSection(s) : s)),
|
|
12372
|
+
});
|
|
12373
|
+
return { plan: { ...plan, pages, film: { sequence: film } } };
|
|
12374
|
+
}
|
|
12375
|
+
function filmSection(hero) {
|
|
12376
|
+
const pattern = SITE_PATTERNS[FILM_PATTERN];
|
|
12377
|
+
const slots = new Set(patternSlots(pattern));
|
|
12378
|
+
const links = new Set(patternLinkSlots(pattern));
|
|
12379
|
+
const keep = (values, allowed) => {
|
|
12380
|
+
const kept = Object.entries(values ?? {}).filter(([key]) => allowed.has(key));
|
|
12381
|
+
return kept.length ? Object.fromEntries(kept) : undefined;
|
|
12382
|
+
};
|
|
12383
|
+
const keptSlots = keep(hero.slots, slots);
|
|
12384
|
+
const keptLinks = keep(hero.links, links);
|
|
12385
|
+
return { pattern: FILM_PATTERN, ...(keptSlots ? { slots: keptSlots } : {}), ...(keptLinks ? { links: keptLinks } : {}) };
|
|
12386
|
+
}
|
|
12387
|
+
/** The film's pictures as the composer stamps them, and the height its Scene holds the page for. */
|
|
12388
|
+
function filmOfPlan(plan) {
|
|
12389
|
+
const sequence = normalizeFrameSequence(plan.film?.sequence);
|
|
12390
|
+
const screens = sequence ? filmScreensFor(sequence.wide.count) : null;
|
|
12391
|
+
// A Scene's root holds the page for its height less the one screen its stage fills.
|
|
12392
|
+
return sequence && screens !== null ? { sequence, heightVh: Math.round((screens + 1) * 100) } : null;
|
|
12393
|
+
}
|
|
12394
|
+
|
|
11509
12395
|
/**
|
|
11510
12396
|
* The phone shapes of a navigation bar (complex-components plan CC1, §7a + R1; boards 1–3). ONE pure tree
|
|
11511
12397
|
* edit, `planNavShape`, turns a site's header into the shape the author (the Navigation bar's "Phone
|
|
@@ -12182,6 +13068,8 @@ const IMAGE = 'Image';
|
|
|
12182
13068
|
const VIDEO = 'Video';
|
|
12183
13069
|
/** A Video's source prop (media-core `VideoTrait.Source` — not `source`, which names a data source). */
|
|
12184
13070
|
const VIDEO_SOURCE_PROP = 'videoSource';
|
|
13071
|
+
/** A Video's pictures the scroll plays (media-core `VideoTrait.Frames`). */
|
|
13072
|
+
const VIDEO_FRAMES_PROP = 'frames';
|
|
12185
13073
|
const DIALOG = 'Dialog';
|
|
12186
13074
|
const SUBMIT_BUTTON = 'SubmitButton';
|
|
12187
13075
|
const FORM_SUCCESS = 'FormSuccess';
|
|
@@ -12509,6 +13397,10 @@ function composeNode(given, id, repeater, ctx) {
|
|
|
12509
13397
|
const node = create(id, type, props, pn.es ?? null);
|
|
12510
13398
|
if (pn.role)
|
|
12511
13399
|
node.role = pn.role;
|
|
13400
|
+
if (pn.tracks?.length)
|
|
13401
|
+
node.sceneTracks = pn.tracks.map(cloneTrack);
|
|
13402
|
+
if (pn.phoneTracks?.length)
|
|
13403
|
+
node.scenePhoneTracks = pn.phoneTracks.map(cloneTrack);
|
|
12512
13404
|
markEntrance(pn, id, repeater, ctx);
|
|
12513
13405
|
// Words.
|
|
12514
13406
|
if (words.placeholder) {
|
|
@@ -12536,6 +13428,15 @@ function composeNode(given, id, repeater, ctx) {
|
|
|
12536
13428
|
setProp(node, VIDEO_SOURCE_PROP, 'file');
|
|
12537
13429
|
setProp(node, 'mode', pn.video);
|
|
12538
13430
|
}
|
|
13431
|
+
// SC6b: a film pattern's Video plays the owner's pictures (the build places the pattern only with a film).
|
|
13432
|
+
if (pn.film) {
|
|
13433
|
+
if (type !== VIDEO)
|
|
13434
|
+
throw new ComposeError(`${id}: "film" belongs on a Video`);
|
|
13435
|
+
const film = filmOfPlan(ctx.plan);
|
|
13436
|
+
if (!film)
|
|
13437
|
+
throw new ComposeError(`${id}: a film's pattern on a plan with no film`);
|
|
13438
|
+
setProp(node, VIDEO_FRAMES_PROP, film.sequence);
|
|
13439
|
+
}
|
|
12539
13440
|
if (pn.ph === PatternPlaceholder.Video) {
|
|
12540
13441
|
setProp(node, 'src', '');
|
|
12541
13442
|
ctx.placeholders.push({ nodeId: id, owner: ctx.owner, kind: PlaceholderKind.Video, text: '' });
|
|
@@ -12962,6 +13863,13 @@ function wireOpeners(root, openers) {
|
|
|
12962
13863
|
};
|
|
12963
13864
|
visit(root);
|
|
12964
13865
|
}
|
|
13866
|
+
/** How a composed section moves in (M1-6b): the look's How animated (or the section's own) on the page's direction. */
|
|
13867
|
+
/** SC6: a track's own copy, so a composed page never shares an array with the contract. */
|
|
13868
|
+
const cloneTrack = (track) => ({
|
|
13869
|
+
prop: track.prop,
|
|
13870
|
+
keys: track.keys.map(([at, value]) => [at, value]),
|
|
13871
|
+
...(track.from ? { from: track.from } : {}),
|
|
13872
|
+
});
|
|
12965
13873
|
function composePattern(pattern, id, ctx, motion = null) {
|
|
12966
13874
|
if (pattern.node.each)
|
|
12967
13875
|
throw new ComposeError(`${id}: a pattern's root cannot be stamped per page`);
|
|
@@ -12971,8 +13879,13 @@ function composePattern(pattern, id, ctx, motion = null) {
|
|
|
12971
13879
|
throw new ComposeError(`${id}: a pattern's root cannot be optional or a link`);
|
|
12972
13880
|
wireOpeners(node, own.openers ?? []);
|
|
12973
13881
|
wireShownWhen(node, own.shownWhen ?? []);
|
|
12974
|
-
|
|
13882
|
+
// A Scene moves by the scroll alone: the look's entrances would fade its pinned stage in on arrival (SC6).
|
|
13883
|
+
if (motion && !pattern.global && !pattern.scene)
|
|
12975
13884
|
stampEntrances(node, pattern.family, own.entrances ?? [], motion);
|
|
13885
|
+
// SC6b, the density rule: a film's Scene holds the page as long as its pictures stay smooth, and no longer.
|
|
13886
|
+
const film = pattern.film ? filmOfPlan(ctx.plan) : null;
|
|
13887
|
+
if (film)
|
|
13888
|
+
setStyleProps(node, { height: `${film.heightVh}vh` });
|
|
12976
13889
|
node.label = pattern.label;
|
|
12977
13890
|
return node;
|
|
12978
13891
|
}
|
|
@@ -13290,6 +14203,12 @@ function describePlanData(plan) {
|
|
|
13290
14203
|
return plan.pages.map(page => ({ pageKey: page.key, lines: pageLines(page, plan, label) }));
|
|
13291
14204
|
}
|
|
13292
14205
|
|
|
14206
|
+
/** SC6b: a film's description for the showcase — as many pictures as the build prepares; nothing is fetched to compose it. */
|
|
14207
|
+
const SHOWCASE_FILM = {
|
|
14208
|
+
base: 'https://showcase.iox.invalid/film', ext: FrameExtension.Webp,
|
|
14209
|
+
wide: { count: FILM_PREPARED_PICTURES, width: 1600, height: 900 },
|
|
14210
|
+
phone: { count: FILM_PREPARED_PICTURES, width: 1100, height: 619 },
|
|
14211
|
+
};
|
|
13293
14212
|
const ITEM_ROUTE = '/work/:slug';
|
|
13294
14213
|
const LIST_SOURCE = 'projects';
|
|
13295
14214
|
const routeOf = (family) => `/${family}`;
|
|
@@ -13308,7 +14227,7 @@ function showcasePages() {
|
|
|
13308
14227
|
const byFamily = new Map();
|
|
13309
14228
|
const onItemPage = [];
|
|
13310
14229
|
for (const [id, p] of Object.entries(SITE_PATTERNS)) {
|
|
13311
|
-
if (p.global)
|
|
14230
|
+
if (p.global || p.scene)
|
|
13312
14231
|
continue;
|
|
13313
14232
|
if (readsRouteItem(id)) {
|
|
13314
14233
|
onItemPage.push(id);
|
|
@@ -13333,22 +14252,36 @@ function showcaseGlobals() {
|
|
|
13333
14252
|
const of = (position) => Object.entries(SITE_PATTERNS).filter(([, p]) => p.global === position).map(([id]) => id);
|
|
13334
14253
|
return { headers: of(PatternGlobalPosition.Before), footers: of(PatternGlobalPosition.After) };
|
|
13335
14254
|
}
|
|
13336
|
-
/**
|
|
14255
|
+
/** SC6: the Scene patterns — each shown alone on the home page of its own plan, as a site may hold one (validateScenes). */
|
|
14256
|
+
function showcaseScenes() {
|
|
14257
|
+
return Object.entries(SITE_PATTERNS).filter(([, p]) => p.scene && !p.global).map(([id]) => id);
|
|
14258
|
+
}
|
|
14259
|
+
/**
|
|
14260
|
+
* The showcase as Site Plans — as many as it takes for every header and every footer to be composed once, then one per
|
|
14261
|
+
* Scene pattern (SC6): its home page holds that Scene and nothing else, at How animated Expressive, the only level a
|
|
14262
|
+
* Scene is composed at; the film's Scene with a film (SC6b).
|
|
14263
|
+
*/
|
|
13337
14264
|
function showcasePlans(input) {
|
|
13338
14265
|
const { headers, footers } = showcaseGlobals();
|
|
13339
14266
|
const count = Math.max(headers.length, footers.length, 1);
|
|
13340
14267
|
const pages = showcasePages();
|
|
13341
|
-
|
|
14268
|
+
const plan = (i, planPages, design) => ({
|
|
13342
14269
|
version: SITE_PLAN_VERSION,
|
|
13343
14270
|
source: { kind: SitePlanSourceKind.Template, templateId: 'showcase', templateVersion: 1 },
|
|
13344
14271
|
business: JSON.parse(JSON.stringify(input.business)),
|
|
13345
14272
|
...(input.locale ? { locale: input.locale } : {}),
|
|
13346
|
-
design: JSON.parse(JSON.stringify(
|
|
14273
|
+
design: JSON.parse(JSON.stringify(design)),
|
|
13347
14274
|
contentTypes: JSON.parse(JSON.stringify(STUDIO_TEMPLATE.contentTypes)),
|
|
13348
14275
|
dataSources: JSON.parse(JSON.stringify(STUDIO_TEMPLATE.dataSources)),
|
|
13349
|
-
pages: JSON.parse(JSON.stringify(
|
|
14276
|
+
pages: JSON.parse(JSON.stringify(planPages)),
|
|
13350
14277
|
globals: { [GlobalSlot.Header]: headers[i % headers.length], [GlobalSlot.Footer]: footers[i % footers.length] },
|
|
13351
|
-
})
|
|
14278
|
+
});
|
|
14279
|
+
const scenes = showcaseScenes().map((id, i) => {
|
|
14280
|
+
const scene = plan(i, [{ key: 'home', name: 'Home', route: '/', isHome: true, inNav: false, sections: [sectionFor(id)] }], { ...input.design, animate: SCENE_LEVEL });
|
|
14281
|
+
// A film's Scene plays a film (SC6b): the plan carries one, as the build's would.
|
|
14282
|
+
return SITE_PATTERNS[id].film ? { ...scene, film: { sequence: JSON.parse(JSON.stringify(input.film ?? SHOWCASE_FILM)) } } : scene;
|
|
14283
|
+
});
|
|
14284
|
+
return [...Array.from({ length: count }, (_, i) => plan(i, pages, input.design)), ...scenes];
|
|
13352
14285
|
}
|
|
13353
14286
|
|
|
13354
14287
|
/**
|
|
@@ -13754,6 +14687,8 @@ const PLAN_WIRE_DERIVED = {
|
|
|
13754
14687
|
sourceTemplate: 'the AI never writes a template plan',
|
|
13755
14688
|
sourceAi: 'this run (the context)',
|
|
13756
14689
|
design: "the owner's pick (the context)",
|
|
14690
|
+
'plan.film': "the owner's film, set by the build (SC6b)",
|
|
14691
|
+
film: "the owner's film, set by the build (SC6b)",
|
|
13757
14692
|
};
|
|
13758
14693
|
const wireText = (spec) => {
|
|
13759
14694
|
const [entry, planKey] = spec.refs[0].split('.');
|
|
@@ -13798,9 +14733,9 @@ const NONE = '';
|
|
|
13798
14733
|
const orNone = (values) => jsonOneOf([NONE, ...values]);
|
|
13799
14734
|
const closedOrText = (values) => (values.length ? jsonOneOf(values) : jsonText());
|
|
13800
14735
|
const shaped = (entry, properties) => jsonShapedObject(PLAN_WIRE_SHAPE[entry], properties, `wire ${entry}`);
|
|
13801
|
-
/** The patterns a page section may use (every non-global one), in library order. */
|
|
14736
|
+
/** The patterns a page section may use (every non-global one but a film's, which `placeFilm` places), in library order. */
|
|
13802
14737
|
function sectionPatternIds() {
|
|
13803
|
-
return Object.entries(SITE_PATTERNS).filter(([, p]) => !p.global).map(([id]) => id);
|
|
14738
|
+
return Object.entries(SITE_PATTERNS).filter(([, p]) => !p.global && !p.film).map(([id]) => id);
|
|
13804
14739
|
}
|
|
13805
14740
|
const sectionPatterns = () => sectionPatternIds().map(id => SITE_PATTERNS[id]);
|
|
13806
14741
|
const globalIds = (position) => Object.entries(SITE_PATTERNS).filter(([, p]) => p.global === position).map(([id]) => id);
|
|
@@ -15880,5 +16815,5 @@ function addStockCredits(footer, credits) {
|
|
|
15880
16815
|
* Generated bundle index. Do not edit.
|
|
15881
16816
|
*/
|
|
15882
16817
|
|
|
15883
|
-
export { ACTIVE_BUILD_STATUSES, AI_REFUSAL_NEXT, AI_REFUSAL_STATUS, AI_STEPS, AI_STEP_LABELS, AI_STEP_NEEDS, AI_STEP_PART_TOKENS, AI_STEP_TYPICAL_TOKENS, AiCallStatus, AiCapability, AiFeature, AiGenerationStage, AiKeyMode, AiLimit, AiNextKind, AiProviderId, AiRefusalCode, AiStep, BAR_ITEMS_MAX, BAR_ITEMS_MIN, BASELINE_ROLES, BUILD_STEPS, BaselineRole, BindScope, BuildNoticeCode, BuildStep, CONTENT_ROLE_MEANINGS, CREDITS_PER_USD, CardBindTarget, CheckSeverity, ComposeError, ComposeIssueCode, ContentFieldControl, ContentFieldType, ContentRole, ContentTypeAction, CreatedKind, DANGLING_LINK_CODES, DEFAULT_PHONE_MENU_BREAKPOINT, DEFAULT_SITE_LOCALE, ENTRANCE_EASING, ENTRANCE_ORIGIN_LOOK, ENTRANCE_TRIGGER, EntrancePart, EntranceSide, FACT_KEYS, FIELD_TYPE_OF_CONTROL, FINAL_GENERATION_STAGES, FINDING_SEVERITY, GRAMMAR_TOO_LARGE_MESSAGE, GlobalSlot, HEBREW_PREFIXES, JSON_SCHEMA_BANNED_KEYWORDS, JsonSchemaShapeError, KeptReason, NAV_PART_LABELS, NAV_SHAPE_COPY, NEUTRAL_STYLE_PROPS, NODE_BASELINES, NO_TOKENS, NavPagesSource, NavRole, NavShape, NavShapeError, PAGE_ARCHETYPES, PLAN_EDITS_ANSWER_SHAPES, PLAN_EDITS_PART_SCHEMA_NAMES, PLAN_EDIT_OP_PART, PLAN_EDIT_SHAPE, PLAN_EDIT_WIRE_KEYS, PLAN_PARTS, PLAN_PART_KEYS, PLAN_WIRE_DERIVED, PLAN_WIRE_PART_SCHEMA_NAMES, PLAN_WIRE_SHAPE, PRICING_PATTERN, PUBLISH_BLOCKING_PLACEHOLDERS, PageDataKind, PathIssueCollector, PatternDirective, PatternGlobalPosition, PatternOpens, PatternPlaceholder, PatternRecipe, PhoneMenuBreakpoint, PlaceholderKind, PlanChangeAction, PlanChangeKind, PlanDataSourceMode, PlanDataSourceType, PlanEditIssueCode, PlanEditOp, PlanEditsOutcome, PlanPart, PlanWireEntry, PlanWireShapeError, PlanWordIssueCode, PreflightRefusalCode, PublishRefusalCode, REQUIRED_CONTENT_ROLES, RelativeOp, SAMPLE_IMAGE_REF, SITE_CHECKS, SITE_FACT_LABELS, SITE_HEADER_PATTERN, SITE_LIBRARY, SITE_LOCALES, SITE_NEED_IDS, SITE_PATTERNS, SITE_PLAN_VERSION, SITE_TEMPLATES, SPEC_SITE_ARCHETYPES, SPEC_SITE_COPY_LENGTHS, SPEC_SITE_DENSITY_COPY, SPEC_SITE_FACTS, SPEC_SITE_LIBRARY, SPEC_SITE_LOCALES, SPEC_SITE_NEED_IDS, SPEC_SITE_PATTERNS, SPEC_SITE_PLAN_SHAPE, SPEC_SITE_REQUIRED_ROLES, SPEC_SITE_ROLES, SPEC_SITE_TEMPLATES, STOCK_FAMILIES, STOCK_FAMILY_INTENTS, STOCK_INTENT_ORDER, STOCK_INTENT_SUBJECTS, STOCK_ITEM_ASPECT, STOCK_MIN_KEPT, STOCK_PROVIDER_TERMS, STOCK_SUBJECT_WORDS, STRICT_SCHEMA_BUDGET, STRICT_SCHEMA_LIMITS, STUDIO_TEMPLATE, SiteBuildKind, SiteBuildStatus, SiteCheckId, SiteFindingCode, SiteLocale, SitePlanError, SitePlanIssueCode, SitePlanSourceKind, SiteTemplateError, SiteTemplateId, StepState, StockIntent, StockOrientation, StockProviderId, StockReviewFlag, StockReviewVerdict, StockSlotKind, StockSubject, addBarItem, addStockCredits, aiStepParts, applyOwnPhotoGalleries, applyPlanEdits, applyStockItemPhotos, applyStockPhotos, archetypeIssues, aspectRatioOf, assertStyleSlots, assertValidSitePlan, auditSite, barIconForRoute, blocksPublish, buildKeys, buildStepFacts, builtHomePageId, composeNavHeader, composeSection, composeSite, contentTypePreviewFields, contentTypeToWire, copyLengthOf, costUsd, createSerializedNode, creditsOfUsd, dataSourceToWire, derivedDataSources, describePlanData, describeShapeKey, entranceAction, entranceInteraction, estimateStepCredits, expandPlanWire, expandWireContentType, expandWireDataSource, expandWireEdit, expandWireField, expandWirePage, expandWireSection, failedBuildStep, fieldToWire, findNavRoot, isActiveBuild, isNonEmptyString, isPlainObject, isRtlLocale, jsonAnyOf, jsonBoolean, jsonClosedObject, jsonInteger, jsonListOf, jsonOneOf, jsonSchemaKeywords, jsonSchemaObjects, jsonShapedObject, jsonText, modelCanDo, moveBarItem, navPages, navShapeBreakpoint, navShapeOf, nextSourceOf, nodeBindPaths, orientationOfRatio, pageToWire, parsePatternPath, parseSampleImageRef, pathAt, patternById, patternHasForm, patternLinkSlots, patternListGap, patternManifest, patternNeedsBinding, patternNodes, patternOptionalParts, patternRoleNeeds, patternScopes, patternSlotBudgets, patternSlots, patternTakesBinding, phoneMenuPages, planEditOps, planEditToWire, planEditWireGaps, planEditWireKeys, planEditWireOps, planEditWireShape, planEditsFromWire, planEditsJsonSchema, planEditsToWire, planEntrances, planFromTemplate, planNavShape, planOwnPhotos, planPartOfPath, planPartToWire, planStockPhotos, planToWire, planWireGaps, planWirePartJsonSchema, planWirePartShape, planWordIssues, publishRefusal, publishVerdict, recipeListBinds, releasedLayoutDefaults, removeBarItem, requiredAcknowledgements, requiredShapeKeys, roleField, routeMatches, routeParams, sampleImageRef, scoreStockPhoto, sectionEntrances, sectionPatternIds, sectionToWire, setStyleProps, shapeKeys, showcaseGlobals, showcasePages, showcasePlans, siteNavPages, slotBudget, stockCopyKey, stockCreditLine, stockCreditLines, stockCreditNode, stockCreditNodeId, stockFits, stockGroupOf, stockItemSlots, stockKept, stockPhotoRatio, stockPhotoSubject, stockPhotoUsable, stockPhotoWords, stockSlots, stockWord, stockWords, strictSchemaComplexity, strictSchemaRefusal, typicalStepTokens, validatePlanEdits, validateSitePlan, walkSerialized, wireContentTypeJsonSchema, wireDataSourceJsonSchema, wireFieldJsonSchema, wirePageJsonSchema, wireSectionJsonSchema, withDerivedSources, wordPattern, writtenTexts };
|
|
16818
|
+
export { ACTIVE_BUILD_STATUSES, AI_REFUSAL_NEXT, AI_REFUSAL_STATUS, AI_STEPS, AI_STEP_LABELS, AI_STEP_NEEDS, AI_STEP_PART_TOKENS, AI_STEP_TYPICAL_TOKENS, AiCallStatus, AiCapability, AiFeature, AiGenerationStage, AiKeyMode, AiLimit, AiNextKind, AiProviderId, AiRefusalCode, AiStep, BAR_ITEMS_MAX, BAR_ITEMS_MIN, BASELINE_ROLES, BUILD_STEPS, BaselineRole, BindScope, BuildNoticeCode, BuildStep, CONTENT_ROLE_MEANINGS, CREDITS_PER_USD, CardBindTarget, CheckSeverity, ComposeError, ComposeIssueCode, ContentFieldControl, ContentFieldType, ContentRole, ContentTypeAction, CreatedKind, DANGLING_LINK_CODES, DEFAULT_PHONE_MENU_BREAKPOINT, DEFAULT_SITE_LOCALE, ENTRANCE_EASING, ENTRANCE_ORIGIN_LOOK, ENTRANCE_TRIGGER, EntrancePart, EntranceSide, FACT_KEYS, FIELD_TYPE_OF_CONTROL, FILM_PATTERN, FINAL_GENERATION_STAGES, FINDING_SEVERITY, FilmUnplaced, GRAMMAR_TOO_LARGE_MESSAGE, GlobalSlot, HEBREW_PREFIXES, JSON_SCHEMA_BANNED_KEYWORDS, JsonSchemaShapeError, KeptReason, NAV_PART_LABELS, NAV_SHAPE_COPY, NEUTRAL_STYLE_PROPS, NODE_BASELINES, NO_TOKENS, NavPagesSource, NavRole, NavShape, NavShapeError, PAGE_ARCHETYPES, PLAN_EDITS_ANSWER_SHAPES, PLAN_EDITS_PART_SCHEMA_NAMES, PLAN_EDIT_OP_PART, PLAN_EDIT_SHAPE, PLAN_EDIT_WIRE_KEYS, PLAN_PARTS, PLAN_PART_KEYS, PLAN_WIRE_DERIVED, PLAN_WIRE_PART_SCHEMA_NAMES, PLAN_WIRE_SHAPE, PRICING_PATTERN, PUBLISH_BLOCKING_PLACEHOLDERS, PageDataKind, PathIssueCollector, PatternDirective, PatternGlobalPosition, PatternOpens, PatternPlaceholder, PatternRecipe, PhoneMenuBreakpoint, PlaceholderKind, PlanChangeAction, PlanChangeKind, PlanDataSourceMode, PlanDataSourceType, PlanEditIssueCode, PlanEditOp, PlanEditsOutcome, PlanPart, PlanWireEntry, PlanWireShapeError, PlanWordIssueCode, PreflightRefusalCode, PublishRefusalCode, REQUIRED_CONTENT_ROLES, RelativeOp, SAMPLE_IMAGE_REF, SCENE_LEVEL, SCENE_OTHER_PAGES, SHOWCASE_FILM, SITE_CHECKS, SITE_FACT_LABELS, SITE_HEADER_PATTERN, SITE_LIBRARY, SITE_LOCALES, SITE_NEED_IDS, SITE_PATTERNS, SITE_PLAN_VERSION, SITE_TEMPLATES, SPEC_SITE_ARCHETYPES, SPEC_SITE_COPY_LENGTHS, SPEC_SITE_DENSITY_COPY, SPEC_SITE_FACTS, SPEC_SITE_LIBRARY, SPEC_SITE_LOCALES, SPEC_SITE_NEED_IDS, SPEC_SITE_PATTERNS, SPEC_SITE_PLAN_SHAPE, SPEC_SITE_REQUIRED_ROLES, SPEC_SITE_ROLES, SPEC_SITE_TEMPLATES, STOCK_FAMILIES, STOCK_FAMILY_INTENTS, STOCK_INTENT_ORDER, STOCK_INTENT_SUBJECTS, STOCK_ITEM_ASPECT, STOCK_MIN_KEPT, STOCK_PROVIDER_TERMS, STOCK_SUBJECT_WORDS, STRICT_SCHEMA_BUDGET, STRICT_SCHEMA_LIMITS, STUDIO_TEMPLATE, SiteBuildKind, SiteBuildStatus, SiteCheckId, SiteFindingCode, SiteLocale, SitePlanError, SitePlanIssueCode, SitePlanSourceKind, SiteTemplateError, SiteTemplateId, StepState, StockIntent, StockOrientation, StockProviderId, StockReviewFlag, StockReviewVerdict, StockSlotKind, StockSubject, addBarItem, addStockCredits, aiStepParts, applyOwnPhotoGalleries, applyPlanEdits, applyStockItemPhotos, applyStockPhotos, archetypeIssues, aspectRatioOf, assertStyleSlots, assertValidSitePlan, auditSite, barIconForRoute, blocksPublish, buildKeys, buildStepFacts, builtHomePageId, composeNavHeader, composeSection, composeSite, contentTypePreviewFields, contentTypeToWire, copyLengthOf, costUsd, createSerializedNode, creditsOfUsd, dataSourceToWire, derivedDataSources, describePlanData, describeShapeKey, entranceAction, entranceInteraction, estimateStepCredits, expandPlanWire, expandWireContentType, expandWireDataSource, expandWireEdit, expandWireField, expandWirePage, expandWireSection, failedBuildStep, fieldToWire, filmOfPlan, filmPlacement, findNavRoot, isActiveBuild, isNonEmptyString, isPlainObject, isRtlLocale, jsonAnyOf, jsonBoolean, jsonClosedObject, jsonInteger, jsonListOf, jsonOneOf, jsonSchemaKeywords, jsonSchemaObjects, jsonShapedObject, jsonText, modelCanDo, moveBarItem, navPages, navShapeBreakpoint, navShapeOf, nextSourceOf, nodeBindPaths, orientationOfRatio, pageToWire, parsePatternPath, parseSampleImageRef, pathAt, patternById, patternHasForm, patternLinkSlots, patternListGap, patternManifest, patternNeedsBinding, patternNodes, patternOptionalParts, patternRoleNeeds, patternScopes, patternSlotBudgets, patternSlots, patternTakesBinding, phoneMenuPages, placeFilm, planEditOps, planEditToWire, planEditWireGaps, planEditWireKeys, planEditWireOps, planEditWireShape, planEditsFromWire, planEditsJsonSchema, planEditsToWire, planEntrances, planFromTemplate, planNavShape, planOwnPhotos, planPartOfPath, planPartToWire, planStockPhotos, planToWire, planWireGaps, planWirePartJsonSchema, planWirePartShape, planWordIssues, publishRefusal, publishVerdict, recipeListBinds, releasedLayoutDefaults, removeBarItem, requiredAcknowledgements, requiredShapeKeys, roleField, routeMatches, routeParams, sampleImageRef, scoreStockPhoto, sectionEntrances, sectionPatternIds, sectionToWire, setStyleProps, shapeKeys, showcaseGlobals, showcasePages, showcasePlans, showcaseScenes, siteNavPages, slotBudget, stockCopyKey, stockCreditLine, stockCreditLines, stockCreditNode, stockCreditNodeId, stockFits, stockGroupOf, stockItemSlots, stockKept, stockPhotoRatio, stockPhotoSubject, stockPhotoUsable, stockPhotoWords, stockSlots, stockWord, stockWords, strictSchemaComplexity, strictSchemaRefusal, typicalStepTokens, validatePlanEdits, validateSitePlan, walkSerialized, wireContentTypeJsonSchema, wireDataSourceJsonSchema, wireFieldJsonSchema, wirePageJsonSchema, wireSectionJsonSchema, withDerivedSources, wordPattern, writtenTexts };
|
|
15884
16819
|
//# sourceMappingURL=vectoriox-iox-ui-generation-core.mjs.map
|