@greatapps/common 1.1.699 → 1.1.700

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 (566) hide show
  1. package/dist/components/account/ConfigurationsMyAccountModal.mjs +1 -1
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  3. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  4. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  5. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  6. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  7. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  8. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  9. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  10. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  11. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  12. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  13. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  14. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  15. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  16. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  17. package/dist/components/account/sections/TokenSection.mjs.map +1 -1
  18. package/dist/components/embeds/ClarityEmbed.mjs.map +1 -1
  19. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  20. package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
  21. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  22. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  23. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  24. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  25. package/dist/components/layouts/NavBar.mjs.map +1 -1
  26. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  27. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  28. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  29. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  30. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  31. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  32. package/dist/components/modals/CreditsDisabledModal.mjs.map +1 -1
  33. package/dist/components/modals/HexaPromoModal.mjs +166 -0
  34. package/dist/components/modals/HexaPromoModal.mjs.map +1 -0
  35. package/dist/components/modals/HexaPromoModalGate.mjs +54 -0
  36. package/dist/components/modals/HexaPromoModalGate.mjs.map +1 -0
  37. package/dist/components/modals/Modals.mjs.map +1 -1
  38. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  39. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  40. package/dist/components/modals/cards/CannotDeleteCardModal.mjs.map +1 -1
  41. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  42. package/dist/components/modals/cards/DeleteCardModal.mjs.map +1 -1
  43. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  44. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  45. package/dist/components/navigation/OverdueInvoiceBanner.mjs.map +1 -1
  46. package/dist/components/navigation/PendingCancellationBanner.mjs.map +1 -1
  47. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  48. package/dist/components/navigation/SubscriptionBanner.mjs.map +1 -1
  49. package/dist/components/navigation/TrialBanner.mjs.map +1 -1
  50. package/dist/components/navigation/UpcomingInvoiceBanner.mjs.map +1 -1
  51. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  52. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  53. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  54. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  55. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  56. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  57. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  58. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  59. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  60. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  61. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  62. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  63. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  64. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  65. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  66. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  67. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  68. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  69. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  70. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  71. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  72. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  73. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  74. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  75. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  76. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  77. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  78. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  79. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  80. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  81. package/dist/components/ui/form/FormField.mjs.map +1 -1
  82. package/dist/components/ui/form/Input.mjs.map +1 -1
  83. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  84. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  85. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  86. package/dist/components/ui/form/Select.mjs +1 -1
  87. package/dist/components/ui/form/Select.mjs.map +1 -1
  88. package/dist/components/ui/form/Switch.mjs.map +1 -1
  89. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  90. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  91. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  92. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  93. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  94. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  95. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  96. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  97. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  98. package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
  99. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  100. package/dist/handlers.mjs.map +1 -1
  101. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  102. package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
  103. package/dist/hooks/useBrandLoadingIcon.mjs.map +1 -1
  104. package/dist/hooks/useRouter.mjs.map +1 -1
  105. package/dist/http.mjs.map +1 -1
  106. package/dist/i18n/config.mjs.map +1 -1
  107. package/dist/i18n/country-language.mjs.map +1 -1
  108. package/dist/i18n/messages/en-us.mjs.map +1 -1
  109. package/dist/i18n/messages/es-es.mjs.map +1 -1
  110. package/dist/i18n/messages/index.mjs.map +1 -1
  111. package/dist/i18n/messages/pt-br.mjs.map +1 -1
  112. package/dist/i18n/normalize.mjs.map +1 -1
  113. package/dist/i18n/resolve-locale.mjs.map +1 -1
  114. package/dist/i18n.mjs.map +1 -1
  115. package/dist/index.mjs +38 -32
  116. package/dist/index.mjs.map +1 -1
  117. package/dist/infra/http/api-fetch.mjs.map +1 -1
  118. package/dist/infra/route/parse-id.mjs.map +1 -1
  119. package/dist/infra/route/parse-numeric.mjs.map +1 -1
  120. package/dist/infra/route/safe-route-handler.mjs.map +1 -1
  121. package/dist/infra/route/search-params.mjs.map +1 -1
  122. package/dist/infra/utils/array.mjs.map +1 -1
  123. package/dist/infra/utils/date.mjs.map +1 -1
  124. package/dist/middleware.mjs.map +1 -1
  125. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  126. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  127. package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -1
  128. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  129. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  130. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  131. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
  132. package/dist/modules/accounts/hooks/use-currency-formatter.hook.mjs.map +1 -1
  133. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  134. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  135. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  136. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  137. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
  138. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  139. package/dist/modules/auth/actions/social-google-login.action.mjs.map +1 -1
  140. package/dist/modules/auth/actions/social-google-onboarding.action.mjs.map +1 -1
  141. package/dist/modules/auth/actions/unlink-google.action.mjs.map +1 -1
  142. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  143. package/dist/modules/auth/actions/verify-two-factor.action.mjs.map +1 -1
  144. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  145. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  146. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  147. package/dist/modules/auth/hooks/social-google-login.hook.mjs.map +1 -1
  148. package/dist/modules/auth/hooks/social-google-onboarding.hook.mjs.map +1 -1
  149. package/dist/modules/auth/hooks/unlink-google.hook.mjs.map +1 -1
  150. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  151. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  152. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  153. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  154. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  155. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  156. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  157. package/dist/modules/auth/utils/require-token-not-expired.mjs.map +1 -1
  158. package/dist/modules/auth/utils/require-valid-session.mjs.map +1 -1
  159. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  160. package/dist/modules/cards/actions/create-setup-intent.action.mjs.map +1 -1
  161. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
  162. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
  163. package/dist/modules/cards/handlers/find-card-by-id.handler.mjs.map +1 -1
  164. package/dist/modules/cards/handlers/list-cards.handler.mjs.map +1 -1
  165. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  166. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  167. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  168. package/dist/modules/cards/hooks/create-setup-intent.hook.mjs.map +1 -1
  169. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
  170. package/dist/modules/cards/hooks/delete-confirmation.hook.mjs.map +1 -1
  171. package/dist/modules/cards/hooks/handle-delete-card.hook.mjs.map +1 -1
  172. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
  173. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  174. package/dist/modules/cards/types.mjs.map +1 -1
  175. package/dist/modules/charges/actions/charge-action.action.mjs.map +1 -1
  176. package/dist/modules/charges/handlers/find-charge-by-id.handler.mjs.map +1 -1
  177. package/dist/modules/charges/handlers/list-charges.handler.mjs.map +1 -1
  178. package/dist/modules/charges/hooks/charge-action.hook.mjs.map +1 -1
  179. package/dist/modules/charges/hooks/charge-by-id.hook.mjs.map +1 -1
  180. package/dist/modules/charges/hooks/charges.hook.mjs.map +1 -1
  181. package/dist/modules/charges/services/charges.service.mjs.map +1 -1
  182. package/dist/modules/charges/types/charge.type.mjs.map +1 -1
  183. package/dist/modules/ia-credits/handlers/list-ia-credits.handler.mjs.map +1 -1
  184. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  185. package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
  186. package/dist/modules/images/constants/image.constants.mjs.map +1 -1
  187. package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
  188. package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
  189. package/dist/modules/images/utils/base64.mjs.map +1 -1
  190. package/dist/modules/images/utils/compress-image.mjs.map +1 -1
  191. package/dist/modules/images/utils/crop-image.mjs.map +1 -1
  192. package/dist/modules/images/utils/validate-image.mjs.map +1 -1
  193. package/dist/modules/pages/constants/query-keys.constants.mjs.map +1 -1
  194. package/dist/modules/pages/handlers/count-pages.handler.mjs.map +1 -1
  195. package/dist/modules/pages/hooks/count-pages.hook.mjs.map +1 -1
  196. package/dist/modules/pages/services/pages.service.mjs.map +1 -1
  197. package/dist/modules/plans/handlers/find-plan-by-id.handler.mjs.map +1 -1
  198. package/dist/modules/plans/handlers/list-plans.handler.mjs.map +1 -1
  199. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  200. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  201. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  202. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  203. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  204. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  205. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  206. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -1
  207. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -1
  208. package/dist/modules/projects/actions/find-project.action.mjs.map +1 -1
  209. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  210. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -1
  211. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  212. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -1
  213. package/dist/modules/projects/handlers/find-project.handler.mjs.map +1 -1
  214. package/dist/modules/projects/handlers/list-all-account-users.handler.mjs.map +1 -1
  215. package/dist/modules/projects/handlers/list-available-users.handler.mjs.map +1 -1
  216. package/dist/modules/projects/handlers/list-project-users.handler.mjs.map +1 -1
  217. package/dist/modules/projects/handlers/list-projects.handler.mjs.map +1 -1
  218. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  219. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
  220. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
  221. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
  222. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  223. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  224. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  225. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  226. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
  227. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  228. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -1
  229. package/dist/modules/projects/services/projects.service.mjs.map +1 -1
  230. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  231. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  232. package/dist/modules/subscriptions/actions/update-subscription-payment.action.mjs.map +1 -1
  233. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  234. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  235. package/dist/modules/subscriptions/constants/subscription.constants.mjs.map +1 -1
  236. package/dist/modules/subscriptions/handlers/list-subscriptions.handler.mjs.map +1 -1
  237. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  238. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  239. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  240. package/dist/modules/subscriptions/hooks/update-subscription-payment.hook.mjs.map +1 -1
  241. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  242. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  243. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  244. package/dist/modules/subscriptions/types/pix-pending.type.mjs.map +1 -1
  245. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  246. package/dist/modules/subscriptions/utils/get-subscription-cancellation-state.mjs.map +1 -1
  247. package/dist/modules/subscriptions/utils/get-subscription-expiry-date.mjs.map +1 -1
  248. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  249. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  250. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  251. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  252. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  253. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  254. package/dist/modules/users/handlers/list-messages.handler.mjs.map +1 -1
  255. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  256. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  257. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  258. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  259. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  260. package/dist/providers/auth.provider.mjs +2 -0
  261. package/dist/providers/auth.provider.mjs.map +1 -1
  262. package/dist/providers/navigation.provider.mjs.map +1 -1
  263. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  264. package/dist/route.mjs.map +1 -1
  265. package/dist/store/useAccountModals.mjs.map +1 -1
  266. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  267. package/dist/store/useCreditsDisabledModal.mjs.map +1 -1
  268. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  269. package/dist/store/useHexaPromoModal.mjs +14 -0
  270. package/dist/store/useHexaPromoModal.mjs.map +1 -0
  271. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  272. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  273. package/dist/utils/constants/br-states.mjs.map +1 -1
  274. package/dist/utils/cookies/hexa-promo.mjs +88 -0
  275. package/dist/utils/cookies/hexa-promo.mjs.map +1 -0
  276. package/dist/utils/countries.mjs.map +1 -1
  277. package/dist/utils/format/currency.mjs.map +1 -1
  278. package/dist/utils/intl/cookie-domain.mjs.map +1 -1
  279. package/dist/utils/intl/locale-cookie.mjs.map +1 -1
  280. package/dist/utils/next-navigation.mjs.map +1 -1
  281. package/dist/utils/redirect.mjs.map +1 -1
  282. package/dist/utils/safeMutationAction.mjs.map +1 -1
  283. package/dist/utils/safeServerAction.mjs.map +1 -1
  284. package/dist/utils/withAction.mjs.map +1 -1
  285. package/package.json +115 -115
  286. package/src/components/account/ConfigurationsMyAccountModal.tsx +179 -179
  287. package/src/components/account/ConfirmDeleteAccountModal.tsx +110 -110
  288. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +68 -68
  289. package/src/components/account/DeleteAccountModal.tsx +160 -160
  290. package/src/components/account/DisableTwoFactorAuthModal.tsx +92 -92
  291. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +51 -51
  292. package/src/components/account/TwoFactorAuthModal.tsx +220 -220
  293. package/src/components/account/hooks/useChangePhoneForm.tsx +113 -113
  294. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +116 -116
  295. package/src/components/account/sections/ChangeEmailModal.tsx +239 -239
  296. package/src/components/account/sections/ChangePasswordSection.tsx +68 -68
  297. package/src/components/account/sections/ChangePhoneModal.tsx +273 -273
  298. package/src/components/account/sections/MyProfileSection.tsx +276 -276
  299. package/src/components/account/sections/PreferencesSection.tsx +278 -278
  300. package/src/components/account/sections/SecuritySection.tsx +102 -102
  301. package/src/components/account/sections/TokenSection.tsx +85 -85
  302. package/src/components/embeds/ClarityEmbed.tsx +70 -70
  303. package/src/components/embeds/CrispEmbed.tsx +195 -195
  304. package/src/components/embeds/EmbedWidgets.tsx +62 -62
  305. package/src/components/embeds/FrillEmbed.tsx +146 -146
  306. package/src/components/layouts/AppMobileNavBar.tsx +214 -214
  307. package/src/components/layouts/AppNavBar.tsx +40 -40
  308. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  309. package/src/components/layouts/NavBar.tsx +228 -228
  310. package/src/components/layouts/NotificationsPopover.tsx +120 -120
  311. package/src/components/layouts/ProfilePopover.tsx +191 -191
  312. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  313. package/src/components/layouts/UsersSelectorPopover.tsx +236 -236
  314. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  315. package/src/components/modals/BuyCreditsModal.tsx +390 -390
  316. package/src/components/modals/CreditsDisabledModal.tsx +62 -62
  317. package/src/components/modals/HexaPromoModal.tsx +212 -0
  318. package/src/components/modals/HexaPromoModalGate.tsx +80 -0
  319. package/src/components/modals/Modals.tsx +25 -25
  320. package/src/components/modals/PaidPlanRequiredModal.tsx +60 -60
  321. package/src/components/modals/cards/AddCardModal.tsx +420 -420
  322. package/src/components/modals/cards/CannotDeleteCardModal.tsx +124 -124
  323. package/src/components/modals/cards/CardFormFields.tsx +363 -363
  324. package/src/components/modals/cards/DeleteCardModal.tsx +136 -136
  325. package/src/components/navigation/CancelledSubscriptionBanner.tsx +62 -62
  326. package/src/components/navigation/NavItemsContext.ts +20 -20
  327. package/src/components/navigation/OverdueInvoiceBanner.tsx +51 -51
  328. package/src/components/navigation/PendingCancellationBanner.tsx +60 -60
  329. package/src/components/navigation/ProjectSelectorPopover.tsx +180 -180
  330. package/src/components/navigation/SubscriptionBanner.tsx +94 -94
  331. package/src/components/navigation/TrialBanner.tsx +54 -54
  332. package/src/components/navigation/UpcomingInvoiceBanner.tsx +55 -55
  333. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  334. package/src/components/navigation/subcomponents/BottomLinks.tsx +85 -85
  335. package/src/components/navigation/subcomponents/ProjectSelector.tsx +184 -184
  336. package/src/components/pages/NotFoundPage.tsx +75 -75
  337. package/src/components/pages/notifications/Notifications.tsx +190 -190
  338. package/src/components/ui/buttons/Button.tsx +77 -77
  339. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  340. package/src/components/ui/buttons/CopyButton.tsx +59 -59
  341. package/src/components/ui/data-display/Accordion.tsx +81 -81
  342. package/src/components/ui/data-display/Badge.tsx +47 -47
  343. package/src/components/ui/data-display/Card.tsx +93 -93
  344. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  345. package/src/components/ui/data-display/CardItem.tsx +135 -135
  346. package/src/components/ui/data-display/Pagination.tsx +126 -126
  347. package/src/components/ui/data-display/PaymentInfoCard.tsx +193 -193
  348. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  349. package/src/components/ui/data-display/Separator.tsx +29 -29
  350. package/src/components/ui/data-display/Table.tsx +117 -117
  351. package/src/components/ui/data-display/Tabs.tsx +67 -67
  352. package/src/components/ui/feedback/CircularProgress.tsx +79 -79
  353. package/src/components/ui/feedback/DefaultCircularProgress.tsx +67 -67
  354. package/src/components/ui/feedback/LoadingOverlay.tsx +30 -30
  355. package/src/components/ui/feedback/Progress.tsx +40 -40
  356. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  357. package/src/components/ui/feedback/Toast.tsx +104 -104
  358. package/src/components/ui/form/Calendar.tsx +228 -228
  359. package/src/components/ui/form/Checkbox.tsx +31 -31
  360. package/src/components/ui/form/ComboboxField.tsx +159 -159
  361. package/src/components/ui/form/DatePicker.tsx +100 -100
  362. package/src/components/ui/form/DateRangePicker.tsx +111 -111
  363. package/src/components/ui/form/FormField.tsx +133 -133
  364. package/src/components/ui/form/Input.tsx +20 -20
  365. package/src/components/ui/form/InputOtp.tsx +80 -80
  366. package/src/components/ui/form/PhoneInput.tsx +210 -210
  367. package/src/components/ui/form/RadioGroup.tsx +45 -45
  368. package/src/components/ui/form/Select.tsx +200 -200
  369. package/src/components/ui/form/Switch.tsx +32 -32
  370. package/src/components/ui/form/Textarea.tsx +19 -19
  371. package/src/components/ui/overlay/Command.tsx +185 -185
  372. package/src/components/ui/overlay/Dialog.tsx +153 -153
  373. package/src/components/ui/overlay/Popover.tsx +49 -49
  374. package/src/components/ui/overlay/Sheet.tsx +170 -170
  375. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  376. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +392 -392
  377. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +62 -62
  378. package/src/components/widgets/ImageUpload/ImageUpload.tsx +131 -131
  379. package/src/components/widgets/ImageUpload/index.ts +3 -3
  380. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  381. package/src/handlers.ts +22 -22
  382. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  383. package/src/hooks/useAuthQueryKey.ts +32 -32
  384. package/src/hooks/useBrandLoadingIcon.tsx +18 -18
  385. package/src/hooks/useRouter.ts +38 -38
  386. package/src/http.ts +1 -1
  387. package/src/i18n/config.ts +17 -17
  388. package/src/i18n/country-language.ts +60 -60
  389. package/src/i18n/messages/en-us.ts +519 -519
  390. package/src/i18n/messages/es-es.ts +520 -520
  391. package/src/i18n/messages/index.ts +24 -24
  392. package/src/i18n/messages/pt-br.ts +543 -543
  393. package/src/i18n/normalize.ts +15 -15
  394. package/src/i18n/resolve-locale.ts +77 -77
  395. package/src/i18n.ts +10 -10
  396. package/src/index.ts +587 -584
  397. package/src/infra/http/api-fetch.ts +39 -39
  398. package/src/infra/route/parse-id.ts +9 -9
  399. package/src/infra/route/parse-numeric.ts +16 -16
  400. package/src/infra/route/safe-route-handler.ts +16 -16
  401. package/src/infra/route/search-params.ts +9 -9
  402. package/src/infra/utils/array.ts +167 -167
  403. package/src/infra/utils/date.ts +59 -59
  404. package/src/middleware.ts +4 -4
  405. package/src/modules/accounts/actions/account-management.action.ts +109 -109
  406. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  407. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  408. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  409. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  410. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  411. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  412. package/src/modules/accounts/hooks/use-currency-formatter.hook.tsx +32 -32
  413. package/src/modules/accounts/hooks/useAccountManagement.ts +95 -95
  414. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  415. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  416. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  417. package/src/modules/accounts/services/account-token.service.ts +52 -52
  418. package/src/modules/accounts/services/account.service.ts +243 -243
  419. package/src/modules/accounts/types.ts +230 -230
  420. package/src/modules/auth/actions/social-google-login.action.ts +12 -12
  421. package/src/modules/auth/actions/social-google-onboarding.action.ts +13 -13
  422. package/src/modules/auth/actions/unlink-google.action.ts +8 -8
  423. package/src/modules/auth/actions/validate-session.action.ts +70 -70
  424. package/src/modules/auth/actions/verify-two-factor.action.ts +19 -19
  425. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  426. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  427. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  428. package/src/modules/auth/hooks/social-google-login.hook.tsx +13 -13
  429. package/src/modules/auth/hooks/social-google-onboarding.hook.tsx +13 -13
  430. package/src/modules/auth/hooks/unlink-google.hook.tsx +13 -13
  431. package/src/modules/auth/hooks/useManagementPermissions.ts +52 -52
  432. package/src/modules/auth/hooks/useUserQuery.ts +103 -103
  433. package/src/modules/auth/types/management-permission.type.ts +14 -14
  434. package/src/modules/auth/utils/assert-management-permission.ts +56 -56
  435. package/src/modules/auth/utils/assert-management-subscription.ts +38 -38
  436. package/src/modules/auth/utils/assert-paid-subscription.ts +47 -47
  437. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  438. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  439. package/src/modules/auth/utils/require-token-not-expired.ts +53 -53
  440. package/src/modules/auth/utils/require-valid-session.ts +35 -35
  441. package/src/modules/cards/actions/create-card.action.ts +9 -9
  442. package/src/modules/cards/actions/create-setup-intent.action.ts +8 -8
  443. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  444. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  445. package/src/modules/cards/handlers/find-card-by-id.handler.ts +15 -15
  446. package/src/modules/cards/handlers/list-cards.handler.ts +10 -10
  447. package/src/modules/cards/hooks/card-by-id.hook.ts +17 -17
  448. package/src/modules/cards/hooks/cards.hook.ts +22 -22
  449. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  450. package/src/modules/cards/hooks/create-setup-intent.hook.ts +11 -11
  451. package/src/modules/cards/hooks/delete-card.hook.ts +52 -52
  452. package/src/modules/cards/hooks/delete-confirmation.hook.ts +40 -40
  453. package/src/modules/cards/hooks/handle-delete-card.hook.ts +47 -47
  454. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  455. package/src/modules/cards/services/cards.service.ts +136 -136
  456. package/src/modules/cards/types.ts +52 -52
  457. package/src/modules/charges/actions/charge-action.action.ts +13 -13
  458. package/src/modules/charges/handlers/find-charge-by-id.handler.ts +14 -14
  459. package/src/modules/charges/handlers/list-charges.handler.ts +15 -15
  460. package/src/modules/charges/hooks/charge-action.hook.ts +24 -24
  461. package/src/modules/charges/hooks/charge-by-id.hook.ts +19 -19
  462. package/src/modules/charges/hooks/charges.hook.ts +19 -19
  463. package/src/modules/charges/services/charges.service.ts +63 -63
  464. package/src/modules/charges/types/charge.type.ts +68 -68
  465. package/src/modules/ia-credits/handlers/list-ia-credits.handler.ts +14 -14
  466. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +103 -103
  467. package/src/modules/images/actions/process-image.action.ts +40 -40
  468. package/src/modules/images/constants/image.constants.ts +11 -11
  469. package/src/modules/images/hooks/use-image-upload.hook.ts +153 -153
  470. package/src/modules/images/services/image-processing.service.ts +75 -75
  471. package/src/modules/images/types/image.type.ts +54 -54
  472. package/src/modules/images/utils/base64.ts +26 -26
  473. package/src/modules/images/utils/compress-image.ts +20 -20
  474. package/src/modules/images/utils/crop-image.ts +68 -68
  475. package/src/modules/images/utils/validate-image.ts +86 -86
  476. package/src/modules/pages/constants/query-keys.constants.ts +1 -1
  477. package/src/modules/pages/handlers/count-pages.handler.ts +12 -12
  478. package/src/modules/pages/hooks/count-pages.hook.ts +21 -21
  479. package/src/modules/pages/services/pages.service.ts +27 -27
  480. package/src/modules/plans/handlers/find-plan-by-id.handler.ts +14 -14
  481. package/src/modules/plans/handlers/list-plans.handler.ts +22 -22
  482. package/src/modules/plans/hooks/list-plans.hook.ts +23 -23
  483. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  484. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +39 -39
  485. package/src/modules/plans/services/plans.service.ts +136 -136
  486. package/src/modules/plans/types/plan.type.ts +79 -79
  487. package/src/modules/plans/utils/map-api-plan-to-ui.ts +167 -167
  488. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  489. package/src/modules/projects/actions/create-project.action.ts +9 -9
  490. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  491. package/src/modules/projects/actions/find-project.action.ts +8 -8
  492. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  493. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  494. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  495. package/src/modules/projects/actions/update-project.action.ts +9 -9
  496. package/src/modules/projects/handlers/find-project.handler.ts +15 -15
  497. package/src/modules/projects/handlers/list-all-account-users.handler.ts +23 -23
  498. package/src/modules/projects/handlers/list-available-users.handler.ts +26 -26
  499. package/src/modules/projects/handlers/list-project-users.handler.ts +26 -26
  500. package/src/modules/projects/handlers/list-projects.handler.ts +23 -23
  501. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  502. package/src/modules/projects/hooks/create-project.hook.ts +120 -120
  503. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  504. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  505. package/src/modules/projects/hooks/list-all-account-users.hook.ts +40 -40
  506. package/src/modules/projects/hooks/list-available-users.hook.ts +39 -39
  507. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +44 -44
  508. package/src/modules/projects/hooks/list-project-users.hook.ts +39 -39
  509. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  510. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  511. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  512. package/src/modules/projects/services/projects.service.ts +156 -156
  513. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  514. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  515. package/src/modules/subscriptions/actions/update-subscription-payment.action.ts +13 -13
  516. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  517. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  518. package/src/modules/subscriptions/constants/subscription.constants.ts +1 -1
  519. package/src/modules/subscriptions/handlers/list-subscriptions.handler.ts +17 -17
  520. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  521. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +22 -22
  522. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +22 -22
  523. package/src/modules/subscriptions/hooks/update-subscription-payment.hook.ts +25 -25
  524. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  525. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +44 -44
  526. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  527. package/src/modules/subscriptions/types/calculate-subscription.type.ts +116 -116
  528. package/src/modules/subscriptions/types/pix-pending.type.ts +38 -38
  529. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  530. package/src/modules/subscriptions/utils/get-subscription-cancellation-state.ts +37 -37
  531. package/src/modules/subscriptions/utils/get-subscription-expiry-date.ts +33 -33
  532. package/src/modules/subscriptions/utils/has-subscription-expired.ts +11 -11
  533. package/src/modules/subscriptions/utils/periodicity.ts +79 -79
  534. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  535. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  536. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  537. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  538. package/src/modules/users/handlers/list-messages.handler.ts +39 -39
  539. package/src/modules/users/hooks/messages.hook.ts +69 -69
  540. package/src/modules/users/services/messages.service.ts +49 -49
  541. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  542. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  543. package/src/modules/whitelabel/schema.ts +84 -84
  544. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  545. package/src/providers/auth.provider.tsx +267 -264
  546. package/src/providers/navigation.provider.tsx +99 -99
  547. package/src/providers/whitelabel.provider.tsx +90 -90
  548. package/src/route.ts +4 -4
  549. package/src/store/useAccountModals.ts +85 -85
  550. package/src/store/useBuyCreditsModal.ts +21 -21
  551. package/src/store/useCreditsDisabledModal.ts +11 -11
  552. package/src/store/useDesktopSidebarStore.ts +47 -47
  553. package/src/store/useHexaPromoModal.ts +13 -0
  554. package/src/store/useMdSidebarStore.ts +34 -34
  555. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  556. package/src/utils/constants/br-states.ts +29 -29
  557. package/src/utils/cookies/hexa-promo.ts +114 -0
  558. package/src/utils/countries.ts +224 -224
  559. package/src/utils/format/currency.ts +70 -70
  560. package/src/utils/intl/cookie-domain.ts +29 -29
  561. package/src/utils/intl/locale-cookie.ts +18 -18
  562. package/src/utils/next-navigation.ts +7 -7
  563. package/src/utils/redirect.ts +78 -78
  564. package/src/utils/safeMutationAction.ts +24 -24
  565. package/src/utils/safeServerAction.ts +21 -21
  566. package/src/utils/withAction.ts +13 -13
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ui/overlay/Sheet.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\";\nimport { IconX } from '@tabler/icons-react';\nimport { cn } from \"../../../infra/utils/clsx\";\nimport { hideCrisp, showCrisp } from \"../../embeds/CrispEmbed\";\n\nfunction Sheet({ onOpenChange, modal = false, ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n const handleOpenChange = React.useCallback((open: boolean) => {\n if (open) hideCrisp();\n else showCrisp();\n onOpenChange?.(open);\n }, [onOpenChange]);\n\n return <SheetPrimitive.Root data-slot=\"sheet\" modal={modal} onOpenChange={handleOpenChange} {...props} />;\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <SheetPrimitive.Close tabIndex={-1} asChild>\n <div\n data-slot=\"sheet-overlay\"\n className={cn(\n \"animate-in fade-in-0 fixed inset-0 z-[1000] bg-black/50 cursor-default\",\n className,\n )}\n {...props}\n />\n </SheetPrimitive.Close>\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n noAnimation = false,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n showCloseButton?: boolean;\n noAnimation?: boolean;\n}) {\n return (\n <SheetPortal>\n <SheetOverlay className={noAnimation ? \"!animate-none\" : undefined} />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n onInteractOutside={(e) => e.preventDefault()}\n onPointerDownOutside={(e) => e.preventDefault()}\n className={cn(\n \"bg-background fixed z-[1001] flex flex-col gap-4 shadow-lg\",\n !noAnimation &&\n \"data-[state=open]:animate-in data-[state=closed]:animate-out transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n !noAnimation &&\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right\",\n !noAnimation &&\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left\",\n !noAnimation &&\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n !noAnimation &&\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n side === \"right\" &&\n \"inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" && \"inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" && \"inset-x-0 bottom-0 h-auto border-t\",\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close\n data-slot=\"sheet-close\"\n className=\"absolute top-3 right-3 hover:cursor-pointer flex size-8 items-center justify-center rounded-lg p-2 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-950 focus:outline-none\"\n >\n <IconX className=\"size-[18px]\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n};\n"],"mappings":";AAeS,cAsFC,YAtFD;AAbT,YAAY,WAAW;AACvB,YAAY,oBAAoB;AAChC,SAAS,aAAa;AACtB,SAAS,UAAU;AACnB,SAAS,WAAW,iBAAiB;AAErC,SAAS,MAAM,EAAE,cAAc,QAAQ,OAAO,GAAG,MAAM,GAAqD;AAC1G,QAAM,mBAAmB,MAAM,YAAY,CAAC,SAAkB;AAC5D,QAAI,KAAM,WAAU;AAAA,QACf,WAAU;AACf,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,YAAY,CAAC;AAEjB,SAAO,oBAAC,eAAe,MAAf,EAAoB,aAAU,SAAQ,OAAc,cAAc,kBAAmB,GAAG,OAAO;AACzG;AAEA,SAAS,aAAa;AAAA,EACpB,GAAG;AACL,GAAwD;AACtD,SAAO,oBAAC,eAAe,SAAf,EAAuB,aAAU,iBAAiB,GAAG,OAAO;AACtE;AAEA,SAAS,WAAW;AAAA,EAClB,GAAG;AACL,GAAsD;AACpD,SAAO,oBAAC,eAAe,OAAf,EAAqB,aAAU,eAAe,GAAG,OAAO;AAClE;AAEA,SAAS,YAAY;AAAA,EACnB,GAAG;AACL,GAAuD;AACrD,SAAO,oBAAC,eAAe,QAAf,EAAsB,aAAU,gBAAgB,GAAG,OAAO;AACpE;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE,oBAAC,eAAe,OAAf,EAAqB,UAAU,IAAI,SAAO,MACzC;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN,GACF;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,GAAG;AACL,GAIG;AACD,SACE,qBAAC,eACC;AAAA,wBAAC,gBAAa,WAAW,cAAc,kBAAkB,QAAW;AAAA,IACpE;AAAA,MAAC,eAAe;AAAA,MAAf;AAAA,QACC,aAAU;AAAA,QACV,mBAAmB,CAAC,MAAM,EAAE,eAAe;AAAA,QAC3C,sBAAsB,CAAC,MAAM,EAAE,eAAe;AAAA,QAC9C,WAAW;AAAA,UACT;AAAA,UACA,CAAC,eACC;AAAA,UACF,CAAC,eACC,SAAS,WACT;AAAA,UACF,CAAC,eACC,SAAS,UACT;AAAA,UACF,CAAC,eACC,SAAS,SACT;AAAA,UACF,CAAC,eACC,SAAS,YACT;AAAA,UACF,SAAS,WACP;AAAA,UACF,SAAS,UACP;AAAA,UACF,SAAS,SAAS;AAAA,UAClB,SAAS,YAAY;AAAA,UACrB;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,UACA,mBACC;AAAA,YAAC,eAAe;AAAA,YAAf;AAAA,cACC,aAAU;AAAA,cACV,WAAU;AAAA,cAEV;AAAA,oCAAC,SAAM,WAAU,eAAc;AAAA,gBAC/B,oBAAC,UAAK,WAAU,WAAU,mBAAK;AAAA;AAAA;AAAA,UACjC;AAAA;AAAA;AAAA,IAEJ;AAAA,KACF;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,6BAA6B,SAAS;AAAA,MACnD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,mCAAmC,SAAS;AAAA,MACzD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA,GAAG;AACL,GAAsD;AACpD,SACE;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA,GAAG;AACL,GAA4D;AAC1D,SACE;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/ui/overlay/Sheet.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\";\r\nimport { IconX } from '@tabler/icons-react';\r\nimport { cn } from \"../../../infra/utils/clsx\";\r\nimport { hideCrisp, showCrisp } from \"../../embeds/CrispEmbed\";\r\n\r\nfunction Sheet({ onOpenChange, modal = false, ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\r\n const handleOpenChange = React.useCallback((open: boolean) => {\r\n if (open) hideCrisp();\r\n else showCrisp();\r\n onOpenChange?.(open);\r\n }, [onOpenChange]);\r\n\r\n return <SheetPrimitive.Root data-slot=\"sheet\" modal={modal} onOpenChange={handleOpenChange} {...props} />;\r\n}\r\n\r\nfunction SheetTrigger({\r\n ...props\r\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\r\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\r\n}\r\n\r\nfunction SheetClose({\r\n ...props\r\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\r\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\r\n}\r\n\r\nfunction SheetPortal({\r\n ...props\r\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\r\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\r\n}\r\n\r\nfunction SheetOverlay({\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"div\">) {\r\n return (\r\n <SheetPrimitive.Close tabIndex={-1} asChild>\r\n <div\r\n data-slot=\"sheet-overlay\"\r\n className={cn(\r\n \"animate-in fade-in-0 fixed inset-0 z-[1000] bg-black/50 cursor-default\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n </SheetPrimitive.Close>\r\n );\r\n}\r\n\r\nfunction SheetContent({\r\n className,\r\n children,\r\n side = \"right\",\r\n showCloseButton = true,\r\n noAnimation = false,\r\n ...props\r\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\r\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\r\n showCloseButton?: boolean;\r\n noAnimation?: boolean;\r\n}) {\r\n return (\r\n <SheetPortal>\r\n <SheetOverlay className={noAnimation ? \"!animate-none\" : undefined} />\r\n <SheetPrimitive.Content\r\n data-slot=\"sheet-content\"\r\n onInteractOutside={(e) => e.preventDefault()}\r\n onPointerDownOutside={(e) => e.preventDefault()}\r\n className={cn(\r\n \"bg-background fixed z-[1001] flex flex-col gap-4 shadow-lg\",\r\n !noAnimation &&\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\r\n !noAnimation &&\r\n side === \"right\" &&\r\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right\",\r\n !noAnimation &&\r\n side === \"left\" &&\r\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left\",\r\n !noAnimation &&\r\n side === \"top\" &&\r\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\r\n !noAnimation &&\r\n side === \"bottom\" &&\r\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\r\n side === \"right\" &&\r\n \"inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\r\n side === \"left\" &&\r\n \"inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\r\n side === \"top\" && \"inset-x-0 top-0 h-auto border-b\",\r\n side === \"bottom\" && \"inset-x-0 bottom-0 h-auto border-t\",\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n {showCloseButton && (\r\n <SheetPrimitive.Close\r\n data-slot=\"sheet-close\"\r\n className=\"absolute top-3 right-3 hover:cursor-pointer flex size-8 items-center justify-center rounded-lg p-2 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-950 focus:outline-none\"\r\n >\r\n <IconX className=\"size-[18px]\" />\r\n <span className=\"sr-only\">Close</span>\r\n </SheetPrimitive.Close>\r\n )}\r\n </SheetPrimitive.Content>\r\n </SheetPortal>\r\n );\r\n}\r\n\r\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\r\n return (\r\n <div\r\n data-slot=\"sheet-header\"\r\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\r\n return (\r\n <div\r\n data-slot=\"sheet-footer\"\r\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SheetTitle({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\r\n return (\r\n <SheetPrimitive.Title\r\n data-slot=\"sheet-title\"\r\n className={cn(\"text-foreground font-semibold\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SheetDescription({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\r\n return (\r\n <SheetPrimitive.Description\r\n data-slot=\"sheet-description\"\r\n className={cn(\"text-muted-foreground text-sm\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport {\r\n Sheet,\r\n SheetTrigger,\r\n SheetClose,\r\n SheetContent,\r\n SheetHeader,\r\n SheetFooter,\r\n SheetTitle,\r\n SheetDescription,\r\n};\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ui/overlay/Tooltip.tsx"],"sourcesContent":["'use client';\n\n\"use client\"\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\nimport { cn } from \"../../../infra/utils/clsx\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n )\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance pointer-events-none\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n"],"mappings":";AAaI,cAgCE,YAhCF;AARJ,YAAY,sBAAsB;AAClC,SAAS,UAAU;AAEnB,SAAS,gBAAgB;AAAA,EACvB,gBAAgB;AAAA,EAChB,GAAG;AACL,GAA2D;AACzD,SACE;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf,GAAG;AACL,GAAuD;AACrD,SACE,oBAAC,mBACC,8BAAC,iBAAiB,MAAjB,EAAsB,aAAU,WAAW,GAAG,OAAO,GACxD;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB,GAAG;AACL,GAA0D;AACxD,SAAO,oBAAC,iBAAiB,SAAjB,EAAyB,aAAU,mBAAmB,GAAG,OAAO;AAC1E;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GAA0D;AACxD,SACE,oBAAC,iBAAiB,QAAjB,EACC;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,oBAAC,iBAAiB,OAAjB,EAAuB,WAAU,oGAAmG;AAAA;AAAA;AAAA,EACvI,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/ui/overlay/Tooltip.tsx"],"sourcesContent":["'use client';\r\n\r\n\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\r\nimport { cn } from \"../../../infra/utils/clsx\"\r\n\r\nfunction TooltipProvider({\r\n delayDuration = 0,\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\r\n return (\r\n <TooltipPrimitive.Provider\r\n data-slot=\"tooltip-provider\"\r\n delayDuration={delayDuration}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction Tooltip({\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\r\n return (\r\n <TooltipProvider>\r\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\r\n </TooltipProvider>\r\n )\r\n}\r\n\r\nfunction TooltipTrigger({\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\r\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\r\n}\r\n\r\nfunction TooltipContent({\r\n className,\r\n sideOffset = 0,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\r\n return (\r\n <TooltipPrimitive.Portal>\r\n <TooltipPrimitive.Content\r\n data-slot=\"tooltip-content\"\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance pointer-events-none\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]\" />\r\n </TooltipPrimitive.Content>\r\n </TooltipPrimitive.Portal>\r\n )\r\n}\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\r\n"],"mappings":";AAaI,cAgCE,YAhCF;AARJ,YAAY,sBAAsB;AAClC,SAAS,UAAU;AAEnB,SAAS,gBAAgB;AAAA,EACvB,gBAAgB;AAAA,EAChB,GAAG;AACL,GAA2D;AACzD,SACE;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf,GAAG;AACL,GAAuD;AACrD,SACE,oBAAC,mBACC,8BAAC,iBAAiB,MAAjB,EAAsB,aAAU,WAAW,GAAG,OAAO,GACxD;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB,GAAG;AACL,GAA0D;AACxD,SAAO,oBAAC,iBAAiB,SAAjB,EAAyB,aAAU,mBAAmB,GAAG,OAAO;AAC1E;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GAA0D;AACxD,SACE,oBAAC,iBAAiB,QAAjB,EACC;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,oBAAC,iBAAiB,OAAjB,EAAuB,WAAU,oGAAmG;AAAA;AAAA;AAAA,EACvI,GACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/widgets/ImageUpload/ImageCropModal.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport ReactCrop, {\n type Crop,\n centerCrop,\n makeAspectCrop,\n} from 'react-image-crop'\nimport 'react-image-crop/dist/ReactCrop.css'\nimport {\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../../ui/overlay/Dialog'\nimport { Button } from '../../ui/buttons/Button'\n\n// CSS customizado para grid pontilhado fino e círculo\nconst baseCropStyles = `\n .custom-crop-area .ReactCrop__crop-selection {\n border: 2px solid white !important;\n box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.5) !important;\n }\n\n /* Grid de 9 quadrados - linhas pontilhadas finas */\n .custom-crop-area .ReactCrop__crop-selection .crop-grid {\n position: absolute;\n inset: 0;\n pointer-events: none;\n }\n\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line {\n position: absolute;\n background: repeating-linear-gradient(\n to right,\n rgba(255, 255, 255, 0.5) 0,\n rgba(255, 255, 255, 0.5) 4px,\n transparent 4px,\n transparent 8px\n );\n }\n\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line.horizontal {\n left: 0;\n right: 0;\n height: 1px;\n }\n\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line.vertical {\n top: 0;\n bottom: 0;\n width: 1px;\n background: repeating-linear-gradient(\n to bottom,\n rgba(255, 255, 255, 0.5) 0,\n rgba(255, 255, 255, 0.5) 4px,\n transparent 4px,\n transparent 8px\n );\n }\n\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line.h1 { top: 33.33%; }\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line.h2 { top: 66.66%; }\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line.v1 { left: 33.33%; }\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line.v2 { left: 66.66%; }\n\n /* Círculo inscrito */\n .custom-crop-area.with-circle .ReactCrop__crop-selection .crop-circle {\n position: absolute;\n inset: 0;\n border: 1px dashed rgba(255, 255, 255, 0.6);\n border-radius: 50%;\n pointer-events: none;\n }\n\n /* Ocultar handles das laterais (manter só os 4 cantos) */\n .custom-crop-area .ReactCrop__drag-handle.ord-n,\n .custom-crop-area .ReactCrop__drag-handle.ord-s,\n .custom-crop-area .ReactCrop__drag-handle.ord-e,\n .custom-crop-area .ReactCrop__drag-handle.ord-w {\n display: none !important;\n }\n\n /* Estilizar handles dos cantos — indicador preto em L nos cantos */\n .custom-crop-area .ReactCrop__drag-handle.ord-nw,\n .custom-crop-area .ReactCrop__drag-handle.ord-ne,\n .custom-crop-area .ReactCrop__drag-handle.ord-sw,\n .custom-crop-area .ReactCrop__drag-handle.ord-se {\n width: 20px;\n height: 20px;\n background: transparent !important;\n border: none !important;\n }\n\n .custom-crop-area .ReactCrop__drag-handle.ord-nw::after,\n .custom-crop-area .ReactCrop__drag-handle.ord-ne::after,\n .custom-crop-area .ReactCrop__drag-handle.ord-sw::after,\n .custom-crop-area .ReactCrop__drag-handle.ord-se::after {\n content: '';\n position: absolute;\n width: 22px;\n height: 22px;\n border-color: white;\n border-style: solid;\n border-width: 0;\n }\n\n .custom-crop-area .ReactCrop__drag-handle.ord-nw::after {\n top: -2px; left: -2px;\n border-top-width: 4px;\n border-left-width: 4px;\n }\n\n .custom-crop-area .ReactCrop__drag-handle.ord-ne::after {\n top: -2px; right: -2px;\n border-top-width: 4px;\n border-right-width: 4px;\n }\n\n .custom-crop-area .ReactCrop__drag-handle.ord-sw::after {\n bottom: -2px; left: -2px;\n border-bottom-width: 4px;\n border-left-width: 4px;\n }\n\n .custom-crop-area .ReactCrop__drag-handle.ord-se::after {\n bottom: -2px; right: -2px;\n border-bottom-width: 4px;\n border-right-width: 4px;\n }\n\n /* Desabilitar drag da imagem de fundo */\n .custom-crop-area img {\n pointer-events: none;\n user-select: none;\n -webkit-user-drag: none;\n /* Xadrez de transparência: fica atrás dos pixels da imagem, então só\n aparece onde a imagem é transparente. Imagens opacas cobrem o padrão. */\n background-color: #fff;\n background-image:\n linear-gradient(45deg, #ccc 25%, transparent 25%),\n linear-gradient(-45deg, #ccc 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #ccc 75%),\n linear-gradient(-45deg, transparent 75%, #ccc 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0;\n }\n`\n\ninterface ImageCropModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n imageSrc: string\n aspectRatio: number\n onConfirm: (image: HTMLImageElement, crop: Crop) => void\n onCancel?: () => void\n onImageLoad?: (naturalWidth: number, naturalHeight: number) => void\n showCircleGuide?: boolean\n minWidth?: number\n minHeight?: number\n /**\n * Nome do arquivo atual, usado na mensagem da variante \"imagem muito pequena\".\n * Opcional — se ausente, a mensagem cai num texto genérico.\n */\n fileName?: string\n /**\n * Callback disparado quando o usuário clica em \"Enviar outra\" na variante\n * \"imagem muito pequena\". Normalmente abre um file input. Se não for passado,\n * o botão \"Enviar outra\" é escondido.\n */\n onSelectAnother?: () => void\n}\n\ntype ImageStatus = 'loading' | 'too-small' | 'ok'\n\nexport function ImageCropModal({\n open,\n onOpenChange,\n imageSrc,\n aspectRatio,\n onConfirm,\n onCancel,\n onImageLoad: onImageLoadCallback,\n showCircleGuide,\n minWidth,\n minHeight,\n fileName,\n onSelectAnother,\n}: ImageCropModalProps) {\n const translate = useTranslations()\n const imgRef = useRef<HTMLImageElement>(null)\n const [crop, setCrop] = useState<Crop>()\n const [imageSize, setImageSize] = useState({ width: 0, height: 0 })\n const [imageStatus, setImageStatus] = useState<ImageStatus>('loading')\n\n // Ref pra callback externo — evita re-rodar o effect de preload toda vez que\n // a identidade do callback muda.\n const onImageLoadCallbackRef = useRef(onImageLoadCallback)\n useEffect(() => {\n onImageLoadCallbackRef.current = onImageLoadCallback\n })\n\n // Pre-carrega a imagem fora do DOM pra medir dimensões ANTES de montar\n // o ReactCrop. Assim conseguimos decidir entre a variante de crop e a\n // variante \"imagem muito pequena\" sem flash de UI.\n useEffect(() => {\n if (!open || !imageSrc) {\n setImageStatus('loading')\n return\n }\n\n setImageStatus('loading')\n let cancelled = false\n\n const img = new window.Image()\n img.onload = () => {\n if (cancelled) return\n const { naturalWidth, naturalHeight } = img\n setImageSize({ width: naturalWidth, height: naturalHeight })\n onImageLoadCallbackRef.current?.(naturalWidth, naturalHeight)\n\n const tooSmall =\n (minWidth !== undefined && naturalWidth < minWidth) ||\n (minHeight !== undefined && naturalHeight < minHeight)\n setImageStatus(tooSmall ? 'too-small' : 'ok')\n }\n img.onerror = () => {\n if (cancelled) return\n setImageStatus('too-small')\n }\n img.src = imageSrc\n\n return () => {\n cancelled = true\n }\n }, [open, imageSrc, minWidth, minHeight])\n\n // Inicializa o crop quando o <img> do ReactCrop monta. A imagem já está em\n // cache vinda do preload, então carrega instantâneo.\n const onCropImgLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {\n const { naturalWidth, naturalHeight } = e.currentTarget\n const initialCrop = centerCrop(\n makeAspectCrop(\n { unit: '%', width: 90 },\n aspectRatio,\n naturalWidth,\n naturalHeight\n ),\n naturalWidth,\n naturalHeight\n )\n setCrop(initialCrop)\n }\n\n // Calcula tamanho mínimo em porcentagem baseado nas dimensões mínimas em pixels\n const minCropWidth = minWidth && imageSize.width > 0\n ? Math.min((minWidth / imageSize.width) * 100, 100)\n : undefined\n const minCropHeight = minHeight && imageSize.height > 0\n ? Math.min((minHeight / imageSize.height) * 100, 100)\n : undefined\n\n const handleConfirm = () => {\n if (imgRef.current && crop) {\n onConfirm(imgRef.current, crop)\n }\n }\n\n const handleCancel = () => {\n onCancel?.()\n onOpenChange(false)\n }\n\n // Determina se deve mostrar círculo (aspect ratio 1:1 por padrão)\n const shouldShowCircle = showCircleGuide ?? aspectRatio === 1\n\n // Renderiza grid, círculo e bolinhas dentro da área de crop\n const renderSelectionAddon = () => (\n <>\n {/* Grid de 9 quadrados com linhas pontilhadas */}\n <div className=\"crop-grid\">\n <div className=\"crop-grid-line horizontal h1\" />\n <div className=\"crop-grid-line horizontal h2\" />\n <div className=\"crop-grid-line vertical v1\" />\n <div className=\"crop-grid-line vertical v2\" />\n </div>\n {/* Círculo inscrito */}\n {shouldShowCircle && <div className=\"crop-circle\" />}\n </>\n )\n\n const dimensionText =\n minWidth !== undefined && minHeight !== undefined\n ? `${minWidth}x${minHeight}px`\n : null\n\n const isTooSmall = imageStatus === 'too-small'\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <style>{baseCropStyles}</style>\n <DialogContent\n className={\n isTooSmall\n ? 'w-full md:w-[480px]! lg:w-[480px]! max-w-[480px]! max-[480px]:w-[calc(100%-32px)] p-0 gap-0 z-[1003]!'\n : 'w-full md:w-[650px]! lg:w-[650px]! max-w-[650px]! max-[650px]:w-[calc(100%-32px)] p-0 gap-0 z-[1003]!'\n }\n overlayClassName=\"z-[1002]!\"\n >\n {isTooSmall ? (\n <>\n <DialogHeader className=\"p-5\">\n <DialogTitle className=\"text-center text-[16px]!\">\n {dimensionText\n ? translate('common.imageUpload.tooSmallTitleWithDimension', { dimensionText })\n : translate('common.imageUpload.tooSmallTitleGeneric')}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"px-5 pb-5\">\n <p className=\"paragraph-small-regular text-zinc-600 text-center\">\n {fileName && dimensionText\n ? translate('common.imageUpload.tooSmallBodyFileWithDimension', { fileName, dimensionText })\n : fileName && !dimensionText\n ? translate('common.imageUpload.tooSmallBodyFileGeneric', { fileName })\n : !fileName && dimensionText\n ? translate('common.imageUpload.tooSmallBodyNoFileWithDimension', { dimensionText })\n : translate('common.imageUpload.tooSmallBodyNoFileGeneric')}\n </p>\n </div>\n\n <DialogFooter className=\"flex-row! items-center justify-start! gap-3 p-5 border-t border-zinc-200\">\n {onSelectAnother && <Button onClick={onSelectAnother}>{translate('common.imageUpload.sendAnother')}</Button>}\n <Button variant=\"secondary\" onClick={handleCancel}>\n {translate('common.actions.cancel')}\n </Button>\n </DialogFooter>\n </>\n ) : (\n <>\n <DialogHeader className=\"p-5\">\n <DialogTitle className=\"text-center text-[16px]!\">\n {translate('common.imageUpload.cropTitle')}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"flex flex-col gap-4 px-5 pb-5\">\n <div className=\"flex justify-center overflow-hidden rounded-lg min-h-[200px]\">\n {imageStatus === 'ok' && (\n <ReactCrop\n crop={crop}\n onChange={(c: Crop) => setCrop(c)}\n aspect={aspectRatio}\n className={`max-h-[50vh] custom-crop-area ${shouldShowCircle ? 'with-circle' : ''}`}\n keepSelection\n minWidth={minCropWidth}\n minHeight={minCropHeight}\n renderSelectionAddon={renderSelectionAddon}\n >\n <img\n ref={imgRef}\n src={imageSrc}\n alt={translate('common.imageUpload.cropAlt')}\n onLoad={onCropImgLoad}\n draggable={false}\n className=\"max-h-[50vh] object-contain select-none\"\n />\n </ReactCrop>\n )}\n </div>\n\n <p className=\"paragraph-small-regular text-zinc-500 text-center\">\n {translate('common.imageUpload.cropHint')}\n </p>\n </div>\n\n <DialogFooter className=\"flex-row! items-center justify-start! gap-3 p-5 border-t border-zinc-200\">\n <Button onClick={handleConfirm} disabled={imageStatus !== 'ok' || !crop}>\n {translate('common.actions.confirm')}\n </Button>\n <Button variant=\"secondary\" onClick={handleCancel}>\n {translate('common.actions.cancel')}\n </Button>\n </DialogFooter>\n </>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/widgets/ImageUpload/ImageCropModal.tsx"],"sourcesContent":["'use client'\r\n\r\nimport { useEffect, useRef, useState } from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport ReactCrop, {\r\n type Crop,\r\n centerCrop,\r\n makeAspectCrop,\r\n} from 'react-image-crop'\r\nimport 'react-image-crop/dist/ReactCrop.css'\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '../../ui/overlay/Dialog'\r\nimport { Button } from '../../ui/buttons/Button'\r\n\r\n// CSS customizado para grid pontilhado fino e círculo\r\nconst baseCropStyles = `\r\n .custom-crop-area .ReactCrop__crop-selection {\r\n border: 2px solid white !important;\r\n box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.5) !important;\r\n }\r\n\r\n /* Grid de 9 quadrados - linhas pontilhadas finas */\r\n .custom-crop-area .ReactCrop__crop-selection .crop-grid {\r\n position: absolute;\r\n inset: 0;\r\n pointer-events: none;\r\n }\r\n\r\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line {\r\n position: absolute;\r\n background: repeating-linear-gradient(\r\n to right,\r\n rgba(255, 255, 255, 0.5) 0,\r\n rgba(255, 255, 255, 0.5) 4px,\r\n transparent 4px,\r\n transparent 8px\r\n );\r\n }\r\n\r\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line.horizontal {\r\n left: 0;\r\n right: 0;\r\n height: 1px;\r\n }\r\n\r\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line.vertical {\r\n top: 0;\r\n bottom: 0;\r\n width: 1px;\r\n background: repeating-linear-gradient(\r\n to bottom,\r\n rgba(255, 255, 255, 0.5) 0,\r\n rgba(255, 255, 255, 0.5) 4px,\r\n transparent 4px,\r\n transparent 8px\r\n );\r\n }\r\n\r\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line.h1 { top: 33.33%; }\r\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line.h2 { top: 66.66%; }\r\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line.v1 { left: 33.33%; }\r\n .custom-crop-area .ReactCrop__crop-selection .crop-grid-line.v2 { left: 66.66%; }\r\n\r\n /* Círculo inscrito */\r\n .custom-crop-area.with-circle .ReactCrop__crop-selection .crop-circle {\r\n position: absolute;\r\n inset: 0;\r\n border: 1px dashed rgba(255, 255, 255, 0.6);\r\n border-radius: 50%;\r\n pointer-events: none;\r\n }\r\n\r\n /* Ocultar handles das laterais (manter só os 4 cantos) */\r\n .custom-crop-area .ReactCrop__drag-handle.ord-n,\r\n .custom-crop-area .ReactCrop__drag-handle.ord-s,\r\n .custom-crop-area .ReactCrop__drag-handle.ord-e,\r\n .custom-crop-area .ReactCrop__drag-handle.ord-w {\r\n display: none !important;\r\n }\r\n\r\n /* Estilizar handles dos cantos — indicador preto em L nos cantos */\r\n .custom-crop-area .ReactCrop__drag-handle.ord-nw,\r\n .custom-crop-area .ReactCrop__drag-handle.ord-ne,\r\n .custom-crop-area .ReactCrop__drag-handle.ord-sw,\r\n .custom-crop-area .ReactCrop__drag-handle.ord-se {\r\n width: 20px;\r\n height: 20px;\r\n background: transparent !important;\r\n border: none !important;\r\n }\r\n\r\n .custom-crop-area .ReactCrop__drag-handle.ord-nw::after,\r\n .custom-crop-area .ReactCrop__drag-handle.ord-ne::after,\r\n .custom-crop-area .ReactCrop__drag-handle.ord-sw::after,\r\n .custom-crop-area .ReactCrop__drag-handle.ord-se::after {\r\n content: '';\r\n position: absolute;\r\n width: 22px;\r\n height: 22px;\r\n border-color: white;\r\n border-style: solid;\r\n border-width: 0;\r\n }\r\n\r\n .custom-crop-area .ReactCrop__drag-handle.ord-nw::after {\r\n top: -2px; left: -2px;\r\n border-top-width: 4px;\r\n border-left-width: 4px;\r\n }\r\n\r\n .custom-crop-area .ReactCrop__drag-handle.ord-ne::after {\r\n top: -2px; right: -2px;\r\n border-top-width: 4px;\r\n border-right-width: 4px;\r\n }\r\n\r\n .custom-crop-area .ReactCrop__drag-handle.ord-sw::after {\r\n bottom: -2px; left: -2px;\r\n border-bottom-width: 4px;\r\n border-left-width: 4px;\r\n }\r\n\r\n .custom-crop-area .ReactCrop__drag-handle.ord-se::after {\r\n bottom: -2px; right: -2px;\r\n border-bottom-width: 4px;\r\n border-right-width: 4px;\r\n }\r\n\r\n /* Desabilitar drag da imagem de fundo */\r\n .custom-crop-area img {\r\n pointer-events: none;\r\n user-select: none;\r\n -webkit-user-drag: none;\r\n /* Xadrez de transparência: fica atrás dos pixels da imagem, então só\r\n aparece onde a imagem é transparente. Imagens opacas cobrem o padrão. */\r\n background-color: #fff;\r\n background-image:\r\n linear-gradient(45deg, #ccc 25%, transparent 25%),\r\n linear-gradient(-45deg, #ccc 25%, transparent 25%),\r\n linear-gradient(45deg, transparent 75%, #ccc 75%),\r\n linear-gradient(-45deg, transparent 75%, #ccc 75%);\r\n background-size: 16px 16px;\r\n background-position: 0 0, 0 8px, 8px -8px, -8px 0;\r\n }\r\n`\r\n\r\ninterface ImageCropModalProps {\r\n open: boolean\r\n onOpenChange: (open: boolean) => void\r\n imageSrc: string\r\n aspectRatio: number\r\n onConfirm: (image: HTMLImageElement, crop: Crop) => void\r\n onCancel?: () => void\r\n onImageLoad?: (naturalWidth: number, naturalHeight: number) => void\r\n showCircleGuide?: boolean\r\n minWidth?: number\r\n minHeight?: number\r\n /**\r\n * Nome do arquivo atual, usado na mensagem da variante \"imagem muito pequena\".\r\n * Opcional — se ausente, a mensagem cai num texto genérico.\r\n */\r\n fileName?: string\r\n /**\r\n * Callback disparado quando o usuário clica em \"Enviar outra\" na variante\r\n * \"imagem muito pequena\". Normalmente abre um file input. Se não for passado,\r\n * o botão \"Enviar outra\" é escondido.\r\n */\r\n onSelectAnother?: () => void\r\n}\r\n\r\ntype ImageStatus = 'loading' | 'too-small' | 'ok'\r\n\r\nexport function ImageCropModal({\r\n open,\r\n onOpenChange,\r\n imageSrc,\r\n aspectRatio,\r\n onConfirm,\r\n onCancel,\r\n onImageLoad: onImageLoadCallback,\r\n showCircleGuide,\r\n minWidth,\r\n minHeight,\r\n fileName,\r\n onSelectAnother,\r\n}: ImageCropModalProps) {\r\n const translate = useTranslations()\r\n const imgRef = useRef<HTMLImageElement>(null)\r\n const [crop, setCrop] = useState<Crop>()\r\n const [imageSize, setImageSize] = useState({ width: 0, height: 0 })\r\n const [imageStatus, setImageStatus] = useState<ImageStatus>('loading')\r\n\r\n // Ref pra callback externo — evita re-rodar o effect de preload toda vez que\r\n // a identidade do callback muda.\r\n const onImageLoadCallbackRef = useRef(onImageLoadCallback)\r\n useEffect(() => {\r\n onImageLoadCallbackRef.current = onImageLoadCallback\r\n })\r\n\r\n // Pre-carrega a imagem fora do DOM pra medir dimensões ANTES de montar\r\n // o ReactCrop. Assim conseguimos decidir entre a variante de crop e a\r\n // variante \"imagem muito pequena\" sem flash de UI.\r\n useEffect(() => {\r\n if (!open || !imageSrc) {\r\n setImageStatus('loading')\r\n return\r\n }\r\n\r\n setImageStatus('loading')\r\n let cancelled = false\r\n\r\n const img = new window.Image()\r\n img.onload = () => {\r\n if (cancelled) return\r\n const { naturalWidth, naturalHeight } = img\r\n setImageSize({ width: naturalWidth, height: naturalHeight })\r\n onImageLoadCallbackRef.current?.(naturalWidth, naturalHeight)\r\n\r\n const tooSmall =\r\n (minWidth !== undefined && naturalWidth < minWidth) ||\r\n (minHeight !== undefined && naturalHeight < minHeight)\r\n setImageStatus(tooSmall ? 'too-small' : 'ok')\r\n }\r\n img.onerror = () => {\r\n if (cancelled) return\r\n setImageStatus('too-small')\r\n }\r\n img.src = imageSrc\r\n\r\n return () => {\r\n cancelled = true\r\n }\r\n }, [open, imageSrc, minWidth, minHeight])\r\n\r\n // Inicializa o crop quando o <img> do ReactCrop monta. A imagem já está em\r\n // cache vinda do preload, então carrega instantâneo.\r\n const onCropImgLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {\r\n const { naturalWidth, naturalHeight } = e.currentTarget\r\n const initialCrop = centerCrop(\r\n makeAspectCrop(\r\n { unit: '%', width: 90 },\r\n aspectRatio,\r\n naturalWidth,\r\n naturalHeight\r\n ),\r\n naturalWidth,\r\n naturalHeight\r\n )\r\n setCrop(initialCrop)\r\n }\r\n\r\n // Calcula tamanho mínimo em porcentagem baseado nas dimensões mínimas em pixels\r\n const minCropWidth = minWidth && imageSize.width > 0\r\n ? Math.min((minWidth / imageSize.width) * 100, 100)\r\n : undefined\r\n const minCropHeight = minHeight && imageSize.height > 0\r\n ? Math.min((minHeight / imageSize.height) * 100, 100)\r\n : undefined\r\n\r\n const handleConfirm = () => {\r\n if (imgRef.current && crop) {\r\n onConfirm(imgRef.current, crop)\r\n }\r\n }\r\n\r\n const handleCancel = () => {\r\n onCancel?.()\r\n onOpenChange(false)\r\n }\r\n\r\n // Determina se deve mostrar círculo (aspect ratio 1:1 por padrão)\r\n const shouldShowCircle = showCircleGuide ?? aspectRatio === 1\r\n\r\n // Renderiza grid, círculo e bolinhas dentro da área de crop\r\n const renderSelectionAddon = () => (\r\n <>\r\n {/* Grid de 9 quadrados com linhas pontilhadas */}\r\n <div className=\"crop-grid\">\r\n <div className=\"crop-grid-line horizontal h1\" />\r\n <div className=\"crop-grid-line horizontal h2\" />\r\n <div className=\"crop-grid-line vertical v1\" />\r\n <div className=\"crop-grid-line vertical v2\" />\r\n </div>\r\n {/* Círculo inscrito */}\r\n {shouldShowCircle && <div className=\"crop-circle\" />}\r\n </>\r\n )\r\n\r\n const dimensionText =\r\n minWidth !== undefined && minHeight !== undefined\r\n ? `${minWidth}x${minHeight}px`\r\n : null\r\n\r\n const isTooSmall = imageStatus === 'too-small'\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange}>\r\n <style>{baseCropStyles}</style>\r\n <DialogContent\r\n className={\r\n isTooSmall\r\n ? 'w-full md:w-[480px]! lg:w-[480px]! max-w-[480px]! max-[480px]:w-[calc(100%-32px)] p-0 gap-0 z-[1003]!'\r\n : 'w-full md:w-[650px]! lg:w-[650px]! max-w-[650px]! max-[650px]:w-[calc(100%-32px)] p-0 gap-0 z-[1003]!'\r\n }\r\n overlayClassName=\"z-[1002]!\"\r\n >\r\n {isTooSmall ? (\r\n <>\r\n <DialogHeader className=\"p-5\">\r\n <DialogTitle className=\"text-center text-[16px]!\">\r\n {dimensionText\r\n ? translate('common.imageUpload.tooSmallTitleWithDimension', { dimensionText })\r\n : translate('common.imageUpload.tooSmallTitleGeneric')}\r\n </DialogTitle>\r\n </DialogHeader>\r\n\r\n <div className=\"px-5 pb-5\">\r\n <p className=\"paragraph-small-regular text-zinc-600 text-center\">\r\n {fileName && dimensionText\r\n ? translate('common.imageUpload.tooSmallBodyFileWithDimension', { fileName, dimensionText })\r\n : fileName && !dimensionText\r\n ? translate('common.imageUpload.tooSmallBodyFileGeneric', { fileName })\r\n : !fileName && dimensionText\r\n ? translate('common.imageUpload.tooSmallBodyNoFileWithDimension', { dimensionText })\r\n : translate('common.imageUpload.tooSmallBodyNoFileGeneric')}\r\n </p>\r\n </div>\r\n\r\n <DialogFooter className=\"flex-row! items-center justify-start! gap-3 p-5 border-t border-zinc-200\">\r\n {onSelectAnother && <Button onClick={onSelectAnother}>{translate('common.imageUpload.sendAnother')}</Button>}\r\n <Button variant=\"secondary\" onClick={handleCancel}>\r\n {translate('common.actions.cancel')}\r\n </Button>\r\n </DialogFooter>\r\n </>\r\n ) : (\r\n <>\r\n <DialogHeader className=\"p-5\">\r\n <DialogTitle className=\"text-center text-[16px]!\">\r\n {translate('common.imageUpload.cropTitle')}\r\n </DialogTitle>\r\n </DialogHeader>\r\n\r\n <div className=\"flex flex-col gap-4 px-5 pb-5\">\r\n <div className=\"flex justify-center overflow-hidden rounded-lg min-h-[200px]\">\r\n {imageStatus === 'ok' && (\r\n <ReactCrop\r\n crop={crop}\r\n onChange={(c: Crop) => setCrop(c)}\r\n aspect={aspectRatio}\r\n className={`max-h-[50vh] custom-crop-area ${shouldShowCircle ? 'with-circle' : ''}`}\r\n keepSelection\r\n minWidth={minCropWidth}\r\n minHeight={minCropHeight}\r\n renderSelectionAddon={renderSelectionAddon}\r\n >\r\n <img\r\n ref={imgRef}\r\n src={imageSrc}\r\n alt={translate('common.imageUpload.cropAlt')}\r\n onLoad={onCropImgLoad}\r\n draggable={false}\r\n className=\"max-h-[50vh] object-contain select-none\"\r\n />\r\n </ReactCrop>\r\n )}\r\n </div>\r\n\r\n <p className=\"paragraph-small-regular text-zinc-500 text-center\">\r\n {translate('common.imageUpload.cropHint')}\r\n </p>\r\n </div>\r\n\r\n <DialogFooter className=\"flex-row! items-center justify-start! gap-3 p-5 border-t border-zinc-200\">\r\n <Button onClick={handleConfirm} disabled={imageStatus !== 'ok' || !crop}>\r\n {translate('common.actions.confirm')}\r\n </Button>\r\n <Button variant=\"secondary\" onClick={handleCancel}>\r\n {translate('common.actions.cancel')}\r\n </Button>\r\n </DialogFooter>\r\n </>\r\n )}\r\n </DialogContent>\r\n </Dialog>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/widgets/ImageUpload/ImageTooSmallModal.tsx"],"sourcesContent":["'use client'\n\nimport { useTranslations } from 'next-intl'\nimport {\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../../ui/overlay/Dialog'\nimport { Button } from '../../ui/buttons/Button'\n\ninterface ImageTooSmallModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n fileName: string\n minWidth: number\n minHeight: number\n onSelectAnother: () => void\n onCancel: () => void\n}\n\nexport function ImageTooSmallModal({\n open,\n onOpenChange,\n fileName,\n minWidth,\n minHeight,\n onSelectAnother,\n onCancel,\n}: ImageTooSmallModalProps) {\n const translate = useTranslations()\n const dimensionText = `${minWidth}x${minHeight}px`\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className=\"w-full md:w-[480px]! lg:w-[480px]! max-w-[480px]! max-[480px]:w-[calc(100%-32px)] p-0 gap-0 z-[1003]!\"\n overlayClassName=\"z-[1002]!\"\n >\n <DialogHeader className=\"p-5\">\n <DialogTitle className=\"text-center text-[16px]!\">\n {translate('common.imageUpload.tooSmallTitleWithDimension', { dimensionText })}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"px-5 pb-5\">\n <p className=\"paragraph-small-regular text-zinc-600 text-center\">\n {translate('common.imageUpload.tooSmallBodyFileWithDimension', { fileName, dimensionText })}\n </p>\n </div>\n\n <DialogFooter className=\"flex-row! items-center justify-start! gap-3 p-5 border-t border-zinc-200\">\n <Button onClick={onSelectAnother}>{translate('common.imageUpload.sendAnother')}</Button>\n <Button variant=\"secondary\" onClick={onCancel}>\n {translate('common.actions.cancel')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n"],"mappings":";AAyCU,cAWF,YAXE;AAvCV,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AAYhB,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,YAAY,gBAAgB;AAClC,QAAM,gBAAgB,GAAG,QAAQ,IAAI,SAAS;AAE9C,SACE,oBAAC,UAAO,MAAY,cAClB;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,kBAAiB;AAAA,MAEjB;AAAA,4BAAC,gBAAa,WAAU,OACtB,8BAAC,eAAY,WAAU,4BACpB,oBAAU,iDAAiD,EAAE,cAAc,CAAC,GAC/E,GACF;AAAA,QAEA,oBAAC,SAAI,WAAU,aACb,8BAAC,OAAE,WAAU,qDACV,oBAAU,oDAAoD,EAAE,UAAU,cAAc,CAAC,GAC5F,GACF;AAAA,QAEA,qBAAC,gBAAa,WAAU,4EACtB;AAAA,8BAAC,UAAO,SAAS,iBAAkB,oBAAU,gCAAgC,GAAE;AAAA,UAC/E,oBAAC,UAAO,SAAQ,aAAY,SAAS,UAClC,oBAAU,uBAAuB,GACpC;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/widgets/ImageUpload/ImageTooSmallModal.tsx"],"sourcesContent":["'use client'\r\n\r\nimport { useTranslations } from 'next-intl'\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '../../ui/overlay/Dialog'\r\nimport { Button } from '../../ui/buttons/Button'\r\n\r\ninterface ImageTooSmallModalProps {\r\n open: boolean\r\n onOpenChange: (open: boolean) => void\r\n fileName: string\r\n minWidth: number\r\n minHeight: number\r\n onSelectAnother: () => void\r\n onCancel: () => void\r\n}\r\n\r\nexport function ImageTooSmallModal({\r\n open,\r\n onOpenChange,\r\n fileName,\r\n minWidth,\r\n minHeight,\r\n onSelectAnother,\r\n onCancel,\r\n}: ImageTooSmallModalProps) {\r\n const translate = useTranslations()\r\n const dimensionText = `${minWidth}x${minHeight}px`\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange}>\r\n <DialogContent\r\n className=\"w-full md:w-[480px]! lg:w-[480px]! max-w-[480px]! max-[480px]:w-[calc(100%-32px)] p-0 gap-0 z-[1003]!\"\r\n overlayClassName=\"z-[1002]!\"\r\n >\r\n <DialogHeader className=\"p-5\">\r\n <DialogTitle className=\"text-center text-[16px]!\">\r\n {translate('common.imageUpload.tooSmallTitleWithDimension', { dimensionText })}\r\n </DialogTitle>\r\n </DialogHeader>\r\n\r\n <div className=\"px-5 pb-5\">\r\n <p className=\"paragraph-small-regular text-zinc-600 text-center\">\r\n {translate('common.imageUpload.tooSmallBodyFileWithDimension', { fileName, dimensionText })}\r\n </p>\r\n </div>\r\n\r\n <DialogFooter className=\"flex-row! items-center justify-start! gap-3 p-5 border-t border-zinc-200\">\r\n <Button onClick={onSelectAnother}>{translate('common.imageUpload.sendAnother')}</Button>\r\n <Button variant=\"secondary\" onClick={onCancel}>\r\n {translate('common.actions.cancel')}\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n )\r\n}\r\n"],"mappings":";AAyCU,cAWF,YAXE;AAvCV,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AAYhB,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,YAAY,gBAAgB;AAClC,QAAM,gBAAgB,GAAG,QAAQ,IAAI,SAAS;AAE9C,SACE,oBAAC,UAAO,MAAY,cAClB;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,kBAAiB;AAAA,MAEjB;AAAA,4BAAC,gBAAa,WAAU,OACtB,8BAAC,eAAY,WAAU,4BACpB,oBAAU,iDAAiD,EAAE,cAAc,CAAC,GAC/E,GACF;AAAA,QAEA,oBAAC,SAAI,WAAU,aACb,8BAAC,OAAE,WAAU,qDACV,oBAAU,oDAAoD,EAAE,UAAU,cAAc,CAAC,GAC5F,GACF;AAAA,QAEA,qBAAC,gBAAa,WAAU,4EACtB;AAAA,8BAAC,UAAO,SAAS,iBAAkB,oBAAU,gCAAgC,GAAE;AAAA,UAC/E,oBAAC,UAAO,SAAQ,aAAY,SAAS,UAClC,oBAAU,uBAAuB,GACpC;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/widgets/ImageUpload/ImageUpload.tsx"],"sourcesContent":["'use client'\n\nimport { useRef } from 'react'\nimport { useImageUpload } from '../../../modules/images/hooks/use-image-upload.hook'\nimport { ACCEPTED_IMAGE_FORMATS_STRING } from '../../../modules/images/constants/image.constants'\nimport { ImageCropModal } from './ImageCropModal'\nimport { Button } from '../../ui/buttons/Button'\nimport type { ImageConfig } from '../../../modules/images/types/image.type'\n\ninterface ImageUploadProps {\n config: ImageConfig\n value?: string\n onChange?: (value: string) => void\n onError?: (error: string) => void\n className?: string\n}\n\nexport function ImageUpload({\n config,\n value,\n onChange,\n onError,\n className,\n}: ImageUploadProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n\n const {\n originalImage,\n croppedPreview,\n showCropModal,\n isProcessing,\n fileName,\n handleFileSelect,\n handleCropConfirm,\n setShowCropModal,\n clear,\n } = useImageUpload({\n config,\n onSuccess: (base64) => onChange?.(base64),\n onError,\n })\n\n const displayImage = croppedPreview || value\n\n return (\n <div className={className}>\n <input\n ref={inputRef}\n type=\"file\"\n accept={ACCEPTED_IMAGE_FORMATS_STRING}\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) handleFileSelect(file)\n e.target.value = ''\n }}\n />\n\n {displayImage ? (\n <div className=\"relative\">\n <div\n className=\"overflow-hidden rounded-lg border border-gray-200\"\n style={{ aspectRatio: config.aspectRatio }}\n >\n <img\n src={displayImage}\n alt=\"Preview\"\n className=\"w-full h-full object-cover\"\n />\n </div>\n\n <div className=\"flex gap-2 mt-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => inputRef.current?.click()}\n disabled={isProcessing}\n >\n Trocar\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => {\n clear()\n onChange?.('')\n }}\n disabled={isProcessing}\n >\n Remover\n </Button>\n </div>\n\n {isProcessing && (\n <p className=\"paragraph-small-regular text-gray-500 mt-2\">\n Processando...\n </p>\n )}\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => inputRef.current?.click()}\n className=\"w-full border-2 border-dashed border-gray-300 rounded-lg p-8 text-center hover:border-gray-400 transition-colors\"\n style={{ aspectRatio: config.aspectRatio }}\n >\n <p className=\"paragraph-medium-regular text-gray-600\">\n Clique para enviar imagem\n </p>\n <p className=\"paragraph-small-regular text-gray-400 mt-1\">\n Tamanho recomendado: {config.width} x {config.height} pixels\n </p>\n </button>\n )}\n\n {originalImage && (\n <ImageCropModal\n open={showCropModal}\n onOpenChange={setShowCropModal}\n imageSrc={originalImage}\n aspectRatio={config.aspectRatio}\n onConfirm={handleCropConfirm}\n minWidth={config.width}\n minHeight={config.height}\n fileName={fileName}\n onSelectAnother={() => inputRef.current?.click()}\n />\n )}\n </div>\n )\n}\n"],"mappings":";AA8CM,cAyBI,YAzBJ;AA5CN,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B,SAAS,qCAAqC;AAC9C,SAAS,sBAAsB;AAC/B,SAAS,cAAc;AAWhB,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,WAAW,OAAyB,IAAI;AAE9C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,eAAe;AAAA,IACjB;AAAA,IACA,WAAW,CAAC,WAAW,WAAW,MAAM;AAAA,IACxC;AAAA,EACF,CAAC;AAED,QAAM,eAAe,kBAAkB;AAEvC,SACE,qBAAC,SAAI,WACH;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,QAAQ;AAAA,QACR,WAAU;AAAA,QACV,UAAU,CAAC,MAAM;AACf,gBAAM,OAAO,EAAE,OAAO,QAAQ,CAAC;AAC/B,cAAI,KAAM,kBAAiB,IAAI;AAC/B,YAAE,OAAO,QAAQ;AAAA,QACnB;AAAA;AAAA,IACF;AAAA,IAEC,eACC,qBAAC,SAAI,WAAU,YACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,aAAa,OAAO,YAAY;AAAA,UAEzC;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAI;AAAA,cACJ,WAAU;AAAA;AAAA,UACZ;AAAA;AAAA,MACF;AAAA,MAEA,qBAAC,SAAI,WAAU,mBACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM,SAAS,SAAS,MAAM;AAAA,YACvC,UAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM;AACb,oBAAM;AACN,yBAAW,EAAE;AAAA,YACf;AAAA,YACA,UAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,SACF;AAAA,MAEC,gBACC,oBAAC,OAAE,WAAU,8CAA6C,4BAE1D;AAAA,OAEJ,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,SAAS,SAAS,MAAM;AAAA,QACvC,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,OAAO,YAAY;AAAA,QAEzC;AAAA,8BAAC,OAAE,WAAU,0CAAyC,uCAEtD;AAAA,UACA,qBAAC,OAAE,WAAU,8CAA6C;AAAA;AAAA,YAClC,OAAO;AAAA,YAAM;AAAA,YAAI,OAAO;AAAA,YAAO;AAAA,aACvD;AAAA;AAAA;AAAA,IACF;AAAA,IAGD,iBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,UAAU;AAAA,QACV,aAAa,OAAO;AAAA,QACpB,WAAW;AAAA,QACX,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO;AAAA,QAClB;AAAA,QACA,iBAAiB,MAAM,SAAS,SAAS,MAAM;AAAA;AAAA,IACjD;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/widgets/ImageUpload/ImageUpload.tsx"],"sourcesContent":["'use client'\r\n\r\nimport { useRef } from 'react'\r\nimport { useImageUpload } from '../../../modules/images/hooks/use-image-upload.hook'\r\nimport { ACCEPTED_IMAGE_FORMATS_STRING } from '../../../modules/images/constants/image.constants'\r\nimport { ImageCropModal } from './ImageCropModal'\r\nimport { Button } from '../../ui/buttons/Button'\r\nimport type { ImageConfig } from '../../../modules/images/types/image.type'\r\n\r\ninterface ImageUploadProps {\r\n config: ImageConfig\r\n value?: string\r\n onChange?: (value: string) => void\r\n onError?: (error: string) => void\r\n className?: string\r\n}\r\n\r\nexport function ImageUpload({\r\n config,\r\n value,\r\n onChange,\r\n onError,\r\n className,\r\n}: ImageUploadProps) {\r\n const inputRef = useRef<HTMLInputElement>(null)\r\n\r\n const {\r\n originalImage,\r\n croppedPreview,\r\n showCropModal,\r\n isProcessing,\r\n fileName,\r\n handleFileSelect,\r\n handleCropConfirm,\r\n setShowCropModal,\r\n clear,\r\n } = useImageUpload({\r\n config,\r\n onSuccess: (base64) => onChange?.(base64),\r\n onError,\r\n })\r\n\r\n const displayImage = croppedPreview || value\r\n\r\n return (\r\n <div className={className}>\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n accept={ACCEPTED_IMAGE_FORMATS_STRING}\r\n className=\"hidden\"\r\n onChange={(e) => {\r\n const file = e.target.files?.[0]\r\n if (file) handleFileSelect(file)\r\n e.target.value = ''\r\n }}\r\n />\r\n\r\n {displayImage ? (\r\n <div className=\"relative\">\r\n <div\r\n className=\"overflow-hidden rounded-lg border border-gray-200\"\r\n style={{ aspectRatio: config.aspectRatio }}\r\n >\r\n <img\r\n src={displayImage}\r\n alt=\"Preview\"\r\n className=\"w-full h-full object-cover\"\r\n />\r\n </div>\r\n\r\n <div className=\"flex gap-2 mt-2\">\r\n <Button\r\n variant=\"secondary\"\r\n size=\"sm\"\r\n onClick={() => inputRef.current?.click()}\r\n disabled={isProcessing}\r\n >\r\n Trocar\r\n </Button>\r\n <Button\r\n variant=\"secondary\"\r\n size=\"sm\"\r\n onClick={() => {\r\n clear()\r\n onChange?.('')\r\n }}\r\n disabled={isProcessing}\r\n >\r\n Remover\r\n </Button>\r\n </div>\r\n\r\n {isProcessing && (\r\n <p className=\"paragraph-small-regular text-gray-500 mt-2\">\r\n Processando...\r\n </p>\r\n )}\r\n </div>\r\n ) : (\r\n <button\r\n type=\"button\"\r\n onClick={() => inputRef.current?.click()}\r\n className=\"w-full border-2 border-dashed border-gray-300 rounded-lg p-8 text-center hover:border-gray-400 transition-colors\"\r\n style={{ aspectRatio: config.aspectRatio }}\r\n >\r\n <p className=\"paragraph-medium-regular text-gray-600\">\r\n Clique para enviar imagem\r\n </p>\r\n <p className=\"paragraph-small-regular text-gray-400 mt-1\">\r\n Tamanho recomendado: {config.width} x {config.height} pixels\r\n </p>\r\n </button>\r\n )}\r\n\r\n {originalImage && (\r\n <ImageCropModal\r\n open={showCropModal}\r\n onOpenChange={setShowCropModal}\r\n imageSrc={originalImage}\r\n aspectRatio={config.aspectRatio}\r\n onConfirm={handleCropConfirm}\r\n minWidth={config.width}\r\n minHeight={config.height}\r\n fileName={fileName}\r\n onSelectAnother={() => inputRef.current?.click()}\r\n />\r\n )}\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AA8CM,cAyBI,YAzBJ;AA5CN,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B,SAAS,qCAAqC;AAC9C,SAAS,sBAAsB;AAC/B,SAAS,cAAc;AAWhB,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,WAAW,OAAyB,IAAI;AAE9C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,eAAe;AAAA,IACjB;AAAA,IACA,WAAW,CAAC,WAAW,WAAW,MAAM;AAAA,IACxC;AAAA,EACF,CAAC;AAED,QAAM,eAAe,kBAAkB;AAEvC,SACE,qBAAC,SAAI,WACH;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,QAAQ;AAAA,QACR,WAAU;AAAA,QACV,UAAU,CAAC,MAAM;AACf,gBAAM,OAAO,EAAE,OAAO,QAAQ,CAAC;AAC/B,cAAI,KAAM,kBAAiB,IAAI;AAC/B,YAAE,OAAO,QAAQ;AAAA,QACnB;AAAA;AAAA,IACF;AAAA,IAEC,eACC,qBAAC,SAAI,WAAU,YACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,aAAa,OAAO,YAAY;AAAA,UAEzC;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAI;AAAA,cACJ,WAAU;AAAA;AAAA,UACZ;AAAA;AAAA,MACF;AAAA,MAEA,qBAAC,SAAI,WAAU,mBACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM,SAAS,SAAS,MAAM;AAAA,YACvC,UAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM;AACb,oBAAM;AACN,yBAAW,EAAE;AAAA,YACf;AAAA,YACA,UAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,SACF;AAAA,MAEC,gBACC,oBAAC,OAAE,WAAU,8CAA6C,4BAE1D;AAAA,OAEJ,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,SAAS,SAAS,MAAM;AAAA,QACvC,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,OAAO,YAAY;AAAA,QAEzC;AAAA,8BAAC,OAAE,WAAU,0CAAyC,uCAEtD;AAAA,UACA,qBAAC,OAAE,WAAU,8CAA6C;AAAA;AAAA,YAClC,OAAO;AAAA,YAAM;AAAA,YAAI,OAAO;AAAA,YAAO;AAAA,aACvD;AAAA;AAAA;AAAA,IACF;AAAA,IAGD,iBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,UAAU;AAAA,QACV,aAAa,OAAO;AAAA,QACpB,WAAW;AAAA,QACX,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO;AAAA,QAClB;AAAA,QACA,iBAAiB,MAAM,SAAS,SAAS,MAAM;AAAA;AAAA,IACjD;AAAA,KAEJ;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/widgets/ImageUpload/index.ts"],"sourcesContent":["export { ImageUpload } from './ImageUpload'\nexport { ImageCropModal } from './ImageCropModal'\nexport { ImageTooSmallModal } from './ImageTooSmallModal'\n"],"mappings":"AAAA,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAC/B,SAAS,0BAA0B;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/widgets/ImageUpload/index.ts"],"sourcesContent":["export { ImageUpload } from './ImageUpload'\r\nexport { ImageCropModal } from './ImageCropModal'\r\nexport { ImageTooSmallModal } from './ImageTooSmallModal'\r\n"],"mappings":"AAAA,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAC/B,SAAS,0BAA0B;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/widgets/notifications/NotificationCard.tsx"],"sourcesContent":["'use client';\n\nimport { IconClock } from '@tabler/icons-react';\nimport { ReactNode } from 'react';\nimport { cn } from '../../../infra/utils/clsx';\nimport { useIsDefaultWhitelabel } from '../../../providers/whitelabel.provider';\n\ntype NotificationCardProps = {\n icon: ReactNode;\n iconBgColor?: string;\n title: string;\n description?: string;\n time: string;\n actions?: ReactNode;\n isUnread?: boolean;\n showBorder?: boolean;\n className?: string;\n gapPx: number;\n};\n\nexport default function NotificationCard({\n icon,\n iconBgColor,\n title,\n description,\n time,\n actions,\n isUnread = false,\n showBorder = true,\n className,\n gapPx = 16\n}: NotificationCardProps) {\n const isDefaultWl = useIsDefaultWhitelabel();\n\n return (\n <div\n className={cn(\n 'flex flex-col lg:flex-row items-start p-4 lg:p-5 gap-3 lg:gap-4 relative',\n showBorder && 'border-b border-gray-200',\n className\n )}\n >\n <div\n className={cn(\n 'flex items-center justify-center size-10 rounded-full shrink-0',\n iconBgColor\n )}\n >\n {icon}\n </div>\n\n <div className=\"flex flex-col flex-1\" style={{ gap: `${gapPx}px` }}>\n <div className=\"flex flex-col gap-1\">\n <span className=\"paragraph-small-semibold text-gray-950\">{title}</span>\n {description && (\n <span className=\"paragraph-small-regular text-gray-600\">{description}</span>\n )}\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n <IconClock size={14} className=\"text-gray-400\" />\n <span className=\"paragraph-xsmall-medium text-gray-600\">{time}</span>\n </div>\n\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n\n {isUnread && <div className={`size-2 rounded-full shrink-0 mt-1 ${isDefaultWl ? 'bg-cyan-400' : 'bg-zinc-400'}`} />}\n </div>\n );\n}\n\nexport type { NotificationCardProps };\n"],"mappings":";AA0CM,cAUE,YAVF;AAxCN,SAAS,iBAAiB;AAE1B,SAAS,UAAU;AACnB,SAAS,8BAA8B;AAexB,SAAR,iBAAkC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AAAA,EACA,QAAQ;AACV,GAA0B;AACxB,QAAM,cAAc,uBAAuB;AAE3C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,cAAc;AAAA,QACd;AAAA,MACF;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QAEA,qBAAC,SAAI,WAAU,wBAAuB,OAAO,EAAE,KAAK,GAAG,KAAK,KAAK,GAC/D;AAAA,+BAAC,SAAI,WAAU,uBACb;AAAA,gCAAC,UAAK,WAAU,0CAA0C,iBAAM;AAAA,YAC/D,eACC,oBAAC,UAAK,WAAU,yCAAyC,uBAAY;AAAA,aAEzE;AAAA,UAEA,qBAAC,SAAI,WAAU,6BACb;AAAA,gCAAC,aAAU,MAAM,IAAI,WAAU,iBAAgB;AAAA,YAC/C,oBAAC,UAAK,WAAU,yCAAyC,gBAAK;AAAA,aAChE;AAAA,UAEC,WAAW,oBAAC,SAAI,WAAU,2BAA2B,mBAAQ;AAAA,WAChE;AAAA,QAEC,YAAY,oBAAC,SAAI,WAAW,qCAAqC,cAAc,gBAAgB,aAAa,IAAI;AAAA;AAAA;AAAA,EACnH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/widgets/notifications/NotificationCard.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { IconClock } from '@tabler/icons-react';\r\nimport { ReactNode } from 'react';\r\nimport { cn } from '../../../infra/utils/clsx';\r\nimport { useIsDefaultWhitelabel } from '../../../providers/whitelabel.provider';\r\n\r\ntype NotificationCardProps = {\r\n icon: ReactNode;\r\n iconBgColor?: string;\r\n title: string;\r\n description?: string;\r\n time: string;\r\n actions?: ReactNode;\r\n isUnread?: boolean;\r\n showBorder?: boolean;\r\n className?: string;\r\n gapPx: number;\r\n};\r\n\r\nexport default function NotificationCard({\r\n icon,\r\n iconBgColor,\r\n title,\r\n description,\r\n time,\r\n actions,\r\n isUnread = false,\r\n showBorder = true,\r\n className,\r\n gapPx = 16\r\n}: NotificationCardProps) {\r\n const isDefaultWl = useIsDefaultWhitelabel();\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'flex flex-col lg:flex-row items-start p-4 lg:p-5 gap-3 lg:gap-4 relative',\r\n showBorder && 'border-b border-gray-200',\r\n className\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n 'flex items-center justify-center size-10 rounded-full shrink-0',\r\n iconBgColor\r\n )}\r\n >\r\n {icon}\r\n </div>\r\n\r\n <div className=\"flex flex-col flex-1\" style={{ gap: `${gapPx}px` }}>\r\n <div className=\"flex flex-col gap-1\">\r\n <span className=\"paragraph-small-semibold text-gray-950\">{title}</span>\r\n {description && (\r\n <span className=\"paragraph-small-regular text-gray-600\">{description}</span>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1.5\">\r\n <IconClock size={14} className=\"text-gray-400\" />\r\n <span className=\"paragraph-xsmall-medium text-gray-600\">{time}</span>\r\n </div>\r\n\r\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\r\n </div>\r\n\r\n {isUnread && <div className={`size-2 rounded-full shrink-0 mt-1 ${isDefaultWl ? 'bg-cyan-400' : 'bg-zinc-400'}`} />}\r\n </div>\r\n );\r\n}\r\n\r\nexport type { NotificationCardProps };\r\n"],"mappings":";AA0CM,cAUE,YAVF;AAxCN,SAAS,iBAAiB;AAE1B,SAAS,UAAU;AACnB,SAAS,8BAA8B;AAexB,SAAR,iBAAkC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AAAA,EACA,QAAQ;AACV,GAA0B;AACxB,QAAM,cAAc,uBAAuB;AAE3C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,cAAc;AAAA,QACd;AAAA,MACF;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QAEA,qBAAC,SAAI,WAAU,wBAAuB,OAAO,EAAE,KAAK,GAAG,KAAK,KAAK,GAC/D;AAAA,+BAAC,SAAI,WAAU,uBACb;AAAA,gCAAC,UAAK,WAAU,0CAA0C,iBAAM;AAAA,YAC/D,eACC,oBAAC,UAAK,WAAU,yCAAyC,uBAAY;AAAA,aAEzE;AAAA,UAEA,qBAAC,SAAI,WAAU,6BACb;AAAA,gCAAC,aAAU,MAAM,IAAI,WAAU,iBAAgB;AAAA,YAC/C,oBAAC,UAAK,WAAU,yCAAyC,gBAAK;AAAA,aAChE;AAAA,UAEC,WAAW,oBAAC,SAAI,WAAU,2BAA2B,mBAAQ;AAAA,WAChE;AAAA,QAEC,YAAY,oBAAC,SAAI,WAAW,qCAAqC,cAAc,gBAAgB,aAAa,IAAI;AAAA;AAAA;AAAA,EACnH;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/handlers.ts"],"sourcesContent":["export { createListCardsHandler } from './modules/cards/handlers/list-cards.handler';\nexport { createFindCardByIdHandler } from './modules/cards/handlers/find-card-by-id.handler';\n\nexport { createListChargesHandler } from './modules/charges/handlers/list-charges.handler';\nexport { createFindChargeByIdHandler } from './modules/charges/handlers/find-charge-by-id.handler';\n\nexport { createListIaCreditsHandler } from './modules/ia-credits/handlers/list-ia-credits.handler';\n\nexport { createCountPagesHandler } from './modules/pages/handlers/count-pages.handler';\n\nexport { createListPlansHandler } from './modules/plans/handlers/list-plans.handler';\nexport { createFindPlanByIdHandler } from './modules/plans/handlers/find-plan-by-id.handler';\n\nexport { createListProjectsHandler } from './modules/projects/handlers/list-projects.handler';\nexport { createFindProjectHandler } from './modules/projects/handlers/find-project.handler';\nexport { createListProjectUsersHandler } from './modules/projects/handlers/list-project-users.handler';\nexport { createListAvailableUsersHandler } from './modules/projects/handlers/list-available-users.handler';\nexport { createListAllAccountUsersHandler } from './modules/projects/handlers/list-all-account-users.handler';\n\nexport { createListSubscriptionsHandler } from './modules/subscriptions/handlers/list-subscriptions.handler';\n\nexport { createListMessagesHandler } from './modules/users/handlers/list-messages.handler';\n"],"mappings":"AAAA,SAAS,8BAA8B;AACvC,SAAS,iCAAiC;AAE1C,SAAS,gCAAgC;AACzC,SAAS,mCAAmC;AAE5C,SAAS,kCAAkC;AAE3C,SAAS,+BAA+B;AAExC,SAAS,8BAA8B;AACvC,SAAS,iCAAiC;AAE1C,SAAS,iCAAiC;AAC1C,SAAS,gCAAgC;AACzC,SAAS,qCAAqC;AAC9C,SAAS,uCAAuC;AAChD,SAAS,wCAAwC;AAEjD,SAAS,sCAAsC;AAE/C,SAAS,iCAAiC;","names":[]}
1
+ {"version":3,"sources":["../src/handlers.ts"],"sourcesContent":["export { createListCardsHandler } from './modules/cards/handlers/list-cards.handler';\r\nexport { createFindCardByIdHandler } from './modules/cards/handlers/find-card-by-id.handler';\r\n\r\nexport { createListChargesHandler } from './modules/charges/handlers/list-charges.handler';\r\nexport { createFindChargeByIdHandler } from './modules/charges/handlers/find-charge-by-id.handler';\r\n\r\nexport { createListIaCreditsHandler } from './modules/ia-credits/handlers/list-ia-credits.handler';\r\n\r\nexport { createCountPagesHandler } from './modules/pages/handlers/count-pages.handler';\r\n\r\nexport { createListPlansHandler } from './modules/plans/handlers/list-plans.handler';\r\nexport { createFindPlanByIdHandler } from './modules/plans/handlers/find-plan-by-id.handler';\r\n\r\nexport { createListProjectsHandler } from './modules/projects/handlers/list-projects.handler';\r\nexport { createFindProjectHandler } from './modules/projects/handlers/find-project.handler';\r\nexport { createListProjectUsersHandler } from './modules/projects/handlers/list-project-users.handler';\r\nexport { createListAvailableUsersHandler } from './modules/projects/handlers/list-available-users.handler';\r\nexport { createListAllAccountUsersHandler } from './modules/projects/handlers/list-all-account-users.handler';\r\n\r\nexport { createListSubscriptionsHandler } from './modules/subscriptions/handlers/list-subscriptions.handler';\r\n\r\nexport { createListMessagesHandler } from './modules/users/handlers/list-messages.handler';\r\n"],"mappings":"AAAA,SAAS,8BAA8B;AACvC,SAAS,iCAAiC;AAE1C,SAAS,gCAAgC;AACzC,SAAS,mCAAmC;AAE5C,SAAS,kCAAkC;AAE3C,SAAS,+BAA+B;AAExC,SAAS,8BAA8B;AACvC,SAAS,iCAAiC;AAE1C,SAAS,iCAAiC;AAC1C,SAAS,gCAAgC;AACzC,SAAS,qCAAqC;AAC9C,SAAS,uCAAuC;AAChD,SAAS,wCAAwC;AAEjD,SAAS,sCAAsC;AAE/C,SAAS,iCAAiC;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/copy-to-clipboard.hook.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useCallback, useRef, useEffect } from \"react\";\n\ninterface UseCopyToClipboardOptions {\n feedbackDuration?: number;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\ninterface UseCopyToClipboardReturn {\n isCopied: boolean;\n copy: (text: string) => Promise<void>;\n}\n\nexport default function useCopyToClipboard({\n feedbackDuration = 2000,\n onSuccess,\n onError,\n}: UseCopyToClipboardOptions = {}): UseCopyToClipboardReturn {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n const copy = useCallback(\n async (text: string) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n try {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n } else {\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.style.cssText = \"position:fixed;top:-9999px;left:-9999px;opacity:0\";\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n const success = document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n if (!success) throw new Error(\"execCommand copy failed\");\n }\n\n setIsCopied(true);\n onSuccess?.();\n\n timeoutRef.current = setTimeout(() => {\n setIsCopied(false);\n }, feedbackDuration);\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error(\"Failed to copy\"));\n }\n },\n [feedbackDuration, onSuccess, onError],\n );\n\n return { isCopied, copy };\n}\n"],"mappings":";AAEA,SAAS,UAAU,aAAa,QAAQ,iBAAiB;AAa1C,SAAR,mBAAoC;AAAA,EACzC,mBAAmB;AAAA,EACnB;AAAA,EACA;AACF,IAA+B,CAAC,GAA6B;AAC3D,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,aAAa,OAA8B,IAAI;AAErD,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,OAAO;AAAA,IACX,OAAO,SAAiB;AACtB,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAEA,UAAI;AACF,YAAI,UAAU,WAAW,WAAW;AAClC,gBAAM,UAAU,UAAU,UAAU,IAAI;AAAA,QAC1C,OAAO;AACL,gBAAM,WAAW,SAAS,cAAc,UAAU;AAClD,mBAAS,QAAQ;AACjB,mBAAS,MAAM,UAAU;AACzB,mBAAS,KAAK,YAAY,QAAQ;AAClC,mBAAS,MAAM;AACf,mBAAS,OAAO;AAChB,gBAAM,UAAU,SAAS,YAAY,MAAM;AAC3C,mBAAS,KAAK,YAAY,QAAQ;AAClC,cAAI,CAAC,QAAS,OAAM,IAAI,MAAM,yBAAyB;AAAA,QACzD;AAEA,oBAAY,IAAI;AAChB,oBAAY;AAEZ,mBAAW,UAAU,WAAW,MAAM;AACpC,sBAAY,KAAK;AAAA,QACnB,GAAG,gBAAgB;AAAA,MACrB,SAAS,OAAO;AACd,kBAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,gBAAgB,CAAC;AAAA,MACxE;AAAA,IACF;AAAA,IACA,CAAC,kBAAkB,WAAW,OAAO;AAAA,EACvC;AAEA,SAAO,EAAE,UAAU,KAAK;AAC1B;","names":[]}
1
+ {"version":3,"sources":["../../src/hooks/copy-to-clipboard.hook.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { useState, useCallback, useRef, useEffect } from \"react\";\r\n\r\ninterface UseCopyToClipboardOptions {\r\n feedbackDuration?: number;\r\n onSuccess?: () => void;\r\n onError?: (error: Error) => void;\r\n}\r\n\r\ninterface UseCopyToClipboardReturn {\r\n isCopied: boolean;\r\n copy: (text: string) => Promise<void>;\r\n}\r\n\r\nexport default function useCopyToClipboard({\r\n feedbackDuration = 2000,\r\n onSuccess,\r\n onError,\r\n}: UseCopyToClipboardOptions = {}): UseCopyToClipboardReturn {\r\n const [isCopied, setIsCopied] = useState(false);\r\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n const copy = useCallback(\r\n async (text: string) => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n\r\n try {\r\n if (navigator.clipboard?.writeText) {\r\n await navigator.clipboard.writeText(text);\r\n } else {\r\n const textarea = document.createElement(\"textarea\");\r\n textarea.value = text;\r\n textarea.style.cssText = \"position:fixed;top:-9999px;left:-9999px;opacity:0\";\r\n document.body.appendChild(textarea);\r\n textarea.focus();\r\n textarea.select();\r\n const success = document.execCommand(\"copy\");\r\n document.body.removeChild(textarea);\r\n if (!success) throw new Error(\"execCommand copy failed\");\r\n }\r\n\r\n setIsCopied(true);\r\n onSuccess?.();\r\n\r\n timeoutRef.current = setTimeout(() => {\r\n setIsCopied(false);\r\n }, feedbackDuration);\r\n } catch (error) {\r\n onError?.(error instanceof Error ? error : new Error(\"Failed to copy\"));\r\n }\r\n },\r\n [feedbackDuration, onSuccess, onError],\r\n );\r\n\r\n return { isCopied, copy };\r\n}\r\n"],"mappings":";AAEA,SAAS,UAAU,aAAa,QAAQ,iBAAiB;AAa1C,SAAR,mBAAoC;AAAA,EACzC,mBAAmB;AAAA,EACnB;AAAA,EACA;AACF,IAA+B,CAAC,GAA6B;AAC3D,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,aAAa,OAA8B,IAAI;AAErD,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,OAAO;AAAA,IACX,OAAO,SAAiB;AACtB,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAEA,UAAI;AACF,YAAI,UAAU,WAAW,WAAW;AAClC,gBAAM,UAAU,UAAU,UAAU,IAAI;AAAA,QAC1C,OAAO;AACL,gBAAM,WAAW,SAAS,cAAc,UAAU;AAClD,mBAAS,QAAQ;AACjB,mBAAS,MAAM,UAAU;AACzB,mBAAS,KAAK,YAAY,QAAQ;AAClC,mBAAS,MAAM;AACf,mBAAS,OAAO;AAChB,gBAAM,UAAU,SAAS,YAAY,MAAM;AAC3C,mBAAS,KAAK,YAAY,QAAQ;AAClC,cAAI,CAAC,QAAS,OAAM,IAAI,MAAM,yBAAyB;AAAA,QACzD;AAEA,oBAAY,IAAI;AAChB,oBAAY;AAEZ,mBAAW,UAAU,WAAW,MAAM;AACpC,sBAAY,KAAK;AAAA,QACnB,GAAG,gBAAgB;AAAA,MACrB,SAAS,OAAO;AACd,kBAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,gBAAgB,CAAC;AAAA,MACxE;AAAA,IACF;AAAA,IACA,CAAC,kBAAkB,WAAW,OAAO;AAAA,EACvC;AAEA,SAAO,EAAE,UAAU,KAAK;AAC1B;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useAuthQueryKey.ts"],"sourcesContent":["'use client';\n\nimport { useAuth } from '../providers/auth.provider';\nimport { useWhitelabel } from '../providers/whitelabel.provider';\n\n/**\n * Retorna o id da whitelabel do contexto.\n */\nexport function useWlId(): number {\n const { whitelabel } = useWhitelabel();\n return whitelabel?.id ?? 0;\n}\n\n/**\n * Prefixa query keys com ['whitelabel', wlId] para isolamento por whitelabel.\n * Usar para queries públicas e bootstrap (plans, currencies, user, account, etc).\n */\nexport function useWlQueryKey<T extends readonly unknown[]>(baseKey: [...T]): ['whitelabel', number, ...T] {\n const wlId = useWlId();\n return ['whitelabel', wlId, ...baseKey];\n}\n\n/**\n * Prefixa query keys com ['whitelabel', wlId, 'user', userId] para isolamento\n * por whitelabel + usuário. Usar para queries autenticadas (cards, subscriptions, etc).\n */\nexport function useAuthQueryKey<T extends readonly unknown[]>(baseKey: [...T]): ['whitelabel', number, 'user', number, ...T] {\n const wlId = useWlId();\n const { user } = useAuth();\n const userId = user?.id ?? 0;\n return ['whitelabel', wlId, 'user', userId, ...baseKey];\n}\n"],"mappings":";AAEA,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAKvB,SAAS,UAAkB;AAChC,QAAM,EAAE,WAAW,IAAI,cAAc;AACrC,SAAO,YAAY,MAAM;AAC3B;AAMO,SAAS,cAA4C,SAA+C;AACzG,QAAM,OAAO,QAAQ;AACrB,SAAO,CAAC,cAAc,MAAM,GAAG,OAAO;AACxC;AAMO,SAAS,gBAA8C,SAA+D;AAC3H,QAAM,OAAO,QAAQ;AACrB,QAAM,EAAE,KAAK,IAAI,QAAQ;AACzB,QAAM,SAAS,MAAM,MAAM;AAC3B,SAAO,CAAC,cAAc,MAAM,QAAQ,QAAQ,GAAG,OAAO;AACxD;","names":[]}
1
+ {"version":3,"sources":["../../src/hooks/useAuthQueryKey.ts"],"sourcesContent":["'use client';\r\n\r\nimport { useAuth } from '../providers/auth.provider';\r\nimport { useWhitelabel } from '../providers/whitelabel.provider';\r\n\r\n/**\r\n * Retorna o id da whitelabel do contexto.\r\n */\r\nexport function useWlId(): number {\r\n const { whitelabel } = useWhitelabel();\r\n return whitelabel?.id ?? 0;\r\n}\r\n\r\n/**\r\n * Prefixa query keys com ['whitelabel', wlId] para isolamento por whitelabel.\r\n * Usar para queries públicas e bootstrap (plans, currencies, user, account, etc).\r\n */\r\nexport function useWlQueryKey<T extends readonly unknown[]>(baseKey: [...T]): ['whitelabel', number, ...T] {\r\n const wlId = useWlId();\r\n return ['whitelabel', wlId, ...baseKey];\r\n}\r\n\r\n/**\r\n * Prefixa query keys com ['whitelabel', wlId, 'user', userId] para isolamento\r\n * por whitelabel + usuário. Usar para queries autenticadas (cards, subscriptions, etc).\r\n */\r\nexport function useAuthQueryKey<T extends readonly unknown[]>(baseKey: [...T]): ['whitelabel', number, 'user', number, ...T] {\r\n const wlId = useWlId();\r\n const { user } = useAuth();\r\n const userId = user?.id ?? 0;\r\n return ['whitelabel', wlId, 'user', userId, ...baseKey];\r\n}\r\n"],"mappings":";AAEA,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAKvB,SAAS,UAAkB;AAChC,QAAM,EAAE,WAAW,IAAI,cAAc;AACrC,SAAO,YAAY,MAAM;AAC3B;AAMO,SAAS,cAA4C,SAA+C;AACzG,QAAM,OAAO,QAAQ;AACrB,SAAO,CAAC,cAAc,MAAM,GAAG,OAAO;AACxC;AAMO,SAAS,gBAA8C,SAA+D;AAC3H,QAAM,OAAO,QAAQ;AACrB,QAAM,EAAE,KAAK,IAAI,QAAQ;AACzB,QAAM,SAAS,MAAM,MAAM;AAC3B,SAAO,CAAC,cAAc,MAAM,QAAQ,QAAQ,GAAG,OAAO;AACxD;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useBrandLoadingIcon.tsx"],"sourcesContent":["'use client';\n\nimport Image from 'next/image';\nimport type { ReactNode } from 'react';\nimport { useWhitelabel } from '../providers/whitelabel.provider';\n\n/**\n * Ícone central do LoadingOverlay respeitando o whitelabel: só a Great (id 1)\n * pode exibir o great-icon. Em qualquer outro tenant retorna undefined, e o\n * overlay mostra apenas o spinner — nunca a marca da Great.\n */\nexport function useBrandLoadingIcon(): ReactNode | undefined {\n const { whitelabel } = useWhitelabel();\n\n if (whitelabel?.id !== 1) return undefined;\n\n return <Image src=\"/icons/great-icon.svg\" alt=\"\" width={20} height={20} aria-hidden />;\n}\n"],"mappings":";AAgBS;AAdT,OAAO,WAAW;AAElB,SAAS,qBAAqB;AAOvB,SAAS,sBAA6C;AAC3D,QAAM,EAAE,WAAW,IAAI,cAAc;AAErC,MAAI,YAAY,OAAO,EAAG,QAAO;AAEjC,SAAO,oBAAC,SAAM,KAAI,yBAAwB,KAAI,IAAG,OAAO,IAAI,QAAQ,IAAI,eAAW,MAAC;AACtF;","names":[]}
1
+ {"version":3,"sources":["../../src/hooks/useBrandLoadingIcon.tsx"],"sourcesContent":["'use client';\r\n\r\nimport Image from 'next/image';\r\nimport type { ReactNode } from 'react';\r\nimport { useWhitelabel } from '../providers/whitelabel.provider';\r\n\r\n/**\r\n * Ícone central do LoadingOverlay respeitando o whitelabel: só a Great (id 1)\r\n * pode exibir o great-icon. Em qualquer outro tenant retorna undefined, e o\r\n * overlay mostra apenas o spinner — nunca a marca da Great.\r\n */\r\nexport function useBrandLoadingIcon(): ReactNode | undefined {\r\n const { whitelabel } = useWhitelabel();\r\n\r\n if (whitelabel?.id !== 1) return undefined;\r\n\r\n return <Image src=\"/icons/great-icon.svg\" alt=\"\" width={20} height={20} aria-hidden />;\r\n}\r\n"],"mappings":";AAgBS;AAdT,OAAO,WAAW;AAElB,SAAS,qBAAqB;AAOvB,SAAS,sBAA6C;AAC3D,QAAM,EAAE,WAAW,IAAI,cAAc;AAErC,MAAI,YAAY,OAAO,EAAG,QAAO;AAEjC,SAAO,oBAAC,SAAM,KAAI,yBAAwB,KAAI,IAAG,OAAO,IAAI,QAAQ,IAAI,eAAW,MAAC;AACtF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useRouter.ts"],"sourcesContent":["\"use client\";\n\nimport { useRouter as useNextRouter } from \"next/navigation\";\nimport { useNavigationContext } from \"../providers/navigation.provider\";\n\ntype SafeBackOptions = { fallback?: string };\n\ntype AppRouter = ReturnType<typeof useNextRouter>;\n\nexport interface SafeAppRouter extends Omit<AppRouter, \"back\"> {\n back: (options?: SafeBackOptions | string) => void;\n safeBack: (options?: SafeBackOptions | string) => void;\n}\n\nexport function useRouter(): SafeAppRouter {\n const router = useNextRouter();\n const { defaultFallback, internalNavCountRef } = useNavigationContext();\n\n function back(options?: SafeBackOptions | string) {\n const fallback =\n typeof options === \"string\"\n ? options\n : options?.fallback || defaultFallback;\n\n if (internalNavCountRef.current > 0) {\n router.back();\n return;\n }\n\n router.replace(fallback);\n }\n\n return {\n ...router,\n back,\n safeBack: back,\n };\n}\n"],"mappings":";AAEA,SAAS,aAAa,qBAAqB;AAC3C,SAAS,4BAA4B;AAW9B,SAAS,YAA2B;AACzC,QAAM,SAAS,cAAc;AAC7B,QAAM,EAAE,iBAAiB,oBAAoB,IAAI,qBAAqB;AAEtE,WAAS,KAAK,SAAoC;AAChD,UAAM,WACJ,OAAO,YAAY,WACf,UACA,SAAS,YAAY;AAE3B,QAAI,oBAAoB,UAAU,GAAG;AACnC,aAAO,KAAK;AACZ;AAAA,IACF;AAEA,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,UAAU;AAAA,EACZ;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/hooks/useRouter.ts"],"sourcesContent":["\"use client\";\r\n\r\nimport { useRouter as useNextRouter } from \"next/navigation\";\r\nimport { useNavigationContext } from \"../providers/navigation.provider\";\r\n\r\ntype SafeBackOptions = { fallback?: string };\r\n\r\ntype AppRouter = ReturnType<typeof useNextRouter>;\r\n\r\nexport interface SafeAppRouter extends Omit<AppRouter, \"back\"> {\r\n back: (options?: SafeBackOptions | string) => void;\r\n safeBack: (options?: SafeBackOptions | string) => void;\r\n}\r\n\r\nexport function useRouter(): SafeAppRouter {\r\n const router = useNextRouter();\r\n const { defaultFallback, internalNavCountRef } = useNavigationContext();\r\n\r\n function back(options?: SafeBackOptions | string) {\r\n const fallback =\r\n typeof options === \"string\"\r\n ? options\r\n : options?.fallback || defaultFallback;\r\n\r\n if (internalNavCountRef.current > 0) {\r\n router.back();\r\n return;\r\n }\r\n\r\n router.replace(fallback);\r\n }\r\n\r\n return {\r\n ...router,\r\n back,\r\n safeBack: back,\r\n };\r\n}\r\n"],"mappings":";AAEA,SAAS,aAAa,qBAAqB;AAC3C,SAAS,4BAA4B;AAW9B,SAAS,YAA2B;AACzC,QAAM,SAAS,cAAc;AAC7B,QAAM,EAAE,iBAAiB,oBAAoB,IAAI,qBAAqB;AAEtE,WAAS,KAAK,SAAoC;AAChD,UAAM,WACJ,OAAO,YAAY,WACf,UACA,SAAS,YAAY;AAE3B,QAAI,oBAAoB,UAAU,GAAG;AACnC,aAAO,KAAK;AACZ;AAAA,IACF;AAEA,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,UAAU;AAAA,EACZ;AACF;","names":[]}
package/dist/http.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/http.ts"],"sourcesContent":["export { apiFetch } from './infra/http/api-fetch';\n"],"mappings":"AAAA,SAAS,gBAAgB;","names":[]}
1
+ {"version":3,"sources":["../src/http.ts"],"sourcesContent":["export { apiFetch } from './infra/http/api-fetch';\r\n"],"mappings":"AAAA,SAAS,gBAAgB;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/i18n/config.ts"],"sourcesContent":["/**\n * Locales suportados pela plataforma GreatApps.\n * Identificadores no padrão `idioma-REGIÃO` em minúsculas: `pt-br`, `en-us`, `es-es`.\n */\nexport const LOCALES = ['pt-br', 'en-us', 'es-es'] as const;\n\nexport type Locale = (typeof LOCALES)[number];\n\n/** Idioma padrão — fallback final (o produto nasce em pt-BR). */\nexport const DEFAULT_LOCALE: Locale = 'pt-br';\n\n/** Nome do cookie onde o locale resolvido é persistido (convenção next-intl). */\nexport const LOCALE_COOKIE = 'NEXT_LOCALE';\n\nexport function isLocale(value: unknown): value is Locale {\n return typeof value === 'string' && (LOCALES as readonly string[]).includes(value);\n}\n"],"mappings":"AAIO,MAAM,UAAU,CAAC,SAAS,SAAS,OAAO;AAK1C,MAAM,iBAAyB;AAG/B,MAAM,gBAAgB;AAEtB,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU,YAAa,QAA8B,SAAS,KAAK;AACnF;","names":[]}
1
+ {"version":3,"sources":["../../src/i18n/config.ts"],"sourcesContent":["/**\r\n * Locales suportados pela plataforma GreatApps.\r\n * Identificadores no padrão `idioma-REGIÃO` em minúsculas: `pt-br`, `en-us`, `es-es`.\r\n */\r\nexport const LOCALES = ['pt-br', 'en-us', 'es-es'] as const;\r\n\r\nexport type Locale = (typeof LOCALES)[number];\r\n\r\n/** Idioma padrão — fallback final (o produto nasce em pt-BR). */\r\nexport const DEFAULT_LOCALE: Locale = 'pt-br';\r\n\r\n/** Nome do cookie onde o locale resolvido é persistido (convenção next-intl). */\r\nexport const LOCALE_COOKIE = 'NEXT_LOCALE';\r\n\r\nexport function isLocale(value: unknown): value is Locale {\r\n return typeof value === 'string' && (LOCALES as readonly string[]).includes(value);\r\n}\r\n"],"mappings":"AAIO,MAAM,UAAU,CAAC,SAAS,SAAS,OAAO;AAK1C,MAAM,iBAAyB;AAG/B,MAAM,gBAAgB;AAEtB,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU,YAAa,QAA8B,SAAS,KAAK;AACnF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/i18n/country-language.ts"],"sourcesContent":["import { Locale } from './config';\n\n/**\n * Países de língua portuguesa (ISO 3166-1 alpha-2).\n */\nconst PORTUGUESE_COUNTRIES = new Set<string>([\n 'BR', // Brasil\n 'PT', // Portugal\n 'AO', // Angola\n 'MZ', // Moçambique\n 'CV', // Cabo Verde\n 'GW', // Guiné-Bissau\n 'ST', // São Tomé e Príncipe\n 'TL', // Timor-Leste\n]);\n\n/**\n * Países de língua espanhola (ISO 3166-1 alpha-2).\n */\nconst SPANISH_COUNTRIES = new Set<string>([\n 'ES', // Espanha\n 'MX', // México\n 'AR', // Argentina\n 'CO', // Colômbia\n 'PE', // Peru\n 'VE', // Venezuela\n 'CL', // Chile\n 'EC', // Equador\n 'GT', // Guatemala\n 'CU', // Cuba\n 'BO', // Bolívia\n 'DO', // República Dominicana\n 'HN', // Honduras\n 'PY', // Paraguai\n 'SV', // El Salvador\n 'NI', // Nicarágua\n 'CR', // Costa Rica\n 'PA', // Panamá\n 'UY', // Uruguai\n 'PR', // Porto Rico\n 'GQ', // Guiné Equatorial\n]);\n\n/**\n * Infere o idioma a partir do código de país (ex.: header `CF-IPCountry` da Cloudflare\n * ou `session.location.country` do JWT):\n * - país lusófono → `pt`\n * - país hispanófono → `es`\n * - demais países → `en`\n *\n * Retorna `null` quando o país é desconhecido/ausente (deixa o fallback de locale decidir).\n */\nexport function localeFromCountry(country?: string | null): Locale | null {\n if (!country) return null;\n const code = country.trim().toUpperCase();\n if (code === 'XX' || code === 'T1') return null; // Cloudflare: desconhecido / Tor\n if (PORTUGUESE_COUNTRIES.has(code)) return 'pt-br';\n if (SPANISH_COUNTRIES.has(code)) return 'es-es';\n return 'en-us';\n}\n"],"mappings":"AAKA,MAAM,uBAAuB,oBAAI,IAAY;AAAA,EAC3C;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF,CAAC;AAKD,MAAM,oBAAoB,oBAAI,IAAY;AAAA,EACxC;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF,CAAC;AAWM,SAAS,kBAAkB,SAAwC;AACxE,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,OAAO,QAAQ,KAAK,EAAE,YAAY;AACxC,MAAI,SAAS,QAAQ,SAAS,KAAM,QAAO;AAC3C,MAAI,qBAAqB,IAAI,IAAI,EAAG,QAAO;AAC3C,MAAI,kBAAkB,IAAI,IAAI,EAAG,QAAO;AACxC,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/i18n/country-language.ts"],"sourcesContent":["import { Locale } from './config';\r\n\r\n/**\r\n * Países de língua portuguesa (ISO 3166-1 alpha-2).\r\n */\r\nconst PORTUGUESE_COUNTRIES = new Set<string>([\r\n 'BR', // Brasil\r\n 'PT', // Portugal\r\n 'AO', // Angola\r\n 'MZ', // Moçambique\r\n 'CV', // Cabo Verde\r\n 'GW', // Guiné-Bissau\r\n 'ST', // São Tomé e Príncipe\r\n 'TL', // Timor-Leste\r\n]);\r\n\r\n/**\r\n * Países de língua espanhola (ISO 3166-1 alpha-2).\r\n */\r\nconst SPANISH_COUNTRIES = new Set<string>([\r\n 'ES', // Espanha\r\n 'MX', // México\r\n 'AR', // Argentina\r\n 'CO', // Colômbia\r\n 'PE', // Peru\r\n 'VE', // Venezuela\r\n 'CL', // Chile\r\n 'EC', // Equador\r\n 'GT', // Guatemala\r\n 'CU', // Cuba\r\n 'BO', // Bolívia\r\n 'DO', // República Dominicana\r\n 'HN', // Honduras\r\n 'PY', // Paraguai\r\n 'SV', // El Salvador\r\n 'NI', // Nicarágua\r\n 'CR', // Costa Rica\r\n 'PA', // Panamá\r\n 'UY', // Uruguai\r\n 'PR', // Porto Rico\r\n 'GQ', // Guiné Equatorial\r\n]);\r\n\r\n/**\r\n * Infere o idioma a partir do código de país (ex.: header `CF-IPCountry` da Cloudflare\r\n * ou `session.location.country` do JWT):\r\n * - país lusófono → `pt`\r\n * - país hispanófono → `es`\r\n * - demais países → `en`\r\n *\r\n * Retorna `null` quando o país é desconhecido/ausente (deixa o fallback de locale decidir).\r\n */\r\nexport function localeFromCountry(country?: string | null): Locale | null {\r\n if (!country) return null;\r\n const code = country.trim().toUpperCase();\r\n if (code === 'XX' || code === 'T1') return null; // Cloudflare: desconhecido / Tor\r\n if (PORTUGUESE_COUNTRIES.has(code)) return 'pt-br';\r\n if (SPANISH_COUNTRIES.has(code)) return 'es-es';\r\n return 'en-us';\r\n}\r\n"],"mappings":"AAKA,MAAM,uBAAuB,oBAAI,IAAY;AAAA,EAC3C;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF,CAAC;AAKD,MAAM,oBAAoB,oBAAI,IAAY;AAAA,EACxC;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF,CAAC;AAWM,SAAS,kBAAkB,SAAwC;AACxE,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,OAAO,QAAQ,KAAK,EAAE,YAAY;AACxC,MAAI,SAAS,QAAQ,SAAS,KAAM,QAAO;AAC3C,MAAI,qBAAqB,IAAI,IAAI,EAAG,QAAO;AAC3C,MAAI,kBAAkB,IAAI,IAAI,EAAG,QAAO;AACxC,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/i18n/messages/en-us.ts"],"sourcesContent":["/**\n * en-us translation catalog for @greatapps/common components.\n * Consumer apps merge this object under the `common` namespace.\n * Mirror the module structure of `pt-br.ts` (the source of truth).\n */\nconst messages = {\n actions: {\n save: 'Save',\n saveChanges: 'Save changes',\n cancel: 'Cancel',\n confirm: 'Confirm',\n delete: 'Delete',\n edit: 'Edit',\n close: 'Close',\n back: 'Back',\n continue: 'Continue',\n add: 'Add',\n remove: 'Remove',\n search: 'Search',\n loading: 'Loading...',\n saving: 'Saving...',\n sending: 'Sending...',\n copy: 'Copy',\n copied: 'Copied',\n },\n\n validations: {\n required: 'Required field',\n invalidEmail: 'Invalid email',\n invalidPhone: 'Invalid phone number',\n },\n\n preferences: {\n title: 'Preferences',\n companyName: 'Company name',\n companyNamePlaceholder: 'Enter the company name',\n language: 'Language',\n languagePlaceholder: 'Select the language',\n languageSearch: 'Search language...',\n currency: 'Currency',\n currencyPlaceholder: 'Select the currency',\n currencySearch: 'Search currency...',\n timeDisplay: 'Time display',\n timezone: 'Time zone',\n timezonePlaceholder: 'Select the time zone',\n timezoneSearch: 'Search time zone...',\n timeFormat: 'Time format',\n timeFormatPlaceholder: 'Select the format',\n timeFormatOptions: {\n h24: '24 hours',\n h12: '12 hours (AM/PM)',\n },\n savedSuccess: 'Preferences saved successfully',\n saveError: 'Error saving preferences',\n },\n\n account: {\n notificationTypes: {\n projectUpdates: 'Project updates',\n securityAlerts: 'Security alerts',\n planBilling: 'Plan or billing changes',\n scheduledMaintenance: 'Scheduled maintenance',\n },\n deleteAccount: {\n title: 'Delete account',\n description:\n 'This action is <b>irreversible</b>. By confirming, your account and all your data will be deleted.',\n reasonLabel: 'Reason for cancellation',\n reasonPlaceholder: 'Select',\n descriptionLabel: 'Describe what led you to make this decision',\n descriptionPlaceholder: 'Explain your decision...',\n charactersCount: '{count}/400 characters',\n passwordLabel: 'Password',\n passwordPlaceholder: 'Enter your password',\n submit: 'Delete account',\n requiredFields: 'Fill in all required fields',\n reasons: {\n noFeature: 'The tool lacks a feature I need',\n technical: 'I encountered technical issues or errors in the system',\n support: 'I had issues with support or customer service',\n updates: 'Updates take longer than expected',\n temporary: 'The cancellation is temporary',\n other: 'Other reason',\n },\n },\n confirmDelete: {\n title: 'Sorry to see you go!',\n warning:\n 'All your <b>{count} pages</b> will be permanently deleted. This action is <b>irreversible!</b>',\n sessionExpired: 'Session expired. Fill in the fields again.',\n success: 'Account deleted successfully',\n error: 'Error deleting account. Please try again.',\n keepAccount: 'Keep my account',\n deleteAnyway: 'Delete anyway',\n deleting: 'Deleting...',\n },\n cantDelete: {\n title: 'Unable to delete account',\n description:\n 'You have an active subscription. To delete your account, <b>first cancel your subscription</b> on the Subscription page and then try again.',\n confirm: 'Ok, I understand',\n goToSubscription: 'Go to subscription',\n },\n twoFactor: {\n title: 'Two-factor authentication',\n instructions:\n 'Install an authenticator app on your mobile device (e.g., <link>Google Authenticator</link>), scan the QR Code on the side or copy the key in the app, and then enter the 6-digit code generated to continue.',\n qrAlt: 'QR Code for two-factor authentication',\n retry: 'Try again',\n pasteDigits: 'Paste the 6 digits below',\n activating: 'Activating...',\n activate: 'Activate authentication',\n recoveryTitle: 'Security codes',\n recoveryHeading: 'Save these emergency recovery codes',\n recoveryText1:\n 'If you lose access to your phone, you will not be able to log into your account without a two-factor code.',\n recoveryText2: 'Print, copy, or write the codes below in a safe location.',\n copyCodes: 'Copy codes',\n finish: 'Finish',\n codesCopied: 'Codes copied successfully',\n generateError: 'Error generating QR Code. Try again.',\n confirmError: 'Error confirming code. Try again.',\n disableTitle: 'Disable 2FA authentication',\n disableDescription:\n 'Enter the 6-digit code from your authenticator app to confirm disabling.',\n authenticatorCode: 'Authenticator code',\n disabling: 'Disabling...',\n disable: 'Disable 2FA',\n disabledSuccess: 'Two-factor authentication disabled',\n disableError: 'Error disabling 2FA. Try again.',\n invalidCode: 'Invalid code',\n codeResent: 'Code resent',\n resendError: 'Error resending code. Try again.',\n },\n profile: {\n title: 'My profile',\n avatarAlt: 'User photo',\n changePhoto: 'Change photo',\n name: 'First name',\n namePlaceholder: 'Enter your first name',\n lastName: 'Last name',\n lastNamePlaceholder: 'Enter your last name',\n gender: 'Gender',\n genderPlaceholder: 'Select your gender',\n genderOptions: {\n male: 'Male',\n female: 'Female',\n },\n phone: 'Phone',\n change: 'Change',\n accessData: 'Access data',\n email: 'Email',\n savedSuccess: 'Profile updated successfully',\n saveError: 'Error updating profile',\n },\n otp: {\n validationCode: 'Validation code',\n incorrectCode: 'Incorrect code',\n resend: 'Resend code',\n resendIn: 'Resend in <b>{time}</b>',\n validating: 'Validating...',\n },\n changeEmail: {\n title: 'Change email',\n confirm: 'Change email',\n sentCodeTo: 'We sent a validation code to email <b>{email}.</b>',\n updateTitle: 'Update contact email',\n updateDescription: 'Enter your new email to keep your contact information updated.',\n newEmail: 'New email',\n newEmailPlaceholder: 'Enter your new email',\n emailChanged: 'Email changed successfully',\n emailExistsError: 'Email already exists or an error occurred. Please try again later.',\n },\n changePhone: {\n titleEdit: 'Change phone',\n titleAdd: 'Add phone',\n sentCodeTo: 'We sent a validation code to your current number <b>{phone}.</b>',\n confirm: 'Change phone',\n updateTitle: 'Update contact phone',\n addTitle: 'Add contact phone',\n updateDescription: 'Enter the new number to keep your contact information updated.',\n addDescription: 'Enter your phone number for contact.',\n newNumber: 'New number',\n numberLabel: 'Phone number',\n phoneChanged: 'Phone changed',\n phoneAdded: 'Phone added',\n invalidNumber: 'Invalid phone number',\n saveError: 'An error occurred while saving the phone number. Please try again later.',\n numberExistsError: 'Number already exists or an error occurred. Please try again later.',\n },\n security: {\n title: 'Security',\n googleLinkedTitle: 'Google account linked',\n googleLinkedDescription:\n 'Your account is linked to Google. If you unlink it, use \"Forgot my password\" to reset an email access password.',\n unlinking: 'Unlinking...',\n unlinkGoogle: 'Unlink Google',\n unlinkError: 'Error unlinking Google account.',\n deleteAccountDescription:\n 'This action is permanent and cannot be undone. All your data, projects, and settings will be permanently removed.',\n deleteMyAccount: 'Delete my account',\n },\n token: {\n title: 'Account token',\n label: 'Token',\n copySuccess: 'Token copied successfully',\n copyError: 'Failed to copy token',\n info: 'This token is unique to your account and allows API access. Do not share with third parties.',\n docsLink: 'Access documentation',\n },\n changePassword: {\n title: 'Change password',\n currentPassword: 'Current password',\n currentPasswordPlaceholder: 'Enter your current password',\n newPassword: 'New password',\n newPasswordPlaceholder: 'Enter your new password',\n submit: 'Save new password',\n changeError: 'Error changing password',\n changedSuccess: 'Password changed successfully',\n genericError: 'Error changing password. Try again.',\n },\n globalPreferences: {\n title: 'Change global preferences',\n srDescription: 'Confirmation of global account preferences change',\n warning:\n 'You are changing settings that impact <b>all account users</b>. Do you want to confirm?',\n },\n configurations: {\n title: 'Settings',\n },\n },\n\n credits: {\n buy: {\n title: 'Buy AI credits',\n externalTitle: 'AI Credits',\n externalDescription: 'To purchase AI credits, visit your subscription area.',\n externalButton: 'Go to subscription area',\n creditsOptionLabel: '{credits} AI credits',\n creditsOptionDisplayValue: '{credits} AI credits',\n paymentOnConfirm: 'Payment will be processed at the time of confirmation.',\n nextInvoiceChanges: 'Changes will take effect from your next invoice.',\n defaultPrice: 'Default',\n immediateCharge: 'Immediate charge',\n totalPlanValue: 'Total plan value',\n confirmAndPay: 'Confirm and pay',\n creditsChangedToast: 'AI credits changed to {credits}',\n },\n disabled: {\n title: 'Credit purchase unavailable',\n descriptionLine1: 'Only administrators and owners can purchase AI credits.',\n descriptionLine2:\n 'Ask an account administrator or owner to purchase more credits.',\n understood: 'Got it',\n },\n paidPlanRequired: {\n defaultTitle: 'Feature available on paid plans',\n defaultDescription: 'To access this feature, upgrade to a paid plan',\n knowPlans: 'View plans',\n },\n },\n\n cards: {\n add: {\n stepBilling: 'Billing',\n stepCard: 'Card',\n externalTitle: 'Card management unavailable',\n externalDescription: 'Access your subscription area to manage payment methods.',\n externalButton: 'Go to subscription area',\n title: 'Add card',\n billingHeading: 'Add your billing information',\n cardHeading: 'Add your card information',\n authenticating: 'Authenticating...',\n submitting: 'Adding card...',\n submit: 'Add card',\n errorInitAuth: 'Unable to start card authentication, please try again.',\n errorAuth: 'Card authentication failed.',\n errorAuthStatus: 'Authentication not completed (status: {status}).',\n statusUnknown: 'unknown',\n successToast: 'Card added successfully.',\n errorSave: 'Unable to save your new card, please try again.',\n },\n form: {\n nameOnCard: 'Name on card',\n typeHere: 'Type here',\n cardNumber: 'Card number',\n cardExpiry: 'Expiration date',\n cardCvc: 'CVC',\n country: 'Country',\n select: 'Select',\n personType: 'Person type',\n personTypePf: 'Individual',\n personTypePj: 'Business',\n cpf: 'CPF',\n cnpj: 'CNPJ',\n fullName: 'Full name',\n cep: 'CEP',\n postalCode: 'Postal code',\n street: 'Address',\n streetNumber: 'Number',\n city: 'City',\n state: 'UF',\n stateProvince: 'State/Province',\n neighborhood: 'Neighborhood',\n complement: 'Complement',\n cardNumberRequired: 'Card number is required',\n cardExpiryRequired: 'Expiration date is required',\n cardCvcRequired: 'Security code is required',\n },\n delete: {\n title: 'Delete card',\n description: 'Are you sure you want to delete the card:',\n confirmLabel: 'Type DELETE below',\n confirmPlaceholder: 'DELETE',\n deleting: 'Deleting...',\n successToast: 'Card •••• {digits} deleted successfully',\n errorToast: 'Unable to delete card',\n },\n cannotDelete: {\n title: 'Cannot delete this card',\n description: 'This card is in use and has an active subscription linked to it. Select another card as default or add a new one.',\n selectDefault: 'Select a card as default:',\n addNewCard: 'Add new card',\n errorUpdateCard: 'Error updating subscription card',\n },\n item: {\n defaultBadge: 'Default',\n makeDefault: 'Make default',\n setDefaultSuccess: 'Card set as default',\n setDefaultError: 'Error setting card as default',\n },\n paymentInfo: {\n email: 'Email',\n payment: 'Payment',\n addCard: 'Add card',\n selectPaymentMethod: 'Select payment method',\n manageCards: 'Manage cards',\n newPaymentMethod: 'New payment method',\n },\n },\n navigation: {\n banners: {\n cancelled: {\n message: 'Subscription cancelled! Your pages are now offline.',\n choosePlan: 'Choose a new plan',\n },\n overdue: {\n message: 'Your subscription is overdue and your pages may be taken offline at any time.',\n details: 'Details',\n },\n pending: {\n message: 'Your subscription was cancelled. You have until {limitDate} with your pages online.',\n reactivate: 'Reactivate subscription',\n },\n upcoming: {\n message: 'Invoice pending. Pay by {dueDate} to avoid suspension of your pages.',\n details: 'Details',\n },\n trial: {\n message: 'Trial period: {days, plural, =0 {your trial ends today!} one {# day left} other {# days left}}.',\n choosePlan: 'Subscribe now',\n },\n },\n projectSelector: {\n title: 'Projects',\n searchPlaceholder: 'Search here',\n emptyLine1: 'No projects found.',\n emptyLine2: 'Create a project to get started.',\n noResults: 'No results found.',\n manageProjects: 'Manage projects',\n },\n bottomLinks: {\n news: 'News',\n helpCenter: 'Help center',\n sendSuggestions: 'Send suggestions',\n },\n creditsCard: {\n label: 'Credits used',\n },\n planCard: {\n knowPlans: 'View plans',\n },\n },\n forms: {\n combobox: {\n placeholder: 'Select an option',\n searchPlaceholder: 'Search...',\n emptyMessage: 'No options found.',\n },\n datePicker: {\n placeholder: 'Select date',\n },\n dateRangePicker: {\n placeholder: 'Select period',\n },\n phoneInput: {\n optional: '(Optional)',\n searchPlaceholder: 'Search country...',\n emptyMessage: 'No countries found',\n },\n select: {\n placeholder: 'Select an option',\n optional: '(Optional)',\n },\n copyButton: {\n tooltipDefault: 'Copy link',\n successDefault: 'Link copied',\n errorMessage: 'Unable to copy link',\n },\n circularProgress: {\n ariaLabel: 'Export progress',\n },\n },\n imageUpload: {\n cropTitle: 'Adjust image',\n cropHint: 'Drag to adjust the crop area',\n cropAlt: 'Crop',\n tooSmallTitleWithDimension: 'Image smaller than {dimensionText}',\n tooSmallTitleGeneric: 'Image too small',\n tooSmallBodyFileWithDimension: 'The file \"{fileName}\" is smaller than {dimensionText}. Upload an image with at least {dimensionText} to continue.',\n tooSmallBodyFileGeneric: 'The file \"{fileName}\" is smaller than the minimum required size. Upload a larger image to continue.',\n tooSmallBodyNoFileWithDimension: 'The selected image is smaller than {dimensionText}. Upload an image with at least {dimensionText} to continue.',\n tooSmallBodyNoFileGeneric: 'The selected image is smaller than the minimum required size. Upload a larger image to continue.',\n sendAnother: 'Upload another',\n errorSvg: 'SVG format is not supported. Use PNG, JPEG, WebP, or GIF.',\n errorFormat: 'Unsupported format. Use PNG, JPEG, WebP, or GIF.',\n errorTooLarge: 'File too large. Maximum {maxSize}MB.',\n },\n notifications: {\n page: {\n title: 'Notifications',\n subtitle: 'Have full control over pages, experiences, and conversions.',\n markAllReadDesktop: 'Mark all as read',\n markAllReadMobile: 'Mark as read',\n tabAll: 'All notifications',\n tabUnread: 'Unread',\n details: 'Details',\n empty: 'No notifications found.',\n markAllSuccess: 'All notifications marked as read',\n markAllError: 'Error marking notifications as read',\n },\n popover: {\n title: 'Latest notifications',\n empty: 'No notifications yet',\n viewAll: 'All notifications',\n },\n },\n layout: {\n navbar: {\n expandMenu: 'Expand menu',\n greatPages: 'GreatPages',\n pages: 'Pages',\n },\n profile: {\n usedCredits: 'Credits used',\n loggingOut: 'Signing out...',\n logout: 'Sign out',\n },\n usersSelector: {\n title: 'Users',\n add: 'Add',\n searchPlaceholder: 'Search here',\n empty: 'No users found.',\n noResults: 'No results found.',\n addToProject: 'Add to project',\n removeFromProject: 'Remove from project',\n manageTeam: 'Manage team',\n },\n },\n notFound: {\n title: 'Page not found!',\n description: 'The page you are looking for does not exist. Check that you typed the link correctly.',\n backToHome: 'Back to home',\n },\n\n // Planos: features e main features (mapApiPlanToUiPlan).\n plans: {\n features: {\n unlimitedVisits: 'Unlimited visits',\n unlimitedLeads: 'Unlimited leads',\n sharePages: 'Share pages',\n hosting: 'Hosting included',\n freeTemplates: 'Free templates',\n onboarding: 'Onboarding meeting',\n projectManagement: 'Project management',\n },\n mainFeatures: {\n pagesUnlimited: 'Unlimited pages',\n pageSingular: '1 page',\n pagesPlural: '{count} pages',\n domainsUnlimited: 'Unlimited domains',\n domainSingular: '1 external domain',\n domainsPlural: '{count} external domains',\n usersUnlimited: 'Unlimited users',\n },\n usdNotConfigured: 'USD not configured',\n },\n\n // Periodicidade de cobrança.\n periodicity: {\n monthly: 'Monthly',\n semiannual: 'Semiannual',\n annual: 'Annual',\n suffixMonthly: '/month',\n suffixSemiannual: '/semester',\n suffixAnnual: '/year',\n labelMonthly: 'monthly',\n labelSemiannual: 'semiannual',\n labelAnnual: 'annual',\n },\n\n languages: {\n 'pt-br': 'Portuguese (Brazil)',\n 'en-us': 'English (US)',\n 'es-es': 'Spanish',\n },\n} as const;\n\nexport default messages;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/i18n/messages/en-us.ts"],"sourcesContent":["/**\r\n * en-us translation catalog for @greatapps/common components.\r\n * Consumer apps merge this object under the `common` namespace.\r\n * Mirror the module structure of `pt-br.ts` (the source of truth).\r\n */\r\nconst messages = {\r\n actions: {\r\n save: 'Save',\r\n saveChanges: 'Save changes',\r\n cancel: 'Cancel',\r\n confirm: 'Confirm',\r\n delete: 'Delete',\r\n edit: 'Edit',\r\n close: 'Close',\r\n back: 'Back',\r\n continue: 'Continue',\r\n add: 'Add',\r\n remove: 'Remove',\r\n search: 'Search',\r\n loading: 'Loading...',\r\n saving: 'Saving...',\r\n sending: 'Sending...',\r\n copy: 'Copy',\r\n copied: 'Copied',\r\n },\r\n\r\n validations: {\r\n required: 'Required field',\r\n invalidEmail: 'Invalid email',\r\n invalidPhone: 'Invalid phone number',\r\n },\r\n\r\n preferences: {\r\n title: 'Preferences',\r\n companyName: 'Company name',\r\n companyNamePlaceholder: 'Enter the company name',\r\n language: 'Language',\r\n languagePlaceholder: 'Select the language',\r\n languageSearch: 'Search language...',\r\n currency: 'Currency',\r\n currencyPlaceholder: 'Select the currency',\r\n currencySearch: 'Search currency...',\r\n timeDisplay: 'Time display',\r\n timezone: 'Time zone',\r\n timezonePlaceholder: 'Select the time zone',\r\n timezoneSearch: 'Search time zone...',\r\n timeFormat: 'Time format',\r\n timeFormatPlaceholder: 'Select the format',\r\n timeFormatOptions: {\r\n h24: '24 hours',\r\n h12: '12 hours (AM/PM)',\r\n },\r\n savedSuccess: 'Preferences saved successfully',\r\n saveError: 'Error saving preferences',\r\n },\r\n\r\n account: {\r\n notificationTypes: {\r\n projectUpdates: 'Project updates',\r\n securityAlerts: 'Security alerts',\r\n planBilling: 'Plan or billing changes',\r\n scheduledMaintenance: 'Scheduled maintenance',\r\n },\r\n deleteAccount: {\r\n title: 'Delete account',\r\n description:\r\n 'This action is <b>irreversible</b>. By confirming, your account and all your data will be deleted.',\r\n reasonLabel: 'Reason for cancellation',\r\n reasonPlaceholder: 'Select',\r\n descriptionLabel: 'Describe what led you to make this decision',\r\n descriptionPlaceholder: 'Explain your decision...',\r\n charactersCount: '{count}/400 characters',\r\n passwordLabel: 'Password',\r\n passwordPlaceholder: 'Enter your password',\r\n submit: 'Delete account',\r\n requiredFields: 'Fill in all required fields',\r\n reasons: {\r\n noFeature: 'The tool lacks a feature I need',\r\n technical: 'I encountered technical issues or errors in the system',\r\n support: 'I had issues with support or customer service',\r\n updates: 'Updates take longer than expected',\r\n temporary: 'The cancellation is temporary',\r\n other: 'Other reason',\r\n },\r\n },\r\n confirmDelete: {\r\n title: 'Sorry to see you go!',\r\n warning:\r\n 'All your <b>{count} pages</b> will be permanently deleted. This action is <b>irreversible!</b>',\r\n sessionExpired: 'Session expired. Fill in the fields again.',\r\n success: 'Account deleted successfully',\r\n error: 'Error deleting account. Please try again.',\r\n keepAccount: 'Keep my account',\r\n deleteAnyway: 'Delete anyway',\r\n deleting: 'Deleting...',\r\n },\r\n cantDelete: {\r\n title: 'Unable to delete account',\r\n description:\r\n 'You have an active subscription. To delete your account, <b>first cancel your subscription</b> on the Subscription page and then try again.',\r\n confirm: 'Ok, I understand',\r\n goToSubscription: 'Go to subscription',\r\n },\r\n twoFactor: {\r\n title: 'Two-factor authentication',\r\n instructions:\r\n 'Install an authenticator app on your mobile device (e.g., <link>Google Authenticator</link>), scan the QR Code on the side or copy the key in the app, and then enter the 6-digit code generated to continue.',\r\n qrAlt: 'QR Code for two-factor authentication',\r\n retry: 'Try again',\r\n pasteDigits: 'Paste the 6 digits below',\r\n activating: 'Activating...',\r\n activate: 'Activate authentication',\r\n recoveryTitle: 'Security codes',\r\n recoveryHeading: 'Save these emergency recovery codes',\r\n recoveryText1:\r\n 'If you lose access to your phone, you will not be able to log into your account without a two-factor code.',\r\n recoveryText2: 'Print, copy, or write the codes below in a safe location.',\r\n copyCodes: 'Copy codes',\r\n finish: 'Finish',\r\n codesCopied: 'Codes copied successfully',\r\n generateError: 'Error generating QR Code. Try again.',\r\n confirmError: 'Error confirming code. Try again.',\r\n disableTitle: 'Disable 2FA authentication',\r\n disableDescription:\r\n 'Enter the 6-digit code from your authenticator app to confirm disabling.',\r\n authenticatorCode: 'Authenticator code',\r\n disabling: 'Disabling...',\r\n disable: 'Disable 2FA',\r\n disabledSuccess: 'Two-factor authentication disabled',\r\n disableError: 'Error disabling 2FA. Try again.',\r\n invalidCode: 'Invalid code',\r\n codeResent: 'Code resent',\r\n resendError: 'Error resending code. Try again.',\r\n },\r\n profile: {\r\n title: 'My profile',\r\n avatarAlt: 'User photo',\r\n changePhoto: 'Change photo',\r\n name: 'First name',\r\n namePlaceholder: 'Enter your first name',\r\n lastName: 'Last name',\r\n lastNamePlaceholder: 'Enter your last name',\r\n gender: 'Gender',\r\n genderPlaceholder: 'Select your gender',\r\n genderOptions: {\r\n male: 'Male',\r\n female: 'Female',\r\n },\r\n phone: 'Phone',\r\n change: 'Change',\r\n accessData: 'Access data',\r\n email: 'Email',\r\n savedSuccess: 'Profile updated successfully',\r\n saveError: 'Error updating profile',\r\n },\r\n otp: {\r\n validationCode: 'Validation code',\r\n incorrectCode: 'Incorrect code',\r\n resend: 'Resend code',\r\n resendIn: 'Resend in <b>{time}</b>',\r\n validating: 'Validating...',\r\n },\r\n changeEmail: {\r\n title: 'Change email',\r\n confirm: 'Change email',\r\n sentCodeTo: 'We sent a validation code to email <b>{email}.</b>',\r\n updateTitle: 'Update contact email',\r\n updateDescription: 'Enter your new email to keep your contact information updated.',\r\n newEmail: 'New email',\r\n newEmailPlaceholder: 'Enter your new email',\r\n emailChanged: 'Email changed successfully',\r\n emailExistsError: 'Email already exists or an error occurred. Please try again later.',\r\n },\r\n changePhone: {\r\n titleEdit: 'Change phone',\r\n titleAdd: 'Add phone',\r\n sentCodeTo: 'We sent a validation code to your current number <b>{phone}.</b>',\r\n confirm: 'Change phone',\r\n updateTitle: 'Update contact phone',\r\n addTitle: 'Add contact phone',\r\n updateDescription: 'Enter the new number to keep your contact information updated.',\r\n addDescription: 'Enter your phone number for contact.',\r\n newNumber: 'New number',\r\n numberLabel: 'Phone number',\r\n phoneChanged: 'Phone changed',\r\n phoneAdded: 'Phone added',\r\n invalidNumber: 'Invalid phone number',\r\n saveError: 'An error occurred while saving the phone number. Please try again later.',\r\n numberExistsError: 'Number already exists or an error occurred. Please try again later.',\r\n },\r\n security: {\r\n title: 'Security',\r\n googleLinkedTitle: 'Google account linked',\r\n googleLinkedDescription:\r\n 'Your account is linked to Google. If you unlink it, use \"Forgot my password\" to reset an email access password.',\r\n unlinking: 'Unlinking...',\r\n unlinkGoogle: 'Unlink Google',\r\n unlinkError: 'Error unlinking Google account.',\r\n deleteAccountDescription:\r\n 'This action is permanent and cannot be undone. All your data, projects, and settings will be permanently removed.',\r\n deleteMyAccount: 'Delete my account',\r\n },\r\n token: {\r\n title: 'Account token',\r\n label: 'Token',\r\n copySuccess: 'Token copied successfully',\r\n copyError: 'Failed to copy token',\r\n info: 'This token is unique to your account and allows API access. Do not share with third parties.',\r\n docsLink: 'Access documentation',\r\n },\r\n changePassword: {\r\n title: 'Change password',\r\n currentPassword: 'Current password',\r\n currentPasswordPlaceholder: 'Enter your current password',\r\n newPassword: 'New password',\r\n newPasswordPlaceholder: 'Enter your new password',\r\n submit: 'Save new password',\r\n changeError: 'Error changing password',\r\n changedSuccess: 'Password changed successfully',\r\n genericError: 'Error changing password. Try again.',\r\n },\r\n globalPreferences: {\r\n title: 'Change global preferences',\r\n srDescription: 'Confirmation of global account preferences change',\r\n warning:\r\n 'You are changing settings that impact <b>all account users</b>. Do you want to confirm?',\r\n },\r\n configurations: {\r\n title: 'Settings',\r\n },\r\n },\r\n\r\n credits: {\r\n buy: {\r\n title: 'Buy AI credits',\r\n externalTitle: 'AI Credits',\r\n externalDescription: 'To purchase AI credits, visit your subscription area.',\r\n externalButton: 'Go to subscription area',\r\n creditsOptionLabel: '{credits} AI credits',\r\n creditsOptionDisplayValue: '{credits} AI credits',\r\n paymentOnConfirm: 'Payment will be processed at the time of confirmation.',\r\n nextInvoiceChanges: 'Changes will take effect from your next invoice.',\r\n defaultPrice: 'Default',\r\n immediateCharge: 'Immediate charge',\r\n totalPlanValue: 'Total plan value',\r\n confirmAndPay: 'Confirm and pay',\r\n creditsChangedToast: 'AI credits changed to {credits}',\r\n },\r\n disabled: {\r\n title: 'Credit purchase unavailable',\r\n descriptionLine1: 'Only administrators and owners can purchase AI credits.',\r\n descriptionLine2:\r\n 'Ask an account administrator or owner to purchase more credits.',\r\n understood: 'Got it',\r\n },\r\n paidPlanRequired: {\r\n defaultTitle: 'Feature available on paid plans',\r\n defaultDescription: 'To access this feature, upgrade to a paid plan',\r\n knowPlans: 'View plans',\r\n },\r\n },\r\n\r\n cards: {\r\n add: {\r\n stepBilling: 'Billing',\r\n stepCard: 'Card',\r\n externalTitle: 'Card management unavailable',\r\n externalDescription: 'Access your subscription area to manage payment methods.',\r\n externalButton: 'Go to subscription area',\r\n title: 'Add card',\r\n billingHeading: 'Add your billing information',\r\n cardHeading: 'Add your card information',\r\n authenticating: 'Authenticating...',\r\n submitting: 'Adding card...',\r\n submit: 'Add card',\r\n errorInitAuth: 'Unable to start card authentication, please try again.',\r\n errorAuth: 'Card authentication failed.',\r\n errorAuthStatus: 'Authentication not completed (status: {status}).',\r\n statusUnknown: 'unknown',\r\n successToast: 'Card added successfully.',\r\n errorSave: 'Unable to save your new card, please try again.',\r\n },\r\n form: {\r\n nameOnCard: 'Name on card',\r\n typeHere: 'Type here',\r\n cardNumber: 'Card number',\r\n cardExpiry: 'Expiration date',\r\n cardCvc: 'CVC',\r\n country: 'Country',\r\n select: 'Select',\r\n personType: 'Person type',\r\n personTypePf: 'Individual',\r\n personTypePj: 'Business',\r\n cpf: 'CPF',\r\n cnpj: 'CNPJ',\r\n fullName: 'Full name',\r\n cep: 'CEP',\r\n postalCode: 'Postal code',\r\n street: 'Address',\r\n streetNumber: 'Number',\r\n city: 'City',\r\n state: 'UF',\r\n stateProvince: 'State/Province',\r\n neighborhood: 'Neighborhood',\r\n complement: 'Complement',\r\n cardNumberRequired: 'Card number is required',\r\n cardExpiryRequired: 'Expiration date is required',\r\n cardCvcRequired: 'Security code is required',\r\n },\r\n delete: {\r\n title: 'Delete card',\r\n description: 'Are you sure you want to delete the card:',\r\n confirmLabel: 'Type DELETE below',\r\n confirmPlaceholder: 'DELETE',\r\n deleting: 'Deleting...',\r\n successToast: 'Card •••• {digits} deleted successfully',\r\n errorToast: 'Unable to delete card',\r\n },\r\n cannotDelete: {\r\n title: 'Cannot delete this card',\r\n description: 'This card is in use and has an active subscription linked to it. Select another card as default or add a new one.',\r\n selectDefault: 'Select a card as default:',\r\n addNewCard: 'Add new card',\r\n errorUpdateCard: 'Error updating subscription card',\r\n },\r\n item: {\r\n defaultBadge: 'Default',\r\n makeDefault: 'Make default',\r\n setDefaultSuccess: 'Card set as default',\r\n setDefaultError: 'Error setting card as default',\r\n },\r\n paymentInfo: {\r\n email: 'Email',\r\n payment: 'Payment',\r\n addCard: 'Add card',\r\n selectPaymentMethod: 'Select payment method',\r\n manageCards: 'Manage cards',\r\n newPaymentMethod: 'New payment method',\r\n },\r\n },\r\n navigation: {\r\n banners: {\r\n cancelled: {\r\n message: 'Subscription cancelled! Your pages are now offline.',\r\n choosePlan: 'Choose a new plan',\r\n },\r\n overdue: {\r\n message: 'Your subscription is overdue and your pages may be taken offline at any time.',\r\n details: 'Details',\r\n },\r\n pending: {\r\n message: 'Your subscription was cancelled. You have until {limitDate} with your pages online.',\r\n reactivate: 'Reactivate subscription',\r\n },\r\n upcoming: {\r\n message: 'Invoice pending. Pay by {dueDate} to avoid suspension of your pages.',\r\n details: 'Details',\r\n },\r\n trial: {\r\n message: 'Trial period: {days, plural, =0 {your trial ends today!} one {# day left} other {# days left}}.',\r\n choosePlan: 'Subscribe now',\r\n },\r\n },\r\n projectSelector: {\r\n title: 'Projects',\r\n searchPlaceholder: 'Search here',\r\n emptyLine1: 'No projects found.',\r\n emptyLine2: 'Create a project to get started.',\r\n noResults: 'No results found.',\r\n manageProjects: 'Manage projects',\r\n },\r\n bottomLinks: {\r\n news: 'News',\r\n helpCenter: 'Help center',\r\n sendSuggestions: 'Send suggestions',\r\n },\r\n creditsCard: {\r\n label: 'Credits used',\r\n },\r\n planCard: {\r\n knowPlans: 'View plans',\r\n },\r\n },\r\n forms: {\r\n combobox: {\r\n placeholder: 'Select an option',\r\n searchPlaceholder: 'Search...',\r\n emptyMessage: 'No options found.',\r\n },\r\n datePicker: {\r\n placeholder: 'Select date',\r\n },\r\n dateRangePicker: {\r\n placeholder: 'Select period',\r\n },\r\n phoneInput: {\r\n optional: '(Optional)',\r\n searchPlaceholder: 'Search country...',\r\n emptyMessage: 'No countries found',\r\n },\r\n select: {\r\n placeholder: 'Select an option',\r\n optional: '(Optional)',\r\n },\r\n copyButton: {\r\n tooltipDefault: 'Copy link',\r\n successDefault: 'Link copied',\r\n errorMessage: 'Unable to copy link',\r\n },\r\n circularProgress: {\r\n ariaLabel: 'Export progress',\r\n },\r\n },\r\n imageUpload: {\r\n cropTitle: 'Adjust image',\r\n cropHint: 'Drag to adjust the crop area',\r\n cropAlt: 'Crop',\r\n tooSmallTitleWithDimension: 'Image smaller than {dimensionText}',\r\n tooSmallTitleGeneric: 'Image too small',\r\n tooSmallBodyFileWithDimension: 'The file \"{fileName}\" is smaller than {dimensionText}. Upload an image with at least {dimensionText} to continue.',\r\n tooSmallBodyFileGeneric: 'The file \"{fileName}\" is smaller than the minimum required size. Upload a larger image to continue.',\r\n tooSmallBodyNoFileWithDimension: 'The selected image is smaller than {dimensionText}. Upload an image with at least {dimensionText} to continue.',\r\n tooSmallBodyNoFileGeneric: 'The selected image is smaller than the minimum required size. Upload a larger image to continue.',\r\n sendAnother: 'Upload another',\r\n errorSvg: 'SVG format is not supported. Use PNG, JPEG, WebP, or GIF.',\r\n errorFormat: 'Unsupported format. Use PNG, JPEG, WebP, or GIF.',\r\n errorTooLarge: 'File too large. Maximum {maxSize}MB.',\r\n },\r\n notifications: {\r\n page: {\r\n title: 'Notifications',\r\n subtitle: 'Have full control over pages, experiences, and conversions.',\r\n markAllReadDesktop: 'Mark all as read',\r\n markAllReadMobile: 'Mark as read',\r\n tabAll: 'All notifications',\r\n tabUnread: 'Unread',\r\n details: 'Details',\r\n empty: 'No notifications found.',\r\n markAllSuccess: 'All notifications marked as read',\r\n markAllError: 'Error marking notifications as read',\r\n },\r\n popover: {\r\n title: 'Latest notifications',\r\n empty: 'No notifications yet',\r\n viewAll: 'All notifications',\r\n },\r\n },\r\n layout: {\r\n navbar: {\r\n expandMenu: 'Expand menu',\r\n greatPages: 'GreatPages',\r\n pages: 'Pages',\r\n },\r\n profile: {\r\n usedCredits: 'Credits used',\r\n loggingOut: 'Signing out...',\r\n logout: 'Sign out',\r\n },\r\n usersSelector: {\r\n title: 'Users',\r\n add: 'Add',\r\n searchPlaceholder: 'Search here',\r\n empty: 'No users found.',\r\n noResults: 'No results found.',\r\n addToProject: 'Add to project',\r\n removeFromProject: 'Remove from project',\r\n manageTeam: 'Manage team',\r\n },\r\n },\r\n notFound: {\r\n title: 'Page not found!',\r\n description: 'The page you are looking for does not exist. Check that you typed the link correctly.',\r\n backToHome: 'Back to home',\r\n },\r\n\r\n // Planos: features e main features (mapApiPlanToUiPlan).\r\n plans: {\r\n features: {\r\n unlimitedVisits: 'Unlimited visits',\r\n unlimitedLeads: 'Unlimited leads',\r\n sharePages: 'Share pages',\r\n hosting: 'Hosting included',\r\n freeTemplates: 'Free templates',\r\n onboarding: 'Onboarding meeting',\r\n projectManagement: 'Project management',\r\n },\r\n mainFeatures: {\r\n pagesUnlimited: 'Unlimited pages',\r\n pageSingular: '1 page',\r\n pagesPlural: '{count} pages',\r\n domainsUnlimited: 'Unlimited domains',\r\n domainSingular: '1 external domain',\r\n domainsPlural: '{count} external domains',\r\n usersUnlimited: 'Unlimited users',\r\n },\r\n usdNotConfigured: 'USD not configured',\r\n },\r\n\r\n // Periodicidade de cobrança.\r\n periodicity: {\r\n monthly: 'Monthly',\r\n semiannual: 'Semiannual',\r\n annual: 'Annual',\r\n suffixMonthly: '/month',\r\n suffixSemiannual: '/semester',\r\n suffixAnnual: '/year',\r\n labelMonthly: 'monthly',\r\n labelSemiannual: 'semiannual',\r\n labelAnnual: 'annual',\r\n },\r\n\r\n languages: {\r\n 'pt-br': 'Portuguese (Brazil)',\r\n 'en-us': 'English (US)',\r\n 'es-es': 'Spanish',\r\n },\r\n} as const;\r\n\r\nexport default messages;\r\n"],"mappings":"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","names":[]}