@edifice.io/react 2.3.0-develop-b2school.20250901133825 → 2.3.0-develop-pedago.20250902121609

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/components/Avatar/Avatar.d.ts +5 -0
  2. package/dist/components/Avatar/Avatar.js +8 -2
  3. package/dist/components/AvatarGroup/AvatarGroup.d.ts +10 -0
  4. package/dist/components/AvatarGroup/AvatarGroup.js +5 -5
  5. package/dist/components/Dropdown/Dropdown.d.ts +10 -4
  6. package/dist/components/Dropdown/Dropdown.js +24 -8
  7. package/dist/components/Flex/Flex.d.ts +1 -0
  8. package/dist/components/Flex/Flex.js +3 -2
  9. package/dist/components/Layout/Layout.d.ts +5 -1
  10. package/dist/components/Layout/Layout.js +5 -2
  11. package/dist/components/StackedGroup/StackedGroup.d.ts +5 -0
  12. package/dist/components/StackedGroup/StackedGroup.js +10 -8
  13. package/dist/components/Tabs/components/Tabs.d.ts +27 -3
  14. package/dist/components/Tabs/components/Tabs.js +9 -3
  15. package/dist/components/Tabs/components/TabsList.d.ts +15 -1
  16. package/dist/components/Tabs/components/TabsList.js +15 -5
  17. package/dist/components/Tabs/components/TabsPanel.d.ts +9 -1
  18. package/dist/components/Tabs/components/TabsPanel.js +8 -3
  19. package/dist/hooks/useDropdown/useDropdown.d.ts +2 -0
  20. package/dist/hooks/useDropdown/useDropdown.js +2 -0
  21. package/dist/hooks/useEdificeIcons/useEdificeIcons.js +3 -0
  22. package/dist/icons.js +190 -184
  23. package/dist/index.js +12 -10
  24. package/dist/modules/editor/components/Toolbar/TableToolbar.AddMenu.js +1 -1
  25. package/dist/modules/editor/components/Toolbar/TableToolbar.DelMenu.js +1 -1
  26. package/dist/modules/icons/components/IconMegaphone.d.ts +7 -0
  27. package/dist/modules/icons/components/IconMegaphone.js +12 -0
  28. package/dist/modules/icons/components/IconNotes.d.ts +7 -0
  29. package/dist/modules/icons/components/IconNotes.js +13 -0
  30. package/dist/modules/icons/components/IconUnion.d.ts +7 -0
  31. package/dist/modules/icons/components/IconUnion.js +15 -0
  32. package/dist/modules/icons/components/index.d.ts +3 -0
  33. package/dist/modules/modals/ResourceModal/ResourceModal.d.ts +57 -2
  34. package/dist/modules/modals/ResourceModal/ResourceModal.js +20 -16
  35. package/dist/modules/multimedia/FileCard/FileCard.d.ts +13 -2
  36. package/dist/modules/multimedia/FileCard/FileCard.js +15 -5
  37. package/dist/modules/multimedia/FileCard/FileIcon.d.ts +5 -1
  38. package/dist/modules/multimedia/FileCard/FileIcon.js +2 -2
  39. package/dist/modules/multimedia/MediaLibrary/MediaLibrary.d.ts +3 -1
  40. package/dist/modules/multimedia/MediaLibrary/MediaLibrary.js +7 -2
  41. package/dist/modules/multimedia/index.d.ts +1 -0
  42. package/dist/multimedia.js +12 -10
  43. package/package.json +6 -6
@@ -7,13 +7,53 @@ export interface FormInputs {
7
7
  enablePublic: boolean;
8
8
  formSlug: string;
9
9
  }
