@orion-studios/payload-studio 0.6.0-beta.47 → 0.6.0-beta.49

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.
@@ -190,6 +190,18 @@ var parseAttributes = (value) => {
190
190
  if (name === "data-orion-component" || name === "data-orion-id") {
191
191
  continue;
192
192
  }
193
+ if (name === "data-orion-props") {
194
+ const decoded = decodeHtmlAttribute(rawValue);
195
+ try {
196
+ const parsed = JSON.parse(decoded);
197
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
198
+ Object.assign(props, parsed);
199
+ }
200
+ } catch {
201
+ props.propsJson = decoded;
202
+ }
203
+ continue;
204
+ }
193
205
  const propName = name.replace(/^data-orion-/, "").replace(/^data-/, "").replace(/-([a-z])/g, (_, char) => char.toUpperCase());
194
206
  props[propName] = decodeHtmlAttribute(rawValue);
195
207
  }
@@ -577,6 +589,31 @@ var normalizeDefinition = (type, value) => {
577
589
  type: value.type || type
578
590
  };
579
591
  };
592
+ var decodeHtmlAttribute2 = (value) => typeof value === "string" ? value.replace(/&quot;/g, '"').replace(/&#39;/g, "'").replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">") : "";
593
+ var attrToPropName = (name) => name.replace(/^data-orion-/, "").replace(/^data-/, "").replace(/-([a-z])/g, (_, char) => char.toUpperCase());
594
+ var propsFromAttributes = (attributes = {}) => {
595
+ const props = {};
596
+ Object.keys(attributes).forEach((name) => {
597
+ if (!name.startsWith("data-") || name === "data-orion-component" || name === "data-orion-id") {
598
+ return;
599
+ }
600
+ const value = decodeHtmlAttribute2(attributes[name]);
601
+ if (name === "data-orion-props") {
602
+ try {
603
+ const parsed = JSON.parse(value);
604
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
605
+ Object.assign(props, parsed);
606
+ }
607
+ } catch {
608
+ props.propsJson = value;
609
+ }
610
+ return;
611
+ }
612
+ props[attrToPropName(name)] = value;
613
+ });
614
+ return props;
615
+ };
616
+ var previewForDefinition = (definition, props) => definition.editorPreview?.(props) || `<div class="orion-builder-v2-dynamic-placeholder"><strong>${definition.label}</strong></div>`;
580
617
  var registerProjectDynamicComponents = (editor, adapter) => {
581
618
  const components = adapter?.components || {};
582
619
  Object.keys(components).forEach((type) => {
@@ -609,6 +646,17 @@ var registerProjectDynamicComponents = (editor, adapter) => {
609
646
  }))
610
647
  ]
611
648
  }
649
+ },
650
+ view: {
651
+ init() {
652
+ this.listenTo(this.model, "change:attributes", this.renderPreview);
653
+ this.renderPreview();
654
+ },
655
+ renderPreview() {
656
+ const attributes = this.model.getAttributes?.() || {};
657
+ const props = propsFromAttributes(attributes);
658
+ this.model.components(previewForDefinition(definition, props));
659
+ }
612
660
  }
613
661
  });
