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

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-KHK6RTGC.mjs";
10
+ } from "../chunk-JC3UV74N.mjs";
11
+ import "../chunk-W2UOCJDX.mjs";
11
12
  import {
12
13
  SOCIAL_MEDIA_DEFAULT_ICON_BY_PLATFORM,
13
14
  SOCIAL_MEDIA_ICON_OPTIONS,
14
15
  SOCIAL_MEDIA_PLATFORMS,
15
16
  SOCIAL_MEDIA_PLATFORM_LABELS
16
17
  } 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,
@@ -679,7 +679,7 @@ var updateJsonListAttribute = ({
679
679
  [listAttr]: JSON.stringify(list)
680
680
  });
681
681
  };
682
- var chooseAsset = (editor, callback) => {
682
+ var chooseAsset = (editor, currentSrc, callback) => {
683
683
  const assetManager = editor?.AssetManager;
684
684
  if (!assetManager?.open) {
685
685
  const src = window.prompt("Image URL");
@@ -688,6 +688,13 @@ var chooseAsset = (editor, callback) => {
688
688
  }
689
689
  return;
690
690
  }
691
+ if (currentSrc) {
692
+ assetManager.add?.({
693
+ name: `Current image - ${currentSrc.split("/").pop() || currentSrc}`,
694
+ src: currentSrc,
695
+ type: "image"
696
+ });
697
+ }
691
698
  assetManager.open({
692
699
  select(asset) {
693
700
  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 || "") : "";
@@ -718,7 +725,8 @@ var bindEditablePreview = (view, editor) => {
718
725
  return;
719
726
  }
720
727
  element.style.cursor = "pointer";
721
- chooseAsset(editor, (src) => {
728
+ const currentSrc = element instanceof HTMLImageElement ? element.currentSrc || element.src || "" : element.style.backgroundImage.replace(/^url\(["']?/, "").replace(/["']?\)$/, "");
729
+ chooseAsset(editor, currentSrc, (src) => {
722
730
  if (listName && Number.isInteger(listIndex)) {
723
731
  updateJsonListAttribute({
724
732
  field,
@@ -858,10 +866,58 @@ var getRelationID = (value) => {
858
866
  const id = value.id;
859
867
  return typeof id === "number" || typeof id === "string" ? id : null;
860
868
  };
869
+ var normalizeAssetSrc = (value) => {
870
+ const trimmed = value.trim();
871
+ if (!trimmed) {
872
+ return "";
873
+ }
874
+ if (/^(https?:)?\/\//i.test(trimmed) || trimmed.startsWith("/")) {
875
+ return trimmed;
876
+ }
877
+ return `/${trimmed}`;
878
+ };
879
+ var mediaDocImageCandidates = (doc) => {
880
+ const candidates = [];
881
+ if (doc.sizes && typeof doc.sizes === "object") {
882
+ Object.values(doc.sizes).forEach((size) => {
883
+ if (size?.url) {
884
+ candidates.push({ src: normalizeAssetSrc(size.url), width: size.width });
885
+ } else if (size?.filename) {
886
+ candidates.push({ src: `/api/media/file/${encodeURIComponent(size.filename)}`, width: size.width });
887
+ }
888
+ });
889
+ }
890
+ if (typeof doc.thumbnailURL === "string" && doc.thumbnailURL.length > 0) {
891
+ candidates.push({ src: normalizeAssetSrc(doc.thumbnailURL), width: 360 });
892
+ }
893
+ if (typeof doc.url === "string" && doc.url.length > 0) {
894
+ candidates.push({ src: normalizeAssetSrc(doc.url), width: doc.width });
895
+ }
896
+ if (typeof doc.filename === "string" && doc.filename.length > 0) {
897
+ candidates.push({ src: `/api/media/file/${encodeURIComponent(doc.filename)}`, width: doc.width });
898
+ }
899
+ return candidates.filter((candidate, index, all) => candidate.src && all.findIndex((item) => item.src === candidate.src) === index);
900
+ };
901
+ var pickMediaAssetSrc = (doc) => {
902
+ const candidates = mediaDocImageCandidates(doc);
903
+ if (candidates.length === 0) {
904
+ return "";
905
+ }
906
+ const absolute = candidates.find((candidate) => /^(https?:)?\/\//i.test(candidate.src));
907
+ if (absolute) {
908
+ return absolute.src;
909
+ }
910
+ const fullSize = candidates.find((candidate) => candidate.src === doc.url);
911
+ if (fullSize) {
912
+ return fullSize.src;
913
+ }
914
+ const widest = [...candidates].sort((left, right) => (right.width || 0) - (left.width || 0))[0];
915
+ return widest?.src || candidates[0]?.src || "";
916
+ };
861
917
  var mediaDocToAsset = (doc) => {
862
918
  const id = getRelationID(doc);
863
919
  const filename = typeof doc.filename === "string" ? doc.filename : "";
864
- const src = typeof doc.url === "string" && doc.url.length > 0 ? doc.url : filename ? `/api/media/file/${encodeURIComponent(filename)}` : "";
920
+ const src = pickMediaAssetSrc(doc);
865
921
  if (id === null || !src) {
866
922
  return null;
867
923
  }
@@ -873,6 +929,26 @@ var mediaDocToAsset = (doc) => {
873
929
  type: "image"
874
930
  };
875
931
  };
932
+ var imageCanLoad = (src) => new Promise((resolve) => {
933
+ if (!src) {
934
+ resolve(false);
935
+ return;
936
+ }
937
+ const image = new Image();
938
+ image.onload = () => resolve(true);
939
+ image.onerror = () => resolve(false);
940
+ image.src = src;
941
+ });
942
+ var pruneBrokenImageAssets = async (editor) => {
943
+ const assetManager = editor.AssetManager;
944
+ const existingAssets = assetManager.getAll?.() || [];
945
+ for (const asset of existingAssets) {
946
+ const src = typeof asset.get === "function" ? String(asset.get("src") || "") : "";
947
+ if (src && !await imageCanLoad(src)) {
948
+ assetManager.remove?.(asset);
949
+ }
950
+ }
951
+ };
876
952
  var extractUploadedMedia = (value) => {
877
953
  const candidate = value && typeof value === "object" && "doc" in value ? value.doc : value;
878
954
  if (!candidate || typeof candidate !== "object") {
@@ -887,7 +963,10 @@ var extractUploadedMedia = (value) => {
887
963
  alt: typeof typed.alt === "string" ? typed.alt : "",
888
964
  filename: typeof typed.filename === "string" ? typed.filename : "",
889
965
  id,
890
- url: typeof typed.url === "string" ? typed.url : ""
966
+ sizes: typed.sizes && typeof typed.sizes === "object" ? typed.sizes : void 0,
967
+ thumbnailURL: typeof typed.thumbnailURL === "string" ? typed.thumbnailURL : "",
968
+ url: typeof typed.url === "string" ? typed.url : "",
969
+ width: typeof typed.width === "number" ? typed.width : void 0
891
970
  };
892
971
  };
893
972
  var loadPayloadMediaAssets = async (editor) => {
@@ -899,8 +978,17 @@ var loadPayloadMediaAssets = async (editor) => {
899
978
  return;
900
979
  }
901
980
  const json = await response.json();
902
- const assets = (Array.isArray(json.docs) ? json.docs : []).map((doc) => mediaDocToAsset(doc)).filter((asset) => asset !== null);
903
- editor.AssetManager.add(assets);
981
+ const candidateAssets = (Array.isArray(json.docs) ? json.docs : []).map((doc) => mediaDocToAsset(doc)).filter((asset) => asset !== null);
982
+ const assets = [];
983
+ for (const asset of candidateAssets) {
984
+ if (await imageCanLoad(asset.src)) {
985
+ assets.push(asset);
986
+ }
987
+ }
988
+ if (assets.length > 0) {
989
+ editor.AssetManager.add(assets);
990
+ }
991
+ await pruneBrokenImageAssets(editor);
904
992
  };
905
993
  var uploadPayloadMediaAssets = async (editor, files) => {
906
994
  const fileArray = Array.from(files);
@@ -555,7 +555,7 @@ var updateJsonListAttribute = ({
555
555
  [listAttr]: JSON.stringify(list)
556
556
  });
557
557
  };
558
- var chooseAsset = (editor, callback) => {
558
+ var chooseAsset = (editor, currentSrc, callback) => {
559
559
  const assetManager = editor?.AssetManager;
560
560
  if (!assetManager?.open) {
561
561
  const src = window.prompt("Image URL");
@@ -564,6 +564,13 @@ var chooseAsset = (editor, callback) => {
564
564
  }
565
565
  return;
566
566
  }
567
+ if (currentSrc) {
568
+ assetManager.add?.({
569
+ name: `Current image - ${currentSrc.split("/").pop() || currentSrc}`,
570
+ src: currentSrc,
571
+ type: "image"
572
+ });
573
+ }
567
574
  assetManager.open({
568
575
  select(asset) {
569
576
  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 || "") : "";
@@ -594,7 +601,8 @@ var bindEditablePreview = (view, editor) => {
594
601
  return;
595
602
  }
596
603
  element.style.cursor = "pointer";
597
- chooseAsset(editor, (src) => {
604
+ const currentSrc = element instanceof HTMLImageElement ? element.currentSrc || element.src || "" : element.style.backgroundImage.replace(/^url\(["']?/, "").replace(/["']?\)$/, "");
605
+ chooseAsset(editor, currentSrc, (src) => {
598
606
  if (listName && Number.isInteger(listIndex)) {
599
607
  updateJsonListAttribute({
600
608
  field,
@@ -734,10 +742,58 @@ var getRelationID = (value) => {
734
742
  const id = value.id;
735
743
  return typeof id === "number" || typeof id === "string" ? id : null;
736
744
  };
745
+ var normalizeAssetSrc = (value) => {
746
+ const trimmed = value.trim();
747
+ if (!trimmed) {
748
+ return "";
749
+ }
750
+ if (/^(https?:)?\/\//i.test(trimmed) || trimmed.startsWith("/")) {
751
+ return trimmed;
752
+ }
753
+ return `/${trimmed}`;
754
+ };
755
+ var mediaDocImageCandidates = (doc) => {
756
+ const candidates = [];
757
+ if (doc.sizes && typeof doc.sizes === "object") {
758
+ Object.values(doc.sizes).forEach((size) => {
759
+ if (size?.url) {
760
+ candidates.push({ src: normalizeAssetSrc(size.url), width: size.width });
761
+ } else if (size?.filename) {
762
+ candidates.push({ src: `/api/media/file/${encodeURIComponent(size.filename)}`, width: size.width });
763
+ }
764
+ });
765
+ }
766
+ if (typeof doc.thumbnailURL === "string" && doc.thumbnailURL.length > 0) {
767
+ candidates.push({ src: normalizeAssetSrc(doc.thumbnailURL), width: 360 });
768
+ }
769
+ if (typeof doc.url === "string" && doc.url.length > 0) {
770
+ candidates.push({ src: normalizeAssetSrc(doc.url), width: doc.width });
771
+ }
772
+ if (typeof doc.filename === "string" && doc.filename.length > 0) {
773
+ candidates.push({ src: `/api/media/file/${encodeURIComponent(doc.filename)}`, width: doc.width });
774
+ }
775
+ return candidates.filter((candidate, index, all) => candidate.src && all.findIndex((item) => item.src === candidate.src) === index);
776
+ };
777
+ var pickMediaAssetSrc = (doc) => {
778
+ const candidates = mediaDocImageCandidates(doc);
779
+ if (candidates.length === 0) {
780
+ return "";
781
+ }
782
+ const absolute = candidates.find((candidate) => /^(https?:)?\/\//i.test(candidate.src));
783
+ if (absolute) {
784
+ return absolute.src;
785
+ }
786
+ const fullSize = candidates.find((candidate) => candidate.src === doc.url);
787
+ if (fullSize) {
788
+ return fullSize.src;
789
+ }
790
+ const widest = [...candidates].sort((left, right) => (right.width || 0) - (left.width || 0))[0];
791
+ return widest?.src || candidates[0]?.src || "";
792
+ };
737
793
  var mediaDocToAsset = (doc) => {
738
794
  const id = getRelationID(doc);
739
795
  const filename = typeof doc.filename === "string" ? doc.filename : "";
740
- const src = typeof doc.url === "string" && doc.url.length > 0 ? doc.url : filename ? `/api/media/file/${encodeURIComponent(filename)}` : "";
796
+ const src = pickMediaAssetSrc(doc);
741
797
  if (id === null || !src) {
742
798
  return null;
743
799
  }
@@ -749,6 +805,26 @@ var mediaDocToAsset = (doc) => {
749
805
  type: "image"
750
806
  };
751
807
  };
808
+ var imageCanLoad = (src) => new Promise((resolve) => {
809
+ if (!src) {
810
+ resolve(false);
811
+ return;
812
+ }
813
+ const image = new Image();
814
+ image.onload = () => resolve(true);
815
+ image.onerror = () => resolve(false);
816
+ image.src = src;
817
+ });
818
+ var pruneBrokenImageAssets = async (editor) => {
819
+ const assetManager = editor.AssetManager;
820
+ const existingAssets = assetManager.getAll?.() || [];
821
+ for (const asset of existingAssets) {
822
+ const src = typeof asset.get === "function" ? String(asset.get("src") || "") : "";
823
+ if (src && !await imageCanLoad(src)) {
824
+ assetManager.remove?.(asset);
825
+ }
826
+ }
827
+ };
752
828
  var extractUploadedMedia = (value) => {
753
829
  const candidate = value && typeof value === "object" && "doc" in value ? value.doc : value;
754
830
  if (!candidate || typeof candidate !== "object") {
@@ -763,7 +839,10 @@ var extractUploadedMedia = (value) => {
763
839
  alt: typeof typed.alt === "string" ? typed.alt : "",
764
840
  filename: typeof typed.filename === "string" ? typed.filename : "",
765
841
  id,
766
- url: typeof typed.url === "string" ? typed.url : ""
842
+ sizes: typed.sizes && typeof typed.sizes === "object" ? typed.sizes : void 0,
843
+ thumbnailURL: typeof typed.thumbnailURL === "string" ? typed.thumbnailURL : "",
844
+ url: typeof typed.url === "string" ? typed.url : "",
845
+ width: typeof typed.width === "number" ? typed.width : void 0
767
846
  };
768
847
  };
769
848
  var loadPayloadMediaAssets = async (editor) => {
@@ -775,8 +854,17 @@ var loadPayloadMediaAssets = async (editor) => {
775
854
  return;
776
855
  }
777
856
  const json = await response.json();
778
- const assets = (Array.isArray(json.docs) ? json.docs : []).map((doc) => mediaDocToAsset(doc)).filter((asset) => asset !== null);
779
- editor.AssetManager.add(assets);
857
+ const candidateAssets = (Array.isArray(json.docs) ? json.docs : []).map((doc) => mediaDocToAsset(doc)).filter((asset) => asset !== null);
858
+ const assets = [];
859
+ for (const asset of candidateAssets) {
860
+ if (await imageCanLoad(asset.src)) {
861
+ assets.push(asset);
862
+ }
863
+ }
864
+ if (assets.length > 0) {
865
+ editor.AssetManager.add(assets);
866
+ }
867
+ await pruneBrokenImageAssets(editor);
780
868
  };
781
869
  var uploadPayloadMediaAssets = async (editor, files) => {
782
870
  const fileArray = Array.from(files);
package/dist/index.mjs CHANGED
@@ -1,25 +1,25 @@
1
+ import {
2
+ admin_app_exports
3
+ } from "./chunk-RKTIFEUY.mjs";
1
4
  import {
2
5
  admin_exports
3
- } from "./chunk-KHK6RTGC.mjs";
6
+ } from "./chunk-JC3UV74N.mjs";
7
+ import "./chunk-W2UOCJDX.mjs";
8
+ import {
9
+ blocks_exports
10
+ } from "./chunk-JQAHXYAM.mjs";
4
11
  import {
5
12
  nextjs_exports
6
13
  } from "./chunk-ZADL33R6.mjs";
7
14
  import "./chunk-ZTXJG4K5.mjs";
8
15
  import {
9
16
  studio_pages_exports
10
- } from "./chunk-7HME6R2V.mjs";
17
+ } from "./chunk-NGLIA2OE.mjs";
18
+ import "./chunk-OQSEJXC4.mjs";
11
19
  import "./chunk-7ZMXZRBP.mjs";
12
20
  import {
13
21
  studio_exports
14
22
  } 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,7 +7,8 @@ import {
7
7
  pageStudioModuleManifest,
8
8
  resolveBuilderThemeTokens,
9
9
  toEditorInitialDoc
10
- } from "../chunk-7HME6R2V.mjs";
10
+ } from "../chunk-NGLIA2OE.mjs";
11
+ import "../chunk-OQSEJXC4.mjs";
11
12
  import {
12
13
  createDefaultStudioDocument,
13
14
  defaultBuilderThemeTokens,
@@ -15,7 +16,6 @@ import {
15
16
  studioDocumentToLayout
16
17
  } from "../chunk-7ZMXZRBP.mjs";
17
18
  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.54",
3
+ "version": "0.6.0-beta.55",
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,12 +1,12 @@
1
+ import {
2
+ adminNavIcons
3
+ } from "./chunk-W2UOCJDX.mjs";
1
4
  import {
2
5
  SOCIAL_MEDIA_DEFAULT_ICON_BY_PLATFORM,
3
6
  SOCIAL_MEDIA_ICON_OPTIONS,
4
7
  SOCIAL_MEDIA_PLATFORMS,
5
8
  SOCIAL_MEDIA_PLATFORM_LABELS
6
9
  } from "./chunk-ZTXJG4K5.mjs";
7
- import {
8
- adminNavIcons
9
- } from "./chunk-W2UOCJDX.mjs";
10
10
  import {
11
11
  __export,
12
12
  __require
@@ -1,3 +1,6 @@
1
+ import {
2
+ sectionStyleDefaults
3
+ } from "./chunk-OQSEJXC4.mjs";
1
4
  import {
2
5
  createDefaultStudioDocument,
3
6
  defaultBuilderThemeTokens,
@@ -11,9 +14,6 @@ import {
11
14
  createEmptyStudioDocument,
12
15
  validateStudioDocument
13
16
  } 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";