@firecms/core 3.3.0 → 3.4.0-canary.00f9be5

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 (220) hide show
  1. package/README.md +4 -0
  2. package/dist/app/useApp.d.ts +1 -0
  3. package/dist/components/EntityCollectionTable/column_utils.d.ts +4 -3
  4. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +6 -1
  5. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +3 -1
  6. package/dist/components/EntityCollectionView/EntityCollectionBoardView.d.ts +3 -1
  7. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +8 -0
  8. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +3 -1
  9. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +3 -1
  10. package/dist/components/EntityCollectionView/FiltersDialog.d.ts +2 -1
  11. package/dist/components/EntityCollectionView/useBoardDataController.d.ts +3 -1
  12. package/dist/components/EntityPreview.d.ts +3 -1
  13. package/dist/components/ErrorBoundary.d.ts +1 -3
  14. package/dist/components/LicenseBanner.d.ts +23 -0
  15. package/dist/components/ReferenceTable/ReferenceSelectionTable.d.ts +10 -1
  16. package/dist/components/SelectableTable/filters/filter_text_input.d.ts +30 -0
  17. package/dist/components/SelectableTable/filters/filter_text_input.test.d.ts +1 -0
  18. package/dist/components/common/table_url_params.d.ts +24 -0
  19. package/dist/components/common/useDataSourceTableController.d.ts +9 -1
  20. package/dist/components/common/useTableSearchHelper.d.ts +9 -1
  21. package/dist/components/index.d.ts +1 -0
  22. package/dist/contexts/LicenseStatusContext.d.ts +16 -0
  23. package/dist/core/DefaultDrawer.d.ts +10 -3
  24. package/dist/core/EntityEditView.d.ts +9 -1
  25. package/dist/core/EntityEditViewFormActions.d.ts +1 -1
  26. package/dist/core/field_configs.d.ts +1 -1
  27. package/dist/core/index.d.ts +1 -0
  28. package/dist/core/plugin_translations.d.ts +38 -0
  29. package/dist/core/pro_plugins.d.ts +40 -0
  30. package/dist/de-BF5vcQPY.js +703 -0
  31. package/dist/de-BF5vcQPY.js.map +1 -0
  32. package/dist/editor/extensions/Image.d.ts +11 -0
  33. package/dist/editor/index.d.ts +2 -1
  34. package/dist/editor/lazy_editor.d.ts +6 -0
  35. package/dist/editor-BSo_aS1I.js +4563 -0
  36. package/dist/editor-BSo_aS1I.js.map +1 -0
  37. package/dist/form/EntityForm.d.ts +8 -1
  38. package/dist/form/EntityFormActions.d.ts +2 -0
  39. package/dist/form/field_bindings/GeopointFieldBinding.d.ts +5 -0
  40. package/dist/form/index.d.ts +1 -0
  41. package/dist/fr-DH9_wyFI.js +703 -0
  42. package/dist/fr-DH9_wyFI.js.map +1 -0
  43. package/dist/hi-BM8dm1Lu.js +703 -0
  44. package/dist/hi-BM8dm1Lu.js.map +1 -0
  45. package/dist/hooks/data/delete.d.ts +1 -1
  46. package/dist/hooks/data/save.d.ts +1 -1
  47. package/dist/hooks/data/useCollectionFetch.d.ts +7 -1
  48. package/dist/hooks/data/useEntityFetch.d.ts +9 -1
  49. package/dist/hooks/index.d.ts +2 -0
  50. package/dist/hooks/useLicenseStatus.d.ts +16 -0
  51. package/dist/hooks/useProjectLog.d.ts +11 -6
  52. package/dist/hooks/useTranslation.d.ts +1 -1
  53. package/dist/i18n/__tests__/FireCMSi18nProvider.test.d.ts +1 -0
  54. package/dist/i18n/__tests__/nested_provider_lifecycle.test.d.ts +1 -0
  55. package/dist/index.es.js +4516 -10668
  56. package/dist/index.es.js.map +1 -1
  57. package/dist/index.umd.js +9403 -6774
  58. package/dist/index.umd.js.map +1 -1
  59. package/dist/it-D3K1gfe4.js +703 -0
  60. package/dist/it-D3K1gfe4.js.map +1 -0
  61. package/dist/locales/pl.d.ts +2 -0
  62. package/dist/pl-CP1zeLzn.js +705 -0
  63. package/dist/pl-CP1zeLzn.js.map +1 -0
  64. package/dist/preview/index.d.ts +1 -0
  65. package/dist/preview/property_previews/GeopointPropertyPreview.d.ts +4 -0
  66. package/dist/pt-Cus7eKQR.js +705 -0
  67. package/dist/pt-Cus7eKQR.js.map +1 -0
  68. package/dist/types/analytics.d.ts +1 -1
  69. package/dist/types/collections.d.ts +31 -0
  70. package/dist/types/datasource.d.ts +67 -4
  71. package/dist/types/entities.d.ts +21 -1
  72. package/dist/types/entity_actions.d.ts +6 -0
  73. package/dist/types/entity_callbacks.d.ts +21 -0
  74. package/dist/types/firecms.d.ts +18 -1
  75. package/dist/types/firecms_context.d.ts +8 -0
  76. package/dist/types/index.d.ts +1 -0
  77. package/dist/types/license.d.ts +55 -0
  78. package/dist/types/navigation.d.ts +34 -5
  79. package/dist/types/plugins.d.ts +22 -1
  80. package/dist/types/properties.d.ts +17 -1
  81. package/dist/types/side_entity_controller.d.ts +7 -0
  82. package/dist/types/translations.d.ts +43 -2
  83. package/dist/util/__tests__/collections.test.d.ts +1 -0
  84. package/dist/util/__tests__/urls.test.d.ts +1 -0
  85. package/dist/util/collections.d.ts +1 -1
  86. package/dist/util/date_fns_locales.d.ts +18 -0
  87. package/dist/util/entities.d.ts +1 -0
  88. package/dist/util/entity_cache.d.ts +11 -0
  89. package/dist/util/geopoint.d.ts +22 -0
  90. package/dist/util/index.d.ts +3 -0
  91. package/dist/util/lazy_eager.d.ts +3 -3
  92. package/dist/util/navigation_blocking.d.ts +22 -0
  93. package/dist/util/navigation_from_path.d.ts +17 -0
  94. package/dist/util/navigation_utils.d.ts +107 -3
  95. package/dist/util/parent_references_from_path.d.ts +16 -0
  96. package/dist/util/paths.d.ts +28 -0
  97. package/dist/util/permissions.d.ts +10 -4
  98. package/dist/util/urls.d.ts +22 -0
  99. package/package.json +17 -11
  100. package/src/app/Scaffold.tsx +41 -44
  101. package/src/app/useApp.tsx +1 -0
  102. package/src/components/DeleteEntityDialog.tsx +2 -0
  103. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +2 -2
  104. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +3 -1
  105. package/src/components/EntityCollectionTable/column_utils.tsx +11 -19
  106. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +1 -1
  107. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +7 -0
  108. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +5 -1
  109. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +12 -0
  110. package/src/components/EntityCollectionView/EntityCollectionView.tsx +66 -15
  111. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +6 -2
  112. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +8 -1
  113. package/src/components/EntityCollectionView/FiltersDialog.tsx +39 -28
  114. package/src/components/EntityCollectionView/useBoardDataController.tsx +17 -1
  115. package/src/components/EntityPreview.tsx +45 -41
  116. package/src/components/ErrorBoundary.tsx +12 -18
  117. package/src/components/LicenseBanner.tsx +207 -0
  118. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +19 -2
  119. package/src/components/ReferenceWidget.tsx +1 -1
  120. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +2 -2
  121. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +33 -7
  122. package/src/components/SelectableTable/filters/filter_text_input.test.ts +184 -0
  123. package/src/components/SelectableTable/filters/filter_text_input.ts +71 -0
  124. package/src/components/VirtualTable/VirtualTable.tsx +19 -8
  125. package/src/components/common/default_entity_actions.tsx +22 -2
  126. package/src/components/common/table_url_params.ts +172 -0
  127. package/src/components/common/useDataSourceTableController.tsx +126 -163
  128. package/src/components/common/useTableSearchHelper.ts +26 -2
  129. package/src/components/index.tsx +1 -0
  130. package/src/contexts/LicenseStatusContext.tsx +50 -0
  131. package/src/contexts/SnackbarProvider.tsx +14 -1
  132. package/src/core/DefaultAppBar.tsx +28 -16
  133. package/src/core/DefaultDrawer.tsx +150 -64
  134. package/src/core/DrawerNavigationGroup.tsx +27 -29
  135. package/src/core/DrawerNavigationItem.tsx +10 -12
  136. package/src/core/EntityEditView.tsx +77 -35
  137. package/src/core/EntityEditViewFormActions.tsx +3 -2
  138. package/src/core/EntitySidePanel.tsx +8 -4
  139. package/src/core/FireCMS.tsx +73 -47
  140. package/src/core/SideDialogs.tsx +44 -1
  141. package/src/core/field_configs.tsx +15 -0
  142. package/src/core/index.tsx +1 -0
  143. package/src/core/plugin_translations.ts +87 -0
  144. package/src/core/pro_plugins.ts +79 -0
  145. package/src/editor/components/SlashCommandMenu.tsx +4 -1
  146. package/src/editor/extensions/Image.ts +17 -1
  147. package/src/editor/hooks/useProseMirror.ts +5 -0
  148. package/src/editor/index.ts +11 -1
  149. package/src/editor/lazy_editor.tsx +33 -0
  150. package/src/form/EntityForm.tsx +31 -10
  151. package/src/form/EntityFormActions.tsx +2 -0
  152. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +1 -1
  153. package/src/form/field_bindings/GeopointFieldBinding.tsx +139 -0
  154. package/src/form/index.tsx +1 -0
  155. package/src/hooks/data/delete.ts +8 -0
  156. package/src/hooks/data/save.ts +6 -1
  157. package/src/hooks/data/useCollectionFetch.tsx +21 -1
  158. package/src/hooks/data/useEntityFetch.tsx +35 -4
  159. package/src/hooks/index.tsx +2 -0
  160. package/src/hooks/useBuildNavigationController.tsx +70 -15
  161. package/src/hooks/useFireCMSContext.tsx +7 -3
  162. package/src/hooks/useLicenseStatus.tsx +32 -0
  163. package/src/hooks/useProjectLog.tsx +27 -9
  164. package/src/hooks/useResolvedNavigationFrom.tsx +3 -1
  165. package/src/hooks/useTranslation.ts +3 -1
  166. package/src/hooks/useValidateAuthenticator.tsx +4 -0
  167. package/src/i18n/FireCMSi18nProvider.tsx +199 -23
  168. package/src/i18n/__tests__/FireCMSi18nProvider.test.tsx +91 -0
  169. package/src/i18n/__tests__/nested_provider_lifecycle.test.tsx +67 -0
  170. package/src/internal/useBuildDataSource.ts +37 -15
  171. package/src/internal/useBuildSideEntityController.tsx +20 -5
  172. package/src/locales/de.ts +26 -4
  173. package/src/locales/en.ts +30 -6
  174. package/src/locales/es.ts +26 -4
  175. package/src/locales/fr.ts +26 -4
  176. package/src/locales/hi.ts +26 -4
  177. package/src/locales/it.ts +26 -4
  178. package/src/locales/pl.ts +752 -0
  179. package/src/locales/pt.ts +26 -4
  180. package/src/preview/PropertyPreview.tsx +12 -0
  181. package/src/preview/components/DatePreview.tsx +2 -4
  182. package/src/preview/components/ReferencePreview.tsx +7 -3
  183. package/src/preview/components/StorageThumbnail.tsx +24 -2
  184. package/src/preview/index.ts +1 -0
  185. package/src/preview/property_previews/GeopointPropertyPreview.tsx +23 -0
  186. package/src/routes/FireCMSRoute.tsx +54 -27
  187. package/src/types/analytics.ts +3 -0
  188. package/src/types/collections.ts +34 -0
  189. package/src/types/datasource.ts +67 -4
  190. package/src/types/entities.ts +24 -1
  191. package/src/types/entity_actions.tsx +6 -0
  192. package/src/types/entity_callbacks.ts +24 -0
  193. package/src/types/firecms.tsx +19 -1
  194. package/src/types/firecms_context.tsx +9 -0
  195. package/src/types/index.ts +1 -0
  196. package/src/types/license.ts +63 -0
  197. package/src/types/navigation.ts +35 -5
  198. package/src/types/plugins.tsx +23 -1
  199. package/src/types/properties.ts +17 -0
  200. package/src/types/side_entity_controller.tsx +7 -0
  201. package/src/types/translations.ts +43 -2
  202. package/src/util/__tests__/collections.test.ts +32 -0
  203. package/src/util/__tests__/urls.test.ts +131 -0
  204. package/src/util/collections.ts +1 -1
  205. package/src/util/date_fns_locales.ts +168 -0
  206. package/src/util/entities.ts +16 -1
  207. package/src/util/entity_cache.ts +18 -0
  208. package/src/util/geopoint.ts +81 -0
  209. package/src/util/index.ts +3 -0
  210. package/src/util/lazy_eager.tsx +30 -8
  211. package/src/util/navigation_blocking.ts +45 -0
  212. package/src/util/navigation_from_path.ts +47 -7
  213. package/src/util/navigation_utils.ts +250 -5
  214. package/src/util/parent_references_from_path.ts +45 -4
  215. package/src/util/paths.ts +40 -3
  216. package/src/util/permissions.ts +22 -10
  217. package/src/util/previews.ts +8 -1
  218. package/src/util/resolutions.ts +8 -0
  219. package/src/util/urls.ts +52 -0
  220. package/src/util/useStorageUploadController.tsx +6 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pt-Cus7eKQR.js","sources":["../src/locales/pt.ts"],"sourcesContent":["import { FireCMSTranslations } from \"../types/translations\";\n\n/**\n * Portuguese (pt) translations for @firecms/core.\n *\n * @group Core\n */\nexport const pt: FireCMSTranslations = {\n // ─── Form actions ────────────────────────────────────────────\n save: \"Guardar\",\n create: \"Criar\",\n create_copy: \"Criar cópia\",\n save_and_close: \"Guardar e fechar\",\n create_copy_and_close: \"Criar cópia e fechar\",\n create_and_close: \"Criar e fechar\",\n discard: \"Descartar\",\n clear: \"Limpar\",\n cancel: \"Cancelar\",\n\n // ─── Entity actions ──────────────────────────────────────────\n edit: \"Editar\",\n copy: \"Copiar\",\n delete: \"Eliminar\",\n\n // ─── Delete dialog ───────────────────────────────────────────\n delete_confirmation_title: \"Eliminar?\",\n delete_confirmation_body: \"Esta ação eliminará a entidade. Tem a certeza?\",\n delete_multiple_confirmation_body: \"Esta ação eliminará as entidades selecionadas. Tem a certeza?\",\n\n // ─── Unsaved-changes dialog ───────────────────────────────────\n unsaved_changes_title: \"Alterações não guardadas\",\n unsaved_changes_body: \"Tem alterações não guardadas. Deseja descartá-las?\",\n discard_changes: \"Descartar alterações\",\n keep_editing: \"Continuar a editar\",\n\n // ─── Collection table / toolbar ──────────────────────────────\n search: \"Pesquisar\",\n find_by_id: \"Encontrar por ID\",\n find_entity_by_id: \"Encontrar entidade por ID\",\n filter: \"Filtrar\",\n filters: \"Filtros\",\n clear_filter: \"Limpar filtro\",\n clear_filter_sort: \"Limpar filtro/ordenação\",\n clear_sort: \"Limpar ordenação\",\n no_items: \"Sem itens\",\n no_entries_found: \"Nenhum registo encontrado\",\n all_entries_loaded: \"Todos os {{count}} registos carregados\",\n create_your_first_entry: \"Crie o seu primeiro registo\",\n no_results_filter_sort: \"Sem resultados com o filtro/ordenação aplicado\",\n add: \"Adicionar\",\n remove: \"Remover\",\n multiple_entities: \"Múltiplas entidades\",\n unsaved_changes: \"Tem alterações não guardadas em {{collectionName}}.\",\n so_empty: \"Tão vazio...\",\n no_results: \"Sem resultados com o filtro/ordenação aplicado\",\n refresh_data: \"Atualizar dados\",\n dark_mode: \"Escuro\",\n light_mode: \"Claro\",\n system_mode: \"Sistema\",\n ok: \"Ok\",\n save_collection_config: \"Guardar estrutura da coleção\",\n search_for_more_icons: \"Pesquisar mais ícones…\",\n ai_modified: \"Modificado por IA\",\n size_label: \"Tamanho\",\n group_by: \"Agrupar por\",\n initialize_kanban_order: \"Inicializar Ordem Kanban\",\n copy_id: \"Copiar ID\",\n add_specific: \"Adicionar {{name}}\",\n select_specific: \"Selecionar {{name}}\",\n select_from: \"Selecionar de {{name}}\",\n done: \"Concluído\",\n log_out: \"Terminar sessão\",\n license_trial_banner: \"Avaliação do FireCMS PRO: faltam {{days}} dias em produção.\",\n license_trial_banner_one: \"Avaliação do FireCMS PRO: falta {{days}} dia em produção.\",\n license_expired_banner: \"A sua avaliação PRO terminou a {{date}}. As funcionalidades PRO, como o editor de esquemas, a importação/exportação e o histórico, estão em pausa; os seus dados e coleções continuam a funcionar.\",\n license_expired_banner_undated: \"A sua avaliação PRO terminou. As funcionalidades PRO, como o editor de esquemas, a importação/exportação e o histórico, estão em pausa; os seus dados e coleções continuam a funcionar.\",\n license_invalid_project_banner: \"Esta chave de licença não está associada ao projeto {{projectId}}. As funcionalidades PRO ficam em pausa até que esteja.\",\n license_invalid_project_banner_unnamed: \"Esta chave de licença não está associada a este projeto. As funcionalidades PRO ficam em pausa até que esteja.\",\n license_over_quota_banner: \"A licença deste projeto cobre {{licensed}} projetos em produção e este não é um deles. As funcionalidades PRO, como o editor de esquemas, a importação/exportação e o histórico, estão em pausa; os seus dados e coleções continuam a funcionar.\",\n license_over_quota_banner_one: \"A licença deste projeto cobre {{licensed}} projeto em produção e é outro. As funcionalidades PRO, como o editor de esquemas, a importação/exportação e o histórico, estão em pausa; os seus dados e coleções continuam a funcionar.\",\n license_get_license: \"Obter uma licença\",\n license_update_license: \"Atualizar a sua licença\",\n license_add_project_to_license: \"Adicioná-lo à sua licença\",\n pro_features_paused: \"Funcionalidades PRO em pausa\",\n user_management_paused_description: \"A gestão de utilizadores e funções faz parte do FireCMS PRO. Os seus utilizadores e funções atuais continuam a decidir quem pode iniciar sessão e o que pode fazer, e poderá voltar a editá-los assim que este projeto tiver uma licença.\",\n column_cannot_be_edited: \"Esta coluna não pode ser editada diretamente\",\n close: \"Fechar\",\n unsaved_local_changes: \"Alterações locais não guardadas\",\n unsaved_local_changes_description: \"Este documento foi editado localmente e tem alterações não guardadas. Estas alterações locais serão perdidas se não as aplicar.\",\n preview_changes: \"Pré-visualizar alterações\",\n apply_changes: \"Aplicar alterações\",\n discard_local_changes: \"Descartar alterações locais\",\n preview_local_changes: \"Pré-visualizar alterações locais\",\n preview_local_changes_description: \"Estas são as alterações locais que serão aplicadas ao formulário.\",\n type: \"Tipo\",\n string: \"string\",\n number: \"número\",\n boolean: \"booleano\",\n date: \"data\",\n map: \"mapa\",\n array: \"lista\",\n arrays_of_arrays_not_supported: \"Listas de listas não são suportadas.\",\n data_type_not_supported: \"Tipo de dados {{dataType}} ainda não suportado\",\n passkey_error_unsupported: \"O seu dispositivo ou browser não suporta passkeys.\",\n\n admin: \"Administrador\",\n home: \"Início\",\n this_form_has_errors: \"Este formulário tem erros\",\n error_loading_navigation: \"Erro ao carregar navegação\",\n error_loading_auth: \"Erro ao carregar autenticação\",\n this_form_has_been_modified: \"Este formulário foi modificado\",\n current_form_in_sync: \"O formulário atual está sincronizado com a base de dados\",\n open_in_console: \"Abrir na consola\",\n collection_does_not_exist: \"A coleção especificada não existe. Verifique a consola\",\n unexpected_value: \"Valor inesperado\",\n unexpected_value_click_to_edit: \"Valor inesperado. Clique para editar\",\n unexpected_reference_value: \"Valor de referência inesperado. Clique para editar\",\n copy_url_to_clipboard: \"Copiar URL para a área de transferência\",\n open_image_in_new_tab: \"Abrir imagem numa nova aba\",\n reference_not_set: \"Referência não definida\",\n reference_does_not_exist: \"A referência não existe\",\n entity_not_found: \"Entidade não encontrada\",\n file_not_found: \"Ficheiro não encontrado\",\n unsaved_changes_in_entity: \"Tem alterações não guardadas nesta entidade.\",\n delete_this_role: \"Eliminar esta função\",\n no_roles_yet: \"Ainda não tem nenhuma função.\",\n create_default_roles: \"Criar funções predefinidas\",\n delete_role_confirmation: \"Tem a certeza de que quer eliminar esta função?\",\n delete_this_user: \"Eliminar este utilizador\",\n no_users_yet: \"Ainda não existem utilizadores\",\n add_logged_user_as_admin: \"Adicionar o utilizador com sessão iniciada como administrador\",\n add_current_user_as_admin: \"Adicionar utilizador atual como administrador\",\n create_default_roles_and_add_admin: \"Criar funções predefinidas e adicionar utilizador atual como administrador\",\n delete_user_confirmation: \"Tem a certeza de que quer eliminar este utilizador?\",\n create_your_users_and_roles: \"Crie os seus utilizadores e funções\",\n no_users_or_roles_defined: \"Não tem utilizadores ou funções definidas. Pode criar funções predefinidas e adicionar o utilizador atual como administrador.\",\n save_before_changing_schema: \"Precisa de guardar o documento antes de alterar o esquema\",\n edit_schema_for_this_form: \"Editar esquema para este formulário\",\n no_permissions_to_edit_collection: \"Não tem permissões para editar esta coleção\",\n browser_does_not_support_audio: \"O seu browser não suporta o elemento de áudio.\",\n user_not_found: \"Utilizador não encontrado: {{value}}\",\n\n // ─── Collection view actions ──────────────────────────────────\n delete_selected: \"Eliminar\",\n cannot_delete_selected: \"Selecionou pelo menos uma entidade que não pode eliminar\",\n\n // ─── Array / field containers ─────────────────────────────────\n add_entry: \"Adicionar\",\n add_on_top: \"Adicionar no topo\",\n add_below: \"Adicionar abaixo\",\n add_to_field: \"Adicionar a {{fieldName}}\",\n value: \"Valor\",\n key: \"Chave\",\n drag_drop_multiple: \"Arraste e solte ficheiros aqui, ou clique para selecionar. Arraste para reordenar.\",\n drag_drop_single: \"Arraste e solte um ficheiro aqui, ou clique para selecionar um\",\n\n // ─── Navigation / scaffold ────────────────────────────────────\n open_menu: \"Abrir menu\",\n close_drawer: \"Fechar painel lateral\",\n navigation_drawer: \"Painel lateral de navegação\",\n\n // ─── Error states ─────────────────────────────────────────────\n error: \"Erro\",\n error_uploading_file: \"Erro ao carregar ficheiro\",\n error_deleting: \"Erro ao eliminar: {{message}}\",\n error_before_delete: \"Erro antes de eliminar: {{message}}\",\n error_updating_asset: \"Erro ao atualizar recurso\",\n error_deleting_asset: \"Erro ao eliminar recurso\",\n error_firestore_index: \"É necessário um índice Firestore para esta consulta.\",\n create_index: \"Criar índice\",\n value_is_not_reference: \"O valor não é uma referência.\",\n click_to_edit: \"Clique para editar\",\n data_is_not_array_of_references: \"Os dados não são uma lista de referências\",\n\n // ─── Misc ─────────────────────────────────────────────────────\n loading: \"A carregar\",\n local_changes_applied: \"Alterações locais aplicadas ao formulário\",\n local_changes_discarded: \"Alterações locais descartadas\",\n are_you_sure_leave: \"Tem a certeza de que quer sair desta página?\",\n see_console_details: \"Consulte a consola para mais detalhes.\",\n drop_here_create_group: \"Solte aqui para criar um novo grupo\",\n filter_for_null_values: \"Filtrar valores nulos\",\n value_updated_elsewhere: \"Este valor foi atualizado noutro local\",\n add_property: \"Adicionar propriedade\",\n edit_name: \"Editar {{name}}\",\n this_entity_not_exist: \"Esta entidade não existe na base de dados\",\n internal_error: \"ERRO interno\",\n\n // ─── Rename group dialog ──────────────────────────────────────\n rename_group: \"Renomear Grupo\",\n group_name_label: \"Nome do Grupo\",\n group_name_empty_error: \"O nome do grupo não pode estar vazio.\",\n group_name_exists_error: \"Este nome de grupo já existe.\",\n\n // ─── Search ───────────────────────────────────────────────────\n search_collections: \"Pesquisar coleções\",\n\n // ─── Navigation groups ────────────────────────────────────────\n views_group: \"Visualizações\",\n\n // ─── Entity Edit View ─────────────────────────────────────────\n youd_need_to_save_before_additional_collections: \"Precisa de guardar a sua entidade antes de adicionar coleções adicionais\",\n\n // ─── Not Found Page ───────────────────────────────────────────\n page_not_found: \"Página não encontrada\",\n page_not_found_body: \"Esta página não existe ou pode não ter acesso a ela\",\n back_to_home: \"Voltar ao início\",\n\n // ─── Collection Editor ─────────────────────────────────────────\n default_collection_view: \"Vista de coleção predefinida\",\n table_view: \"Tabela\",\n cards_view: \"Cartões\",\n kanban_view: \"Kanban\",\n choose_how_entities_displayed_default: \"Escolha como as entidades devem ser exibidas por padrão\",\n\n document_view: \"Vista de documento\",\n side_panel: \"Painel lateral\",\n full_screen: \"Ecrã inteiro\",\n should_documents_opened_full_screen: \"Os documentos devem ser abertos em ecrã inteiro ou num painel lateral inline\",\n\n select_custom_view: \"Selecionar vista personalizada\",\n no_custom_views_defined: \"Nenhuma vista personalizada definida. Defina as suas vistas personalizadas nas definições de personalização, antes de usar este diálogo.\",\n\n select_custom_action: \"Selecionar ação personalizada\",\n no_custom_actions_defined: \"Nenhuma ação personalizada definida. Defina as suas ações personalizadas nas definições de personalização, antes de usar este diálogo.\",\n\n no_collections_found: \"Nenhuma coleção encontrada\",\n start_building_collections: \"Comece a criar coleções no FireCMS facilmente. Mapeie-as aos dados existentes na sua base de dados, importe de ficheiros ou use os nossos modelos.\",\n create_first_collection: \"Crie a sua primeira coleção\",\n define_collections_programmatically: \"Também pode definir coleções programaticamente.\",\n edit_collection: \"Editar coleção\",\n no_permissions_edit_collection: \"Não tem permissões para editar esta coleção\",\n no_permissions_create_collection: \"Não tem permissões para criar coleções\",\n create_collection: \"Criar coleção\",\n update_collection: \"Atualizar coleção\",\n\n new_collection: \"Nova coleção\",\n add_new_collection: \"Adicionar nova coleção\",\n collection_with_name: \"Coleção {{name}}\",\n change_icon: \"Alterar ícone\",\n is_subcollection_of: \"Esta é uma subcoleção de\",\n name: \"Nome\",\n collection_name_description: \"Nome desta coleção, normalmente um nome no plural (ex. Produtos)\",\n path: \"Caminho\",\n relative_path_to_parent: \"Caminho relativo ao pai (não é necessário incluir o caminho do pai)\",\n path_in_database: \"Caminho em que esta coleção está armazenada na base de dados\",\n singular_name: \"Nome singular\",\n singular_name_description: \"Opcionalmente defina um nome singular para as suas entidades\",\n description: \"Descrição\",\n description_of_collection: \"Descrição da coleção, pode usar markdown\",\n collection_id: \"ID da coleção\",\n collection_id_description: \"Este ID identifica esta coleção. Normalmente igual ao caminho.\",\n collection_group: \"Grupo de coleções\",\n collection_group_description: \"Um grupo de coleções consiste em todas as coleções com o mesmo caminho. Isto permite consultar várias coleções ao mesmo tempo.\",\n advanced_settings: \"Definições avançadas\",\n doc_history_global: \"Revisões do histórico do documento ativadas se ativadas globalmente\",\n doc_history_enabled: \"Revisões do histórico do documento ATIVADAS\",\n doc_history_not_enabled: \"Revisões do histórico do documento NÃO ativadas\",\n doc_history_description: \"Quando ativado, cada documento nesta coleção terá um histórico de alterações. Útil para fins de auditoria. Os dados são armazenados numa subcoleção do documento na sua base de dados, chamada __history.\",\n document_id_generation: \"Geração de IDs de documentos\",\n code_defined: \"Definido por código\",\n users_must_define_id: \"Os utilizadores devem definir um ID\",\n users_can_define_id: \"Os utilizadores podem definir um ID, mas não é obrigatório\",\n doc_id_auto_generated: \"O ID do documento é gerado automaticamente\",\n config_doc_id_generation: \"Configure como os IDs de documentos são gerados ao criar novas entidades.\",\n enable_text_search: \"Ativar pesquisa de texto para esta coleção\",\n text_search_description: \"Permitir pesquisa de texto para esta coleção. Se não especificou um delegado de pesquisa de texto, será usada a pesquisa de texto local integrada. Não recomendado para grandes coleções, pois pode causar problemas de desempenho e custo.\",\n database_id: \"ID da base de dados\",\n default_text: \"(predefinição)\",\n\n custom_actions: \"Ações personalizadas\",\n more_info: \"Mais informações\",\n define_custom_actions_cli: \"Defina as suas próprias ações personalizadas carregando-as com o CLI.\",\n action_defined_in_code: \"Esta ação está definida em código com a chave\",\n add_custom_entity_action: \"Adicionar ação de entidade personalizada\",\n remove_this_action: \"Remover esta ação?\",\n remove_action_warning: \"Isto não eliminará nenhum dado, apenas a ação no CMS\",\n\n subcollections_of: \"Subcoleções de\",\n add_subcollection: \"Adicionar subcoleção\",\n custom_views: \"Vistas personalizadas\",\n define_custom_views_cli: \"Defina as suas próprias vistas personalizadas carregando-as com o CLI.\",\n view_defined_in_code: \"Esta vista está definida em código com a chave\",\n add_custom_entity_view: \"Adicionar vista de entidade personalizada\",\n delete_this_subcollection: \"Eliminar esta subcoleção?\",\n remove_collection_warning: \"Isto não eliminará nenhum dado, apenas a coleção no CMS\",\n remove_this_view: \"Remover esta vista?\",\n remove_view_warning: \"Isto não eliminará nenhum dado, apenas a vista no CMS\",\n\n no_collection_selected: \"Nenhuma coleção selecionada\",\n code_for_collection: \"Código para\",\n use_config_define_json: \"Use esta configuração para definir a coleção em formato JSON.\",\n customise_collection_code: \"Se quiser personalizar a coleção em código, pode adicionar este código de coleção à configuração da sua aplicação CMS.\",\n copied: \"Copiado\",\n\n property_cant_be_edited: \"Esta propriedade não pode ser editada\",\n property_not_editable_description: \"Pode não ter permissão para editá-la ou está definida em código com o sinalizador editável definido como falso.\",\n delete_this_property: \"Eliminar esta propriedade?\",\n delete_property_warning: \"Isto não eliminará nenhum dado, apenas modificará a coleção.\",\n error_must_specify_id: \"Deve especificar um id para o campo\",\n error_id_format: \"O id só pode conter letras, números e underscores (_), e não pode começar com um número\",\n error_id_already_exists: \"Já existe outro campo com este ID\",\n error_must_specify_title: \"Deve especificar um título para o campo\",\n custom_or_other: \"Personalizado/Outro\",\n select_property_widget: \"Selecionar um widget de propriedade\",\n error_changing_data_type: \"Este widget usa um tipo de dados diferente do widget inicialmente selecionado. Isto pode causar erros com dados existentes.\",\n required: \"Obrigatório\",\n\n enum_form_dialog: \"Diálogo de formulário enum\",\n imported_data_preview: \"Pré-visualização de dados importados\",\n entities_with_same_id_overwritten: \"Entidades com o mesmo id serão substituídas\",\n collection_editor: \"Editor de coleção\",\n properties_in_this_group: \"Propriedades neste grupo\",\n data_property_mapping: \"Mapeamento de propriedade de dados\",\n property_edit_view: \"Vista de edição de propriedade\",\n all_of_these: \"Todos estes\",\n any_of_these: \"Qualquer um destes\",\n\n only_admins_edit_roles: \"Apenas administradores podem editar funções\",\n error_user_not_found: \"Utilizador não encontrado\",\n role: \"Função\",\n name_of_this_role: \"Nome desta função\",\n id_of_this_role: \"ID desta função\",\n create_entities: \"Criar entidades\",\n read_entities: \"Ler entidades\",\n update_entities: \"Atualizar entidades\",\n delete_entities: \"Eliminar entidades\",\n all_collections: \"Todas as coleções\",\n create_entities_in_collections: \"Criar entidades em coleções\",\n access_all_data_in_every_collection: \"Aceder a todos os dados em todas as coleções\",\n update_data_in_any_collection: \"Atualizar dados em qualquer coleção\",\n delete_data_in_any_collection: \"Eliminar dados em qualquer coleção\",\n allow_all_permissions_in_this_collections: \"Permitir todas as permissões nestas coleções\",\n all: \"Todos\",\n customise_permissions_description: \"Pode personalizar as permissões que os utilizadores relacionados com esta função podem realizar nas entidades de cada coleção\",\n create_collections: \"Criar coleções\",\n yes: \"Sim\",\n no: \"Não\",\n can_user_create_collections: \"O utilizador pode criar coleções\",\n edit_collections: \"Editar coleções\",\n only_own_collections: \"Apenas as suas próprias\",\n own: \"Próprias\",\n can_user_edit_collections: \"O utilizador pode editar coleções\",\n delete_collections: \"Eliminar coleções\",\n can_user_delete_collections: \"O utilizador pode eliminar coleções\",\n error_saving_role: \"Ocorreu um erro ao guardar esta função\",\n create_role: \"Criar função\",\n update: \"Atualizar\",\n\n only_admins_change_roles: \"Apenas administradores podem alterar funções\",\n must_be_at_least_one_admin: \"Deve existir pelo menos um administrador\",\n logged_user_not_found: \"Utilizador com sessão iniciada não encontrado\",\n user: \"Utilizador\",\n user_id: \"ID do utilizador\",\n name_of_this_user: \"Nome deste utilizador\",\n email_of_this_user: \"Email deste utilizador\",\n roles: \"Funções\",\n create_user: \"Criar utilizador\",\n\n users: \"Utilizadores\",\n add_user: \"Adicionar utilizador\",\n add_role: \"Adicionar função\",\n is_admin: \"É Administrador\",\n default_permissions: \"Permissões predefinidas\",\n created_on: \"Criado em\",\n email: \"Email\",\n id: \"ID\",\n read: \"Ler\",\n\n column_in_file: \"Coluna no ficheiro\",\n map_to_property: \"Mapear para propriedade\",\n default_values: \"Valores predefinidos\",\n default_values_description: \"Pode selecionar um valor predefinido para colunas não mapeadas e valores vazios:\",\n property: \"Propriedade\",\n default_value: \"Valor predefinido\",\n autogenerate_id: \"Gerar ID automaticamente\",\n id_column_description: \"Coluna que será usada como ID para cada documento\",\n do_not_set_value: \"Não definir valor\",\n set_value_to_true: \"Definir valor como verdadeiro\",\n set_value_to_false: \"Definir valor como falso\",\n drag_and_drop_file: \"Arraste e solte um ficheiro aqui ou clique para carregar\",\n error_saving_data: \"Erro ao guardar dados\",\n retry: \"Tentar novamente\",\n saving_data: \"A guardar dados\",\n entities_saved: \"entidades guardadas\",\n do_not_close_tab: \"Não feche este separador ou a importação será interrompida\",\n import: \"Importar\",\n import_data: \"Importar dados\",\n upload_file_description: \"Carregue um ficheiro CSV, Excel ou JSON e mapeie-o para o esquema existente\",\n back: \"Voltar\",\n next: \"Seguinte\",\n save_data: \"Guardar dados\",\n use_column_as_id: \"Usar esta coluna como ID\",\n do_not_import_property: \"Não importar esta propriedade\",\n entities_will_be_overwritten: \"Entidades com o mesmo id serão substituídas\",\n data_imported_successfully: \"Dados importados com sucesso\",\n export: \"Exportar\",\n export_data: \"Exportar dados\",\n download_table_csv: \"Descarregar o conteúdo desta tabela como CSV\",\n csv: \"CSV\",\n json: \"JSON\",\n dates_as_timestamps: \"Datas como timestamps\",\n dates_as_strings: \"Datas como strings\",\n flatten_arrays: \"Achatar listas\",\n download: \"Descarregar\",\n large_number_of_documents: \"Esta coleção tem um grande número de documentos ({{count}}).\",\n include_undefined_values: \"Incluir valores indefinidos\",\n export_apply_filter_sort: \"Exportar apenas os resultados que correspondem ao filtro/ordenação atual\",\n export_all_entities: \"Todas as entidades\",\n export_selected_entities: \"Entidades selecionadas ({{count}})\",\n export_error: \"Não foi possível exportar os dados: {{message}}\",\n submit: \"Submeter\",\n\n no_filterable_properties: \"Não há propriedades filtráveis disponíveis\",\n apply_filters: \"Aplicar filtros\",\n list: \"Lista\",\n cards: \"Cartões\",\n board: \"Quadro\",\n initialize_kanban_order_desc: \"Isto atribuirá valores de ordem sequenciais a todos os itens que não tenham um. Os itens manterão a sua ordem atual dentro de cada coluna.\",\n kanban_view_not_available: \"A vista Kanban não está disponível\",\n kanban_view_requires_enum: \"A vista Kanban requer uma propriedade de string com valores enum para agrupar entidades em colunas. Adicione uma propriedade enum ao esquema da sua coleção para usar esta vista.\",\n no_enum_values_configured: 'Nenhum valor enum configurado para a propriedade \"{{property}}\"',\n items_need_backfill: \"Alguns itens não têm valores de ordem. Inicialize para ativar a reordenação por arrastar e soltar.\",\n initialize: \"Inicializar\",\n confirm_multiple_delete: \"Confirmar eliminação múltipla?\",\n delete_entity_confirm_title: \"Deseja eliminar este/a {{entityName}}?\",\n\n /** AI Collection Generator Popover */\n generate_collection_with_ai: \"Gerar Coleção com IA\",\n modify_collection_with_ai: \"Modificar Coleção com IA\",\n describe_collection_to_create: \"Descreva a coleção que quer criar.\",\n describe_changes_to_make: \"Descreva as alterações que quer fazer a esta coleção.\",\n ai_placeholder_create: \"ex.: Criar uma coleção de produtos com nome, preço, descrição e categoria...\",\n ai_placeholder_modify: \"ex.: Adicionar um campo de imagem miniatura com armazenamento, tornar o preço obrigatório...\",\n ai_assist: \"Assistente IA\",\n generating: \"A gerar...\",\n\n /** Recently extracted strings for collection editor */\n this_is_subcollection_of: \"Esta é uma subcoleção de\",\n use_existing_paths_database: \"Use um dos caminhos existentes na sua base de dados:\",\n describe_collection_ai: \"Descreva a sua coleção à IA:\",\n generate_with_ai: \"Gerar com IA\",\n create_from_json_config: \"Criar a partir de configuração JSON:\",\n paste_json_config: \"Colar Configuração JSON\",\n create_collection_from_file_formats: \"Criar uma coleção a partir de um ficheiro (csv, json, xls, xslx...)\",\n select_template: \"Selecionar um modelo:\",\n products: \"Produtos\",\n collection_products_subtitle: \"Uma coleção de produtos com imagens, preços e stock\",\n collection_users_subtitle: \"Uma coleção de utilizadores com emails, nomes e funções\",\n blog_posts: \"Publicações de blog\",\n collection_blog_posts_subtitle: \"Uma coleção de publicações de blog com imagens, autores e conteúdo complexo\",\n pages: \"Páginas\",\n collection_pages_subtitle: \"Uma coleção de páginas com imagens, autores e conteúdo complexo\",\n continue_from_scratch: \"Continuar do zero\",\n\n /** Admin views config */\n cms_users: \"Utilizadores do CMS\",\n roles_menu: \"Funções\",\n project_settings: \"Definições do projeto\",\n firestore_manager: \"Gerenciador do Firestore\",\n datatalk: \"DataTalk\",\n manage_your_firestore_data: \"Gerencie os seus dados do Firestore\",\n\n // ─── FireCMS Cloud Login ──────────────────────────────────────\n build_admin_panel_in_minutes: \"Construa o Seu Painel de Administração Firebase em Minutos\",\n go_live_instantly: \"Entre em produção instantaneamente:\",\n create_production_ready_back_offices: \"Crie back-offices prontos para produção\",\n without_the_frontend_hassle: \"sem o trabalho de frontend.\",\n automatic_setup: \"Configuração automática\",\n from_your_existing_firestore_data: \"a partir dos seus dados Firestore existentes.\",\n seamless_real_time_firebase_integration: \"Integração Firebase em tempo real sem falhas.\",\n intuitive_spreadsheet_like_ui: \"Interface intuitiva semelhante a uma folha de cálculo\",\n your_whole_team_can_use: \"que toda a sua equipa pode usar.\",\n focus_on_your_app: \"Foque-se na sua aplicação,\",\n not_the_admin_panel: \"não no painel de administração.\",\n join_our_newsletter: \"Subscreva a nossa newsletter. Sem spam, apenas atualizações importantes!\",\n by_signing_in_you_agree_to_our: \"Ao iniciar sessão, concorda com os nossos\",\n please_accept_the_terms_to_continue: \"Aceite os termos e condições para continuar\",\n terms_and_conditions: \"Termos e Condições\",\n and_our: \"e a nossa\",\n privacy_policy: \"Política de privacidade\",\n firecms_cloud_google_disclosure: \"O uso das APIs Google e a transferência de informações recebidas pela FireCMS Cloud para qualquer outra aplicação seguirá a\",\n google_api_services_user_data_policy: \"Política de Dados de Utilizador dos Serviços da API Google\",\n including_the_limited_use_requirements: \"incluindo os requisitos de Uso Limitado.\",\n email_password: \"Email/palavra-passe\",\n sign_in_with_google: \"Iniciar sessão com Google\",\n\n // --- Auth error messages ---\n auth_user_not_found: \"Utilizador não encontrado\",\n auth_wrong_password: \"Palavra-passe incorreta. Por favor tente novamente.\",\n auth_user_disabled: \"Utilizador desativado. Por favor contacte o suporte.\",\n auth_account_exists_with_different_credential: \"Conta existente com método de início de sessão diferente\",\n auth_email_already_in_use: \"O email já está em uso\",\n auth_google_permissions_required: \"Precisa de conceder permissões adicionais para gerir os seus projetos Google Cloud\",\n auth_invalid_email_password: \"Por favor introduza o email e a palavra-passe\",\n auth_enter_email_first: \"Por favor introduza primeiro o seu email\",\n auth_password_reset_sent: \"Email de redefinição de palavra-passe enviado\",\n auth_sign_in_account: \"Iniciar sessão na sua conta\",\n auth_create_new_account: \"Criar uma nova conta\",\n auth_password: \"Palavra-passe\",\n auth_reset_password: \"Redefinir palavra-passe\",\n auth_new_user: \"Novo utilizador?\",\n auth_have_account: \"Já tem uma conta?\",\n auth_sign_in: \"Iniciar Sessão\",\n auth_sign_up: \"Registar\",\n\n // --- SaaS Subscriptions ---\n subscriptions: \"Subscrições\",\n manage_your_subscriptions_in_stripe: \"Gerir as suas subscrições no Stripe\",\n go_to_your_stripe_portal: \"Aceda ao seu portal Stripe para ver o histórico de faturação. Pode também gerir as subscrições associadas ao utilizador com sessão iniciada.\",\n your_pro_licenses: \"As suas licenças PRO\",\n create_new_license: \"Criar nova licença\",\n create_subscriptions_in_this_section: \"Crie subscrições nesta secção apenas para o FireCMS PRO auto-hospedado. Se estiver a usar o FireCMS Cloud, pode atualizar o seu projeto nas definições do projeto.\",\n if_you_are_an_agency: \"Se for uma agência, pode revender a sua licença aos seus clientes.\",\n if_you_have_any_questions: \"Se tiver alguma dúvida ou precisar de ajuda, contacte-nos em\",\n you_have_not_created_any_pro_licenses: \"Ainda não criou nenhuma licença FireCMS PRO\",\n archive: \"Arquivar\",\n licensed_projects_lowercase: \"projetos licenciados\",\n manage: \"Gerir\",\n update_payment_method: \"Atualizar método de pagamento\",\n stripe_portal_error: \"Não foi possível abrir o Stripe: {{message}}\",\n your_firecms_cloud_projects: \"Os seus projetos FireCMS Cloud\",\n status_active: \"Ativo\",\n status_trialing: \"Em avaliação\",\n status_past_due: \"Com pagamento em atraso\",\n status_canceled: \"Cancelado\",\n status_unpaid: \"Não pago\",\n status_incomplete: \"Incompleto\",\n status_incomplete_expired: \"Incompleto expirado\",\n status_unknown: \"Desconhecido\",\n\n plan_free: \"Não subscrito\",\n plan_cloud_plus: \"Subscrito\",\n plan_pro: \"Pro\",\n plan_unknown: \"Plano Desconhecido\",\n\n auto_setup_collections_button: \"Configurar coleções automaticamente\",\n auto_setup_collections_title: \"Configurar coleções automaticamente?\",\n auto_setup_collections_desc: \"Isto criará automaticamente configurações de coleção para coleções que <b>NÃO</b> estão já mapeadas\",\n setting_up_collections: \"Configurando coleções\",\n setting_up_collection: \"Configurando {{name}}\",\n no_collections_found_to_setup: \"Nenhuma coleção encontrada para configurar.\",\n collections_have_been_setup: \"As coleções foram configuradas automaticamente.\",\n error_setting_up_collections: \"Erro ao configurar coleções automaticamente\",\n setup_collections_title: \"Set up collections\",\n setup_collections_select_desc: \"Select which collections to automatically set up:\",\n select_all: \"Select all\",\n deselect_all: \"Deselect all\",\n setup_collections_confirm: \"Set up ({{count}})\",\n collection_setup_success: \"{{name}} has been set up\",\n go_to_collection: \"Go to collection\",\n\n // --- Home Suggestions ---\n add_your: \"Adicione as suas\",\n database_collections: \"coleções da base de dados\",\n to_firecms: \"ao FireCMS\",\n no_unmapped_collections: \"Sem coleções não mapeadas na base de dados\",\n query_and_update_with_datatalk: \"Consulte e atualize os seus dados em linguagem natural com\",\n\n // --- SaaS Welcome ---\n welcome_to_firecms: \"Bem-vindo ao FireCMS Cloud\",\n admin_panel_ready_bring_data: \"O seu painel de administração está pronto. Vamos importar os seus dados.\",\n admin_panel_ready_get_started: \"O seu painel de administração está pronto. Veja como começar.\",\n auto_detect_collections: \"Detetar coleções automaticamente\",\n auto_detect_collections_desc: \"Deixe a IA analisar a sua base de dados e gerar automaticamente esquemas de coleção.\",\n create_a_collection: \"Criar uma coleção\",\n create_collection_desc: \"Defina manualmente a sua primeira coleção do zero usando o editor visual.\",\n read_the_docs: \"Ler a documentação\",\n read_the_docs_desc: \"Saiba como personalizar campos, vistas, ações e muito mais.\",\n explore_docs: \"Explorar documentação\",\n want_to_customize_with_code: \"Quer personalizar com código? Execute\",\n to_scaffold_a_local_project: \"para criar um projeto local.\",\n\n // ─── Collection Editor — Validation ──────────────────────────\n validation: \"Validação\",\n unique: \"Único\",\n required_message: \"Mensagem de campo obrigatório\",\n required_tooltip: \"Você não poderá salvar esta entidade se este valor não estiver definido\",\n unique_tooltip: \"Não pode haver múltiplas entidades com o mesmo valor\",\n lowercase: \"Minúsculas\",\n uppercase: \"Maiúsculas\",\n trim: \"Remover espaços\",\n exact_length: \"Comprimento exato\",\n min_length: \"Comprimento mín.\",\n max_length: \"Comprimento máx.\",\n matches_regex: \"Corresponde a regex\",\n not_valid_regexp: \"Expressão regular inválida\",\n regex_helper: \"ex. /^\\\\d+$/ apenas para dígitos\",\n min_value: \"Valor mín.\",\n max_value: \"Valor máx.\",\n less_than: \"Menor que\",\n more_than: \"Maior que\",\n positive_value: \"Valor positivo\",\n negative_value: \"Valor negativo\",\n integer_value: \"Valor inteiro\",\n\n // ─── Collection Editor — Property Edit ───────────────────────\n invalid_regular_expression: \"Expressão regular inválida\",\n must_specify_target_collection: \"Você deve especificar uma coleção de destino para o campo\",\n need_specify_repeat_field: \"Você precisa especificar um campo de repetição\",\n need_specify_block_properties: \"Você precisa especificar as propriedades deste bloco\",\n incomplete_condition: \"Condição incompleta - por favor selecione um campo\",\n field_name: \"Nome do campo\",\n\n // ─── Collection Editor — Display & Config ────────────────────\n kanban_column_property: \"Propriedade de coluna Kanban\",\n select_a_property: \"Selecionar uma propriedade\",\n kanban_property_not_found: \"A propriedade \\\"{{property}}\\\" não existe ou não é uma propriedade string com enum. Selecione uma propriedade válida ou limpe a seleção.\",\n no_enum_string_properties: \"Nenhuma propriedade string com enum encontrada. Adicione uma propriedade string com enumValues para usar a visualização Kanban.\",\n kanban_column_description: \"Selecione uma propriedade string com valores enum para agrupar entidades em colunas\",\n create_property: \"+ Criar propriedade \\\"{{property}}\\\"\",\n order_property: \"Propriedade de ordem\",\n order_property_not_found: \"A propriedade \\\"{{property}}\\\" não existe ou não é uma propriedade numérica. Selecione uma propriedade válida ou limpe a seleção.\",\n no_number_properties: \"Nenhuma propriedade numérica encontrada. Adicione uma propriedade numérica para habilitar a ordenação.\",\n order_property_description: \"Selecione uma propriedade numérica para manter a ordem dos itens\",\n image_property: \"Propriedade de imagem\",\n image_property_not_found: \"A propriedade \\\"{{property}}\\\" não existe ou não é uma propriedade de imagem. Selecione uma propriedade válida ou limpe a seleção.\",\n no_image_properties: \"Nenhuma propriedade de imagem encontrada. Adicione uma propriedade de armazenamento ou URL de imagem para usar como miniatura.\",\n image_property_description: \"Selecione a propriedade usada como miniatura nas visualizações de Cartões e Kanban. Se não for definida, a primeira propriedade de imagem correspondente será usada automaticamente.\",\n display_settings: \"Configurações de exibição\",\n default_row_size: \"Tamanho de linha padrão\",\n side_dialog_width: \"Largura do diálogo lateral\",\n side_dialog_width_description: \"Defina opcionalmente a largura (em pixels) do diálogo lateral de entidades. O padrão é 768px\",\n inline_editing_enabled: \"Os dados podem ser editados diretamente na visualização de tabela\",\n inline_editing_disabled: \"Os dados só podem ser editados na visualização de formulário\",\n inline_editing_description: \"Permitir edição de dados diretamente na visualização de tabela, sem abrir a visualização de formulário.\",\n include_json_view: \"Incluir visualização JSON\",\n no_json_view: \"Não incluir visualização JSON\",\n json_view_description: \"Incluir a representação JSON do documento.\",\n not_found_suffix: \"não encontrado\",\n\n // ─── Editor ─────────────────────────────────────────────────\n editor_text: \"Texto\",\n editor_text_description: \"Comece simplesmente a escrever em texto simples.\",\n editor_heading_1: \"Título 1\",\n editor_heading_1_description: \"Título de secção grande.\",\n editor_heading_2: \"Título 2\",\n editor_heading_2_description: \"Título de secção médio.\",\n editor_heading_3: \"Título 3\",\n editor_heading_3_description: \"Título de secção pequeno.\",\n editor_todo_list: \"Lista de Tarefas\",\n editor_todo_list_description: \"Acompanhe tarefas com uma lista de afazeres.\",\n editor_bullet_list: \"Lista com Marcadores\",\n editor_bullet_list_description: \"Crie uma lista simples com marcadores.\",\n editor_numbered_list: \"Lista Numerada\",\n editor_numbered_list_description: \"Crie uma lista com numeração.\",\n editor_quote: \"Citação\",\n editor_quote_description: \"Capture uma citação.\",\n editor_code: \"Código\",\n editor_code_description: \"Capture um snippet de código.\",\n editor_image: \"Imagem\",\n editor_image_description: \"Carregue uma imagem do seu computador.\",\n editor_multiple: \"Múltiplos\",\n editor_link: \"Ligação\",\n editor_save: \"Guardar\",\n editor_cancel: \"Cancelar\",\n editor_remove_link: \"Remover ligação\",\n editor_paste_or_type_link: \"Cole ou escreva a ligação\",\n editor_open_in_new_window: \"Abrir numa nova janela\",\n editor_bold: \"Negrito\",\n editor_italic: \"Itálico\",\n editor_underline: \"Sublinhado\",\n editor_strikethrough: \"Riscado\",\n editor_autocomplete: \"Preenchimento automático\",\n editor_autocomplete_description: \"Adicione texto com base no contexto.\",\n\n // ─── Cloud Project Settings ──────────────────────────────────\n settings_subscription_plan: \"Plano de subscrição\",\n settings_subscribed_to: \"Está atualmente subscrito ao\",\n settings_no_active_subscription: \"Atualmente não existe uma subscrição ativa para este projeto.\",\n settings_trial_valid_until: \"O seu período de teste é válido até {{date}}.\",\n settings_features_intro: \"Estas são algumas das funcionalidades que já está a usufruir com o FireCMS Cloud\",\n settings_feature_managed_service: \"Serviço gerido sempre atualizado\",\n settings_feature_local_text_search: \"Pesquisa de texto local\",\n settings_feature_unlimited_users_roles: \"Utilizadores e funções ilimitados\",\n settings_feature_theme_logo: \"Personalização de tema e logótipo\",\n settings_feature_custom_fields_views: \"Campos de formulário e vistas personalizadas\",\n settings_feature_secondary_databases: \"Bases de dados secundárias\",\n settings_feature_ai_content: \"Geração de conteúdo com IA da OpenAI e Google\",\n settings_feature_unlimited_export: \"Exportação de dados ilimitada\",\n settings_feature_appcheck: \"AppCheck\",\n settings_heading: \"Definições\",\n settings_project_name: \"Nome do projeto\",\n settings_default_language: \"Idioma predefinido\",\n settings_default_language_caption: \"Selecione o idioma base para este projeto. Os utilizadores podem alterar esta preferência nas suas definições pessoais.\",\n settings_enable_local_text_search: \"Ativar pesquisa de texto local\",\n settings_local_text_search_caption: \"Ative a pesquisa de texto local para todas as coleções. Isto permitirá pesquisar campos de texto nas suas coleções usando a barra de pesquisa do FireCMS. Note que esta funcionalidade pode resultar num maior número de leituras, pois todos os campos de texto das suas coleções serão indexados.\",\n settings_doc_history_all_collections: \"Histórico de documentos ativado para todas as coleções\",\n settings_doc_history_caption: \"Quando ativado, todas as coleções terão o histórico ativado por predefinição. Pode alterar esta definição em cada coleção. O histórico será guardado na subcoleção __history de cada documento.\",\n settings_theme: \"Tema\",\n settings_primary_color: \"Cor primária\",\n settings_secondary_color: \"Cor secundária\",\n settings_sample_theme_components: \"Exemplos de componentes do tema\",\n settings_drag_drop_logo: \"Arraste e solte o seu logótipo aqui\",\n settings_create_subscription: \"Criar uma subscrição\",\n settings_stripe_disclaimer: \"Será redirecionado para o Stripe para completar a sua subscrição. A faturação é mensal, com base no número máximo de utilizadores do mês. Cancele a qualquer momento – já pagou o período de faturação atual, pelo que não serão aplicados custos adicionais após o cancelamento.\",\n settings_subscription_is: \"A subscrição está\",\n settings_next_payment_on: \"O próximo pagamento é a {{date}}.\",\n settings_seats_count: \"Tem\",\n settings_seat: \"lugar\",\n settings_seats: \"lugares\",\n settings_per_seat: \"a {{price}}/lugar/{{interval}}\",\n settings_current_price: \"O preço atual é\",\n settings_per_user_usage: \"por utilizador (baseado em utilização).\",\n settings_cancelled_active_until: \"Esta subscrição foi cancelada e estará ativa até {{date}}.\",\n settings_no_additional_charges: \"Não serão aplicados custos adicionais após o cancelamento.\",\n settings_manage_subscription: \"Gerir subscrição\",\n settings_security_rules: \"Regras de segurança\",\n settings_security_rules_description: \"O FireCMS utiliza as regras de segurança do Firebase para restringir o acesso aos dados. Ao criar um novo utilizador através do FireCMS, o atributo personalizado fireCMSUser é adicionado ao utilizador no projeto cliente. Ao adicionar as seguintes regras de segurança ao seu projeto, garante que os utilizadores do FireCMS possam aceder aos dados através do FireCMS.\",\n settings_security_rules_add_domain: \"Lembre-se de adicionar o domínio {{domain}} aos domínios permitidos do seu fornecedor\",\n settings_security_rules_caption: \"Estas regras restringem o acesso aos dados apenas aos utilizadores do FireCMS, mas não aplicam as permissões ao nível da base de dados. As permissões são aplicadas no frontend, o que funciona bem para a maioria dos projetos. Se precisar de aplicar as permissões ao nível da base de dados, pode modificar estas regras de segurança. As funções atribuídas a um utilizador são definidas como atributos personalizados no token de autenticação do Firebase, pelo que pode utilizá-las nas suas regras de segurança.\",\n settings_appcheck: \"AppCheck\",\n settings_appcheck_description: \"Pode ativar o AppCheck para proteger os seus serviços Firebase contra abusos. Consulte a documentação do Firebase para configuração. Quando tiver um fornecedor configurado, pode ativá-lo aqui. Terá de fornecer um segredo nas definições do seu projeto Firebase e uma chave de site na configuração do FireCMS.\",\n settings_appcheck_add_domain: \"Lembre-se de adicionar o domínio {{domain}} aos domínios permitidos do seu fornecedor\",\n settings_appcheck_enable: \"Ativar AppCheck\",\n settings_appcheck_site_key: \"Chave de site\",\n settings_appcheck_update: \"Atualizar AppCheck\",\n settings_appcheck_refresh_note: \"Poderá ter de atualizar a página após guardar para ver as alterações.\",\n settings_appcheck_updated: \"AppCheck atualizado\",\n settings_appcheck_error: \"Erro ao atualizar o AppCheck\",\n\n // --- Permission Error View ---\n missing_firestore_security_rules: \"Regras de Segurança do Firestore Ausentes\",\n firecms_cloud_requires_security_rule: \"O FireCMS Cloud requer uma regra de segurança específica no seu Firestore para conceder acesso a usuários autenticados. A coleção\",\n cannot_be_accessed_without_it: \"não pode ser acessada sem ela.\",\n required_security_rule: \"Regra de segurança obrigatória\",\n fix_automatically: \"Corrigir automaticamente\",\n open_firebase_rules: \"Abrir Regras do Firebase\",\n security_rules_updated_successfully: \"Regras de segurança atualizadas com sucesso! Por favor atualize a página para carregar seus dados.\",\n sec_rules_fixing: \"Corrigindo...\",\n sec_rules_fixed: \"Corrigido!\",\n\n // ─── Text Search Dialog ─────────────────────────────────────\n text_search_dialog_title: \"Ativar pesquisa de texto\",\n text_search_local_not_recommended: \"A pesquisa de texto local não é recomendada para coleções grandes.\",\n text_search_local_fetch_warning: \"Note que ativar a pesquisa de texto local requer descarregar todos os documentos da sua coleção e armazená-los no navegador. Isto pode ser ineficiente para coleções grandes e gerar custos adicionais.\",\n text_search_external_suggestion: \"Para coleções maiores, recomendamos usar um motor de pesquisa externo como Algolia ou Elastic Search e atribuir um delegado de pesquisa à sua configuração.\",\n text_search_local_description: \"A pesquisa de texto local é a forma mais simples de ativar a pesquisa de texto na sua coleção. Carrega todos os documentos da coleção no navegador e efetua a pesquisa localmente. É a opção recomendada para coleções pequenas.\",\n text_search_own_implementation: \"Implementou o seu próprio controlador de pesquisa de texto. Pode ativar a pesquisa de texto para a sua coleção.\",\n text_search_enable_for_collection: \"Ativar para esta coleção\",\n text_search_enable_for_project: \"Ativar para o projeto\",\n text_search_enabled_snackbar: \"Pesquisa de texto local ativada\",\n\n // ─── GCP Marketplace ─────────────────────────────────────────\n marketplace_managed_by_gcp: \"Gerenciado via GCP Marketplace\",\n marketplace_billing_note: \"Sua assinatura é gerenciada pelo Google Cloud Marketplace. Alterações de plano, faturamento e cancelamento são feitos no console do GCP.\",\n marketplace_manage_in_gcp_console: \"Gerenciar no console do GCP\",\n marketplace_plan_changes_note: \"Para alterar seu plano ou cancelar, visite seus pedidos do GCP Marketplace.\",\n marketplace_welcome_title: \"Bem-vindo do GCP Marketplace!\",\n marketplace_welcome_subtitle: \"Sua assinatura do Google Cloud Marketplace está ativa. Selecione um projeto existente ou crie um novo para vinculá-lo.\",\n marketplace_select_or_create_project: \"Selecionar ou criar um projeto\",\n marketplace_link_project: \"Vincular projeto\",\n marketplace_linking: \"Vinculando projeto…\",\n marketplace_link_success: \"Projeto vinculado com sucesso! Redirecionando…\",\n marketplace_link_error: \"Erro ao vincular o projeto. Por favor, tente novamente.\",\n marketplace_no_account_id: \"Nenhum ID de conta do GCP Marketplace encontrado. Por favor, comece pelo GCP Marketplace.\",\n};\n"],"names":["pt","save","create","create_copy","save_and_close","create_copy_and_close","create_and_close","discard","clear","cancel","edit","copy","delete","delete_confirmation_title","delete_confirmation_body","delete_multiple_confirmation_body","unsaved_changes_title","unsaved_changes_body","discard_changes","keep_editing","search","find_by_id","find_entity_by_id","filter","filters","clear_filter","clear_filter_sort","clear_sort","no_items","no_entries_found","all_entries_loaded","create_your_first_entry","no_results_filter_sort","add","remove","multiple_entities","unsaved_changes","so_empty","no_results","refresh_data","dark_mode","light_mode","system_mode","ok","save_collection_config","search_for_more_icons","ai_modified","size_label","group_by","initialize_kanban_order","copy_id","add_specific","select_specific","select_from","done","log_out","license_trial_banner","license_trial_banner_one","license_expired_banner","license_expired_banner_undated","license_invalid_project_banner","license_invalid_project_banner_unnamed","license_over_quota_banner","license_over_quota_banner_one","license_get_license","license_update_license","license_add_project_to_license","pro_features_paused","user_management_paused_description","column_cannot_be_edited","close","unsaved_local_changes","unsaved_local_changes_description","preview_changes","apply_changes","discard_local_changes","preview_local_changes","preview_local_changes_description","type","string","number","boolean","date","map","array","arrays_of_arrays_not_supported","data_type_not_supported","passkey_error_unsupported","admin","home","this_form_has_errors","error_loading_navigation","error_loading_auth","this_form_has_been_modified","current_form_in_sync","open_in_console","collection_does_not_exist","unexpected_value","unexpected_value_click_to_edit","unexpected_reference_value","copy_url_to_clipboard","open_image_in_new_tab","reference_not_set","reference_does_not_exist","entity_not_found","file_not_found","unsaved_changes_in_entity","delete_this_role","no_roles_yet","create_default_roles","delete_role_confirmation","delete_this_user","no_users_yet","add_logged_user_as_admin","add_current_user_as_admin","create_default_roles_and_add_admin","delete_user_confirmation","create_your_users_and_roles","no_users_or_roles_defined","save_before_changing_schema","edit_schema_for_this_form","no_permissions_to_edit_collection","browser_does_not_support_audio","user_not_found","delete_selected","cannot_delete_selected","add_entry","add_on_top","add_below","add_to_field","value","key","drag_drop_multiple","drag_drop_single","open_menu","close_drawer","navigation_drawer","error","error_uploading_file","error_deleting","error_before_delete","error_updating_asset","error_deleting_asset","error_firestore_index","create_index","value_is_not_reference","click_to_edit","data_is_not_array_of_references","loading","local_changes_applied","local_changes_discarded","are_you_sure_leave","see_console_details","drop_here_create_group","filter_for_null_values","value_updated_elsewhere","add_property","edit_name","this_entity_not_exist","internal_error","rename_group","group_name_label","group_name_empty_error","group_name_exists_error","search_collections","views_group","youd_need_to_save_before_additional_collections","page_not_found","page_not_found_body","back_to_home","default_collection_view","table_view","cards_view","kanban_view","choose_how_entities_displayed_default","document_view","side_panel","full_screen","should_documents_opened_full_screen","select_custom_view","no_custom_views_defined","select_custom_action","no_custom_actions_defined","no_collections_found","start_building_collections","create_first_collection","define_collections_programmatically","edit_collection","no_permissions_edit_collection","no_permissions_create_collection","create_collection","update_collection","new_collection","add_new_collection","collection_with_name","change_icon","is_subcollection_of","name","collection_name_description","path","relative_path_to_parent","path_in_database","singular_name","singular_name_description","description","description_of_collection","collection_id","collection_id_description","collection_group","collection_group_description","advanced_settings","doc_history_global","doc_history_enabled","doc_history_not_enabled","doc_history_description","document_id_generation","code_defined","users_must_define_id","users_can_define_id","doc_id_auto_generated","config_doc_id_generation","enable_text_search","text_search_description","database_id","default_text","custom_actions","more_info","define_custom_actions_cli","action_defined_in_code","add_custom_entity_action","remove_this_action","remove_action_warning","subcollections_of","add_subcollection","custom_views","define_custom_views_cli","view_defined_in_code","add_custom_entity_view","delete_this_subcollection","remove_collection_warning","remove_this_view","remove_view_warning","no_collection_selected","code_for_collection","use_config_define_json","customise_collection_code","copied","property_cant_be_edited","property_not_editable_description","delete_this_property","delete_property_warning","error_must_specify_id","error_id_format","error_id_already_exists","error_must_specify_title","custom_or_other","select_property_widget","error_changing_data_type","required","enum_form_dialog","imported_data_preview","entities_with_same_id_overwritten","collection_editor","properties_in_this_group","data_property_mapping","property_edit_view","all_of_these","any_of_these","only_admins_edit_roles","error_user_not_found","role","name_of_this_role","id_of_this_role","create_entities","read_entities","update_entities","delete_entities","all_collections","create_entities_in_collections","access_all_data_in_every_collection","update_data_in_any_collection","delete_data_in_any_collection","allow_all_permissions_in_this_collections","all","customise_permissions_description","create_collections","yes","no","can_user_create_collections","edit_collections","only_own_collections","own","can_user_edit_collections","delete_collections","can_user_delete_collections","error_saving_role","create_role","update","only_admins_change_roles","must_be_at_least_one_admin","logged_user_not_found","user","user_id","name_of_this_user","email_of_this_user","roles","create_user","users","add_user","add_role","is_admin","default_permissions","created_on","email","id","read","column_in_file","map_to_property","default_values","default_values_description","property","default_value","autogenerate_id","id_column_description","do_not_set_value","set_value_to_true","set_value_to_false","drag_and_drop_file","error_saving_data","retry","saving_data","entities_saved","do_not_close_tab","import","import_data","upload_file_description","back","next","save_data","use_column_as_id","do_not_import_property","entities_will_be_overwritten","data_imported_successfully","export","export_data","download_table_csv","csv","json","dates_as_timestamps","dates_as_strings","flatten_arrays","download","large_number_of_documents","include_undefined_values","export_apply_filter_sort","export_all_entities","export_selected_entities","export_error","submit","no_filterable_properties","apply_filters","list","cards","board","initialize_kanban_order_desc","kanban_view_not_available","kanban_view_requires_enum","no_enum_values_configured","items_need_backfill","initialize","confirm_multiple_delete","delete_entity_confirm_title","generate_collection_with_ai","modify_collection_with_ai","describe_collection_to_create","describe_changes_to_make","ai_placeholder_create","ai_placeholder_modify","ai_assist","generating","this_is_subcollection_of","use_existing_paths_database","describe_collection_ai","generate_with_ai","create_from_json_config","paste_json_config","create_collection_from_file_formats","select_template","products","collection_products_subtitle","collection_users_subtitle","blog_posts","collection_blog_posts_subtitle","pages","collection_pages_subtitle","continue_from_scratch","cms_users","roles_menu","project_settings","firestore_manager","datatalk","manage_your_firestore_data","build_admin_panel_in_minutes","go_live_instantly","create_production_ready_back_offices","without_the_frontend_hassle","automatic_setup","from_your_existing_firestore_data","seamless_real_time_firebase_integration","intuitive_spreadsheet_like_ui","your_whole_team_can_use","focus_on_your_app","not_the_admin_panel","join_our_newsletter","by_signing_in_you_agree_to_our","please_accept_the_terms_to_continue","terms_and_conditions","and_our","privacy_policy","firecms_cloud_google_disclosure","google_api_services_user_data_policy","including_the_limited_use_requirements","email_password","sign_in_with_google","auth_user_not_found","auth_wrong_password","auth_user_disabled","auth_account_exists_with_different_credential","auth_email_already_in_use","auth_google_permissions_required","auth_invalid_email_password","auth_enter_email_first","auth_password_reset_sent","auth_sign_in_account","auth_create_new_account","auth_password","auth_reset_password","auth_new_user","auth_have_account","auth_sign_in","auth_sign_up","subscriptions","manage_your_subscriptions_in_stripe","go_to_your_stripe_portal","your_pro_licenses","create_new_license","create_subscriptions_in_this_section","if_you_are_an_agency","if_you_have_any_questions","you_have_not_created_any_pro_licenses","archive","licensed_projects_lowercase","manage","update_payment_method","stripe_portal_error","your_firecms_cloud_projects","status_active","status_trialing","status_past_due","status_canceled","status_unpaid","status_incomplete","status_incomplete_expired","status_unknown","plan_free","plan_cloud_plus","plan_pro","plan_unknown","auto_setup_collections_button","auto_setup_collections_title","auto_setup_collections_desc","setting_up_collections","setting_up_collection","no_collections_found_to_setup","collections_have_been_setup","error_setting_up_collections","setup_collections_title","setup_collections_select_desc","select_all","deselect_all","setup_collections_confirm","collection_setup_success","go_to_collection","add_your","database_collections","to_firecms","no_unmapped_collections","query_and_update_with_datatalk","welcome_to_firecms","admin_panel_ready_bring_data","admin_panel_ready_get_started","auto_detect_collections","auto_detect_collections_desc","create_a_collection","create_collection_desc","read_the_docs","read_the_docs_desc","explore_docs","want_to_customize_with_code","to_scaffold_a_local_project","validation","unique","required_message","required_tooltip","unique_tooltip","lowercase","uppercase","trim","exact_length","min_length","max_length","matches_regex","not_valid_regexp","regex_helper","min_value","max_value","less_than","more_than","positive_value","negative_value","integer_value","invalid_regular_expression","must_specify_target_collection","need_specify_repeat_field","need_specify_block_properties","incomplete_condition","field_name","kanban_column_property","select_a_property","kanban_property_not_found","no_enum_string_properties","kanban_column_description","create_property","order_property","order_property_not_found","no_number_properties","order_property_description","image_property","image_property_not_found","no_image_properties","image_property_description","display_settings","default_row_size","side_dialog_width","side_dialog_width_description","inline_editing_enabled","inline_editing_disabled","inline_editing_description","include_json_view","no_json_view","json_view_description","not_found_suffix","editor_text","editor_text_description","editor_heading_1","editor_heading_1_description","editor_heading_2","editor_heading_2_description","editor_heading_3","editor_heading_3_description","editor_todo_list","editor_todo_list_description","editor_bullet_list","editor_bullet_list_description","editor_numbered_list","editor_numbered_list_description","editor_quote","editor_quote_description","editor_code","editor_code_description","editor_image","editor_image_description","editor_multiple","editor_link","editor_save","editor_cancel","editor_remove_link","editor_paste_or_type_link","editor_open_in_new_window","editor_bold","editor_italic","editor_underline","editor_strikethrough","editor_autocomplete","editor_autocomplete_description","settings_subscription_plan","settings_subscribed_to","settings_no_active_subscription","settings_trial_valid_until","settings_features_intro","settings_feature_managed_service","settings_feature_local_text_search","settings_feature_unlimited_users_roles","settings_feature_theme_logo","settings_feature_custom_fields_views","settings_feature_secondary_databases","settings_feature_ai_content","settings_feature_unlimited_export","settings_feature_appcheck","settings_heading","settings_project_name","settings_default_language","settings_default_language_caption","settings_enable_local_text_search","settings_local_text_search_caption","settings_doc_history_all_collections","settings_doc_history_caption","settings_theme","settings_primary_color","settings_secondary_color","settings_sample_theme_components","settings_drag_drop_logo","settings_create_subscription","settings_stripe_disclaimer","settings_subscription_is","settings_next_payment_on","settings_seats_count","settings_seat","settings_seats","settings_per_seat","settings_current_price","settings_per_user_usage","settings_cancelled_active_until","settings_no_additional_charges","settings_manage_subscription","settings_security_rules","settings_security_rules_description","settings_security_rules_add_domain","settings_security_rules_caption","settings_appcheck","settings_appcheck_description","settings_appcheck_add_domain","settings_appcheck_enable","settings_appcheck_site_key","settings_appcheck_update","settings_appcheck_refresh_note","settings_appcheck_updated","settings_appcheck_error","missing_firestore_security_rules","firecms_cloud_requires_security_rule","cannot_be_accessed_without_it","required_security_rule","fix_automatically","open_firebase_rules","security_rules_updated_successfully","sec_rules_fixing","sec_rules_fixed","text_search_dialog_title","text_search_local_not_recommended","text_search_local_fetch_warning","text_search_external_suggestion","text_search_local_description","text_search_own_implementation","text_search_enable_for_collection","text_search_enable_for_project","text_search_enabled_snackbar","marketplace_managed_by_gcp","marketplace_billing_note","marketplace_manage_in_gcp_console","marketplace_plan_changes_note","marketplace_welcome_title","marketplace_welcome_subtitle","marketplace_select_or_create_project","marketplace_link_project","marketplace_linking","marketplace_link_success","marketplace_link_error","marketplace_no_account_id"],"mappings":"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"}