10
+ /**
11
+ * Custom translations interface for overriding default translations
12
+ */
13
+ export interface ResourceModalTranslations {
14
+ title?: string;
15
+ description?: string;
16
+ cancel?: string;
17
+ create?: string;
18
+ save?: string;
19
+ header?: {
20
+ create?: string;
21
+ edit?: string;
22
+ };
23
+ heading?: {
24
+ general?: string;
25
+ access?: string;
26
+ };
27
+ placeholder?: {
28
+ title?: string;
29
+ description?: string;
30
+ };
31
+ imagepicker?: {
32
+ add?: string;
33
+ delete?: string;
34
+ };
35
+ success?: {
36
+ created?: string;
37
+ updated?: string;
38
+ };
39
+ }
10
40
  interface BaseProps {
41
+ /** Controls modal visibility */
11
42
  isOpen: boolean;
43
+ /** Custom content to be displayed after the form fields */
12
44
  children?: ReactNode | ((...props: any) => ReactNode);
45
+ /** Maximum length for the title input */
13
46
  inputMaxLength?: number;
47
+ /** Maximum length for the description textarea */
14
48
  textareaMaxLength?: number;
15
- onSuccess: () => void;
49
+ /** Callback when operation succeeds, with operation result as parameter */
50
+ onSuccess: (result: CreateResult | UpdateResult, param: CreateParameters | UpdateParameters) => void;
51
+ /** Callback when operation is cancelled */
16
52
  onCancel: () => void;
53
+ /** Override application code (uses EdificeClient context by default) */
54
+ appCode?: string;
55
+ /** Custom translations for the modal */
56
+ translations?: ResourceModalTranslations;
17
57
  }
18
58
  interface CreateProps extends BaseProps {
19
59
  mode: 'create';
@@ -26,5 +66,20 @@ interface UpdateProps extends BaseProps {
26
66
  resourceId: ID;
27
67
  }
28
68
  type Props = CreateProps | UpdateProps;
29
- export declare const ResourceModal: ({ isOpen, onCancel, onSuccess, children, inputMaxLength, textareaMaxLength, ...props }: Props) => import("react/jsx-runtime").JSX.Element;
69
+ /**
70
+ * ResourceModal component for creating or updating resources
71
+ *
72
+ * @component
73
+ * @example
74
+ * ```tsx
75
+ * <ResourceModal
76
+ * mode="create"
77
+ * isOpen={true}
78
+ * onCancel={() => setOpen(false)}
79
+ * onSuccess={(result) => console.log('Resource created:', result)}
80
+ * currentFolder={{ id: 'default' }}
81
+ * />
82
+ * ```
83
+ */
84
+ export declare const ResourceModal: ({ isOpen, onCancel, onSuccess, children, appCode: customAppCode, translations: customT, inputMaxLength, textareaMaxLength, ...props }: Props) => import("react/jsx-runtime").JSX.Element;
30
85
  export default ResourceModal;
@@ -25,14 +25,17 @@ const DEFAULT_INPUT_MAX_LENGTH = 60, DEFAULT_TEXTAREA_MAX_LENGTH = 400, Resource
25
25
  onCancel,
26
26
  onSuccess,
27
27
  children,
28
+ appCode: customAppCode,
29
+ translations: customT = {},
28
30
  inputMaxLength = DEFAULT_INPUT_MAX_LENGTH,
29
31
  textareaMaxLength = DEFAULT_TEXTAREA_MAX_LENGTH,
30
32
  ...props
31
33
  }) => {
34
+ var _a, _b, _c, _d, _e, _f;
32
35
  const {
33
- appCode: application,
36
+ appCode: contextAppCode,
34
37
  currentApp
35
- } = useEdificeClient(), {
38
+ } = useEdificeClient(), application = customAppCode || contextAppCode, {
36
39
  t
37
40
  } = useTranslation(), {
38
41
  mode
@@ -65,7 +68,7 @@ const DEFAULT_INPUT_MAX_LENGTH = 60, DEFAULT_TEXTAREA_MAX_LENGTH = 400, Resource
65
68
  isUpdating,
66
69
  selectedResource: isUpdating ? resource : void 0
67
70
  }), watchedDescription = watch("description"), onSubmit = async function(formData) {
68
- var _a, _b;
71
+ var _a2, _b2;
69
72
  try {
70
73
  const data = {
71
74
  description: formData.description || "",
@@ -74,21 +77,22 @@ const DEFAULT_INPUT_MAX_LENGTH = 60, DEFAULT_TEXTAREA_MAX_LENGTH = 400, Resource
74
77
  slug: formData.enablePublic && formData.formSlug || "",
75
78
  thumbnail
76
79
  };
80
+ let result, param;
77
81
  if (isCreating) {
78
82
  const createParams = {
79
83
  ...data,
80
84
  folder: props.currentFolder === void 0 || // Fix #WB2-1296: when searching, currentFolder is undefined
81
- ((_a = props.currentFolder) == null ? void 0 : _a.id) === "default" ? void 0 : parseInt(((_b = props.currentFolder) == null ? void 0 : _b.id) || ""),
85
+ ((_a2 = props.currentFolder) == null ? void 0 : _a2.id) === "default" ? void 0 : parseInt(((_b2 = props.currentFolder) == null ? void 0 : _b2.id) || ""),
82
86
  application
83
87
  };
84
- props.createResource ? await props.createResource.mutateAsync(createParams) : await odeServices.resource(application).create(createParams);
88
+ param = createParams, props.createResource ? result = await props.createResource.mutateAsync(createParams) : result = await odeServices.resource(application).create(createParams);
85
89
  } else {
86
90
  const updateParams = {
87
91
  ...data,
88
92
  entId: resource.assetId,
89
93
  trashed: resource.trashed
90
94
  };
91
- props.updateResource ? await props.updateResource.mutateAsync(updateParams) : await odeServices.resource(application).update(updateParams);
95
+ param = updateParams, props.updateResource ? result = await props.updateResource.mutateAsync(updateParams) : result = await odeServices.resource(application).update(updateParams);
92
96
  }
93
97
  toast.success(/* @__PURE__ */ jsxs(Fragment, { children: [
94
98
  /* @__PURE__ */ jsx("strong", { children: t(isCreating ? "explorer.resource.created" : "explorer.resource.updated") }),
@@ -106,21 +110,21 @@ const DEFAULT_INPUT_MAX_LENGTH = 60, DEFAULT_TEXTAREA_MAX_LENGTH = 400, Resource
106
110
  "Public:",
107
111
  formData.enablePublic ? t("explorer.enable.public.yes") : t("explorer.enable.public.no")
108
112
  ] })
109
- ] })), onSuccess();
113
+ ] })), onSuccess(result, param);
110
114
  } catch (e) {
111
115
  console.error(e);
112
116
  }
