@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
@@ -2,6 +2,7 @@
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import Link from "next/link";
4
4
  import { useState, useEffect } from "react";
5
+ import { useTranslations } from "next-intl";
5
6
  import { cn } from "../../../lib/utils/index.js";
6
7
  import { useSidebar } from "../../../contexts/sidebar-context.js";
7
8
  import { sel } from "../../../lib/test/index.js";
@@ -9,14 +10,15 @@ import { DynamicNavigation } from "../navigation/DynamicNavigation.js";
9
10
  import { TeamSwitcherCompact } from "../../teams/TeamSwitcherCompact.js";
10
11
  import { APP_NAME } from "../../../lib/config/index.js";
11
12
  function Sidebar({ className, entities }) {
13
+ const t = useTranslations("common");
12
14
  const { isCollapsed } = useSidebar();
13
15
  const appName = APP_NAME;
14
16
  const [statusMessage, setStatusMessage] = useState("");
15
17
  useEffect(() => {
16
18
  if (isCollapsed) {
17
- setStatusMessage("Sidebar en modo contra\xEDdo. Use Tab para navegar.");
19
+ setStatusMessage(t("a11y.sidebarCollapsedHint"));
18
20
  }
19
- }, [isCollapsed]);
21
+ }, [isCollapsed, t]);
20
22
  return /* @__PURE__ */ jsxs(Fragment, { children: [
21
23
  /* @__PURE__ */ jsx(
22
24
  "div",
@@ -36,7 +38,7 @@ function Sidebar({ className, entities }) {
36
38
  className
37
39
  ),
38
40
  role: "complementary",
39
- "aria-label": isCollapsed ? "Sidebar de navegaci\xF3n contra\xEDdo" : "Sidebar de navegaci\xF3n expandido",
41
+ "aria-label": isCollapsed ? t("a11y.sidebarCollapsed") : t("a11y.sidebarExpanded"),
40
42
  "data-cy": sel("dashboard.sidebar.container"),
41
43
  "data-collapsed": isCollapsed,
42
44
  children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col h-full", children: [
@@ -51,7 +53,7 @@ function Sidebar({ className, entities }) {
51
53
  {
52
54
  href: "/",
53
55
  className: "flex items-center gap-2",
54
- "aria-label": isCollapsed ? "Ir a la p\xE1gina principal" : `${appName} - Ir a la p\xE1gina principal`,
56
+ "aria-label": isCollapsed ? t("a11y.goHome") : t("a11y.goHomeNamed", { appName }),
55
57
  "data-cy": sel("dashboard.sidebar.logo"),
56
58
  children: [
57
59
  /* @__PURE__ */ jsx(
@@ -59,7 +61,7 @@ function Sidebar({ className, entities }) {
59
61
  {
60
62
  className: "w-8 h-8 rounded-lg bg-primary flex items-center justify-center",
61
63
  role: "img",
62
- "aria-label": `Logo de ${appName}`,
64
+ "aria-label": t("a11y.logoOf", { appName }),
63
65
  children: /* @__PURE__ */ jsx("span", { className: "text-primary-foreground font-bold text-sm", "aria-hidden": "true", children: appName.charAt(0) })
64
66
  }
65
67
  ),
@@ -81,7 +83,7 @@ function Sidebar({ className, entities }) {
81
83
  className: "flex-1 px-2 pb-4 overflow-y-auto",
82
84
  id: "sidebar-navigation",
83
85
  role: "navigation",
84
- "aria-label": "Navegaci\xF3n principal del dashboard",
86
+ "aria-label": t("a11y.dashboardNavigation"),
85
87
  "data-cy": sel("dashboard.sidebar.content"),
86
88
  children: /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs("section", { "aria-labelledby": !isCollapsed ? "nav-heading" : void 0, children: [
87
89
  !isCollapsed && /* @__PURE__ */ jsx(
@@ -1 +1 @@
1
- {"version":3,"file":"TopNavbar.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/layouts/TopNavbar.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAA;AAEnF,UAAU,cAAc;IACtB,QAAQ,EAAE,wBAAwB,EAAE,CAAA;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,cAAc,2CAgqBhE"}
1
+ {"version":3,"file":"TopNavbar.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/layouts/TopNavbar.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAA;AAEnF,UAAU,cAAc;IACtB,QAAQ,EAAE,wBAAwB,EAAE,CAAA;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,cAAc,2CA6pBhE"}
@@ -21,7 +21,7 @@ import { NotificationsDropdown } from "../misc/NotificationsDropdown.js";
21
21
  import { SearchDropdown } from "../misc/SearchDropdown.js";
22
22
  import { QuickCreateDropdown } from "../misc/QuickCreateDropdown.js";
23
23
  import { cn } from "../../../lib/utils/index.js";
24
- import { sel, createAriaLabel } from "../../../lib/test/index.js";
24
+ import { sel } from "../../../lib/test/index.js";
25
25
  import { useTranslations } from "next-intl";
26
26
  import { useIsSuperAdmin } from "../../app/guards/SuperAdminGuard.js";
27
27
  import { useIsDeveloper } from "../../app/guards/DeveloperGuard.js";
@@ -80,26 +80,26 @@ function TopNavbar({ entities, className }) {
80
80
  const handleMenuToggle = useCallback(() => {
81
81
  const newState = !isMenuOpen;
82
82
  setIsMenuOpen(newState);
83
- setStatusMessage(newState ? "Men\xFA m\xF3vil abierto" : "Men\xFA m\xF3vil cerrado");
84
- }, [isMenuOpen]);
83
+ setStatusMessage(newState ? t("a11y.mobileMenuOpenedAnnouncement") : t("a11y.mobileMenuClosedAnnouncement"));
84
+ }, [isMenuOpen, t]);
85
85
  const handleSignOut = useCallback(async () => {
86
86
  try {
87
- setStatusMessage("Cerrando sesi\xF3n...");
87
+ setStatusMessage(t("a11y.signingOut"));
88
88
  await signOut();
89
- setStatusMessage("Sesi\xF3n cerrada exitosamente");
89
+ setStatusMessage(t("a11y.signOutSuccess"));
90
90
  } catch {
91
- setStatusMessage("Error al cerrar sesi\xF3n");
91
+ setStatusMessage(t("a11y.signOutError"));
92
92
  }
93
- }, [signOut]);
93
+ }, [signOut, t]);
94
94
  const handleMenuClose = useCallback(() => {
95
95
  setIsMenuOpen(false);
96
- setStatusMessage("Men\xFA cerrado");
97
- }, []);
96
+ setStatusMessage(t("a11y.menuClosedAnnouncement"));
97
+ }, [t]);
98
98
  const handleToggleSidebar = useCallback(() => {
99
99
  toggleSidebar();
100
100
  const newState = !isCollapsed;
101
- setStatusMessage(newState ? "Sidebar expandido" : "Sidebar contra\xEDdo");
102
- }, [isCollapsed, toggleSidebar]);
101
+ setStatusMessage(newState ? t("a11y.sidebarToggleExpanded") : t("a11y.sidebarToggleCollapsed"));
102
+ }, [isCollapsed, toggleSidebar, t]);
103
103
  useEffect(() => {
104
104
  const handleKeyDown = (e) => {
105
105
  if (e.key === "Escape" && isMenuOpen) {
@@ -133,7 +133,7 @@ function TopNavbar({ entities, className }) {
133
133
  className
134
134
  ),
135
135
  role: "banner",
136
- "aria-label": "Navegaci\xF3n principal",
136
+ "aria-label": t("a11y.mainNavigation"),
137
137
  "data-cy": sel("dashboard.topnav.container"),
138
138
  children: [
139
139
  /* @__PURE__ */ jsx("div", { className: "w-full pl-2.5 pr-4 sm:pr-6 lg:pr-8", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between h-16", children: [
@@ -143,7 +143,7 @@ function TopNavbar({ entities, className }) {
143
143
  {
144
144
  href: "/",
145
145
  className: "text-xl font-bold text-foreground lg:hidden",
146
- "aria-label": "Ir a la p\xE1gina principal",
146
+ "aria-label": t("a11y.goHome"),
147
147
  "data-cy": sel("dashboard.topnav.logo"),
148
148
  children: APP_NAME
149
149
  }
@@ -156,7 +156,7 @@ function TopNavbar({ entities, className }) {
156
156
  size: "icon",
157
157
  onClick: handleToggleSidebar,
158
158
  className: "hidden lg:flex h-8 w-8",
159
- "aria-label": isCollapsed ? "Expandir sidebar" : "Contraer sidebar",
159
+ "aria-label": isCollapsed ? t("a11y.expandSidebar") : t("a11y.collapseSidebar"),
160
160
  "aria-expanded": !isCollapsed,
161
161
  "aria-controls": "sidebar-navigation",
162
162
  "data-cy": sel("dashboard.topnav.sidebarToggle"),
@@ -169,7 +169,7 @@ function TopNavbar({ entities, className }) {
169
169
  {
170
170
  className: "hidden lg:flex items-center min-w-0 max-w-sm",
171
171
  role: "search",
172
- "aria-label": "B\xFAsqueda de tareas",
172
+ "aria-label": t("a11y.taskSearch"),
173
173
  "data-cy": sel("dashboard.topnav.search.container"),
174
174
  children: /* @__PURE__ */ jsx(SearchDropdown, {})
175
175
  }
@@ -181,7 +181,7 @@ function TopNavbar({ entities, className }) {
181
181
  {
182
182
  className: "flex items-center space-x-4 flex-shrink-0",
183
183
  role: "toolbar",
184
- "aria-label": "Acciones y configuraci\xF3n",
184
+ "aria-label": t("a11y.actionsAndSettings"),
185
185
  "data-cy": sel("dashboard.topnav.actions"),
186
186
  children: [
187
187
  user && isTopbarFeatureEnabled("notifications") && /* @__PURE__ */ jsx(NotificationsDropdown, {}),
@@ -198,10 +198,10 @@ function TopNavbar({ entities, className }) {
198
198
  href: "/support",
199
199
  target: "_blank",
200
200
  rel: "noopener noreferrer",
201
- "aria-label": "Abrir centro de ayuda en nueva pesta\xF1a",
201
+ "aria-label": t("a11y.openHelpCenterNewTab"),
202
202
  children: [
203
203
  /* @__PURE__ */ jsx(HelpCircle, { className: "h-4 w-4", "aria-hidden": "true" }),
204
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Ayuda" })
204
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: t("a11y.help") })
205
205
  ]
206
206
  }
207
207
  )
@@ -225,11 +225,11 @@ function TopNavbar({ entities, className }) {
225
225
  Link,
226
226
  {
227
227
  href: "/superadmin",
228
- "aria-label": "Acceder a Super Admin - \xC1rea de super administrador",
229
- title: "Super Admin - Super Admin Area",
228
+ "aria-label": t("a11y.accessSuperAdminArea"),
229
+ title: t("a11y.superAdminAreaTitle"),
230
230
  children: [
231
231
  /* @__PURE__ */ jsx(Shield, { className: "h-4 w-4", "aria-hidden": "true" }),
232
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "\xC1rea de super administrador" })
232
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: t("a11y.superAdminArea") })
233
233
  ]
234
234
  }
235
235
  )
@@ -246,11 +246,11 @@ function TopNavbar({ entities, className }) {
246
246
  Link,
247
247
  {
248
248
  href: "/devtools",
249
- "aria-label": "Acceder a DevTools - \xC1rea de desarrolladores",
250
- title: "DevTools - Developer Area",
249
+ "aria-label": t("a11y.accessDeveloperArea"),
250
+ title: t("a11y.developerAreaTitle"),
251
251
  children: [
252
252
  /* @__PURE__ */ jsx(Code, { className: "h-4 w-4 text-violet-600 dark:text-violet-400", "aria-hidden": "true" }),
253
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "\xC1rea de desarrolladores" })
253
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: t("a11y.developerArea") })
254
254
  ]
255
255
  }
256
256
  )
@@ -310,9 +310,9 @@ function TopNavbar({ entities, className }) {
310
310
  {
311
311
  className: "h-8 w-20 bg-muted animate-pulse rounded",
312
312
  role: "status",
313
- "aria-label": "Cargando informaci\xF3n del usuario",
313
+ "aria-label": t("a11y.loadingUserInfo"),
314
314
  "data-cy": sel("dashboard.topnav.userLoading"),
315
- children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Cargando..." })
315
+ children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: t("a11y.loading") })
316
316
  }
317
317
  ) : user ? TOPBAR_CONFIG.userMenu.enabled ? /* @__PURE__ */ jsxs(DropdownMenu, { children: [
318
318
  /* @__PURE__ */ jsx(
@@ -325,10 +325,7 @@ function TopNavbar({ entities, className }) {
325
325
  {
326
326
  variant: "ghost",
327
327
  className: "flex items-center gap-3 h-auto p-2",
328
- "aria-label": createAriaLabel(
329
- "Men\xFA de usuario. Cuenta: {name}",
330
- { name: user.firstName || user.email }
331
- ),
328
+ "aria-label": t("a11y.userMenuForName", { name: user.firstName || user.email }),
332
329
  "aria-haspopup": "menu",
333
330
  "aria-expanded": "false",
334
331
  children: [
@@ -346,7 +343,7 @@ function TopNavbar({ entities, className }) {
346
343
  {
347
344
  className: `h-8 w-8 rounded-full flex items-center justify-center text-white text-sm font-medium ${getAvatarColor(user.email)}`,
348
345
  role: "img",
349
- "aria-label": `Avatar de ${user.firstName || user.email}`,
346
+ "aria-label": t("a11y.avatarForName", { name: user.firstName || user.email }),
350
347
  children: getUserInitials(user)
351
348
  }
352
349
  ),
@@ -368,9 +365,9 @@ function TopNavbar({ entities, className }) {
368
365
  {
369
366
  className: "flex flex-col space-y-1",
370
367
  role: "group",
371
- "aria-label": "Informaci\xF3n del usuario",
368
+ "aria-label": t("a11y.userInfo"),
372
369
  children: [
373
- TOPBAR_CONFIG.userMenu.showAvatar && /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: user.firstName || "Usuario" }),
370
+ TOPBAR_CONFIG.userMenu.showAvatar && /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: user.firstName || t("common.user") }),
374
371
  TOPBAR_CONFIG.userMenu.showEmail && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: user.email }),
375
372
  TOPBAR_CONFIG.userMenu.showRole && user.role && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: t(`userRoles.${user.role}`) })
376
373
  ]
@@ -432,7 +429,7 @@ function TopNavbar({ entities, className }) {
432
429
  Image,
433
430
  {
434
431
  src: user.image,
435
- alt: `Avatar de ${user.firstName || user.email}`,
432
+ alt: t("a11y.avatarForName", { name: user.firstName || user.email }),
436
433
  width: 32,
437
434
  height: 32,
438
435
  className: "h-8 w-8 rounded-full object-cover border border-border"
@@ -441,7 +438,7 @@ function TopNavbar({ entities, className }) {
441
438
  "div",
442
439
  {
443
440
  className: `h-8 w-8 rounded-full flex items-center justify-center text-white text-sm font-medium ${getAvatarColor(user.email)}`,
444
- "aria-label": `Avatar de ${user.firstName || user.email}`,
441
+ "aria-label": t("a11y.avatarForName", { name: user.firstName || user.email }),
445
442
  children: getUserInitials(user)
446
443
  }
447
444
  ),
@@ -458,7 +455,7 @@ function TopNavbar({ entities, className }) {
458
455
  {
459
456
  variant: "ghost",
460
457
  size: "sm",
461
- "aria-label": "Iniciar sesi\xF3n",
458
+ "aria-label": t("a11y.signIn"),
462
459
  children: t("buttons.signIn")
463
460
  }
464
461
  )
@@ -473,7 +470,7 @@ function TopNavbar({ entities, className }) {
473
470
  Button,
474
471
  {
475
472
  size: "sm",
476
- "aria-label": "Registrarse",
473
+ "aria-label": t("a11y.signUp"),
477
474
  children: t("buttons.signUp")
478
475
  }
479
476
  )
@@ -488,7 +485,7 @@ function TopNavbar({ entities, className }) {
488
485
  {
489
486
  className: "lg:hidden flex items-center space-x-2",
490
487
  role: "group",
491
- "aria-label": "Acciones m\xF3viles",
488
+ "aria-label": t("a11y.mobileActions"),
492
489
  "data-cy": sel("dashboard.topnav.mobileMenu.actions"),
493
490
  children: [
494
491
  isTopbarFeatureEnabled("themeToggle") && /* @__PURE__ */ jsx(
@@ -502,7 +499,7 @@ function TopNavbar({ entities, className }) {
502
499
  {
503
500
  onClick: handleMenuToggle,
504
501
  className: "text-foreground/70 hover:text-foreground",
505
- "aria-label": isMenuOpen ? "Cerrar men\xFA de navegaci\xF3n" : "Abrir men\xFA de navegaci\xF3n",
502
+ "aria-label": isMenuOpen ? t("a11y.closeNavigationMenu") : t("a11y.openNavigationMenu"),
506
503
  "aria-expanded": isMenuOpen,
507
504
  "aria-controls": "mobile-menu",
508
505
  "data-cy": sel("dashboard.topnav.mobileMenu.toggle"),
@@ -519,7 +516,7 @@ function TopNavbar({ entities, className }) {
519
516
  className: "lg:hidden border-t border-border",
520
517
  id: "mobile-menu",
521
518
  role: "navigation",
522
- "aria-label": "Men\xFA de navegaci\xF3n m\xF3vil",
519
+ "aria-label": t("a11y.mobileNavigationMenu"),
523
520
  "data-cy": sel("dashboard.topnav.mobileMenu.container"),
524
521
  children: /* @__PURE__ */ jsx("div", { className: "px-2 pt-2 pb-3 space-y-1", children: user ? /* @__PURE__ */ jsxs(Fragment, { children: [
525
522
  /* @__PURE__ */ jsxs(
@@ -527,7 +524,7 @@ function TopNavbar({ entities, className }) {
527
524
  {
528
525
  className: "mb-4",
529
526
  role: "group",
530
- "aria-label": "Navegaci\xF3n principal",
527
+ "aria-label": t("a11y.mainNavigation"),
531
528
  children: [
532
529
  /* @__PURE__ */ jsx(
533
530
  DynamicNavigation,
@@ -546,11 +543,11 @@ function TopNavbar({ entities, className }) {
546
543
  pathname.startsWith("/superadmin") ? "bg-red-50 text-red-700" : "text-red-600"
547
544
  ),
548
545
  onClick: handleMenuClose,
549
- "aria-label": "Ir a Super Admin - \xC1rea de super administrador",
546
+ "aria-label": t("a11y.goToSuperAdminArea"),
550
547
  "data-cy": sel("dashboard.topnav.mobileMenu.superadmin"),
551
548
  children: [
552
549
  /* @__PURE__ */ jsx(Shield, { className: "h-4 w-4", "aria-hidden": "true" }),
553
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "\xC1rea de super administrador" })
550
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: t("a11y.superAdminArea") })
554
551
  ]
555
552
  }
556
553
  ),
@@ -563,11 +560,11 @@ function TopNavbar({ entities, className }) {
563
560
  pathname.startsWith("/devtools") ? "bg-violet-50 dark:bg-violet-950/50 text-violet-700 dark:text-violet-400" : "text-violet-600 dark:text-violet-400"
564
561
  ),
565
562
  onClick: handleMenuClose,
566
- "aria-label": "Ir a DevTools - \xC1rea de desarrolladores",
563
+ "aria-label": t("a11y.goToDeveloperArea"),
567
564
  "data-cy": sel("dashboard.topnav.mobileMenu.devtools"),
568
565
  children: [
569
566
  /* @__PURE__ */ jsx(Code, { className: "h-4 w-4", "aria-hidden": "true" }),
570
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "\xC1rea de desarrolladores" })
567
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: t("a11y.developerArea") })
571
568
  ]
572
569
  }
573
570
  )
@@ -579,7 +576,7 @@ function TopNavbar({ entities, className }) {
579
576
  {
580
577
  className: "flex items-center gap-3 px-3 py-2 border-t border-border pt-4",
581
578
  role: "group",
582
- "aria-label": "Informaci\xF3n del usuario",
579
+ "aria-label": t("a11y.userInfo"),
583
580
  "data-cy": sel("dashboard.topnav.mobileMenu.userInfo"),
584
581
  children: [
585
582
  user.image ? /* @__PURE__ */ jsx(
@@ -596,12 +593,12 @@ function TopNavbar({ entities, className }) {
596
593
  {
597
594
  className: `h-8 w-8 rounded-full flex items-center justify-center text-white text-sm font-medium ${getAvatarColor(user.email)}`,
598
595
  role: "img",
599
- "aria-label": `Avatar de ${user.firstName || user.email}`,
596
+ "aria-label": t("a11y.avatarForName", { name: user.firstName || user.email }),
600
597
  children: getUserInitials(user)
601
598
  }
602
599
  ),
603
600
  /* @__PURE__ */ jsxs("div", { children: [
604
- /* @__PURE__ */ jsx("div", { className: "text-sm font-medium text-foreground", children: user.firstName || "Usuario" }),
601
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-medium text-foreground", children: user.firstName || t("common.user") }),
605
602
  /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: user.email })
606
603
  ] })
607
604
  ]
@@ -613,7 +610,7 @@ function TopNavbar({ entities, className }) {
613
610
  href: "/dashboard/settings/profile",
614
611
  className: "block px-3 py-2 rounded-md text-base font-medium text-foreground hover:bg-accent",
615
612
  onClick: handleMenuClose,
616
- "aria-label": "Ir a perfil",
613
+ "aria-label": t("a11y.goToProfile"),
617
614
  "data-cy": sel("dashboard.topnav.mobileMenu.linkProfile"),
618
615
  children: [
619
616
  /* @__PURE__ */ jsx(User, { className: "inline mr-2 h-4 w-4", "aria-hidden": "true" }),
@@ -627,7 +624,7 @@ function TopNavbar({ entities, className }) {
627
624
  href: "/dashboard/settings",
628
625
  className: "block px-3 py-2 rounded-md text-base font-medium text-foreground hover:bg-accent",
629
626
  onClick: handleMenuClose,
630
- "aria-label": "Ir a configuraci\xF3n",
627
+ "aria-label": t("a11y.goToSettings"),
631
628
  "data-cy": sel("dashboard.topnav.mobileMenu.linkSettings"),
632
629
  children: [
633
630
  /* @__PURE__ */ jsx(Settings, { className: "inline mr-2 h-4 w-4", "aria-hidden": "true" }),
@@ -641,7 +638,7 @@ function TopNavbar({ entities, className }) {
641
638
  href: "/dashboard/settings/billing",
642
639
  className: "block px-3 py-2 rounded-md text-base font-medium text-foreground hover:bg-accent",
643
640
  onClick: handleMenuClose,
644
- "aria-label": "Ir a facturaci\xF3n",
641
+ "aria-label": t("a11y.goToBilling"),
645
642
  "data-cy": sel("dashboard.topnav.mobileMenu.linkBilling"),
646
643
  children: [
647
644
  /* @__PURE__ */ jsx(CreditCard, { className: "inline mr-2 h-4 w-4", "aria-hidden": "true" }),
@@ -657,7 +654,7 @@ function TopNavbar({ entities, className }) {
657
654
  handleMenuClose();
658
655
  },
659
656
  className: "w-full text-left px-3 py-2 rounded-md text-base font-medium text-red-600 hover:bg-accent",
660
- "aria-label": "Cerrar sesi\xF3n",
657
+ "aria-label": t("a11y.signOut"),
661
658
  "data-cy": sel("dashboard.topnav.mobileMenu.signout"),
662
659
  children: [
663
660
  /* @__PURE__ */ jsx(LogOut, { className: "inline mr-2 h-4 w-4", "aria-hidden": "true" }),
@@ -672,7 +669,7 @@ function TopNavbar({ entities, className }) {
672
669
  href: "/login",
673
670
  className: "block px-3 py-2 rounded-md text-base font-medium text-foreground hover:bg-accent",
674
671
  onClick: handleMenuClose,
675
- "aria-label": "Iniciar sesi\xF3n",
672
+ "aria-label": t("a11y.signIn"),
676
673
  "data-cy": sel("dashboard.topnav.signin"),
677
674
  children: "Sign in"
678
675
  }
@@ -683,7 +680,7 @@ function TopNavbar({ entities, className }) {
683
680
  href: "/signup",
684
681
  className: "block px-3 py-2 rounded-md text-base font-medium text-foreground hover:bg-accent",
685
682
  onClick: handleMenuClose,
686
- "aria-label": "Registrarse",
683
+ "aria-label": t("a11y.signUp"),
687
684
  "data-cy": sel("dashboard.topnav.signup"),
688
685
  children: "Sign up"
689
686
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationsDropdown.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/misc/NotificationsDropdown.tsx"],"names":[],"mappings":"AAgLA,wBAAgB,qBAAqB,4CAiHpC"}
1
+ {"version":3,"file":"NotificationsDropdown.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/misc/NotificationsDropdown.tsx"],"names":[],"mappings":"AAkLA,wBAAgB,qBAAqB,4CAiHpC"}
@@ -17,7 +17,7 @@ import { useNotifications } from "../../../hooks/useNotifications.js";
17
17
  import { cn } from "../../../lib/utils/index.js";
18
18
  import { useState, useCallback } from "react";
19
19
  import { sel, createAriaLabel } from "../../../lib/test/index.js";
20
- import { useTranslations } from "next-intl";
20
+ import { useLocale, useTranslations } from "next-intl";
21
21
  const getNotificationIcon = (type) => {
22
22
  switch (type) {
23
23
  case "success":
@@ -30,28 +30,30 @@ const getNotificationIcon = (type) => {
30
30
  return /* @__PURE__ */ jsx(Info, { className: "h-4 w-4 text-blue-500" });
31
31
  }
32
32
  };
33
- const formatTimeAgo = (date, locale = "es") => {
33
+ const formatTimeAgo = (date, t, locale) => {
34
34
  const now = /* @__PURE__ */ new Date();
35
35
  const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1e3);
36
36
  if (diffInSeconds < 60) {
37
- return locale === "en" ? "Just now" : "Hace un momento";
37
+ return t("relativeTime.justNow");
38
38
  } else if (diffInSeconds < 3600) {
39
39
  const minutes = Math.floor(diffInSeconds / 60);
40
- return locale === "en" ? `${minutes} min ago` : `Hace ${minutes} min`;
40
+ return t("relativeTime.minutesAgo", { minutes });
41
41
  } else if (diffInSeconds < 86400) {
42
42
  const hours = Math.floor(diffInSeconds / 3600);
43
- return locale === "en" ? `${hours}h ago` : `Hace ${hours}h`;
43
+ return t("relativeTime.hoursAgo", { hours });
44
44
  } else if (diffInSeconds < 604800) {
45
45
  const days = Math.floor(diffInSeconds / 86400);
46
- return locale === "en" ? `${days}d ago` : `Hace ${days}d`;
46
+ return t("relativeTime.daysAgo", { days });
47
47
  } else {
48
- return date.toLocaleDateString(locale === "en" ? "en-US" : "es-ES", {
48
+ return date.toLocaleDateString(locale, {
49
49
  day: "numeric",
50
50
  month: "short"
51
51
  });
52
52
  }
53
53
  };
54
54
  function NotificationItem({ notification, onMarkAsRead, onDelete }) {
55
+ const t = useTranslations("common");
56
+ const locale = useLocale();
55
57
  const handleClick = useCallback(() => {
56
58
  if (!notification.isRead) {
57
59
  onMarkAsRead(notification.id);
@@ -86,8 +88,8 @@ function NotificationItem({ notification, onMarkAsRead, onDelete }) {
86
88
  {
87
89
  title: notification.title,
88
90
  message: notification.message,
89
- time: formatTimeAgo(notification.timestamp),
90
- status: notification.isRead ? "le\xEDda" : "no le\xEDda"
91
+ time: formatTimeAgo(notification.timestamp, t, locale),
92
+ status: notification.isRead ? t("notifications.read") : t("notifications.unreadStatus")
91
93
  }
92
94
  ),
93
95
  "data-notification-id": notification.id,
@@ -110,7 +112,7 @@ function NotificationItem({ notification, onMarkAsRead, onDelete }) {
110
112
  size: "sm",
111
113
  className: "h-6 w-6 p-0 opacity-0 group-hover:opacity-100 transition-opacity",
112
114
  onClick: handleDelete,
113
- "aria-label": `Eliminar notificaci\xF3n: ${notification.title}`,
115
+ "aria-label": t("a11y.deleteNotification", { title: notification.title }),
114
116
  children: /* @__PURE__ */ jsx(X, { className: "h-3 w-3", "aria-hidden": "true" })
115
117
  }
116
118
  )
@@ -118,7 +120,7 @@ function NotificationItem({ notification, onMarkAsRead, onDelete }) {
118
120
  ] }),
119
121
  /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground line-clamp-2", children: notification.message }),
120
122
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
121
- /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: formatTimeAgo(notification.timestamp) }),
123
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: formatTimeAgo(notification.timestamp, t, locale) }),
122
124
  !notification.isRead && /* @__PURE__ */ jsxs(
123
125
  Button,
124
126
  {
@@ -126,10 +128,10 @@ function NotificationItem({ notification, onMarkAsRead, onDelete }) {
126
128
  size: "sm",
127
129
  className: "h-6 px-2 text-xs opacity-0 group-hover:opacity-100 transition-opacity",
128
130
  onClick: handleMarkAsRead,
129
- "aria-label": `Marcar como le\xEDda: ${notification.title}`,
131
+ "aria-label": t("a11y.markNotificationAsRead", { title: notification.title }),
130
132
  children: [
131
133
  /* @__PURE__ */ jsx(Check, { className: "h-3 w-3 mr-1", "aria-hidden": "true" }),
132
- "Marcar le\xEDdo"
134
+ t("notifications.markAsRead")
133
135
  ]
134
136
  }
135
137
  )
@@ -149,8 +151,8 @@ function NotificationsDropdown() {
149
151
  const t = useTranslations("common");
150
152
  const handleMarkAllAsRead = useCallback(() => {
151
153
  markAllAsRead();
152
- setStatusMessage("Todas las notificaciones marcadas como le\xEDdas");
153
- }, [markAllAsRead]);
154
+ setStatusMessage(t("a11y.allNotificationsMarkedRead"));
155
+ }, [markAllAsRead, t]);
154
156
  return /* @__PURE__ */ jsxs(Fragment, { children: [
155
157
  /* @__PURE__ */ jsx(
156
158
  "div",
@@ -1 +1 @@
1
- {"version":3,"file":"SearchDropdown.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/misc/SearchDropdown.tsx"],"names":[],"mappings":"AAgLA,wBAAgB,cAAc,4CAmN7B"}
1
+ {"version":3,"file":"SearchDropdown.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/misc/SearchDropdown.tsx"],"names":[],"mappings":"AAiLA,wBAAgB,cAAc,4CAmN7B"}