@nextsparkjs/core 0.1.0-beta.188 → 0.1.0-beta.189

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 (412) hide show
  1. package/dist/components/api/keys/ApiKeyDisplay.js +19 -19
  2. package/dist/components/api/keys/CreateApiKeyDialog.js +21 -21
  3. package/dist/components/app/layouts/PublicNavbar.d.ts.map +1 -1
  4. package/dist/components/app/layouts/PublicNavbar.js +34 -16
  5. package/dist/components/app/misc/ThemeToggle.d.ts.map +1 -1
  6. package/dist/components/app/misc/ThemeToggle.js +3 -4
  7. package/dist/components/auth/SessionCookieRefresher.d.ts +5 -0
  8. package/dist/components/auth/SessionCookieRefresher.d.ts.map +1 -1
  9. package/dist/components/auth/SessionCookieRefresher.js +7 -1
  10. package/dist/components/auth/forms/LoginForm.d.ts.map +1 -1
  11. package/dist/components/auth/forms/LoginForm.js +49 -12
  12. package/dist/components/auth/forms/SignupForm.d.ts.map +1 -1
  13. package/dist/components/auth/forms/SignupForm.js +4 -3
  14. package/dist/components/dashboard/block-editor/block-settings-panel.js +1 -1
  15. package/dist/components/dashboard/block-editor/floating-block-toolbar.js +1 -1
  16. package/dist/components/dashboard/block-editor/sortable-block.js +1 -1
  17. package/dist/components/dashboard/layouts/Sidebar.d.ts.map +1 -1
  18. package/dist/components/dashboard/layouts/Sidebar.js +8 -6
  19. package/dist/components/dashboard/layouts/TopNavbar.d.ts.map +1 -1
  20. package/dist/components/dashboard/layouts/TopNavbar.js +51 -54
  21. package/dist/components/dashboard/misc/NotificationsDropdown.d.ts.map +1 -1
  22. package/dist/components/dashboard/misc/NotificationsDropdown.js +17 -15
  23. package/dist/components/dashboard/misc/SearchDropdown.d.ts.map +1 -1
  24. package/dist/components/dashboard/misc/SearchDropdown.js +19 -22
  25. package/dist/components/dashboard/mobile/MobileBottomNav.js +1 -1
  26. package/dist/components/dashboard/mobile/MobileTopBar.js +2 -2
  27. package/dist/components/dashboard/navigation/DynamicNavigation.js +5 -5
  28. package/dist/components/devtools/BlockDetailViewer.js +1 -1
  29. package/dist/components/devtools/BlocksViewer.js +1 -1
  30. package/dist/components/entities/EntityChildManager.js +5 -5
  31. package/dist/components/entities/EntityDetailPage.d.ts.map +1 -1
  32. package/dist/components/entities/EntityDetailPage.js +16 -15
  33. package/dist/components/entities/EntityFieldRenderer.d.ts.map +1 -1
  34. package/dist/components/entities/EntityFieldRenderer.js +12 -7
  35. package/dist/components/entities/EntityPageHeader.js +5 -5
  36. package/dist/components/entities/ErrorBoundary.d.ts.map +1 -1
  37. package/dist/components/entities/ErrorBoundary.js +20 -21
  38. package/dist/components/entities/wrappers/EntityDetailWrapper.js +5 -5
  39. package/dist/components/entities/wrappers/EntityFormWrapper.js +2 -2
  40. package/dist/components/entities/wrappers/EntityListWrapper.js +3 -3
  41. package/dist/components/permissions/NoPermission.js +10 -10
  42. package/dist/components/public/pageBuilder/PageRenderer.d.ts.map +1 -1
  43. package/dist/components/public/pageBuilder/PageRenderer.js +2 -1
  44. package/dist/components/settings/SettingsPageSkeleton.js +4 -4
  45. package/dist/components/settings/layouts/SettingsSidebar.js +6 -6
  46. package/dist/components/shared/MultiSelectFilter.d.ts +3 -1
  47. package/dist/components/shared/MultiSelectFilter.d.ts.map +1 -1
  48. package/dist/components/shared/MultiSelectFilter.js +7 -3
  49. package/dist/components/shared/SearchInput.d.ts +2 -0
  50. package/dist/components/shared/SearchInput.d.ts.map +1 -1
  51. package/dist/components/shared/SearchInput.js +64 -6
  52. package/dist/components/ui/address-input.js +18 -18
  53. package/dist/components/ui/audio-upload.js +9 -9
  54. package/dist/components/ui/combobox.d.ts.map +1 -1
  55. package/dist/components/ui/combobox.js +4 -4
  56. package/dist/components/ui/country-select.d.ts.map +1 -1
  57. package/dist/components/ui/country-select.js +3 -3
  58. package/dist/components/ui/currency-select.d.ts.map +1 -1
  59. package/dist/components/ui/currency-select.js +3 -3
  60. package/dist/components/ui/dynamic-icon.d.ts.map +1 -1
  61. package/dist/components/ui/dynamic-icon.js +3 -2
  62. package/dist/components/ui/file-upload.js +7 -7
  63. package/dist/components/ui/image-upload.js +8 -8
  64. package/dist/components/ui/multi-select.d.ts +2 -1
  65. package/dist/components/ui/multi-select.d.ts.map +1 -1
  66. package/dist/components/ui/multi-select.js +4 -3
  67. package/dist/components/ui/phone-input.d.ts.map +1 -1
  68. package/dist/components/ui/phone-input.js +3 -3
  69. package/dist/components/ui/relation-display.js +1 -1
  70. package/dist/components/ui/simple-relation-select.d.ts +2 -1
  71. package/dist/components/ui/simple-relation-select.d.ts.map +1 -1
  72. package/dist/components/ui/simple-relation-select.js +7 -6
  73. package/dist/components/ui/tags-input.d.ts.map +1 -1
  74. package/dist/components/ui/tags-input.js +1 -1
  75. package/dist/components/ui/timezone-select.d.ts.map +1 -1
  76. package/dist/components/ui/timezone-select.js +3 -3
  77. package/dist/components/ui/user-display.js +4 -4
  78. package/dist/components/ui/user-select.d.ts.map +1 -1
  79. package/dist/components/ui/user-select.js +9 -9
  80. package/dist/components/ui/video-upload.js +9 -9
  81. package/dist/contexts/SubscriptionContext.d.ts.map +1 -1
  82. package/dist/contexts/SubscriptionContext.js +5 -1
  83. package/dist/contexts/TeamContext.d.ts.map +1 -1
  84. package/dist/contexts/TeamContext.js +83 -26
  85. package/dist/emails/otp-verification.d.ts.map +1 -1
  86. package/dist/emails/otp-verification.js +3 -2
  87. package/dist/hooks/useAccountPreferencesSync.d.ts +13 -0
  88. package/dist/hooks/useAccountPreferencesSync.d.ts.map +1 -0
  89. package/dist/hooks/useAccountPreferencesSync.js +95 -0
  90. package/dist/hooks/useAuth.d.ts +202 -15
  91. package/dist/hooks/useAuth.d.ts.map +1 -1
  92. package/dist/hooks/useAuth.js +49 -13
  93. package/dist/hooks/useEntityConfig.js +2 -2
  94. package/dist/hooks/useEntitySearch.js +10 -10
  95. package/dist/hooks/useNotifications.js +12 -12
  96. package/dist/hooks/usePrefetch.d.ts.map +1 -1
  97. package/dist/hooks/usePrefetch.js +6 -2
  98. package/dist/hooks/useSearch.js +15 -15
  99. package/dist/hooks/useSessionCookieRefresh.d.ts +18 -1
  100. package/dist/hooks/useSessionCookieRefresh.d.ts.map +1 -1
  101. package/dist/hooks/useSessionCookieRefresh.js +17 -4
  102. package/dist/hooks/useSessionHint.d.ts +12 -0
  103. package/dist/hooks/useSessionHint.d.ts.map +1 -0
  104. package/dist/hooks/useSessionHint.js +15 -0
  105. package/dist/hooks/useTranslationPreload.js +6 -6
  106. package/dist/i18n.d.ts +13 -0
  107. package/dist/i18n.d.ts.map +1 -1
  108. package/dist/i18n.js +2 -27
  109. package/dist/lib/actions/entity.actions.d.ts.map +1 -1
  110. package/dist/lib/actions/entity.actions.js +3 -2
  111. package/dist/lib/api/auth/dual-auth.d.ts +4 -1
  112. package/dist/lib/api/auth/dual-auth.d.ts.map +1 -1
  113. package/dist/lib/api/auth/dual-auth.js +5 -16
  114. package/dist/lib/api/entities.js +33 -33
  115. package/dist/lib/api/keys.d.ts +27 -27
  116. package/dist/lib/api/keys.js +27 -27
  117. package/dist/lib/auth/callback-url.d.ts +11 -0
  118. package/dist/lib/auth/callback-url.d.ts.map +1 -0
  119. package/dist/lib/auth/callback-url.js +14 -0
  120. package/dist/lib/auth/otp-config.d.ts +55 -0
  121. package/dist/lib/auth/otp-config.d.ts.map +1 -0
  122. package/dist/lib/auth/otp-config.js +48 -0
  123. package/dist/lib/auth/registration-helpers.d.ts.map +1 -1
  124. package/dist/lib/auth/registration-helpers.js +3 -1
  125. package/dist/lib/auth/session-hint.d.ts +31 -0
  126. package/dist/lib/auth/session-hint.d.ts.map +1 -0
  127. package/dist/lib/auth/session-hint.js +37 -0
  128. package/dist/lib/auth.d.ts.map +1 -1
  129. package/dist/lib/auth.js +6 -4
  130. package/dist/lib/blocks/loader.d.ts +3 -11
  131. package/dist/lib/blocks/loader.d.ts.map +1 -1
  132. package/dist/lib/blocks/loader.js +1 -9
  133. package/dist/lib/blocks/loader.server.d.ts +18 -0
  134. package/dist/lib/blocks/loader.server.d.ts.map +1 -0
  135. package/dist/lib/blocks/loader.server.js +11 -0
  136. package/dist/lib/blocks/sanitize-html.d.ts +31 -0
  137. package/dist/lib/blocks/sanitize-html.d.ts.map +1 -0
  138. package/dist/lib/blocks/sanitize-html.js +60 -0
  139. package/dist/lib/config/config-sync.d.ts +1 -0
  140. package/dist/lib/config/config-sync.d.ts.map +1 -1
  141. package/dist/lib/config/config-sync.js +4 -1
  142. package/dist/lib/config/types.d.ts +48 -0
  143. package/dist/lib/config/types.d.ts.map +1 -1
  144. package/dist/lib/email/types.d.ts +6 -0
  145. package/dist/lib/email/types.d.ts.map +1 -1
  146. package/dist/lib/entities/serialization.d.ts.map +1 -1
  147. package/dist/lib/entities/serialization.js +3 -6
  148. package/dist/lib/icons.d.ts +12 -0
  149. package/dist/lib/icons.d.ts.map +1 -0
  150. package/dist/lib/icons.js +30 -0
  151. package/dist/lib/locale.d.ts +25 -1
  152. package/dist/lib/locale.d.ts.map +1 -1
  153. package/dist/lib/locale.js +49 -35
  154. package/dist/lib/mcp/engine.js +1 -1
  155. package/dist/lib/mcp/errors.js +17 -17
  156. package/dist/lib/mcp/schema-builder.js +16 -16
  157. package/dist/lib/mcp/tool-generator.js +18 -18
  158. package/dist/lib/search-highlighting.d.ts +7 -0
  159. package/dist/lib/search-highlighting.d.ts.map +1 -1
  160. package/dist/lib/search-highlighting.js +6 -2
  161. package/dist/lib/selectors/core-selectors.d.ts +2 -0
  162. package/dist/lib/selectors/core-selectors.d.ts.map +1 -1
  163. package/dist/lib/selectors/domains/auth.selectors.d.ts +1 -0
  164. package/dist/lib/selectors/domains/auth.selectors.d.ts.map +1 -1
  165. package/dist/lib/selectors/domains/auth.selectors.js +1 -0
  166. package/dist/lib/selectors/domains/entities.selectors.d.ts +2 -0
  167. package/dist/lib/selectors/domains/entities.selectors.d.ts.map +1 -1
  168. package/dist/lib/selectors/domains/entities.selectors.js +2 -0
  169. package/dist/lib/selectors/selectors.d.ts +4 -0
  170. package/dist/lib/selectors/selectors.d.ts.map +1 -1
  171. package/dist/lib/services/block.service.js +1 -1
  172. package/dist/lib/teams/active-team-cookie.d.ts +24 -0
  173. package/dist/lib/teams/active-team-cookie.d.ts.map +1 -0
  174. package/dist/lib/teams/active-team-cookie.js +17 -0
  175. package/dist/lib/teams/dashboard-team.d.ts +20 -0
  176. package/dist/lib/teams/dashboard-team.d.ts.map +1 -0
  177. package/dist/lib/teams/dashboard-team.js +38 -0
  178. package/dist/lib/teams/schema.d.ts.map +1 -1
  179. package/dist/lib/teams/schema.js +1 -1
  180. package/dist/lib/template-resolver.d.ts.map +1 -1
  181. package/dist/lib/template-resolver.js +0 -1
  182. package/dist/lib/theme/get-default-theme-mode.d.ts +7 -4
  183. package/dist/lib/theme/get-default-theme-mode.d.ts.map +1 -1
  184. package/dist/lib/theme/get-default-theme-mode.js +2 -44
  185. package/dist/messages/de/auth.json +4 -2
  186. package/dist/messages/de/common.json +83 -3
  187. package/dist/messages/de/email.json +1 -1
  188. package/dist/messages/de/index.d.ts +87 -0
  189. package/dist/messages/de/index.d.ts.map +1 -1
  190. package/dist/messages/de/settings.json +5 -0
  191. package/dist/messages/en/auth.json +4 -2
  192. package/dist/messages/en/common.json +83 -3
  193. package/dist/messages/en/email.json +1 -1
  194. package/dist/messages/en/index.d.ts +86 -0
  195. package/dist/messages/en/index.d.ts.map +1 -1
  196. package/dist/messages/en/settings.json +4 -0
  197. package/dist/messages/es/auth.json +4 -2
  198. package/dist/messages/es/common.json +83 -3
  199. package/dist/messages/es/email.json +1 -1
  200. package/dist/messages/es/index.d.ts +86 -0
  201. package/dist/messages/es/index.d.ts.map +1 -1
  202. package/dist/messages/es/settings.json +4 -0
  203. package/dist/messages/fr/auth.json +4 -2
  204. package/dist/messages/fr/common.json +83 -3
  205. package/dist/messages/fr/email.json +1 -1
  206. package/dist/messages/fr/index.d.ts +87 -0
  207. package/dist/messages/fr/index.d.ts.map +1 -1
  208. package/dist/messages/fr/settings.json +5 -0
  209. package/dist/messages/it/auth.json +4 -2
  210. package/dist/messages/it/common.json +83 -3
  211. package/dist/messages/it/email.json +1 -1
  212. package/dist/messages/it/index.d.ts +87 -0
  213. package/dist/messages/it/index.d.ts.map +1 -1
  214. package/dist/messages/it/settings.json +5 -0
  215. package/dist/messages/pt/auth.json +4 -2
  216. package/dist/messages/pt/common.json +83 -3
  217. package/dist/messages/pt/email.json +1 -1
  218. package/dist/messages/pt/index.d.ts +87 -0
  219. package/dist/messages/pt/index.d.ts.map +1 -1
  220. package/dist/messages/pt/settings.json +5 -0
  221. package/dist/nextspark-registries.d.ts +54 -0
  222. package/dist/providers/DashboardProviders.d.ts +13 -10
  223. package/dist/providers/DashboardProviders.d.ts.map +1 -1
  224. package/dist/providers/DashboardProviders.js +7 -1
  225. package/dist/templates/app/(auth)/forgot-password/page.tsx +2 -2
  226. package/dist/templates/app/(auth)/reset-password/page.tsx +6 -6
  227. package/dist/templates/app/403/page.tsx +6 -6
  228. package/dist/templates/app/api/v1/teams/switch/route.ts +24 -5
  229. package/dist/templates/app/dashboard/(main)/[entity]/layout.tsx +9 -7
  230. package/dist/templates/app/dashboard/(main)/layout.tsx +4 -3
  231. package/dist/templates/app/dashboard/settings/api-keys/page.tsx +36 -34
  232. package/dist/templates/app/dashboard/settings/profile/page.tsx +7 -6
  233. package/dist/templates/app/dashboard/settings/security/page.tsx +5 -4
  234. package/dist/templates/app/layout.ppr.tsx +8 -8
  235. package/dist/templates/app/layout.tsx +12 -17
  236. package/dist/templates/blocks/cta-section/component.tsx +5 -2
  237. package/dist/templates/blocks/cta-section/config.ts +3 -2
  238. package/dist/templates/blocks/cta-section/fields.ts +2 -2
  239. package/dist/templates/blocks/cta-section/schema.ts +2 -2
  240. package/dist/templates/blocks/features-grid/component.tsx +10 -2
  241. package/dist/templates/blocks/features-grid/config.ts +3 -2
  242. package/dist/templates/blocks/features-grid/fields.ts +2 -2
  243. package/dist/templates/blocks/features-grid/schema.ts +2 -2
  244. package/dist/templates/blocks/hero/component.tsx +6 -3
  245. package/dist/templates/blocks/hero/config.ts +3 -2
  246. package/dist/templates/blocks/hero/fields.ts +2 -2
  247. package/dist/templates/blocks/hero/schema.ts +2 -2
  248. package/dist/templates/blocks/testimonials/component.tsx +6 -3
  249. package/dist/templates/blocks/testimonials/config.ts +3 -2
  250. package/dist/templates/blocks/testimonials/fields.ts +2 -2
  251. package/dist/templates/blocks/testimonials/schema.ts +2 -2
  252. package/dist/templates/blocks/text-content/component.tsx +7 -3
  253. package/dist/templates/blocks/text-content/config.ts +3 -2
  254. package/dist/templates/blocks/text-content/fields.ts +2 -2
  255. package/dist/templates/blocks/text-content/schema.ts +2 -2
  256. package/dist/templates/contents/themes/starter/blocks/cta-section/component.tsx +102 -0
  257. package/dist/templates/contents/themes/starter/blocks/cta-section/config.ts +11 -0
  258. package/dist/templates/contents/themes/starter/blocks/cta-section/fields.ts +89 -0
  259. package/dist/templates/contents/themes/starter/blocks/cta-section/index.ts +6 -0
  260. package/dist/templates/contents/themes/starter/blocks/cta-section/schema.ts +32 -0
  261. package/dist/templates/contents/themes/starter/blocks/cta-section/thumbnail.png +0 -0
  262. package/dist/templates/contents/themes/starter/blocks/features-grid/component.tsx +119 -0
  263. package/dist/templates/contents/themes/starter/blocks/features-grid/config.ts +11 -0
  264. package/dist/templates/contents/themes/starter/blocks/features-grid/fields.ts +97 -0
  265. package/dist/templates/contents/themes/starter/blocks/features-grid/index.ts +6 -0
  266. package/dist/templates/contents/themes/starter/blocks/features-grid/schema.ts +40 -0
  267. package/dist/templates/contents/themes/starter/blocks/features-grid/thumbnail.png +0 -0
  268. package/dist/templates/contents/themes/starter/blocks/hero/component.tsx +105 -0
  269. package/dist/templates/contents/themes/starter/blocks/hero/config.ts +11 -0
  270. package/dist/templates/contents/themes/starter/blocks/hero/fields.ts +60 -0
  271. package/dist/templates/contents/themes/starter/blocks/hero/index.ts +6 -0
  272. package/dist/templates/contents/themes/starter/blocks/hero/schema.ts +33 -0
  273. package/dist/templates/contents/themes/starter/blocks/hero/thumbnail.png +0 -0
  274. package/dist/templates/contents/themes/starter/blocks/testimonials/component.tsx +116 -0
  275. package/dist/templates/contents/themes/starter/blocks/testimonials/config.ts +11 -0
  276. package/dist/templates/contents/themes/starter/blocks/testimonials/fields.ts +105 -0
  277. package/dist/templates/contents/themes/starter/blocks/testimonials/index.ts +6 -0
  278. package/dist/templates/contents/themes/starter/blocks/testimonials/schema.ts +41 -0
  279. package/dist/templates/contents/themes/starter/blocks/testimonials/thumbnail.png +0 -0
  280. package/dist/templates/contents/themes/starter/blocks/text-content/component.tsx +100 -0
  281. package/dist/templates/contents/themes/starter/blocks/text-content/config.ts +11 -0
  282. package/dist/templates/contents/themes/starter/blocks/text-content/fields.ts +88 -0
  283. package/dist/templates/contents/themes/starter/blocks/text-content/index.ts +6 -0
  284. package/dist/templates/contents/themes/starter/blocks/text-content/schema.ts +30 -0
  285. package/dist/templates/contents/themes/starter/blocks/text-content/thumbnail.png +0 -0
  286. package/dist/templates/contents/themes/starter/config/app.config.ts +8 -0
  287. package/dist/templates/contents/themes/starter/entities/tasks/tasks.config.ts +7 -0
  288. package/dist/templates/contents/themes/starter/tests/cypress/e2e/_utils/devtools/access.cy.ts +9 -1
  289. package/dist/templates/contents/themes/starter/tests/cypress/e2e/api/entities/tasks/TaskAPIController.js +2 -2
  290. package/dist/templates/contents/themes/starter/tests/cypress/e2e/uat/entities/tasks/tasks-crud.cy.ts +45 -38
  291. package/dist/templates/contents/themes/starter/tests/cypress/fixtures/entities.json +16 -0
  292. package/dist/templates/contents/themes/starter/tests/cypress/src/components/DevKeyringPOM.ts +3 -1
  293. package/dist/templates/contents/themes/starter/tests/cypress/src/core/BlockEditorBasePOM.ts +3 -3
  294. package/dist/templates/contents/themes/starter/tests/cypress/src/entities/PagesPOM.ts +137 -0
  295. package/dist/templates/contents/themes/starter/tests/cypress/src/entities/index.ts +2 -0
  296. package/dist/templates/contents/themes/starter/tests/cypress/src/index.ts +1 -0
  297. package/dist/templates/contents/themes/starter/tests/cypress/src/session-helpers.ts +42 -11
  298. package/dist/templates/contents/themes/starter/tests/cypress/support/commands.ts +29 -18
  299. package/dist/templates/features/blog/blocks/post-content/component.tsx +5 -1
  300. package/dist/templates/features/blog/blocks/post-content/schema.ts +1 -1
  301. package/dist/templates/features/pages/blocks/hero/component.tsx +3 -0
  302. package/dist/templates/features/pages/blocks/hero/schema.ts +1 -1
  303. package/dist/templates/proxy.ts +138 -53
  304. package/dist/types/blocks.d.ts.map +1 -1
  305. package/dist/types/blocks.js +1 -1
  306. package/dist/types/task.types.d.ts +1 -1
  307. package/dist/types/task.types.js +7 -7
  308. package/dist/utils/dev/TranslationDebugger.js +2 -2
  309. package/package.json +14 -5
  310. package/scripts/build/registry/__tests__/block-registry.test.mjs +73 -0
  311. package/scripts/build/registry/__tests__/icons-discovery.test.mjs +130 -0
  312. package/scripts/build/registry/__tests__/identifier.test.mjs +65 -0
  313. package/scripts/build/registry/__tests__/page-generator.test.mjs +430 -0
  314. package/scripts/build/registry/__tests__/scheduled-actions-registry.test.mjs +41 -0
  315. package/scripts/build/registry/__tests__/template-registry.test.mjs +89 -0
  316. package/scripts/build/registry/discovery/icons.mjs +275 -0
  317. package/scripts/build/registry/discovery/index.mjs +1 -0
  318. package/scripts/build/registry/generators/block-registry.mjs +203 -55
  319. package/scripts/build/registry/generators/feature-registry.mjs +9 -2
  320. package/scripts/build/registry/generators/icon-registry.mjs +56 -0
  321. package/scripts/build/registry/generators/identifier.mjs +28 -0
  322. package/scripts/build/registry/generators/index.mjs +1 -0
  323. package/scripts/build/registry/generators/plugin-registry.mjs +4 -3
  324. package/scripts/build/registry/generators/scheduled-actions-registry.mjs +4 -2
  325. package/scripts/build/registry/generators/template-registry.mjs +49 -41
  326. package/scripts/build/registry/generators/theme-registry.mjs +6 -7
  327. package/scripts/build/registry/post-build/page-generator.mjs +380 -59
  328. package/scripts/build/registry.mjs +9 -1
  329. package/templates/app/(auth)/forgot-password/page.tsx +2 -2
  330. package/templates/app/(auth)/reset-password/page.tsx +6 -6
  331. package/templates/app/403/page.tsx +6 -6
  332. package/templates/app/api/v1/teams/switch/route.ts +24 -5
  333. package/templates/app/dashboard/(main)/[entity]/layout.tsx +9 -7
  334. package/templates/app/dashboard/(main)/layout.tsx +4 -3
  335. package/templates/app/dashboard/settings/api-keys/page.tsx +36 -34
  336. package/templates/app/dashboard/settings/profile/page.tsx +7 -6
  337. package/templates/app/dashboard/settings/security/page.tsx +5 -4
  338. package/templates/app/layout.ppr.tsx +8 -8
  339. package/templates/app/layout.tsx +12 -17
  340. package/templates/blocks/cta-section/component.tsx +5 -2
  341. package/templates/blocks/cta-section/config.ts +3 -2
  342. package/templates/blocks/cta-section/fields.ts +2 -2
  343. package/templates/blocks/cta-section/schema.ts +2 -2
  344. package/templates/blocks/features-grid/component.tsx +10 -2
  345. package/templates/blocks/features-grid/config.ts +3 -2
  346. package/templates/blocks/features-grid/fields.ts +2 -2
  347. package/templates/blocks/features-grid/schema.ts +2 -2
  348. package/templates/blocks/hero/component.tsx +6 -3
  349. package/templates/blocks/hero/config.ts +3 -2
  350. package/templates/blocks/hero/fields.ts +2 -2
  351. package/templates/blocks/hero/schema.ts +2 -2
  352. package/templates/blocks/testimonials/component.tsx +6 -3
  353. package/templates/blocks/testimonials/config.ts +3 -2
  354. package/templates/blocks/testimonials/fields.ts +2 -2
  355. package/templates/blocks/testimonials/schema.ts +2 -2
  356. package/templates/blocks/text-content/component.tsx +7 -3
  357. package/templates/blocks/text-content/config.ts +3 -2
  358. package/templates/blocks/text-content/fields.ts +2 -2
  359. package/templates/blocks/text-content/schema.ts +2 -2
  360. package/templates/contents/themes/starter/blocks/cta-section/component.tsx +102 -0
  361. package/templates/contents/themes/starter/blocks/cta-section/config.ts +11 -0
  362. package/templates/contents/themes/starter/blocks/cta-section/fields.ts +89 -0
  363. package/templates/contents/themes/starter/blocks/cta-section/index.ts +6 -0
  364. package/templates/contents/themes/starter/blocks/cta-section/schema.ts +32 -0
  365. package/templates/contents/themes/starter/blocks/cta-section/thumbnail.png +0 -0
  366. package/templates/contents/themes/starter/blocks/features-grid/component.tsx +119 -0
  367. package/templates/contents/themes/starter/blocks/features-grid/config.ts +11 -0
  368. package/templates/contents/themes/starter/blocks/features-grid/fields.ts +97 -0
  369. package/templates/contents/themes/starter/blocks/features-grid/index.ts +6 -0
  370. package/templates/contents/themes/starter/blocks/features-grid/schema.ts +40 -0
  371. package/templates/contents/themes/starter/blocks/features-grid/thumbnail.png +0 -0
  372. package/templates/contents/themes/starter/blocks/hero/component.tsx +105 -0
  373. package/templates/contents/themes/starter/blocks/hero/config.ts +11 -0
  374. package/templates/contents/themes/starter/blocks/hero/fields.ts +60 -0
  375. package/templates/contents/themes/starter/blocks/hero/index.ts +6 -0
  376. package/templates/contents/themes/starter/blocks/hero/schema.ts +33 -0
  377. package/templates/contents/themes/starter/blocks/hero/thumbnail.png +0 -0
  378. package/templates/contents/themes/starter/blocks/testimonials/component.tsx +116 -0
  379. package/templates/contents/themes/starter/blocks/testimonials/config.ts +11 -0
  380. package/templates/contents/themes/starter/blocks/testimonials/fields.ts +105 -0
  381. package/templates/contents/themes/starter/blocks/testimonials/index.ts +6 -0
  382. package/templates/contents/themes/starter/blocks/testimonials/schema.ts +41 -0
  383. package/templates/contents/themes/starter/blocks/testimonials/thumbnail.png +0 -0
  384. package/templates/contents/themes/starter/blocks/text-content/component.tsx +100 -0
  385. package/templates/contents/themes/starter/blocks/text-content/config.ts +11 -0
  386. package/templates/contents/themes/starter/blocks/text-content/fields.ts +88 -0
  387. package/templates/contents/themes/starter/blocks/text-content/index.ts +6 -0
  388. package/templates/contents/themes/starter/blocks/text-content/schema.ts +30 -0
  389. package/templates/contents/themes/starter/blocks/text-content/thumbnail.png +0 -0
  390. package/templates/contents/themes/starter/config/app.config.ts +8 -0
  391. package/templates/contents/themes/starter/entities/tasks/tasks.config.ts +7 -0
  392. package/templates/contents/themes/starter/tests/cypress/e2e/_utils/devtools/access.cy.ts +9 -1
  393. package/templates/contents/themes/starter/tests/cypress/e2e/api/entities/tasks/TaskAPIController.js +2 -2
  394. package/templates/contents/themes/starter/tests/cypress/e2e/uat/entities/tasks/tasks-crud.cy.ts +45 -38
  395. package/templates/contents/themes/starter/tests/cypress/fixtures/entities.json +16 -0
  396. package/templates/contents/themes/starter/tests/cypress/src/components/DevKeyringPOM.ts +3 -1
  397. package/templates/contents/themes/starter/tests/cypress/src/core/BlockEditorBasePOM.ts +3 -3
  398. package/templates/contents/themes/starter/tests/cypress/src/entities/PagesPOM.ts +137 -0
  399. package/templates/contents/themes/starter/tests/cypress/src/entities/index.ts +2 -0
  400. package/templates/contents/themes/starter/tests/cypress/src/index.ts +1 -0
  401. package/templates/contents/themes/starter/tests/cypress/src/session-helpers.ts +42 -11
  402. package/templates/contents/themes/starter/tests/cypress/support/commands.ts +29 -18
  403. package/templates/features/blog/blocks/post-content/component.tsx +5 -1
  404. package/templates/features/blog/blocks/post-content/schema.ts +1 -1
  405. package/templates/features/pages/blocks/hero/component.tsx +3 -0
  406. package/templates/features/pages/blocks/hero/schema.ts +1 -1
  407. package/templates/proxy.ts +138 -53
  408. package/tests/jest/__mocks__/@nextsparkjs/registries/block-registry.client.ts +9 -0
  409. package/tests/jest/__mocks__/@nextsparkjs/registries/block-registry.lazy.ts +5 -0
  410. package/tests/jest/__mocks__/@nextsparkjs/registries/icon-registry.ts +42 -0
  411. package/tests/jest/__mocks__/next-intl-server.js +85 -5
  412. package/tests/jest/__mocks__/next-server.js +32 -0