@@ -1 +1 @@
1
- export type CMSAnalyticsEvent = "entity_click" | "entity_click_from_reference" | "reference_selection_clear" | "reference_selection_toggle" | "reference_selected_single" | "reference_selection_new_entity" | "edit_entity_clicked" | "entity_edited" | "new_entity_click" | "new_entity_saved" | "copy_entity_click" | "entity_copied" | "single_delete_dialog_open" | "multiple_delete_dialog_open" | "single_entity_deleted" | "multiple_entities_deleted" | "drawer_navigate_to_home" | "drawer_navigate_to_collection" | "drawer_navigate_to_view" | "home_navigate_to_collection" | "home_favorite_navigate_to_collection" | "home_navigate_to_view" | "home_navigate_to_admin_view" | "home_favorite_navigate_to_view" | "home_move_card" | "home_move_group" | "home_drop_new_group" | "collection_inline_editing" | "view_mode_changed" | "kanban_card_moved" | "kanban_column_reorder" | "kanban_property_changed" | "kanban_new_entity_in_column" | "kanban_backfill_order" | "card_view_entity_click" | "unmapped_event";
1
+ export type CMSAnalyticsEvent = "entity_click" | "entity_click_from_reference" | "reference_selection_clear" | "reference_selection_toggle" | "reference_selected_single" | "reference_selection_new_entity" | "edit_entity_clicked" | "entity_edited" | "new_entity_click" | "new_entity_saved" | "copy_entity_click" | "entity_copied" | "single_delete_dialog_open" | "multiple_delete_dialog_open" | "single_entity_deleted" | "multiple_entities_deleted" | "drawer_navigate_to_home" | "drawer_navigate_to_collection" | "drawer_navigate_to_view" | "home_navigate_to_collection" | "home_favorite_navigate_to_collection" | "home_navigate_to_view" | "home_navigate_to_admin_view" | "home_favorite_navigate_to_view" | "home_move_card" | "home_move_group" | "home_drop_new_group" | "collection_inline_editing" | "view_mode_changed" | "kanban_card_moved" | "kanban_column_reorder" | "kanban_property_changed" | "kanban_new_entity_in_column" | "kanban_backfill_order" | "card_view_entity_click" | "entity_history_opened" | "entity_history_reverted" | "unmapped_event";
@@ -87,6 +87,13 @@ export interface EntityCollection<M extends Record<string, any> = any, USER exte
87
87
  * If not specified, the first property simple text property will be used.
