@firecms/media_manager 3.1.0-canary.1df3b2c → 3.1.0-canary.501d471

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.es.js CHANGED
@@ -2,9 +2,9 @@ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { c } from "react-compiler-runtime";
3
3
  import { createContext, useContext, useState, useCallback, useEffect, useRef, useMemo } from "react";
4
4
  import Compressor from "compressorjs";
5
- import { ImageIcon, VideoLibraryIcon, AudiotrackIcon, DescriptionIcon, cls, defaultBorderMixin, Typography, CheckIcon, Card, IconButton, DownloadIcon, DeleteIcon, CloseIcon, TextField, Chip, Button, CircularProgress, Dialog, DialogContent, DialogActions, CloudUploadIcon, Tooltip, Container, AddIcon, SearchBar, AppsIcon, Icon, RefreshIcon } from "@firecms/ui";
5
+ import { ImageIcon, VideoLibraryIcon, AudiotrackIcon, DescriptionIcon, cls, defaultBorderMixin, Typography, CheckIcon, Card, IconButton, DownloadIcon, DeleteIcon, CloseIcon, TextField, Chip, Button, CircularProgress, Dialog, DialogContent, DialogActions, CloudUploadIcon, Container, AddIcon, SearchBar, AppsIcon, Tooltip, Icon, RefreshIcon } from "@firecms/ui";
6
+ import { useSnackbarController, useStorageSource, useTranslation } from "@firecms/core";
6
7
  import { useCreateFormex } from "@firecms/formex";
7
- import { useSnackbarController, useStorageSource } from "@firecms/core";
8
8
  import { Link } from "react-router-dom";
9
9
  const MediaManagerContext = createContext(void 0);
10
10
  function useMediaManager() {
@@ -555,6 +555,9 @@ function MediaAssetDetails({
555
555
  const [deleting, setDeleting] = useState(false);
556
556
  const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
557
557
  const [tagInput, setTagInput] = useState("");
558
+ const {
559
+ t
560
+ } = useTranslation();
558
561
  const {
559
562
  values,
560
563
  setFieldValue,
@@ -573,12 +576,14 @@ function MediaAssetDetails({
573
576
  await onUpdate(asset.id, values);
574
577
  snackbarController.open({
575
578
  type: "success",
576
- message: "Asset updated successfully"
579
+ message: t("media_asset_updated")
577
580
  });
578
581
  } catch (error) {
579
582
  snackbarController.open({
580
583
  type: "error",
581
- message: `Error updating asset: ${error instanceof Error ? error.message : String(error)}`
584
+ message: t("media_error_updating", {
585
+ message: error instanceof Error ? error.message : String(error)
586
+ })
582
587
  });
583
588
  } finally {
584
589
  setSaving(false);
@@ -590,13 +595,15 @@ function MediaAssetDetails({
590
595
  await onDelete(asset.id);
591
596
  snackbarController.open({
592
597
  type: "success",
593
- message: "Asset deleted successfully"
598
+ message: t("media_asset_deleted")
594
599
  });
595
600
  onClose();
596
601
  } catch (error_0) {
597
602
  snackbarController.open({
598
603
  type: "error",
599
- message: `Error deleting asset: ${error_0 instanceof Error ? error_0.message : String(error_0)}`
604
+ message: t("media_error_deleting", {
605
+ message: error_0 instanceof Error ? error_0.message : String(error_0)
606
+ })
600
607
  });
601
608
  } finally {
602
609
  setDeleting(false);
@@ -612,7 +619,7 @@ function MediaAssetDetails({
612
619
  } catch (error_1) {
613
620
  snackbarController.open({
614
621
  type: "error",
615
- message: "Error getting download URL"
622
+ message: t("media_error_getting_url")
616
623
  });
617
624
  }
618
625
  }, [asset, storageSource, snackbarController]);
@@ -624,7 +631,7 @@ function MediaAssetDetails({
624
631
  }
625
632
  }, [tagInput, values.tags, setFieldValue]);
626
633
  const handleRemoveTag = useCallback((tagToRemove) => {
627
- setFieldValue("tags", values.tags?.filter((t) => t !== tagToRemove) ?? []);
634
+ setFieldValue("tags", values.tags?.filter((t_0) => t_0 !== tagToRemove) ?? []);
628
635
  }, [values.tags, setFieldValue]);
629
636
  const formatSize = (bytes) => {
630
637
  if (bytes < 1024) return `${bytes} B`;
@@ -650,11 +657,11 @@ function MediaAssetDetails({
650
657
  /* @__PURE__ */ jsx(IconButton, { onClick: onClose, children: /* @__PURE__ */ jsx(CloseIcon, { size: "small" }) })
651
658
  ] })
652
659
  ] }),
653
- /* @__PURE__ */ jsx("div", { className: "p-4 bg-surface-accent-100 dark:bg-surface-accent-800 flex items-center justify-center min-h-48 max-h-64", children: isImage && asset.downloadURL ? /* @__PURE__ */ jsx("img", { src: asset.downloadURL, alt: asset.altText || asset.fileName, className: "max-w-full max-h-full object-contain" }) : isVideo && asset.downloadURL ? /* @__PURE__ */ jsx("video", { src: asset.downloadURL, className: "max-w-full max-h-full", controls: true }) : /* @__PURE__ */ jsx("div", { className: "text-surface-accent-400", children: "Preview not available" }) }),
660
+ /* @__PURE__ */ jsx("div", { className: "p-4 bg-surface-accent-100 dark:bg-surface-accent-800 flex items-center justify-center min-h-48 max-h-64", children: isImage && asset.downloadURL ? /* @__PURE__ */ jsx("img", { src: asset.downloadURL, alt: asset.altText || asset.fileName, className: "max-w-full max-h-full object-contain" }) : isVideo && asset.downloadURL ? /* @__PURE__ */ jsx("video", { src: asset.downloadURL, className: "max-w-full max-h-full", controls: true }) : /* @__PURE__ */ jsx("div", { className: "text-surface-accent-400", children: t("media_preview_not_available") }) }),
654
661
  /* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-auto p-4 space-y-4", children: [
655
662
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
656
663
  asset.dimensions && /* @__PURE__ */ jsxs("div", { children: [
657
- /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500", children: "Dimensions" }),
664
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500", children: t("media_dimensions") }),
658
665
  /* @__PURE__ */ jsxs(Typography, { variant: "body2", children: [
659
666
  asset.dimensions.width,
660
667
  " × ",
@@ -663,57 +670,55 @@ function MediaAssetDetails({
663
670
  ] })
664
671
  ] }),
665
672
  /* @__PURE__ */ jsxs("div", { children: [
666
- /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500", children: "Size" }),
673
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500", children: t("media_size") }),
667
674
  /* @__PURE__ */ jsx(Typography, { variant: "body2", children: formatSize(asset.size) })
668
675
  ] }),
669
676
  /* @__PURE__ */ jsxs("div", { children: [
670
- /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500", children: "Type" }),
677
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500", children: t("media_type") }),
671
678
  /* @__PURE__ */ jsx(Typography, { variant: "body2", children: asset.mimeType })
672
679
  ] }),
673
680
  /* @__PURE__ */ jsxs("div", { children: [
674
- /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500", children: "Created" }),
681
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500", children: t("media_created") }),
675
682
  /* @__PURE__ */ jsx(Typography, { variant: "body2", children: formatDate(asset.createdAt) })
676
683
  ] })
677
684
  ] }),
678
685
  /* @__PURE__ */ jsx("hr", { className: "border-surface-accent-200 dark:border-surface-accent-700" }),
679
- /* @__PURE__ */ jsx(TextField, { label: "File Name", value: asset.fileName, disabled: true, size: "small" }),
680
- /* @__PURE__ */ jsx(TextField, { label: "Title", value: values.title ?? "", onChange: (e) => setFieldValue("title", e.target.value), size: "small" }),
686
+ /* @__PURE__ */ jsx(TextField, { label: t("media_file_name"), value: asset.fileName, disabled: true, size: "small" }),
687
+ /* @__PURE__ */ jsx(TextField, { label: t("media_title"), value: values.title ?? "", onChange: (e) => setFieldValue("title", e.target.value), size: "small" }),
681
688
  /* @__PURE__ */ jsxs("div", { children: [
682
- /* @__PURE__ */ jsx(TextField, { label: "Alt Text", value: values.altText ?? "", onChange: (e_0) => setFieldValue("altText", e_0.target.value), size: "small" }),
683
- /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500 mt-1", children: "Recommended for SEO" })
689
+ /* @__PURE__ */ jsx(TextField, { label: t("media_alt_text"), value: values.altText ?? "", onChange: (e_0) => setFieldValue("altText", e_0.target.value), size: "small" }),
690
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500 mt-1", children: t("media_recommended_seo") })
684
691
  ] }),
685
- /* @__PURE__ */ jsx(TextField, { label: "Caption", value: values.caption ?? "", onChange: (e_1) => setFieldValue("caption", e_1.target.value), size: "small", multiline: true }),
692
+ /* @__PURE__ */ jsx(TextField, { label: t("media_caption"), value: values.caption ?? "", onChange: (e_1) => setFieldValue("caption", e_1.target.value), size: "small", multiline: true }),
686
693
  /* @__PURE__ */ jsxs("div", { children: [
687
- /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500 mb-1 block", children: "Tags" }),
694
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500 mb-1 block", children: t("media_tags") }),
688
695
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1 mb-2", children: values.tags?.map((tag_0) => /* @__PURE__ */ jsxs(Chip, { size: "small", colorScheme: "blueLighter", onClick: () => handleRemoveTag(tag_0), children: [
689
696
  tag_0,
690
697
  " ×"
691
698
  ] }, tag_0)) }),