@@ -16,7 +16,7 @@ import {
16
16
  ArrowRight
17
17
  } from "lucide-react";
18
18
  import { useEntitySearch } from "../../../hooks/useEntitySearch.js";
19
- import { formatSearchResult } from "../../../lib/search-highlighting.js";
19
+ import { formatSearchResult, escapeHtml } from "../../../lib/search-highlighting.js";
20
20
  import { cn } from "../../../lib/utils/index.js";
21
21
  import { sel, createAriaLabel } from "../../../lib/test/index.js";
22
22
  import { useTranslations } from "next-intl";
@@ -33,19 +33,19 @@ const getTypeIcon = (result) => {
33
33
  return /* @__PURE__ */ jsx(Search, { className: "h-4 w-4" });
34
34
  }
35
35
  };
36
- const getTypeLabel = (result, locale = "es") => {
36
+ const getTypeLabel = (result, t) => {
37
37
  if (result.type === "entity") {
38
- return locale === "en" ? "Entity" : "Entidad";
38
+ return t("search.entityLabel");
39
39
  }
40
40
  switch (result.category) {
41
41
  case "Settings":
42
- return locale === "en" ? "Setting" : "Configuraci\xF3n";
42
+ return t("search.settingLabel");
43
43
  case "Navigation":
44
- return locale === "en" ? "Page" : "P\xE1gina";
44
+ return t("search.pageLabel");
45
45
  case "Entities":
46
- return locale === "en" ? "Entity" : "Entidad";
46
+ return t("search.entityLabel");
47
47
  default:
48
- return locale === "en" ? "Result" : "Resultado";
48
+ return t("search.resultLabel");
49
49
  }
50
50
  };
51
51
  const getPriorityColor = (priority) => {
@@ -61,6 +61,7 @@ const getPriorityColor = (priority) => {
61
61
  }
62
62
  };
63
63
  function SearchResultItem({ result, onSelect, searchQuery }) {
64
+ const t = useTranslations("common");
64
65
  const handleSelect = useCallback(() => {
65
66
  onSelect();
66
67
  }, [onSelect]);
@@ -79,7 +80,7 @@ function SearchResultItem({ result, onSelect, searchQuery }) {
79
80
  "aria-label": createAriaLabel(
80
81
  "{type}: {title}{description}{limits}",
81
82
  {
82
- type: getTypeLabel(result, "es"),
83
+ type: getTypeLabel(result, t),
83
84
  title: result.title,
84
85
  description: result.description ? ` - ${result.description}` : "",
85
86
  limits: result.limitInfo ? ` (${result.limitInfo.current}/${result.limitInfo.max})` : ""
@@ -128,11 +129,11 @@ function SearchResultItem({ result, onSelect, searchQuery }) {
128
129
  "p",
129
130
  {
130
131
  className: "text-xs text-muted-foreground line-clamp-2",
131
- dangerouslySetInnerHTML: { __html: highlightedDescription || result.description }
132
+ dangerouslySetInnerHTML: { __html: highlightedDescription ?? escapeHtml(result.description) }
132
133
  }
133
134
  ),
134
135
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
135
- /* @__PURE__ */ jsx(Badge, { variant: "outline", className: "text-xs", children: getTypeLabel(result) }),
136
+ /* @__PURE__ */ jsx(Badge, { variant: "outline", className: "text-xs", children: getTypeLabel(result, t) }),
136
137
  result.category && /* @__PURE__ */ jsx(Badge, { variant: "outline", className: "text-xs", children: result.category }),
137
138
  result.type === "entity" && /* @__PURE__ */ jsx(Badge, { variant: "outline", className: "text-xs text-primary", children: result.entityType })
138
139
  ] })
@@ -177,8 +178,8 @@ function SearchDropdown() {
177
178
  setIsOpen(false);
178
179
  setSelectedIndex(-1);
179
180
  clearSearch();
180
- setStatusMessage("B\xFAsqueda cerrada");
181
- }, [clearSearch]);
181
+ setStatusMessage(t("search.closedAnnouncement"));
182
+ }, [clearSearch, t]);
182
183
  useEffect(() => {
183
184
  const handleKeyDown = (event) => {
184
185
  if (!isOpen) return;
@@ -214,12 +215,12 @@ function SearchDropdown() {
214
215
  setSelectedIndex(-1);
215
216
  if (value.trim().length > 0) {
216
217
  setIsOpen(true);
217
- setStatusMessage(`Buscando: ${value}`);
218
+ setStatusMessage(t("search.searchingFor", { value }));
218
219
  } else {
219
220
  setIsOpen(false);
220
221
  setStatusMessage("");
221
222
  }
222
- }, [setQuery]);
223
+ }, [setQuery, t]);
223
224
  const showDropdown = isOpen && (hasResults || isSearching || !isEmpty && !hasResults);