113
117
  };
114
118
  return isUpdating && !resource ? /* @__PURE__ */ jsx(LoadingScreen, {}) : /* @__PURE__ */ createPortal(/* @__PURE__ */ jsxs(Modal, { id: `${mode}-resource`, size: "lg", isOpen, onModalClose: onCancel, children: [
115
- /* @__PURE__ */ jsx(Modal.Header, { onModalClose: onCancel, children: t(`explorer.resource.editModal.header.${isCreating ? "create" : "edit"}`) }),
119
+ /* @__PURE__ */ jsx(Modal.Header, { onModalClose: onCancel, children: ((_a = customT.header) == null ? void 0 : _a[isCreating ? "create" : "edit"]) ?? t(`explorer.resource.editModal.header.${isCreating ? "create" : "edit"}`) }),
116
120
  /* @__PURE__ */ jsxs(Modal.Body, { children: [
117
- /* @__PURE__ */ jsx(Heading, { headingStyle: "h4", level: "h3", className: "mb-16", children: t("explorer.resource.editModal.heading.general") }),
121
+ /* @__PURE__ */ jsx(Heading, { headingStyle: "h4", level: "h3", className: "mb-16", children: ((_b = customT.heading) == null ? void 0 : _b.general) ?? t("explorer.resource.editModal.heading.general") }),
118
122
  /* @__PURE__ */ jsxs("form", { id: formId, onSubmit: handleSubmit(onSubmit), children: [
119
123
  /* @__PURE__ */ jsxs("div", { className: "d-block d-md-flex gap-16 mb-24", children: [
120
- /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(ImagePicker, { app: currentApp, src: isUpdating && (resource == null ? void 0 : resource.thumbnail) || "", addButtonLabel: t("explorer.imagepicker.button.add"), deleteButtonLabel: t("explorer.imagepicker.button.delete"), onUploadImage: handleUploadImage, onDeleteImage: handleDeleteImage, className: "align-self-center mt-8", libraryMedia, mediaLibraryRef }) }),
124
+ /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(ImagePicker, { app: currentApp, src: isUpdating && (resource == null ? void 0 : resource.thumbnail) || "", addButtonLabel: ((_c = customT.imagepicker) == null ? void 0 : _c.add) ?? t("explorer.imagepicker.button.add"), deleteButtonLabel: ((_d = customT.imagepicker) == null ? void 0 : _d.delete) ?? t("explorer.imagepicker.button.delete"), onUploadImage: handleUploadImage, onDeleteImage: handleDeleteImage, className: "align-self-center mt-8", libraryMedia, mediaLibraryRef }) }),
121
125
  /* @__PURE__ */ jsxs("div", { className: "col", children: [
122
126
  /* @__PURE__ */ jsxs(FormControl, { id: "title", className: "mb-16", isRequired: !0, children: [
123
- /* @__PURE__ */ jsx(Label, { children: t("title") }),
127
+ /* @__PURE__ */ jsx(Label, { children: customT.title ?? t("title") }),
124
128
  /* @__PURE__ */ jsx(Input, { type: "text", defaultValue: isUpdating ? resource == null ? void 0 : resource.name : "", ...register("title", {
125
129
  required: !0,
126
130
  maxLength: inputMaxLength,
@@ -128,14 +132,14 @@ const DEFAULT_INPUT_MAX_LENGTH = 60, DEFAULT_TEXTAREA_MAX_LENGTH = 400, Resource
128
132
  value: /[^ ]/,
129
133
  message: "invalid title"
130
134
  }
131
- }), placeholder: t("explorer.resource.editModal.title.placeholder"), size: "md", "aria-required": !0, maxLength: inputMaxLength })
135
+ }), placeholder: ((_e = customT.placeholder) == null ? void 0 : _e.title) ?? t("explorer.resource.editModal.title.placeholder"), size: "md", "aria-required": !0, maxLength: inputMaxLength })
132
136
  ] }),
133
137
  /* @__PURE__ */ jsxs(FormControl, { id: "description", isOptional: !0, children: [
134
- /* @__PURE__ */ jsx(Label, { children: t("description") }),
138
+ /* @__PURE__ */ jsx(Label, { children: customT.description ?? t("description") }),
135
139
  /* @__PURE__ */ jsx(TextArea, { defaultValue: (resource == null ? void 0 : resource.description) || "", ...register("description", {
136
140
  required: !1,
137
141
  maxLength: textareaMaxLength
138
- }), placeholder: t("explorer.resource.editModal.description.placeholder"), size: "md", maxLength: textareaMaxLength }),
142
+ }), placeholder: ((_f = customT.placeholder) == null ? void 0 : _f.description) ?? t("explorer.resource.editModal.description.placeholder"), size: "md", maxLength: textareaMaxLength }),
139
143
  watchedDescription && /* @__PURE__ */ jsx(TextareaCounter, { content: watchedDescription, maxLength: textareaMaxLength })
140
144
  ] })
141
145
  ] })