692
699
  /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
693
- /* @__PURE__ */ jsx(TextField, { placeholder: "Add a tag...", value: tagInput, onChange: (e_2) => setTagInput(e_2.target.value), size: "small", className: "flex-1", onKeyDown: (e_3) => {
700
+ /* @__PURE__ */ jsx(TextField, { placeholder: t("media_add_tag"), value: tagInput, onChange: (e_2) => setTagInput(e_2.target.value), size: "small", className: "flex-1", onKeyDown: (e_3) => {
694
701
  if (e_3.key === "Enter") {
695
702
  e_3.preventDefault();
696
703
  handleAddTag();
697
704
  }
698
705
  } }),
699
- /* @__PURE__ */ jsx(Button, { variant: "text", size: "small", onClick: handleAddTag, disabled: !tagInput.trim(), children: "Add" })
706
+ /* @__PURE__ */ jsx(Button, { variant: "text", size: "small", onClick: handleAddTag, disabled: !tagInput.trim(), children: t("media_add") })
700
707
  ] })
701
708
  ] })
702
709
  ] }),
703
- /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 p-4 border-t border-surface-accent-200 dark:border-surface-accent-700", children: /* @__PURE__ */ jsx(Button, { variant: "filled", onClick: handleSave, disabled: !dirty || saving, className: "w-full", children: saving ? /* @__PURE__ */ jsx(CircularProgress, { size: "small" }) : "Save Changes" }) })
710
+ /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 p-4 border-t border-surface-accent-200 dark:border-surface-accent-700", children: /* @__PURE__ */ jsx(Button, { variant: "filled", onClick: handleSave, disabled: !dirty || saving, className: "w-full", children: saving ? /* @__PURE__ */ jsx(CircularProgress, { size: "small" }) : t("media_save_changes") }) })
704
711
  ] }),
705
712
  /* @__PURE__ */ jsxs(Dialog, { open: deleteDialogOpen, onOpenChange: setDeleteDialogOpen, children: [
706
713
  /* @__PURE__ */ jsxs(DialogContent, { children: [
707
- /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", className: "font-medium mb-2", children: "Delete Asset?" }),
708
- /* @__PURE__ */ jsxs(Typography, { className: "text-surface-accent-600 dark:text-surface-accent-400", children: [
709
- 'Are you sure you want to delete "',
710
- asset.title || asset.fileName,
711
- '"? This action cannot be undone.'
712
- ] })
714
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", className: "font-medium mb-2", children: t("media_delete_asset") }),
715
+ /* @__PURE__ */ jsx(Typography, { className: "text-surface-accent-600 dark:text-surface-accent-400", children: t("media_delete_confirmation", {
716
+ name: asset.title || asset.fileName
717
+ }) })
713
718
  ] }),
714
719
  /* @__PURE__ */ jsxs(DialogActions, { children: [
715
- /* @__PURE__ */ jsx(Button, { variant: "text", onClick: () => setDeleteDialogOpen(false), disabled: deleting, children: "Cancel" }),
716
- /* @__PURE__ */ jsx(Button, { variant: "filled", color: "error", onClick: handleDelete, disabled: deleting, children: deleting ? /* @__PURE__ */ jsx(CircularProgress, { size: "small" }) : "Delete" })
720
+ /* @__PURE__ */ jsx(Button, { variant: "text", onClick: () => setDeleteDialogOpen(false), disabled: deleting, children: t("cancel") }),
721
+ /* @__PURE__ */ jsx(Button, { variant: "filled", color: "error", onClick: handleDelete, disabled: deleting, children: deleting ? /* @__PURE__ */ jsx(CircularProgress, { size: "small" }) : t("delete") })
717
722
  ] })
718
723
  ] })
719
724
  ] });
@@ -730,12 +735,18 @@ function MediaUploadDialog({
730
735
  const [uploading, setUploading] = useState(false);
731
736
  const [error, setError] = useState(null);
732
737
  const [selectedFiles, setSelectedFiles] = useState([]);
738
+ const {
739
+ t
740
+ } = useTranslation();
733
741
  const validateFiles = useCallback((files) => {
734
742
  const valid = [];
735
743
  const errors = [];
736
744
  for (const file of files) {
737
745
  if (maxFileSize && file.size > maxFileSize) {
738
- errors.push(`${file.name}: File too large (max ${formatSize(maxFileSize)})`);
746
+ errors.push(t("media_file_too_large", {
747
+ name: file.name,
748
+ size: formatSize(maxFileSize)
749
+ }));
739
750
  continue;
740
751
  }
741
752
  if (acceptedMimeTypes && !acceptedMimeTypes.some((type) => {
@@ -744,7 +755,9 @@ function MediaUploadDialog({
744
755
  }
745
756
  return file.type === type;
746
757
  })) {
747
- errors.push(`${file.name}: File type not allowed`);
758
+ errors.push(t("media_file_type_not_allowed", {
759
+ name: file.name
760
+ }));
748
761
  continue;
749
762
  }
750
763
  valid.push(file);
@@ -802,7 +815,7 @@ function MediaUploadDialog({
802
815
  setSelectedFiles([]);
803
816
  onClose();
804
817
  } catch (err) {
805
- setError(err instanceof Error ? err.message : "Upload failed");
818
+ setError(err instanceof Error ? err.message : t("media_upload_failed"));
806
819
  } finally {
807
820
  setUploading(false);
808
821
  }
@@ -821,26 +834,23 @@ function MediaUploadDialog({
821
834
  };
822
835
  return /* @__PURE__ */ jsxs(Dialog, { open, onOpenChange: (open_0) => !open_0 && handleClose(), maxWidth: "md", children: [
823
836
  /* @__PURE__ */ jsxs(DialogContent, { className: "p-0", children: [
824
- /* @__PURE__ */ jsx("div", { className: "p-4 border-b border-surface-accent-200 dark:border-surface-accent-700", children: /* @__PURE__ */ jsx(Typography, { variant: "h6", children: "Upload Files" }) }),
837
+ /* @__PURE__ */ jsx("div", { className: "p-4 border-b border-surface-accent-200 dark:border-surface-accent-700", children: /* @__PURE__ */ jsx(Typography, { variant: "h6", children: t("media_upload_files") }) }),
825
838
  /* @__PURE__ */ jsxs("div", { className: "p-4", children: [
826
839
  /* @__PURE__ */ jsxs("div", { className: cls("border-2 border-dashed rounded-lg p-8", "flex flex-col items-center justify-center gap-4", "transition-colors duration-150", isDragging ? "border-primary bg-primary/5" : "border-surface-accent-300 dark:border-surface-accent-600", "hover:border-primary hover:bg-primary/5", "cursor-pointer"), onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, onClick: () => document.getElementById("file-upload-input")?.click(), children: [
827
840
  /* @__PURE__ */ jsx(CloudUploadIcon, { size: "large", className: cls(isDragging ? "text-primary" : "text-surface-accent-400") }),
828
841
  /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
829
- /* @__PURE__ */ jsx(Typography, { variant: "body1", className: "font-medium", children: "Drop files here or click to browse" }),
830
- /* @__PURE__ */ jsxs(Typography, { variant: "caption", className: "text-surface-accent-500", children: [
831
- "Maximum file size: ",
832
- formatSize(maxFileSize)
833
- ] })
842
+ /* @__PURE__ */ jsx(Typography, { variant: "body1", className: "font-medium", children: t("media_drop_files") }),
843
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500", children: t("media_max_file_size", {
844
+ size: formatSize(maxFileSize)
845
+ }) })
834
846
  ] }),
835
847
  /* @__PURE__ */ jsx("input", { id: "file-upload-input", type: "file", multiple: true, accept: acceptedMimeTypes?.join(","), onChange: handleFileSelect, className: "hidden" })
836
848
  ] }),
837
849
  error && /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-red-500 mt-2 block whitespace-pre-line", children: error }),
838
850
  selectedFiles.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-4 space-y-2", children: [
839
- /* @__PURE__ */ jsxs(Typography, { variant: "caption", className: "text-surface-accent-500", children: [
840
- "Selected files (",
841
- selectedFiles.length,
842
- ")"
843
- ] }),
851
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-500", children: t("media_selected_files_count", {
852
+ count: selectedFiles.length.toString()
853
+ }) }),
844
854
  /* @__PURE__ */ jsx("div", { className: "max-h-40 overflow-auto space-y-1", children: selectedFiles.map((file_0, index_0) => /* @__PURE__ */ jsxs("div", { className: cls("flex items-center justify-between p-2 rounded", "bg-surface-accent-50 dark:bg-surface-accent-800"), children: [
845
855
  /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0 mr-2", children: [
846
856
  /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "truncate", children: file_0.name }),
@@ -849,22 +859,22 @@ function MediaUploadDialog({
849
859
  /* @__PURE__ */ jsx(Button, { variant: "text", size: "small", onClick: (e_3) => {
850
860
  e_3.stopPropagation();
851
861
  handleRemoveFile(index_0);
852
- }, disabled: uploading, children: "Remove" })
862
+ }, disabled: uploading, children: t("media_remove") })
853
863
  ] }, `${file_0.name}-${index_0}`)) })
854
864
  ] })