614
662
  editor.Blocks.add(`orion-dynamic-${type}`, {
@@ -822,7 +870,6 @@ function GrapesPageEditor({
822
870
  panels: {
823
871
  defaults: []
824
872
  },
825
- projectData,
826
873
  selectorManager: {
827
874
  componentFirst: true
828
875
  },
@@ -66,6 +66,18 @@ var parseAttributes = (value) => {
66
66
  if (name === "data-orion-component" || name === "data-orion-id") {
67
67
  continue;
68
68
  }
69
+ if (name === "data-orion-props") {
70
+ const decoded = decodeHtmlAttribute(rawValue);
71
+ try {
72
+ const parsed = JSON.parse(decoded);
73
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
74
+ Object.assign(props, parsed);
75
+ }
76
+ } catch {
77
+ props.propsJson = decoded;
78
+ }
79
+ continue;
80
+ }
69
81
  const propName = name.replace(/^data-orion-/, "").replace(/^data-/, "").replace(/-([a-z])/g, (_, char) => char.toUpperCase());
70
82
  props[propName] = decodeHtmlAttribute(rawValue);
71
83
  }
@@ -453,6 +465,31 @@ var normalizeDefinition = (type, value) => {
453
465
  type: value.type || type
454
466
  };
455
467
  };
468
+ var decodeHtmlAttribute2 = (value) => typeof value === "string" ? value.replace(/&quot;/g, '"').replace(/&#39;/g, "'").replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">") : "";
469
+ var attrToPropName = (name) => name.replace(/^data-orion-/, "").replace(/^data-/, "").replace(/-([a-z])/g, (_, char) => char.toUpperCase());
470
+ var propsFromAttributes = (attributes = {}) => {
471
+ const props = {};
472
+ Object.keys(attributes).forEach((name) => {
473
+ if (!name.startsWith("data-") || name === "data-orion-component" || name === "data-orion-id") {
474
+ return;
475
+ }
476
+ const value = decodeHtmlAttribute2(attributes[name]);
477
+ if (name === "data-orion-props") {
478
+ try {
479
+ const parsed = JSON.parse(value);
480
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
481
+ Object.assign(props, parsed);
482
+ }
483
+ } catch {
484
+ props.propsJson = value;
485
+ }
486
+ return;
487
+ }
488
+ props[attrToPropName(name)] = value;
489
+ });
490
+ return props;
491
+ };
492
+ var previewForDefinition = (definition, props) => definition.editorPreview?.(props) || `<div class="orion-builder-v2-dynamic-placeholder"><strong>${definition.label}</strong></div>`;
456
493
  var registerProjectDynamicComponents = (editor, adapter) => {
457
494
  const components = adapter?.components || {};
458
495
  Object.keys(components).forEach((type) => {
@@ -485,6 +522,17 @@ var registerProjectDynamicComponents = (editor, adapter) => {
485
522
  }))
486
523
  ]
487
524
  }
525
+ },
526
+ view: {
527
+ init() {
528
+ this.listenTo(this.model, "change:attributes", this.renderPreview);
529
+ this.renderPreview();
530
+ },
531
+ renderPreview() {
532
+ const attributes = this.model.getAttributes?.() || {};
533
+ const props = propsFromAttributes(attributes);
534
+ this.model.components(previewForDefinition(definition, props));
535
+ }
488
536
  }
489
537
  });