@@ -144,8 +148,8 @@ const DEFAULT_INPUT_MAX_LENGTH = 60, DEFAULT_TEXTAREA_MAX_LENGTH = 400, Resource
144
148
  ] })
145
149
  ] }),
146
150
  /* @__PURE__ */ jsxs(Modal.Footer, { children: [
147
- /* @__PURE__ */ jsx(Button, { color: "tertiary", onClick: onCancel, type: "button", variant: "ghost", children: t("explorer.cancel") }),
148
- /* @__PURE__ */ jsx(Button, { form: formId, type: "submit", color: "primary", isLoading: isSubmitting, variant: "filled", disabled: !isValid || isSubmitting, children: t(isCreating ? "explorer.create" : "save") })
151
+ /* @__PURE__ */ jsx(Button, { color: "tertiary", onClick: onCancel, type: "button", variant: "ghost", children: customT.cancel ?? t("explorer.cancel") }),
152
+ /* @__PURE__ */ jsx(Button, { form: formId, type: "submit", color: "primary", isLoading: isSubmitting, variant: "filled", disabled: !isValid || isSubmitting, children: isCreating ? customT.create ?? t("explorer.create") : customT.save ?? t("save") })
149
153
  ] }),
150
154
  /* @__PURE__ */ jsx(MediaLibrary, { appCode: application, ref: mediaLibraryRef, multiple: !1, visibility: "protected", ...mediaLibraryHandlers })
151
155
  ] }), document.getElementById("portal"));