855
865
  ] })
856
866
  ] }),
857
867
  /* @__PURE__ */ jsxs(DialogActions, { children: [
858
- /* @__PURE__ */ jsx(Button, { variant: "text", onClick: handleClose, disabled: uploading, children: "Cancel" }),
868
+ /* @__PURE__ */ jsx(Button, { variant: "text", onClick: handleClose, disabled: uploading, children: t("cancel") }),
859
869
  /* @__PURE__ */ jsx(Button, { variant: "filled", onClick: handleUpload, disabled: selectedFiles.length === 0 || uploading, children: uploading ? /* @__PURE__ */ jsxs(Fragment, { children: [
860
870
  /* @__PURE__ */ jsx(CircularProgress, { size: "smallest" }),
861
- "Uploading..."
862
- ] }) : `Upload ${selectedFiles.length > 0 ? `(${selectedFiles.length})` : ""}` })
871
+ t("media_uploading")
872
+ ] }) : `${t("media_upload")} ${selectedFiles.length > 0 ? `(${selectedFiles.length})` : ""}` })
863
873
  ] })
864
874
  ] });
865
875
  }
866
876
  function MediaLibraryView(t0) {
867
- const $ = c(58);
877
+ const $ = c(87);
868
878
  const {
869
879
  maxFileSize,
870
880
  acceptedMimeTypes
@@ -873,6 +883,9 @@ function MediaLibraryView(t0) {
873
883
  const [uploadDialogOpen, setUploadDialogOpen] = useState(false);
874
884
  const [viewMode, setViewMode] = useState("grid");
875
885
  useRef(null);
886
+ const {
887
+ t
888
+ } = useTranslation();
876
889
  let t1;
877
890
  if ($[0] !== controller) {
878
891
  t1 = (query) => {
@@ -920,235 +933,637 @@ function MediaLibraryView(t0) {
920
933
  }
921
934
  const handleRefresh = t4;
922
935
  let t5;
923
- if ($[7] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
924
- t5 = /* @__PURE__ */ jsx(Typography, { variant: "h5", className: "font-semibold", children: "Media Library" });
925
- $[7] = t5;
936
+ if ($[7] !== t) {
937
+ t5 = t("media_library");
938
+ $[7] = t;
939
+ $[8] = t5;
926
940
  } else {
927
- t5 = $[7];
941
+ t5 = $[8];
928
942
  }
929
943
  let t6;
930
- if ($[8] !== controller.totalCount) {
931
- t6 = controller.totalCount !== void 0 && /* @__PURE__ */ jsxs(Typography, { variant: "caption", className: "bg-surface-accent-100 dark:bg-surface-accent-800 px-2 py-0.5 rounded-full", children: [
932
- controller.totalCount,
933
- " assets"
934
- ] });
935
- $[8] = controller.totalCount;
936
- $[9] = t6;
944
+ if ($[9] !== t5) {
945
+ t6 = /* @__PURE__ */ jsx(Typography, { variant: "h5", className: "font-semibold", children: t5 });
946
+ $[9] = t5;
947
+ $[10] = t6;
937
948
  } else {
938
- t6 = $[9];
949
+ t6 = $[10];
939
950
  }
940
951
  let t7;
941
- if ($[10] !== t6) {
942
- t7 = /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
943
- t5,
944
- t6
945
- ] });
946
- $[10] = t6;
947
- $[11] = t7;
952
+ if ($[11] !== controller.totalCount || $[12] !== t) {
953
+ t7 = controller.totalCount !== void 0 && /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "bg-surface-accent-100 dark:bg-surface-accent-800 px-2 py-0.5 rounded-full", children: t("media_assets_count", {
954
+ count: controller.totalCount.toString()
955
+ }) });
956
+ $[11] = controller.totalCount;
957
+ $[12] = t;
958
+ $[13] = t7;
948
959
  } else {
949
- t7 = $[11];
960
+ t7 = $[13];
950
961
  }
951
962
  let t8;
952
- if ($[12] !== handleSearch) {
953
- t8 = /* @__PURE__ */ jsx(SearchBar, { onTextSearch: handleSearch, placeholder: "Search assets...", className: "flex-1 sm:w-64" });
954
- $[12] = handleSearch;
955
- $[13] = t8;
963
+ if ($[14] !== t6 || $[15] !== t7) {
964
+ t8 = /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
965
+ t6,
966
+ t7
967
+ ] });
968
+ $[14] = t6;
969
+ $[15] = t7;
970
+ $[16] = t8;
956
971
  } else {
957
- t8 = $[13];
972
+ t8 = $[16];
958
973
  }
959
974
  let t9;
960
- if ($[14] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
961
- t9 = () => setViewMode("grid");
962
- $[14] = t9;
975
+ if ($[17] !== t) {
976
+ t9 = t("media_search_assets");
977
+ $[17] = t;
978
+ $[18] = t9;
979
+ } else {
980
+ t9 = $[18];
981
+ }
982
+ let t10;
983
+ if ($[19] !== handleSearch || $[20] !== t9) {
984
+ t10 = /* @__PURE__ */ jsx(SearchBar, { onTextSearch: handleSearch, placeholder: t9, className: "flex-1 sm:w-64" });
985
+ $[19] = handleSearch;
986
+ $[20] = t9;
987
+ $[21] = t10;
963
988
  } else {
964
- t9 = $[14];
989
+ t10 = $[21];
965
990
  }
966
- const t10 = viewMode === "grid" && "bg-surface-accent-100 dark:bg-surface-accent-800";
967
991
  let t11;
968
- if ($[15] !== t10) {
969
- t11 = cls(t10);
970
- $[15] = t10;
971
- $[16] = t11;
992
+ if ($[22] !== t) {
993
+ t11 = t("media_grid_view");
994
+ $[22] = t;
995
+ $[23] = t11;
972
996
  } else {
973
- t11 = $[16];
997
+ t11 = $[23];
974
998
  }
975
999
  let t12;
976
- if ($[17] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
977
- t12 = /* @__PURE__ */ jsx(AppsIcon, { size: "small" });
978
- $[17] = t12;
1000
+ if ($[24] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1001
+ t12 = () => setViewMode("grid");
1002
+ $[24] = t12;
979
1003
  } else {
980
- t12 = $[17];
1004
+ t12 = $[24];
981
1005
  }
982
- let t13;
983
- if ($[18] !== t11) {
984
- t13 = /* @__PURE__ */ jsx(Tooltip, { title: "Grid view", children: /* @__PURE__ */ jsx(IconButton, { onClick: t9, className: t11, children: t12 }) });
985
- $[18] = t11;
986
- $[19] = t13;
1006
+ const t13 = viewMode === "grid" && "bg-surface-accent-100 dark:bg-surface-accent-800";
1007
+ let t14;
1008
+ if ($[25] !== t13) {
1009
+ t14 = cls(t13);
1010
+ $[25] = t13;
1011
+ $[26] = t14;
987
1012
  } else {
988
- t13 = $[19];
1013
+ t14 = $[26];
989
1014
  }
990
- let t14;
991
- if ($[20] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
992
- t14 = () => setViewMode("list");
993
- $[20] = t14;
1015
+ let t15;
1016
+ if ($[27] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1017
+ t15 = /* @__PURE__ */ jsx(AppsIcon, { size: "small" });
1018
+ $[27] = t15;
994
1019
  } else {
995
- t14 = $[20];
1020
+ t15 = $[27];
996
1021
  }
997
- const t15 = viewMode === "list" && "bg-surface-accent-100 dark:bg-surface-accent-800";
998
1022
  let t16;
999
- if ($[21] !== t15) {
1000
- t16 = cls(t15);
1001
- $[21] = t15;
1002
- $[22] = t16;
1023
+ if ($[28] !== t14) {
1024
+ t16 = /* @__PURE__ */ jsx(IconButton, { onClick: t12, className: t14, children: t15 });
1025
+ $[28] = t14;
1026
+ $[29] = t16;
1003
1027
  } else {
1004
- t16 = $[22];
1028
+ t16 = $[29];
1005
1029
  }
1006
1030
  let t17;
1007
- if ($[23] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1008
- t17 = /* @__PURE__ */ jsx(Icon, { iconKey: "list", size: "small" });
1009
- $[23] = t17;
1031
+ if ($[30] !== t11 || $[31] !== t16) {
1032
+ t17 = /* @__PURE__ */ jsx(Tooltip, { title: t11, children: t16 });
1033
+ $[30] = t11;
1034
+ $[31] = t16;
1035
+ $[32] = t17;
1010
1036
  } else {
1011
- t17 = $[23];
1037
+ t17 = $[32];
1012
1038
  }
1013
1039
  let t18;
1014
- if ($[24] !== t16) {
1015
- t18 = /* @__PURE__ */ jsx(Tooltip, { title: "List view", children: /* @__PURE__ */ jsx(IconButton, { onClick: t14, className: t16, children: t17 }) });
1016
- $[24] = t16;
1017
- $[25] = t18;
1040
+ if ($[33] !== t) {
1041
+ t18 = t("media_list_view");
1042
+ $[33] = t;
1043
+ $[34] = t18;
1018
1044
  } else {
1019
- t18 = $[25];
1045
+ t18 = $[34];
1020
1046
  }
1021
1047
  let t19;
1022
- if ($[26] !== t13 || $[27] !== t18) {
1023
- t19 = /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 border-l border-surface-accent-200 dark:border-surface-accent-700 pl-2 ml-2", children: [
1024
- t13,
1025
- t18
1026
- ] });
1027
- $[26] = t13;
1028
- $[27] = t18;
1029
- $[28] = t19;
1030
- } else {
1031
- t19 = $[28];
1032
- }
1033
- let t20;
1034
- if ($[29] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1035
- t20 = /* @__PURE__ */ jsx(RefreshIcon, { size: "small" });
1036
- $[29] = t20;
1048
+ if ($[35] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1049
+ t19 = () => setViewMode("list");
1050
+ $[35] = t19;
1037
1051
  } else {
1038
- t20 = $[29];
1052
+ t19 = $[35];
1039
1053
  }
1054
+ const t20 = viewMode === "list" && "bg-surface-accent-100 dark:bg-surface-accent-800";
1040
1055
  let t21;
1041
- if ($[30] !== controller.loading || $[31] !== handleRefresh) {
1042
- t21 = /* @__PURE__ */ jsx(Tooltip, { title: "Refresh", children: /* @__PURE__ */ jsx(IconButton, { onClick: handleRefresh, disabled: controller.loading, children: t20 }) });
1043
- $[30] = controller.loading;
1044
- $[31] = handleRefresh;
1045
- $[32] = t21;
1056
+ if ($[36] !== t20) {
1057
+ t21 = cls(t20);
1058
+ $[36] = t20;
1059
+ $[37] = t21;
1046
1060
  } else {
1047
- t21 = $[32];
1061
+ t21 = $[37];
1048
1062
  }
1049
1063
  let t22;
1050
- if ($[33] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1051
- t22 = /* @__PURE__ */ jsxs(Button, { variant: "filled", onClick: handleUploadClick, children: [
1052
- /* @__PURE__ */ jsx(AddIcon, { size: "small" }),
1053
- "Upload"
1054
- ] });
1055
- $[33] = t22;
1064
+ if ($[38] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1065
+ t22 = /* @__PURE__ */ jsx(Icon, { iconKey: "list", size: "small" });
1066
+ $[38] = t22;
1056
1067
  } else {
1057
- t22 = $[33];
1068
+ t22 = $[38];
1058
1069
  }
1059
1070
  let t23;
1060
- if ($[34] !== t19 || $[35] !== t21 || $[36] !== t8) {
1061
- t23 = /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 w-full sm:w-auto", children: [
1062
- t8,
1063
- t19,
1064
- t21,
1065
- t22
1066
- ] });
1067
- $[34] = t19;
1068
- $[35] = t21;
1069
- $[36] = t8;
1070
- $[37] = t23;
1071
+ if ($[39] !== t21) {
1072
+ t23 = /* @__PURE__ */ jsx(IconButton, { onClick: t19, className: t21, children: t22 });
1073
+ $[39] = t21;
1074
+ $[40] = t23;
1071
1075
  } else {
1072
- t23 = $[37];
1076
+ t23 = $[40];
1073
1077
  }
1074
1078
  let t24;
1075
- if ($[38] !== t23 || $[39] !== t7) {
1076
- t24 = /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 border-b border-surface-accent-200 dark:border-surface-accent-700 bg-surface-50 dark:bg-surface-900", children: /* @__PURE__ */ jsx(Container, { maxWidth: "6xl", className: "py-4", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row gap-4 items-start sm:items-center justify-between", children: [
1077
- t7,
1078
- t23
1079
- ] }) }) });
1080
- $[38] = t23;
1081
- $[39] = t7;
1082
- $[40] = t24;
1079
+ if ($[41] !== t18 || $[42] !== t23) {
1080
+ t24 = /* @__PURE__ */ jsx(Tooltip, { title: t18, children: t23 });
1081
+ $[41] = t18;
1082
+ $[42] = t23;
1083
+ $[43] = t24;
1083
1084
  } else {
1084
- t24 = $[40];
1085
+ t24 = $[43];
1085
1086
  }
1086
1087
  let t25;
1087
- if ($[41] !== controller || $[42] !== handleRefresh || $[43] !== viewMode) {
1088
- t25 = /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-auto", children: /* @__PURE__ */ jsx(Container, { maxWidth: "6xl", className: "py-6", children: controller.loading && controller.assets.length === 0 ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-64", children: /* @__PURE__ */ jsx(CircularProgress, {}) }) : controller.error ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-64 gap-4", children: [
1089
- /* @__PURE__ */ jsxs(Typography, { className: "text-red-500", children: [
1090
- "Error loading assets: ",
1091
- controller.error.message
1092
- ] }),
1093
- /* @__PURE__ */ jsx(Button, { onClick: handleRefresh, children: "Try Again" })
1094
- ] }) : controller.assets.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-64 gap-4", children: [
1095
- /* @__PURE__ */ jsx(Typography, { className: "text-surface-accent-500", children: "No media assets yet" }),
1096
- /* @__PURE__ */ jsxs(Button, { onClick: handleUploadClick, children: [
1097
- /* @__PURE__ */ jsx(AddIcon, { size: "small" }),
1098
- "Upload your first file"
1099
- ] })
1100
- ] }) : /* @__PURE__ */ jsx("div", { className: cls(viewMode === "grid" ? "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4" : "flex flex-col gap-2"), children: controller.assets.map((asset) => /* @__PURE__ */ jsx(MediaAssetCard, { asset, viewMode, onClick: () => controller.selectAsset(asset), selected: controller.selectedAsset?.id === asset.id }, asset.id)) }) }) });
1101
- $[41] = controller;
1102
- $[42] = handleRefresh;
1103
- $[43] = viewMode;
1104
- $[44] = t25;
1088
+ if ($[44] !== t17 || $[45] !== t24) {
1089
+ t25 = /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 border-l border-surface-accent-200 dark:border-surface-accent-700 pl-2 ml-2", children: [
1090
+ t17,
1091
+ t24
1092
+ ] });
1093
+ $[44] = t17;
1094
+ $[45] = t24;
1095
+ $[46] = t25;
1105
1096
  } else {
1106
- t25 = $[44];
1097
+ t25 = $[46];
1107
1098
  }