224
225
  return /* @__PURE__ */ jsxs(Fragment, { children: [
225
226
  /* @__PURE__ */ jsx(
@@ -304,15 +305,11 @@ function SearchDropdown() {
304
305
  /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mt-1", children: t("search.tryDifferent") })
305
306
  ] }) }),
306
307
  hasResults && /* @__PURE__ */ jsx("div", { className: "border-t border-border p-2", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between text-xs text-muted-foreground", children: [
307
- /* @__PURE__ */ jsxs("span", { children: [
308
- results.length,
309
- " resultado",
310
- results.length !== 1 ? "s" : ""
311
- ] }),
308
+ /* @__PURE__ */ jsx("span", { children: t("search.resultsCount", { count: results.length }) }),
312
309
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
313
- /* @__PURE__ */ jsx("span", { children: "\u2191\u2193 navegar" }),
314
- /* @__PURE__ */ jsx("span", { children: "\u21B5 seleccionar" }),
315
- /* @__PURE__ */ jsx("span", { children: "esc cerrar" })
310
+ /* @__PURE__ */ jsx("span", { children: t("search.keyboardNavigate") }),
311
+ /* @__PURE__ */ jsx("span", { children: t("search.keyboardSelect") }),
312
+ /* @__PURE__ */ jsx("span", { children: t("search.keyboardClose") })
316
313
  ] })
