@orion-studios/payload-studio 0.6.0-beta.53 → 0.6.0-beta.54

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.
@@ -7,14 +7,14 @@ import {
7
7
  socialMediaConnectionsField,
8
8
  themePreferenceField,
9
9
  withTooltips
10
- } from "../chunk-JC3UV74N.mjs";
11
- import "../chunk-W2UOCJDX.mjs";
10
+ } from "../chunk-KHK6RTGC.mjs";
12
11
  import {
13
12
  SOCIAL_MEDIA_DEFAULT_ICON_BY_PLATFORM,
14
13
  SOCIAL_MEDIA_ICON_OPTIONS,
15
14
  SOCIAL_MEDIA_PLATFORMS,
16
15
  SOCIAL_MEDIA_PLATFORM_LABELS
17
16
  } from "../chunk-ZTXJG4K5.mjs";
17
+ import "../chunk-W2UOCJDX.mjs";
18
18
  import "../chunk-6BWS3CLP.mjs";
19
19
  export {
20
20
  SOCIAL_MEDIA_DEFAULT_ICON_BY_PLATFORM,
@@ -604,6 +604,7 @@ var decodeHtmlAttribute2 = (value) => {
604
604
  return decoded;
605
605
  };
606
606
  var attrToPropName = (name) => name.replace(/^data-orion-/, "").replace(/^data-/, "").replace(/-([a-z])/g, (_, char) => char.toUpperCase());
607
+ var propToAttrName = (name) => `data-orion-${name.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`)}`;
607
608
  var propsFromAttributes = (attributes = {}) => {
608
609
  const props = {};
609
610
  Object.keys(attributes).forEach((name) => {
@@ -646,6 +647,123 @@ var lockPreviewChildren = (component) => {
646
647
  lockPreviewChildren(child);
647
648
  });
648
649
  };
650
+ var parseJsonArray = (value) => {
651
+ const decoded = decodeHtmlAttribute2(value);
652
+ if (!decoded) {
653
+ return [];
654
+ }
655
+ try {
656
+ const parsed = JSON.parse(decoded);
657
+ return Array.isArray(parsed) ? parsed.filter((item) => Boolean(item && typeof item === "object" && !Array.isArray(item))) : [];
658
+ } catch {
659
+ return [];
660
+ }
661
+ };
662
+ var updateJsonListAttribute = ({
663
+ field,
664
+ index,
665
+ listAttr,
666
+ model,
667
+ value
668
+ }) => {
669
+ const attrs = model.getAttributes?.() || {};
670
+ const list = parseJsonArray(attrs[listAttr]);
671
+ if (!list[index]) {
672
+ return;
673
+ }
674
+ list[index] = {
675
+ ...list[index],
676
+ [field]: value
677
+ };
678
+ model.addAttributes?.({
679
+ [listAttr]: JSON.stringify(list)
680
+ });
681
+ };
682
+ var chooseAsset = (editor, callback) => {
683
+ const assetManager = editor?.AssetManager;
684
+ if (!assetManager?.open) {
685
+ const src = window.prompt("Image URL");
686
+ if (src) {
687
+ callback(src);
688
+ }
689
+ return;
690
+ }
691
+ assetManager.open({
692
+ select(asset) {
693
+ const src = typeof asset === "string" ? asset : asset && typeof asset === "object" && "get" in asset && typeof asset.get === "function" ? String(asset.get("src") || "") : asset && typeof asset === "object" && "src" in asset ? String(asset.src || "") : "";
694
+ if (src) {
695
+ callback(src);
696
+ }
697
+ assetManager.close?.();
698
+ }
699
+ });
700
+ };
701
+ var bindEditablePreview = (view, editor) => {
702
+ const root = view.el;
703
+ if (!root) {
704
+ return;
705
+ }
706
+ root.querySelectorAll("[data-orion-edit-field]").forEach((element) => {
707
+ const field = element.dataset.orionEditField || "";
708
+ const listName = element.dataset.orionEditList || "";
709
+ const listIndex = Number(element.dataset.orionEditIndex);
710
+ const attrName = listName ? propToAttrName(listName) : propToAttrName(field);
711
+ const isImage = element.dataset.orionEditKind === "image" || element instanceof HTMLImageElement;
712
+ element.setAttribute("title", isImage ? "Click to replace image" : "Click and type to edit");
713
+ element.style.cursor = "text";
714
+ element.addEventListener("click", (event) => {
715
+ event.stopPropagation();
716
+ editor.select?.(view.model);
717
+ if (!isImage) {
718
+ return;
719
+ }
720
+ element.style.cursor = "pointer";
721
+ chooseAsset(editor, (src) => {
722
+ if (listName && Number.isInteger(listIndex)) {
723
+ updateJsonListAttribute({
724
+ field,
725
+ index: listIndex,
726
+ listAttr: attrName,
727
+ model: view.model,
728
+ value: src
729
+ });
730
+ return;
731
+ }
732
+ view.model.addAttributes?.({
733
+ [attrName]: src
734
+ });
735
+ });
736
+ });
737
+ if (isImage) {
738
+ return;
739
+ }
740
+ element.setAttribute("contenteditable", "true");
741
+ element.setAttribute("spellcheck", "true");
742
+ const commit = () => {
743
+ const value = element.innerText.trim();
744
+ if (listName && Number.isInteger(listIndex)) {
745
+ updateJsonListAttribute({
746
+ field,
747
+ index: listIndex,
748
+ listAttr: attrName,
749
+ model: view.model,
750
+ value
751
+ });
752
+ return;
753
+ }
754
+ view.model.addAttributes?.({
755
+ [attrName]: value
756
+ });
757
+ };
758
+ element.addEventListener("blur", commit);
759
+ element.addEventListener("keydown", (event) => {
760
+ if (event.key === "Enter" && !event.shiftKey) {
761
+ event.preventDefault();
762
+ element.blur();
763
+ }
764
+ });
765
+ });
766
+ };
649
767
  var registerProjectDynamicComponents = (editor, adapter) => {
650
768
  const components = adapter?.components || {};
651
769
  Object.keys(components).forEach((type) => {
@@ -689,6 +807,7 @@ var registerProjectDynamicComponents = (editor, adapter) => {
689
807
  const props = propsFromAttributes(attributes);
690
808
  this.model.components(previewForDefinition(definition, props));
691
809
  lockPreviewChildren(this.model);
810
+ queueMicrotask(() => bindEditablePreview(this, editor));
692
811
  }
693
812
  }
694
813
  });
@@ -480,6 +480,7 @@ var decodeHtmlAttribute2 = (value) => {
480
480
  return decoded;
481
481
  };
482
482
  var attrToPropName = (name) => name.replace(/^data-orion-/, "").replace(/^data-/, "").replace(/-([a-z])/g, (_, char) => char.toUpperCase());
483
+ var propToAttrName = (name) => `data-orion-${name.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`)}`;
483
484
  var propsFromAttributes = (attributes = {}) => {
484
485
  const props = {};
485
486
  Object.keys(attributes).forEach((name) => {
@@ -522,6 +523,123 @@ var lockPreviewChildren = (component) => {
522
523
  lockPreviewChildren(child);
523
524
  });
524
525
  };
526
+ var parseJsonArray = (value) => {
527
+ const decoded = decodeHtmlAttribute2(value);
528
+ if (!decoded) {
529
+ return [];
530
+ }
531
+ try {
532
+ const parsed = JSON.parse(decoded);
533
+ return Array.isArray(parsed) ? parsed.filter((item) => Boolean(item && typeof item === "object" && !Array.isArray(item))) : [];
534
+ } catch {
535
+ return [];
536
+ }
537
+ };
538
+ var updateJsonListAttribute = ({
539
+ field,
540
+ index,
541
+ listAttr,
542
+ model,
543
+ value
544
+ }) => {
545
+ const attrs = model.getAttributes?.() || {};
546
+ const list = parseJsonArray(attrs[listAttr]);
547
+ if (!list[index]) {
548
+ return;
549
+ }
550
+ list[index] = {
551
+ ...list[index],
552
+ [field]: value
553
+ };
554
+ model.addAttributes?.({
555
+ [listAttr]: JSON.stringify(list)
556
+ });
557
+ };
558
+ var chooseAsset = (editor, callback) => {
559
+ const assetManager = editor?.AssetManager;
560
+ if (!assetManager?.open) {
561
+ const src = window.prompt("Image URL");
562
+ if (src) {
563
+ callback(src);
564
+ }
565
+ return;
566
+ }
567
+ assetManager.open({
568
+ select(asset) {
569
+ const src = typeof asset === "string" ? asset : asset && typeof asset === "object" && "get" in asset && typeof asset.get === "function" ? String(asset.get("src") || "") : asset && typeof asset === "object" && "src" in asset ? String(asset.src || "") : "";
570
+ if (src) {
571
+ callback(src);
572
+ }
573
+ assetManager.close?.();
574
+ }
575
+ });
576
+ };
577
+ var bindEditablePreview = (view, editor) => {
578
+ const root = view.el;
579
+ if (!root) {
580
+ return;
581
+ }
582
+ root.querySelectorAll("[data-orion-edit-field]").forEach((element) => {
583
+ const field = element.dataset.orionEditField || "";
584
+ const listName = element.dataset.orionEditList || "";
585
+ const listIndex = Number(element.dataset.orionEditIndex);
586
+ const attrName = listName ? propToAttrName(listName) : propToAttrName(field);
587
+ const isImage = element.dataset.orionEditKind === "image" || element instanceof HTMLImageElement;
588
+ element.setAttribute("title", isImage ? "Click to replace image" : "Click and type to edit");
589
+ element.style.cursor = "text";
590
+ element.addEventListener("click", (event) => {
591
+ event.stopPropagation();
592
+ editor.select?.(view.model);
593
+ if (!isImage) {
594
+ return;
595
+ }
596
+ element.style.cursor = "pointer";
597
+ chooseAsset(editor, (src) => {
598
+ if (listName && Number.isInteger(listIndex)) {
599
+ updateJsonListAttribute({
600
+ field,
601
+ index: listIndex,
602
+ listAttr: attrName,
603
+ model: view.model,
604
+ value: src
605
+ });
606
+ return;
607
+ }
608
+ view.model.addAttributes?.({
609
+ [attrName]: src
610
+ });
611
+ });
612
+ });
613
+ if (isImage) {
614
+ return;
615
+ }
616
+ element.setAttribute("contenteditable", "true");
617
+ element.setAttribute("spellcheck", "true");
618
+ const commit = () => {
619
+ const value = element.innerText.trim();
620
+ if (listName && Number.isInteger(listIndex)) {
621
+ updateJsonListAttribute({
622
+ field,
623
+ index: listIndex,
624
+ listAttr: attrName,
625
+ model: view.model,
626
+ value
627
+ });
628
+ return;
629
+ }
630
+ view.model.addAttributes?.({
631
+ [attrName]: value
632
+ });
633
+ };
634
+ element.addEventListener("blur", commit);
635
+ element.addEventListener("keydown", (event) => {
636
+ if (event.key === "Enter" && !event.shiftKey) {
637
+ event.preventDefault();
638
+ element.blur();
639
+ }
640
+ });
641
+ });
642
+ };
525
643
  var registerProjectDynamicComponents = (editor, adapter) => {
526
644
  const components = adapter?.components || {};
527
645
  Object.keys(components).forEach((type) => {
@@ -565,6 +683,7 @@ var registerProjectDynamicComponents = (editor, adapter) => {
565
683
  const props = propsFromAttributes(attributes);
566
684
  this.model.components(previewForDefinition(definition, props));
567
685
  lockPreviewChildren(this.model);
686
+ queueMicrotask(() => bindEditablePreview(this, editor));
568
687
  }
569
688
  }
570
689
  });
package/dist/index.mjs CHANGED
@@ -1,25 +1,25 @@
1
1
  import {
2
2
  admin_exports
3
- } from "./chunk-JC3UV74N.mjs";
4
- import {
5
- admin_app_exports
6
- } from "./chunk-RKTIFEUY.mjs";
7
- import "./chunk-W2UOCJDX.mjs";
8
- import {
9
- blocks_exports
10
- } from "./chunk-JQAHXYAM.mjs";
3
+ } from "./chunk-KHK6RTGC.mjs";
11
4
  import {
12
5
  nextjs_exports
13
6
  } from "./chunk-ZADL33R6.mjs";
14
7
  import "./chunk-ZTXJG4K5.mjs";
15
8
  import {
16
9
  studio_pages_exports
17
- } from "./chunk-NGLIA2OE.mjs";
18
- import "./chunk-OQSEJXC4.mjs";
10
+ } from "./chunk-7HME6R2V.mjs";
19
11
  import "./chunk-7ZMXZRBP.mjs";