1108
1099
  let t26;
1109
- if ($[45] !== controller) {
1110
- t26 = controller.selectedAsset && /* @__PURE__ */ jsx(MediaAssetDetails, { asset: controller.selectedAsset, onClose: () => controller.selectAsset(void 0), onUpdate: controller.updateAsset, onDelete: controller.deleteAsset });
1111
- $[45] = controller;
1112
- $[46] = t26;
1100
+ if ($[47] !== t) {
1101
+ t26 = t("media_refresh");
1102
+ $[47] = t;
1103
+ $[48] = t26;
1113
1104
  } else {
1114
- t26 = $[46];
1105
+ t26 = $[48];
1115
1106
  }
1116
1107
  let t27;
1117
- if ($[47] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1118
- t27 = () => setUploadDialogOpen(false);
1119
- $[47] = t27;
1108
+ if ($[49] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1109
+ t27 = /* @__PURE__ */ jsx(RefreshIcon, { size: "small" });
1110
+ $[49] = t27;
1120
1111
  } else {
1121
- t27 = $[47];
1112
+ t27 = $[49];
1122
1113
  }
1123
1114
  let t28;
1124
- if ($[48] !== acceptedMimeTypes || $[49] !== handleFileSelect || $[50] !== maxFileSize || $[51] !== uploadDialogOpen) {
1125
- t28 = /* @__PURE__ */ jsx(MediaUploadDialog, { open: uploadDialogOpen, onClose: t27, onUpload: handleFileSelect, maxFileSize, acceptedMimeTypes });
1126
- $[48] = acceptedMimeTypes;
1127
- $[49] = handleFileSelect;
1128
- $[50] = maxFileSize;
1129
- $[51] = uploadDialogOpen;
1115
+ if ($[50] !== controller.loading || $[51] !== handleRefresh) {
1116
+ t28 = /* @__PURE__ */ jsx(IconButton, { onClick: handleRefresh, disabled: controller.loading, children: t27 });
1117
+ $[50] = controller.loading;
1118
+ $[51] = handleRefresh;
1130
1119
  $[52] = t28;
1131
1120
  } else {
1132
1121
  t28 = $[52];
1133
1122
  }
1134
1123
  let t29;
1135
- if ($[53] !== t24 || $[54] !== t25 || $[55] !== t26 || $[56] !== t28) {
1136
- t29 = /* @__PURE__ */ jsxs("div", { className: "h-full flex flex-col overflow-hidden", children: [
1137
- t24,
1124
+ if ($[53] !== t26 || $[54] !== t28) {
1125
+ t29 = /* @__PURE__ */ jsx(Tooltip, { title: t26, children: t28 });
1126
+ $[53] = t26;
1127
+ $[54] = t28;
1128
+ $[55] = t29;
1129
+ } else {
1130
+ t29 = $[55];
1131
+ }
1132
+ let t30;
1133
+ if ($[56] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1134
+ t30 = /* @__PURE__ */ jsx(AddIcon, { size: "small" });
1135
+ $[56] = t30;
1136
+ } else {
1137
+ t30 = $[56];
1138
+ }
1139
+ let t31;
1140
+ if ($[57] !== t) {
1141
+ t31 = t("media_upload");
1142
+ $[57] = t;
1143
+ $[58] = t31;
1144
+ } else {
1145
+ t31 = $[58];
1146
+ }
1147
+ let t32;
1148
+ if ($[59] !== t31) {
1149
+ t32 = /* @__PURE__ */ jsxs(Button, { variant: "filled", onClick: handleUploadClick, children: [
1150
+ t30,
1151
+ t31
1152
+ ] });
1153
+ $[59] = t31;
1154
+ $[60] = t32;
1155
+ } else {
1156
+ t32 = $[60];
1157
+ }
1158
+ let t33;
1159
+ if ($[61] !== t10 || $[62] !== t25 || $[63] !== t29 || $[64] !== t32) {
1160
+ t33 = /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 w-full sm:w-auto", children: [
1161
+ t10,
1138
1162
  t25,
1139
- t26,
1140
- t28
1163
+ t29,
1164
+ t32
1141
1165
  ] });
1142
- $[53] = t24;
1143
- $[54] = t25;
1144
- $[55] = t26;
1145
- $[56] = t28;
1146
- $[57] = t29;
1166
+ $[61] = t10;
1167
+ $[62] = t25;
1168
+ $[63] = t29;
1169
+ $[64] = t32;
1170
+ $[65] = t33;
1147
1171
  } else {
1148
- t29 = $[57];
1172
+ t33 = $[65];
1149
1173
  }
1150
- return t29;
1174
+ let t34;
1175
+ if ($[66] !== t33 || $[67] !== t8) {
1176
+ t34 = /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 border-b border-surface-accent-200 dark:border-surface-accent-700 bg-surface-50 dark:bg-surface-900", children: /* @__PURE__ */ jsx(Container, { maxWidth: "6xl", className: "py-4", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row gap-4 items-start sm:items-center justify-between", children: [
1177
+ t8,
1178
+ t33
1179
+ ] }) }) });
1180
+ $[66] = t33;
1181
+ $[67] = t8;
1182
+ $[68] = t34;
1183
+ } else {
1184
+ t34 = $[68];
1185
+ }
1186
+ let t35;
1187
+ if ($[69] !== controller || $[70] !== handleRefresh || $[71] !== t || $[72] !== viewMode) {
1188
+ t35 = /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-auto", children: /* @__PURE__ */ jsx(Container, { maxWidth: "6xl", className: "py-6", children: controller.loading && controller.assets.length === 0 ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-64", children: /* @__PURE__ */ jsx(CircularProgress, {}) }) : controller.error ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-64 gap-4", children: [
1189
+ /* @__PURE__ */ jsx(Typography, { className: "text-red-500", children: t("media_error_loading", {
1190
+ message: controller.error.message
1191
+ }) }),
1192
+ /* @__PURE__ */ jsx(Button, { onClick: handleRefresh, children: t("media_try_again") })
1193
+ ] }) : controller.assets.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-64 gap-4", children: [
1194
+ /* @__PURE__ */ jsx(Typography, { className: "text-surface-accent-500", children: t("media_no_assets") }),
1195
+ /* @__PURE__ */ jsxs(Button, { onClick: handleUploadClick, children: [
1196
+ /* @__PURE__ */ jsx(AddIcon, { size: "small" }),
1197
+ t("media_upload_first_file")
1198
+ ] })
1199
+ ] }) : /* @__PURE__ */ jsx("div", { className: cls(viewMode === "grid" ? "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4" : "flex flex-col gap-2"), children: controller.assets.map((asset) => /* @__PURE__ */ jsx(MediaAssetCard, { asset, viewMode, onClick: () => controller.selectAsset(asset), selected: controller.selectedAsset?.id === asset.id }, asset.id)) }) }) });
1200
+ $[69] = controller;
1201
+ $[70] = handleRefresh;
1202
+ $[71] = t;
1203
+ $[72] = viewMode;
1204
+ $[73] = t35;
1205
+ } else {
1206
+ t35 = $[73];
1207
+ }
1208
+ let t36;
1209
+ if ($[74] !== controller) {
1210
+ t36 = controller.selectedAsset && /* @__PURE__ */ jsx(MediaAssetDetails, { asset: controller.selectedAsset, onClose: () => controller.selectAsset(void 0), onUpdate: controller.updateAsset, onDelete: controller.deleteAsset });
1211
+ $[74] = controller;
1212
+ $[75] = t36;
1213
+ } else {
1214
+ t36 = $[75];
1215
+ }
1216
+ let t37;
1217
+ if ($[76] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1218
+ t37 = () => setUploadDialogOpen(false);
1219
+ $[76] = t37;
1220
+ } else {
1221
+ t37 = $[76];
1222
+ }
1223
+ let t38;
1224
+ if ($[77] !== acceptedMimeTypes || $[78] !== handleFileSelect || $[79] !== maxFileSize || $[80] !== uploadDialogOpen) {
1225
+ t38 = /* @__PURE__ */ jsx(MediaUploadDialog, { open: uploadDialogOpen, onClose: t37, onUpload: handleFileSelect, maxFileSize, acceptedMimeTypes });
1226
+ $[77] = acceptedMimeTypes;
1227
+ $[78] = handleFileSelect;
1228
+ $[79] = maxFileSize;
1229
+ $[80] = uploadDialogOpen;
1230
+ $[81] = t38;
1231
+ } else {
1232
+ t38 = $[81];
1233
+ }
1234
+ let t39;
1235
+ if ($[82] !== t34 || $[83] !== t35 || $[84] !== t36 || $[85] !== t38) {
1236
+ t39 = /* @__PURE__ */ jsxs("div", { className: "h-full flex flex-col overflow-hidden", children: [
1237
+ t34,
1238
+ t35,
1239
+ t36,
1240
+ t38
1241
+ ] });
1242
+ $[82] = t34;
1243
+ $[83] = t35;
1244
+ $[84] = t36;
1245
+ $[85] = t38;
1246
+ $[86] = t39;
1247
+ } else {
1248
+ t39 = $[86];
1249
+ }
1250
+ return t39;
1151
1251
  }
