@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.
Files changed (33) hide show
  1. package/design-core/index.d.ts +34 -4
  2. package/fesm2022/vectoriox-iox-ui-design-core.mjs +34 -4
  3. package/fesm2022/vectoriox-iox-ui-design-core.mjs.map +1 -1
  4. package/fesm2022/vectoriox-iox-ui-generation-core.mjs +950 -15
  5. package/fesm2022/vectoriox-iox-ui-generation-core.mjs.map +1 -1
  6. package/fesm2022/vectoriox-iox-ui-harness-core.mjs +38 -3
  7. package/fesm2022/vectoriox-iox-ui-harness-core.mjs.map +1 -1
  8. package/fesm2022/vectoriox-iox-ui-media-core.mjs +23 -1
  9. package/fesm2022/vectoriox-iox-ui-media-core.mjs.map +1 -1
  10. package/fesm2022/vectoriox-iox-ui-scene-core.mjs +3 -6
  11. package/fesm2022/vectoriox-iox-ui-scene-core.mjs.map +1 -1
  12. package/generation-core/index.d.ts +585 -8
  13. package/harness-core/index.d.ts +40 -2
  14. package/media-core/index.d.ts +19 -1
  15. package/package.json +1 -1
  16. package/scene-core/index.d.ts +1 -4
  17. package/src/design-core/flavor-spec.generated.ts +34 -4
  18. package/src/generation-core/compose-site.ts +25 -2
  19. package/src/generation-core/film.ts +91 -0
  20. package/src/generation-core/patterns.ts +41 -4
  21. package/src/generation-core/plan-wire.ts +4 -2
  22. package/src/generation-core/public-api.ts +1 -0
  23. package/src/generation-core/serialized-node.ts +3 -0
  24. package/src/generation-core/showcase.ts +32 -7
  25. package/src/generation-core/site-plan.model.ts +8 -0
  26. package/src/generation-core/site-spec.generated.ts +738 -1
  27. package/src/generation-core/validate-site-plan.ts +57 -2
  28. package/src/harness-core/business-types.ts +3 -0
  29. package/src/harness-core/generation-view.ts +3 -1
  30. package/src/harness-core/harness-spec.generated.ts +32 -2
  31. package/src/harness-core/motion.ts +8 -1
  32. package/src/media-core/frames.ts +23 -0
  33. 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
- /** The library's 31 sections (contract `site.library`), each with whether it is composed. */
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
- /** The composed library as the model reads it — every pattern, its budgets under `density` (M1-3's manifest). */
10520
- function patternManifest(density) {
10521
- return Object.entries(SITE_PATTERNS).map(([id, p]) => ({
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
- if (motion && !pattern.global)
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
- /** The showcase as Site Plans — as many as it takes for every header and every footer to be composed once. */
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
- return Array.from({ length: count }, (_, i) => ({
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(input.design)),
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(pages)),
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