490
538
  editor.Blocks.add(`orion-dynamic-${type}`, {
@@ -698,7 +746,6 @@ function GrapesPageEditor({
698
746
  panels: {
699
747
  defaults: []
700
748
  },
701
- projectData,
702
749
  selectorManager: {
703
750
  componentFirst: true
704
751
  },
@@ -200,6 +200,18 @@ var parseAttributes = (value) => {
200
200
  if (name === "data-orion-component" || name === "data-orion-id") {
201
201
  continue;
202
202
  }
203
+ if (name === "data-orion-props") {
204
+ const decoded = decodeHtmlAttribute(rawValue);
205
+ try {
206
+ const parsed = JSON.parse(decoded);
207
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
208
+ Object.assign(props, parsed);
209
+ }
210
+ } catch {
211
+ props.propsJson = decoded;
212
+ }
213
+ continue;
214
+ }
203
215
  const propName = name.replace(/^data-orion-/, "").replace(/^data-/, "").replace(/-([a-z])/g, (_, char) => char.toUpperCase());
204
216
  props[propName] = decodeHtmlAttribute(rawValue);
205
217
  }
@@ -151,6 +151,18 @@ var parseAttributes = (value) => {
151
151
  if (name === "data-orion-component" || name === "data-orion-id") {
152
152
  continue;
153
153
  }
154
+ if (name === "data-orion-props") {
155
+ const decoded = decodeHtmlAttribute(rawValue);
156
+ try {
157
+ const parsed = JSON.parse(decoded);
158
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
159
+ Object.assign(props, parsed);
160
+ }
161
+ } catch {
162
+ props.propsJson = decoded;
163
+ }
164
+ continue;
165
+ }
154
166
  const propName = name.replace(/^data-orion-/, "").replace(/^data-/, "").replace(/-([a-z])/g, (_, char) => char.toUpperCase());
155
167
  props[propName] = decodeHtmlAttribute(rawValue);
156
168
  }
@@ -725,6 +725,217 @@
725
725
  width: 100%;
726
726
  }
727
727
 
728
+ .xo-builder-preview {
729
+ box-sizing: border-box;
730
+ color: #2e2a27;
731
+ font-family: var(--font-xo-sans, "Nunito Sans", "Segoe UI", sans-serif);
732
+ letter-spacing: 0;
733
+ }
734
+
735
+ .xo-builder-preview *,
736
+ .xo-builder-preview *::before,
737
+ .xo-builder-preview *::after {
738
+ box-sizing: border-box;
739
+ }
740
+
741
+ .xo-builder-preview p,
742
+ .xo-builder-preview span,
743
+ .xo-builder-preview small {
744
+ color: inherit;
745
+ }
746
+
747
+ .xo-builder-preview h1,
748
+ .xo-builder-preview h2,
749
+ .xo-builder-preview h3 {
750
+ color: #243654;
751
+ font-family: var(--font-xo-serif, Georgia, serif);
752
+ font-weight: 500;
753
+ letter-spacing: 0;
754
+ line-height: 1.04;
755
+ margin: 0;
756
+ }
757
+
758
+ .xo-builder-preview p {
759
+ line-height: 1.65;
760
+ margin: 0;
761
+ }
762
+
763
+ .xo-builder-preview-hero {
764
+ align-items: end;
765
+ background-color: #243654;
766
+ background-position: center;
767
+ background-size: cover;
768
+ display: grid;
769
+ min-height: 560px;
770
+ overflow: hidden;
771
+ padding: 0;
772
+ position: relative;
773
+ }
774
+
775
+ .xo-builder-preview-hero::before {
776
+ background: linear-gradient(180deg, rgba(8, 16, 30, 0.08), rgba(8, 16, 30, 0.18));
777
+ content: "";
778
+ inset: 0;
779
+ position: absolute;
780
+ }
781
+
782
+ .xo-builder-preview-hero > div {
783
+ align-self: end;
784
+ background: rgba(255, 253, 249, 0.92);
785
+ border-top: 1px solid rgba(234, 215, 202, 0.9);
786
+ display: grid;
787
+ gap: 10px;
788
+ padding: 24px 34px;
789
+ position: relative;
790
+ width: 100%;
791
+ }
792
+
793
+ .xo-builder-preview-hero p {
794
+ color: #9f5f45;
795
+ font-size: 0.78rem;
796
+ font-weight: 900;
797
+ letter-spacing: 0.08em;
798
+ text-transform: uppercase;
799
+ }
800
+
801
+ .xo-builder-preview-hero h1 {
802
+ color: #243654;
803
+ font-size: 3.4rem;
804
+ }
805
+
806
+ .xo-builder-preview-hero span {
807
+ color: #5f574f;
808
+ font-size: 1.05rem;
809
+ line-height: 1.55;
810
+ max-width: 720px;
811
+ }
812
+
813
+ .xo-builder-preview-section {
814
+ background: #fbfaf7;
815
+ padding: 68px 32px;
816
+ }
817
+
818
+ .xo-builder-preview-section > p,
819
+ .xo-builder-preview-cta > p {
820
+ color: #9f5f45;
821
+ font-size: 0.78rem;
822
+ font-weight: 900;
823
+ letter-spacing: 0.08em;
824
+ margin: 0 0 10px;
825
+ text-transform: uppercase;
826
+ }
827
+
828
+ .xo-builder-preview-section h2,
829
+ .xo-builder-preview-cta h2 {
830
+ font-size: 3rem;
831
+ margin: 0;
832
+ max-width: 980px;
833
+ }
834
+
835
+ .xo-builder-preview-section > span {
836
+ color: #5b4f44;
837
+ display: block;
838
+ font-size: 1.04rem;
839
+ line-height: 1.7;
840
+ margin-top: 14px;
841
+ max-width: 780px;
842
+ }
843
+
844
+ .xo-builder-preview-grid {
845
+ display: grid;
846
+ gap: 22px;
847
+ grid-template-columns: repeat(3, minmax(0, 1fr));
848
+ margin-top: 32px;
849
+ }
850
+
851
+ .xo-builder-preview-grid article {
852
+ background: #fffdf9;
853
+ border: 1px solid rgba(143, 111, 67, 0.2);
854
+ border-radius: 28px;
855
+ box-shadow: 0 18px 50px rgba(114, 87, 60, 0.08);
856
+ overflow: hidden;
857
+ }
858
+
859
+ .xo-builder-preview-grid img {
860
+ aspect-ratio: 4 / 3;
861
+ display: block;
862
+ height: auto;
863
+ object-fit: cover;
864
+ width: 100%;
865
+ }
866
+
867
+ .xo-builder-preview-grid strong {
868
+ color: #243654;
869
+ display: block;
870
+ font-family: var(--font-xo-serif, Georgia, serif);
871
+ font-size: 1.9rem;
872
+ font-weight: 500;
873
+ line-height: 1.08;
874
+ padding: 20px 20px 0;
875
+ }
876
+
877
+ .xo-builder-preview-grid small {
878
+ color: #5a4d40;
879
+ display: block;
880
+ font-size: 0.96rem;
881
+ line-height: 1.6;
882
+ padding: 12px 20px 22px;
883
+ }
884
+
885
+ .xo-builder-preview-cta {
886
+ background: #243654;
887
+ color: #ffffff;
888
+ padding: 76px 32px;
889
+ text-align: center;
890
+ }
891
+
892
+ .xo-builder-preview-cta h2,
893
+ .xo-builder-preview-cta p {
894
+ color: #ffffff;
895
+ margin-left: auto;
896
+ margin-right: auto;
897
+ }
898
+
899
+ .xo-builder-preview-cta button {
900
+ background: #ffd082;
901
+ border: 0;
902
+ border-radius: 999px;
903
+ color: #263a57;
904
+ font: inherit;
905
+ font-size: 0.86rem;
906
+ font-weight: 900;
907
+ margin-top: 26px;
908
+ min-height: 44px;
909
+ padding: 0 28px;
910
+ }
911
+
912
+ .xo-builder-preview-section details {
913
+ background: #fffdf9;
914
+ border: 1px solid rgba(143, 111, 67, 0.2);
915
+ border-radius: 18px;
916
+ margin-top: 12px;
917
+ padding: 18px 20px;
918
+ }
919
+
920
+ .xo-builder-preview-section summary {
921
+ color: #243654;
922
+ cursor: pointer;
923
+ font-weight: 900;
924
+ }
925
+
926
+ .xo-builder-preview-form {
927
+ background: #fffdf9;
928
+ border: 1px dashed rgba(159, 95, 69, 0.4);
929
+ margin: 48px auto;
930
+ max-width: 980px;
931
+ padding: 46px 32px;
932
+ text-align: center;
933
+ }
934
+
935
+ .xo-builder-preview-form h2 {
936
+ font-size: 2.4rem;
937
+ }
938
+
728
939
  @media (max-width: 800px) {
729
940
  .orion-builder-v2-editor {
730
941
  grid-template-columns: 1fr;
@@ -772,6 +983,20 @@
772
983
  grid-template-columns: 1fr;
773
984
  }
774
985
 
986
+ .xo-builder-preview-grid {
987
+ grid-template-columns: 1fr;
988
+ }
989
+
990
+ .xo-builder-preview-hero {
991
+ min-height: 460px;
992
+ }
993
+
994
+ .xo-builder-preview-hero h1,
995
+ .xo-builder-preview-section h2,
996
+ .xo-builder-preview-cta h2 {
997
+ font-size: 2.1rem;
998
+ }
999
+
775
1000
  .orion-builder-v2-nav,
776
1001
  .orion-builder-v2-footer {
777
1002
  align-items: flex-start;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orion-studios/payload-studio",
3
- "version": "0.6.0-beta.47",
3
+ "version": "0.6.0-beta.49",
4
4
  "description": "Base CMS, builder, and custom admin toolkit for Orion Studios websites",
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.js",