@greatapps/common 1.1.747 → 1.1.749
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.
- package/dist/components/layouts/AiCreditsOfferGate.mjs +92 -0
- package/dist/components/layouts/AiCreditsOfferGate.mjs.map +1 -0
- package/dist/components/modals/AccountFrozenModal.mjs +20 -14
- package/dist/components/modals/AccountFrozenModal.mjs.map +1 -1
- package/dist/components/modals/promo/AiCreditsOfferModal/AiCreditsOfferModal.mjs +275 -0
- package/dist/components/modals/promo/AiCreditsOfferModal/AiCreditsOfferModal.mjs.map +1 -0
- package/dist/components/modals/promo/AiCreditsOfferModal/components/LoseOfferDialog.mjs +55 -0
- package/dist/components/modals/promo/AiCreditsOfferModal/components/LoseOfferDialog.mjs.map +1 -0
- package/dist/components/modals/promo/AiCreditsOfferModal/components/OfferIllustration.mjs +78 -0
- package/dist/components/modals/promo/AiCreditsOfferModal/components/OfferIllustration.mjs.map +1 -0
- package/dist/components/modals/promo/AiCreditsOfferModal/components/OfferPaymentField.mjs +60 -0
- package/dist/components/modals/promo/AiCreditsOfferModal/components/OfferPaymentField.mjs.map +1 -0
- package/dist/components/modals/promo/AiCreditsOfferModal/index.mjs +5 -0
- package/dist/components/modals/promo/AiCreditsOfferModal/index.mjs.map +1 -0
- package/dist/components/navigation/SubscriptionBanner.mjs.map +1 -1
- package/dist/handlers.mjs +5 -1
- package/dist/handlers.mjs.map +1 -1
- package/dist/i18n/messages/en-us.mjs +32 -0
- package/dist/i18n/messages/en-us.mjs.map +1 -1
- package/dist/i18n/messages/es-es.mjs +32 -0
- package/dist/i18n/messages/es-es.mjs.map +1 -1
- package/dist/i18n/messages/pt-br.mjs +32 -0
- package/dist/i18n/messages/pt-br.mjs.map +1 -1
- package/dist/index.mjs +71 -43
- package/dist/index.mjs.map +1 -1
- package/dist/modules/auth/utils/assert-account-not-frozen.mjs.map +1 -1
- package/dist/modules/auth/utils/get-user-context.mjs +2 -1
- package/dist/modules/auth/utils/get-user-context.mjs.map +1 -1
- package/dist/modules/cards/hooks/cards.hook.mjs +3 -2
- package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
- package/dist/modules/ia-credits/constants/ai-credits-offer.constants.mjs +26 -0
- package/dist/modules/ia-credits/constants/ai-credits-offer.constants.mjs.map +1 -0
- package/dist/modules/ia-credits/handlers/get-offer-eligibility.handler.mjs +19 -0
- package/dist/modules/ia-credits/handlers/get-offer-eligibility.handler.mjs.map +1 -0
- package/dist/modules/ia-credits/handlers/purchase-ia-credits.handler.mjs +33 -0
- package/dist/modules/ia-credits/handlers/purchase-ia-credits.handler.mjs.map +1 -0
- package/dist/modules/ia-credits/hooks/purchase-ia-credits.hook.mjs +29 -0
- package/dist/modules/ia-credits/hooks/purchase-ia-credits.hook.mjs.map +1 -0
- package/dist/modules/ia-credits/hooks/use-offer-eligibility.hook.mjs +18 -0
- package/dist/modules/ia-credits/hooks/use-offer-eligibility.hook.mjs.map +1 -0
- package/dist/modules/ia-credits/services/ia-credits.service.mjs +67 -0
- package/dist/modules/ia-credits/services/ia-credits.service.mjs.map +1 -1
- package/dist/modules/ia-credits/types/ai-credits-offer.type.mjs +34 -0
- package/dist/modules/ia-credits/types/ai-credits-offer.type.mjs.map +1 -0
- package/dist/modules/ia-credits/utils/offer-stage-cookie.mjs +41 -0
- package/dist/modules/ia-credits/utils/offer-stage-cookie.mjs.map +1 -0
- package/dist/modules/subscriptions/constants/subscription.constants.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/get-account-freeze-date.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/get-account-freeze-state.mjs.map +1 -1
- package/dist/store/useAiCreditsOfferModal.mjs +14 -0
- package/dist/store/useAiCreditsOfferModal.mjs.map +1 -0
- package/package.json +3 -1
- package/src/components/layouts/AiCreditsOfferGate.tsx +171 -0
- package/src/components/modals/AccountFrozenModal.tsx +26 -37
- package/src/components/modals/promo/AiCreditsOfferModal/AiCreditsOfferModal.tsx +400 -0
- package/src/components/modals/promo/AiCreditsOfferModal/components/LoseOfferDialog.tsx +97 -0
- package/src/components/modals/promo/AiCreditsOfferModal/components/OfferIllustration.tsx +121 -0
- package/src/components/modals/promo/AiCreditsOfferModal/components/OfferPaymentField.tsx +91 -0
- package/src/components/modals/promo/AiCreditsOfferModal/index.ts +1 -0
- package/src/components/navigation/SubscriptionBanner.tsx +0 -8
- package/src/handlers.ts +2 -0
- package/src/i18n/messages/en-us.ts +33 -0
- package/src/i18n/messages/es-es.ts +33 -0
- package/src/i18n/messages/pt-br.ts +33 -0
- package/src/index.ts +25 -0
- package/src/modules/auth/utils/assert-account-not-frozen.ts +0 -9
- package/src/modules/auth/utils/get-user-context.ts +3 -0
- package/src/modules/cards/hooks/cards.hook.ts +6 -1
- package/src/modules/ia-credits/constants/ai-credits-offer.constants.ts +33 -0
- package/src/modules/ia-credits/handlers/get-offer-eligibility.handler.ts +24 -0
- package/src/modules/ia-credits/handlers/purchase-ia-credits.handler.ts +42 -0
- package/src/modules/ia-credits/hooks/purchase-ia-credits.hook.ts +43 -0
- package/src/modules/ia-credits/hooks/use-offer-eligibility.hook.ts +28 -0
- package/src/modules/ia-credits/services/ia-credits.service.ts +92 -0
- package/src/modules/ia-credits/types/ai-credits-offer.type.ts +87 -0
- package/src/modules/ia-credits/utils/offer-stage-cookie.ts +66 -0
- package/src/modules/subscriptions/constants/subscription.constants.ts +0 -5
- package/src/modules/subscriptions/utils/get-account-freeze-date.ts +0 -13
- package/src/modules/subscriptions/utils/get-account-freeze-state.ts +0 -7
- package/src/store/useAiCreditsOfferModal.ts +24 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/modals/promo/AiCreditsOfferModal/components/LoseOfferDialog.tsx"],"sourcesContent":["'use client';\n\nimport { useTranslations } from 'next-intl';\nimport { Button } from '../../../../ui/buttons/Button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '../../../../ui/overlay/Dialog';\nimport { Separator } from '../../../../ui/data-display/Separator';\nimport { IconAlertTriangle } from '@tabler/icons-react';\n\ninterface LoseOfferDialogProps {\n open: boolean;\n /** Selo do desconto (\"50% OFF\") — repetido aqui porque é ele que dói. */\n discountLabel: string;\n /** Pacote ofertado, já formatado (\"1.000\"). */\n creditsLabel: string;\n /** Preço cheio formatado: o número que volta a valer. Vazio enquanto a âncora carrega. */\n fullPriceLabel: string;\n /** Volta pra oferta (fecha só esta confirmação). */\n onKeep: () => void;\n /** Abre mão da oferta e fecha tudo. */\n onLose: () => void;\n}\n\n/**\n * Confirmação de saída (\"quer mesmo perder essa oferta?\").\n *\n * É um Dialog SEPARADO, empilhado por cima da oferta com os mesmos z-index do\n * `InsufficientIaCreditsModal` (overlay 1002 / conteúdo 1003) — assim a oferta continua **visível\n * atrás do véu**: a pessoa decide olhando exatamente para o que está prestes a perder, que é o\n * ponto inteiro desta tela.\n *\n * O principal é VOLTAR para a oferta; perder fica como secundário, a um clique de distância. A\n * saída não está escondida — o peso da decisão está na frase, não no botão.\n */\nexport function LoseOfferDialog({\n open,\n discountLabel,\n creditsLabel,\n fullPriceLabel,\n onKeep,\n onLose,\n}: LoseOfferDialogProps) {\n const translate = useTranslations();\n\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onKeep()}>\n <DialogContent\n showCloseButton={false}\n onOpenAutoFocus={(event) => event.preventDefault()}\n overlayClassName=\"z-[1002] bg-black/40\"\n className=\"z-[1003] flex flex-col gap-0 p-0 max-[440px]:w-[calc(100%-32px)] md:w-[420px]! lg:w-[420px]! max-w-[420px]! data-[state=open]:animate-[gp-offer-confirm-in_260ms_cubic-bezier(0.16,1,0.3,1)]\"\n >\n <DialogHeader className=\"gap-3 p-5 text-left\">\n <div className=\"flex w-fit items-center justify-center rounded-lg bg-red-50 p-2.5\">\n <IconAlertTriangle size={20} className=\"text-red-500\" />\n </div>\n <div className=\"flex flex-col gap-2\">\n <DialogTitle className=\"paragraph-medium-semibold text-zinc-950\">\n {translate('common.promo.aiCreditsOffer.exit.title', { discount: discountLabel })}\n </DialogTitle>\n <DialogDescription className=\"paragraph-small-regular text-zinc-600\">\n {/* Sem preço resolvido (elegibilidade ainda carregando) a frase cai na versão sem\n número — prometer \"volta a custar\" sem dizer quanto é pior do que não dizer. */}\n {fullPriceLabel\n ? translate('common.promo.aiCreditsOffer.exit.description', {\n credits: creditsLabel,\n price: fullPriceLabel,\n })\n : translate('common.promo.aiCreditsOffer.exit.descriptionNoPrice', {\n credits: creditsLabel,\n })}\n </DialogDescription>\n </div>\n </DialogHeader>\n\n <Separator />\n\n {/* Rodapé com os dois botões juntos à esquerda (`gap-2`, sem `justify-between`), o\n principal primeiro. Ficar é o caminho principal; perder a oferta continua a um clique,\n mas como ação secundária. */}\n <div className=\"flex items-center gap-2 p-5\">\n <Button className=\"h-10! transition-colors\" onClick={onKeep}>\n {translate('common.promo.aiCreditsOffer.exit.keep')}\n </Button>\n <Button variant=\"secondary\" className=\"h-10! transition-colors\" onClick={onLose}>\n {translate('common.promo.aiCreditsOffer.exit.lose')}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";AA2DY,cAEF,YAFE;AAzDZ,SAAS,uBAAuB;AAChC,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB;AA2B3B,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,YAAY,gBAAgB;AAElC,SACE,oBAAC,UAAO,MAAY,cAAc,CAAC,SAAS,CAAC,QAAQ,OAAO,GAC1D;AAAA,IAAC;AAAA;AAAA,MACC,iBAAiB;AAAA,MACjB,iBAAiB,CAAC,UAAU,MAAM,eAAe;AAAA,MACjD,kBAAiB;AAAA,MACjB,WAAU;AAAA,MAEV;AAAA,6BAAC,gBAAa,WAAU,uBACtB;AAAA,8BAAC,SAAI,WAAU,qEACb,8BAAC,qBAAkB,MAAM,IAAI,WAAU,gBAAe,GACxD;AAAA,UACA,qBAAC,SAAI,WAAU,uBACb;AAAA,gCAAC,eAAY,WAAU,2CACpB,oBAAU,0CAA0C,EAAE,UAAU,cAAc,CAAC,GAClF;AAAA,YACA,oBAAC,qBAAkB,WAAU,yCAG1B,2BACG,UAAU,gDAAgD;AAAA,cACxD,SAAS;AAAA,cACT,OAAO;AAAA,YACT,CAAC,IACD,UAAU,uDAAuD;AAAA,cAC/D,SAAS;AAAA,YACX,CAAC,GACP;AAAA,aACF;AAAA,WACF;AAAA,QAEA,oBAAC,aAAU;AAAA,QAKX,qBAAC,SAAI,WAAU,+BACb;AAAA,8BAAC,UAAO,WAAU,2BAA0B,SAAS,QAClD,oBAAU,uCAAuC,GACpD;AAAA,UACA,oBAAC,UAAO,SAAQ,aAAY,WAAU,2BAA0B,SAAS,QACtE,oBAAU,uCAAuC,GACpD;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import Image from "next/image";
|
|
5
|
+
import { useTranslations } from "next-intl";
|
|
6
|
+
const COUNT_DELAY_MS = 620;
|
|
7
|
+
const COUNT_DURATION_MS = 1150;
|
|
8
|
+
function easeOutCubic(t) {
|
|
9
|
+
return 1 - (1 - t) ** 3;
|
|
10
|
+
}
|
|
11
|
+
function OfferIllustration({ credits, locale }) {
|
|
12
|
+
const translate = useTranslations();
|
|
13
|
+
const [displayCredits, setDisplayCredits] = useState(0);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (typeof window === "undefined") return;
|
|
16
|
+
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
|
|
17
|
+
setDisplayCredits(credits);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
let frameId;
|
|
21
|
+
const startedAt = performance.now() + COUNT_DELAY_MS;
|
|
22
|
+
const tick = (now) => {
|
|
23
|
+
const elapsed = now - startedAt;
|
|
24
|
+
if (elapsed < 0) {
|
|
25
|
+
frameId = requestAnimationFrame(tick);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const progress = Math.min(1, elapsed / COUNT_DURATION_MS);
|
|
29
|
+
setDisplayCredits(Math.round(credits * easeOutCubic(progress)));
|
|
30
|
+
if (progress < 1) frameId = requestAnimationFrame(tick);
|
|
31
|
+
};
|
|
32
|
+
frameId = requestAnimationFrame(tick);
|
|
33
|
+
return () => cancelAnimationFrame(frameId);
|
|
34
|
+
}, [credits]);
|
|
35
|
+
return /* @__PURE__ */ jsxs("div", { className: "relative h-full w-full overflow-hidden", children: [
|
|
36
|
+
/* @__PURE__ */ jsx(
|
|
37
|
+
Image,
|
|
38
|
+
{
|
|
39
|
+
src: "/promo/offer-panel-background.svg",
|
|
40
|
+
alt: "",
|
|
41
|
+
fill: true,
|
|
42
|
+
priority: true,
|
|
43
|
+
draggable: false,
|
|
44
|
+
className: "object-cover select-none"
|
|
45
|
+
}
|
|
46
|
+
),
|
|
47
|
+
/* @__PURE__ */ jsx(
|
|
48
|
+
"div",
|
|
49
|
+
{
|
|
50
|
+
"aria-hidden": true,
|
|
51
|
+
className: "gp-offer-window-in absolute top-[calc(50%-27px)] left-[calc(50%+98px)] aspect-[557.57/388.22] w-[132%] -translate-x-1/2 -translate-y-1/2 md:w-[124.2%]",
|
|
52
|
+
children: /* @__PURE__ */ jsx(
|
|
53
|
+
Image,
|
|
54
|
+
{
|
|
55
|
+
src: "/promo/offer-editor-window.svg",
|
|
56
|
+
alt: "",
|
|
57
|
+
fill: true,
|
|
58
|
+
sizes: "560px",
|
|
59
|
+
priority: true,
|
|
60
|
+
draggable: false,
|
|
61
|
+
className: "select-none"
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
),
|
|
66
|
+
/* @__PURE__ */ jsxs("div", { className: "gp-offer-card-in absolute top-[calc(50%+146px)] left-[49.7%] hidden h-[66px] w-[193.5px] items-center gap-[11.5px] rounded-[15px] border border-[#8BE4FF]/38 bg-white pl-[11.5px] shadow-[0px_4px_25px_0px_rgba(26,26,26,0.03)] md:flex", children: [
|
|
67
|
+
/* @__PURE__ */ jsx("span", { className: "gp-offer-icon-pulse flex size-[43.5px] shrink-0 items-center justify-center rounded-[9px] bg-cyan-50", children: /* @__PURE__ */ jsx("img", { src: "/iaicon.svg", alt: "", width: 24, height: 24, className: "block" }) }),
|
|
68
|
+
/* @__PURE__ */ jsxs("span", { className: "flex items-baseline gap-1 whitespace-nowrap", children: [
|
|
69
|
+
/* @__PURE__ */ jsx("span", { className: "title-large-semibold text-[25px] leading-[29px] tabular-nums text-zinc-950", children: displayCredits.toLocaleString(locale) }),
|
|
70
|
+
/* @__PURE__ */ jsx("span", { className: "paragraph-small-medium text-[14.5px] text-zinc-500", children: translate("common.promo.aiCreditsOffer.illustration.credits") })
|
|
71
|
+
] })
|
|
72
|
+
] })
|
|
73
|
+
] });
|
|
74
|
+
}
|
|
75
|
+
export {
|
|
76
|
+
OfferIllustration
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=OfferIllustration.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/modals/promo/AiCreditsOfferModal/components/OfferIllustration.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\nimport Image from 'next/image';\nimport { useTranslations } from 'next-intl';\n\n/**\n * Painel direito da oferta — implementação do design do Figma (`Testes-UI`, nodes `2569:2938` e\n * `2569:4015`), conferida contra o SVG exportado do bloco inteiro.\n *\n * A geometria vem do arquivo, desenhado num painel de **449×606** — praticamente o tamanho real\n * desta coluna (metade de um modal de 900). Por isso os offsets são os px do próprio design,\n * ancorados ao CENTRO do painel: a janela tem altura derivada da largura, então âncora percentual\n * desmontaria a composição quando o modal mudasse de altura; a partir do centro, a distância entre\n * as peças se mantém.\n *\n * O fundo e a janela são os VETORES do arquivo (`offer-panel-background.svg` e\n * `offer-editor-window.svg`, em `public/promo/` do app consumidor — a lib não publica assets\n * estáticos), fatiados do SVG do bloco; o cartão é DOM, pra o contador animar.\n *\n * Animações em CSS puro (classes `gp-offer-*`, ver o bloco no topo do `AiCreditsOfferModal.tsx`) —\n * respeitam `prefers-reduced-motion` por conta própria, sem depender de JS. Só o CONTADOR do\n * cartão é JS (`requestAnimationFrame`): não dá pra fazer \"500\" nascer de \"0\" em CSS puro.\n */\n\nconst COUNT_DELAY_MS = 620;\nconst COUNT_DURATION_MS = 1150;\n\nfunction easeOutCubic(t: number): number {\n return 1 - (1 - t) ** 3;\n}\n\ninterface OfferIllustrationProps {\n /** Pacote ofertado — é ele que o contador persegue. */\n credits: number;\n /** Locale de formatação do número (vem do locale da UI). */\n locale: string;\n}\n\nexport function OfferIllustration({ credits, locale }: OfferIllustrationProps) {\n const translate = useTranslations();\n const [displayCredits, setDisplayCredits] = useState(0);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n setDisplayCredits(credits);\n return;\n }\n\n let frameId: number;\n const startedAt = performance.now() + COUNT_DELAY_MS;\n\n const tick = (now: number) => {\n const elapsed = now - startedAt;\n if (elapsed < 0) {\n frameId = requestAnimationFrame(tick);\n return;\n }\n const progress = Math.min(1, elapsed / COUNT_DURATION_MS);\n setDisplayCredits(Math.round(credits * easeOutCubic(progress)));\n if (progress < 1) frameId = requestAnimationFrame(tick);\n };\n\n frameId = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(frameId);\n }, [credits]);\n\n return (\n <div className=\"relative h-full w-full overflow-hidden\">\n {/* Fundo: o próprio vetor do arquivo (gradiente + o brilho difuso da quina), extraído do SVG\n do bloco. Vem como imagem, e não como gradiente CSS + `blur`, pra não haver interpretação\n no meio: a cor e o desfoque são os do design, byte a byte. 4,7KB. */}\n <Image\n src=\"/promo/offer-panel-background.svg\"\n alt=\"\"\n fill\n priority\n draggable={false}\n className=\"object-cover select-none\"\n />\n\n {/* Janela do editor — o vetor exportado do próprio arquivo (chrome, moldura branca, sombra e\n o print do canvas embutido). `gp-offer-window-in` anima `translate`/`scale` (propriedades\n CSS independentes do `transform`), então convive sem conflito com o\n `-translate-x-1/2 -translate-y-1/2` do Tailwind que centraliza o elemento. */}\n <div\n aria-hidden\n className=\"gp-offer-window-in absolute top-[calc(50%-27px)] left-[calc(50%+98px)] aspect-[557.57/388.22] w-[132%] -translate-x-1/2 -translate-y-1/2 md:w-[124.2%]\"\n >\n <Image\n src=\"/promo/offer-editor-window.svg\"\n alt=\"\"\n fill\n sizes=\"560px\"\n priority\n draggable={false}\n className=\"select-none\"\n />\n </div>\n\n {/* Cartão de créditos (node 2569:4015), solto abaixo da janela, com a folga de gradiente que\n o arquivo tem. Só no desktop: no mobile a faixa é baixa e ele brigaria com a janela. */}\n <div className=\"gp-offer-card-in absolute top-[calc(50%+146px)] left-[49.7%] hidden h-[66px] w-[193.5px] items-center gap-[11.5px] rounded-[15px] border border-[#8BE4FF]/38 bg-white pl-[11.5px] shadow-[0px_4px_25px_0px_rgba(26,26,26,0.03)] md:flex\">\n <span className=\"gp-offer-icon-pulse flex size-[43.5px] shrink-0 items-center justify-center rounded-[9px] bg-cyan-50\">\n {/* eslint-disable-next-line @next/next/no-img-element -- ícone de 39KB, pesado demais pra inlinear no componente da lib. */}\n <img src=\"/iaicon.svg\" alt=\"\" width={24} height={24} className=\"block\" />\n </span>\n <span className=\"flex items-baseline gap-1 whitespace-nowrap\">\n <span className=\"title-large-semibold text-[25px] leading-[29px] tabular-nums text-zinc-950\">\n {displayCredits.toLocaleString(locale)}\n </span>\n <span className=\"paragraph-small-medium text-[14.5px] text-zinc-500\">\n {translate('common.promo.aiCreditsOffer.illustration.credits')}\n </span>\n </span>\n </div>\n </div>\n );\n}\n"],"mappings":";AA0EM,cAmCE,YAnCF;AAxEN,SAAS,WAAW,gBAAgB;AACpC,OAAO,WAAW;AAClB,SAAS,uBAAuB;AAqBhC,MAAM,iBAAiB;AACvB,MAAM,oBAAoB;AAE1B,SAAS,aAAa,GAAmB;AACvC,SAAO,KAAK,IAAI,MAAM;AACxB;AASO,SAAS,kBAAkB,EAAE,SAAS,OAAO,GAA2B;AAC7E,QAAM,YAAY,gBAAgB;AAClC,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,CAAC;AAEtD,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,YAAa;AAEnC,QAAI,OAAO,WAAW,kCAAkC,EAAE,SAAS;AACjE,wBAAkB,OAAO;AACzB;AAAA,IACF;AAEA,QAAI;AACJ,UAAM,YAAY,YAAY,IAAI,IAAI;AAEtC,UAAM,OAAO,CAAC,QAAgB;AAC5B,YAAM,UAAU,MAAM;AACtB,UAAI,UAAU,GAAG;AACf,kBAAU,sBAAsB,IAAI;AACpC;AAAA,MACF;AACA,YAAM,WAAW,KAAK,IAAI,GAAG,UAAU,iBAAiB;AACxD,wBAAkB,KAAK,MAAM,UAAU,aAAa,QAAQ,CAAC,CAAC;AAC9D,UAAI,WAAW,EAAG,WAAU,sBAAsB,IAAI;AAAA,IACxD;AAEA,cAAU,sBAAsB,IAAI;AACpC,WAAO,MAAM,qBAAqB,OAAO;AAAA,EAC3C,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE,qBAAC,SAAI,WAAU,0CAIb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAI;AAAA,QACJ,KAAI;AAAA,QACJ,MAAI;AAAA,QACJ,UAAQ;AAAA,QACR,WAAW;AAAA,QACX,WAAU;AAAA;AAAA,IACZ;AAAA,IAMA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW;AAAA,QACX,WAAU;AAAA,QAEV;AAAA,UAAC;AAAA;AAAA,YACC,KAAI;AAAA,YACJ,KAAI;AAAA,YACJ,MAAI;AAAA,YACJ,OAAM;AAAA,YACN,UAAQ;AAAA,YACR,WAAW;AAAA,YACX,WAAU;AAAA;AAAA,QACZ;AAAA;AAAA,IACF;AAAA,IAIA,qBAAC,SAAI,WAAU,2OACb;AAAA,0BAAC,UAAK,WAAU,wGAEd,8BAAC,SAAI,KAAI,eAAc,KAAI,IAAG,OAAO,IAAI,QAAQ,IAAI,WAAU,SAAQ,GACzE;AAAA,MACA,qBAAC,UAAK,WAAU,+CACd;AAAA,4BAAC,UAAK,WAAU,8EACb,yBAAe,eAAe,MAAM,GACvC;AAAA,QACA,oBAAC,UAAK,WAAU,sDACb,oBAAU,kDAAkD,GAC/D;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useTranslations } from "next-intl";
|
|
4
|
+
import { CardBrandIcon } from "../../../../ui/data-display/CardBrandIcons";
|
|
5
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from "../../../../ui/overlay/Tooltip";
|
|
6
|
+
import { useCards } from "../../../../../modules/cards/hooks/cards.hook";
|
|
7
|
+
import { useModalManager } from "../../../../../store/useModalManager";
|
|
8
|
+
import { IconPencil, IconPlus } from "@tabler/icons-react";
|
|
9
|
+
function OfferPaymentField({ cardId, onCardAdded }) {
|
|
10
|
+
const translate = useTranslations();
|
|
11
|
+
const { openModal } = useModalManager();
|
|
12
|
+
const { data: cardsData } = useCards();
|
|
13
|
+
const card = cardsData?.data?.find((item) => item.id.toString() === cardId.toString());
|
|
14
|
+
const handleOpenCardModal = () => {
|
|
15
|
+
openModal("addCardModal", { onCardAdded });
|
|
16
|
+
};
|
|
17
|
+
return /* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-lg border border-zinc-200", children: /* @__PURE__ */ jsxs("div", { className: "flex h-[60px] items-center gap-3 px-4", children: [
|
|
18
|
+
/* @__PURE__ */ jsx("span", { className: "paragraph-small-medium w-[100px] text-zinc-500", children: translate("common.cards.paymentInfo.payment") }),
|
|
19
|
+
card ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
20
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
|
|
21
|
+
/* @__PURE__ */ jsx("span", { className: "paragraph-small-semibold truncate text-zinc-950", children: card.name }),
|
|
22
|
+
/* @__PURE__ */ jsxs("span", { className: "paragraph-small-medium text-zinc-950", children: [
|
|
23
|
+
"\u2022\u2022\u2022\u2022 ",
|
|
24
|
+
card.number?.replaceAll(/\D/g, "")?.slice(-4)
|
|
25
|
+
] })
|
|
26
|
+
] }),
|
|
27
|
+
/* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [
|
|
28
|
+
/* @__PURE__ */ jsx(CardBrandIcon, { brand: card.brand }),
|
|
29
|
+
/* @__PURE__ */ jsxs(Tooltip, { children: [
|
|
30
|
+
/* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
|
|
31
|
+
"button",
|
|
32
|
+
{
|
|
33
|
+
type: "button",
|
|
34
|
+
onClick: handleOpenCardModal,
|
|
35
|
+
"aria-label": translate("common.promo.aiCreditsOffer.editPayment"),
|
|
36
|
+
className: "flex size-8 cursor-pointer items-center justify-center rounded-lg text-zinc-400 transition-colors hover:bg-zinc-100 hover:text-zinc-950",
|
|
37
|
+
children: /* @__PURE__ */ jsx(IconPencil, { size: 18 })
|
|
38
|
+
}
|
|
39
|
+
) }),
|
|
40
|
+
/* @__PURE__ */ jsx(TooltipContent, { side: "top", sideOffset: 6, className: "z-[1002]", children: translate("common.promo.aiCreditsOffer.editPayment") })
|
|
41
|
+
] })
|
|
42
|
+
] })
|
|
43
|
+
] }) : /* @__PURE__ */ jsxs(
|
|
44
|
+
"button",
|
|
45
|
+
{
|
|
46
|
+
type: "button",
|
|
47
|
+
onClick: handleOpenCardModal,
|
|
48
|
+
className: "paragraph-small-semibold flex h-8 w-fit cursor-pointer items-center rounded-md border border-zinc-200 px-2 text-zinc-950 transition-colors hover:border-zinc-400",
|
|
49
|
+
children: [
|
|
50
|
+
/* @__PURE__ */ jsx(IconPlus, { className: "size-[18px]" }),
|
|
51
|
+
/* @__PURE__ */ jsx("span", { className: "px-1.5", children: translate("common.cards.paymentInfo.addCard") })
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
] }) });
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
OfferPaymentField
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=OfferPaymentField.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/modals/promo/AiCreditsOfferModal/components/OfferPaymentField.tsx"],"sourcesContent":["'use client';\n\nimport { useTranslations } from 'next-intl';\nimport { CardBrandIcon } from '../../../../ui/data-display/CardBrandIcons';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../../../../ui/overlay/Tooltip';\nimport { useCards } from '../../../../../modules/cards/hooks/cards.hook';\nimport { useModalManager } from '../../../../../store/useModalManager';\nimport { IconPencil, IconPlus } from '@tabler/icons-react';\n\ninterface OfferPaymentFieldProps {\n /** Cartão em uso (padrão da conta ou o que acabou de ser cadastrado). */\n cardId: string;\n /** Recebe o id do cartão cadastrado no `addCardModal`. */\n onCardAdded: (cardId: string) => void;\n}\n\n/**\n * Campo de pagamento da oferta — versão de **um cartão só**.\n *\n * Nasceu do `PaymentInfoCard` (mesma moldura, mesma linha \"Pagamento\", mesmo `CardBrandIcon`,\n * mesmas chaves de tradução `common.cards.*`), mas sem o seletor e sem o \"Nova forma de\n * pagamento\": aqui a pessoa está numa compra única de primeira vez, então ou ela ainda não tem\n * cartão (e o campo é só o botão de cadastrar) ou já tem (e o campo é só o cartão). Oferecer uma\n * lista de cartões numa tela cujo objetivo é UM clique era ruído.\n *\n * Com cartão, o lápis fica sempre visível e abre o `addCardModal` — o mesmo fluxo padrão da\n * plataforma, que é por onde se troca a forma de pagamento (não existe edição de cartão: o\n * gateway guarda o dado, então \"editar\" é cadastrar outro). Nada de formulário próprio.\n */\nexport function OfferPaymentField({ cardId, onCardAdded }: OfferPaymentFieldProps) {\n const translate = useTranslations();\n const { openModal } = useModalManager();\n const { data: cardsData } = useCards();\n\n const card = cardsData?.data?.find((item) => item.id.toString() === cardId.toString());\n\n const handleOpenCardModal = () => {\n openModal('addCardModal', { onCardAdded });\n };\n\n return (\n <div className=\"overflow-hidden rounded-lg border border-zinc-200\">\n <div className=\"flex h-[60px] items-center gap-3 px-4\">\n <span className=\"paragraph-small-medium w-[100px] text-zinc-500\">\n {translate('common.cards.paymentInfo.payment')}\n </span>\n\n {card ? (\n <>\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"paragraph-small-semibold truncate text-zinc-950\">{card.name}</span>\n <span className=\"paragraph-small-medium text-zinc-950\">\n •••• {card.number?.replaceAll(/\\D/g, '')?.slice(-4)}\n </span>\n </div>\n\n <div className=\"flex shrink-0 items-center gap-2\">\n <CardBrandIcon brand={card.brand} />\n {/* `z-[1002]`: o tooltip nasce num portal e precisa passar por cima do\n `DialogContent` (z-1001), senão fica escondido atrás do modal. */}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={handleOpenCardModal}\n aria-label={translate('common.promo.aiCreditsOffer.editPayment')}\n className=\"flex size-8 cursor-pointer items-center justify-center rounded-lg text-zinc-400 transition-colors hover:bg-zinc-100 hover:text-zinc-950\"\n >\n <IconPencil size={18} />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" sideOffset={6} className=\"z-[1002]\">\n {translate('common.promo.aiCreditsOffer.editPayment')}\n </TooltipContent>\n </Tooltip>\n </div>\n </>\n ) : (\n <button\n type=\"button\"\n onClick={handleOpenCardModal}\n className=\"paragraph-small-semibold flex h-8 w-fit cursor-pointer items-center rounded-md border border-zinc-200 px-2 text-zinc-950 transition-colors hover:border-zinc-400\"\n >\n <IconPlus className=\"size-[18px]\" />\n <span className=\"px-1.5\">{translate('common.cards.paymentInfo.addCard')}</span>\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";AA2CQ,SAKE,UALF,KAQM,YARN;AAzCR,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,SAAS,gBAAgB,sBAAsB;AACxD,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,YAAY,gBAAgB;AAsB9B,SAAS,kBAAkB,EAAE,QAAQ,YAAY,GAA2B;AACjF,QAAM,YAAY,gBAAgB;AAClC,QAAM,EAAE,UAAU,IAAI,gBAAgB;AACtC,QAAM,EAAE,MAAM,UAAU,IAAI,SAAS;AAErC,QAAM,OAAO,WAAW,MAAM,KAAK,CAAC,SAAS,KAAK,GAAG,SAAS,MAAM,OAAO,SAAS,CAAC;AAErF,QAAM,sBAAsB,MAAM;AAChC,cAAU,gBAAgB,EAAE,YAAY,CAAC;AAAA,EAC3C;AAEA,SACE,oBAAC,SAAI,WAAU,qDACb,+BAAC,SAAI,WAAU,yCACb;AAAA,wBAAC,UAAK,WAAU,kDACb,oBAAU,kCAAkC,GAC/C;AAAA,IAEC,OACC,iCACE;AAAA,2BAAC,SAAI,WAAU,wCACb;AAAA,4BAAC,UAAK,WAAU,mDAAmD,eAAK,MAAK;AAAA,QAC7E,qBAAC,UAAK,WAAU,wCAAuC;AAAA;AAAA,UAC/C,KAAK,QAAQ,WAAW,OAAO,EAAE,GAAG,MAAM,EAAE;AAAA,WACpD;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,WAAU,oCACb;AAAA,4BAAC,iBAAc,OAAO,KAAK,OAAO;AAAA,QAGlC,qBAAC,WACC;AAAA,8BAAC,kBAAe,SAAO,MACrB;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,cAAY,UAAU,yCAAyC;AAAA,cAC/D,WAAU;AAAA,cAEV,8BAAC,cAAW,MAAM,IAAI;AAAA;AAAA,UACxB,GACF;AAAA,UACA,oBAAC,kBAAe,MAAK,OAAM,YAAY,GAAG,WAAU,YACjD,oBAAU,yCAAyC,GACtD;AAAA,WACF;AAAA,SACF;AAAA,OACF,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAU;AAAA,QAEV;AAAA,8BAAC,YAAS,WAAU,eAAc;AAAA,UAClC,oBAAC,UAAK,WAAU,UAAU,oBAAU,kCAAkC,GAAE;AAAA;AAAA;AAAA,IAC1E;AAAA,KAEJ,GACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/components/modals/promo/AiCreditsOfferModal/index.ts"],"sourcesContent":["export { default } from './AiCreditsOfferModal';\n"],"mappings":"AAAA,SAAS,WAAAA,gBAAe;","names":["default"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/navigation/SubscriptionBanner.tsx"],"sourcesContent":["\"use client\";\n\nimport { useActiveSubscription } from \"../../modules/subscriptions/hooks/find-active-subscription.hook\";\nimport { useCharges } from \"../../modules/charges/hooks/charges.hook\";\nimport { SUBSCRIPTION_GRACE_PERIOD_DAYS, MAX_PAYMENT_ATTEMPTS } from \"../../modules/subscriptions/constants/subscription.constants\";\nimport { getSubscriptionExpiryDate } from \"../../modules/subscriptions/utils/get-subscription-expiry-date\";\nimport { getSubscriptionCancellationState } from \"../../modules/subscriptions/utils/get-subscription-cancellation-state\";\nimport { getAccountFreezeState } from \"../../modules/subscriptions/utils/get-account-freeze-state\";\nimport { getAccountFreezeDate } from \"../../modules/subscriptions/utils/get-account-freeze-date\";\nimport { toCalendarDate, daysBetween } from \"../../infra/utils/date\";\nimport { OverdueInvoiceBanner } from \"./OverdueInvoiceBanner\";\nimport { UpcomingInvoiceBanner } from \"./UpcomingInvoiceBanner\";\nimport { CancelledSubscriptionBanner } from \"./CancelledSubscriptionBanner\";\nimport { PendingCancellationBanner } from \"./PendingCancellationBanner\";\nimport { TrialBanner } from \"./TrialBanner\";\nimport { FrozenAccountBanner } from \"./FrozenAccountBanner\";\nimport { FreezeWarningBanner } from \"./FreezeWarningBanner\";\nimport { useModalManager } from \"../../store/useModalManager\";\n\nconst UPCOMING_WINDOW_DAYS = 7;\nconst PAYMENT_METHOD_BOLETO = 2;\n\ninterface SubscriptionBannerProps {\n onReactivate?: () => void;\n onDetails?: () => void;\n}\n\nexport function SubscriptionBanner({\n onReactivate,\n onDetails,\n}: SubscriptionBannerProps) {\n const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();\n const { openModal } = useModalManager();\n const { data: pendingChargesData, isLoading: isLoadingCharges } = useCharges({\n page: 1,\n limit: 1,\n status: [0],\n });\n\n if (!subscription?.date_due) return null;\n if (subscription.type === \"free\") return null;\n\n const dueDate = toCalendarDate(subscription.date_due);\n const today = toCalendarDate(new Date());\n if (!dueDate || !today) return null;\n\n const daysSinceDue = daysBetween(dueDate, today);\n const daysToDue = daysBetween(today, dueDate);\n const hasPendingCharge = !!pendingChargesData?.data?.[0];\n const isBoleto = subscription.payment_method === PAYMENT_METHOD_BOLETO;\n\n // Estado de cancelamento (fonte da verdade única, compartilhada com o\n // CancelledSubscriptionBanner). `active === false` tem prioridade e cai em\n // \"cancelled\" mesmo com date_due no futuro — é o caso da baixa por falha de\n // pagamento, onde date_due aponta pra uma fatura não paga.\n const expiryDate = getSubscriptionExpiryDate(subscription);\n const cancellationState = getSubscriptionCancellationState(subscription);\n\n // Trial: `date_due` guarda o fim do período de teste (ver auth.service).\n // Mostra a contagem regressiva enquanto o teste está vigente: `active` e não\n // vencido (`daysToDue >= 0`). NÃO usar `cancellationState` aqui — num trial o\n // `date_cancellation` é o agendamento padrão de não-renovação (o Stripe seta\n // = `date_due`), então cairia sempre em \"pending\" e o banner nunca apareceria.\n // Um trial encerrado de verdade vem com `active === false` (date_due placeholder).\n if (subscription.type === \"trial\") {\n if (!subscription.active || daysToDue < 0) return null;\n return <TrialBanner daysRemaining={daysToDue} onReactivate={onReactivate} />;\n }\n\n if (cancellationState === \"cancelled\") {\n return <CancelledSubscriptionBanner onReactivate={onReactivate} />;\n }\n\n if (cancellationState === \"pending\") {\n return (\n <PendingCancellationBanner\n limitDate={expiryDate}\n onReactivate={onReactivate}\n />\n );\n }\n\n if (subscription.type === \"whitelabel\") return null;\n\n
|
|
1
|
+
{"version":3,"sources":["../../../src/components/navigation/SubscriptionBanner.tsx"],"sourcesContent":["\"use client\";\n\nimport { useActiveSubscription } from \"../../modules/subscriptions/hooks/find-active-subscription.hook\";\nimport { useCharges } from \"../../modules/charges/hooks/charges.hook\";\nimport { SUBSCRIPTION_GRACE_PERIOD_DAYS, MAX_PAYMENT_ATTEMPTS } from \"../../modules/subscriptions/constants/subscription.constants\";\nimport { getSubscriptionExpiryDate } from \"../../modules/subscriptions/utils/get-subscription-expiry-date\";\nimport { getSubscriptionCancellationState } from \"../../modules/subscriptions/utils/get-subscription-cancellation-state\";\nimport { getAccountFreezeState } from \"../../modules/subscriptions/utils/get-account-freeze-state\";\nimport { getAccountFreezeDate } from \"../../modules/subscriptions/utils/get-account-freeze-date\";\nimport { toCalendarDate, daysBetween } from \"../../infra/utils/date\";\nimport { OverdueInvoiceBanner } from \"./OverdueInvoiceBanner\";\nimport { UpcomingInvoiceBanner } from \"./UpcomingInvoiceBanner\";\nimport { CancelledSubscriptionBanner } from \"./CancelledSubscriptionBanner\";\nimport { PendingCancellationBanner } from \"./PendingCancellationBanner\";\nimport { TrialBanner } from \"./TrialBanner\";\nimport { FrozenAccountBanner } from \"./FrozenAccountBanner\";\nimport { FreezeWarningBanner } from \"./FreezeWarningBanner\";\nimport { useModalManager } from \"../../store/useModalManager\";\n\nconst UPCOMING_WINDOW_DAYS = 7;\nconst PAYMENT_METHOD_BOLETO = 2;\n\ninterface SubscriptionBannerProps {\n onReactivate?: () => void;\n onDetails?: () => void;\n}\n\nexport function SubscriptionBanner({\n onReactivate,\n onDetails,\n}: SubscriptionBannerProps) {\n const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();\n const { openModal } = useModalManager();\n const { data: pendingChargesData, isLoading: isLoadingCharges } = useCharges({\n page: 1,\n limit: 1,\n status: [0],\n });\n\n if (!subscription?.date_due) return null;\n if (subscription.type === \"free\") return null;\n\n const dueDate = toCalendarDate(subscription.date_due);\n const today = toCalendarDate(new Date());\n if (!dueDate || !today) return null;\n\n const daysSinceDue = daysBetween(dueDate, today);\n const daysToDue = daysBetween(today, dueDate);\n const hasPendingCharge = !!pendingChargesData?.data?.[0];\n const isBoleto = subscription.payment_method === PAYMENT_METHOD_BOLETO;\n\n // Estado de cancelamento (fonte da verdade única, compartilhada com o\n // CancelledSubscriptionBanner). `active === false` tem prioridade e cai em\n // \"cancelled\" mesmo com date_due no futuro — é o caso da baixa por falha de\n // pagamento, onde date_due aponta pra uma fatura não paga.\n const expiryDate = getSubscriptionExpiryDate(subscription);\n const cancellationState = getSubscriptionCancellationState(subscription);\n\n // Trial: `date_due` guarda o fim do período de teste (ver auth.service).\n // Mostra a contagem regressiva enquanto o teste está vigente: `active` e não\n // vencido (`daysToDue >= 0`). NÃO usar `cancellationState` aqui — num trial o\n // `date_cancellation` é o agendamento padrão de não-renovação (o Stripe seta\n // = `date_due`), então cairia sempre em \"pending\" e o banner nunca apareceria.\n // Um trial encerrado de verdade vem com `active === false` (date_due placeholder).\n if (subscription.type === \"trial\") {\n if (!subscription.active || daysToDue < 0) return null;\n return <TrialBanner daysRemaining={daysToDue} onReactivate={onReactivate} />;\n }\n\n if (cancellationState === \"cancelled\") {\n return <CancelledSubscriptionBanner onReactivate={onReactivate} />;\n }\n\n if (cancellationState === \"pending\") {\n return (\n <PendingCancellationBanner\n limitDate={expiryDate}\n onReactivate={onReactivate}\n />\n );\n }\n\n if (subscription.type === \"whitelabel\") return null;\n\n const freezeState = getAccountFreezeState(subscription);\n if (freezeState === \"frozen\") {\n return (\n <FrozenAccountBanner onDetails={() => openModal(\"accountFrozenModal\", { showResources: true })} />\n );\n }\n if (freezeState === \"warning\") {\n const freezeDate = getAccountFreezeDate(subscription);\n return (\n <FreezeWarningBanner\n freezeDate={freezeDate}\n onDetails={() => openModal(\"accountFrozenModal\", { freezeDate, showResources: true })}\n />\n );\n }\n\n // Cartão em dunning (Stripe Smart Retries): comunica as tentativas de cobrança\n // restantes antes do cancelamento automático — não mais por tolerância fixa de\n // dias. attempt_count vive no invoice (payment_retry); só cartão tem retries.\n const paymentRetry = subscription.payment_retry ?? null;\n if (\n paymentRetry &&\n paymentRetry.invoice_status === \"open\" &&\n paymentRetry.attempt_count > 0\n ) {\n const remainingAttempts = Math.max(\n 0,\n MAX_PAYMENT_ATTEMPTS - paymentRetry.attempt_count,\n );\n return (\n <OverdueInvoiceBanner\n onDetails={onDetails}\n remainingAttempts={remainingAttempts}\n />\n );\n }\n\n // Boleto/pix (sem retries): aviso genérico de atraso enquanto a fatura está\n // dentro da janela de cobrança.\n if (daysSinceDue > 0 && daysSinceDue <= SUBSCRIPTION_GRACE_PERIOD_DAYS) {\n return <OverdueInvoiceBanner onDetails={onDetails} />;\n }\n\n if (\n isBoleto &&\n !isLoadingCharges &&\n hasPendingCharge &&\n daysToDue >= 0 &&\n daysToDue <= UPCOMING_WINDOW_DAYS\n ) {\n return <UpcomingInvoiceBanner dueDate={dueDate} onDetails={onDetails} />;\n }\n\n return null;\n}\n"],"mappings":"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","names":[]}
|
package/dist/handlers.mjs
CHANGED
|
@@ -3,6 +3,8 @@ import { createFindCardByIdHandler } from "./modules/cards/handlers/find-card-by
|
|
|
3
3
|
import { createListChargesHandler } from "./modules/charges/handlers/list-charges.handler";
|
|
4
4
|
import { createFindChargeByIdHandler } from "./modules/charges/handlers/find-charge-by-id.handler";
|
|
5
5
|
import { createListIaCreditsHandler } from "./modules/ia-credits/handlers/list-ia-credits.handler";
|
|
6
|
+
import { createPurchaseIaCreditsHandler } from "./modules/ia-credits/handlers/purchase-ia-credits.handler";
|
|
7
|
+
import { createGetAiCreditsOfferEligibilityHandler } from "./modules/ia-credits/handlers/get-offer-eligibility.handler";
|
|
6
8
|
import { createCountPagesHandler } from "./modules/pages/handlers/count-pages.handler";
|
|
7
9
|
import { createListPlansHandler } from "./modules/plans/handlers/list-plans.handler";
|
|
8
10
|
import { createFindPlanByIdHandler } from "./modules/plans/handlers/find-plan-by-id.handler";
|
|
@@ -21,6 +23,7 @@ export {
|
|
|
21
23
|
createFindPlanByIdHandler,
|
|
22
24
|
createFindProjectHandler,
|
|
23
25
|
createFreezeNoticeHandler,
|
|
26
|
+
createGetAiCreditsOfferEligibilityHandler,
|
|
24
27
|
createListAllAccountUsersHandler,
|
|
25
28
|
createListAvailableUsersHandler,
|
|
26
29
|
createListCardsHandler,
|
|
@@ -30,6 +33,7 @@ export {
|
|
|
30
33
|
createListPlansHandler,
|
|
31
34
|
createListProjectUsersHandler,
|
|
32
35
|
createListProjectsHandler,
|
|
33
|
-
createListSubscriptionsHandler
|
|
36
|
+
createListSubscriptionsHandler,
|
|
37
|
+
createPurchaseIaCreditsHandler
|
|
34
38
|
};
|
|
35
39
|
//# sourceMappingURL=handlers.mjs.map
|
package/dist/handlers.mjs.map
CHANGED
|
@@ -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';\nexport { createFreezeNoticeHandler } from './modules/subscriptions/handlers/freeze-notice.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;
|
|
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';\nexport { createPurchaseIaCreditsHandler } from './modules/ia-credits/handlers/purchase-ia-credits.handler';\nexport { createGetAiCreditsOfferEligibilityHandler } from './modules/ia-credits/handlers/get-offer-eligibility.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';\nexport { createFreezeNoticeHandler } from './modules/subscriptions/handlers/freeze-notice.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;AAC3C,SAAS,sCAAsC;AAC/C,SAAS,iDAAiD;AAE1D,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;AAC/C,SAAS,iCAAiC;AAE1C,SAAS,iCAAiC;","names":[]}
|
|
@@ -584,6 +584,38 @@ const messages = {
|
|
|
584
584
|
"pt-br": "Portuguese (Brazil)",
|
|
585
585
|
"en-us": "English (US)",
|
|
586
586
|
"es-es": "Spanish"
|
|
587
|
+
},
|
|
588
|
+
// Modais promocionais compartilhados entre app/accounts/editor.
|
|
589
|
+
promo: {
|
|
590
|
+
// Componente: AiCreditsOfferModal.
|
|
591
|
+
aiCreditsOffer: {
|
|
592
|
+
eyebrow: "First purchase pack",
|
|
593
|
+
title: "{credits} AI credits <break></break>at {discount}",
|
|
594
|
+
bullets: {
|
|
595
|
+
first: "Build a full page from one prompt.",
|
|
596
|
+
second: "Generate copy and images in the editor.",
|
|
597
|
+
third: "One-time credits: your plan stays as is."
|
|
598
|
+
},
|
|
599
|
+
discountBadge: "{percent}% OFF",
|
|
600
|
+
cta: "Get my credits at {discount}",
|
|
601
|
+
ctaAddCard: "Add card and lock in the discount",
|
|
602
|
+
later: "Not now",
|
|
603
|
+
editPayment: "Edit payment details",
|
|
604
|
+
close: "Close",
|
|
605
|
+
successToast: "Done! {credits} AI credits are now in your account.",
|
|
606
|
+
errorToast: "We could not complete the purchase. Please try again.",
|
|
607
|
+
cardVerification: "Your card asked for an extra verification. Try another card.",
|
|
608
|
+
illustration: {
|
|
609
|
+
credits: "credits"
|
|
610
|
+
},
|
|
611
|
+
exit: {
|
|
612
|
+
title: "Sure you want to lose {discount}?",
|
|
613
|
+
description: "This screen will not come back. Leave now and the {credits} credits go back to {price}.",
|
|
614
|
+
descriptionNoPrice: "This screen will not come back. Leave now and the {credits} credits go back to full price.",
|
|
615
|
+
keep: "Back to the offer",
|
|
616
|
+
lose: "Lose my offer"
|
|
617
|
+
}
|
|
618
|
+
}
|
|
587
619
|
}
|
|
588
620
|
};
|
|
589
621
|
var en_us_default = messages;
|
|
@@ -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 deletionWarning: {\n title: 'Your account will be deleted',\n descriptionLine1:\n 'Your subscription has been cancelled for 90 days or more. Your account and all data will be permanently deleted.',\n descriptionLine2:\n 'To keep your information, reactivate your subscription before the deletion. After this period, the data cannot be recovered.',\n reactivate: 'Reactivate subscription',\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 purchaseSuccessToast: 'Purchase complete! {credits} AI credits were added to your balance.',\n pixConfirmedToast: 'Payment confirmed! {credits} AI credits are now in your balance.',\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 billing: {\n requiredData: {\n title: 'Complete your billing information',\n description:\n 'We need this information to issue the invoice for your payments. Filling it in is required to keep using the platform.',\n addressHeading: 'Billing address',\n select: 'Select',\n typeHere: 'Type here',\n personType: 'Entity type',\n personTypePf: 'Individual',\n personTypePj: 'Company',\n cpf: 'CPF',\n cnpj: 'CNPJ',\n fullName: 'Full name',\n companyName: 'Legal name',\n financialEmail: 'Billing email',\n financialEmailPlaceholder: 'billing@company.com',\n cep: 'ZIP code',\n postalCode: 'Postal code',\n street: 'Address',\n streetNumber: 'Number',\n neighborhood: 'District',\n complement: 'Complement',\n city: 'City',\n state: 'State',\n stateProvince: 'State/Province',\n country: 'Country',\n submit: 'Save and continue',\n submitting: 'Saving...',\n successToast: 'Billing information saved successfully.',\n errorToast: 'We could not save your billing information, please try again.',\n requiredField: 'Required field',\n invalidEmail: 'Invalid email',\n invalidCep: 'Invalid ZIP code',\n invalidCpf: 'Invalid CPF',\n invalidCnpj: 'Invalid CNPJ',\n invalidCpfChecksum: 'Invalid CPF — check the verification digits',\n invalidCnpjChecksum: 'Invalid CNPJ — check the verification digits',\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 attemptsMessage: 'Payment failed. {count, plural, one {# attempt remains} other {# attempts remain}} before cancellation. Update your payment method.',\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 subscription: {\n frozen: {\n banner: {\n message: 'Your account resources are blocked due to missing payment.',\n regularize: 'Update subscription',\n },\n warningBanner: {\n message: 'Payment overdue: your account resources will be blocked on {freezeDate}. Pay now to keep your access.',\n details: 'Details',\n },\n modal: {\n title: 'Your account resources are blocked',\n description: 'Your account resources are blocked due to missing payment. Update your subscription to unlock them.',\n descriptionWithResources: 'We could not identify your payment, so these resources are blocked:',\n warningDescriptionWithResources: 'Your payment is overdue. If we do not identify it by then, these resources will be blocked:',\n warningTitle: 'Your resources will be blocked on {freezeDate}',\n warningDescription: 'Your payment is overdue. Settle it to keep access to your account resources.',\n keepsWorking: 'Your published pages stay online and your leads keep coming in. Everything is restored automatically once the payment goes through.',\n resources: {\n pages: {\n title: 'Manage pages',\n description: 'Publishing, creating and editing pages, settings, A/B tests, file uploads and exporting leads',\n },\n projects: {\n title: 'Manage projects',\n description: 'Creating and editing projects, inviting users and changing team permissions',\n },\n domains: {\n title: 'Manage domains',\n description: 'Connecting new domains and managing integrations',\n },\n },\n cta: 'Update subscription',\n },\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 names: {\n '415': 'Starter',\n '1': 'Essential',\n '2': 'Growth',\n '3': 'Agency',\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 // Autenticação de pagamento (3DS/SCA).\n payment: {\n authFailed: \"We couldn't authenticate the payment with your bank.\",\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":["/**\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 deletionWarning: {\n title: 'Your account will be deleted',\n descriptionLine1:\n 'Your subscription has been cancelled for 90 days or more. Your account and all data will be permanently deleted.',\n descriptionLine2:\n 'To keep your information, reactivate your subscription before the deletion. After this period, the data cannot be recovered.',\n reactivate: 'Reactivate subscription',\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 purchaseSuccessToast: 'Purchase complete! {credits} AI credits were added to your balance.',\n pixConfirmedToast: 'Payment confirmed! {credits} AI credits are now in your balance.',\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 billing: {\n requiredData: {\n title: 'Complete your billing information',\n description:\n 'We need this information to issue the invoice for your payments. Filling it in is required to keep using the platform.',\n addressHeading: 'Billing address',\n select: 'Select',\n typeHere: 'Type here',\n personType: 'Entity type',\n personTypePf: 'Individual',\n personTypePj: 'Company',\n cpf: 'CPF',\n cnpj: 'CNPJ',\n fullName: 'Full name',\n companyName: 'Legal name',\n financialEmail: 'Billing email',\n financialEmailPlaceholder: 'billing@company.com',\n cep: 'ZIP code',\n postalCode: 'Postal code',\n street: 'Address',\n streetNumber: 'Number',\n neighborhood: 'District',\n complement: 'Complement',\n city: 'City',\n state: 'State',\n stateProvince: 'State/Province',\n country: 'Country',\n submit: 'Save and continue',\n submitting: 'Saving...',\n successToast: 'Billing information saved successfully.',\n errorToast: 'We could not save your billing information, please try again.',\n requiredField: 'Required field',\n invalidEmail: 'Invalid email',\n invalidCep: 'Invalid ZIP code',\n invalidCpf: 'Invalid CPF',\n invalidCnpj: 'Invalid CNPJ',\n invalidCpfChecksum: 'Invalid CPF — check the verification digits',\n invalidCnpjChecksum: 'Invalid CNPJ — check the verification digits',\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 attemptsMessage: 'Payment failed. {count, plural, one {# attempt remains} other {# attempts remain}} before cancellation. Update your payment method.',\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 subscription: {\n frozen: {\n banner: {\n message: 'Your account resources are blocked due to missing payment.',\n regularize: 'Update subscription',\n },\n warningBanner: {\n message: 'Payment overdue: your account resources will be blocked on {freezeDate}. Pay now to keep your access.',\n details: 'Details',\n },\n modal: {\n title: 'Your account resources are blocked',\n description: 'Your account resources are blocked due to missing payment. Update your subscription to unlock them.',\n descriptionWithResources: 'We could not identify your payment, so these resources are blocked:',\n warningDescriptionWithResources: 'Your payment is overdue. If we do not identify it by then, these resources will be blocked:',\n warningTitle: 'Your resources will be blocked on {freezeDate}',\n warningDescription: 'Your payment is overdue. Settle it to keep access to your account resources.',\n keepsWorking: 'Your published pages stay online and your leads keep coming in. Everything is restored automatically once the payment goes through.',\n resources: {\n pages: {\n title: 'Manage pages',\n description: 'Publishing, creating and editing pages, settings, A/B tests, file uploads and exporting leads',\n },\n projects: {\n title: 'Manage projects',\n description: 'Creating and editing projects, inviting users and changing team permissions',\n },\n domains: {\n title: 'Manage domains',\n description: 'Connecting new domains and managing integrations',\n },\n },\n cta: 'Update subscription',\n },\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 names: {\n '415': 'Starter',\n '1': 'Essential',\n '2': 'Growth',\n '3': 'Agency',\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 // Autenticação de pagamento (3DS/SCA).\n payment: {\n authFailed: \"We couldn't authenticate the payment with your bank.\",\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\n // Modais promocionais compartilhados entre app/accounts/editor.\n promo: {\n // Componente: AiCreditsOfferModal.\n aiCreditsOffer: {\n eyebrow: 'First purchase pack',\n title: '{credits} AI credits <break></break>at {discount}',\n bullets: {\n first: 'Build a full page from one prompt.',\n second: 'Generate copy and images in the editor.',\n third: 'One-time credits: your plan stays as is.',\n },\n discountBadge: '{percent}% OFF',\n cta: 'Get my credits at {discount}',\n ctaAddCard: 'Add card and lock in the discount',\n later: 'Not now',\n editPayment: 'Edit payment details',\n close: 'Close',\n successToast: 'Done! {credits} AI credits are now in your account.',\n errorToast: 'We could not complete the purchase. Please try again.',\n cardVerification: 'Your card asked for an extra verification. Try another card.',\n illustration: {\n credits: 'credits',\n },\n exit: {\n title: 'Sure you want to lose {discount}?',\n description: 'This screen will not come back. Leave now and the {credits} credits go back to {price}.',\n descriptionNoPrice: 'This screen will not come back. Leave now and the {credits} credits go back to full price.',\n keep: 'Back to the offer',\n lose: 'Lose my offer',\n },\n },\n },\n} as const;\n\nexport default messages;\n"],"mappings":"AAKA,MAAM,WAAW;AAAA,EACf,SAAS;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EAEA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAAA,EAEA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,aAAa;AAAA,IACb,wBAAwB;AAAA,IACxB,UAAU;AAAA,IACV,qBAAqB;AAAA,IACrB,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,qBAAqB;AAAA,IACrB,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,qBAAqB;AAAA,IACrB,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,uBAAuB;AAAA,IACvB,mBAAmB;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,cAAc;AAAA,IACd,WAAW;AAAA,EACb;AAAA,EAEA,SAAS;AAAA,IACP,mBAAmB;AAAA,MACjB,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,sBAAsB;AAAA,IACxB;AAAA,IACA,eAAe;AAAA,MACb,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,wBAAwB;AAAA,MACxB,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,SAAS;AAAA,QACP,WAAW;AAAA,QACX,WAAW;AAAA,QACX,SAAS;AAAA,QACT,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,OAAO;AAAA,MACP,kBACE;AAAA,MACF,kBACE;AAAA,MACF,YAAY;AAAA,IACd;AAAA,IACA,eAAe;AAAA,MACb,OAAO;AAAA,MACP,SACE;AAAA,MACF,gBAAgB;AAAA,MAChB,SAAS;AAAA,MACT,OAAO;AAAA,MACP,aAAa;AAAA,MACb,cAAc;AAAA,MACd,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,MACV,OAAO;AAAA,MACP,aACE;AAAA,MACF,SAAS;AAAA,MACT,kBAAkB;AAAA,IACpB;AAAA,IACA,WAAW;AAAA,MACT,OAAO;AAAA,MACP,cACE;AAAA,MACF,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,eACE;AAAA,MACF,eAAe;AAAA,MACf,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,eAAe;AAAA,MACf,cAAc;AAAA,MACd,cAAc;AAAA,MACd,oBACE;AAAA,MACF,mBAAmB;AAAA,MACnB,WAAW;AAAA,MACX,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,aAAa;AAAA,IACf;AAAA,IACA,SAAS;AAAA,MACP,OAAO;AAAA,MACP,WAAW;AAAA,MACX,aAAa;AAAA,MACb,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,QAAQ;AAAA,MACR,mBAAmB;AAAA,MACnB,eAAe;AAAA,QACb,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,cAAc;AAAA,MACd,WAAW;AAAA,IACb;AAAA,IACA,KAAK;AAAA,MACH,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,IACA,aAAa;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,cAAc;AAAA,MACd,kBAAkB;AAAA,IACpB;AAAA,IACA,aAAa;AAAA,MACX,WAAW;AAAA,MACX,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,WAAW;AAAA,MACX,mBAAmB;AAAA,IACrB;AAAA,IACA,UAAU;AAAA,MACR,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,yBACE;AAAA,MACF,WAAW;AAAA,MACX,cAAc;AAAA,MACd,aAAa;AAAA,MACb,0BACE;AAAA,MACF,iBAAiB;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,4BAA4B;AAAA,MAC5B,aAAa;AAAA,MACb,wBAAwB;AAAA,MACxB,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB;AAAA,IACA,mBAAmB;AAAA,MACjB,OAAO;AAAA,MACP,eAAe;AAAA,MACf,SACE;AAAA,IACJ;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,SAAS;AAAA,IACP,KAAK;AAAA,MACH,OAAO;AAAA,MACP,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,2BAA2B;AAAA,MAC3B,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB,mBAAmB;AAAA,IACrB;AAAA,IACA,UAAU;AAAA,MACR,OAAO;AAAA,MACP,kBAAkB;AAAA,MAClB,kBACE;AAAA,MACF,YAAY;AAAA,IACd;AAAA,IACA,kBAAkB;AAAA,MAChB,cAAc;AAAA,MACd,oBAAoB;AAAA,MACpB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,KAAK;AAAA,MACH,aAAa;AAAA,MACb,UAAU;AAAA,MACV,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,gBAAgB;AAAA,MAChB,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,cAAc;AAAA,MACd,WAAW;AAAA,IACb;AAAA,IACA,MAAM;AAAA,MACJ,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,cAAc;AAAA,MACd,KAAK;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,KAAK;AAAA,MACL,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,MAAM;AAAA,MACN,OAAO;AAAA,MACP,eAAe;AAAA,MACf,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,MACpB,iBAAiB;AAAA,IACnB;AAAA,IACA,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,cAAc;AAAA,MACd,oBAAoB;AAAA,MACpB,UAAU;AAAA,MACV,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,IACA,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,iBAAiB;AAAA,IACnB;AAAA,IACA,MAAM;AAAA,MACJ,cAAc;AAAA,MACd,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,IACnB;AAAA,IACA,aAAa;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,MACT,qBAAqB;AAAA,MACrB,aAAa;AAAA,MACb,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,aACE;AAAA,MACF,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,cAAc;AAAA,MACd,KAAK;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,2BAA2B;AAAA,MAC3B,KAAK;AAAA,MACL,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,eAAe;AAAA,MACf,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,qBAAqB;AAAA,IACvB;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,SAAS;AAAA,MACP,WAAW;AAAA,QACT,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,SAAS;AAAA,MACX;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,MACA,UAAU;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB;AAAA,IACA,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,iBAAiB;AAAA,IACnB;AAAA,IACA,aAAa;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IACA,UAAU;AAAA,MACR,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,QAAQ;AAAA,MACN,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,MACA,eAAe;AAAA,QACb,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,QACb,0BAA0B;AAAA,QAC1B,iCAAiC;AAAA,QACjC,cAAc;AAAA,QACd,oBAAoB;AAAA,QACpB,cAAc;AAAA,QACd,WAAW;AAAA,UACT,OAAO;AAAA,YACL,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,UAAU;AAAA,YACR,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,SAAS;AAAA,YACP,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA,MACR,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,cAAc;AAAA,IAChB;AAAA,IACA,YAAY;AAAA,MACV,aAAa;AAAA,IACf;AAAA,IACA,iBAAiB;AAAA,MACf,aAAa;AAAA,IACf;AAAA,IACA,YAAY;AAAA,MACV,UAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,cAAc;AAAA,IAChB;AAAA,IACA,QAAQ;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,MACV,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB;AAAA,IACA,kBAAkB;AAAA,MAChB,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,4BAA4B;AAAA,IAC5B,sBAAsB;AAAA,IACtB,+BAA+B;AAAA,IAC/B,yBAAyB;AAAA,IACzB,iCAAiC;AAAA,IACjC,2BAA2B;AAAA,IAC3B,aAAa;AAAA,IACb,UAAU;AAAA,IACV,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,MACJ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,oBAAoB;AAAA,MACpB,mBAAmB;AAAA,MACnB,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,SAAS;AAAA,MACT,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB;AAAA,IACA,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IACA,SAAS;AAAA,MACP,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,IACA,eAAe;AAAA,MACb,OAAO;AAAA,MACP,KAAK;AAAA,MACL,mBAAmB;AAAA,MACnB,OAAO;AAAA,MACP,WAAW;AAAA,MACX,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA;AAAA,EAGA,OAAO;AAAA,IACL,UAAU;AAAA,MACR,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,mBAAmB;AAAA,IACrB;AAAA,IACA,OAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,cAAc;AAAA,MACZ,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,gBAAgB;AAAA,IAClB;AAAA,IACA,kBAAkB;AAAA,EACpB;AAAA;AAAA,EAGA,SAAS;AAAA,IACP,YAAY;AAAA,EACd;AAAA;AAAA,EAGA,aAAa;AAAA,IACX,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EAEA,WAAW;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA;AAAA,EAGA,OAAO;AAAA;AAAA,IAEL,gBAAgB;AAAA,MACd,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA,eAAe;AAAA,MACf,KAAK;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,MACP,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,cAAc;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MACA,MAAM;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,oBAAoB;AAAA,QACpB,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,gBAAQ;","names":[]}
|
|
@@ -584,6 +584,38 @@ const messages = {
|
|
|
584
584
|
"pt-br": "Portugu\xE9s (Brasil)",
|
|
585
585
|
"en-us": "Ingl\xE9s (EE. UU.)",
|
|
586
586
|
"es-es": "Espa\xF1ol"
|
|
587
|
+
},
|
|
588
|
+
// Modais promocionais compartilhados entre app/accounts/editor.
|
|
589
|
+
promo: {
|
|
590
|
+
// Componente: AiCreditsOfferModal.
|
|
591
|
+
aiCreditsOffer: {
|
|
592
|
+
eyebrow: "Paquete primera compra",
|
|
593
|
+
title: "{credits} cr\xE9ditos de IA <break></break>con {discount}",
|
|
594
|
+
bullets: {
|
|
595
|
+
first: "Crea una p\xE1gina entera con un prompt.",
|
|
596
|
+
second: "Genera textos e im\xE1genes en el editor.",
|
|
597
|
+
third: "Cr\xE9ditos sueltos: no tocan tu plan."
|
|
598
|
+
},
|
|
599
|
+
discountBadge: "{percent}% OFF",
|
|
600
|
+
cta: "Quiero mis cr\xE9ditos con {discount}",
|
|
601
|
+
ctaAddCard: "Agregar tarjeta y asegurar el descuento",
|
|
602
|
+
later: "Ahora no",
|
|
603
|
+
editPayment: "Editar datos de pago",
|
|
604
|
+
close: "Cerrar",
|
|
605
|
+
successToast: "\xA1Listo! {credits} cr\xE9ditos de IA ya est\xE1n en tu cuenta.",
|
|
606
|
+
errorToast: "No pudimos completar la compra. Int\xE9ntalo de nuevo.",
|
|
607
|
+
cardVerification: "Tu tarjeta pidi\xF3 una verificaci\xF3n extra. Prueba con otra tarjeta.",
|
|
608
|
+
illustration: {
|
|
609
|
+
credits: "cr\xE9ditos"
|
|
610
|
+
},
|
|
611
|
+
exit: {
|
|
612
|
+
title: "\xBFSeguro que quieres perder {discount}?",
|
|
613
|
+
description: "Esta pantalla no vuelve. Si sales ahora, los {credits} cr\xE9ditos vuelven a costar {price}.",
|
|
614
|
+
descriptionNoPrice: "Esta pantalla no vuelve. Si sales ahora, los {credits} cr\xE9ditos vuelven al precio completo.",
|
|
615
|
+
keep: "Volver a la oferta",
|
|
616
|
+
lose: "Perder mi oferta"
|
|
617
|
+
}
|
|
618
|
+
}
|
|
587
619
|
}
|
|
588
620
|
};
|
|
589
621
|
var es_es_default = messages;
|