88
88
  */
89
89
  titleProperty?: keyof M;
90
+ /**
91
+ * Property used as the image thumbnail in Cards and Kanban view modes.
92
+ * Must reference a storage/image property (or an array of them), or a
93
+ * string property with `url: "image"`.
94
+ * If not specified, the first matching image property will be used.
95
+ */
96
+ imageProperty?: keyof M;
90
97
  /**
91
98
  * When editing an entity, you can choose to open the entity in a side dialog
92
99
  * or in a full screen dialog. Defaults to `full_screen`.
@@ -232,6 +239,21 @@ export interface EntityCollection<M extends Record<string, any> = any, USER exte
232
239
  * e.g. `initialFilter: { related_user: ["==", new EntityReference("sdc43dsw2", "users")] }`
233
240
  */
234
241
  initialFilter?: FilterValues<Extract<keyof M, string>>;
242
+ /**
243
+ * Array of property keys that are allowed for filtering. Allowed filters will be displayed in the collection view, table row headers
244
+ * and will be used to filter data.
245
+ *
246
+ * If not specified, all properties that are filterable will be allowed.
247
+ *
248
+ * If you specify this prop, the filters will be displayed in the collection view if they are filterable.
249
+ *
250
+ * If you set it as an empty array, no filters will be displayed.
251
+ *
252
+ * e.g. `allowedFilters: ["name", "category"]`
253
+ *
254
+ * e.g. `allowedFilters: []`
255
+ */
256
+ allowedFilters?: (keyof M)[];
235
257
  /**
236
258
  * Default sort applied to this collection.
237
259
  * When setting this prop, entities will have a default order
@@ -417,6 +439,13 @@ export interface CollectionActionsProps<M extends Record<string, any> = any, USE
417
439
  * `users/1234/addresses`
418
440
  */