@@ -1,13 +1,24 @@
1
+ import { ReactNode } from 'react';
1
2
  import { WorkspaceElement } from '@edifice.io/client';
2
3
  import { CardProps } from '../../../components';
3
4
  export interface FileCardProps extends CardProps {
4
5
  /**
5
6
  * WorkspaceElement
6
- * */
7
+ */
7
8
  doc: WorkspaceElement;
9
+ /**
10
+ * Custom icon to override the default based on file type
11
+ * Can be a string or a React node
12
+ */
13
+ customIcon?: ReactNode;
14
+ /**
15
+ * Custom color class to override the default based on file type
16
+ * Example: "bg-purple-300" or any valid CSS class
17
+ */
18
+ customColor?: string;
8
19
  }
9
20
  declare const FileCard: {
10
- ({ doc, isClickable, isSelectable, isSelected, onClick, className, }: FileCardProps): import("react/jsx-runtime").JSX.Element;
21
+ ({ doc, isClickable, isSelectable, isSelected, onClick, className, onSelect, isFocused, app, customIcon, customColor, }: FileCardProps): import("react/jsx-runtime").JSX.Element;
11
22
  displayName: string;
12
23
  };
13
24
  export default FileCard;
@@ -15,11 +15,21 @@ const FileCard = ({
15
15
  isSelectable = !1,
16
16
  isSelected = !1,
17
17
  onClick,
18
- className
18
+ className,
19
+ onSelect,
20
+ isFocused,
21
+ app,
22
+ customIcon,
23
+ customColor
19
24
  }) => {
20
- var _a;
21
25
  const ref = useRef(null), type = DocumentHelper.getRole(doc);
22
26
  function getRoleMap(type2) {
27
+ if (customIcon !== void 0 || customColor !== void 0)
28
+ return {
29
+ icon: customIcon || /* @__PURE__ */ jsx(SvgIconTextPage, { width: 22, height: 22 }),
30
+ color: customColor || "bg-gray-300",
31
+ hasShadow: !1
32
+ };
23
33
  const roleMappings = {
24
34
  csv: {
25
35
  icon: ".CSV",
@@ -72,17 +82,17 @@ const FileCard = ({
72
82
  };
73
83
  return roleMappings[type2] || roleMappings.unknown;
74
84
  }
75
- const file = clsx("file position-relative rounded", ((_a = getRoleMap(type ?? "default")) == null ? void 0 : _a.color) ?? "bg-yellow-200"), mediaSrc = type === "img" || type === "video" ? odeServices.workspace().getThumbnailUrl(doc) : null, hasThumbnail = useThumbnail(mediaSrc, {
85
+ const roleMap = getRoleMap(type ?? "unknown"), file = clsx("file position-relative rounded", (roleMap == null ? void 0 : roleMap.color) ?? "bg-yellow-200"), mediaSrc = type === "img" || type === "video" ? odeServices.workspace().getThumbnailUrl(doc) : null, hasThumbnail = useThumbnail(mediaSrc, {
76
86
  ref
77
87
  }), imageStyles = hasThumbnail && {
78
88
  backgroundImage: `url(${mediaSrc})`,
79
89
  backgroundSize: "cover"
80
90
  };
81
- return /* @__PURE__ */ jsx(Card, { className: clsx("card-file", className), isClickable, isSelectable, isSelected, onClick, children: /* @__PURE__ */ jsxs(Card.Body, { space: "8", children: [
91
+ return /* @__PURE__ */ jsx(Card, { className: clsx("card-file", className), isClickable, isSelectable, isSelected, onClick, app, isFocused, onSelect, children: /* @__PURE__ */ jsxs(Card.Body, { space: "8", children: [
82
92
  /* @__PURE__ */ jsx("div", { ref, className: file, style: {
83
93
  aspectRatio: "16/10",
84
94
  ...imageStyles
85
- }, children: type !== "img" || type === "img" && !hasThumbnail ? /* @__PURE__ */ jsx(FileIcon, { type, roleMap: getRoleMap(type) }) : null }),
95
+ }, children: type !== "img" || type === "img" && !hasThumbnail ? /* @__PURE__ */ jsx(FileIcon, { type, roleMap }) : null }),
86
96
  /* @__PURE__ */ jsxs("div", { className: "mt-4", children: [
87
97
  /* @__PURE__ */ jsx(Card.Text, { children: doc.name }),
88
98
  /* @__PURE__ */ jsx(Card.Text, { className: "text-black-50", children: doc == null ? void 0 : doc.ownerName })
@@ -1,6 +1,10 @@
1
1
  import { Role } from '@edifice.io/client';
2
2
  declare const FileIcon: ({ type, roleMap, }: {
3
3
  type: Role | "unknown";
4
- roleMap?: Record<string, string | JSX.Element>;
4
+ roleMap?: {
5
+ icon: React.ReactNode | string;
6
+ color: string;
7
+ hasShadow?: boolean;
8
+ };
5
9
  }) => import("react/jsx-runtime").JSX.Element;
6
10
  export default FileIcon;
@@ -5,8 +5,8 @@ const FileIcon = ({
5
5
  type,
6
6
  roleMap
7
7
  }) => {
8
- const hasNoShadow = typeof (roleMap == null ? void 0 : roleMap.icon) != "string" && type !== "unknown", fileicon = clsx("position-absolute top-50 start-50 translate-middle", {
9
- "p-12 rounded-circle shadow": hasNoShadow
8
+ const hasShadow = typeof (roleMap == null ? void 0 : roleMap.icon) != "string" && type !== "unknown" && (roleMap == null ? void 0 : roleMap.hasShadow) !== !1, fileicon = clsx("position-absolute top-50 start-50 translate-middle", {
9
+ "p-12 rounded-circle shadow": hasShadow
10
10
  }, roleMap == null ? void 0 : roleMap.color);
11
11
  return /* @__PURE__ */ jsx("div", { className: fileicon, children: (roleMap == null ? void 0 : roleMap.icon) ?? /* @__PURE__ */ jsx(SvgIconPaperclip, {}) });
12
12
  };
@@ -35,7 +35,9 @@ export type MediaLibraryType =
35
35
  /** Embedded websites */
36
36
  | 'embedder'
37
37
  /** Hyperlinks */
38
- | 'hyperlink';
38
+ | 'hyperlink'
39
+ /** Studio mode for recording audio and video */
40
+ | 'studio';
39
41
  export interface MediaLibraryRef {
40
42
  /** Open the Media Library on given type. */
41
43
  show: (type: MediaLibraryType) => void;
@@ -56,6 +56,11 @@ const orderedTabs = [
56
56
  embedder: {
57
57
  title: "bbm.embed.modal.title",
58
58
  defaultTab: "iframe"
59
+ },
60
+ // Add studio type with video-capture as default tab
61
+ studio: {
62
+ title: "bbm.studio.modal.title",
63
+ defaultTab: "audio-capture"
59
64
  }
60
65
  }, MediaLibrary = /* @__PURE__ */ forwardRef(({
61
66
  appCode,
@@ -101,7 +106,7 @@ const orderedTabs = [
101
106
  icon: /* @__PURE__ */ jsx(SvgIconRecordVideo, {}),
102
107
  label: t("bbm.video"),
103
108
  content: /* @__PURE__ */ jsx(InnerTabs.Video, {}),
104
- availableFor: ["video"],
109
+ availableFor: ["video", "studio"],
105
110
  isEnable: () => !!videoCaptureWorkflow
106
111
  },
107
112
  "audio-capture": {
@@ -109,7 +114,7 @@ const orderedTabs = [
109
114
  icon: /* @__PURE__ */ jsx(SvgIconMic, {}),
110
115
  label: t("bbm.audio"),
111
116
  content: /* @__PURE__ */ jsx(InnerTabs.Audio, {}),
112
- availableFor: ["audio"],
117
+ availableFor: ["audio", "studio"],
113
118
  isEnable: () => !!workspaceCreateWorkflow
114
119
  },
115
120
  "external-link": {
@@ -2,6 +2,7 @@ export * from './AudioRecorder';
2
2
  export * from './Embed';
3
3
  export * from './ImageEditor';
4
4
  export * from './ImagePicker';
5
+ export * from './FileCard';
5
6
  export * from './Linker';
6
7
  export * from './MediaLibrary';
7
8
  export * from './VideoEmbed';
@@ -2,23 +2,25 @@ import { default as default2 } from "./modules/multimedia/AudioRecorder/AudioRec
2
2
  import { default as default3 } from "./modules/multimedia/Embed/Embed.js";
3
3
  import { default as default4 } from "./modules/multimedia/ImageEditor/components/ImageEditor.js";
4
4
  import { default as default5 } from "./modules/multimedia/ImagePicker/ImagePicker.js";
5
- import { default as default6 } from "./modules/multimedia/MediaLibrary/MediaLibrary.js";
6
- import { default as default7 } from "./modules/multimedia/VideoEmbed/VideoEmbed.js";
7
- import { default as default8 } from "./modules/multimedia/VideoRecorder/VideoRecorder.js";
8
- import { default as default9 } from "./modules/multimedia/Workspace/Workspace.js";
9
- import { default as default10 } from "./modules/multimedia/WorkspaceFolders/WorkspaceFolders.js";
5
+ import { default as default6 } from "./modules/multimedia/FileCard/FileCard.js";
6
+ import { default as default7 } from "./modules/multimedia/MediaLibrary/MediaLibrary.js";
7
+ import { default as default8 } from "./modules/multimedia/VideoEmbed/VideoEmbed.js";
8
+ import { default as default9 } from "./modules/multimedia/VideoRecorder/VideoRecorder.js";
9
+ import { default as default10 } from "./modules/multimedia/Workspace/Workspace.js";
10
+ import { default as default11 } from "./modules/multimedia/WorkspaceFolders/WorkspaceFolders.js";
10
11
  import { ExternalLinker } from "./modules/multimedia/Linker/ExternalLinker/ExternalLinker.js";
11
12
  import { InternalLinker } from "./modules/multimedia/Linker/InternalLinker/InternalLinker.js";
12
13
  export {
13
14
  default2 as AudioRecorder,
14
15
  default3 as Embed,
15
16
  ExternalLinker,
17
+ default6 as FileCard,
16
18
  default4 as ImageEditor,
17
19
  default5 as ImagePicker,
18
20
  InternalLinker,
19
- default6 as MediaLibrary,
20
- default7 as VideoEmbed,
21
- default8 as VideoRecorder,
22
- default9 as Workspace,
23
- default10 as WorkspaceFolders
21
+ default7 as MediaLibrary,
22
+ default8 as VideoEmbed,
23
+ default9 as VideoRecorder,
24
+ default10 as Workspace,
25
+ default11 as WorkspaceFolders
24
26
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edifice.io/react",
3
- "version": "2.3.0-develop-b2school.20250901133825",
3
+ "version": "2.3.0-develop-pedago.20250902121609",
4
4
  "description": "Edifice React Library",
5
5
  "keywords": [
6
6
  "react",
@@ -130,9 +130,9 @@
130
130
  "react-slugify": "^3.0.3",
131
131
  "swiper": "^10.1.0",
132
132
  "ua-parser-js": "^1.0.36",
133
- "@edifice.io/bootstrap": "2.3.0-develop-b2school.20250901133825",
134
- "@edifice.io/tiptap-extensions": "2.3.0-develop-b2school.20250901133825",
135
- "@edifice.io/utilities": "2.3.0-develop-b2school.20250901133825"
133
+ "@edifice.io/bootstrap": "2.3.0-develop-pedago.20250902121609",
134
+ "@edifice.io/tiptap-extensions": "2.3.0-develop-pedago.20250902121609",
135
+ "@edifice.io/utilities": "2.3.0-develop-pedago.20250902121609"
136
136
  },
137
137
  "devDependencies": {
138
138
  "@babel/plugin-transform-react-pure-annotations": "^7.23.3",
@@ -163,8 +163,8 @@
163
163
  "vite": "^5.4.11",
164
164
  "vite-plugin-dts": "^4.1.0",
165
165
  "vite-tsconfig-paths": "^5.0.1",
166
- "@edifice.io/client": "2.3.0-develop-b2school.20250901133825",
167
- "@edifice.io/config": "2.3.0-develop-b2school.20250901133825"
166
+ "@edifice.io/client": "2.3.0-develop-pedago.20250902121609",
167
+ "@edifice.io/config": "2.3.0-develop-pedago.20250902121609"
168
168
  },
169
169
  "peerDependencies": {
170
170
  "@react-spring/web": "^9.7.5",