20
12
  import {
21
13
  studio_exports
22
14
  } from "./chunk-ADIIWIYL.mjs";
15
+ import {
16
+ blocks_exports
17
+ } from "./chunk-JQAHXYAM.mjs";
18
+ import "./chunk-OQSEJXC4.mjs";
19
+ import {
20
+ admin_app_exports
21
+ } from "./chunk-RKTIFEUY.mjs";
22
+ import "./chunk-W2UOCJDX.mjs";
23
23
  import "./chunk-6BWS3CLP.mjs";
24
24
  export {
25
25
  admin_exports as admin,
@@ -7,8 +7,7 @@ import {
7
7
  pageStudioModuleManifest,
8
8
  resolveBuilderThemeTokens,
9
9
  toEditorInitialDoc
10
- } from "../chunk-NGLIA2OE.mjs";
11
- import "../chunk-OQSEJXC4.mjs";
10
+ } from "../chunk-7HME6R2V.mjs";
12
11
  import {
13
12
  createDefaultStudioDocument,
14
13
  defaultBuilderThemeTokens,
@@ -16,6 +15,7 @@ import {
16
15
  studioDocumentToLayout
17
16
  } from "../chunk-7ZMXZRBP.mjs";
18
17
  import "../chunk-ADIIWIYL.mjs";
18
+ import "../chunk-OQSEJXC4.mjs";
19
19
  import "../chunk-6BWS3CLP.mjs";
20
20
  export {
21
21
  createDefaultStudioDocument,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orion-studios/payload-studio",
3
- "version": "0.6.0-beta.53",
3
+ "version": "0.6.0-beta.54",
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",
@@ -1,6 +1,3 @@
1
- import {
2
- sectionStyleDefaults
3
- } from "./chunk-OQSEJXC4.mjs";
4
1
  import {
5
2
  createDefaultStudioDocument,
6
3
  defaultBuilderThemeTokens,
@@ -14,6 +11,9 @@ import {
14
11
  createEmptyStudioDocument,
15
12
  validateStudioDocument
16
13
  } from "./chunk-ADIIWIYL.mjs";
14
+ import {
15
+ sectionStyleDefaults
16
+ } from "./chunk-OQSEJXC4.mjs";
17
17
  import {
18
18
  __export
19
19
  } from "./chunk-6BWS3CLP.mjs";
@@ -1,12 +1,12 @@
1
- import {
2
- adminNavIcons
3
- } from "./chunk-W2UOCJDX.mjs";
4
1
  import {
5
2
  SOCIAL_MEDIA_DEFAULT_ICON_BY_PLATFORM,
6
3
  SOCIAL_MEDIA_ICON_OPTIONS,
7
4
  SOCIAL_MEDIA_PLATFORMS,
8
5
  SOCIAL_MEDIA_PLATFORM_LABELS
9
6
  } from "./chunk-ZTXJG4K5.mjs";
7
+ import {
8
+ adminNavIcons
9
+ } from "./chunk-W2UOCJDX.mjs";
10
10
  import {
11
11
  __export,
12
12
  __require