419
441
  path: string;
442
+ /**
443
+ * `path` split at its real segment boundaries, e.g. `["nodes", "node/42", "edges"]`.
444
+ *
445
+ * Optional, and never derived by splitting `path` — a parent entity id may itself
446
+ * contain "/". Absent means "not known here", not "no slashes".
447
+ */
448
+ pathSegments?: string[];
420
449
  /**
421
450
  * Path of the last collection, like `addresses`
422
451
  */
@@ -621,6 +650,8 @@ export type EntityTableController<M extends Record<string, any> = any> = {
621
650
  dataLoadingError?: Error;
622
651
  filterValues?: FilterValues<Extract<keyof M, string>>;
623
652
  setFilterValues?: (filterValues: FilterValues<Extract<keyof M, string>>) => void;
653
+ allowedFilters?: (keyof M)[];
654
+ forcedFilters?: (keyof M)[];
624
655
  sortBy?: [Extract<keyof M, string>, "asc" | "desc"];
625
656
  setSortBy?: (sortBy?: [Extract<keyof M, string>, "asc" | "desc"]) => void;
626
657
  searchString?: string;
@@ -7,6 +7,20 @@ import { FireCMSContext } from "./firecms_context";
7
7
  */
8
8
  export interface FetchEntityProps<M extends Record<string, any> = any> {
9
9
  path: string;
10
+ /**
11
+ * The path split at its real segment boundaries, e.g.
12
+ * `["nodes", "node/42", "edges"]`.
13
+ *
14
+ * `path` is a single flattened string, so a parent entity id containing "/" cannot be
15
+ * recovered from it — `"nodes/node/42/edges"` is indistinguishable from a three-level
16
+ * nesting. This is the unambiguous form: one array element per segment, entity ids
17
+ * kept whole however many slashes they contain.
18
+ *
19
+ * For any backend whose ids cannot contain "/" this is exactly `path.split("/")`, so
20
+ * delegates that do not care can keep using `path`. Delegates that do should prefer
21
+ * `pathSegments ?? path.split("/")`.
22
+ */
23
+ pathSegments?: string[];
10
24
  entityId: string;
11
25
  databaseId?: string;
12
26
  collection?: EntityCollection<M, any>;
@@ -23,6 +37,20 @@ export type ListenEntityProps<M extends Record<string, any> = any> = FetchEntity
23
37
  */
24
38
  export interface FetchCollectionProps<M extends Record<string, any> = any> {
25
39
  path: string;
40
+ /**
41
+ * The path split at its real segment boundaries, e.g.
42
+ * `["nodes", "node/42", "edges"]`.
43
+ *
44
+ * `path` is a single flattened string, so a parent entity id containing "/" cannot be
45
+ * recovered from it — `"nodes/node/42/edges"` is indistinguishable from a three-level
46
+ * nesting. This is the unambiguous form: one array element per segment, entity ids
47
+ * kept whole however many slashes they contain.
48
+ *
49
+ * For any backend whose ids cannot contain "/" this is exactly `path.split("/")`, so
50
+ * delegates that do not care can keep using `path`. Delegates that do should prefer
51
+ * `pathSegments ?? path.split("/")`.
52
+ */
53
+ pathSegments?: string[];
26
54
  collection?: EntityCollection<M> | ResolvedEntityCollection<M>;
27
55
  filter?: FilterValues<Extract<keyof M, string>>;
28
56
  limit?: number;
@@ -43,6 +71,20 @@ export type ListenCollectionProps<M extends Record<string, any> = any> = FetchCo
43
71
  */
44
72
  export interface SaveEntityProps<M extends Record<string, any> = any> {
45
73
  path: string;
74
+ /**
75
+ * The path split at its real segment boundaries, e.g.
76
+ * `["nodes", "node/42", "edges"]`.
77
+ *
78
+ * `path` is a single flattened string, so a parent entity id containing "/" cannot be
79
+ * recovered from it — `"nodes/node/42/edges"` is indistinguishable from a three-level
80
+ * nesting. This is the unambiguous form: one array element per segment, entity ids
81
+ * kept whole however many slashes they contain.
82
+ *
83
+ * For any backend whose ids cannot contain "/" this is exactly `path.split("/")`, so
84
+ * delegates that do not care can keep using `path`. Delegates that do should prefer
85
+ * `pathSegments ?? path.split("/")`.
86
+ */
87
+ pathSegments?: string[];
46
88
  values: Partial<EntityValues<M>>;
47
89
  entityId?: string;
48
90
  previousValues?: Partial<EntityValues<M>>;
@@ -54,6 +96,11 @@ export interface SaveEntityProps<M extends Record<string, any> = any> {
54
96
  */
55
97
  export interface DeleteEntityProps<M extends Record<string, any> = any> {
56
98
  entity: Entity<M>;
99
+ /**
100
+ * `entity.path` split at its real segment boundaries, when the caller knows them.
101
+ * Never derived from `entity.path` — see `pathSegments` on FetchCollectionProps.
102
+ */
103
+ pathSegments?: string[];
57
104
  collection?: EntityCollection<M> | ResolvedEntityCollection<M>;
58
105
  }
59
106
  /**
@@ -133,11 +180,17 @@ export interface DataSource {
133
180
  * @param entityId
134
181
  * @return `true` if there are no other fields besides the given entity
135
182
  */
136
- checkUniqueField(path: string, name: string, value: any, entityId?: string, collection?: EntityCollection): Promise<boolean>;
183
+ checkUniqueField(path: string, name: string, value: any, entityId?: string, collection?: EntityCollection,
184
+ /**
185
+ * Appended last, and optional, so existing implementations and callers keep
186
+ * working unchanged — a function declaring fewer parameters stays assignable.
187
+ * See `pathSegments` on FetchCollectionProps.
188
+ */
189
+ pathSegments?: string[]): Promise<boolean>;
137
190
  /**
138
191
  * Generate an id for a new entity
139
192
  */
140
- generateEntityId(path: string, collection: EntityCollection): string;
193
+ generateEntityId(path: string, collection: EntityCollection, pathSegments?: string[]): string;
141
194
  /**
142
195
  * Count the number of entities in a collection
143
196
  */
@@ -155,11 +208,17 @@ export interface DataSource {
155
208
  initTextSearch?: (props: {
156
209
  context: FireCMSContext;
157
210
  path: string;
211
+ /**
212
+ * `path` split at its real segment boundaries, when known. Never derived from `path`.
213
+ */
214
+ pathSegments?: string[];
158
215
  collection: EntityCollection;
159
216
  parentCollectionIds?: string[];
160
217
  }) => Promise<boolean>;
161
218
  }
162
219
  export type FilterCombinationValidProps = {
220
+ /** `path` split at its real segment boundaries — see `pathSegments` on FetchCollectionProps. */
221
+ pathSegments?: string[];
163
222
  path: string;
164
223
  collection: EntityCollection<any>;
165
224
  filterValues: FilterValues<any>;
@@ -245,11 +304,11 @@ export interface DataSourceDelegate {
245
304
  * @param collection
246
305
  * @return `true` if there are no other fields besides the given entity
247
306
  */
248
- checkUniqueField(path: string, name: string, value: any, entityId?: string, collection?: EntityCollection): Promise<boolean>;
307
+ checkUniqueField(path: string, name: string, value: any, entityId?: string, collection?: EntityCollection, pathSegments?: string[]): Promise<boolean>;
249
308
  /**
250
309
  * Generate an id for a new entity
251
310
  */
252
- generateEntityId(path: string, collection?: EntityCollection): string;
311
+ generateEntityId(path: string, collection?: EntityCollection, pathSegments?: string[]): string;
253
312
  /**
254
313
  * Count the number of entities in a collection
255
314
  */
@@ -270,6 +329,10 @@ export interface DataSourceDelegate {
270
329
  initTextSearch?: (props: {
271
330
  context: FireCMSContext;
272
331
  path: string;
332
+ /**
333
+ * `path` split at its real segment boundaries, when known. Never derived from `path`.
334
+ */
335
+ pathSegments?: string[];
273
336
  databaseId?: string;
274
337
  collection: EntityCollection;
275
338
  parentCollectionIds?: string[];
@@ -17,6 +17,16 @@ export interface Entity<M extends object = any> {
17
17
  * to the root of the database).
18
18
  */
19
19
  path: string;
20
+ /**
21
+ * `path` split at its real segment boundaries, e.g. `["nodes", "node/42", "edges"]`.
22
+ *
23
+ * `path` is a single flattened string, so a parent entity id containing "/" cannot be
24
+ * recovered from it. This keeps each segment whole.
25
+ *
26
+ * Optional, and never derived by splitting `path` — a guess would be wrong in exactly
27
+ * the case the field exists for. Absent means "not known here", not "no slashes".
28
+ */
29
+ pathSegments?: string[];
20
30
  /**
21
31
  * Current values
22
32
  */
@@ -46,7 +56,17 @@ export declare class EntityReference {
46
56
  * Optional database ID where the entity is stored (if multiple databases are used)
47
57
  */
48
58
  readonly databaseId?: string;
49
- constructor(id: string, path: string, databaseId?: string);
59
+ /**
60
+ * `path` split at its real segment boundaries, e.g. `["nodes", "node/42", "edges"]`.
61
+ *
62
+ * `path` is a single flattened string, so a parent entity id containing "/" cannot be
63
+ * recovered from it. This keeps each segment whole.
64
+ *
65
+ * Optional, and never derived by splitting `path` — a guess would be wrong in exactly
66
+ * the case the field exists for. Absent means "not known here", not "no slashes".
67
+ */
68
+ readonly pathSegments?: string[];
69
+ constructor(id: string, path: string, databaseId?: string, pathSegments?: string[]);
50
70
  get pathWithId(): string;
51
71
  get pathWithIdAndDatabase(): string;
52
72
  isEntityReference(): boolean;
@@ -55,6 +55,12 @@ export type EntityActionClickProps<M extends object, USER extends User = User> =
55
55
  entity?: Entity<M>;
56
56
  context: FireCMSContext<USER>;
57
57
  fullPath?: string;
58
+ /**
59
+ * `fullPath` split at its real segment boundaries, e.g. `["nodes", "node/42", "edges"]`,
60
+ * when the caller knows them. Absent means "not known here" — never derived from
61
+ * `fullPath`, since a parent id may itself contain "/".
62
+ */
63
+ pathSegments?: string[];
58
64
  fullIdPath?: string;
59
65
  collection?: EntityCollection<M>;
60
66
  /**
@@ -69,6 +69,13 @@ export interface EntityOnFetchProps<M extends Record<string, any> = any, USER ex
69
69
  * Might contain unresolved aliases.
70
70
  */
71
71
  path: string;
72
+ /**
73
+ * `path` split at its real segment boundaries, e.g. `["nodes", "node/42", "edges"]`.
74
+ *
75
+ * Optional, and never derived by splitting `path` — a parent entity id may itself
76
+ * contain "/". Absent means "not known here", not "no slashes".
77
+ */
78
+ pathSegments?: string[];
72
79
  /**
73
80
  * Fetched entity
74
81
  */
@@ -106,6 +113,13 @@ export interface EntityOnSaveProps<M extends Record<string, any> = any, USER ext
106
113
  * Might contain unresolved aliases.
107
114
  */
108
115
  path: string;
116
+ /**
117
+ * `path` split at its real segment boundaries, e.g. `["nodes", "node/42", "edges"]`.
118
+ *
119
+ * Optional, and never derived by splitting `path` — a parent entity id may itself
120
+ * contain "/". Absent means "not known here", not "no slashes".
121
+ */
122
+ pathSegments?: string[];
109
123
  /**
110
124
  * Full path where this entity is being saved, with alias resolved
111
125
  */
@@ -144,6 +158,13 @@ export interface EntityOnDeleteProps<M extends Record<string, any> = any, USER e
144
158
  * Path of the parent collection
145
159
  */
146
160
  path: string;
161
+ /**
162
+ * `path` split at its real segment boundaries, e.g. `["nodes", "node/42", "edges"]`.
163
+ *
164
+ * Optional, and never derived by splitting `path` — a parent entity id may itself
165
+ * contain "/". Absent means "not known here", not "no slashes".
166
+ */
167
+ pathSegments?: string[];
147
168
  /**
148
169
  * Deleted entity id
149
170
  */
@@ -65,9 +65,26 @@ export type FireCMSProps<USER extends User> = {
65
65
  loading: boolean;
66
66
  }) => React.ReactNode;
67
67
  /**
68
- * If you have a custom API key, you can use it here.
68
+ * Your FireCMS PRO license key. It is checked against
69
+ * `https://api.firecms.co/access_log` when a user signs in.
69
70
  */
70
71
  apiKey?: string;
72
+ /**
73
+ * On sign-in FireCMS sends one request to `https://api.firecms.co/access_log`
74
+ * with the user's ID token (which carries the Firebase project id, the uid
75
+ * and the email), the user's email, the datasource key and the keys of the
76
+ * mounted plugins; the browser adds the page's referrer. It is how the
77
+ * FireCMS PRO license and trial are checked. No database credentials or
78
+ * content are sent.
79
+ *
80
+ * Set to `false` to skip that request. This only takes effect when the
81
+ * app has no `apiKey` and mounts no PRO plugin (collection editor, user
82
+ * management, import/export, entity history, data enhancement, DataTalk):
83
+ * otherwise the request is the license check and is always sent.
84
+ *
85
+ * Defaults to `true`.
86
+ */
87
+ telemetry?: boolean;
71
88
  /**
72
89
  * Record of custom form fields to be used in the CMS.
73
90
  * You can use the key to reference the custom field in
@@ -11,6 +11,7 @@ import { DialogsController } from "./dialogs_controller";
11
11
  import { CustomizationController } from "./customization_controller";
12
12
  import { AnalyticsController } from "./analytics_controller";
13
13
  import { InternalUserManagement } from "./internal_user_management";
14
+ import { AccessResponse } from "./license";
14
15
  /**
15
16
  * Context that includes the internal controllers and contexts used by the app.
16
17
  * Some controllers and context included in this context can be accessed
@@ -83,4 +84,11 @@ export type FireCMSContext<USER extends User = User, AuthControllerType extends
83
84
  * section will be implemented automatically.
84
85
  */
85
86
  userManagement: InternalUserManagement<USER>;
87
+ /**
88
+ * FireCMS license status of this project, `null` until the license check
89
+ * answers or when it is not sent. PRO plugins are paused while `blocked`
90
+ * is true.
91
+ * @see useLicenseStatus
92
+ */
93
+ licenseStatus?: AccessResponse | null;
86
94
  };
@@ -29,3 +29,4 @@ export * from "./modify_collections";
29
29
  export * from "./analytics_controller";
30
30
  export * from "./customization_controller";
31
31
  export * from "./translations";
32
+ export * from "./license";
@@ -0,0 +1,55 @@
1
+ /**
2
+ * What the FireCMS license check says about this project.
3
+ *
4
+ * - `not_required`: no PRO plugin is mounted.
5
+ * - `whitelisted`: the project is exempt from licensing.
6
+ * - `licensed`: a license covers this project.
7
+ * - `trial`: PRO plugins run on the free trial; see `daysLeft` and `trialEndsAt`.
8
+ * - `expired`: the trial ended without a license. PRO plugins are paused.
9
+ * - `invalid_project`: a license key was presented, but this project is not
10
+ * linked to that license. PRO plugins are paused.
11
+ * - `over_quota`: the license links more projects than it pays for, and this
12
+ * is not one of the projects it covers in production. PRO plugins are
13
+ * paused.
14
+ *
15
+ * @group Models
16
+ */
17
+ export type LicenseState = "not_required" | "whitelisted" | "licensed" | "trial" | "expired" | "invalid_project" | "over_quota";
18
+ /**
19
+ * Response of the FireCMS license check (`POST https://api.firecms.co/access_log`).
20
+ *
21
+ * Servers older than the PRO relaunch send only `blocked` and `message`, so
22
+ * treat a missing `licenseState` as unknown. `blocked` is honoured either way.
23
+ *
24
+ * @group Models
25
+ */
26
+ export type AccessResponse = {
27
+ /**
28
+ * True when the PRO plugins must be paused. The core CMS is never blocked.
29
+ */
30
+ blocked?: boolean;
31
+ licenseState?: LicenseState;
32
+ /**
33
+ * Number of projects the license pays for. Present with `licensed` and `over_quota`.
34
+ */
35
+ licensedProjects?: number;
36
+ /**
37
+ * Number of projects linked to the license.
38
+ */
39
+ linkedProjects?: number;
40
+ projectId?: string;
41
+ licenseId?: string;
42
+ /**
43
+ * ISO date the trial ends or ended. Present with `trial` and `expired`.
44
+ */
45
+ trialEndsAt?: string;
46
+ /**
47
+ * Whole days left in the trial, present with `trial`.
48
+ */
49
+ daysLeft?: number;
50
+ /**
51
+ * Where to get or update a license for this project.
52
+ */
53
+ subscribeUrl?: string;
54
+ message?: string;
55
+ };