@firecms/core 3.1.0-canary.24c8270 → 3.1.0-canary.75005e4

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 (180) hide show
  1. package/dist/components/EntityCollectionView/CollectionDataErrorBanner.d.ts +4 -0
  2. package/dist/components/ErrorBoundary.d.ts +3 -1
  3. package/dist/components/HomePage/DefaultHomePage.d.ts +0 -1
  4. package/dist/components/LanguageToggle.d.ts +1 -0
  5. package/dist/components/UnsavedChangesDialog.d.ts +1 -0
  6. package/dist/components/index.d.ts +1 -0
  7. package/dist/core/DrawerNavigationGroup.d.ts +2 -2
  8. package/dist/editor/components/SlashCommandMenu.d.ts +6 -0
  9. package/dist/editor/components/editor-bubble-item.d.ts +8 -0
  10. package/dist/editor/components/editor-bubble.d.ts +8 -0
  11. package/dist/editor/components/index.d.ts +14 -0
  12. package/dist/editor/editor.d.ts +30 -0
  13. package/dist/editor/extensions/HighlightDecorationExtension.d.ts +24 -0
  14. package/dist/editor/extensions/Image/index.d.ts +6 -0
  15. package/dist/editor/extensions/Image.d.ts +6 -0
  16. package/dist/editor/extensions/TextLoadingDecorationExtension.d.ts +16 -0
  17. package/dist/editor/extensions/clipboard.d.ts +7 -0
  18. package/dist/editor/extensions/custom-keymap.d.ts +1 -0
  19. package/dist/editor/extensions/drag-and-drop.d.ts +9 -0
  20. package/dist/editor/hooks/useProseMirror.d.ts +14 -0
  21. package/dist/editor/hooks/useProseMirrorContext.d.ts +9 -0
  22. package/dist/editor/index.d.ts +2 -0
  23. package/dist/editor/markdown.d.ts +5 -0
  24. package/dist/editor/nodeViews/ImageComponent.d.ts +3 -0
  25. package/dist/editor/nodeViews/ReactNodeView.d.ts +29 -0
  26. package/dist/editor/nodeViews/TaskItemComponent.d.ts +3 -0
  27. package/dist/editor/nodeViews/index.d.ts +6 -0
  28. package/dist/editor/plugins/index.d.ts +2 -0
  29. package/dist/editor/plugins/inputrules.d.ts +6 -0
  30. package/dist/editor/plugins/placeholderPlugin.d.ts +3 -0
  31. package/dist/editor/plugins/slashCommandPlugin.d.ts +11 -0
  32. package/dist/editor/schema.d.ts +2 -0
  33. package/dist/editor/selectors/ai-selector.d.ts +0 -0
  34. package/dist/editor/selectors/color-selector.d.ts +10 -0
  35. package/dist/editor/selectors/link-selector.d.ts +8 -0
  36. package/dist/editor/selectors/node-selector.d.ts +15 -0
  37. package/dist/editor/selectors/text-buttons.d.ts +1 -0
  38. package/dist/editor/types.d.ts +5 -0
  39. package/dist/editor/useProseMirror.d.ts +16 -0
  40. package/dist/editor/utils/prosemirror-utils.d.ts +6 -0
  41. package/dist/editor/utils/remove_classes.d.ts +1 -0
  42. package/dist/editor/utils/useDebouncedCallback.d.ts +1 -0
  43. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +1 -1
  44. package/dist/hooks/index.d.ts +1 -0
  45. package/dist/hooks/useBuildNavigationController.d.ts +0 -1
  46. package/dist/hooks/useCollapsedGroups.d.ts +3 -3
  47. package/dist/hooks/useTranslation.d.ts +17 -0
  48. package/dist/i18n/FireCMSi18nProvider.d.ts +33 -0
  49. package/dist/index.d.ts +4 -0
  50. package/dist/index.es.js +11293 -2142
  51. package/dist/index.es.js.map +1 -1
  52. package/dist/index.umd.js +11274 -2142
  53. package/dist/index.umd.js.map +1 -1
  54. package/dist/locales/de.d.ts +2 -0
  55. package/dist/locales/en.d.ts +10 -0
  56. package/dist/locales/es.d.ts +10 -0
  57. package/dist/locales/fr.d.ts +2 -0
  58. package/dist/locales/hi.d.ts +2 -0
  59. package/dist/locales/it.d.ts +2 -0
  60. package/dist/locales/pt.d.ts +7 -0
  61. package/dist/types/customization_controller.d.ts +2 -1
  62. package/dist/types/firecms.d.ts +2 -1
  63. package/dist/types/index.d.ts +1 -0
  64. package/dist/types/navigation.d.ts +2 -2
  65. package/dist/types/plugins.d.ts +7 -0
  66. package/dist/types/translations.d.ts +646 -0
  67. package/package.json +43 -9
  68. package/src/app/Scaffold.tsx +7 -5
  69. package/src/components/AIIcon.tsx +3 -1
  70. package/src/components/ArrayContainer.tsx +6 -4
  71. package/src/components/ClearFilterSortButton.tsx +6 -3
  72. package/src/components/ConfirmationDialog.tsx +4 -2
  73. package/src/components/DeleteEntityDialog.tsx +10 -7
  74. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +6 -3
  75. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +3 -1
  76. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +3 -2
  77. package/src/components/EntityCollectionView/BoardSortableList.tsx +3 -1
  78. package/src/components/EntityCollectionView/CollectionDataErrorBanner.tsx +43 -0
  79. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +16 -43
  80. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +17 -25
  81. package/src/components/EntityCollectionView/EntityCollectionView.tsx +26 -18
  82. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -3
  83. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +4 -2
  84. package/src/components/EntityCollectionView/FiltersDialog.tsx +8 -5
  85. package/src/components/EntityCollectionView/ViewModeToggle.tsx +11 -8
  86. package/src/components/EntityView.tsx +3 -2
  87. package/src/components/ErrorBoundary.tsx +27 -15
  88. package/src/components/HomePage/DefaultHomePage.tsx +19 -13
  89. package/src/components/HomePage/HomePageDnD.tsx +3 -1
  90. package/src/components/HomePage/NavigationGroup.tsx +3 -1
  91. package/src/components/HomePage/RenameGroupDialog.tsx +15 -13
  92. package/src/components/LanguageToggle.tsx +66 -0
  93. package/src/components/NotFoundPage.tsx +5 -3
  94. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +9 -7
  95. package/src/components/ReferenceWidget.tsx +3 -2
  96. package/src/components/SearchIconsView.tsx +3 -1
  97. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +11 -0
  98. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +15 -2
  99. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +11 -0
  100. package/src/components/UnsavedChangesDialog.tsx +6 -4
  101. package/src/components/VirtualTable/VirtualTable.performance.test.tsx +1 -0
  102. package/src/components/VirtualTable/VirtualTableHeader.tsx +12 -10
  103. package/src/components/common/default_entity_actions.tsx +4 -0
  104. package/src/components/common/useDataSourceTableController.tsx +5 -14
  105. package/src/components/index.tsx +1 -0
  106. package/src/core/DefaultAppBar.tsx +14 -10
  107. package/src/core/DefaultDrawer.tsx +8 -2
  108. package/src/core/DrawerNavigationGroup.tsx +5 -3
  109. package/src/core/EntityEditView.tsx +3 -2
  110. package/src/core/EntityEditViewFormActions.tsx +24 -17
  111. package/src/core/EntitySidePanel.tsx +4 -3
  112. package/src/core/FireCMS.tsx +33 -6
  113. package/src/editor/components/SlashCommandMenu.tsx +348 -0
  114. package/src/editor/components/editor-bubble-item.tsx +32 -0
  115. package/src/editor/components/editor-bubble.tsx +118 -0
  116. package/src/editor/components/index.ts +12 -0
  117. package/src/editor/editor.tsx +307 -0
  118. package/src/editor/extensions/HighlightDecorationExtension.ts +114 -0
  119. package/src/editor/extensions/Image/index.ts +133 -0
  120. package/src/editor/extensions/Image.ts +144 -0
  121. package/src/editor/extensions/TextLoadingDecorationExtension.tsx +107 -0
  122. package/src/editor/extensions/clipboard.ts +72 -0
  123. package/src/editor/extensions/custom-keymap.ts +24 -0
  124. package/src/editor/extensions/drag-and-drop.tsx +472 -0
  125. package/src/editor/hooks/useProseMirror.ts +115 -0
  126. package/src/editor/hooks/useProseMirrorContext.ts +15 -0
  127. package/src/editor/index.ts +2 -0
  128. package/src/editor/markdown.ts +110 -0
  129. package/src/editor/nodeViews/ImageComponent.tsx +20 -0
  130. package/src/editor/nodeViews/ReactNodeView.tsx +89 -0
  131. package/src/editor/nodeViews/TaskItemComponent.tsx +29 -0
  132. package/src/editor/nodeViews/index.ts +35 -0
  133. package/src/editor/plugins/index.ts +55 -0
  134. package/src/editor/plugins/inputrules.ts +82 -0
  135. package/src/editor/plugins/placeholderPlugin.ts +55 -0
  136. package/src/editor/plugins/slashCommandPlugin.ts +49 -0
  137. package/src/editor/schema.ts +228 -0
  138. package/src/editor/selectors/ai-selector.tsx +111 -0
  139. package/src/editor/selectors/color-selector.tsx +200 -0
  140. package/src/editor/selectors/link-selector.tsx +118 -0
  141. package/src/editor/selectors/node-selector.tsx +157 -0
  142. package/src/editor/selectors/text-buttons.tsx +86 -0
  143. package/src/editor/types.ts +6 -0
  144. package/src/editor/useProseMirror.ts +126 -0
  145. package/src/editor/utils/prosemirror-utils.ts +78 -0
  146. package/src/editor/utils/remove_classes.ts +17 -0
  147. package/src/editor/utils/useDebouncedCallback.ts +25 -0
  148. package/src/form/EntityForm.tsx +7 -3
  149. package/src/form/EntityFormActions.tsx +19 -12
  150. package/src/form/PropertyFieldBinding.tsx +3 -2
  151. package/src/form/components/LocalChangesMenu.tsx +13 -13
  152. package/src/form/components/StorageItemPreview.tsx +3 -2
  153. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +4 -4
  154. package/src/form/field_bindings/BlockFieldBinding.tsx +5 -2
  155. package/src/form/field_bindings/KeyValueFieldBinding.tsx +23 -18
  156. package/src/form/field_bindings/MapFieldBinding.tsx +4 -3
  157. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +3 -3
  158. package/src/form/field_bindings/RepeatFieldBinding.tsx +3 -1
  159. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +4 -2
  160. package/src/hooks/index.tsx +1 -0
  161. package/src/hooks/useBuildNavigationController.tsx +20 -13
  162. package/src/hooks/useCollapsedGroups.ts +7 -6
  163. package/src/hooks/useTranslation.ts +31 -0
  164. package/src/i18n/FireCMSi18nProvider.tsx +160 -0
  165. package/src/index.ts +4 -0
  166. package/src/locales/de.ts +691 -0
  167. package/src/locales/en.ts +703 -0
  168. package/src/locales/es.ts +703 -0
  169. package/src/locales/fr.ts +691 -0
  170. package/src/locales/hi.ts +691 -0
  171. package/src/locales/it.ts +691 -0
  172. package/src/locales/pt.ts +700 -0
  173. package/src/preview/components/UrlComponentPreview.tsx +4 -2
  174. package/src/preview/components/UserPreview.tsx +3 -1
  175. package/src/types/customization_controller.tsx +2 -1
  176. package/src/types/firecms.tsx +2 -1
  177. package/src/types/index.ts +1 -0
  178. package/src/types/navigation.ts +2 -2
  179. package/src/types/plugins.tsx +8 -0
  180. package/src/types/translations.ts +725 -0