1252
+ const mediaManagerTranslationsEn = {
1253
+ media_library: "Media Library",
1254
+ media_library_description: "Manage images and files",
1255
+ media_search_assets: "Search assets...",
1256
+ media_grid_view: "Grid view",
1257
+ media_list_view: "List view",
1258
+ media_refresh: "Refresh",
1259
+ media_upload: "Upload",
1260
+ media_error_loading: "Error loading assets: {{message}}",
1261
+ media_try_again: "Try Again",
1262
+ media_no_assets: "No media assets yet",
1263
+ media_upload_first_file: "Upload your first file",
1264
+ media_asset_updated: "Asset updated successfully",
1265
+ media_error_updating: "Error updating asset: {{message}}",
1266
+ media_asset_deleted: "Asset deleted successfully",
1267
+ media_error_deleting: "Error deleting asset: {{message}}",
1268
+ media_error_getting_url: "Error getting download URL",
1269
+ media_preview_not_available: "Preview not available",
1270
+ media_dimensions: "Dimensions",
1271
+ media_size: "Size",
1272
+ media_type: "Type",
1273
+ media_created: "Created",
1274
+ media_file_name: "File Name",
1275
+ media_title: "Title",
1276
+ media_alt_text: "Alt Text",
1277
+ media_recommended_seo: "Recommended for SEO",
1278
+ media_caption: "Caption",
1279
+ media_tags: "Tags",
1280
+ media_add_tag: "Add a tag...",
1281
+ media_add: "Add",
1282
+ media_save_changes: "Save Changes",
1283
+ media_delete_asset: "Delete Asset?",
1284
+ media_delete_confirmation: 'Are you sure you want to delete "{{name}}"? This action cannot be undone.',
1285
+ media_file_too_large: "{{name}}: File too large (max {{size}})",
1286
+ media_file_type_not_allowed: "{{name}}: File type not allowed",
1287
+ media_upload_failed: "Upload failed",
1288
+ media_upload_files: "Upload Files",
1289
+ media_drop_files: "Drop files here or click to browse",
1290
+ media_max_file_size: "Maximum file size: {{size}}",
1291
+ media_selected_files_count: "Selected files ({{count}})",
1292
+ media_remove: "Remove",
1293
+ media_uploading: "Uploading...",
1294
+ media_manage_description: "Manage your media files and assets",
1295
+ media_assets_count: "{{count}} assets"
1296
+ };
1297
+ const mediaManagerTranslationsEs = {
1298
+ media_library: "Biblioteca de Medios",
1299
+ media_library_description: "Gestionar imágenes y archivos",
1300
+ media_search_assets: "Buscar recursos...",
1301
+ media_grid_view: "Vista de cuadrícula",
1302
+ media_list_view: "Vista de lista",
1303
+ media_refresh: "Actualizar",
1304
+ media_upload: "Subir",
1305
+ media_error_loading: "Error al cargar recursos: {{message}}",
1306
+ media_try_again: "Volver a intentar",
1307
+ media_no_assets: "Aún no hay recursos multimedia",
1308
+ media_upload_first_file: "Sube tu primer archivo",
1309
+ media_asset_updated: "Recurso actualizado con éxito",
1310
+ media_error_updating: "Error al actualizar recurso: {{message}}",
1311
+ media_asset_deleted: "Recurso eliminado con éxito",
1312
+ media_error_deleting: "Error al eliminar recurso: {{message}}",
1313
+ media_error_getting_url: "Error al obtener URL de descarga",
1314
+ media_preview_not_available: "Vista previa no disponible",
1315
+ media_dimensions: "Dimensiones",
1316
+ media_size: "Tamaño",
1317
+ media_type: "Tipo",
1318
+ media_created: "Creado",
1319
+ media_file_name: "Nombre del archivo",
1320
+ media_title: "Título",
1321
+ media_alt_text: "Texto alternativo",
1322
+ media_recommended_seo: "Recomendado para SEO",
1323
+ media_caption: "Leyenda",
1324
+ media_tags: "Etiquetas",
1325
+ media_add_tag: "Añadir una etiqueta...",
1326
+ media_add: "Añadir",
1327
+ media_save_changes: "Guardar cambios",
1328
+ media_delete_asset: "¿Eliminar recurso?",
1329
+ media_delete_confirmation: '¿Estás seguro de que deseas eliminar "{{name}}"? Esta acción no se puede deshacer.',
1330
+ media_file_too_large: "{{name}}: Archivo demasiado grande (máx. {{size}})",
1331
+ media_file_type_not_allowed: "{{name}}: Tipo de archivo no permitido",
1332
+ media_upload_failed: "Error al subir",
1333
+ media_upload_files: "Subir archivos",
1334
+ media_drop_files: "Suelta archivos aquí o haz clic para buscar",
1335
+ media_max_file_size: "Tamaño máximo de archivo: {{size}}",
1336
+ media_selected_files_count: "Archivos seleccionados ({{count}})",
1337
+ media_remove: "Quitar",
1338
+ media_uploading: "Subiendo...",
1339
+ media_manage_description: "Gestiona tus archivos y recursos multimedia",
1340
+ media_assets_count: "{{count}} recursos"
1341
+ };
1342
+ const mediaManagerTranslationsDe = {
1343
+ media_library: "Mediathek",
1344
+ media_library_description: "Bilder und Dateien verwalten",
1345
+ media_search_assets: "Assets durchsuchen...",
1346
+ media_grid_view: "Rasteransicht",
1347
+ media_list_view: "Listenansicht",
1348
+ media_refresh: "Aktualisieren",
1349
+ media_upload: "Hochladen",
1350
+ media_error_loading: "Fehler beim Laden der Assets: {{message}}",
1351
+ media_try_again: "Erneut versuchen",
1352
+ media_no_assets: "Noch keine Medien-Assets",
1353
+ media_upload_first_file: "Laden Sie Ihre erste Datei hoch",
1354
+ media_asset_updated: "Asset erfolgreich aktualisiert",
1355
+ media_error_updating: "Fehler beim Aktualisieren des Assets: {{message}}",
1356
+ media_asset_deleted: "Asset erfolgreich gelöscht",
1357
+ media_error_deleting: "Fehler beim Löschen des Assets: {{message}}",
1358
+ media_error_getting_url: "Fehler beim Abrufen der Download-URL",
1359
+ media_preview_not_available: "Vorschau nicht verfügbar",
1360
+ media_dimensions: "Abmessungen",
1361
+ media_size: "Größe",
1362
+ media_type: "Typ",
1363
+ media_created: "Erstellt",
1364
+ media_file_name: "Dateiname",
1365
+ media_title: "Titel",
1366
+ media_alt_text: "Alternativtext",
1367
+ media_recommended_seo: "Empfohlen für SEO",
1368
+ media_caption: "Bildunterschrift",
1369
+ media_tags: "Schlagwörter",
1370
+ media_add_tag: "Schlagwort hinzufügen...",
1371
+ media_add: "Hinzufügen",
1372
+ media_save_changes: "Änderungen speichern",
1373
+ media_delete_asset: "Asset löschen?",
1374
+ media_delete_confirmation: 'Sind Sie sicher, dass Sie "{{name}}" löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.',
1375
+ media_file_too_large: "{{name}}: Datei ist zu groß (max. {{size}})",
1376
+ media_file_type_not_allowed: "{{name}}: Dateityp nicht zulässig",
1377
+ media_upload_failed: "Hochladen fehlgeschlagen",
1378
+ media_upload_files: "Dateien hochladen",
1379
+ media_drop_files: "Dateien hier ablegen oder zum Durchsuchen klicken",
1380
+ media_max_file_size: "Maximale Dateigröße: {{size}}",
1381
+ media_selected_files_count: "Ausgewählte Dateien ({{count}})",
1382
+ media_remove: "Entfernen",
1383
+ media_uploading: "Wird hochgeladen...",
1384
+ media_manage_description: "Verwalten Sie Ihre Mediendateien und Assets",
1385
+ media_assets_count: "{{count}} Assets"
1386
+ };
1387
+ const mediaManagerTranslationsFr = {
1388
+ media_library: "Médiathèque",
1389
+ media_library_description: "Gérer les images et les fichiers",
1390
+ media_search_assets: "Rechercher des éléments...",
1391
+ media_grid_view: "Vue en grille",
1392
+ media_list_view: "Vue en liste",
1393
+ media_refresh: "Rafraîchir",
1394
+ media_upload: "Télécharger",
1395
+ media_error_loading: "Erreur lors du chargement des éléments : {{message}}",
1396
+ media_try_again: "Réessayer",
1397
+ media_no_assets: "Pas encore d'éléments multimédias",
1398
+ media_upload_first_file: "Téléchargez votre premier fichier",
1399
+ media_asset_updated: "Élément mis à jour avec succès",
1400
+ media_error_updating: "Erreur lors de la mise à jour de l'élément : {{message}}",
1401
+ media_asset_deleted: "Élément supprimé avec succès",
1402
+ media_error_deleting: "Erreur lors de la suppression de l'élément : {{message}}",
1403
+ media_error_getting_url: "Erreur lors de l'obtention de l'URL de téléchargement",
1404
+ media_preview_not_available: "Aperçu non disponible",
1405
+ media_dimensions: "Dimensions",
1406
+ media_size: "Taille",
1407
+ media_type: "Type",
1408
+ media_created: "Créé",
1409
+ media_file_name: "Nom du fichier",
1410
+ media_title: "Titre",
1411
+ media_alt_text: "Texte alternatif",
1412
+ media_recommended_seo: "Recommandé pour le référencement (SEO)",
1413
+ media_caption: "Légende",
1414
+ media_tags: "Balises",
1415
+ media_add_tag: "Ajouter une balise...",
1416
+ media_add: "Ajouter",
1417
+ media_save_changes: "Enregistrer les modifications",
1418
+ media_delete_asset: "Supprimer l'élément ?",
1419
+ media_delete_confirmation: 'Êtes-vous sûr de vouloir supprimer "{{name}}" ? Cette action ne peut pas être annulée.',
1420
+ media_file_too_large: "{{name}} : Fichier trop volumineux (max {{size}})",
1421
+ media_file_type_not_allowed: "{{name}} : Type de fichier non autorisé",
1422
+ media_upload_failed: "Le téléchargement a échoué",
1423
+ media_upload_files: "Télécharger des fichiers",
1424
+ media_drop_files: "Déposez les fichiers ici ou cliquez pour parcourir",
1425
+ media_max_file_size: "Taille maximale du fichier : {{size}}",
1426
+ media_selected_files_count: "Fichiers sélectionnés ({{count}})",
1427
+ media_remove: "Retirer",
1428
+ media_uploading: "Téléchargement en cours...",
1429
+ media_manage_description: "Gérez vos fichiers et éléments multimédias",
1430
+ media_assets_count: "{{count}} éléments"
1431
+ };
1432
+ const mediaManagerTranslationsIt = {
1433
+ media_library: "Libreria multimediale",
1434
+ media_library_description: "Gestisci immagini e file",
1435
+ media_search_assets: "Cerca risorse...",
1436
+ media_grid_view: "Visualizzazione griglia",
1437
+ media_list_view: "Visualizzazione elenco",
1438
+ media_refresh: "Aggiorna",
1439
+ media_upload: "Carica",
1440
+ media_error_loading: "Errore durante il caricamento delle risorse: {{message}}",
1441
+ media_try_again: "Riprova",
1442
+ media_no_assets: "Nessuna risorsa multimediale ancora presente",
1443
+ media_upload_first_file: "Carica il tuo primo file",
1444
+ media_asset_updated: "Risorsa aggiornata con successo",
1445
+ media_error_updating: "Errore durante l'aggiornamento della risorsa: {{message}}",
1446
+ media_asset_deleted: "Risorsa eliminata con successo",
1447
+ media_error_deleting: "Errore durante l'eliminazione della risorsa: {{message}}",
1448
+ media_error_getting_url: "Errore durante il recupero dell'URL di download",
1449
+ media_preview_not_available: "Anteprima non disponibile",
1450
+ media_dimensions: "Dimensioni",
1451
+ media_size: "Dimensione",
1452
+ media_type: "Tipo",
1453
+ media_created: "Creato",
1454
+ media_file_name: "Nome file",
1455
+ media_title: "Titolo",
1456
+ media_alt_text: "Testo alternativo",
1457
+ media_recommended_seo: "Consigliato per la SEO",
1458
+ media_caption: "Didascalia",
1459
+ media_tags: "Tag",
1460
+ media_add_tag: "Aggiungi un tag...",
1461
+ media_add: "Aggiungi",
1462
+ media_save_changes: "Salva modifiche",
1463
+ media_delete_asset: "Elimina risorsa?",
1464
+ media_delete_confirmation: 'Sei sicuro di voler eliminare "{{name}}"? Questa azione non può essere annullata.',
1465
+ media_file_too_large: "{{name}}: File troppo grande (max {{size}})",
1466
+ media_file_type_not_allowed: "{{name}}: Tipo di file non consentito",
1467
+ media_upload_failed: "Caricamento fallito",
1468
+ media_upload_files: "Carica file",
1469
+ media_drop_files: "Rilascia i file qui o fai clic per sfogliare",
1470
+ media_max_file_size: "Dimensione massima del file: {{size}}",
1471
+ media_selected_files_count: "File selezionati ({{count}})",
1472
+ media_remove: "Rimuovi",
1473
+ media_uploading: "Caricamento in corso...",
1474
+ media_manage_description: "Gestisci i tuoi file e risorse multimediali",
1475
+ media_assets_count: "{{count}} risorse"
1476
+ };
1477
+ const mediaManagerTranslationsHi = {
1478
+ media_library: "मीडिया लाइब्रेरी",
1479
+ media_library_description: "चित्र और फ़ाइलें प्रबंधित करें",
1480
+ media_search_assets: "संपत्तियां खोजें...",
1481
+ media_grid_view: "ग्रिड दृश्य",
1482
+ media_list_view: "सूची दृश्य",
1483
+ media_refresh: "रीफ्रेश करें",
1484
+ media_upload: "अपलोड करें",
1485
+ media_error_loading: "संपत्तियों को लोड करने में त्रुटि: {{message}}",
1486
+ media_try_again: "पुनः प्रयास करें",
1487
+ media_no_assets: "अभी तक कोई मीडिया संपत्ति नहीं",
1488
+ media_upload_first_file: "अपनी पहली फ़ाइल अपलोड करें",
1489
+ media_asset_updated: "संपत्ति सफलतापूर्वक अपडेट की गई",
1490
+ media_error_updating: "संपत्ति को अपडेट करने में त्रुटि: {{message}}",
1491
+ media_asset_deleted: "संपत्ति सफलतापूर्वक हटा दी गई",
1492
+ media_error_deleting: "संपत्ति को हटाने में त्रुटि: {{message}}",
1493
+ media_error_getting_url: "डाउनलोड URL प्राप्त करने में त्रुटि",
1494
+ media_preview_not_available: "पूर्वावलोकन उपलब्ध नहीं है",
1495
+ media_dimensions: "आयाम",
1496
+ media_size: "आकार",
1497
+ media_type: "प्रकार",
1498
+ media_created: "बनाया गया",
1499
+ media_file_name: "फ़ाइल का नाम",
1500
+ media_title: "शीर्षक",
1501
+ media_alt_text: "वैकल्पिक पाठ",
1502
+ media_recommended_seo: "SEO के लिए अनुशंसित",
1503
+ media_caption: "कैप्शन",
1504
+ media_tags: "टैग",
1505
+ media_add_tag: "एक टैग जोड़ें...",
1506
+ media_add: "जोड़ें",
1507
+ media_save_changes: "परिवर्तन सहेजें",
1508
+ media_delete_asset: "संपत्ति हटाएं?",
1509
+ media_delete_confirmation: 'क्या आप निश्चित रूप से "{{name}}" को हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती।',
1510
+ media_file_too_large: "{{name}}: फ़ाइल बहुत बड़ी है (अधिकतम {{size}})",
1511
+ media_file_type_not_allowed: "{{name}}: फ़ाइल प्रकार की अनुमति नहीं है",
1512
+ media_upload_failed: "अपलोड विफल रहा",
1513
+ media_upload_files: "फ़ाइलें अपलोड करें",
1514
+ media_drop_files: "फ़ाइलें यहाँ छोड़ें या ब्राउज़ करने के लिए क्लिक करें",
1515
+ media_max_file_size: "अधिकतम फ़ाइल आकार: {{size}}",
1516
+ media_selected_files_count: "चयनित फ़ाइलें ({{count}})",
1517
+ media_remove: "हटाएं",
1518
+ media_uploading: "अपलोड हो रहा है...",
1519
+ media_manage_description: "अपनी मीडिया फ़ाइलें और संपत्तियां प्रबंधित करें",
1520
+ media_assets_count: "{{count}} संपत्तियां"
1521
+ };
1522
+ const mediaManagerTranslationsPt = {
1523
+ media_library: "Biblioteca de Média",
1524
+ media_library_description: "Gerir imagens e ficheiros",
1525
+ media_search_assets: "Pesquisar recursos...",
1526
+ media_grid_view: "Vista em grelha",
1527
+ media_list_view: "Vista em lista",
1528
+ media_refresh: "Atualizar",
1529
+ media_upload: "Carregar",
1530
+ media_error_loading: "Erro ao carregar recursos: {{message}}",
1531
+ media_try_again: "Tentar Novamente",
1532
+ media_no_assets: "Ainda não há recursos de média",
1533
+ media_upload_first_file: "Carregue o seu primeiro ficheiro",
1534
+ media_asset_updated: "Recurso atualizado com sucesso",
1535
+ media_error_updating: "Erro ao atualizar recurso: {{message}}",
1536
+ media_asset_deleted: "Recurso eliminado com sucesso",
1537
+ media_error_deleting: "Erro ao eliminar recurso: {{message}}",
1538
+ media_error_getting_url: "Erro ao obter URL de download",
1539
+ media_preview_not_available: "Pré-visualização não disponível",
1540
+ media_dimensions: "Dimensões",
1541
+ media_size: "Tamanho",
1542
+ media_type: "Tipo",
1543
+ media_created: "Criado",
1544
+ media_file_name: "Nome do Ficheiro",
1545
+ media_title: "Título",
1546
+ media_alt_text: "Texto Alternativo",
1547
+ media_recommended_seo: "Recomendado para SEO",
1548
+ media_caption: "Legenda",
1549
+ media_tags: "Etiquetas",
1550
+ media_add_tag: "Adicionar uma etiqueta...",
1551
+ media_add: "Adicionar",
1552
+ media_save_changes: "Guardar Alterações",
1553
+ media_delete_asset: "Eliminar Recurso?",
1554
+ media_delete_confirmation: 'Tem a certeza de que quer eliminar "{{name}}"? Esta ação não pode ser desfeita.',
1555
+ media_file_too_large: "{{name}}: Ficheiro demasiado grande (máx {{size}})",
1556
+ media_file_type_not_allowed: "{{name}}: Tipo de ficheiro não permitido",
1557
+ media_upload_failed: "Falha no carregamento",
1558
+ media_upload_files: "Carregar Ficheiros",
1559
+ media_drop_files: "Solte ficheiros aqui ou clique para navegar",
1560
+ media_max_file_size: "Tamanho máximo de ficheiro: {{size}}",
1561
+ media_selected_files_count: "Ficheiros selecionados ({{count}})",
1562
+ media_remove: "Remover",
1563
+ media_uploading: "A carregar...",
1564
+ media_manage_description: "Gerir os seus ficheiros e recursos de média",
1565
+ media_assets_count: "{{count}} recursos"
1566
+ };
1152
1567
  const DEFAULT_STORAGE_PATH = "media";