317
314
  ] }) })
318
315
  ]
@@ -43,7 +43,7 @@ function MobileBottomNav() {
43
43
  {
44
44
  className: "lg:hidden fixed bottom-0 left-0 right-0 z-40 bg-background border-t border-border safe-area-bottom",
45
45
  role: "navigation",
46
- "aria-label": "Navegaci\xF3n m\xF3vil principal",
46
+ "aria-label": t("common.a11y.mobileMainNavigation"),
47
47
  "data-cy": sel("dashboard.mobile.bottomNav.container"),
48
48
  children: /* @__PURE__ */ jsx("div", { className: "flex items-end justify-around px-2 pb-2 pt-1", children: navItems.map((item) => {
49
49
  const Icon = item.icon;
@@ -43,7 +43,7 @@ function MobileTopBar({ prefetch } = {}) {
43
43
  {
44
44
  className: "lg:hidden fixed top-0 left-0 right-0 z-40 bg-background border-b border-border",
45
45
  role: "banner",
46
- "aria-label": "Barra de navegaci\xF3n m\xF3vil superior",
46
+ "aria-label": t("common.a11y.mobileTopBar"),
47
47
  "data-cy": sel("dashboard.mobile.topbar.container"),
48
48
  children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 h-14", children: [
49
49
  /* @__PURE__ */ jsxs(
@@ -52,7 +52,7 @@ function MobileTopBar({ prefetch } = {}) {
52
52
  href: "/dashboard/settings/profile",
53
53
  prefetch,
54
54
  className: "flex items-center gap-3 hover:opacity-80 transition-opacity",
55
- "aria-label": `Ir al perfil de ${user.firstName || user.email}`,
55
+ "aria-label": t("common.a11y.goToProfileOf", { name: user.firstName || user.email }),
56
56
  "data-cy": sel("dashboard.mobile.topbar.userProfile"),
57
57
  children: [
58
58
  user.image ? /* @__PURE__ */ jsx(
@@ -7,8 +7,8 @@ import { useMemo } from "react";
7
7
  import { cn } from "../../../lib/utils/index.js";
8
8
  import { useTranslations } from "next-intl";
9
9
  import { sel } from "../../../lib/test/index.js";
10
- import { Home, Camera } from "lucide-react";
11
- import * as Icons from "lucide-react";
10
+ import { Home, Camera, Box, Circle, Folder } from "lucide-react";
11
+ import { resolveIcon } from "../../../lib/icons.js";
12
12
  import { THEME_REGISTRY } from "@nextsparkjs/registries/theme-registry";
13
13
  import { usePermission } from "../../../lib/permissions/hooks.js";
14
14
  const activeTheme = process.env.NEXT_PUBLIC_ACTIVE_THEME || "default";
@@ -52,7 +52,7 @@ function NavItemWithPermission({
52
52
  if (item.requiresPermission && !hasPermission) {
53
53
  return null;
54
54
  }
55
- const ItemIcon = Icons[item.icon] || Icons.Circle;
55
+ const ItemIcon = resolveIcon(item.icon, Circle);
56
56
  const isActive = pathname === item.href || pathname.startsWith(item.href + "/");
57
57
  const normalizedItemKey = normalizeKey(item.labelKey);
58
58
  const itemLabel = t(normalizedItemKey) || labelMappings[item.labelKey] || item.id;
@@ -90,7 +90,7 @@ function SectionWithPermission({
90
90
  if (section.requiresPermission && !hasPermission) {
91
91
  return null;
92
92
  }
93
- const SectionIcon = Icons[section.icon] || Icons.Folder;
93
+ const SectionIcon = resolveIcon(section.icon, Folder);
94
94
  const normalizeKey = (key) => key.startsWith("common.") ? key.slice(7) : key;
95
95
  const normalizedSectionKey = normalizeKey(section.labelKey);
96
96
  const sectionLabel = t(normalizedSectionKey) || labelMappings[section.labelKey] || section.id;
@@ -143,7 +143,7 @@ function DynamicNavigation({
143
143
  const entityItems = useMemo(
144
144
  () => enabledEntities.map((entity) => {
145
145
  var _a2;
146
- const icon = Icons[entity.iconName] || Icons.Box;
146
+ const icon = resolveIcon(entity.iconName, Box);
147
147
  return {
148
148
  name: ((_a2 = entity.names) == null ? void 0 : _a2.plural) || entity.slug,
149
149
  href: `/dashboard/${entity.slug}`,
@@ -16,7 +16,7 @@ import {
16
16
  } from "../ui/table.js";
17
17
  import { ArrowLeft, LayoutGrid, TestTube2, CheckCircle2, XCircle, Eye, Loader2 } from "lucide-react";
18
18
  import { useTranslations } from "next-intl";
19
- import { BLOCK_REGISTRY } from "@nextsparkjs/registries/block-registry";
19
+ import { BLOCK_REGISTRY } from "@nextsparkjs/registries/block-registry.client";
20
20
  import { TAGS_REGISTRY } from "@nextsparkjs/registries/testing-registry";
21
21
  import { getBlockComponent } from "../../lib/blocks/loader.js";
22
22
  import { sel } from "../../lib/test/index.js";
@@ -8,7 +8,7 @@ import { Button } from "../ui/button.js";
8
8
  import { Input } from "../ui/input.js";
9
9
  import { Copy, Check, Search, TestTube2, CheckCircle2, XCircle, ArrowRight, LayoutGrid, Image as ImageIcon } from "lucide-react";
10
10
  import { useTranslations } from "next-intl";
11
- import { BLOCK_REGISTRY } from "@nextsparkjs/registries/block-registry";
11
+ import { BLOCK_REGISTRY } from "@nextsparkjs/registries/block-registry.client";
12
12
  import { TAGS_REGISTRY } from "@nextsparkjs/registries/testing-registry";
13
13
  import { sel } from "../../lib/test/index.js";
14
14
  const CATEGORY_COLORS = {
@@ -317,7 +317,7 @@ function EntityChildManager({
317
317
  isSubmitting && /* @__PURE__ */ jsxs(Alert, { children: [
318
318
  /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" }),
319
319
  /* @__PURE__ */ jsxs(AlertDescription, { children: [
320
- submissionMode === "create" ? "Creando" : "Actualizando",
320
+ submissionMode === "create" ? "Creating" : "Updating",
321
321
  " ",
322
322
  childEntityConfig.display.title.slice(0, -1).toLowerCase(),
323
323
  "..."
@@ -560,9 +560,9 @@ function EntityChildManager({
560
560
  /* @__PURE__ */ jsxs(DialogHeader, { children: [
561
561
  /* @__PURE__ */ jsx(DialogTitle, { children: "Confirm Delete" }),
562
562
  /* @__PURE__ */ jsxs(DialogDescription, { children: [
563
- "\xBFEst\xE1s seguro de que quieres eliminar este ",
563
+ "Are you sure you want to delete this ",
564
564
  childEntityConfig.display.title.slice(0, -1).toLowerCase(),
565
- "? Esta acci\xF3n no se puede deshacer."
565
+ "? This action cannot be undone."
566
566
  ] })
567
567
  ] }),
568
568
  /* @__PURE__ */ jsxs(DialogFooter, { children: [
@@ -572,7 +572,7 @@ function EntityChildManager({
572
572
  variant: "outline",
573
573
  onClick: handleCancelDelete,
574
574
  disabled: false,
575
- children: "Cancelar"
575
+ children: "Cancel"
576
576
  }
577
577
  ),
578
578
  /* @__PURE__ */ jsx(
@@ -581,7 +581,7 @@ function EntityChildManager({
581
581
  variant: "destructive",
582
582
  onClick: handleConfirmedDelete,
583
583
  disabled: false,
584
- children: "Eliminar"
584
+ children: "Delete"
585
585
  }
586
586
  )
587
587
  ] })
@@ -1 +1 @@
1
- {"version":3,"file":"EntityDetailPage.d.ts","sourceRoot":"","sources":["../../../src/components/entities/EntityDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAM5D,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,YAAY,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,YAAY,EACZ,IAAI,EACJ,SAAS,EACT,KAAK,EACL,SAAS,EACV,EAAE,qBAAqB,2CAqKvB"}
1
+ {"version":3,"file":"EntityDetailPage.d.ts","sourceRoot":"","sources":["../../../src/components/entities/EntityDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAK5D,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,YAAY,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,YAAY,EACZ,IAAI,EACJ,SAAS,EACT,KAAK,EACL,SAAS,EACV,EAAE,qBAAqB,2CAyKvB"}
@@ -15,8 +15,7 @@ import {
15
15
  Copy
16
16
  } from "lucide-react";
17
17
  import { deleteEntityData } from "../../lib/api/entities.js";
18
- import { format } from "date-fns";
19
- import { es } from "date-fns/locale";
18
+ import { useLocale } from "next-intl";
20
19
  import { EntityPageHeader } from "./EntityPageHeader.js";
21
20
  function EntityDetailPage({
22
21
  entityConfig,
@@ -26,9 +25,11 @@ function EntityDetailPage({
26
25
  className
27
26
  }) {
28
27
  const router = useRouter();
28
+ const locale = useLocale();
29
29
  const [isDeleting, setIsDeleting] = useState(false);
30
+ const formatDateTime = (value) => new Date(value).toLocaleString(locale, { dateStyle: "medium", timeStyle: "short" });
30
31
  const handleDelete = async () => {
31
- if (!confirm(`\xBFEst\xE1s seguro de que quieres eliminar este ${entityConfig.names.singular.toLowerCase()}?`)) {
32
+ if (!confirm(`Are you sure you want to delete this ${entityConfig.names.singular.toLowerCase()}?`)) {
32
33
  return;
33
34
  }
34
35
  try {
@@ -37,7 +38,7 @@ function EntityDetailPage({
37
38
  router.push(`/dashboard/${entityConfig.slug}`);
38
39
  } catch (error2) {
39
40
  console.error("Error deleting entity:", error2);
40
- alert("Error al eliminar. Por favor, intenta nuevamente.");
41
+ alert("Error deleting. Please try again.");
41
42
  } finally {
42
43
  setIsDeleting(false);
43
44
  }
@@ -46,7 +47,7 @@ function EntityDetailPage({
46
47
  navigator.clipboard.writeText(data.id);
47
48
  };
48
49
  if (isLoading) {
49
- return /* @__PURE__ */ jsx("div", { className: "min-h-screen bg-gradient-to-b from-background to-muted/20 py-12 px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsx("div", { className: "max-w-7xl mx-auto space-y-6", children: /* @__PURE__ */ jsx(Alert, { children: /* @__PURE__ */ jsx(AlertDescription, { children: "Cargando datos..." }) }) }) });
50
+ return /* @__PURE__ */ jsx("div", { className: "min-h-screen bg-gradient-to-b from-background to-muted/20 py-12 px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsx("div", { className: "max-w-7xl mx-auto space-y-6", children: /* @__PURE__ */ jsx(Alert, { children: /* @__PURE__ */ jsx(AlertDescription, { children: "Loading data..." }) }) }) });
50
51
  }
51
52
  if (error) {
52
53
  return /* @__PURE__ */ jsx("div", { className: "min-h-screen bg-gradient-to-b from-background to-muted/20 py-12 px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsx("div", { className: "max-w-7xl mx-auto space-y-6", children: /* @__PURE__ */ jsx(Alert, { children: /* @__PURE__ */ jsx(AlertDescription, { children: error }) }) }) });
@@ -54,11 +55,11 @@ function EntityDetailPage({
54
55
  const headerActions = /* @__PURE__ */ jsxs(Fragment, { children: [
55
56
  /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: handleCopyId, children: [
56
57
  /* @__PURE__ */ jsx(Copy, { className: "h-4 w-4 mr-2" }),
57
- "Copiar ID"
58
+ "Copy ID"
58
59
  ] }),
59
60
  /* @__PURE__ */ jsx(Link, { href: `/dashboard/${entityConfig.slug}/${data.id}/edit`, children: /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", children: [
60
61
  /* @__PURE__ */ jsx(Edit, { className: "h-4 w-4 mr-2" }),
61
- "Editar"
62
+ "Edit"
62
63
  ] }) }),
63
64
  /* @__PURE__ */ jsxs(
64
65
  Button,
@@ -69,7 +70,7 @@ function EntityDetailPage({
69
70
  disabled: isDeleting,
70
71
  children: [
71
72
  /* @__PURE__ */ jsx(Trash2, { className: "h-4 w-4 mr-2" }),
72
- isDeleting ? "Eliminando..." : "Eliminar"
73
+ isDeleting ? "Deleting..." : "Delete"
73
74
  ]
74
75
  }
75
76
  )
@@ -87,9 +88,9 @@ function EntityDetailPage({
87
88
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-6", children: [
88
89
  /* @__PURE__ */ jsx("div", { className: "lg:col-span-2 space-y-6", children: /* @__PURE__ */ jsxs(Card, { children: [
89
90
  /* @__PURE__ */ jsxs(CardHeader, { children: [
90
- /* @__PURE__ */ jsx(CardTitle, { children: "Detalles" }),
91
+ /* @__PURE__ */ jsx(CardTitle, { children: "Details" }),
91
92
  /* @__PURE__ */ jsxs(CardDescription, { children: [
92
- "Informaci\xF3n principal del ",
93
+ "Main information for the ",
93
94
  entityConfig.names.singular.toLowerCase()
94
95
  ] })
95
96
  ] }),
@@ -98,7 +99,7 @@ function EntityDetailPage({
98
99
  if (value === null || value === void 0) return null;
99
100
  return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
100
101
  /* @__PURE__ */ jsx("dt", { className: "text-sm font-medium text-muted-foreground", children: field.display.label }),
101
- /* @__PURE__ */ jsx("dd", { className: "text-sm", children: field.type === "date" || field.type === "datetime" ? value ? format(new Date(value), "PPp", { locale: es }) : "No especificado" : field.type === "boolean" ? /* @__PURE__ */ jsx(Badge, { variant: value ? "default" : "secondary", children: value ? "S\xED" : "No" }) : field.type === "number" && field.name === "price" ? `$${value}` : String(value) || "No especificado" })
102
+ /* @__PURE__ */ jsx("dd", { className: "text-sm", children: field.type === "date" || field.type === "datetime" ? value ? formatDateTime(value) : "Not specified" : field.type === "boolean" ? /* @__PURE__ */ jsx(Badge, { variant: value ? "default" : "secondary", children: value ? "Yes" : "No" }) : field.type === "number" && field.name === "price" ? `$${value}` : String(value) || "Not specified" })
102
103
  ] }, field.name);
103
104
  }) })
104
105
  ] }) }),
@@ -108,15 +109,15 @@ function EntityDetailPage({
108
109
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
109
110
  /* @__PURE__ */ jsx(Calendar, { className: "h-4 w-4" }),
110
111
  /* @__PURE__ */ jsxs("div", { children: [
111
- /* @__PURE__ */ jsx("div", { className: "font-medium", children: "Creado" }),
112
- /* @__PURE__ */ jsx("div", { children: data.createdAt && typeof data.createdAt === "string" ? format(new Date(data.createdAt), "PPp", { locale: es }) : "No disponible" })
112
+ /* @__PURE__ */ jsx("div", { className: "font-medium", children: "Created" }),
113
+ /* @__PURE__ */ jsx("div", { children: data.createdAt && typeof data.createdAt === "string" ? formatDateTime(data.createdAt) : "Not available" })
113
114
  ] })
114
115
  ] }),
115
116
  data.updatedAt && typeof data.updatedAt === "string" ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
116
117
  /* @__PURE__ */ jsx(Clock, { className: "h-4 w-4" }),
117
118
  /* @__PURE__ */ jsxs("div", { children: [
118
- /* @__PURE__ */ jsx("div", { className: "font-medium", children: "\xDAltima actualizaci\xF3n" }),
119
- /* @__PURE__ */ jsx("div", { children: format(new Date(data.updatedAt), "PPp", { locale: es }) })
119
+ /* @__PURE__ */ jsx("div", { className: "font-medium", children: "Last updated" }),
120
+ /* @__PURE__ */ jsx("div", { children: formatDateTime(data.updatedAt) })
120
121
  ] })
121
122
  ] }) : null
122
123
  ] })
@@ -1 +1 @@
1
- {"version":3,"file":"EntityFieldRenderer.d.ts","sourceRoot":"","sources":["../../../src/components/entities/EntityFieldRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6CH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAK3D,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,WAAW,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACnC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;CACF;AAm0BD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,QAAgB,EAChB,QAAQ,EACR,SAAS,EACT,MAAM,EACN,OAAO,GACR,EAAE,wBAAwB,2CAyC1B"}
1
+ {"version":3,"file":"EntityFieldRenderer.d.ts","sourceRoot":"","sources":["../../../src/components/entities/EntityFieldRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6CH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAK3D,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,WAAW,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACnC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;CACF;AAm1BD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,QAAgB,EAChB,QAAQ,EACR,SAAS,EACT,MAAM,EACN,OAAO,GACR,EAAE,wBAAwB,2CAyC1B"}
@@ -48,7 +48,7 @@ function formatDisplayValue(value, field) {
48
48
  case "number":
49
49
  return typeof value === "number" ? value.toLocaleString() : String(value || "");
50
50
  case "boolean":
51
- return value ? "S\xED" : "No";
51
+ return value ? "Yes" : "No";
52
52
  case "date":
53
53
  return value ? new Date(value).toLocaleDateString() : "";
54
54
  case "datetime":
@@ -96,7 +96,7 @@ function formatDisplayValue(value, field) {
96
96
  case "video":
97
97
  case "audio":
98
98
  if (Array.isArray(value)) {
99
- return `${value.length} archivo${value.length !== 1 ? "s" : ""}`;
99
+ return `${value.length} file${value.length !== 1 ? "s" : ""}`;
100
100
  }
101
101
  return String(value || "");
102
102
  case "relation":
@@ -117,6 +117,9 @@ function formatDisplayValue(value, field) {
117
117
  return String(value || "");
118
118
  }
119
119
  }
120
+ function optionTestId(fieldTestId, value) {
121
+ return fieldTestId ? `${fieldTestId}-option-${String(value)}` : void 0;
122
+ }
120
123
  function renderFormField(field, value, onChange, error, disabled, required, testId, context) {
121
124
  var _a, _b, _c, _d;
122
125
  if (field.name === "language") {
@@ -237,6 +240,7 @@ function renderFormField(field, value, onChange, error, disabled, required, test
237
240
  {
238
241
  value: String(option.value),
239
242
  disabled: option.disabled,
243
+ "data-cy": optionTestId(testId, option.value),
240
244
  children: option.label
241
245
  },
242
246
  String(option.value)
@@ -267,7 +271,8 @@ function renderFormField(field, value, onChange, error, disabled, required, test
267
271
  RadioGroupItem,
268
272
  {
269
273
  value: String(option.value),
270
- disabled: option.disabled
274
+ disabled: option.disabled,
275
+ "data-cy": optionTestId(testId, option.value)
271
276
  }
272
277
  ),
273
278
  /* @__PURE__ */ jsx(Label, { className: "text-sm", children: option.label })
@@ -340,7 +345,7 @@ function renderFormField(field, value, onChange, error, disabled, required, test
340
345
  }
341
346
  ),
342
347
  /* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground text-center", children: [
343
- "Valor: ",
348
+ "Value: ",
344
349
  typeof value === "number" ? value : 0
345
350
  ] })
346
351
  ] });
@@ -497,7 +502,7 @@ function renderFormField(field, value, onChange, error, disabled, required, test
497
502
  titleField,
498
503
  multiple: isMultiple,
499
504
  disabled: disabled || dependsOnParent && !parentValue,
500
- placeholder: dependsOnParent && !parentValue ? `Selecciona ${parentFieldName == null ? void 0 : parentFieldName.replace("Id", "").toLowerCase()} primero` : field.display.placeholder || `Seleccionar ${((_c = field.display.label) == null ? void 0 : _c.toLowerCase()) || relationEntityType}...`,
505
+ placeholder: dependsOnParent && !parentValue ? `Select ${parentFieldName == null ? void 0 : parentFieldName.replace("Id", "").toLowerCase()} first` : field.display.placeholder || `Select ${((_c = field.display.label) == null ? void 0 : _c.toLowerCase()) || relationEntityType}...`,
501
506
  parentId: parentIdForRelation,
502
507
  userFiltered: relationConfig.userFiltered,
503
508
  teamId: context == null ? void 0 : context.teamId,
@@ -557,7 +562,7 @@ function renderFormField(field, value, onChange, error, disabled, required, test
557
562
  })),
558
563
  multiple: propIsMultiple,
559
564
  disabled: disabled || propDependsOnParent && !propParentValue,
560
- placeholder: propDependsOnParent && !propParentValue ? `Selecciona ${propParentFieldName == null ? void 0 : propParentFieldName.replace("Id", "").toLowerCase()} primero` : field.display.placeholder || `Seleccionar ${(_d = field.display.label) == null ? void 0 : _d.toLowerCase()}...`,
565
+ placeholder: propDependsOnParent && !propParentValue ? `Select ${propParentFieldName == null ? void 0 : propParentFieldName.replace("Id", "").toLowerCase()} first` : field.display.placeholder || `Select ${(_d = field.display.label) == null ? void 0 : _d.toLowerCase()}...`,
561
566
  parentId: propParentIdForRelation,
562
567
  userFiltered: propRelationConfig.userFiltered,
563
568
  teamId: context == null ? void 0 : context.teamId
@@ -604,7 +609,7 @@ function renderFormField(field, value, onChange, error, disabled, required, test
604
609
  ...baseProps,
605
610
  value: String(value || ""),
606
611
  onChange: (e) => onChange(e.target.value),
607
- placeholder: field.display.placeholder || `Ingresa ${field.type}...`,
612
+ placeholder: field.display.placeholder || `Enter ${field.type}...`,
608
613
  required,
609
614
  className: field.type === "code" ? "min-h-[150px] font-mono text-sm" : "min-h-[150px]"
610
615
  }
@@ -14,9 +14,9 @@ function EntityPageHeader({
14
14
  const getTitle = () => {
15
15
  switch (mode) {
16
16
  case "create":
17
- return `Crear ${entityConfig.names.singular}`;
17
+ return `Create ${entityConfig.names.singular}`;
18
18
  case "edit":
19
- return typeof (data == null ? void 0 : data.title) === "string" ? data.title : typeof (data == null ? void 0 : data.name) === "string" ? data.name : `Editar ${entityConfig.names.singular}`;
19
+ return typeof (data == null ? void 0 : data.title) === "string" ? data.title : typeof (data == null ? void 0 : data.name) === "string" ? data.name : `Edit ${entityConfig.names.singular}`;
20
20
  case "view":
21
21
  default:
22
22
  return typeof (data == null ? void 0 : data.title) === "string" ? data.title : typeof (data == null ? void 0 : data.name) === "string" ? data.name : entityConfig.names.singular;
@@ -25,9 +25,9 @@ function EntityPageHeader({
25
25
  const getSubtitle = () => {
26
26
  switch (mode) {
27
27
  case "create":
28
- return `Nuevo ${entityConfig.names.singular.toLowerCase()}`;
28
+ return `New ${entityConfig.names.singular.toLowerCase()}`;
29
29
  case "edit":
30
- return `Editando ${entityConfig.names.singular.toLowerCase()} \u2022 ID: ${typeof (data == null ? void 0 : data.id) === "string" ? data.id : "N/A"}`;
30
+ return `Editing ${entityConfig.names.singular.toLowerCase()} \u2022 ID: ${typeof (data == null ? void 0 : data.id) === "string" ? data.id : "N/A"}`;
31
31
  case "view":
32
32
  default:
33
33
  return `${entityConfig.names.singular} \u2022 ID: ${typeof (data == null ? void 0 : data.id) === "string" ? data.id : "N/A"}`;
@@ -36,7 +36,7 @@ function EntityPageHeader({
36
36
  return /* @__PURE__ */ jsxs("div", { className: `space-y-6 ${className || ""}`, children: [
37
37
  /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Link, { href: `/dashboard/${entityConfig.slug}`, children: /* @__PURE__ */ jsxs(Button, { variant: "ghost", size: "sm", children: [
38
38
  /* @__PURE__ */ jsx(ArrowLeft, { className: "h-4 w-4 mr-2" }),
39
- "Volver a ",
39
+ "Back to ",
40
40
  entityConfig.names.plural
41
41
  ] }) }) }),
42
42
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../../src/components/entities/ErrorBoundary.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMnD,UAAU,wBAAwB;IAChC,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,wBAAwB;IAChC,QAAQ,EAAE,SAAS,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,KAAK,IAAI,CAAA;IACtD,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,KAAK,CAAC,SAAS,CACtD,wBAAwB,EACxB,wBAAwB,CACzB;IACC,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAI;gBAEnB,KAAK,EAAE,wBAAwB;IAK3C,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAWhF,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS;IA2BpD,OAAO,CAAC,WAAW,CAqBlB;IAED,OAAO,CAAC,WAAW,CAWlB;IAED,OAAO,CAAC,WAAW,CAOlB;IAED,OAAO,CAAC,YAAY,CAInB;IAED,OAAO,CAAC,YAAY,CAInB;IAED,OAAO,CAAC,YAAY,CAcnB;IAED,OAAO,CAAC,eAAe,CA+BtB;IAED,MAAM;CA2HP;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM;yBACT,KAAK,aAAa,SAAS;EAU1E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,MAAM,EACtD,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EACjC,UAAU,CAAC,EAAE,MAAM;YAEc,CAAC;;EASnC"}
1
+ {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../../src/components/entities/ErrorBoundary.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMnD,UAAU,wBAAwB;IAChC,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,wBAAwB;IAChC,QAAQ,EAAE,SAAS,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,KAAK,IAAI,CAAA;IACtD,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,KAAK,CAAC,SAAS,CACtD,wBAAwB,EACxB,wBAAwB,CACzB;IACC,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAI;gBAEnB,KAAK,EAAE,wBAAwB;IAK3C,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAWhF,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS;IA2BpD,OAAO,CAAC,WAAW,CAqBlB;IAED,OAAO,CAAC,WAAW,CAWlB;IAED,OAAO,CAAC,WAAW,CAOlB;IAED,OAAO,CAAC,YAAY,CAInB;IAED,OAAO,CAAC,YAAY,CAInB;IAED,OAAO,CAAC,YAAY,CAcnB;IAED,OAAO,CAAC,eAAe,CA8BtB;IAED,MAAM;CA2HP;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM;yBACT,KAAK,aAAa,SAAS;EAU1E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,MAAM,EACtD,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EACjC,UAAU,CAAC,EAAE,MAAM;YAEc,CAAC;;EASnC"}
@@ -101,32 +101,31 @@ class EntityErrorBoundary extends React.Component {
101
101
  };
102
102
  getErrorMessage = (error, entityType) => {
103
103
  const errorType = this.getErrorType(error);
104
- const entityName = entityType ? ` de ${entityType}` : "";
105
104
  switch (errorType) {
106
105
  case "network":
107
106
  return {
108
- title: "Error de Conexi\xF3n",
109
- description: `No se pudo conectar con el servidor para cargar los datos${entityName}. Verifica tu conexi\xF3n a internet.`
107
+ title: "Connection Error",
108
+ description: `Could not connect to the server${entityType ? ` to load ${entityType}` : ""}. Check your internet connection.`
110
109
  };
111
110
  case "permission":
112
111
  return {
113
- title: "Sin Permisos",
114
- description: `No tienes los permisos necesarios para acceder a estos datos${entityName}.`
112
+ title: "No Permissions",
113
+ description: `You don't have the necessary permissions to access ${entityType || "this data"}.`
115
114
  };
116
115
  case "not-found":
117
116
  return {
118
- title: "Recurso No Encontrado",
119
- description: `Los datos${entityName} que solicitas no est\xE1n disponibles o han sido eliminados.`
117
+ title: "Resource Not Found",
118
+ description: `What you requested${entityType ? ` from ${entityType}` : ""} is not available or has been deleted.`
120
119
  };
121
120
  case "configuration":
122
121
  return {
123
- title: "Error de Configuraci\xF3n",
124
- description: `Hay un problema con la configuraci\xF3n${entityName}. Contacta al administrador.`
122
+ title: "Configuration Error",
123
+ description: `There is a problem with the configuration${entityType ? ` of ${entityType}` : ""}. Contact the administrator.`
125
124
  };
126
125
  default:
127
126
  return {
128
- title: "Error Inesperado",
129
- description: `Ha ocurrido un error inesperado${entityName}. Nuestro equipo ha sido notificado.`
127
+ title: "Unexpected Error",
128
+ description: `An unexpected error occurred${entityType ? ` while loading ${entityType}` : ""}. Our team has been notified.`
130
129
  };
131
130
  }
132
131
  };
@@ -156,9 +155,9 @@ class EntityErrorBoundary extends React.Component {
156
155
  className: "inline-flex items-center",
157
156
  children: [
158
157
  /* @__PURE__ */ jsx(RefreshCw, { className: "h-4 w-4 mr-2" }),
159
- "Reintentar (",
158
+ "Retry (",
160
159
  this.maxRetries - this.retryCount,
161
- " intentos restantes)"
160
+ " attempts remaining)"
162
161
  ]
163
162
  }
164
163
  ),
@@ -170,7 +169,7 @@ class EntityErrorBoundary extends React.Component {
170
169
  className: "inline-flex items-center",
171
170
  children: [
172
171
  /* @__PURE__ */ jsx(RefreshCw, { className: "h-4 w-4 mr-2" }),
173
- "Restablecer"
172
+ "Reset"
174
173
  ]
175
174
  }
176
175
  ),
@@ -182,7 +181,7 @@ class EntityErrorBoundary extends React.Component {
182
181
  className: "inline-flex items-center",
183
182
  children: [
184
183
  /* @__PURE__ */ jsx(Home, { className: "h-4 w-4 mr-2" }),
185
- "Ir al Dashboard"
184
+ "Go to Dashboard"
186
185
  ]
187
186
  }
188
187
  ),
@@ -194,14 +193,14 @@ class EntityErrorBoundary extends React.Component {
194
193
  className: "inline-flex items-center",
195
194
  children: [
196
195
  /* @__PURE__ */ jsx(RefreshCw, { className: "h-4 w-4 mr-2" }),
197
- "Recargar P\xE1gina"
196
+ "Reload Page"
198
197
  ]
199
198
  }
200
199
  )
201
200
  ] }),
202
201
  (showDetails || process.env.NODE_ENV === "development") && errorInfo && /* @__PURE__ */ jsxs(Alert, { children: [
203
202
  /* @__PURE__ */ jsx(Bug, { className: "h-4 w-4" }),
204
- /* @__PURE__ */ jsx(AlertTitle, { children: "Detalles del Error (Desarrollo)" }),
203
+ /* @__PURE__ */ jsx(AlertTitle, { children: "Error Details (Development)" }),
205
204
  /* @__PURE__ */ jsx(AlertDescription, { className: "mt-2", children: /* @__PURE__ */ jsxs("div", { className: "space-y-2 text-sm font-mono", children: [
206
205
  /* @__PURE__ */ jsxs("div", { children: [
207
206
  /* @__PURE__ */ jsx("strong", { children: "Error ID:" }),
@@ -209,17 +208,17 @@ class EntityErrorBoundary extends React.Component {
209
208
  errorId
210
209
  ] }),
211
210
  /* @__PURE__ */ jsxs("div", { children: [
212
- /* @__PURE__ */ jsx("strong", { children: "Tipo:" }),
211
+ /* @__PURE__ */ jsx("strong", { children: "Type:" }),
213
212
  " ",
214
213
  errorType
215
214
  ] }),
216
215
  /* @__PURE__ */ jsxs("div", { children: [
217
- /* @__PURE__ */ jsx("strong", { children: "Entidad:" }),
216
+ /* @__PURE__ */ jsx("strong", { children: "Entity:" }),
218
217
  " ",
219
218
  entityType || "N/A"
220
219
  ] }),
221
220
  /* @__PURE__ */ jsxs("div", { children: [
222
- /* @__PURE__ */ jsx("strong", { children: "Mensaje:" }),
221
+ /* @__PURE__ */ jsx("strong", { children: "Message:" }),
223
222
  " ",
224
223
  error.message
225
224
  ] }),
@@ -234,7 +233,7 @@ class EntityErrorBoundary extends React.Component {
234
233
  ] }) })
235
234
  ] }),
236
235
  /* @__PURE__ */ jsxs("div", { className: "text-center text-sm text-gray-500", children: [
237
- "Si el problema persiste, contacta al soporte t\xE9cnico con el ID: ",
236
+ "If the problem persists, contact technical support with the ID: ",
238
237
  /* @__PURE__ */ jsx("code", { className: "bg-gray-100 px-1 rounded", children: errorId })
239
238
  ] })
240
239
  ] })