@@ -0,0 +1,160 @@
1
+ import React, { PropsWithChildren, useEffect, useRef } from "react";
2
+ import i18next, { i18n } from "i18next";
3
+ import { I18nextProvider, initReactI18next } from "react-i18next";
4
+ import { en } from "../locales/en";
5
+ import { es } from "../locales/es";
6
+ import { de } from "../locales/de";
7
+ import { fr } from "../locales/fr";
8
+ import { it } from "../locales/it";
9
+ import { hi } from "../locales/hi";
10
+ import { pt } from "../locales/pt";
11
+ import { FireCMSTranslations } from "../types/translations";
12
+
13
+ const FIRECMS_NS = "firecms_core";
14
+
15
+ export const FIRECMS_LOCALE_STORAGE_KEY = "firecms_locale";
16
+
17
+ /** DeepPartial helper — allows partial overrides at any nesting level */
18
+ type DeepPartial<T> = T extends object
19
+ ? { [K in keyof T]?: DeepPartial<T[K]> }
20
+ : T;
21
+
22
+ export interface FireCMSi18nProviderProps {
23
+ /** BCP-47 locale tag, e.g. "en", "es", "fr". Defaults to "en". */
24
+ locale?: string;
25
+ /**
26
+ * Override or extend any FireCMS UI string, keyed by locale.
27
+ *
28
+ * @example
29
+ * translations={{
30
+ * en: { save: "Publish" },
31
+ * es: { save: "Publicar", discard: "Descartar" }
32
+ * }}
33
+ */
34
+ translations?: {
35
+ [locale: string]: DeepPartial<FireCMSTranslations>;
36
+ };
37
+ }
38
+
39
+ /**
40
+ * Initialises a dedicated i18next instance for FireCMS's internal UI strings.
41
+ *
42
+ * This instance is isolated from any app-level i18next configuration the
43
+ * consumer may have. Mount this at the top of the FireCMS component tree.
44
+ *
45
+ * @internal
46
+ */
47
+ export function FireCMSi18nProvider({
48
+ locale = "en",
49
+ translations,
50
+ children
51
+ }: PropsWithChildren<FireCMSi18nProviderProps>) {
52
+ const i18nRef = useRef<i18n | null>(null);
53
+ const [ready, setReady] = React.useState(false);
54
+
55
+ if (!i18nRef.current) {
56
+ const instance = i18next.createInstance();
57
+
58
+ // Build the initial resources: English baseline + any consumer overrides
59
+ const resources = buildResources(translations);
60
+
61
+ let initialLocale = locale;
62
+ if (typeof window !== "undefined") {
63
+ const stored = localStorage.getItem(FIRECMS_LOCALE_STORAGE_KEY);
64
+ if (stored) initialLocale = stored;
65
+ }
66
+
67
+ instance
68
+ .use(initReactI18next)
69
+ .init({
70
+ lng: initialLocale,
71
+ fallbackLng: "en",
72
+ ns: [FIRECMS_NS],
73
+ defaultNS: FIRECMS_NS,
74
+ resources,
75
+ interpolation: {
76
+ // React already escapes — don't double-escape
77
+ escapeValue: false,
78
+ },
79
+ }, () => {
80
+ setReady(true);
81
+ });
82
+
83
+ instance.on("languageChanged", (lng) => {
84
+ if (typeof window !== "undefined") {
85
+ localStorage.setItem(FIRECMS_LOCALE_STORAGE_KEY, lng);
86
+ }
87
+ });
88
+
89
+ i18nRef.current = instance;
90
+ }
91
+
92
+ // When `locale` prop changes, switch language on the existing instance
93
+ // ONLY if the user hasn't explicitly set a preference
94
+ useEffect(() => {
95
+ if (i18nRef.current && i18nRef.current.language !== locale) {
96
+ const hasUserPreference = typeof window !== "undefined" && Boolean(localStorage.getItem(FIRECMS_LOCALE_STORAGE_KEY));
97
+ if (!hasUserPreference) {
98
+ i18nRef.current.changeLanguage(locale);
99
+ }
100
+ }
101
+ }, [locale]);
102
+
103
+ // When consumer translations prop changes, update the resource bundles
104
+ useEffect(() => {
105
+ if (!i18nRef.current) return;
106
+ const resources = buildResources(translations);
107
+ for (const [lang, bundle] of Object.entries(resources)) {
108
+ i18nRef.current.addResourceBundle(
109
+ lang,
110
+ FIRECMS_NS,
111
+ bundle[FIRECMS_NS],
112
+ true, // deep merge
113
+ true // overwrite existing keys
114
+ );
115
+ }
116
+ }, [translations]);
117
+
118
+ if (!ready || !i18nRef.current) return null;
119
+
120
+ return (
121
+ <I18nextProvider i18n={i18nRef.current}>
122
+ {children}
123
+ </I18nextProvider>
124
+ );
125
+ }
126
+
127
+ /**
128
+ * Build an i18next resources object from the English baseline plus any
129
+ * consumer-provided overrides.
130
+ */
131
+ function buildResources(
132
+ translations?: { [locale: string]: DeepPartial<FireCMSTranslations> }
133
+ ): Record<string, Record<string, object>> {
134
+ const resources: Record<string, Record<string, object>> = {
135
+ en: { [FIRECMS_NS]: { ...en } },
136
+ es: { [FIRECMS_NS]: { ...es } },
137
+ de: { [FIRECMS_NS]: { ...de } },
138
+ fr: { [FIRECMS_NS]: { ...fr } },
139
+ it: { [FIRECMS_NS]: { ...it } },
140
+ hi: { [FIRECMS_NS]: { ...hi } },
141
+ pt: { [FIRECMS_NS]: { ...pt } },
142
+ };
143
+
144
+ if (!translations) return resources;
145
+
146
+ for (const [lang, overrides] of Object.entries(translations)) {
147
+ if (!resources[lang]) {
148
+ // For non-English/Spanish locales, start from English as the fallback base
149
+ resources[lang] = { [FIRECMS_NS]: { ...en } };
150
+ }
151
+ // Merge consumer overrides (shallow merge is enough since translations
152
+ // is a flat record — deepMerge option in addResourceBundle handles deeper)
153
+ resources[lang][FIRECMS_NS] = {
154
+ ...resources[lang][FIRECMS_NS],
155
+ ...overrides,
156
+ };
157
+ }
158
+
159
+ return resources;
160
+ }
package/src/index.ts CHANGED
@@ -7,3 +7,7 @@ export * from "./hooks";
7
7
  export * from "./components";
8
8
  export * from "./util";
9
9
  export * from "./contexts";
10
+ export * from "./i18n/FireCMSi18nProvider";
11
+ export * from "./locales/en";
12
+ export * from "./locales/es";
13
+ export * from "./editor";