1153
1568
  const DEFAULT_COLLECTION_PATH = "media_assets";
1154
1569
  const MediaManagerConfigContext = createContext(null);
@@ -1211,29 +1626,41 @@ function buildMediaView() {
1211
1626
  return {
1212
1627
  path: "media",
1213
1628
  name: "Media Library",
1214
- description: "Manage your media files and assets",
1629
+ description: "Manage your media files",
1215
1630
  group: "Media",
1216
1631
  icon: "perm_media",
1217
1632
  view: /* @__PURE__ */ jsx(MediaLibraryViewInternal, {})
1218
1633
  };
1219
1634
  }
1220
- const MEDIA_VIEW = buildMediaView();
1221
1635
  function useMediaManagerPlugin(props) {
1636
+ const mediaView = useMemo(() => buildMediaView(), []);
1222
1637
  return useMemo(() => ({
1223
1638
  key: "media_manager",
1224
- views: [MEDIA_VIEW],
1639
+ views: [mediaView],
1225
1640
  provider: {
1226
1641
  Component: ({
1227
1642
  children
1228
1643
  }) => /* @__PURE__ */ jsx(MediaManagerConfigContext.Provider, { value: props, children })
1644
+ },
1645
+ i18n: {
1646
+ en: mediaManagerTranslationsEn,
1647
+ es: mediaManagerTranslationsEs,
1648
+ de: mediaManagerTranslationsDe,
1649
+ fr: mediaManagerTranslationsFr,
1650
+ it: mediaManagerTranslationsIt,
1651
+ hi: mediaManagerTranslationsHi,
1652
+ pt: mediaManagerTranslationsPt
1229
1653
  }
1230
1654
  }), []);
1231
1655
  }
1232
1656
  function MediaLibraryCard(t0) {
1233
- const $ = c(3);
1657
+ const $ = c(13);
1234
1658
  const {
1235
1659
  group
1236
1660
  } = t0;
1661
+ const {
1662
+ t
1663
+ } = useTranslation();
1237
1664
  if (group !== "Media") {
1238
1665
  return null;
1239
1666
  }
@@ -1252,19 +1679,53 @@ function MediaLibraryCard(t0) {
1252
1679
  t2 = $[1];
1253
1680
  }
1254
1681
  let t3;
1255
- if ($[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1256
- t3 = /* @__PURE__ */ jsx(Link, { to: "/media", className: "no-underline", children: /* @__PURE__ */ jsx(Card, { className: t1, children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
1682
+ if ($[2] !== t) {
1683
+ t3 = t("media_library");
1684
+ $[2] = t;
1685
+ $[3] = t3;
1686
+ } else {
1687
+ t3 = $[3];
1688
+ }
1689
+ let t4;
1690
+ if ($[4] !== t3) {
1691
+ t4 = /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", className: "font-medium", children: t3 });
1692
+ $[4] = t3;
1693
+ $[5] = t4;
1694
+ } else {
1695
+ t4 = $[5];
1696
+ }
1697
+ let t5;
1698
+ if ($[6] !== t) {
1699
+ t5 = t("media_library_description");
1700
+ $[6] = t;
1701
+ $[7] = t5;
1702
+ } else {
1703
+ t5 = $[7];
1704
+ }
1705
+ let t6;
1706
+ if ($[8] !== t5) {
1707
+ t6 = /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-600 dark:text-surface-accent-400", children: t5 });
1708
+ $[8] = t5;
1709
+ $[9] = t6;
1710
+ } else {
1711
+ t6 = $[9];
1712
+ }
1713
+ let t7;
1714
+ if ($[10] !== t4 || $[11] !== t6) {
1715
+ t7 = /* @__PURE__ */ jsx(Link, { to: "/media", className: "no-underline", children: /* @__PURE__ */ jsx(Card, { className: t1, children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
1257
1716
  t2,
1258
1717
  /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
1259
- /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", className: "font-medium", children: "Media Library" }),
1260
- /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-surface-accent-600 dark:text-surface-accent-400", children: "Manage images and files" })
1718
+ t4,
1719
+ t6
1261
1720
  ] })
1262
1721
  ] }) }) });
1263
- $[2] = t3;
1722
+ $[10] = t4;
1723
+ $[11] = t6;
1724
+ $[12] = t7;
1264
1725
  } else {
1265
- t3 = $[2];
1726
+ t7 = $[12];
1266
1727
  }
1267
- return t3;
1728
+ return t7;
1268
1729
  }
1269
1730
  export {
1270
1731
  MediaAssetCard,