mitre-form-component 2.2.1 → 2.2.3

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Form/index.tsx","../src/components/hooks/useError.ts","../src/utils/utm.ts","../src/components/styles/utils.ts","../src/components/Form/styles.ts","../src/components/styles/theme.ts","../src/components/ProductSelect/styles.ts","../src/components/styles/FontLoader.tsx","../src/components/Input/index.tsx","../src/components/Input/masks.ts","../src/components/Input/styles.ts","../src/components/Button/styles.ts","../src/components/Button/index.tsx","../src/components/Alert/index.tsx","../src/components/Alert/styles.ts","../src/components/Modal/index.tsx","../src/components/Modal/styles.ts","../src/components/PhoneInput/index.tsx","../src/components/PhoneInput/styles.ts","../src/components/ProductSelect/index.tsx","../src/config/environments.ts"],"sourcesContent":["import React, { useState } from \"react\";\nimport { useError } from \"../hooks/useError\";\nimport { useForm, SubmitHandler, Controller } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as yup from \"yup\";\n\nimport { UTM, isBrowser, resolveUtmWithPriority } from '../../utils/utm';\nimport { Product } from '../../domain/Product';\n\nimport { PhoneNumberUtil } from 'google-libphonenumber';\nconst phoneUtil = PhoneNumberUtil.getInstance();\n\nimport {\n FormContainer,\n HeaderContainer,\n ButtonContainer,\n Form,\n Title,\n Subtitle\n} from \"./styles\";\nimport {\n FormControl,\n FormLabel,\n Select as FormSelect,\n FormErrorMessage,\n} from \"../ProductSelect/styles\";\nimport { theme } from \"../styles/theme\";\nimport { useMontserratFont } from \"../styles/FontLoader\";\n\nimport { Input } from \"../Input\";\nimport { Button } from \"../Button\";\nimport { Alert } from \"../Alert\";\nimport { Modal } from \"../Modal\";\nimport { PhoneInput } from \"../PhoneInput\";\nimport { ProductSelect } from \"../ProductSelect\";\n\nimport { resolveEnvironment, type Environment } from \"../../config/environments\";\n\nexport enum ContactPreference {\n Whatsapp = \"Whatsapp\",\n Email = \"Email\",\n Ligacao = \"Ligação\",\n}\n\nexport type { Environment };\n\nexport type Channel = \"form\" | \"chat\" | \"whatsapp\";\n\nconst WHATSAPP_MESSAGE = \"Olá! Tenho interesse e gostaria de mais informações.\";\n\nconst WHATSAPP_TITLE = \"Fale com um corretor por WhatsApp\";\nconst WHATSAPP_SUBTITLE = \"Informe seus dados para contato.\";\nconst WHATSAPP_BUTTON_TEXT = \"Entrar\";\n\nconst CHAT_TITLE = \"Fale com um corretor por chat\";\nconst CHAT_SUBTITLE = \"Informe seus dados para contato.\";\nconst CHAT_BUTTON_TEXT = \"Entrar\";\n\nconst MODAL_ERROR_TITLE = \"Não foi possível completar seu contato\";\nconst MODAL_ERROR_MESSAGE = \"Por favor, tente novamente em alguns instantes.\";\nconst MODAL_ERROR_BUTTON_TEXT = \"OK\";\n\nconst MODAL_SUCCESS_TITLE = \"Cadastro realizado!\";\nconst MODAL_SUCCESS_AUTO_REDIRECT_WHATSAPP =\n \"Você está sendo redirecionado automaticamente para o WhatsApp.\";\nconst MODAL_SUCCESS_AUTO_REDIRECT_CHAT =\n \"Você está sendo redirecionado automaticamente para iniciar o atendimento via chat.\";\nconst MODAL_SUCCESS_OK_BUTTON_TEXT = \"OK\";\nconst MODAL_SUCCESS_FALLBACK_INSTRUCTION =\n \"Caso não tenha sido direcionado automaticamente, clique no botão abaixo para abrir a aplicação:\";\nconst MODAL_SUCCESS_BUTTON_WHATSAPP = \"Abrir WhatsApp\";\nconst MODAL_SUCCESS_BUTTON_CHAT = \"Iniciar atendimento\";\n\n// Atraso entre exibir o modal de sucesso e navegar a aba pré-aberta. Dá tempo\n// para o usuário ver a confirmação \"Cadastro realizado!\" antes do redirect.\nconst REDIRECT_DELAY_MS = 0;\n\ntype ActionModalState =\n | { kind: \"success\"; channel: \"whatsapp\"; targetUrl: string }\n | {\n kind: \"success\";\n channel: \"chat\";\n chatUrl: string;\n virtualObj: Record<string, unknown>;\n }\n | { kind: \"error\" };\n\nfunction buildWhatsappUrl(phone: string): string {\n const digits = phone.replace(/\\D/g, \"\");\n const text = encodeURIComponent(WHATSAPP_MESSAGE);\n return `https://api.whatsapp.com/send?phone=${digits}&text=${text}`;\n}\n\nfunction submitChatInNewTab(\n chatUrl: string,\n virtualObj: Record<string, unknown>\n): void {\n // Cria, submete e remove um form em nova aba. Executar dentro de gesto do\n // usuário (clique no botão do modal) garante que o browser não bloqueia.\n const form = document.createElement(\"form\");\n form.method = \"POST\";\n form.action = chatUrl;\n form.target = \"_blank\";\n const input = document.createElement(\"input\");\n input.type = \"hidden\";\n input.name = \"virtual_obj\";\n input.value = JSON.stringify(virtualObj);\n form.appendChild(input);\n document.body.appendChild(form);\n form.submit();\n document.body.removeChild(form);\n}\n\nfunction isTabAlive(tab: Window | null): tab is Window {\n return tab !== null && !tab.closed;\n}\n\n// Conteúdo escrito na aba pré-aberta. Duas fases:\n// - \"processing\": durante o `/leads` (mostra spinner + \"registrando seu cadastro\").\n// - \"success\": após `/leads` ok, durante REDIRECT_DELAY_MS (mostra ✓ verde +\n// \"Cadastro realizado!\" + \"Abrindo o WhatsApp/atendimento em instantes\").\n// O usuário, que tem o foco automaticamente movido para a nova aba pelo browser,\n// vê a confirmação de sucesso ali (em vez de só no modal da aba original).\n// Inputs são todos estáticos — sem XSS.\nfunction writeStatusHtmlToTab(\n tab: Window,\n phase: \"processing\" | \"success\",\n channel: \"whatsapp\" | \"chat\"\n): void {\n try {\n const destinationLabel = channel === \"whatsapp\" ? \"WhatsApp\" : \"atendimento\";\n const isSuccess = phase === \"success\";\n\n const headline = isSuccess\n ? \"Cadastro realizado!\"\n : \"Aguarde...\";\n const message = isSuccess\n ? `Abrindo o ${destinationLabel} em instantes...`\n : \"Estamos registrando seu cadastro...\";\n const headlineColor = isSuccess ? \"#2DCE68\" : \"#535353\";\n const indicator = isSuccess\n ? '<div class=\"check\" aria-hidden=\"true\"></div>'\n : '<div class=\"spinner\" aria-hidden=\"true\"></div>';\n\n tab.document.open();\n tab.document.write(\n '<!DOCTYPE html><html lang=\"pt-br\"><head><meta charset=\"utf-8\"/>' +\n '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"/>' +\n `<title>${headline}</title>` +\n '<style>' +\n 'html,body{margin:0;padding:0;height:100%;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;background:#FFF;color:#2F2F2F;}' +\n 'body{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:1rem;}' +\n '.box{text-align:center;max-width:360px;}' +\n '.logo{width:140px;max-width:60%;height:auto;margin:0 auto 1.5rem;display:block;}' +\n '.spinner{width:40px;height:40px;margin:0 auto 1.25rem;border:4px solid #EBEBEB;border-top-color:#2DCE68;border-radius:50%;animation:spin .9s linear infinite;}' +\n '.check{width:52px;height:52px;margin:0 auto 1.25rem;border-radius:50%;background:#2DCE68;position:relative;animation:pop .25s ease-out;}' +\n '.check::after{content:\"\";position:absolute;top:14px;left:19px;width:10px;height:20px;border:solid #FFF;border-width:0 4px 4px 0;transform:rotate(45deg);}' +\n `.headline{font-size:1.35rem;font-weight:700;color:${headlineColor};margin:0 0 0.5rem;}` +\n '.msg{font-size:.95rem;line-height:1.4;color:#535353;margin:0;}' +\n '@keyframes spin{to{transform:rotate(360deg);}}' +\n '@keyframes pop{from{transform:scale(0.6);opacity:0;}to{transform:scale(1);opacity:1;}}' +\n '</style></head><body><div class=\"box\">' +\n '<img class=\"logo\" src=\"https://portal.mitrerealty.com.br/Clientes/assets/images/mitre.svg\" alt=\"Mitre Realty\" onerror=\"this.style.display=\\'none\\'\"/>' +\n indicator +\n `<div class=\"headline\">${headline}</div>` +\n `<div class=\"msg\">${message}</div>` +\n '</div></body></html>'\n );\n tab.document.close();\n } catch {\n // Tab pode ter sido fechada ou bloqueada. Silenciamos: o redirect ainda\n // é tentado depois e o modal/botão de fallback cobrem o caso bloqueado.\n }\n}\n\nfunction escapeHtmlAttr(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/'/g, \"&#39;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nfunction navigateTabToWhatsapp(tab: Window, targetUrl: string): void {\n try {\n tab.location.href = targetUrl;\n } catch {\n // Em alguns browsers (ex.: tab fechada pelo usuário durante o /leads) a\n // atribuição pode lançar. Silenciamos: o botão de fallback no modal cobre.\n }\n}\n\nfunction submitChatInPreOpenedTab(\n tab: Window,\n chatUrl: string,\n virtualObj: Record<string, unknown>\n): void {\n try {\n const escapedJson = escapeHtmlAttr(JSON.stringify(virtualObj));\n const escapedUrl = escapeHtmlAttr(chatUrl);\n tab.document.open();\n tab.document.write(\n '<!DOCTYPE html><html><head><meta charset=\"utf-8\"/>' +\n \"<title>Abrindo atendimento...</title></head><body>\" +\n `<form id=\"f\" method=\"POST\" action=\"${escapedUrl}\">` +\n `<input type=\"hidden\" name=\"virtual_obj\" value=\"${escapedJson}\"/>` +\n \"</form>\" +\n \"<script>document.getElementById('f').submit();</script>\" +\n \"</body></html>\"\n );\n tab.document.close();\n } catch {\n // Fallback do modal continua disponível se o write falhar.\n }\n}\n\nexport interface MitreFormComponentProps {\n products: Product[];\n /**\n * Define de qual config interno o componente lê `apiUrl`, `apiToken`,\n * `whatsappPhone` e `chatUrl`. Default `\"homol\"`.\n */\n environment?: Environment;\n /** Default `\"form\"`. Ver doc/channel-feature.md. */\n channel?: Channel;\n showHeader?: boolean;\n title?: string;\n subtitle?: string;\n backgroundColor?: string;\n buttonBackgroundColor?: string;\n buttonTextColor?: string;\n textColor?: string;\n innerPadding?: string;\n inputBackgroundColor?: string;\n inputFocusBorderColor?: string;\n inputBorderColor?: string;\n inputTextColor?: string;\n inputPlaceholderColor?: string;\n showContactPreference?: boolean;\n /** Opcional. Repassado no body do POST /leads e no `virtual_obj` (modo chat). */\n idProdutoTerceiro?: string | number;\n /** Opcional. Repassado no body do POST /leads e no `virtual_obj` (modo chat). */\n idEmpreendimento?: string | number;\n /**\n * Default: `true` em `channel === \"chat\"` / `\"whatsapp\"` (paridade com `atendimento.html`),\n * `false` em `channel === \"form\"`. Passe `false` para forçar criação do evento.\n */\n naoCriarEvento?: boolean;\n /**\n * Callback chamado após o POST `/leads` retornar sucesso, em qualquer channel.\n * Útil para tracking (GTM, Analytics), redirect customizado ou logging na landing.\n * O componente continua exibindo a UI de sucesso (mensagem em `channel=form`, modal\n * em `channel=whatsapp`/`channel=chat`) independente do callback.\n */\n onSuccess?: (requestBody: RequestBody, leadId: string) => void;\n /**\n * Callback chamado quando o POST `/leads` falha, em qualquer channel. Útil para\n * tracking de erro (Sentry, Datadog, GTM). O componente continua exibindo a UI\n * de erro (alert em `channel=form`, modal em `channel=whatsapp`/`channel=chat`)\n * independente do callback.\n */\n onError?: (error: Error) => void;\n}\n\nexport interface RequestBody {\n name: string;\n email: string;\n phone: string;\n message: string;\n productId: string;\n utm_source: string;\n utm_medium?: string;\n utm_campaign?: string;\n utm_term?: string;\n preferencia_contato?: string;\n /** Presente quando `channel !== \"form\"`. */\n channel?: Channel;\n /**\n * Presente (e sempre `true`) quando `channel !== \"form\"`. Paridade com o fluxo legado\n * `atendimento.html`, cujo `<form id=\"chat-form\">` enviava o hidden `is_chat=true`\n * em ambos os canais (chat e whatsapp).\n */\n is_chat?: boolean;\n /** Presente quando `channel !== \"form\"`. `window.location.href` no momento do submit. */\n pagina?: string;\n /** Presente quando a prop homônima for informada e `channel !== \"form\"`. */\n idProdutoTerceiro?: string | number;\n /** Presente quando a prop homônima for informada e `channel !== \"form\"`. */\n idEmpreendimento?: string | number;\n /**\n * Presente quando o flag efetivo é `true`. Por default vai `true` em\n * `channel === \"chat\"` / `channel === \"whatsapp\"`; pode ser desligado com\n * `naoCriarEvento={false}`.\n */\n naoCriarEvento?: boolean;\n}\n\nconst isPhoneValid = (phone: string) => {\n try {\n return phoneUtil.isValidNumber(phoneUtil.parseAndKeepRawInput(phone));\n } catch (error) {\n console.log('erro ao validar telefone = ' + error)\n return false;\n }\n};\n\n// Schema base sem productId\nconst baseSchema = {\n name: yup.string().required(\"Nome é obrigatório\"),\n email: yup.string().required(\"Email é obrigatório\").email(\"Email inválido\"),\n phone: yup.object().shape({\n phone: yup.string().required(\"Telefone é obrigatório!\")\n .test(\n 'is-valid-phone',\n 'Número de telefone inválido!',\n function (value) {\n const digitsOnly = value?.replace(/\\D/g, '') || '';\n return digitsOnly.length >= 8 && isPhoneValid(value)\n }),\n inputValue: yup.string().required(\"Telefone é obrigatório!\"),\n dialCode: yup.string().required(\"Código de país é obrigatório\")\n }),\n};\n\n// Schema com productId quando necessário\nconst schemaWithProduct = yup.object().shape({\n ...baseSchema,\n productId: yup.string().required(\"Produto é obrigatório\"),\n});\n\nconst schema = yup.object().shape(baseSchema);\n\nconst MitreFormComponent = React.forwardRef<HTMLDivElement, MitreFormComponentProps>(({\n products,\n environment = \"homol\",\n channel = \"form\",\n showHeader = true,\n title = \"Atendimento por mensagem\",\n subtitle = \"Informe seus dados e retornaremos a mensagem.\",\n backgroundColor = theme.colors.gray180,\n textColor = theme.colors.black,\n buttonBackgroundColor = theme.colors.yellow500,\n buttonTextColor = theme.colors.black,\n innerPadding = \"1rem\",\n inputBackgroundColor = theme.colors.white,\n inputBorderColor = theme.colors.transparent,\n inputFocusBorderColor = theme.colors.yellow500,\n inputPlaceholderColor = theme.colors.gray100,\n inputTextColor = theme.colors.black,\n showContactPreference = false,\n idProdutoTerceiro,\n idEmpreendimento,\n naoCriarEvento,\n onSuccess,\n onError,\n}, ref) => {\n // Carregar fonte Montserrat automaticamente\n useMontserratFont();\n\n const [loading, setIsLoading] = useState(false);\n const { error, handleError, clearError } = useError();\n const [successMessage, setSuccessMessage] = useState('');\n const [formKey, setFormKey] = useState(0);\n const [selectedProductId, setSelectedProductId] = useState<number | null>(null);\n const [actionModal, setActionModal] = useState<ActionModalState | null>(null);\n\n // Validação do array de produtos\n const validateProducts = (): string | null => {\n if (!products) {\n return \"Lista de produtos não foi fornecida\";\n }\n\n if (!Array.isArray(products)) {\n return \"Lista de produtos deve ser um array\";\n }\n\n if (products.length === 0) {\n return \"Lista de produtos não pode estar vazia\";\n }\n\n // Validar cada produto no array\n for (let i = 0; i < products.length; i++) {\n const product = products[i];\n\n if (!product) {\n return `Produto na posição ${i} é inválido (nulo/undefined)`;\n }\n\n if (typeof product.id !== 'number' || product.id <= 0) {\n return `Produto na posição ${i} possui ID inválido (deve ser um número positivo)`;\n }\n\n if (typeof product.name !== 'string' || product.name.trim().length === 0) {\n return `Produto na posição ${i} possui nome inválido (deve ser uma string não vazia)`;\n }\n }\n\n return null;\n };\n\n const env = resolveEnvironment(environment);\n\n const validateEnvironmentConfig = (): string | null => {\n if (!env) {\n return `environment='${environment}' não é reconhecido. Use 'homol' ou 'prod'.`;\n }\n if (!env.apiUrl || !env.apiToken) {\n return `Configuração interna do environment '${environment}' está incompleta (apiUrl/apiToken).`;\n }\n return null;\n };\n\n const validateWhatsappConfig = (): string | null => {\n if (channel !== \"whatsapp\") return null;\n if (!env) return null;\n const raw = env.whatsappPhone?.trim() ?? \"\";\n if (!raw) {\n return `channel='whatsapp' exige whatsappPhone no environment '${environment}'.`;\n }\n const normalized = raw.startsWith(\"+\") ? raw : `+${raw}`;\n if (!isPhoneValid(normalized)) {\n return `whatsappPhone do environment '${environment}' é inválido (${JSON.stringify(env.whatsappPhone)}).`;\n }\n return null;\n };\n\n const validateChatConfig = (): string | null => {\n if (channel !== \"chat\") return null;\n if (!env) return null;\n const raw = env.chatUrl?.trim() ?? \"\";\n if (!raw) {\n return `channel='chat' exige chatUrl no environment '${environment}'.`;\n }\n try {\n const parsed = new URL(raw);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return `chatUrl do environment '${environment}' precisa ter protocolo http(s) (recebido: ${JSON.stringify(env.chatUrl)}).`;\n }\n } catch {\n return `chatUrl do environment '${environment}' não é URL absoluta válida (recebido: ${JSON.stringify(env.chatUrl)}).`;\n }\n return null;\n };\n\n const productsValidationError = validateProducts();\n const environmentConfigError = validateEnvironmentConfig();\n const whatsappConfigError = validateWhatsappConfig();\n const chatConfigError = validateChatConfig();\n // Em channel === \"whatsapp\" a preferência já é implícita (Whatsapp); em channel === \"chat\"\n // o legado não tinha esse campo. Em ambos o select é ocultado mesmo que o consumidor\n // tenha passado showContactPreference={true}.\n const effectiveShowContactPreference =\n channel === \"whatsapp\" || channel === \"chat\" ? false : showContactPreference;\n // Override forte de título e subtítulo nos canais de atendimento direto.\n const effectiveTitle =\n channel === \"whatsapp\" ? WHATSAPP_TITLE : channel === \"chat\" ? CHAT_TITLE : title;\n const effectiveSubtitle =\n channel === \"whatsapp\"\n ? WHATSAPP_SUBTITLE\n : channel === \"chat\"\n ? CHAT_SUBTITLE\n : subtitle;\n\n // UTM resolved inside the component (URL > localStorage (7d TTL) > referrer)\n const [utm, setUtm] = useState<UTM>({ utm_source: 'direto', createdAt: new Date().toISOString() });\n\n // Usar schema com productId se houver mais de 1 produto\n const formSchema = products && products.length > 1 ? schemaWithProduct : schema;\n\n const { control, register, handleSubmit, formState: { errors }, reset, clearErrors } = useForm<{\n name: string;\n email: string;\n phone: { phone: string; inputValue: string; dialCode: string; };\n productId?: string;\n preferencia_contato?: string;\n }>({\n resolver: yupResolver(formSchema),\n mode: 'onSubmit',\n });\n\n React.useEffect(() => {\n if (!isBrowser()) return;\n const { data } = resolveUtmWithPriority(new Date());\n setUtm(data);\n }, []);\n\n const resetForm = () => {\n const resetData: any = {\n name: \"\",\n email: \"\",\n phone: { phone: \"\", inputValue: \"\", dialCode: \"\" },\n };\n\n // Incluir productId no reset se houver mais de 1 produto\n if (products && products.length > 1) {\n resetData.productId = \"\";\n setSelectedProductId(null);\n }\n\n reset(resetData, {\n keepErrors: false,\n keepDirty: false,\n keepTouched: false,\n keepIsSubmitted: false,\n keepSubmitCount: false,\n keepValues: false,\n keepDefaultValues: false,\n });\n clearErrors();\n setFormKey(k => k + 1); // Force remount\n };\n\n const sendMessage: SubmitHandler<{\n name: string;\n email: string;\n phone: { phone: string; inputValue: string; dialCode: string; };\n productId?: string;\n preferencia_contato?: string;\n }> = async (data) => {\n const { name, email, phone, productId, preferencia_contato } = data;\n\n const phoneValue = phone.inputValue;\n const phoneDigitsOnly = phoneValue?.replace(/\\D/g, '') || '';\n\n const message = \"Gostaria de mais informações sobre o produto\";\n\n setActionModal(null);\n\n // Aba pré-aberta para Camada 1 (anti popup blocker). Aberta ANTES do\n // `await fetch`, ainda dentro do gesto do submit, para que browsers\n // permissivos (~70%) consigam o auto-redirect. Se o browser bloqueou,\n // `preOpenedTab` vem null e o modal de fallback assume.\n let preOpenedTab: Window | null = null;\n\n try {\n setIsLoading(true);\n\n // env é garantido não-nulo aqui: validateEnvironmentConfig roda em render-time\n // e bloqueia a UI antes de chegarmos no submit caso o config esteja inválido.\n if (!env) {\n throw new Error(\"Environment não resolvido\");\n }\n\n if (!products || products.length === 0) {\n throw new Error(\"Parâmetros obrigatórios não informados\");\n }\n\n // Determinar qual produto usar\n let selectedProduct: Product;\n\n if (products.length === 1) {\n // Se há apenas 1 produto, usar ele\n selectedProduct = products[0];\n } else {\n // Se há múltiplos produtos, usar o selecionado\n if (!productId) {\n throw new Error(\"Produto deve ser selecionado\");\n }\n const foundProduct = products.find(p => p.id.toString() === productId);\n if (!foundProduct) {\n throw new Error(\"Produto selecionado não encontrado\");\n }\n selectedProduct = foundProduct;\n }\n\n const paginaAtual =\n typeof window !== \"undefined\" ? window.location.href : undefined;\n\n // Default `true` em chat/whatsapp para paridade com o atendimento.html,\n // que sempre enviava o hidden `naoCriarEvento=true`. Override via prop.\n const naoCriarEventoEfetivo =\n channel !== \"form\" && (naoCriarEvento ?? true);\n\n const requestBody: RequestBody = {\n name,\n email,\n phone: phoneDigitsOnly,\n message,\n productId: selectedProduct.id.toString(),\n utm_source: utm.utm_source,\n utm_campaign: utm.utm_campaign,\n utm_medium: utm.utm_medium,\n utm_term: utm.utm_term,\n ...(channel === \"whatsapp\"\n ? { preferencia_contato: ContactPreference.Whatsapp }\n : effectiveShowContactPreference && preferencia_contato\n ? { preferencia_contato }\n : {}),\n ...(channel !== \"form\"\n ? {\n channel,\n ...(paginaAtual ? { pagina: paginaAtual } : {}),\n // Paridade com atendimento.html legado: o mesmo <form id=\"chat-form\">\n // era usado para chat e whatsapp, portanto is_chat=true ia em ambos.\n is_chat: true,\n ...(idProdutoTerceiro !== undefined ? { idProdutoTerceiro } : {}),\n ...(idEmpreendimento !== undefined ? { idEmpreendimento } : {}),\n ...(naoCriarEventoEfetivo ? { naoCriarEvento: true } : {}),\n }\n : {}),\n };\n\n // Camada 1: pré-abrir a nova aba ainda dentro do gesto do submit, antes\n // de qualquer await. Se o browser bloquear, `preOpenedTab` será null e\n // o usuário vai recorrer ao botão de fallback do modal.\n if (channel !== \"form\" && typeof window !== \"undefined\") {\n preOpenedTab = window.open(\"about:blank\", \"_blank\");\n if (isTabAlive(preOpenedTab)) {\n writeStatusHtmlToTab(preOpenedTab, \"processing\", channel);\n }\n }\n\n const response = await fetch(`${env.apiUrl}/leads`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${env.apiToken}`,\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n throw new Error(\"Falha ao enviar a mensagem!\");\n }\n\n const responseData = await response.json();\n const leadId = responseData.leadId || responseData.id || '';\n\n resetForm();\n onSuccess?.(requestBody, leadId);\n\n if (channel === \"whatsapp\") {\n const targetUrl = buildWhatsappUrl(env.whatsappPhone);\n // Modal aparece na aba original. Aba pré-aberta troca para a fase\n // \"success\" (Cadastro realizado! + Abrindo WhatsApp em instantes...).\n // Redirect ocorre após REDIRECT_DELAY_MS para o usuário ver a\n // confirmação na aba onde o foco está.\n setActionModal({\n kind: \"success\",\n channel: \"whatsapp\",\n targetUrl,\n });\n if (isTabAlive(preOpenedTab)) {\n writeStatusHtmlToTab(preOpenedTab, \"success\", \"whatsapp\");\n const tabToNavigate = preOpenedTab;\n setTimeout(() => {\n if (isTabAlive(tabToNavigate)) {\n navigateTabToWhatsapp(tabToNavigate, targetUrl);\n }\n }, REDIRECT_DELAY_MS);\n }\n } else if (channel === \"chat\") {\n const virtualObj: Record<string, unknown> = {\n ...requestBody,\n externalOriginId: leadId,\n ...(paginaAtual ? { pagina: paginaAtual } : {}),\n ...(idProdutoTerceiro !== undefined ? { idProdutoTerceiro } : {}),\n ...(idEmpreendimento !== undefined ? { idEmpreendimento } : {}),\n ...(naoCriarEventoEfetivo ? { naoCriarEvento: true } : {}),\n };\n setActionModal({\n kind: \"success\",\n channel: \"chat\",\n chatUrl: env.chatUrl,\n virtualObj,\n });\n if (isTabAlive(preOpenedTab)) {\n writeStatusHtmlToTab(preOpenedTab, \"success\", \"chat\");\n const tabToSubmit = preOpenedTab;\n const chatUrlSnapshot = env.chatUrl;\n setTimeout(() => {\n if (isTabAlive(tabToSubmit)) {\n submitChatInPreOpenedTab(tabToSubmit, chatUrlSnapshot, virtualObj);\n }\n }, REDIRECT_DELAY_MS);\n }\n } else {\n setSuccessMessage(\"Mensagem enviada com sucesso!\");\n }\n } catch (err) {\n // Fecha aba pré-aberta para não deixar about:blank órfão na falha.\n if (isTabAlive(preOpenedTab)) {\n preOpenedTab.close();\n }\n const error = err instanceof Error ? err : new Error(\"Erro desconhecido\");\n if (channel === \"whatsapp\" || channel === \"chat\") {\n setActionModal({ kind: \"error\" });\n } else {\n handleError(err);\n }\n onError?.(error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Se houver erro de configuração (produtos, environment, channel whatsapp ou channel chat),\n // renderizar erro no lugar do formulário\n if (productsValidationError || environmentConfigError || whatsappConfigError || chatConfigError) {\n if (productsValidationError) {\n console.error('Erro na validação dos produtos:', productsValidationError);\n }\n if (environmentConfigError) {\n console.error('Erro na validação do environment:', environmentConfigError);\n }\n if (whatsappConfigError) {\n console.error('Erro na validação do channel whatsapp:', whatsappConfigError);\n }\n if (chatConfigError) {\n console.error('Erro na validação do channel chat:', chatConfigError);\n }\n\n return (\n <FormContainer $backgroundColor={backgroundColor} $innerPadding={innerPadding} ref={ref}>\n <HeaderContainer>\n <Title $textColor={textColor}>Erro no carregamento do formulário!</Title>\n <Subtitle $textColor={textColor}>\n Não foi possível carregar o formulário. Tente novamente mais tarde.\n </Subtitle>\n </HeaderContainer>\n </FormContainer>\n );\n }\n\n return (\n <>\n {error && (\n <Alert\n type=\"error\"\n dismissible\n onDismiss={clearError}\n autoDismiss={5000}\n >\n {error!.message}\n </Alert>\n )}\n\n {successMessage && (\n <Alert\n type=\"success\"\n dismissible\n onDismiss={() => setSuccessMessage('')}\n autoDismiss={5000}\n >\n {successMessage}\n </Alert>\n )}\n\n {actionModal?.kind === \"error\" && (\n <Modal\n type=\"error\"\n title={MODAL_ERROR_TITLE}\n message={MODAL_ERROR_MESSAGE}\n primaryButtonText={MODAL_ERROR_BUTTON_TEXT}\n onPrimaryAction={() => setActionModal(null)}\n onClose={() => setActionModal(null)}\n primaryButtonBgColor={buttonBackgroundColor}\n primaryButtonTextColor={buttonTextColor}\n />\n )}\n\n {actionModal?.kind === \"success\" && actionModal.channel === \"whatsapp\" && (\n <Modal\n type=\"success\"\n title={MODAL_SUCCESS_TITLE}\n message={MODAL_SUCCESS_AUTO_REDIRECT_WHATSAPP}\n primaryButtonText={MODAL_SUCCESS_OK_BUTTON_TEXT}\n onPrimaryAction={() => setActionModal(null)}\n onClose={() => setActionModal(null)}\n primaryButtonBgColor={buttonBackgroundColor}\n primaryButtonTextColor={buttonTextColor}\n secondaryText={MODAL_SUCCESS_FALLBACK_INSTRUCTION}\n secondaryButtonText={MODAL_SUCCESS_BUTTON_WHATSAPP}\n onSecondaryAction={() => {\n window.open(actionModal.targetUrl, \"_blank\", \"noopener,noreferrer\");\n setActionModal(null);\n }}\n />\n )}\n\n {actionModal?.kind === \"success\" && actionModal.channel === \"chat\" && (\n <Modal\n type=\"success\"\n title={MODAL_SUCCESS_TITLE}\n message={MODAL_SUCCESS_AUTO_REDIRECT_CHAT}\n primaryButtonText={MODAL_SUCCESS_OK_BUTTON_TEXT}\n onPrimaryAction={() => setActionModal(null)}\n onClose={() => setActionModal(null)}\n primaryButtonBgColor={buttonBackgroundColor}\n primaryButtonTextColor={buttonTextColor}\n secondaryText={MODAL_SUCCESS_FALLBACK_INSTRUCTION}\n secondaryButtonText={MODAL_SUCCESS_BUTTON_CHAT}\n onSecondaryAction={() => {\n submitChatInNewTab(actionModal.chatUrl, actionModal.virtualObj);\n setActionModal(null);\n }}\n />\n )}\n\n <FormContainer $backgroundColor={backgroundColor} $innerPadding={innerPadding} ref={ref} >\n {showHeader &&\n <HeaderContainer>\n <Title $textColor={textColor}>{effectiveTitle}</Title>\n\n <Subtitle $textColor={textColor}>{effectiveSubtitle}</Subtitle>\n </HeaderContainer>\n }\n\n <Form $textColor={textColor} onSubmit={handleSubmit(sendMessage)} noValidate>\n {products.length > 1 && (\n <ProductSelect\n id=\"productId\"\n label=\"Produto de interesse *\"\n placeholder=\"Selecione um produto\"\n {...register(\"productId\")}\n error={errors.productId?.message}\n products={products}\n required\n labelTextColor={textColor}\n backgroundColor={inputBackgroundColor}\n borderColor={inputBorderColor}\n focusBorderColor={inputFocusBorderColor}\n textColor={inputTextColor}\n />\n )}\n\n <Input\n id=\"name\"\n label=\"Nome *\"\n placeholder=\"Digite seu nome\"\n {...register(\"name\")}\n error={errors.name?.message}\n autoComplete=\"name\"\n required\n labelTextColor={textColor}\n backgroundColor={inputBackgroundColor}\n borderColor={inputBorderColor}\n focusBorderColor={inputFocusBorderColor}\n inputPlaceholderColor={inputPlaceholderColor}\n inputTextColor={inputTextColor}\n />\n\n <Input\n id=\"email\"\n label=\"Email *\"\n type=\"email\"\n placeholder=\"exemplo@email.com\"\n {...register(\"email\")}\n error={errors.email?.message}\n autoComplete=\"email\"\n required\n labelTextColor={textColor}\n backgroundColor={inputBackgroundColor}\n borderColor={inputBorderColor}\n focusBorderColor={inputFocusBorderColor}\n inputPlaceholderColor={inputPlaceholderColor}\n inputTextColor={inputTextColor}\n />\n\n <Controller\n key={formKey}\n name=\"phone\"\n control={control}\n defaultValue={{ phone: \"\", inputValue: \"\", dialCode: \"\" }}\n shouldUnregister={true}\n render={({ field }) => {\n const errorMsg =\n errors.phone?.inputValue?.message ||\n errors.phone?.phone?.message ||\n errors.phone?.message;\n\n return (\n <PhoneInput\n id=\"phone\"\n label=\"Telefone *\"\n placeholder=\"(11) 00000-0000\"\n error={errorMsg}\n required\n value={field.value.phone}\n onChange={field.onChange}\n name={field.name}\n labelTextColor={textColor}\n backgroundColor={inputBackgroundColor}\n borderColor={inputBorderColor}\n focusBorderColor={inputFocusBorderColor}\n inputPlaceholderColor={inputPlaceholderColor}\n inputTextColor={inputTextColor}\n />\n );\n }}\n />\n\n {effectiveShowContactPreference && (\n <FormControl isInvalid={!!errors.preferencia_contato}>\n <FormLabel htmlFor=\"preferencia_contato\" $textColor={textColor}>\n Preferência de Contato\n </FormLabel>\n <FormSelect\n id=\"preferencia_contato\"\n {...register(\"preferencia_contato\")}\n defaultValue=\"\"\n $backgroundColor={inputBackgroundColor}\n $borderColor={inputBorderColor}\n $focusBorderColor={inputFocusBorderColor}\n $textColor={inputTextColor}\n >\n <option value=\"\" disabled>Selecione uma opção</option>\n {Object.values(ContactPreference).map((op) => (\n <option key={op} value={op}>{op}</option>\n ))}\n </FormSelect>\n {errors.preferencia_contato && (\n <FormErrorMessage>{errors.preferencia_contato.message}</FormErrorMessage>\n )}\n </FormControl>\n )}\n\n <h6>* Campos de preenchimento obrigatório.</h6>\n\n <ButtonContainer>\n <Button bgColor={buttonBackgroundColor} color={buttonTextColor} type=\"submit\" isSubmitting={loading}>\n {channel === \"whatsapp\"\n ? WHATSAPP_BUTTON_TEXT\n : channel === \"chat\"\n ? CHAT_BUTTON_TEXT\n : \"Enviar mensagem\"}\n </Button>\n </ButtonContainer>\n\n <p>A Mitre Realty respeita a sua privacidade e utiliza os seus dados pessoais para contatá-lo por e-mail ou telefone aqui registrados. Para saber mais, acesse a nossa{' '}\n <a\n href=\"https://www.mitrerealty.com.br/politica-de-privacidade\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Política de Privacidade\n </a>. Ao clicar em {'\"'}enviar{'\"'}, você concorda em permitir que a Mitre Realty, armazene e processe os dados pessoais fornecidos por você para finalidade informada</p>\n\n </Form>\n </FormContainer>\n </>\n );\n});\n\nMitreFormComponent.displayName = \"MitreFormComponent\";\n\nexport default MitreFormComponent;\n","import { useState } from \"react\";\n\nexport function useError() {\n const [error, setError] = useState<Error | null>(null);\n\n const handleError = (err: unknown) => {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n console.error(errorObj);\n };\n\n const clearError = () => setError(null);\n\n return { error, handleError, clearError };\n}\n","export type UTM = {\n utm_source: string; // default 'direto'\n utm_campaign?: string;\n utm_medium?: string;\n utm_term?: string;\n createdAt: string; // ISO 8601\n };\n \n const UTM_STORAGE_KEY = 'utm_meta';\n const TTL_DAYS = 7;\n \n export const isBrowser = () =>\n typeof window !== 'undefined' && typeof document !== 'undefined';\n \n const daysToMs = (days: number) => days * 24 * 60 * 60 * 1000;\n \n export function readStoredUtm(maxAgeDays = TTL_DAYS): { data: UTM | null; isValid: boolean } {\n if (!isBrowser()) return { data: null, isValid: false };\n try {\n const raw = window.localStorage.getItem(UTM_STORAGE_KEY);\n if (!raw) return { data: null, isValid: false };\n const parsed = JSON.parse(raw) as UTM;\n if (!parsed?.createdAt) return { data: null, isValid: false };\n const age = Date.now() - new Date(parsed.createdAt).getTime();\n const isValid = age <= daysToMs(maxAgeDays);\n return { data: isValid ? parsed : null, isValid };\n } catch {\n return { data: null, isValid: false };\n }\n }\n \n export function saveUtm(data: Partial<UTM>, now = new Date()): UTM | null {\n if (!isBrowser()) return null;\n const payload: UTM = {\n utm_source: data.utm_source || 'direto',\n utm_campaign: data.utm_campaign,\n utm_medium: data.utm_medium,\n utm_term: data.utm_term,\n createdAt: now.toISOString(),\n };\n try {\n window.localStorage.setItem(UTM_STORAGE_KEY, JSON.stringify(payload));\n } catch { /* ignore quota errors */ }\n return payload;\n }\n \n export function parseUrlUtm(loc?: Location): Partial<UTM> {\n if (!isBrowser()) return {};\n const locationObj = loc || window.location;\n const sp = new URL(locationObj.href).searchParams;\n const utm_source = sp.get('utm_source') || undefined;\n const utm_campaign = sp.get('utm_campaign') || undefined;\n const utm_medium = sp.get('utm_medium') || undefined;\n const utm_term = sp.get('utm_term') || undefined;\n return { utm_source, utm_campaign, utm_medium, utm_term };\n }\n \n export function inferSourceFromReferrer(ref?: string): string | undefined {\n if (!isBrowser()) return undefined;\n const href = (ref ?? document.referrer ?? '').toLowerCase();\n if (!href) return 'direto';\n const hostMatch = href.match(/https?:\\/\\/([^/]+)/);\n const host = hostMatch?.[1] ?? href;\n if (/google\\./.test(host) || /^g\\.co$/.test(host) || /^goo\\.gl$/.test(host)) return 'google';\n\n if (\n /(^|\\.)facebook\\.com$/.test(host) ||\n /(^|\\.)m\\.facebook\\.com$/.test(host) ||\n /(^|\\.)fb\\.com$/.test(host) ||\n /(^|\\.)fb\\.me$/.test(host) ||\n /(^|\\.)fb\\.watch$/.test(host) ||\n /(^|\\.)m\\.me$/.test(host)\n ) return 'facebook';\n\n if (\n /(^|\\.)instagram\\.com$/.test(host) ||\n /(^|\\.)l\\.instagram\\.com$/.test(host) ||\n /(^|\\.)instagr\\.am$/.test(host) ||\n /^ig\\.me$/.test(host)\n ) return 'instagram';\n\n if (/(^|\\.)linkedin\\.com$/.test(host) || /^lnkd\\.in$/.test(host)) return 'linkedin';\n\n if (/^t\\.co$/.test(host) || /(^|\\.)twitter\\.com$/.test(host) || /(^|\\.)x\\.com$/.test(host)) return 'twitter';\n\n if (/(^|\\.)youtube\\.com$/.test(host) || /^youtu\\.be$/.test(host)) return 'youtube';\n\n if (/(^|\\.)mail\\.google\\.com$/.test(host)) return 'email';\n\n if (/(^|\\.)outlook\\.live\\.com$/.test(host) || /(^|\\.)outlook\\.office\\.com$/.test(host)) return 'email';\n\n if (/^(wa\\.me)$/.test(host) || /(^|\\.)api\\.whatsapp\\.com$/.test(host) || /(^|\\.)web\\.whatsapp\\.com$/.test(host)) return 'whatsapp';\n\n if (/^t\\.me$/.test(host)) return 'telegram';\n\n if (/(^|\\.)tiktok\\.com$/.test(host)) return 'tiktok';\n return 'direto';\n }\n \n /** Resolve UTM e persiste quando necessário. Prioridade: localStorage (válido) > URL > referrer */\n export function resolveUtmWithPriority(\n now = new Date(),\n propOverride?: Partial<UTM>\n ): { data: UTM; source: 'localStorage' | 'url' | 'referrer' } {\n // 1) Se houver UTM válido no localStorage (<= 7 dias), usar SEM sobrescrever\n const stored = readStoredUtm();\n if (stored.data) {\n const merged = { ...stored.data, ...propOverride } as UTM;\n return { data: merged, source: 'localStorage' };\n }\n \n // 2) Se NÃO houver válido no localStorage, tentar URL. Se houver, salvar e usar\n const fromUrl = parseUrlUtm();\n if (fromUrl.utm_source) {\n const saved = saveUtm(fromUrl, now)!;\n const merged = { ...saved, ...propOverride } as UTM;\n return { data: merged, source: 'url' };\n }\n \n // 3) Fallback: inferir do referrer, apenas ler (não salvar no localStorage)\n const utm_source = inferSourceFromReferrer();\n const payload: UTM = {\n utm_source: utm_source || 'direto',\n utm_campaign: propOverride?.utm_campaign,\n utm_medium: propOverride?.utm_medium,\n utm_term: propOverride?.utm_term,\n createdAt: now.toISOString(),\n };\n return { data: payload, source: 'referrer' };\n }","type directionType = \"column\" | \"row\";\ntype alignItemsType = \"center\" | \"flex-start\";\n\ntype jutifyContentType = \"center\" | \"space-between\";\n\nexport function flex(\n direction: directionType = \"row\",\n alignItems?: alignItemsType,\n justifyContent?: jutifyContentType\n) {\n return `\n align-items:${alignItems || null};\n display:flex;\n flex-direction:${direction};\n justify-content:${justifyContent || null};\n `;\n}\n\nexport const alignX = `\n left:50%;\n transform:translateX(-50%);\n`;\n\nexport const alignXAndY = `\n left:50%;\n top:50%;\n transform:translate(-50%, -50%);\n`;\n\nexport const darkEffect = `\n &:hover {\n cursor:pointer;\n filter:brightness(98%);\n }\n\n &:active {\n filter:brightness(95%);\n }\n`;\n\nexport const opacityEffect = `\n &:hover {\n cursor:pointer;\n opacity:.9;\n }\n\n &:active {\n opacity:.7;\n }\n`;\n\nexport const modalZIndex = 9999;\n\nexport const breakpoints = {\n tablet: \"1024px\",\n};\n","import { flex, opacityEffect } from \"../styles/utils\";\nimport styled from \"styled-components\";\nimport { theme } from \"../styles/theme\";\n\nexport const FormContainer = styled.div<{\n $backgroundColor: string;\n $innerPadding: string;\n}>`\n ${flex(\"column\")}\n align-items: stretch;\n justify-content: flex-start;\n overflow-x: hidden;\n overflow-y: auto;\n\n background: ${(props) => props.$backgroundColor || theme.colors.gray180};\n\n padding: ${(props) => props.$innerPadding || \"1rem\"};\n\n /* Adaptar ao container pai */\n height: 100%;\n width: 100%;\n\n /* Reset CSS isolado */\n * {\n box-sizing: border-box;\n }\n\n /* Fonte aplicada apenas ao componente */\n font-family: ${theme.fonts.primary};\n\n /* Estilos necessários apenas neste escopo */\n button {\n cursor: pointer;\n font-family: ${theme.fonts.primary};\n }\n\n input, textarea, select {\n font-family: ${theme.fonts.primary};\n }\n\n [disabled] {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n /* Hide scrollbars for WebKit browsers */\n ::-webkit-scrollbar {\n display: none;\n }\n\n /* Hide scrollbars for Firefox */\n scrollbar-width: none;\n\n box-sizing: border-box;\n`;\n\nexport const HeaderContainer = styled.div`\n margin-bottom: 1rem;\n`;\n\nexport const ButtonContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n margin-top: 0.75rem;\n\n button {\n ${opacityEffect}\n color: ${theme.colors.black};\n font-weight: 600;\n border: none;\n border-radius: 8px;\n width: 60%;\n margin-top: 10px;\n margin-bottom: 10px;\n }\n`;\n\nexport const Form = styled.form<{ $textColor: string }>`\n label {\n font-weight: 700;\n }\n\n input {\n margin-bottom: 0.75rem;\n }\n\n p {\n font-family: ${theme.fonts.primary};\n font-style: italic;\n font-weight: 200;\n font-size: 0.8rem;\n color: ${(props) => props.$textColor || theme.colors.black};\n text-align: start;\n }\n\n a {\n font-family: ${theme.fonts.primary};\n font-style: italic;\n font-weight: 200;\n font-size: 0.8rem;\n color: ${(props) => props.$textColor || theme.colors.black};\n }\n\n h6 {\n text-align: start;\n margin-left: 10px;\n color: ${(props) => props.$textColor || theme.colors.black};\n font-weight: 600;\n }\n\n & > div {\n margin-bottom: 10px;,\n }\n`;\n\nexport const Title = styled.h2<{ $textColor: string }>`\n font-size: 1.25rem;\n font-weight: 700;\n line-height: 24px;\n letter-spacing: 0em;\n color: ${(props) => props.$textColor || theme.colors.black};\n`;\n\nexport const Subtitle = styled.p<{ $textColor: string }>`\n font-size: 1rem;\n font-weight: 400;\n line-height: 23px;\n letter-spacing: 0em;\n margin-top: 10px;\n color: ${(props) => props.$textColor || theme.colors.black};\n`;\n","/**\n * Sistema de tema isolado para o componente\n * Substitui as variáveis CSS globais para evitar conflitos em projetos host\n */\n\nexport const theme = {\n colors: {\n // Cores principais\n red: '#e52e4d',\n white: '#FFF',\n black: '#2F2F2F',\n black2: '#1E1E1E',\n black3: '#353535',\n alphaBlack: '#000000',\n \n // Amarelos\n yellow400: '#FFD789',\n yellow500: '#F6C76B',\n \n // Cinzas\n gray40: '#F0F0F0',\n gray45: '#767676',\n gray50: '#686A69',\n gray60: '#8F8F8F',\n gray100: '#B6B6B6',\n gray150: '#B9B9B9',\n gray180: '#CECECE',\n gray200: '#D2D2D2',\n gray300: '#EBEBEB',\n gray400: '#ECECEC',\n gray500: '#F4F4F4',\n gray550: '#6F6F6F',\n gray600: '#686868',\n gray700: '#535353',\n gray800: '#9D9D9D',\n \n // Verdes\n green: '#57C06E',\n green2: '#2DCE68',\n \n // Azul\n blue: '#007BFF',\n \n // Transparente\n transparent: 'transparent',\n },\n \n shadows: {\n shadow500: '0px 4px 8px rgba(91, 91, 91, 0.2)',\n },\n \n fonts: {\n primary: '\"Montserrat\", sans-serif',\n },\n} as const;\n\nexport type Theme = typeof theme;\n","import { SelectHTMLAttributes } from \"react\";\nimport styled, { css } from \"styled-components\";\nimport { theme } from \"../styles/theme\";\n\nexport const FormLabel = styled.label<{ $textColor?: string }>`\n font-family: ${theme.fonts.primary};\n font-style: normal;\n font-weight: 500;\n font-size: 1rem;\n color: ${(props) => props.$textColor || theme.colors.black};\n display: block;\n margin-bottom: 0.5rem;\n text-align: left;\n`;\n\nexport const Select = styled.select<\n SelectHTMLAttributes<HTMLSelectElement> & { \n $backgroundColor?: string, \n $borderColor?: string, \n $focusBorderColor?: string, \n $textColor?: string,\n }\n>`\n font-family: ${theme.fonts.primary};\n font-style: normal;\n font-weight: 500;\n font-size: 1rem;\n line-height: 1.5rem;\n background: ${(props) => props.$backgroundColor || theme.colors.white};\n color: ${(props) => props.$textColor || theme.colors.black};\n padding: 0.5rem 3rem 0.5rem 0.5rem; /* Aumentado padding-right para 3rem */\n border-radius: 0.125rem;\n border: 1px solid ${(props) => props.$borderColor || theme.colors.transparent};\n display: block;\n height: 3.125rem;\n width: 100%;\n cursor: pointer;\n \n /* Remover a seta padrão do navegador */\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n \n /* Adicionar seta personalizada maior */\n background-image: url(\"data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6,9 12,15 18,9'%3e%3c/polyline%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right 1rem center; /* Posicionado a 1rem da direita */\n background-size: 1.25rem; /* Tamanho da seta aumentado para 1.25rem */\n\n &:focus {\n border-radius: 0.125rem;\n border: 2px solid ${(props) => props.$focusBorderColor || theme.colors.yellow500};\n outline: none;\n }\n\n /* Estilo para option disabled (placeholder) */\n option:disabled {\n color: ${theme.colors.gray100};\n font-weight: 800;\n }\n\n /* Estilo para options normais */\n option:not(:disabled) {\n color: ${(props) => props.$textColor || theme.colors.black};\n font-weight: 500;\n }\n`;\n\nexport const FormErrorMessage = styled.small`\n font-size: 0.75rem;\n line-height: 1.125rem;\n color: ${theme.colors.red};\n margin-top: 0.25rem;\n display: block;\n`;\n\nexport const FormControl = styled.div.withConfig({\n shouldForwardProp: (prop) => ![\"isInvalid\"].includes(prop),\n})<{ isInvalid?: boolean }>`\n ${FormLabel} {\n ${(props) =>\n props.isInvalid &&\n css`\n color: ${theme.colors.red};\n `};\n }\n\n ${Select} {\n ${(props) =>\n props.isInvalid &&\n css`\n border: 1px solid ${theme.colors.red};\n `};\n\n &:focus {\n ${(props) =>\n props.isInvalid &&\n css`\n border: 1px solid ${theme.colors.red};\n `};\n }\n }\n`;\n","import { useEffect } from 'react';\n\n/**\n * Hook para carregar a fonte Montserrat de forma isolada\n * Garante que o componente funcione independentemente do projeto host\n */\nexport const useMontserratFont = () => {\n useEffect(() => {\n // Verificar se já existe um link para a fonte Montserrat adicionado por este componente\n const existingLink = document.querySelector('link[data-mitre-form-font=\"montserrat\"]');\n \n if (!existingLink) {\n // Criar e adicionar o link para a fonte Montserrat\n const link = document.createElement('link');\n link.rel = 'preconnect';\n link.href = 'https://fonts.googleapis.com';\n document.head.appendChild(link);\n\n const link2 = document.createElement('link');\n link2.rel = 'preconnect';\n link2.href = 'https://fonts.gstatic.com';\n link2.crossOrigin = 'anonymous';\n document.head.appendChild(link2);\n\n const link3 = document.createElement('link');\n link3.rel = 'stylesheet';\n link3.href = 'https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700;800&display=swap';\n link3.dataset.mitreFormFont = 'montserrat';\n document.head.appendChild(link3);\n }\n\n // Nota: Intencionalmente NÃO removemos a fonte no cleanup\n // Uma vez carregada, ela pode ser usada por múltiplas instâncias do componente\n // e não causa conflitos por estar no head\n }, []);\n};\n","import {\n FormEvent,\n forwardRef,\n ForwardRefRenderFunction,\n InputHTMLAttributes,\n useCallback,\n} from \"react\";\nimport { FieldError } from \"react-hook-form\";\nimport { cep, cpf, currency, date } from \"./masks\";\n\nimport {\n FormControl,\n FormErrorMessage,\n FormLabel,\n Input as FormInput,\n} from \"./styles\";\n\ntype InputType =\n | \"text\"\n | \"email\"\n | \"password\"\n | \"number\"\n | \"tel\"\n | \"url\"\n | \"date\"\n | \"time\"\n | \"datetime-local\";\n\ninterface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n id: string;\n label?: string;\n error?: string | FieldError;\n showErrorMessage?: boolean;\n labelTextColor?: string;\n backgroundColor?: string;\n borderColor?: string;\n focusBorderColor?: string;\n inputTextColor?: string;\n inputPlaceholderColor?: string;\n mask?: \"cep\" | \"currency\" | \"cpf\" | \"phone\" | \"date\";\n type?: InputType;\n}\n\nconst InputBase: ForwardRefRenderFunction<HTMLInputElement, InputProps> = (\n { id,\n label,\n error,\n showErrorMessage = true,\n labelTextColor,\n backgroundColor,\n borderColor,\n focusBorderColor,\n inputPlaceholderColor,\n inputTextColor,\n mask = \"\",\n type = \"text\",\n ...rest\n },\n ref\n) => {\n const handleKeyUp = useCallback(\n (e: FormEvent<HTMLInputElement>) => {\n if (mask === \"cep\") cep(e);\n if (mask === \"currency\") currency(e);\n if (mask === \"cpf\") cpf(e);\n if (mask === \"date\") date(e);\n },\n [mask]\n );\n\n return (\n <FormControl isInvalid={!!error}>\n {!!label && <FormLabel htmlFor={id} $textColor={labelTextColor}>{label}</FormLabel>}\n\n {!mask ? (\n <FormInput\n id={id}\n ref={ref}\n type={type}\n aria-invalid={!!error && showErrorMessage ? \"true\" : \"false\"}\n autoComplete={rest.autoComplete || \"on\"}\n $backgroundColor={backgroundColor}\n $borderColor={borderColor}\n $focusBorderColor={focusBorderColor}\n $placeholderColor={inputPlaceholderColor}\n $textColor={inputTextColor}\n {...rest}\n />\n ) : (\n <FormInput\n id={id}\n ref={ref}\n type={type}\n aria-invalid={!!error && showErrorMessage ? \"true\" : \"false\"}\n autoComplete={rest.autoComplete || \"on\"}\n onKeyUp={handleKeyUp}\n $backgroundColor={backgroundColor}\n $borderColor={borderColor}\n $focusBorderColor={focusBorderColor}\n $placeholderColor={inputPlaceholderColor}\n $textColor={inputTextColor}\n {...rest}\n />\n )}\n\n {!!error && showErrorMessage && (\n <FormErrorMessage data-testid=\"error-message\">\n {typeof error === 'string' ? error : error.message}\n </FormErrorMessage>\n )}\n </FormControl>\n );\n};\n\nexport const Input = forwardRef(InputBase);\n","import { FormEvent } from \"react\";\n\nexport function cep(e: FormEvent<HTMLInputElement>) {\n e.currentTarget.maxLength = 9;\n let value = e.currentTarget.value;\n value = value.replace(/\\D/g, \"\");\n value = value.replace(/^(\\d{5})(\\d)/, \"$1-$2\");\n e.currentTarget.value = value;\n return e;\n}\n\nexport function currency(e: FormEvent<HTMLInputElement>) {\n let value = e.currentTarget.value;\n value = value.replace(/\\D/g, \"\");\n value = value.replace(/(\\d)(\\d{2})$/, \"$1,$2\");\n value = value.replace(/(?=(\\d{3})+(\\D))\\B/g, \".\");\n\n e.currentTarget.value = value;\n return e;\n}\n\nexport function cpf(e: FormEvent<HTMLInputElement>) {\n e.currentTarget.maxLength = 14;\n let value = e.currentTarget.value;\n if (!value.match(/^(\\d{3}).(\\d{3}).(\\d{3})-(\\d{2})$/)) {\n value = value.replace(/\\D/g, \"\");\n value = value.replace(/(\\d{3})(\\d)/, \"$1.$2\");\n value = value.replace(/(\\d{3})(\\d)/, \"$1.$2\");\n value = value.replace(/(\\d{3})(\\d{2})$/, \"$1-$2\");\n\n e.currentTarget.value = value;\n }\n return e;\n}\n\nexport function date(e: FormEvent<HTMLInputElement>) {\n let value = e.currentTarget.value;\n value = value.replace(/\\D/g, \"\");\n value = value.replace(/(\\d{2})(\\d)/, \"$1/$2\");\n value = value.replace(/(\\d{2})(\\d)/, \"$1/$2\");\n e.currentTarget.value = value;\n return e;\n}\n\nexport function phone(e: FormEvent<HTMLInputElement>) {\n let value = e.currentTarget.value;\n value = value.replace(/\\D/g, \"\");\n value = value.replace(/(\\d{2})(\\d)/, \"$1/$2\");\n value = value.replace(/(\\d{2})(\\d)/, \"$1/$2\");\n e.currentTarget.value = value;\n return e;\n}\n","import { InputHTMLAttributes } from \"react\";\nimport styled, { css } from \"styled-components\";\nimport { theme } from \"../styles/theme\";\n\nexport const FormLabel = styled.label<{ $textColor?: string }>`\n font-family: ${theme.fonts.primary};\n font-style: normal;\n font-weight: 500;\n font-size: 1rem;\n color: ${(props) => props.$textColor || theme.colors.black};\n display: block;\n margin-bottom: 0.5rem;\n text-align: left;\n`;\n\nexport const Input = styled.input<\n InputHTMLAttributes<HTMLInputElement> & { \n $backgroundColor?: string, \n $borderColor?: string, \n $focusBorderColor?: string, \n $placeholderColor?: string\n $textColor?: string,\n }\n>`\n font-family: ${theme.fonts.primary};\n font-style: normal;\n font-weight: 500;\n font-size: 1rem;\n line-height: 1.5rem;\n background: ${(props) => props.$backgroundColor || theme.colors.white};\n color: ${(props) => props.$textColor || theme.colors.black};\n padding: 0.5rem;\n border-radius: 0.125rem;\n border: 1px solid ${(props) => props.$borderColor || theme.colors.transparent};\n display: block;\n height: 3.125rem;\n width: 100%;\n\n &:focus {\n border-radius: 0.125rem;\n border: 2px solid ${(props) => props.$focusBorderColor || theme.colors.yellow500};\n outline: none;\n }\n\n &::placeholder {\n font-size: 1rem;\n line-height: 1.5rem;\n color: ${(props) => props.$placeholderColor || theme.colors.gray100};\n font-weight: 700;\n }\n\n /* Autofill styles */\n &:-webkit-autofill {\n background: ${(props) => props.$backgroundColor || theme.colors.white} !important;\n color: ${(props) => props.$textColor || theme.colors.black} !important;\n -webkit-text-fill-color: ${(props) => props.$textColor || theme.colors.black} !important;\n transition: background-color 5000s ease-in-out 0s; /* Prevent flashing */\n }\n\n &:-webkit-autofill::first-line {\n font-family: ${theme.fonts.primary};\n font-size: 1rem;\n font-weight: 500;\n }\n`;\n\nexport const FormErrorMessage = styled.small`\n font-size: 0.75rem;\n line-height: 1.125rem;\n color: ${theme.colors.red};\n margin-top: 0.25rem;\n display: block;\n`;\n\nexport const FormControl = styled.div.withConfig({\n shouldForwardProp: (prop) => ![\"isInvalid\"].includes(prop),\n})<{ isInvalid?: boolean }>`\n ${FormLabel} {\n ${(props) =>\n props.isInvalid &&\n css`\n color: ${theme.colors.red};\n `};\n }\n\n ${Input} {\n ${(props) =>\n props.isInvalid &&\n css`\n border: 1px solid ${theme.colors.red};\n\n &:not(:focus)::placeholder {\n color: ${theme.colors.red};\n font-weight: 600;\n }\n `};\n\n &:focus {\n ${(props) =>\n props.isInvalid &&\n css`\n border: 1px solid ${theme.colors.red};\n `};\n }\n }\n`;\n","import { darken } from \"polished\";\nimport styled, { css } from \"styled-components\";\nimport { theme } from \"../styles/theme\";\n\ntype ButtonProps = {\n hasIcon?: boolean;\n isSubmitting?: boolean;\n hasSubmittingMessage?: boolean;\n bgColor?: string;\n bordercolor?: string;\n color?: string;\n height?: string;\n};\n\nexport const Icon = styled.span`\n font-size: 0;\n line-height: 0;\n transition: all 0.25s ease;\n\n transform: translate3d(-30px, 0px, 0px);\n visibility: hidden;\n opacity: 0;\n margin-right: 0.625rem;\n`;\n\nexport const Text = styled.span`\n font-family: ${theme.fonts.primary};\n font-size: 1rem;\n line-height: 1.5rem;\n margin-bottom: -2px;\n\n transition: all 0.25s ease;\n`;\n\nexport const TextSubmitting = styled.span`\n font-family: ${theme.fonts.primary};\n font-weight: 400;\n font-size: 1rem;\n\n transition: all 0.25s ease;\n`;\n\nexport const LoadingIcon = styled.span.withConfig({\n shouldForwardProp: (prop) => prop !== \"hasText\",\n})<{ hasText?: boolean }>`\n display: block;\n\n width: 1rem;\n height: 1rem;\n border: 0.125rem solid ${theme.colors.white};\n border-radius: 50%;\n animation: loadingAnimation 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n border-color: ${theme.colors.white} transparent transparent transparent;\n\n margin-right: ${(props) => (props.hasText ? \"0.625rem\" : \"0\")};\n\n @keyframes loadingAnimation {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n`;\n\nexport const Button = styled.button.withConfig({\n shouldForwardProp: (prop) =>\n ![\n \"hasIcon\",\n \"isSubmitting\",\n \"hasSubmittingMessage\",\n \"bgColor\",\n \"bordercolor\",\n \"color\",\n \"height\",\n ].includes(prop),\n})<ButtonProps>`\n background: ${(props) => darken(0.1, props?.bgColor || \"#F6C76B\")};\n color: ${(props) => props?.color || \"#2F2F2F\"};\n border: 1px solid ${(props) => darken(0.1, props?.bordercolor || \"#F6C76B\")};\n border-radius: 2px;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0 0.75rem;\n height: ${(props) => props?.height || \"3.125rem\"};\n position: relative;\n font-size: 0;\n line-height: 0;\n\n transition: all 0.25s;\n\n ${Icon} {\n display: ${(props) => (props?.hasIcon ? \"block\" : \"\")};\n }\n\n ${Text} {\n transform: ${(props) =>\n props?.hasIcon ? \"translate3d(-4.5px, 0px, 0px)\" : \"unset\"};\n\n @media print, screen and (min-width: 40em) {\n transform: ${(props) =>\n props?.hasIcon ? \"translate3d(-14.5px, 0px, 0px)\" : \"unset\"};\n }\n\n color: ${(props) => props?.color || \"#2F2F2F\"};\n }\n\n &:hover {\n background: ${(props) => darken(0.2, props?.bgColor || \"#F6C76B\")};\n border-color: ${(props) => darken(0.2, props?.bordercolor || \"#F6C76B\")};\n\n ${Icon} {\n opacity: 1;\n visibility: visible;\n transform: translate3d(0px, 0px, 0px);\n }\n\n ${Text} {\n transform: ${(props) =>\n props?.hasIcon ? \"translate3d(-5px, 0px, 0px)\" : \"unset\"};\n }\n }\n\n ${Text} {\n ${(props) =>\n props.isSubmitting &&\n !props.hasSubmittingMessage &&\n css`\n transform: unset;\n opacity: 0;\n `}\n }\n\n ${LoadingIcon} {\n ${(props) =>\n props.isSubmitting &&\n !props.hasSubmittingMessage &&\n css`\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n position: absolute;\n `}\n }\n`;\n","import { ButtonHTMLAttributes, ReactElement, ReactNode } from \"react\";\n\nimport {\n Button as ButtonComponent,\n Icon,\n LoadingIcon,\n Text,\n TextSubmitting,\n} from \"./styles\";\n\ntype ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n children: ReactNode;\n icon?: ReactElement;\n isSubmitting?: boolean;\n submittingMessage?: string;\n bgColor?: string;\n bordercolor?: string;\n color?: string;\n height?: string;\n};\n\nexport function Button({\n children,\n icon,\n isSubmitting = false,\n submittingMessage = \"\",\n disabled = false,\n color = \"#2F2F2F\",\n ...rest\n}: ButtonProps) {\n return (\n <ButtonComponent\n isSubmitting={isSubmitting}\n hasSubmittingMessage={submittingMessage.length > 0}\n disabled={isSubmitting || disabled}\n aria-disabled={isSubmitting || disabled}\n hasIcon={!!icon}\n color={color}\n {...rest}\n >\n {icon && !isSubmitting && <Icon data-testid=\"button-icon\">{icon}</Icon>}\n {isSubmitting && <LoadingIcon hasText={submittingMessage.length > 0} />}\n {(!isSubmitting || submittingMessage.length === 0) && (\n <Text className=\"text\">{children}</Text>\n )}\n {isSubmitting && submittingMessage.length > 0 && (\n <TextSubmitting>{submittingMessage}</TextSubmitting>\n )}\n </ButtonComponent>\n );\n}\n","import React, { useEffect, useState, useCallback } from 'react';\nimport { AlertContainer, DismissButton } from './styles';\nimport { AlertType } from './styles';\n\nimport { HiX } from 'react-icons/hi';\n\ninterface AlertProps {\n type?: AlertType;\n children: React.ReactNode;\n className?: string;\n dismissible?: boolean;\n onDismiss?: () => void;\n autoDismiss?: number;\n}\n\nexport const Alert = ({\n type = 'info',\n children,\n className,\n dismissible = false,\n onDismiss,\n autoDismiss\n}: AlertProps) => {\n const [isClosing, setIsClosing] = useState(false);\n\n const handleDismiss = useCallback(() => {\n setIsClosing(true);\n setTimeout(() => onDismiss?.(), 300);\n }, [onDismiss]);\n\n useEffect(() => {\n if (autoDismiss) {\n const timer = setTimeout(handleDismiss, autoDismiss);\n return () => clearTimeout(timer);\n }\n }, [autoDismiss, handleDismiss]);\n\n return (\n <AlertContainer\n $type={type}\n $dismissible={dismissible}\n $isClosing={isClosing}\n className={className}\n role=\"alert\"\n >\n {children}\n {dismissible && (\n <DismissButton \n onClick={handleDismiss} \n aria-label=\"Dismiss alert\"\n >\n <HiX /> \n </DismissButton>\n )}\n </AlertContainer>\n );\n};","import styled, { css, keyframes } from \"styled-components\";\nimport { theme } from \"../styles/theme\";\n\nexport type AlertType = \"error\" | \"warning\" | \"info\" | \"success\";\n\nconst fadeIn = keyframes`\n from { opacity: 0; transform: translateY(-10px); }\n to { opacity: 1; transform: translateY(0); }\n`;\n\nconst fadeOut = keyframes`\n from { opacity: 1; transform: translateY(0); }\n to { opacity: 0; transform: translateY(-10px); }\n`;\n\ninterface AlertContainerProps {\n $type: AlertType;\n $dismissible?: boolean;\n $isClosing: boolean;\n}\n\nconst typeStyles = {\n error: css`\n background-color: ${theme.colors.red};\n border: 1px solid ${theme.colors.red};\n color: ${theme.colors.white};\n svg {\n color: ${theme.colors.white};\n }\n `,\n warning: css`\n background-color: ${theme.colors.yellow500};\n border: 1px solid ${theme.colors.yellow400};\n color: ${theme.colors.black};\n svg {\n color: ${theme.colors.black};\n }\n `,\n info: css`\n background-color: ${theme.colors.blue};\n border: 1px solid ${theme.colors.blue};\n color: ${theme.colors.white};\n svg {\n color: ${theme.colors.white};\n }\n `,\n success: css`\n background-color: ${theme.colors.green};\n border: 1px solid ${theme.colors.green2};\n color: ${theme.colors.white};\n svg {\n color: ${theme.colors.white};\n }\n `,\n};\n\nexport const AlertContainer = styled.div<AlertContainerProps>`\n position: fixed;\n width: 500px;\n top: 15px;\n right: 15px;\n padding: 1rem ${({ $dismissible }) => ($dismissible ? \"2.5rem\" : \"1rem\")} 1rem\n 1rem;\n margin-bottom: 1rem;\n animation: ${({ $isClosing }) => ($isClosing ? fadeOut : fadeIn)} 0.3s\n ease-out;\n animation-fill-mode: forwards;\n align-items: center;\n gap: 0.5rem;\n box-shadow: ${theme.shadows.shadow500};\n border-radius: 0.5rem;\n font-size: 1rem;\n font-weight: 500;\n\n ${({ $type }) => typeStyles[$type]}\n`;\n\nexport const DismissButton = styled.button`\n position: absolute;\n background: transparent;\n right: 10px;\n border: none;\n cursor: pointer;\n color: inherit;\n opacity: 1;\n transition: opacity 0.2s;\n\n &:hover {\n opacity: 0.7;\n }\n\n svg {\n width: 1rem;\n height: 1rem;\n }\n`;\n","import { useEffect, useRef } from \"react\";\nimport { HiX } from \"react-icons/hi\";\n\nimport {\n Container,\n CloseButton,\n Overlay,\n PrimaryButton,\n SecondaryButton,\n SecondaryText,\n ModalType,\n} from \"./styles\";\n\ninterface ModalProps {\n type: ModalType;\n title: string;\n message: string;\n primaryButtonText: string;\n onPrimaryAction: () => void;\n onClose: () => void;\n primaryButtonBgColor?: string;\n primaryButtonTextColor?: string;\n secondaryText?: string;\n secondaryButtonText?: string;\n onSecondaryAction?: () => void;\n}\n\nexport const Modal = ({\n type,\n title,\n message,\n primaryButtonText,\n onPrimaryAction,\n onClose,\n primaryButtonBgColor,\n primaryButtonTextColor,\n secondaryText,\n secondaryButtonText,\n onSecondaryAction,\n}: ModalProps) => {\n const primaryButtonRef = useRef<HTMLButtonElement | null>(null);\n\n useEffect(() => {\n primaryButtonRef.current?.focus();\n }, []);\n\n useEffect(() => {\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n document.addEventListener(\"keydown\", handleKey);\n return () => document.removeEventListener(\"keydown\", handleKey);\n }, [onClose]);\n\n const handleOverlayClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget) {\n onClose();\n }\n };\n\n const hasSecondaryAction =\n secondaryButtonText !== undefined && onSecondaryAction !== undefined;\n\n return (\n <Overlay onClick={handleOverlayClick} role=\"dialog\" aria-modal=\"true\" aria-label={title}>\n <Container $type={type}>\n <CloseButton onClick={onClose} aria-label=\"Fechar\">\n <HiX />\n </CloseButton>\n <h2>{title}</h2>\n <p>{message}</p>\n <PrimaryButton\n ref={primaryButtonRef}\n onClick={onPrimaryAction}\n $bgColor={primaryButtonBgColor}\n $textColor={primaryButtonTextColor}\n type=\"button\"\n >\n {primaryButtonText}\n </PrimaryButton>\n {hasSecondaryAction && (\n <>\n {secondaryText && <SecondaryText>{secondaryText}</SecondaryText>}\n <SecondaryButton\n onClick={onSecondaryAction}\n $bgColor={primaryButtonBgColor}\n $textColor={primaryButtonTextColor}\n type=\"button\"\n >\n {secondaryButtonText}\n </SecondaryButton>\n </>\n )}\n </Container>\n </Overlay>\n );\n};\n","import styled, { css, keyframes } from \"styled-components\";\nimport { theme } from \"../styles/theme\";\n\nexport type ModalType = \"success\" | \"error\";\n\n// Estratégia anti-CSS-da-landing: o componente é embarcado em landings de\n// terceiros que frequentemente têm resets globais (`* { margin: 0; padding: 0 }`)\n// ou estilos com !important em `button`, `p`, `h2`. Para garantir que o modal\n// mantenha sua identidade visual, todas as propriedades de layout, tipografia\n// e visual são marcadas com `!important` e os seletores são duplicados via `&&`\n// (eleva especificidade do styled-component). É uma escolha intencional comum\n// em widgets SDK / chat embedables (Intercom, Drift, Crisp etc.).\n\nconst fadeIn = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`;\n\nconst slideIn = keyframes`\n from { opacity: 0; transform: translateY(-20px) scale(0.96); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n`;\n\nexport const Overlay = styled.div`\n && {\n position: fixed !important;\n inset: 0 !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n background: rgba(0, 0, 0, 0.55) !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n z-index: 9999 !important;\n padding: 1rem !important;\n margin: 0 !important;\n box-sizing: border-box !important;\n animation: ${fadeIn} 0.18s ease-out;\n }\n`;\n\nconst accentStyles = {\n success: css`\n color: ${theme.colors.green2} !important;\n `,\n error: css`\n color: ${theme.colors.red} !important;\n `,\n};\n\ninterface ContainerProps {\n $type: ModalType;\n}\n\nexport const Container = styled.div<ContainerProps>`\n && {\n position: relative !important;\n background: ${theme.colors.white} !important;\n border: none !important;\n border-radius: 0.75rem !important;\n box-shadow: ${theme.shadows.shadow500} !important;\n max-width: 420px !important;\n width: 100% !important;\n padding: 1.75rem 1.5rem 1.25rem !important;\n margin: 0 !important;\n box-sizing: border-box !important;\n font-family: ${theme.fonts.primary} !important;\n animation: ${slideIn} 0.22s ease-out;\n }\n\n &&::before {\n content: \"\" !important;\n display: block !important;\n width: 56px !important;\n height: 4px !important;\n border-radius: 999px !important;\n margin: 0 auto 1rem !important;\n padding: 0 !important;\n background: ${({ $type }) =>\n $type === \"success\" ? theme.colors.green2 : theme.colors.red} !important;\n }\n\n && h2 {\n margin: 0 0 0.5rem !important;\n padding: 0 !important;\n font-family: ${theme.fonts.primary} !important;\n font-size: 1.25rem !important;\n font-weight: 700 !important;\n line-height: 1.3 !important;\n text-align: center !important;\n ${({ $type }) => accentStyles[$type]}\n }\n\n && p {\n margin: 0 0 1.5rem !important;\n padding: 0 !important;\n font-family: ${theme.fonts.primary} !important;\n font-size: 0.95rem !important;\n font-weight: 400 !important;\n line-height: 1.45 !important;\n text-align: center !important;\n color: ${theme.colors.black} !important;\n }\n`;\n\nexport const CloseButton = styled.button`\n && {\n position: absolute !important;\n top: 0.5rem !important;\n right: 0.5rem !important;\n background: transparent !important;\n border: none !important;\n cursor: pointer !important;\n color: ${theme.colors.gray550} !important;\n padding: 0.25rem !important;\n margin: 0 !important;\n display: inline-flex !important;\n align-items: center !important;\n justify-content: center !important;\n border-radius: 999px !important;\n box-sizing: border-box !important;\n transition: background 0.15s, color 0.15s;\n }\n\n &&:hover {\n background: ${theme.colors.gray300} !important;\n color: ${theme.colors.black} !important;\n }\n\n && svg {\n width: 1.1rem !important;\n height: 1.1rem !important;\n }\n`;\n\ninterface PrimaryButtonProps {\n $bgColor?: string;\n $textColor?: string;\n}\n\nexport const PrimaryButton = styled.button<PrimaryButtonProps>`\n && {\n display: block !important;\n width: 100% !important;\n padding: 0.75rem 1rem !important;\n margin: 0 !important;\n border: none !important;\n border-radius: 0.5rem !important;\n background: ${({ $bgColor }) => $bgColor || theme.colors.yellow500} !important;\n color: ${({ $textColor }) => $textColor || theme.colors.black} !important;\n font-family: ${theme.fonts.primary} !important;\n font-size: 1rem !important;\n font-weight: 700 !important;\n line-height: 1.2 !important;\n text-align: center !important;\n cursor: pointer !important;\n box-sizing: border-box !important;\n transition: filter 0.15s;\n }\n\n &&:hover {\n filter: brightness(0.95) !important;\n }\n\n &&:focus-visible {\n outline: 2px solid ${theme.colors.yellow400} !important;\n outline-offset: 2px !important;\n }\n`;\n\nexport const SecondaryText = styled.p`\n && {\n margin: 2.25rem 0 0.75rem !important;\n padding: 0 !important;\n font-family: ${theme.fonts.primary} !important;\n font-size: 0.85rem !important;\n font-weight: 400 !important;\n font-style: italic !important;\n line-height: 1.4 !important;\n text-align: center !important;\n color: ${theme.colors.gray550} !important;\n }\n`;\n\nexport const SecondaryButton = styled.button<PrimaryButtonProps>`\n && {\n display: block !important;\n width: 100% !important;\n padding: 0.65rem 1rem !important;\n margin: 0 !important;\n border: 1px solid ${({ $bgColor }) => $bgColor || theme.colors.yellow500} !important;\n border-radius: 0.5rem !important;\n background: transparent !important;\n color: ${({ $bgColor }) => $bgColor || theme.colors.black} !important;\n font-family: ${theme.fonts.primary} !important;\n font-size: 0.95rem !important;\n font-weight: 600 !important;\n line-height: 1.2 !important;\n text-align: center !important;\n cursor: pointer !important;\n box-sizing: border-box !important;\n transition: background 0.15s, color 0.15s;\n }\n\n &&:hover {\n background: ${({ $bgColor }) => $bgColor || theme.colors.yellow500} !important;\n color: ${({ $textColor }) => $textColor || theme.colors.black} !important;\n }\n\n &&:focus-visible {\n outline: 2px solid ${theme.colors.yellow400} !important;\n outline-offset: 2px !important;\n }\n`;\n","import {\n forwardRef,\n ForwardRefRenderFunction,\n InputHTMLAttributes,\n} from \"react\";\nimport { FieldError } from \"react-hook-form\";\nimport { StyledPhoneInput, FormControl, FormLabel, FormErrorMessage } from \"./styles\";\nimport { PhoneInputRefType, ParsedCountry } from \"react-international-phone\";\n\ninterface PhoneInputChange {\n phone: string;\n dialCode: string;\n inputValue: string;\n}\n\ninterface PhoneInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value'> {\n id: string;\n label?: string;\n error?: string | FieldError;\n showErrorMessage?: boolean;\n value: string;\n onChange?: (value: PhoneInputChange) => void;\n labelTextColor?: string;\n backgroundColor?: string;\n borderColor?: string;\n focusBorderColor: string;\n inputPlaceholderColor?: string;\n inputTextColor?: string;\n}\n\nconst PhoneInputBase: ForwardRefRenderFunction<PhoneInputRefType, PhoneInputProps> = (\n { id,\n label,\n error,\n showErrorMessage = true,\n labelTextColor,\n backgroundColor,\n borderColor,\n focusBorderColor,\n inputPlaceholderColor,\n inputTextColor,\n value,\n ...rest\n },\n ref\n) => {\n return (\n <FormControl isInvalid={!!error} >\n {!!label && <FormLabel htmlFor={id} $textColor={labelTextColor}>{label}</FormLabel>}\n <StyledPhoneInput\n ref={ref}\n defaultCountry=\"br\"\n disableCountryGuess={true}\n disableDialCodeAndPrefix={true}\n showDisabledDialCodeAndPrefix={false}\n placeholder={rest.placeholder}\n aria-invalid={!!error && showErrorMessage ? \"true\" : \"false\"}\n value={String(value)}\n onChange={(phone: string, meta: { country: ParsedCountry; inputValue: string }) => {\n if (typeof rest.onChange === \"function\") {\n rest.onChange({\n phone,\n dialCode: meta.country.dialCode,\n inputValue: meta.inputValue,\n });\n }\n }}\n inputProps={{\n id,\n name: rest.name || 'phone',\n required: rest.required,\n autoFocus: rest.autoFocus,\n autoComplete: rest.autoComplete || \"tel\",\n }}\n $backgroundColor={backgroundColor}\n $borderColor={borderColor}\n $focusBorderColor={focusBorderColor}\n $placeholderColor={inputPlaceholderColor}\n $textColor={inputTextColor}\n />\n {!!error && showErrorMessage && (\n <FormErrorMessage data-testid=\"error-message\">\n {typeof error === 'string' ? error : error?.message}\n </FormErrorMessage>\n )}\n </FormControl>\n );\n};\n\nexport const PhoneInput = forwardRef(PhoneInputBase);\n","import styled, { css } from \"styled-components\";\nimport { PhoneInput } from \"react-international-phone\";\nimport \"react-international-phone/style.css\";\nimport { theme } from \"../styles/theme\";\n\nexport const FormLabel = styled.label<{ $textColor?: string }>`\n font-family: ${theme.fonts.primary};\n font-style: normal;\n font-weight: 500;\n font-size: 1rem;\n color: ${(props) => props.$textColor || theme.colors.black};\n display: block;\n margin-bottom: 0.5rem;\n text-align: left;\n`;\n\nexport const StyledPhoneInput = styled(PhoneInput)<{ \n $backgroundColor?: string, \n $borderColor?: string, \n $focusBorderColor?: string, \n $placeholderColor?: string\n $textColor?: string,\n}>`\n width: 100%;\n height: 3.125rem;\n background: ${(props) => props.$backgroundColor || theme.colors.white};\n font-family: ${theme.fonts.primary};\n border: 1px solid ${(props) => props.$borderColor || theme.colors.transparent};\n border-radius: 0.125rem;\n\n &:focus-within {\n border-radius: 0.125rem;\n border: 2px solid ${(props) => props.$focusBorderColor || theme.colors.yellow500};\n outline: none;\n\n .react-international-phone-country-selector-button {\n border-right: 1px solid ${(props) => props.$focusBorderColor || theme.colors.yellow500};\n }\n }\n\n /* Style for the inner phone input container */\n .react-international-phone-input-container {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n overflow: hidden;\n font-family: ${theme.fonts.primary};\n font-size: 1rem;\n font-weight: 500;\n color: ${(props) => props.$textColor || theme.colors.black};\n background: ${(props) => props.$backgroundColor || theme.colors.white};\n }\n\n /* Style for the country selector button */\n .react-international-phone-country-selector-button {\n height: 100%;\n background: ${(props) => props.$backgroundColor || theme.colors.white};\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: ${theme.fonts.primary};\n font-size: 1rem;\n font-weight: 500;\n cursor: pointer;\n outline: none;\n border: none;\n border-right: 1px solid ${(props) => props.$borderColor || theme.colors.transparent};\n padding-left: 10px;\n }\n\n .react-international-phone-input:focus,\n .react-international-phone-input:focus-visible {\n outline: none !important; /* Removes the default blue/browser outline */\n border-color: initial; /* Or set to your desired default border color */\n box-shadow: none !important; /* Remove any default box shadow on focus */\n }\n\n /* Remove apenas o outline azul do botão e dropdown sem alterar outros estilos */\n .react-international-phone-country-selector-button:focus,\n .react-international-phone-country-selector-button:focus-visible {\n outline: none !important;\n }\n\n .react-international-phone-country-selector-dropdown {\n outline: none !important;\n padding: 10px !important;\n }\n\n .react-international-phone-country-selector-dropdown__list-item {\n padding-top: 5px !important;\n padding-bottom: 5px !important;\n }\n\n .react-international-phone-country-selector-dropdown__list-item:focus,\n .react-international-phone-country-selector-dropdown__list-item:focus-visible {\n outline: none !important;\n }\n\n /* Style for the input itself */\n input.react-international-phone-input {\n flex: 1;\n height: 100%;\n padding: 0 0.5rem;\n margin: 0;\n background: ${(props) => props.$backgroundColor || theme.colors.white};\n font-family: ${theme.fonts.primary};\n font-style: normal;\n font-weight: 500;\n font-size: 1rem;\n line-height: 1.5rem;\n color: ${(props) => props.$textColor || theme.colors.black};\n outline: none;\n border: none;\n border-radius: 0.125rem;\n\n &::placeholder {\n font-size: 1rem;\n line-height: 1.5rem;\n color: ${(props) => props.$placeholderColor || theme.colors.gray100};\n font-weight: 700;\n }\n\n &:-webkit-autofill {\n background: ${(props) => props.$backgroundColor || theme.colors.white} !important;\n -webkit-text-fill-color: ${(props) => props.$textColor || theme.colors.black} !important;\n transition: background-color 5000s ease-in-out 0s;\n }\n\n &:-webkit-autofill::first-line {\n font-family: ${theme.fonts.primary};\n font-size: 1rem;\n font-weight: 500;\n }\n }\n`;\n\nexport const FormErrorMessage = styled.small`\n font-size: 0.75rem;\n line-height: 1.125rem;\n color: ${theme.colors.red};\n margin-top: 0.25rem;\n display: block;\n`;\n\nexport const FormControl = styled.div.withConfig({\n shouldForwardProp: (prop) => ![\"isInvalid\"].includes(prop),\n})<{ isInvalid?: boolean }>`\n ${FormLabel} {\n ${(props) =>\n props.isInvalid &&\n css`\n color: ${theme.colors.red};\n `};\n }\n\n ${StyledPhoneInput} {\n ${(props) =>\n props.isInvalid &&\n css`\n border: 1px solid ${theme.colors.red};\n\n &:not(:focus)::placeholder {\n color: ${theme.colors.red};\n font-weight: 600;\n }\n `};\n\n .react-international-phone-input-container {\n ${(props) =>\n props.isInvalid &&\n css`\n border: 1px solid ${theme.colors.red};\n\n &:not(:focus)::placeholder {\n color: ${theme.colors.red};\n font-weight: 600;\n }\n `};\n }\n\n .react-international-phone-country-selector-button {\n ${(props) =>\n props.isInvalid &&\n css`\n border-right: 1px solid ${theme.colors.red};\n `};\n }\n }\n`;\n","import {\n forwardRef,\n ForwardRefRenderFunction,\n SelectHTMLAttributes,\n} from \"react\";\nimport { FieldError } from \"react-hook-form\";\nimport { Product } from \"../../domain/Product\";\n\nimport {\n FormControl,\n FormErrorMessage,\n FormLabel,\n Select as FormSelect,\n} from \"./styles\";\n\ninterface ProductSelectProps extends SelectHTMLAttributes<HTMLSelectElement> {\n id: string;\n label?: string;\n error?: string | FieldError;\n showErrorMessage?: boolean;\n labelTextColor?: string;\n backgroundColor?: string;\n borderColor?: string;\n focusBorderColor?: string;\n textColor?: string;\n products: Product[];\n placeholder?: string;\n}\n\nconst ProductSelectBase: ForwardRefRenderFunction<HTMLSelectElement, ProductSelectProps> = (\n {\n id,\n label,\n error,\n showErrorMessage = true,\n labelTextColor,\n backgroundColor,\n borderColor,\n focusBorderColor,\n textColor,\n products,\n placeholder = \"Selecione um produto\",\n ...rest\n },\n ref\n) => {\n return (\n <FormControl isInvalid={!!error}>\n {!!label && <FormLabel htmlFor={id} $textColor={labelTextColor}>{label}</FormLabel>}\n\n <FormSelect\n id={id}\n ref={ref}\n aria-invalid={!!error && showErrorMessage ? \"true\" : \"false\"}\n $backgroundColor={backgroundColor}\n $borderColor={borderColor}\n $focusBorderColor={focusBorderColor}\n $textColor={textColor}\n {...rest}\n >\n <option value=\"\" disabled>\n {placeholder}\n </option>\n {products.map((product) => (\n <option key={product.id} value={product.id}>\n {product.name}\n </option>\n ))}\n </FormSelect>\n\n {!!error && showErrorMessage && (\n <FormErrorMessage data-testid=\"error-message\">\n {typeof error === 'string' ? error : error.message}\n </FormErrorMessage>\n )}\n </FormControl>\n );\n};\n\nexport const ProductSelect = forwardRef(ProductSelectBase);\n","export type Environment = \"homol\" | \"prod\";\n\ninterface EnvironmentConfig {\n apiUrl: string;\n apiToken: string;\n whatsappPhone: string;\n chatUrl: string;\n}\n\nconst ENVIRONMENTS: Record<Environment, EnvironmentConfig> = {\n homol: {\n apiUrl: \"https://leads-hml.mitrerealty.com.br/api-leads\",\n apiToken:\n \"TEFORElOR19NSVRSRTptZlFXZnhvUHdNbWVZY0FidkF0QWJ3Q2RFYWtKckJBOXg5cGNsOTBvS1V0N2ZsU0d4TEtNdEZZd3k0NFlEc0c3\",\n whatsappPhone: \"551148100601\",\n chatUrl: \"https://crm-hml.mitrerealty.com.br/wcc/UserLoginSubmit.do\",\n },\n prod: {\n apiUrl: \"https://leads.mitrerealty.com.br/api-leads\",\n apiToken:\n \"TEFORElOR19NSVRSRTptZlFXZnhvUHdNbWVZY0FidkF0QWJ3Q2RFYWtKckJBOXg5cGNsOTBvS1V0N2ZsU0d4TEtNdEZZd3k0NFlEc0c3\",\n whatsappPhone: \"551148100601\",\n chatUrl: \"https://crm.mitrerealty.com.br/wcc/UserLoginSubmit.do\",\n },\n};\n\nexport const resolveEnvironment = (\n environment: Environment = \"homol\"\n): EnvironmentConfig | null => {\n return ENVIRONMENTS[environment] ?? null;\n};\n"],"mappings":"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","names":["React","useState","styled","styled","styled","css","FormLabel","styled","FormErrorMessage","FormControl","css","FormControl","FormLabel","FormErrorMessage","Input","styled","css","styled","css","jsx","jsxs","Button","useEffect","useState","useCallback","styled","css","css","styled","jsx","jsxs","useState","useCallback","useEffect","useEffect","HiX","styled","css","keyframes","fadeIn","keyframes","styled","css","jsx","jsxs","useEffect","HiX","forwardRef","styled","css","FormLabel","styled","FormErrorMessage","FormControl","css","jsx","jsxs","FormControl","FormLabel","FormErrorMessage","PhoneInput","forwardRef","forwardRef","jsx","jsxs","forwardRef","Fragment","jsx","jsxs","ContactPreference","React","useState","error","Input","PhoneInput","Button"]}
1
+ {"version":3,"sources":["../src/components/Form/index.tsx","../src/components/hooks/useError.ts","../src/utils/utm.ts","../src/components/styles/utils.ts","../src/components/Form/styles.ts","../src/components/styles/theme.ts","../src/components/ProductSelect/styles.ts","../src/components/styles/FontLoader.tsx","../src/components/Input/index.tsx","../src/components/Input/masks.ts","../src/components/Input/styles.ts","../src/components/Button/styles.ts","../src/components/Button/index.tsx","../src/components/Alert/index.tsx","../src/components/Alert/styles.ts","../src/components/Modal/index.tsx","../src/components/Modal/styles.ts","../src/components/PhoneInput/index.tsx","../src/components/PhoneInput/styles.ts","../src/components/ProductSelect/index.tsx","../src/config/environments.ts"],"sourcesContent":["import React, { useState } from \"react\";\nimport { useError } from \"../hooks/useError\";\nimport { useForm, SubmitHandler, Controller } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as yup from \"yup\";\n\nimport { UTM, isBrowser, resolveUtmWithPriority } from '../../utils/utm';\nimport { Product } from '../../domain/Product';\n\nimport { PhoneNumberUtil } from 'google-libphonenumber';\nconst phoneUtil = PhoneNumberUtil.getInstance();\n\nimport {\n FormContainer,\n HeaderContainer,\n ButtonContainer,\n Form,\n Title,\n Subtitle\n} from \"./styles\";\nimport {\n FormControl,\n FormLabel,\n Select as FormSelect,\n FormErrorMessage,\n} from \"../ProductSelect/styles\";\nimport { theme } from \"../styles/theme\";\nimport { useMontserratFont } from \"../styles/FontLoader\";\n\nimport { Input } from \"../Input\";\nimport { Button } from \"../Button\";\nimport { Alert } from \"../Alert\";\nimport { Modal } from \"../Modal\";\nimport { PhoneInput } from \"../PhoneInput\";\nimport { ProductSelect } from \"../ProductSelect\";\n\nimport { resolveEnvironment, type Environment } from \"../../config/environments\";\n\nexport enum ContactPreference {\n Whatsapp = \"Whatsapp\",\n Email = \"Email\",\n Ligacao = \"Ligação\",\n}\n\nexport type { Environment };\n\nexport type Channel = \"form\" | \"chat\" | \"whatsapp\";\n\nconst WHATSAPP_MESSAGE = \"Olá! Tenho interesse e gostaria de mais informações.\";\n\nconst WHATSAPP_TITLE = \"Fale com um corretor por WhatsApp\";\nconst WHATSAPP_SUBTITLE = \"Informe seus dados para contato.\";\nconst WHATSAPP_BUTTON_TEXT = \"Entrar\";\n\nconst CHAT_TITLE = \"Fale com um corretor por chat\";\nconst CHAT_SUBTITLE = \"Informe seus dados para contato.\";\nconst CHAT_BUTTON_TEXT = \"Entrar\";\n\nconst MODAL_ERROR_TITLE = \"Não foi possível completar seu contato\";\nconst MODAL_ERROR_MESSAGE = \"Por favor, tente novamente em alguns instantes.\";\nconst MODAL_ERROR_BUTTON_TEXT = \"OK\";\n\nconst MODAL_SUCCESS_TITLE = \"Cadastro realizado!\";\nconst MODAL_SUCCESS_AUTO_REDIRECT_WHATSAPP =\n \"Você está sendo redirecionado automaticamente para o WhatsApp.\";\nconst MODAL_SUCCESS_AUTO_REDIRECT_CHAT =\n \"Você está sendo redirecionado automaticamente para iniciar o atendimento via chat.\";\nconst MODAL_SUCCESS_OK_BUTTON_TEXT = \"OK\";\nconst MODAL_SUCCESS_FALLBACK_INSTRUCTION =\n \"Caso não tenha sido direcionado automaticamente, clique no botão abaixo para abrir a aplicação:\";\nconst MODAL_SUCCESS_BUTTON_WHATSAPP = \"Abrir WhatsApp\";\nconst MODAL_SUCCESS_BUTTON_CHAT = \"Iniciar atendimento\";\n\n// Atraso entre exibir o modal de sucesso e navegar a aba pré-aberta. Dá tempo\n// para o usuário ver a confirmação \"Cadastro realizado!\" antes do redirect.\nconst REDIRECT_DELAY_MS = 0;\n\ntype ActionModalState =\n | { kind: \"success\"; channel: \"whatsapp\"; targetUrl: string }\n | {\n kind: \"success\";\n channel: \"chat\";\n chatUrl: string;\n virtualObj: Record<string, unknown>;\n }\n | { kind: \"error\" };\n\nfunction buildWhatsappUrl(phone: string): string {\n const digits = phone.replace(/\\D/g, \"\");\n const text = encodeURIComponent(WHATSAPP_MESSAGE);\n return `https://api.whatsapp.com/send?phone=${digits}&text=${text}`;\n}\n\nfunction submitChatInNewTab(\n chatUrl: string,\n virtualObj: Record<string, unknown>\n): void {\n // Cria, submete e remove um form em nova aba. Executar dentro de gesto do\n // usuário (clique no botão do modal) garante que o browser não bloqueia.\n const form = document.createElement(\"form\");\n form.method = \"POST\";\n form.action = chatUrl;\n form.target = \"_blank\";\n const input = document.createElement(\"input\");\n input.type = \"hidden\";\n input.name = \"virtual_obj\";\n input.value = JSON.stringify(virtualObj);\n form.appendChild(input);\n document.body.appendChild(form);\n form.submit();\n document.body.removeChild(form);\n}\n\nfunction isTabAlive(tab: Window | null): tab is Window {\n return tab !== null && !tab.closed;\n}\n\n// Conteúdo escrito na aba pré-aberta. Duas fases:\n// - \"processing\": durante o `/leads` (mostra spinner + \"registrando seu cadastro\").\n// - \"success\": após `/leads` ok, durante REDIRECT_DELAY_MS (mostra ✓ verde +\n// \"Cadastro realizado!\" + \"Abrindo o WhatsApp/atendimento em instantes\").\n// O usuário, que tem o foco automaticamente movido para a nova aba pelo browser,\n// vê a confirmação de sucesso ali (em vez de só no modal da aba original).\n// Inputs são todos estáticos — sem XSS.\nfunction writeStatusHtmlToTab(\n tab: Window,\n phase: \"processing\" | \"success\",\n channel: \"whatsapp\" | \"chat\"\n): void {\n try {\n const destinationLabel = channel === \"whatsapp\" ? \"WhatsApp\" : \"atendimento\";\n const isSuccess = phase === \"success\";\n\n const headline = isSuccess\n ? \"Cadastro realizado!\"\n : \"Aguarde...\";\n const message = isSuccess\n ? `Abrindo o ${destinationLabel} em instantes...`\n : \"Estamos registrando seu cadastro...\";\n const headlineColor = isSuccess ? \"#2DCE68\" : \"#535353\";\n const indicator = isSuccess\n ? '<div class=\"check\" aria-hidden=\"true\"></div>'\n : '<div class=\"spinner\" aria-hidden=\"true\"></div>';\n\n tab.document.open();\n tab.document.write(\n '<!DOCTYPE html><html lang=\"pt-br\"><head><meta charset=\"utf-8\"/>' +\n '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"/>' +\n `<title>${headline}</title>` +\n '<style>' +\n 'html,body{margin:0;padding:0;height:100%;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;background:#FFF;color:#2F2F2F;}' +\n 'body{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:1rem;}' +\n '.box{text-align:center;max-width:360px;}' +\n '.logo{width:140px;max-width:60%;height:auto;margin:0 auto 1.5rem;display:block;}' +\n '.spinner{width:40px;height:40px;margin:0 auto 1.25rem;border:4px solid #EBEBEB;border-top-color:#2DCE68;border-radius:50%;animation:spin .9s linear infinite;}' +\n '.check{width:52px;height:52px;margin:0 auto 1.25rem;border-radius:50%;background:#2DCE68;position:relative;animation:pop .25s ease-out;}' +\n '.check::after{content:\"\";position:absolute;top:14px;left:19px;width:10px;height:20px;border:solid #FFF;border-width:0 4px 4px 0;transform:rotate(45deg);}' +\n `.headline{font-size:1.35rem;font-weight:700;color:${headlineColor};margin:0 0 0.5rem;}` +\n '.msg{font-size:.95rem;line-height:1.4;color:#535353;margin:0;}' +\n '@keyframes spin{to{transform:rotate(360deg);}}' +\n '@keyframes pop{from{transform:scale(0.6);opacity:0;}to{transform:scale(1);opacity:1;}}' +\n '</style></head><body><div class=\"box\">' +\n '<img class=\"logo\" src=\"https://portal.mitrerealty.com.br/Clientes/assets/images/mitre.svg\" alt=\"Mitre Realty\" onerror=\"this.style.display=\\'none\\'\"/>' +\n indicator +\n `<div class=\"headline\">${headline}</div>` +\n `<div class=\"msg\">${message}</div>` +\n '</div></body></html>'\n );\n tab.document.close();\n } catch {\n // Tab pode ter sido fechada ou bloqueada. Silenciamos: o redirect ainda\n // é tentado depois e o modal/botão de fallback cobrem o caso bloqueado.\n }\n}\n\nfunction escapeHtmlAttr(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/'/g, \"&#39;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nfunction navigateTabToWhatsapp(tab: Window, targetUrl: string): void {\n try {\n tab.location.href = targetUrl;\n } catch {\n // Em alguns browsers (ex.: tab fechada pelo usuário durante o /leads) a\n // atribuição pode lançar. Silenciamos: o botão de fallback no modal cobre.\n }\n}\n\nfunction submitChatInPreOpenedTab(\n tab: Window,\n chatUrl: string,\n virtualObj: Record<string, unknown>\n): void {\n try {\n const escapedJson = escapeHtmlAttr(JSON.stringify(virtualObj));\n const escapedUrl = escapeHtmlAttr(chatUrl);\n tab.document.open();\n tab.document.write(\n '<!DOCTYPE html><html><head><meta charset=\"utf-8\"/>' +\n \"<title>Abrindo atendimento...</title></head><body>\" +\n `<form id=\"f\" method=\"POST\" action=\"${escapedUrl}\">` +\n `<input type=\"hidden\" name=\"virtual_obj\" value=\"${escapedJson}\"/>` +\n \"</form>\" +\n \"<script>document.getElementById('f').submit();</script>\" +\n \"</body></html>\"\n );\n tab.document.close();\n } catch {\n // Fallback do modal continua disponível se o write falhar.\n }\n}\n\nexport interface MitreFormComponentProps {\n products: Product[];\n /**\n * Define de qual config interno o componente lê `apiUrl`, `apiToken`,\n * `whatsappPhone` e `chatUrl`. Default `\"staging\"`.\n */\n environment?: Environment;\n /** Default `\"form\"`. Ver doc/channel-feature.md. */\n channel?: Channel;\n showHeader?: boolean;\n title?: string;\n subtitle?: string;\n backgroundColor?: string;\n buttonBackgroundColor?: string;\n buttonTextColor?: string;\n textColor?: string;\n innerPadding?: string;\n inputBackgroundColor?: string;\n inputFocusBorderColor?: string;\n inputBorderColor?: string;\n inputTextColor?: string;\n inputPlaceholderColor?: string;\n showContactPreference?: boolean;\n /** Opcional. Repassado no body do POST /leads e no `virtual_obj` (modo chat). */\n idProdutoTerceiro?: string | number;\n /** Opcional. Repassado no body do POST /leads e no `virtual_obj` (modo chat). */\n idEmpreendimento?: string | number;\n /**\n * Default: `true` em `channel === \"chat\"` / `\"whatsapp\"` (paridade com `atendimento.html`),\n * `false` em `channel === \"form\"`. Passe `false` para forçar criação do evento.\n */\n naoCriarEvento?: boolean;\n /**\n * Callback chamado após o POST `/leads` retornar sucesso, em qualquer channel.\n * Útil para tracking (GTM, Analytics), redirect customizado ou logging na landing.\n * O componente continua exibindo a UI de sucesso (mensagem em `channel=form`, modal\n * em `channel=whatsapp`/`channel=chat`) independente do callback.\n */\n onSuccess?: (requestBody: RequestBody, leadId: string) => void;\n /**\n * Callback chamado quando o POST `/leads` falha, em qualquer channel. Útil para\n * tracking de erro (Sentry, Datadog, GTM). O componente continua exibindo a UI\n * de erro (alert em `channel=form`, modal em `channel=whatsapp`/`channel=chat`)\n * independente do callback.\n */\n onError?: (error: Error) => void;\n}\n\nexport interface RequestBody {\n name: string;\n email: string;\n phone: string;\n message: string;\n productId: string;\n utm_source: string;\n utm_medium?: string;\n utm_campaign?: string;\n utm_term?: string;\n preferencia_contato?: string;\n /** Presente quando `channel !== \"form\"`. */\n channel?: Channel;\n /**\n * Presente (e sempre `true`) quando `channel !== \"form\"`. Paridade com o fluxo legado\n * `atendimento.html`, cujo `<form id=\"chat-form\">` enviava o hidden `is_chat=true`\n * em ambos os canais (chat e whatsapp).\n */\n is_chat?: boolean;\n /** Presente quando `channel !== \"form\"`. `window.location.href` no momento do submit. */\n pagina?: string;\n /** Presente quando a prop homônima for informada e `channel !== \"form\"`. */\n idProdutoTerceiro?: string | number;\n /** Presente quando a prop homônima for informada e `channel !== \"form\"`. */\n idEmpreendimento?: string | number;\n /**\n * Presente quando o flag efetivo é `true`. Por default vai `true` em\n * `channel === \"chat\"` / `channel === \"whatsapp\"`; pode ser desligado com\n * `naoCriarEvento={false}`.\n */\n naoCriarEvento?: boolean;\n}\n\nconst isPhoneValid = (phone: string) => {\n try {\n return phoneUtil.isValidNumber(phoneUtil.parseAndKeepRawInput(phone));\n } catch (error) {\n console.log('erro ao validar telefone = ' + error)\n return false;\n }\n};\n\n// Schema base sem productId\nconst baseSchema = {\n name: yup.string().required(\"Nome é obrigatório\"),\n email: yup.string().required(\"Email é obrigatório\").email(\"Email inválido\"),\n phone: yup.object().shape({\n phone: yup.string().required(\"Telefone é obrigatório!\")\n .test(\n 'is-valid-phone',\n 'Número de telefone inválido!',\n function (value) {\n const digitsOnly = value?.replace(/\\D/g, '') || '';\n return digitsOnly.length >= 8 && isPhoneValid(value)\n }),\n inputValue: yup.string().required(\"Telefone é obrigatório!\"),\n dialCode: yup.string().required(\"Código de país é obrigatório\")\n }),\n};\n\n// Schema com productId quando necessário\nconst schemaWithProduct = yup.object().shape({\n ...baseSchema,\n productId: yup.string().required(\"Produto é obrigatório\"),\n});\n\nconst schema = yup.object().shape(baseSchema);\n\nconst MitreFormComponent = React.forwardRef<HTMLDivElement, MitreFormComponentProps>(({\n products,\n environment = \"staging\",\n channel = \"form\",\n showHeader = true,\n title = \"Atendimento por mensagem\",\n subtitle = \"Informe seus dados e retornaremos a mensagem.\",\n backgroundColor = theme.colors.gray180,\n textColor = theme.colors.black,\n buttonBackgroundColor = theme.colors.yellow500,\n buttonTextColor = theme.colors.black,\n innerPadding = \"1rem\",\n inputBackgroundColor = theme.colors.white,\n inputBorderColor = theme.colors.transparent,\n inputFocusBorderColor = theme.colors.yellow500,\n inputPlaceholderColor = theme.colors.gray100,\n inputTextColor = theme.colors.black,\n showContactPreference = false,\n idProdutoTerceiro,\n idEmpreendimento,\n naoCriarEvento,\n onSuccess,\n onError,\n}, ref) => {\n // Carregar fonte Montserrat automaticamente\n useMontserratFont();\n\n const [loading, setIsLoading] = useState(false);\n const { error, handleError, clearError } = useError();\n const [successMessage, setSuccessMessage] = useState('');\n const [formKey, setFormKey] = useState(0);\n const [selectedProductId, setSelectedProductId] = useState<number | null>(null);\n const [actionModal, setActionModal] = useState<ActionModalState | null>(null);\n\n // Validação do array de produtos\n const validateProducts = (): string | null => {\n if (!products) {\n return \"Lista de produtos não foi fornecida\";\n }\n\n if (!Array.isArray(products)) {\n return \"Lista de produtos deve ser um array\";\n }\n\n if (products.length === 0) {\n return \"Lista de produtos não pode estar vazia\";\n }\n\n // Validar cada produto no array\n for (let i = 0; i < products.length; i++) {\n const product = products[i];\n\n if (!product) {\n return `Produto na posição ${i} é inválido (nulo/undefined)`;\n }\n\n if (typeof product.id !== 'number' || product.id <= 0) {\n return `Produto na posição ${i} possui ID inválido (deve ser um número positivo)`;\n }\n\n if (typeof product.name !== 'string' || product.name.trim().length === 0) {\n return `Produto na posição ${i} possui nome inválido (deve ser uma string não vazia)`;\n }\n }\n\n return null;\n };\n\n const env = resolveEnvironment(environment);\n\n const validateEnvironmentConfig = (): string | null => {\n if (!env) {\n return `environment='${environment}' não é reconhecido. Use 'staging' ou 'prod'.`;\n }\n if (!env.apiUrl || !env.apiToken) {\n return `Configuração interna do environment '${environment}' está incompleta (apiUrl/apiToken).`;\n }\n return null;\n };\n\n const validateWhatsappConfig = (): string | null => {\n if (channel !== \"whatsapp\") return null;\n if (!env) return null;\n const raw = env.whatsappPhone?.trim() ?? \"\";\n if (!raw) {\n return `channel='whatsapp' exige whatsappPhone no environment '${environment}'.`;\n }\n const normalized = raw.startsWith(\"+\") ? raw : `+${raw}`;\n if (!isPhoneValid(normalized)) {\n return `whatsappPhone do environment '${environment}' é inválido (${JSON.stringify(env.whatsappPhone)}).`;\n }\n return null;\n };\n\n const validateChatConfig = (): string | null => {\n if (channel !== \"chat\") return null;\n if (!env) return null;\n const raw = env.chatUrl?.trim() ?? \"\";\n if (!raw) {\n return `channel='chat' exige chatUrl no environment '${environment}'.`;\n }\n try {\n const parsed = new URL(raw);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return `chatUrl do environment '${environment}' precisa ter protocolo http(s) (recebido: ${JSON.stringify(env.chatUrl)}).`;\n }\n } catch {\n return `chatUrl do environment '${environment}' não é URL absoluta válida (recebido: ${JSON.stringify(env.chatUrl)}).`;\n }\n return null;\n };\n\n const productsValidationError = validateProducts();\n const environmentConfigError = validateEnvironmentConfig();\n const whatsappConfigError = validateWhatsappConfig();\n const chatConfigError = validateChatConfig();\n // Em channel === \"whatsapp\" a preferência já é implícita (Whatsapp); em channel === \"chat\"\n // o legado não tinha esse campo. Em ambos o select é ocultado mesmo que o consumidor\n // tenha passado showContactPreference={true}.\n const effectiveShowContactPreference =\n channel === \"whatsapp\" || channel === \"chat\" ? false : showContactPreference;\n // Override forte de título e subtítulo nos canais de atendimento direto.\n const effectiveTitle =\n channel === \"whatsapp\" ? WHATSAPP_TITLE : channel === \"chat\" ? CHAT_TITLE : title;\n const effectiveSubtitle =\n channel === \"whatsapp\"\n ? WHATSAPP_SUBTITLE\n : channel === \"chat\"\n ? CHAT_SUBTITLE\n : subtitle;\n\n // UTM resolved inside the component (URL > localStorage (7d TTL) > referrer)\n const [utm, setUtm] = useState<UTM>({ utm_source: 'direto', createdAt: new Date().toISOString() });\n\n // Usar schema com productId se houver mais de 1 produto\n const formSchema = products && products.length > 1 ? schemaWithProduct : schema;\n\n const { control, register, handleSubmit, formState: { errors }, reset, clearErrors } = useForm<{\n name: string;\n email: string;\n phone: { phone: string; inputValue: string; dialCode: string; };\n productId?: string;\n preferencia_contato?: string;\n }>({\n resolver: yupResolver(formSchema),\n mode: 'onSubmit',\n });\n\n React.useEffect(() => {\n if (!isBrowser()) return;\n const { data } = resolveUtmWithPriority(new Date());\n setUtm(data);\n }, []);\n\n const resetForm = () => {\n const resetData: any = {\n name: \"\",\n email: \"\",\n phone: { phone: \"\", inputValue: \"\", dialCode: \"\" },\n };\n\n // Incluir productId no reset se houver mais de 1 produto\n if (products && products.length > 1) {\n resetData.productId = \"\";\n setSelectedProductId(null);\n }\n\n reset(resetData, {\n keepErrors: false,\n keepDirty: false,\n keepTouched: false,\n keepIsSubmitted: false,\n keepSubmitCount: false,\n keepValues: false,\n keepDefaultValues: false,\n });\n clearErrors();\n setFormKey(k => k + 1); // Force remount\n };\n\n const sendMessage: SubmitHandler<{\n name: string;\n email: string;\n phone: { phone: string; inputValue: string; dialCode: string; };\n productId?: string;\n preferencia_contato?: string;\n }> = async (data) => {\n const { name, email, phone, productId, preferencia_contato } = data;\n\n const phoneValue = phone.inputValue;\n const phoneDigitsOnly = phoneValue?.replace(/\\D/g, '') || '';\n\n const message = \"Gostaria de mais informações sobre o produto\";\n\n setActionModal(null);\n\n // Aba pré-aberta para Camada 1 (anti popup blocker). Aberta ANTES do\n // `await fetch`, ainda dentro do gesto do submit, para que browsers\n // permissivos (~70%) consigam o auto-redirect. Se o browser bloqueou,\n // `preOpenedTab` vem null e o modal de fallback assume.\n let preOpenedTab: Window | null = null;\n\n try {\n setIsLoading(true);\n\n // env é garantido não-nulo aqui: validateEnvironmentConfig roda em render-time\n // e bloqueia a UI antes de chegarmos no submit caso o config esteja inválido.\n if (!env) {\n throw new Error(\"Environment não resolvido\");\n }\n\n if (!products || products.length === 0) {\n throw new Error(\"Parâmetros obrigatórios não informados\");\n }\n\n // Determinar qual produto usar\n let selectedProduct: Product;\n\n if (products.length === 1) {\n // Se há apenas 1 produto, usar ele\n selectedProduct = products[0];\n } else {\n // Se há múltiplos produtos, usar o selecionado\n if (!productId) {\n throw new Error(\"Produto deve ser selecionado\");\n }\n const foundProduct = products.find(p => p.id.toString() === productId);\n if (!foundProduct) {\n throw new Error(\"Produto selecionado não encontrado\");\n }\n selectedProduct = foundProduct;\n }\n\n const paginaAtual =\n typeof window !== \"undefined\" ? window.location.href : undefined;\n\n // Default `true` em chat/whatsapp para paridade com o atendimento.html,\n // que sempre enviava o hidden `naoCriarEvento=true`. Override via prop.\n const naoCriarEventoEfetivo =\n channel !== \"form\" && (naoCriarEvento ?? true);\n\n const requestBody: RequestBody = {\n name,\n email,\n phone: phoneDigitsOnly,\n message,\n productId: selectedProduct.id.toString(),\n utm_source: utm.utm_source,\n utm_campaign: utm.utm_campaign,\n utm_medium: utm.utm_medium,\n utm_term: utm.utm_term,\n ...(channel === \"whatsapp\"\n ? { preferencia_contato: ContactPreference.Whatsapp }\n : effectiveShowContactPreference && preferencia_contato\n ? { preferencia_contato }\n : {}),\n ...(channel !== \"form\"\n ? {\n channel,\n ...(paginaAtual ? { pagina: paginaAtual } : {}),\n // Paridade com atendimento.html legado: o mesmo <form id=\"chat-form\">\n // era usado para chat e whatsapp, portanto is_chat=true ia em ambos.\n is_chat: true,\n ...(idProdutoTerceiro !== undefined ? { idProdutoTerceiro } : {}),\n ...(idEmpreendimento !== undefined ? { idEmpreendimento } : {}),\n ...(naoCriarEventoEfetivo ? { naoCriarEvento: true } : {}),\n }\n : {}),\n };\n\n // Camada 1: pré-abrir a nova aba ainda dentro do gesto do submit, antes\n // de qualquer await. Se o browser bloquear, `preOpenedTab` será null e\n // o usuário vai recorrer ao botão de fallback do modal.\n if (channel !== \"form\" && typeof window !== \"undefined\") {\n preOpenedTab = window.open(\"about:blank\", \"_blank\");\n if (isTabAlive(preOpenedTab)) {\n writeStatusHtmlToTab(preOpenedTab, \"processing\", channel);\n }\n }\n\n const response = await fetch(`${env.apiUrl}/leads`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${env.apiToken}`,\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n throw new Error(\"Falha ao enviar a mensagem!\");\n }\n\n const responseData = await response.json();\n const leadId = responseData.leadId || responseData.id || '';\n\n resetForm();\n onSuccess?.(requestBody, leadId);\n\n if (channel === \"whatsapp\") {\n const targetUrl = buildWhatsappUrl(env.whatsappPhone);\n // Modal aparece na aba original. Aba pré-aberta troca para a fase\n // \"success\" (Cadastro realizado! + Abrindo WhatsApp em instantes...).\n // Redirect ocorre após REDIRECT_DELAY_MS para o usuário ver a\n // confirmação na aba onde o foco está.\n setActionModal({\n kind: \"success\",\n channel: \"whatsapp\",\n targetUrl,\n });\n if (isTabAlive(preOpenedTab)) {\n writeStatusHtmlToTab(preOpenedTab, \"success\", \"whatsapp\");\n const tabToNavigate = preOpenedTab;\n setTimeout(() => {\n if (isTabAlive(tabToNavigate)) {\n navigateTabToWhatsapp(tabToNavigate, targetUrl);\n }\n }, REDIRECT_DELAY_MS);\n }\n } else if (channel === \"chat\") {\n const virtualObj: Record<string, unknown> = {\n ...requestBody,\n externalOriginId: leadId,\n ...(paginaAtual ? { pagina: paginaAtual } : {}),\n ...(idProdutoTerceiro !== undefined ? { idProdutoTerceiro } : {}),\n ...(idEmpreendimento !== undefined ? { idEmpreendimento } : {}),\n ...(naoCriarEventoEfetivo ? { naoCriarEvento: true } : {}),\n };\n setActionModal({\n kind: \"success\",\n channel: \"chat\",\n chatUrl: env.chatUrl,\n virtualObj,\n });\n if (isTabAlive(preOpenedTab)) {\n writeStatusHtmlToTab(preOpenedTab, \"success\", \"chat\");\n const tabToSubmit = preOpenedTab;\n const chatUrlSnapshot = env.chatUrl;\n setTimeout(() => {\n if (isTabAlive(tabToSubmit)) {\n submitChatInPreOpenedTab(tabToSubmit, chatUrlSnapshot, virtualObj);\n }\n }, REDIRECT_DELAY_MS);\n }\n } else {\n setSuccessMessage(\"Mensagem enviada com sucesso!\");\n }\n } catch (err) {\n // Fecha aba pré-aberta para não deixar about:blank órfão na falha.\n if (isTabAlive(preOpenedTab)) {\n preOpenedTab.close();\n }\n const error = err instanceof Error ? err : new Error(\"Erro desconhecido\");\n if (channel === \"whatsapp\" || channel === \"chat\") {\n setActionModal({ kind: \"error\" });\n } else {\n handleError(err);\n }\n onError?.(error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Se houver erro de configuração (produtos, environment, channel whatsapp ou channel chat),\n // renderizar erro no lugar do formulário\n if (productsValidationError || environmentConfigError || whatsappConfigError || chatConfigError) {\n if (productsValidationError) {\n console.error('Erro na validação dos produtos:', productsValidationError);\n }\n if (environmentConfigError) {\n console.error('Erro na validação do environment:', environmentConfigError);\n }\n if (whatsappConfigError) {\n console.error('Erro na validação do channel whatsapp:', whatsappConfigError);\n }\n if (chatConfigError) {\n console.error('Erro na validação do channel chat:', chatConfigError);\n }\n\n return (\n <FormContainer $backgroundColor={backgroundColor} $innerPadding={innerPadding} ref={ref}>\n <HeaderContainer>\n <Title $textColor={textColor}>Erro no carregamento do formulário!</Title>\n <Subtitle $textColor={textColor}>\n Não foi possível carregar o formulário. Tente novamente mais tarde.\n </Subtitle>\n </HeaderContainer>\n </FormContainer>\n );\n }\n\n return (\n <>\n {error && (\n <Alert\n type=\"error\"\n dismissible\n onDismiss={clearError}\n autoDismiss={5000}\n >\n {error!.message}\n </Alert>\n )}\n\n {successMessage && (\n <Alert\n type=\"success\"\n dismissible\n onDismiss={() => setSuccessMessage('')}\n autoDismiss={5000}\n >\n {successMessage}\n </Alert>\n )}\n\n {actionModal?.kind === \"error\" && (\n <Modal\n type=\"error\"\n title={MODAL_ERROR_TITLE}\n message={MODAL_ERROR_MESSAGE}\n primaryButtonText={MODAL_ERROR_BUTTON_TEXT}\n onPrimaryAction={() => setActionModal(null)}\n onClose={() => setActionModal(null)}\n primaryButtonBgColor={buttonBackgroundColor}\n primaryButtonTextColor={buttonTextColor}\n />\n )}\n\n {actionModal?.kind === \"success\" && actionModal.channel === \"whatsapp\" && (\n <Modal\n type=\"success\"\n title={MODAL_SUCCESS_TITLE}\n message={MODAL_SUCCESS_AUTO_REDIRECT_WHATSAPP}\n primaryButtonText={MODAL_SUCCESS_OK_BUTTON_TEXT}\n onPrimaryAction={() => setActionModal(null)}\n onClose={() => setActionModal(null)}\n primaryButtonBgColor={buttonBackgroundColor}\n primaryButtonTextColor={buttonTextColor}\n secondaryText={MODAL_SUCCESS_FALLBACK_INSTRUCTION}\n secondaryButtonText={MODAL_SUCCESS_BUTTON_WHATSAPP}\n onSecondaryAction={() => {\n window.open(actionModal.targetUrl, \"_blank\", \"noopener,noreferrer\");\n setActionModal(null);\n }}\n />\n )}\n\n {actionModal?.kind === \"success\" && actionModal.channel === \"chat\" && (\n <Modal\n type=\"success\"\n title={MODAL_SUCCESS_TITLE}\n message={MODAL_SUCCESS_AUTO_REDIRECT_CHAT}\n primaryButtonText={MODAL_SUCCESS_OK_BUTTON_TEXT}\n onPrimaryAction={() => setActionModal(null)}\n onClose={() => setActionModal(null)}\n primaryButtonBgColor={buttonBackgroundColor}\n primaryButtonTextColor={buttonTextColor}\n secondaryText={MODAL_SUCCESS_FALLBACK_INSTRUCTION}\n secondaryButtonText={MODAL_SUCCESS_BUTTON_CHAT}\n onSecondaryAction={() => {\n submitChatInNewTab(actionModal.chatUrl, actionModal.virtualObj);\n setActionModal(null);\n }}\n />\n )}\n\n <FormContainer $backgroundColor={backgroundColor} $innerPadding={innerPadding} ref={ref} >\n {showHeader &&\n <HeaderContainer>\n <Title $textColor={textColor}>{effectiveTitle}</Title>\n\n <Subtitle $textColor={textColor}>{effectiveSubtitle}</Subtitle>\n </HeaderContainer>\n }\n\n <Form $textColor={textColor} onSubmit={handleSubmit(sendMessage)} noValidate>\n {products.length > 1 && (\n <ProductSelect\n id=\"productId\"\n label=\"Produto de interesse *\"\n placeholder=\"Selecione um produto\"\n {...register(\"productId\")}\n error={errors.productId?.message}\n products={products}\n required\n labelTextColor={textColor}\n backgroundColor={inputBackgroundColor}\n borderColor={inputBorderColor}\n focusBorderColor={inputFocusBorderColor}\n textColor={inputTextColor}\n />\n )}\n\n <Input\n id=\"name\"\n label=\"Nome *\"\n placeholder=\"Digite seu nome\"\n {...register(\"name\")}\n error={errors.name?.message}\n autoComplete=\"name\"\n required\n labelTextColor={textColor}\n backgroundColor={inputBackgroundColor}\n borderColor={inputBorderColor}\n focusBorderColor={inputFocusBorderColor}\n inputPlaceholderColor={inputPlaceholderColor}\n inputTextColor={inputTextColor}\n />\n\n <Input\n id=\"email\"\n label=\"Email *\"\n type=\"email\"\n placeholder=\"exemplo@email.com\"\n {...register(\"email\")}\n error={errors.email?.message}\n autoComplete=\"email\"\n required\n labelTextColor={textColor}\n backgroundColor={inputBackgroundColor}\n borderColor={inputBorderColor}\n focusBorderColor={inputFocusBorderColor}\n inputPlaceholderColor={inputPlaceholderColor}\n inputTextColor={inputTextColor}\n />\n\n <Controller\n key={formKey}\n name=\"phone\"\n control={control}\n defaultValue={{ phone: \"\", inputValue: \"\", dialCode: \"\" }}\n shouldUnregister={true}\n render={({ field }) => {\n const errorMsg =\n errors.phone?.inputValue?.message ||\n errors.phone?.phone?.message ||\n errors.phone?.message;\n\n return (\n <PhoneInput\n id=\"phone\"\n label=\"Telefone *\"\n placeholder=\"(11) 00000-0000\"\n error={errorMsg}\n required\n value={field.value.phone}\n onChange={field.onChange}\n name={field.name}\n labelTextColor={textColor}\n backgroundColor={inputBackgroundColor}\n borderColor={inputBorderColor}\n focusBorderColor={inputFocusBorderColor}\n inputPlaceholderColor={inputPlaceholderColor}\n inputTextColor={inputTextColor}\n />\n );\n }}\n />\n\n {effectiveShowContactPreference && (\n <FormControl isInvalid={!!errors.preferencia_contato}>\n <FormLabel htmlFor=\"preferencia_contato\" $textColor={textColor}>\n Preferência de Contato\n </FormLabel>\n <FormSelect\n id=\"preferencia_contato\"\n {...register(\"preferencia_contato\")}\n defaultValue=\"\"\n $backgroundColor={inputBackgroundColor}\n $borderColor={inputBorderColor}\n $focusBorderColor={inputFocusBorderColor}\n $textColor={inputTextColor}\n >\n <option value=\"\" disabled>Selecione uma opção</option>\n {Object.values(ContactPreference).map((op) => (\n <option key={op} value={op}>{op}</option>\n ))}\n </FormSelect>\n {errors.preferencia_contato && (\n <FormErrorMessage>{errors.preferencia_contato.message}</FormErrorMessage>\n )}\n </FormControl>\n )}\n\n <h6>* Campos de preenchimento obrigatório.</h6>\n\n <ButtonContainer>\n <Button bgColor={buttonBackgroundColor} color={buttonTextColor} type=\"submit\" isSubmitting={loading}>\n {channel === \"whatsapp\"\n ? WHATSAPP_BUTTON_TEXT\n : channel === \"chat\"\n ? CHAT_BUTTON_TEXT\n : \"Enviar mensagem\"}\n </Button>\n </ButtonContainer>\n\n <p>A Mitre Realty respeita a sua privacidade e utiliza os seus dados pessoais para contatá-lo por e-mail ou telefone aqui registrados. Para saber mais, acesse a nossa{' '}\n <a\n href=\"https://www.mitrerealty.com.br/politica-de-privacidade\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Política de Privacidade\n </a>. Ao clicar em {'\"'}enviar{'\"'}, você concorda em permitir que a Mitre Realty, armazene e processe os dados pessoais fornecidos por você para finalidade informada</p>\n\n </Form>\n </FormContainer>\n </>\n );\n});\n\nMitreFormComponent.displayName = \"MitreFormComponent\";\n\nexport default MitreFormComponent;\n","import { useState } from \"react\";\n\nexport function useError() {\n const [error, setError] = useState<Error | null>(null);\n\n const handleError = (err: unknown) => {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n console.error(errorObj);\n };\n\n const clearError = () => setError(null);\n\n return { error, handleError, clearError };\n}\n","export type UTM = {\n utm_source: string; // default 'direto'\n utm_campaign?: string;\n utm_medium?: string;\n utm_term?: string;\n createdAt: string; // ISO 8601\n };\n \n const UTM_STORAGE_KEY = 'utm_meta';\n const TTL_DAYS = 7;\n \n export const isBrowser = () =>\n typeof window !== 'undefined' && typeof document !== 'undefined';\n \n const daysToMs = (days: number) => days * 24 * 60 * 60 * 1000;\n \n export function readStoredUtm(maxAgeDays = TTL_DAYS): { data: UTM | null; isValid: boolean } {\n if (!isBrowser()) return { data: null, isValid: false };\n try {\n const raw = window.localStorage.getItem(UTM_STORAGE_KEY);\n if (!raw) return { data: null, isValid: false };\n const parsed = JSON.parse(raw) as UTM;\n if (!parsed?.createdAt) return { data: null, isValid: false };\n const age = Date.now() - new Date(parsed.createdAt).getTime();\n const isValid = age <= daysToMs(maxAgeDays);\n return { data: isValid ? parsed : null, isValid };\n } catch {\n return { data: null, isValid: false };\n }\n }\n \n export function saveUtm(data: Partial<UTM>, now = new Date()): UTM | null {\n if (!isBrowser()) return null;\n const payload: UTM = {\n utm_source: data.utm_source || 'direto',\n utm_campaign: data.utm_campaign,\n utm_medium: data.utm_medium,\n utm_term: data.utm_term,\n createdAt: now.toISOString(),\n };\n try {\n window.localStorage.setItem(UTM_STORAGE_KEY, JSON.stringify(payload));\n } catch { /* ignore quota errors */ }\n return payload;\n }\n \n export function parseUrlUtm(loc?: Location): Partial<UTM> {\n if (!isBrowser()) return {};\n const locationObj = loc || window.location;\n const sp = new URL(locationObj.href).searchParams;\n const utm_source = sp.get('utm_source') || undefined;\n const utm_campaign = sp.get('utm_campaign') || undefined;\n const utm_medium = sp.get('utm_medium') || undefined;\n const utm_term = sp.get('utm_term') || undefined;\n return { utm_source, utm_campaign, utm_medium, utm_term };\n }\n \n export function inferSourceFromReferrer(ref?: string): string | undefined {\n if (!isBrowser()) return undefined;\n const href = (ref ?? document.referrer ?? '').toLowerCase();\n if (!href) return 'direto';\n const hostMatch = href.match(/https?:\\/\\/([^/]+)/);\n const host = hostMatch?.[1] ?? href;\n if (/google\\./.test(host) || /^g\\.co$/.test(host) || /^goo\\.gl$/.test(host)) return 'google';\n\n if (\n /(^|\\.)facebook\\.com$/.test(host) ||\n /(^|\\.)m\\.facebook\\.com$/.test(host) ||\n /(^|\\.)fb\\.com$/.test(host) ||\n /(^|\\.)fb\\.me$/.test(host) ||\n /(^|\\.)fb\\.watch$/.test(host) ||\n /(^|\\.)m\\.me$/.test(host)\n ) return 'facebook';\n\n if (\n /(^|\\.)instagram\\.com$/.test(host) ||\n /(^|\\.)l\\.instagram\\.com$/.test(host) ||\n /(^|\\.)instagr\\.am$/.test(host) ||\n /^ig\\.me$/.test(host)\n ) return 'instagram';\n\n if (/(^|\\.)linkedin\\.com$/.test(host) || /^lnkd\\.in$/.test(host)) return 'linkedin';\n\n if (/^t\\.co$/.test(host) || /(^|\\.)twitter\\.com$/.test(host) || /(^|\\.)x\\.com$/.test(host)) return 'twitter';\n\n if (/(^|\\.)youtube\\.com$/.test(host) || /^youtu\\.be$/.test(host)) return 'youtube';\n\n if (/(^|\\.)mail\\.google\\.com$/.test(host)) return 'email';\n\n if (/(^|\\.)outlook\\.live\\.com$/.test(host) || /(^|\\.)outlook\\.office\\.com$/.test(host)) return 'email';\n\n if (/^(wa\\.me)$/.test(host) || /(^|\\.)api\\.whatsapp\\.com$/.test(host) || /(^|\\.)web\\.whatsapp\\.com$/.test(host)) return 'whatsapp';\n\n if (/^t\\.me$/.test(host)) return 'telegram';\n\n if (/(^|\\.)tiktok\\.com$/.test(host)) return 'tiktok';\n return 'direto';\n }\n \n /** Resolve UTM e persiste quando necessário. Prioridade: localStorage (válido) > URL > referrer */\n export function resolveUtmWithPriority(\n now = new Date(),\n propOverride?: Partial<UTM>\n ): { data: UTM; source: 'localStorage' | 'url' | 'referrer' } {\n // 1) Se houver UTM válido no localStorage (<= 7 dias), usar SEM sobrescrever\n const stored = readStoredUtm();\n if (stored.data) {\n const merged = { ...stored.data, ...propOverride } as UTM;\n return { data: merged, source: 'localStorage' };\n }\n \n // 2) Se NÃO houver válido no localStorage, tentar URL. Se houver, salvar e usar\n const fromUrl = parseUrlUtm();\n if (fromUrl.utm_source) {\n const saved = saveUtm(fromUrl, now)!;\n const merged = { ...saved, ...propOverride } as UTM;\n return { data: merged, source: 'url' };\n }\n \n // 3) Fallback: inferir do referrer, apenas ler (não salvar no localStorage)\n const utm_source = inferSourceFromReferrer();\n const payload: UTM = {\n utm_source: utm_source || 'direto',\n utm_campaign: propOverride?.utm_campaign,\n utm_medium: propOverride?.utm_medium,\n utm_term: propOverride?.utm_term,\n createdAt: now.toISOString(),\n };\n return { data: payload, source: 'referrer' };\n }","type directionType = \"column\" | \"row\";\ntype alignItemsType = \"center\" | \"flex-start\";\n\ntype jutifyContentType = \"center\" | \"space-between\";\n\nexport function flex(\n direction: directionType = \"row\",\n alignItems?: alignItemsType,\n justifyContent?: jutifyContentType\n) {\n return `\n align-items:${alignItems || null};\n display:flex;\n flex-direction:${direction};\n justify-content:${justifyContent || null};\n `;\n}\n\nexport const alignX = `\n left:50%;\n transform:translateX(-50%);\n`;\n\nexport const alignXAndY = `\n left:50%;\n top:50%;\n transform:translate(-50%, -50%);\n`;\n\nexport const darkEffect = `\n &:hover {\n cursor:pointer;\n filter:brightness(98%);\n }\n\n &:active {\n filter:brightness(95%);\n }\n`;\n\nexport const opacityEffect = `\n &:hover {\n cursor:pointer;\n opacity:.9;\n }\n\n &:active {\n opacity:.7;\n }\n`;\n\nexport const modalZIndex = 9999;\n\nexport const breakpoints = {\n tablet: \"1024px\",\n};\n","import { flex, opacityEffect } from \"../styles/utils\";\nimport styled from \"styled-components\";\nimport { theme } from \"../styles/theme\";\n\nexport const FormContainer = styled.div<{\n $backgroundColor: string;\n $innerPadding: string;\n}>`\n ${flex(\"column\")}\n align-items: stretch;\n justify-content: flex-start;\n overflow-x: hidden;\n overflow-y: auto;\n\n background: ${(props) => props.$backgroundColor || theme.colors.gray180};\n\n padding: ${(props) => props.$innerPadding || \"1rem\"};\n\n /* Adaptar ao container pai */\n height: 100%;\n width: 100%;\n\n /* Reset CSS isolado */\n * {\n box-sizing: border-box;\n }\n\n /* Fonte aplicada apenas ao componente */\n font-family: ${theme.fonts.primary};\n\n /* Estilos necessários apenas neste escopo */\n button {\n cursor: pointer;\n font-family: ${theme.fonts.primary};\n }\n\n input, textarea, select {\n font-family: ${theme.fonts.primary};\n }\n\n [disabled] {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n /* Hide scrollbars for WebKit browsers */\n ::-webkit-scrollbar {\n display: none;\n }\n\n /* Hide scrollbars for Firefox */\n scrollbar-width: none;\n\n box-sizing: border-box;\n`;\n\nexport const HeaderContainer = styled.div`\n margin-bottom: 1rem;\n`;\n\nexport const ButtonContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n margin-top: 0.75rem;\n\n button {\n ${opacityEffect}\n color: ${theme.colors.black};\n font-weight: 600;\n border: none;\n border-radius: 8px;\n width: 60%;\n margin-top: 10px;\n margin-bottom: 10px;\n }\n`;\n\nexport const Form = styled.form<{ $textColor: string }>`\n label {\n font-weight: 700;\n }\n\n input {\n margin-bottom: 0.75rem;\n }\n\n p {\n font-family: ${theme.fonts.primary};\n font-style: italic;\n font-weight: 200;\n font-size: 0.8rem;\n color: ${(props) => props.$textColor || theme.colors.black};\n text-align: start;\n }\n\n a {\n font-family: ${theme.fonts.primary};\n font-style: italic;\n font-weight: 200;\n font-size: 0.8rem;\n color: ${(props) => props.$textColor || theme.colors.black};\n }\n\n h6 {\n text-align: start;\n margin-left: 10px;\n color: ${(props) => props.$textColor || theme.colors.black};\n font-weight: 600;\n }\n\n & > div {\n margin-bottom: 10px;,\n }\n`;\n\nexport const Title = styled.h2<{ $textColor: string }>`\n font-size: 1.25rem;\n font-weight: 700;\n line-height: 24px;\n letter-spacing: 0em;\n color: ${(props) => props.$textColor || theme.colors.black};\n`;\n\nexport const Subtitle = styled.p<{ $textColor: string }>`\n font-size: 1rem;\n font-weight: 400;\n line-height: 23px;\n letter-spacing: 0em;\n margin-top: 10px;\n color: ${(props) => props.$textColor || theme.colors.black};\n`;\n","/**\n * Sistema de tema isolado para o componente\n * Substitui as variáveis CSS globais para evitar conflitos em projetos host\n */\n\nexport const theme = {\n colors: {\n // Cores principais\n red: '#e52e4d',\n white: '#FFF',\n black: '#2F2F2F',\n black2: '#1E1E1E',\n black3: '#353535',\n alphaBlack: '#000000',\n \n // Amarelos\n yellow400: '#FFD789',\n yellow500: '#F6C76B',\n \n // Cinzas\n gray40: '#F0F0F0',\n gray45: '#767676',\n gray50: '#686A69',\n gray60: '#8F8F8F',\n gray100: '#B6B6B6',\n gray150: '#B9B9B9',\n gray180: '#CECECE',\n gray200: '#D2D2D2',\n gray300: '#EBEBEB',\n gray400: '#ECECEC',\n gray500: '#F4F4F4',\n gray550: '#6F6F6F',\n gray600: '#686868',\n gray700: '#535353',\n gray800: '#9D9D9D',\n \n // Verdes\n green: '#57C06E',\n green2: '#2DCE68',\n \n // Azul\n blue: '#007BFF',\n \n // Transparente\n transparent: 'transparent',\n },\n \n shadows: {\n shadow500: '0px 4px 8px rgba(91, 91, 91, 0.2)',\n },\n \n fonts: {\n primary: '\"Montserrat\", sans-serif',\n },\n} as const;\n\nexport type Theme = typeof theme;\n","import { SelectHTMLAttributes } from \"react\";\nimport styled, { css } from \"styled-components\";\nimport { theme } from \"../styles/theme\";\n\nexport const FormLabel = styled.label<{ $textColor?: string }>`\n font-family: ${theme.fonts.primary};\n font-style: normal;\n font-weight: 500;\n font-size: 1rem;\n color: ${(props) => props.$textColor || theme.colors.black};\n display: block;\n margin-bottom: 0.5rem;\n text-align: left;\n`;\n\nexport const Select = styled.select<\n SelectHTMLAttributes<HTMLSelectElement> & { \n $backgroundColor?: string, \n $borderColor?: string, \n $focusBorderColor?: string, \n $textColor?: string,\n }\n>`\n font-family: ${theme.fonts.primary};\n font-style: normal;\n font-weight: 500;\n font-size: 1rem;\n line-height: 1.5rem;\n background: ${(props) => props.$backgroundColor || theme.colors.white};\n color: ${(props) => props.$textColor || theme.colors.black};\n padding: 0.5rem 3rem 0.5rem 0.5rem; /* Aumentado padding-right para 3rem */\n border-radius: 0.125rem;\n border: 1px solid ${(props) => props.$borderColor || theme.colors.transparent};\n display: block;\n height: 3.125rem;\n width: 100%;\n cursor: pointer;\n \n /* Remover a seta padrão do navegador */\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n \n /* Adicionar seta personalizada maior */\n background-image: url(\"data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6,9 12,15 18,9'%3e%3c/polyline%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right 1rem center; /* Posicionado a 1rem da direita */\n background-size: 1.25rem; /* Tamanho da seta aumentado para 1.25rem */\n\n &:focus {\n border-radius: 0.125rem;\n border: 2px solid ${(props) => props.$focusBorderColor || theme.colors.yellow500};\n outline: none;\n }\n\n /* Estilo para option disabled (placeholder) */\n option:disabled {\n color: ${theme.colors.gray100};\n font-weight: 800;\n }\n\n /* Estilo para options normais */\n option:not(:disabled) {\n color: ${(props) => props.$textColor || theme.colors.black};\n font-weight: 500;\n }\n`;\n\nexport const FormErrorMessage = styled.small`\n font-size: 0.75rem;\n line-height: 1.125rem;\n color: ${theme.colors.red};\n margin-top: 0.25rem;\n display: block;\n`;\n\nexport const FormControl = styled.div.withConfig({\n shouldForwardProp: (prop) => ![\"isInvalid\"].includes(prop),\n})<{ isInvalid?: boolean }>`\n ${FormLabel} {\n ${(props) =>\n props.isInvalid &&\n css`\n color: ${theme.colors.red};\n `};\n }\n\n ${Select} {\n ${(props) =>\n props.isInvalid &&\n css`\n border: 1px solid ${theme.colors.red};\n `};\n\n &:focus {\n ${(props) =>\n props.isInvalid &&\n css`\n border: 1px solid ${theme.colors.red};\n `};\n }\n }\n`;\n","import { useEffect } from 'react';\n\n/**\n * Hook para carregar a fonte Montserrat de forma isolada\n * Garante que o componente funcione independentemente do projeto host\n */\nexport const useMontserratFont = () => {\n useEffect(() => {\n // Verificar se já existe um link para a fonte Montserrat adicionado por este componente\n const existingLink = document.querySelector('link[data-mitre-form-font=\"montserrat\"]');\n \n if (!existingLink) {\n // Criar e adicionar o link para a fonte Montserrat\n const link = document.createElement('link');\n link.rel = 'preconnect';\n link.href = 'https://fonts.googleapis.com';\n document.head.appendChild(link);\n\n const link2 = document.createElement('link');\n link2.rel = 'preconnect';\n link2.href = 'https://fonts.gstatic.com';\n link2.crossOrigin = 'anonymous';\n document.head.appendChild(link2);\n\n const link3 = document.createElement('link');\n link3.rel = 'stylesheet';\n link3.href = 'https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700;800&display=swap';\n link3.dataset.mitreFormFont = 'montserrat';\n document.head.appendChild(link3);\n }\n\n // Nota: Intencionalmente NÃO removemos a fonte no cleanup\n // Uma vez carregada, ela pode ser usada por múltiplas instâncias do componente\n // e não causa conflitos por estar no head\n }, []);\n};\n","import {\n FormEvent,\n forwardRef,\n ForwardRefRenderFunction,\n InputHTMLAttributes,\n useCallback,\n} from \"react\";\nimport { FieldError } from \"react-hook-form\";\nimport { cep, cpf, currency, date } from \"./masks\";\n\nimport {\n FormControl,\n FormErrorMessage,\n FormLabel,\n Input as FormInput,\n} from \"./styles\";\n\ntype InputType =\n | \"text\"\n | \"email\"\n | \"password\"\n | \"number\"\n | \"tel\"\n | \"url\"\n | \"date\"\n | \"time\"\n | \"datetime-local\";\n\ninterface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n id: string;\n label?: string;\n error?: string | FieldError;\n showErrorMessage?: boolean;\n labelTextColor?: string;\n backgroundColor?: string;\n borderColor?: string;\n focusBorderColor?: string;\n inputTextColor?: string;\n inputPlaceholderColor?: string;\n mask?: \"cep\" | \"currency\" | \"cpf\" | \"phone\" | \"date\";\n type?: InputType;\n}\n\nconst InputBase: ForwardRefRenderFunction<HTMLInputElement, InputProps> = (\n { id,\n label,\n error,\n showErrorMessage = true,\n labelTextColor,\n backgroundColor,\n borderColor,\n focusBorderColor,\n inputPlaceholderColor,\n inputTextColor,\n mask = \"\",\n type = \"text\",\n ...rest\n },\n ref\n) => {\n const handleKeyUp = useCallback(\n (e: FormEvent<HTMLInputElement>) => {\n if (mask === \"cep\") cep(e);\n if (mask === \"currency\") currency(e);\n if (mask === \"cpf\") cpf(e);\n if (mask === \"date\") date(e);\n },\n [mask]\n );\n\n return (\n <FormControl isInvalid={!!error}>\n {!!label && <FormLabel htmlFor={id} $textColor={labelTextColor}>{label}</FormLabel>}\n\n {!mask ? (\n <FormInput\n id={id}\n ref={ref}\n type={type}\n aria-invalid={!!error && showErrorMessage ? \"true\" : \"false\"}\n autoComplete={rest.autoComplete || \"on\"}\n $backgroundColor={backgroundColor}\n $borderColor={borderColor}\n $focusBorderColor={focusBorderColor}\n $placeholderColor={inputPlaceholderColor}\n $textColor={inputTextColor}\n {...rest}\n />\n ) : (\n <FormInput\n id={id}\n ref={ref}\n type={type}\n aria-invalid={!!error && showErrorMessage ? \"true\" : \"false\"}\n autoComplete={rest.autoComplete || \"on\"}\n onKeyUp={handleKeyUp}\n $backgroundColor={backgroundColor}\n $borderColor={borderColor}\n $focusBorderColor={focusBorderColor}\n $placeholderColor={inputPlaceholderColor}\n $textColor={inputTextColor}\n {...rest}\n />\n )}\n\n {!!error && showErrorMessage && (\n <FormErrorMessage data-testid=\"error-message\">\n {typeof error === 'string' ? error : error.message}\n </FormErrorMessage>\n )}\n </FormControl>\n );\n};\n\nexport const Input = forwardRef(InputBase);\n","import { FormEvent } from \"react\";\n\nexport function cep(e: FormEvent<HTMLInputElement>) {\n e.currentTarget.maxLength = 9;\n let value = e.currentTarget.value;\n value = value.replace(/\\D/g, \"\");\n value = value.replace(/^(\\d{5})(\\d)/, \"$1-$2\");\n e.currentTarget.value = value;\n return e;\n}\n\nexport function currency(e: FormEvent<HTMLInputElement>) {\n let value = e.currentTarget.value;\n value = value.replace(/\\D/g, \"\");\n value = value.replace(/(\\d)(\\d{2})$/, \"$1,$2\");\n value = value.replace(/(?=(\\d{3})+(\\D))\\B/g, \".\");\n\n e.currentTarget.value = value;\n return e;\n}\n\nexport function cpf(e: FormEvent<HTMLInputElement>) {\n e.currentTarget.maxLength = 14;\n let value = e.currentTarget.value;\n if (!value.match(/^(\\d{3}).(\\d{3}).(\\d{3})-(\\d{2})$/)) {\n value = value.replace(/\\D/g, \"\");\n value = value.replace(/(\\d{3})(\\d)/, \"$1.$2\");\n value = value.replace(/(\\d{3})(\\d)/, \"$1.$2\");\n value = value.replace(/(\\d{3})(\\d{2})$/, \"$1-$2\");\n\n e.currentTarget.value = value;\n }\n return e;\n}\n\nexport function date(e: FormEvent<HTMLInputElement>) {\n let value = e.currentTarget.value;\n value = value.replace(/\\D/g, \"\");\n value = value.replace(/(\\d{2})(\\d)/, \"$1/$2\");\n value = value.replace(/(\\d{2})(\\d)/, \"$1/$2\");\n e.currentTarget.value = value;\n return e;\n}\n\nexport function phone(e: FormEvent<HTMLInputElement>) {\n let value = e.currentTarget.value;\n value = value.replace(/\\D/g, \"\");\n value = value.replace(/(\\d{2})(\\d)/, \"$1/$2\");\n value = value.replace(/(\\d{2})(\\d)/, \"$1/$2\");\n e.currentTarget.value = value;\n return e;\n}\n","import { InputHTMLAttributes } from \"react\";\nimport styled, { css } from \"styled-components\";\nimport { theme } from \"../styles/theme\";\n\nexport const FormLabel = styled.label<{ $textColor?: string }>`\n font-family: ${theme.fonts.primary};\n font-style: normal;\n font-weight: 500;\n font-size: 1rem;\n color: ${(props) => props.$textColor || theme.colors.black};\n display: block;\n margin-bottom: 0.5rem;\n text-align: left;\n`;\n\nexport const Input = styled.input<\n InputHTMLAttributes<HTMLInputElement> & { \n $backgroundColor?: string, \n $borderColor?: string, \n $focusBorderColor?: string, \n $placeholderColor?: string\n $textColor?: string,\n }\n>`\n font-family: ${theme.fonts.primary};\n font-style: normal;\n font-weight: 500;\n font-size: 1rem;\n line-height: 1.5rem;\n background: ${(props) => props.$backgroundColor || theme.colors.white};\n color: ${(props) => props.$textColor || theme.colors.black};\n padding: 0.5rem;\n border-radius: 0.125rem;\n border: 1px solid ${(props) => props.$borderColor || theme.colors.transparent};\n display: block;\n height: 3.125rem;\n width: 100%;\n\n &:focus {\n border-radius: 0.125rem;\n border: 2px solid ${(props) => props.$focusBorderColor || theme.colors.yellow500};\n outline: none;\n }\n\n &::placeholder {\n font-size: 1rem;\n line-height: 1.5rem;\n color: ${(props) => props.$placeholderColor || theme.colors.gray100};\n font-weight: 700;\n }\n\n /* Autofill styles */\n &:-webkit-autofill {\n background: ${(props) => props.$backgroundColor || theme.colors.white} !important;\n color: ${(props) => props.$textColor || theme.colors.black} !important;\n -webkit-text-fill-color: ${(props) => props.$textColor || theme.colors.black} !important;\n transition: background-color 5000s ease-in-out 0s; /* Prevent flashing */\n }\n\n &:-webkit-autofill::first-line {\n font-family: ${theme.fonts.primary};\n font-size: 1rem;\n font-weight: 500;\n }\n`;\n\nexport const FormErrorMessage = styled.small`\n font-size: 0.75rem;\n line-height: 1.125rem;\n color: ${theme.colors.red};\n margin-top: 0.25rem;\n display: block;\n`;\n\nexport const FormControl = styled.div.withConfig({\n shouldForwardProp: (prop) => ![\"isInvalid\"].includes(prop),\n})<{ isInvalid?: boolean }>`\n ${FormLabel} {\n ${(props) =>\n props.isInvalid &&\n css`\n color: ${theme.colors.red};\n `};\n }\n\n ${Input} {\n ${(props) =>\n props.isInvalid &&\n css`\n border: 1px solid ${theme.colors.red};\n\n &:not(:focus)::placeholder {\n color: ${theme.colors.red};\n font-weight: 600;\n }\n `};\n\n &:focus {\n ${(props) =>\n props.isInvalid &&\n css`\n border: 1px solid ${theme.colors.red};\n `};\n }\n }\n`;\n","import { darken } from \"polished\";\nimport styled, { css } from \"styled-components\";\nimport { theme } from \"../styles/theme\";\n\ntype ButtonProps = {\n hasIcon?: boolean;\n isSubmitting?: boolean;\n hasSubmittingMessage?: boolean;\n bgColor?: string;\n bordercolor?: string;\n color?: string;\n height?: string;\n};\n\nexport const Icon = styled.span`\n font-size: 0;\n line-height: 0;\n transition: all 0.25s ease;\n\n transform: translate3d(-30px, 0px, 0px);\n visibility: hidden;\n opacity: 0;\n margin-right: 0.625rem;\n`;\n\nexport const Text = styled.span`\n font-family: ${theme.fonts.primary};\n font-size: 1rem;\n line-height: 1.5rem;\n margin-bottom: -2px;\n\n transition: all 0.25s ease;\n`;\n\nexport const TextSubmitting = styled.span`\n font-family: ${theme.fonts.primary};\n font-weight: 400;\n font-size: 1rem;\n\n transition: all 0.25s ease;\n`;\n\nexport const LoadingIcon = styled.span.withConfig({\n shouldForwardProp: (prop) => prop !== \"hasText\",\n})<{ hasText?: boolean }>`\n display: block;\n\n width: 1rem;\n height: 1rem;\n border: 0.125rem solid ${theme.colors.white};\n border-radius: 50%;\n animation: loadingAnimation 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n border-color: ${theme.colors.white} transparent transparent transparent;\n\n margin-right: ${(props) => (props.hasText ? \"0.625rem\" : \"0\")};\n\n @keyframes loadingAnimation {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n`;\n\nexport const Button = styled.button.withConfig({\n shouldForwardProp: (prop) =>\n ![\n \"hasIcon\",\n \"isSubmitting\",\n \"hasSubmittingMessage\",\n \"bgColor\",\n \"bordercolor\",\n \"color\",\n \"height\",\n ].includes(prop),\n})<ButtonProps>`\n background: ${(props) => darken(0.1, props?.bgColor || \"#F6C76B\")};\n color: ${(props) => props?.color || \"#2F2F2F\"};\n border: 1px solid ${(props) => darken(0.1, props?.bordercolor || \"#F6C76B\")};\n border-radius: 2px;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0 0.75rem;\n height: ${(props) => props?.height || \"3.125rem\"};\n position: relative;\n font-size: 0;\n line-height: 0;\n\n transition: all 0.25s;\n\n ${Icon} {\n display: ${(props) => (props?.hasIcon ? \"block\" : \"\")};\n }\n\n ${Text} {\n transform: ${(props) =>\n props?.hasIcon ? \"translate3d(-4.5px, 0px, 0px)\" : \"unset\"};\n\n @media print, screen and (min-width: 40em) {\n transform: ${(props) =>\n props?.hasIcon ? \"translate3d(-14.5px, 0px, 0px)\" : \"unset\"};\n }\n\n color: ${(props) => props?.color || \"#2F2F2F\"};\n }\n\n &:hover {\n background: ${(props) => darken(0.2, props?.bgColor || \"#F6C76B\")};\n border-color: ${(props) => darken(0.2, props?.bordercolor || \"#F6C76B\")};\n\n ${Icon} {\n opacity: 1;\n visibility: visible;\n transform: translate3d(0px, 0px, 0px);\n }\n\n ${Text} {\n transform: ${(props) =>\n props?.hasIcon ? \"translate3d(-5px, 0px, 0px)\" : \"unset\"};\n }\n }\n\n ${Text} {\n ${(props) =>\n props.isSubmitting &&\n !props.hasSubmittingMessage &&\n css`\n transform: unset;\n opacity: 0;\n `}\n }\n\n ${LoadingIcon} {\n ${(props) =>\n props.isSubmitting &&\n !props.hasSubmittingMessage &&\n css`\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n position: absolute;\n `}\n }\n`;\n","import { ButtonHTMLAttributes, ReactElement, ReactNode } from \"react\";\n\nimport {\n Button as ButtonComponent,\n Icon,\n LoadingIcon,\n Text,\n TextSubmitting,\n} from \"./styles\";\n\ntype ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n children: ReactNode;\n icon?: ReactElement;\n isSubmitting?: boolean;\n submittingMessage?: string;\n bgColor?: string;\n bordercolor?: string;\n color?: string;\n height?: string;\n};\n\nexport function Button({\n children,\n icon,\n isSubmitting = false,\n submittingMessage = \"\",\n disabled = false,\n color = \"#2F2F2F\",\n ...rest\n}: ButtonProps) {\n return (\n <ButtonComponent\n isSubmitting={isSubmitting}\n hasSubmittingMessage={submittingMessage.length > 0}\n disabled={isSubmitting || disabled}\n aria-disabled={isSubmitting || disabled}\n hasIcon={!!icon}\n color={color}\n {...rest}\n >\n {icon && !isSubmitting && <Icon data-testid=\"button-icon\">{icon}</Icon>}\n {isSubmitting && <LoadingIcon hasText={submittingMessage.length > 0} />}\n {(!isSubmitting || submittingMessage.length === 0) && (\n <Text className=\"text\">{children}</Text>\n )}\n {isSubmitting && submittingMessage.length > 0 && (\n <TextSubmitting>{submittingMessage}</TextSubmitting>\n )}\n </ButtonComponent>\n );\n}\n","import React, { useEffect, useState, useCallback } from 'react';\nimport { AlertContainer, DismissButton } from './styles';\nimport { AlertType } from './styles';\n\nimport { HiX } from 'react-icons/hi';\n\ninterface AlertProps {\n type?: AlertType;\n children: React.ReactNode;\n className?: string;\n dismissible?: boolean;\n onDismiss?: () => void;\n autoDismiss?: number;\n}\n\nexport const Alert = ({\n type = 'info',\n children,\n className,\n dismissible = false,\n onDismiss,\n autoDismiss\n}: AlertProps) => {\n const [isClosing, setIsClosing] = useState(false);\n\n const handleDismiss = useCallback(() => {\n setIsClosing(true);\n setTimeout(() => onDismiss?.(), 300);\n }, [onDismiss]);\n\n useEffect(() => {\n if (autoDismiss) {\n const timer = setTimeout(handleDismiss, autoDismiss);\n return () => clearTimeout(timer);\n }\n }, [autoDismiss, handleDismiss]);\n\n return (\n <AlertContainer\n $type={type}\n $dismissible={dismissible}\n $isClosing={isClosing}\n className={className}\n role=\"alert\"\n >\n {children}\n {dismissible && (\n <DismissButton \n onClick={handleDismiss} \n aria-label=\"Dismiss alert\"\n >\n <HiX /> \n </DismissButton>\n )}\n </AlertContainer>\n );\n};","import styled, { css, keyframes } from \"styled-components\";\nimport { theme } from \"../styles/theme\";\n\nexport type AlertType = \"error\" | \"warning\" | \"info\" | \"success\";\n\nconst fadeIn = keyframes`\n from { opacity: 0; transform: translateY(-10px); }\n to { opacity: 1; transform: translateY(0); }\n`;\n\nconst fadeOut = keyframes`\n from { opacity: 1; transform: translateY(0); }\n to { opacity: 0; transform: translateY(-10px); }\n`;\n\ninterface AlertContainerProps {\n $type: AlertType;\n $dismissible?: boolean;\n $isClosing: boolean;\n}\n\nconst typeStyles = {\n error: css`\n background-color: ${theme.colors.red};\n border: 1px solid ${theme.colors.red};\n color: ${theme.colors.white};\n svg {\n color: ${theme.colors.white};\n }\n `,\n warning: css`\n background-color: ${theme.colors.yellow500};\n border: 1px solid ${theme.colors.yellow400};\n color: ${theme.colors.black};\n svg {\n color: ${theme.colors.black};\n }\n `,\n info: css`\n background-color: ${theme.colors.blue};\n border: 1px solid ${theme.colors.blue};\n color: ${theme.colors.white};\n svg {\n color: ${theme.colors.white};\n }\n `,\n success: css`\n background-color: ${theme.colors.green};\n border: 1px solid ${theme.colors.green2};\n color: ${theme.colors.white};\n svg {\n color: ${theme.colors.white};\n }\n `,\n};\n\nexport const AlertContainer = styled.div<AlertContainerProps>`\n position: fixed;\n width: 500px;\n top: 15px;\n right: 15px;\n padding: 1rem ${({ $dismissible }) => ($dismissible ? \"2.5rem\" : \"1rem\")} 1rem\n 1rem;\n margin-bottom: 1rem;\n animation: ${({ $isClosing }) => ($isClosing ? fadeOut : fadeIn)} 0.3s\n ease-out;\n animation-fill-mode: forwards;\n align-items: center;\n gap: 0.5rem;\n box-shadow: ${theme.shadows.shadow500};\n border-radius: 0.5rem;\n font-size: 1rem;\n font-weight: 500;\n\n ${({ $type }) => typeStyles[$type]}\n`;\n\nexport const DismissButton = styled.button`\n position: absolute;\n background: transparent;\n right: 10px;\n border: none;\n cursor: pointer;\n color: inherit;\n opacity: 1;\n transition: opacity 0.2s;\n\n &:hover {\n opacity: 0.7;\n }\n\n svg {\n width: 1rem;\n height: 1rem;\n }\n`;\n","import { useEffect, useRef } from \"react\";\nimport { HiX } from \"react-icons/hi\";\n\nimport {\n Container,\n CloseButton,\n Overlay,\n PrimaryButton,\n SecondaryButton,\n SecondaryText,\n ModalType,\n} from \"./styles\";\n\ninterface ModalProps {\n type: ModalType;\n title: string;\n message: string;\n primaryButtonText: string;\n onPrimaryAction: () => void;\n onClose: () => void;\n primaryButtonBgColor?: string;\n primaryButtonTextColor?: string;\n secondaryText?: string;\n secondaryButtonText?: string;\n onSecondaryAction?: () => void;\n}\n\nexport const Modal = ({\n type,\n title,\n message,\n primaryButtonText,\n onPrimaryAction,\n onClose,\n primaryButtonBgColor,\n primaryButtonTextColor,\n secondaryText,\n secondaryButtonText,\n onSecondaryAction,\n}: ModalProps) => {\n const primaryButtonRef = useRef<HTMLButtonElement | null>(null);\n\n useEffect(() => {\n primaryButtonRef.current?.focus();\n }, []);\n\n useEffect(() => {\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n document.addEventListener(\"keydown\", handleKey);\n return () => document.removeEventListener(\"keydown\", handleKey);\n }, [onClose]);\n\n const handleOverlayClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget) {\n onClose();\n }\n };\n\n const hasSecondaryAction =\n secondaryButtonText !== undefined && onSecondaryAction !== undefined;\n\n return (\n <Overlay onClick={handleOverlayClick} role=\"dialog\" aria-modal=\"true\" aria-label={title}>\n <Container $type={type}>\n <CloseButton onClick={onClose} aria-label=\"Fechar\">\n <HiX />\n </CloseButton>\n <h2>{title}</h2>\n <p>{message}</p>\n <PrimaryButton\n ref={primaryButtonRef}\n onClick={onPrimaryAction}\n $bgColor={primaryButtonBgColor}\n $textColor={primaryButtonTextColor}\n type=\"button\"\n >\n {primaryButtonText}\n </PrimaryButton>\n {hasSecondaryAction && (\n <>\n {secondaryText && <SecondaryText>{secondaryText}</SecondaryText>}\n <SecondaryButton\n onClick={onSecondaryAction}\n $bgColor={primaryButtonBgColor}\n $textColor={primaryButtonTextColor}\n type=\"button\"\n >\n {secondaryButtonText}\n </SecondaryButton>\n </>\n )}\n </Container>\n </Overlay>\n );\n};\n","import styled, { css, keyframes } from \"styled-components\";\nimport { theme } from \"../styles/theme\";\n\nexport type ModalType = \"success\" | \"error\";\n\n// Estratégia anti-CSS-da-landing: o componente é embarcado em landings de\n// terceiros que frequentemente têm resets globais (`* { margin: 0; padding: 0 }`)\n// ou estilos com !important em `button`, `p`, `h2`. Para garantir que o modal\n// mantenha sua identidade visual, todas as propriedades de layout, tipografia\n// e visual são marcadas com `!important` e os seletores são duplicados via `&&`\n// (eleva especificidade do styled-component). É uma escolha intencional comum\n// em widgets SDK / chat embedables (Intercom, Drift, Crisp etc.).\n\nconst fadeIn = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`;\n\nconst slideIn = keyframes`\n from { opacity: 0; transform: translateY(-20px) scale(0.96); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n`;\n\nexport const Overlay = styled.div`\n && {\n position: fixed !important;\n inset: 0 !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n background: rgba(0, 0, 0, 0.55) !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n z-index: 9999 !important;\n padding: 1rem !important;\n margin: 0 !important;\n box-sizing: border-box !important;\n animation: ${fadeIn} 0.18s ease-out;\n }\n`;\n\nconst accentStyles = {\n success: css`\n color: ${theme.colors.green2} !important;\n `,\n error: css`\n color: ${theme.colors.red} !important;\n `,\n};\n\ninterface ContainerProps {\n $type: ModalType;\n}\n\nexport const Container = styled.div<ContainerProps>`\n && {\n position: relative !important;\n background: ${theme.colors.white} !important;\n border: none !important;\n border-radius: 0.75rem !important;\n box-shadow: ${theme.shadows.shadow500} !important;\n max-width: 420px !important;\n width: 100% !important;\n padding: 1.75rem 1.5rem 1.25rem !important;\n margin: 0 !important;\n box-sizing: border-box !important;\n font-family: ${theme.fonts.primary} !important;\n animation: ${slideIn} 0.22s ease-out;\n }\n\n &&::before {\n content: \"\" !important;\n display: block !important;\n width: 56px !important;\n height: 4px !important;\n border-radius: 999px !important;\n margin: 0 auto 1rem !important;\n padding: 0 !important;\n background: ${({ $type }) =>\n $type === \"success\" ? theme.colors.green2 : theme.colors.red} !important;\n }\n\n && h2 {\n margin: 0 0 0.5rem !important;\n padding: 0 !important;\n font-family: ${theme.fonts.primary} !important;\n font-size: 1.25rem !important;\n font-weight: 700 !important;\n line-height: 1.3 !important;\n text-align: center !important;\n ${({ $type }) => accentStyles[$type]}\n }\n\n && p {\n margin: 0 0 1.5rem !important;\n padding: 0 !important;\n font-family: ${theme.fonts.primary} !important;\n font-size: 0.95rem !important;\n font-weight: 400 !important;\n line-height: 1.45 !important;\n text-align: center !important;\n color: ${theme.colors.black} !important;\n }\n`;\n\nexport const CloseButton = styled.button`\n && {\n position: absolute !important;\n top: 0.5rem !important;\n right: 0.5rem !important;\n background: transparent !important;\n border: none !important;\n cursor: pointer !important;\n color: ${theme.colors.gray550} !important;\n padding: 0.25rem !important;\n margin: 0 !important;\n display: inline-flex !important;\n align-items: center !important;\n justify-content: center !important;\n border-radius: 999px !important;\n box-sizing: border-box !important;\n transition: background 0.15s, color 0.15s;\n }\n\n &&:hover {\n background: ${theme.colors.gray300} !important;\n color: ${theme.colors.black} !important;\n }\n\n && svg {\n width: 1.1rem !important;\n height: 1.1rem !important;\n }\n`;\n\ninterface PrimaryButtonProps {\n $bgColor?: string;\n $textColor?: string;\n}\n\nexport const PrimaryButton = styled.button<PrimaryButtonProps>`\n && {\n display: block !important;\n width: 100% !important;\n padding: 0.75rem 1rem !important;\n margin: 0 !important;\n border: none !important;\n border-radius: 0.5rem !important;\n background: ${({ $bgColor }) => $bgColor || theme.colors.yellow500} !important;\n color: ${({ $textColor }) => $textColor || theme.colors.black} !important;\n font-family: ${theme.fonts.primary} !important;\n font-size: 1rem !important;\n font-weight: 700 !important;\n line-height: 1.2 !important;\n text-align: center !important;\n cursor: pointer !important;\n box-sizing: border-box !important;\n transition: filter 0.15s;\n }\n\n &&:hover {\n filter: brightness(0.95) !important;\n }\n\n &&:focus-visible {\n outline: 2px solid ${theme.colors.yellow400} !important;\n outline-offset: 2px !important;\n }\n`;\n\nexport const SecondaryText = styled.p`\n &&& {\n margin: 3rem 0 0.5rem !important;\n padding: 0 !important;\n font-family: ${theme.fonts.primary} !important;\n font-size: 0.85rem !important;\n font-weight: 400 !important;\n font-style: italic !important;\n line-height: 1.4 !important;\n text-align: center !important;\n color: ${theme.colors.gray550} !important;\n }\n`;\n\nexport const SecondaryButton = styled.button<PrimaryButtonProps>`\n && {\n display: block !important;\n width: 100% !important;\n padding: 0.65rem 1rem !important;\n margin: 0 !important;\n border: 1px solid ${({ $bgColor }) => $bgColor || theme.colors.yellow500} !important;\n border-radius: 0.5rem !important;\n background: transparent !important;\n color: ${({ $bgColor }) => $bgColor || theme.colors.black} !important;\n font-family: ${theme.fonts.primary} !important;\n font-size: 0.95rem !important;\n font-weight: 600 !important;\n line-height: 1.2 !important;\n text-align: center !important;\n cursor: pointer !important;\n box-sizing: border-box !important;\n transition: background 0.15s, color 0.15s;\n }\n\n &&:hover {\n background: ${({ $bgColor }) => $bgColor || theme.colors.yellow500} !important;\n color: ${({ $textColor }) => $textColor || theme.colors.black} !important;\n }\n\n &&:focus-visible {\n outline: 2px solid ${theme.colors.yellow400} !important;\n outline-offset: 2px !important;\n }\n`;\n","import {\n forwardRef,\n ForwardRefRenderFunction,\n InputHTMLAttributes,\n} from \"react\";\nimport { FieldError } from \"react-hook-form\";\nimport { StyledPhoneInput, FormControl, FormLabel, FormErrorMessage } from \"./styles\";\nimport { PhoneInputRefType, ParsedCountry } from \"react-international-phone\";\n\ninterface PhoneInputChange {\n phone: string;\n dialCode: string;\n inputValue: string;\n}\n\ninterface PhoneInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value'> {\n id: string;\n label?: string;\n error?: string | FieldError;\n showErrorMessage?: boolean;\n value: string;\n onChange?: (value: PhoneInputChange) => void;\n labelTextColor?: string;\n backgroundColor?: string;\n borderColor?: string;\n focusBorderColor: string;\n inputPlaceholderColor?: string;\n inputTextColor?: string;\n}\n\nconst PhoneInputBase: ForwardRefRenderFunction<PhoneInputRefType, PhoneInputProps> = (\n { id,\n label,\n error,\n showErrorMessage = true,\n labelTextColor,\n backgroundColor,\n borderColor,\n focusBorderColor,\n inputPlaceholderColor,\n inputTextColor,\n value,\n ...rest\n },\n ref\n) => {\n return (\n <FormControl isInvalid={!!error} >\n {!!label && <FormLabel htmlFor={id} $textColor={labelTextColor}>{label}</FormLabel>}\n <StyledPhoneInput\n ref={ref}\n defaultCountry=\"br\"\n disableCountryGuess={true}\n disableDialCodeAndPrefix={true}\n showDisabledDialCodeAndPrefix={false}\n placeholder={rest.placeholder}\n aria-invalid={!!error && showErrorMessage ? \"true\" : \"false\"}\n value={String(value)}\n onChange={(phone: string, meta: { country: ParsedCountry; inputValue: string }) => {\n if (typeof rest.onChange === \"function\") {\n rest.onChange({\n phone,\n dialCode: meta.country.dialCode,\n inputValue: meta.inputValue,\n });\n }\n }}\n inputProps={{\n id,\n name: rest.name || 'phone',\n required: rest.required,\n autoFocus: rest.autoFocus,\n autoComplete: rest.autoComplete || \"tel\",\n }}\n $backgroundColor={backgroundColor}\n $borderColor={borderColor}\n $focusBorderColor={focusBorderColor}\n $placeholderColor={inputPlaceholderColor}\n $textColor={inputTextColor}\n />\n {!!error && showErrorMessage && (\n <FormErrorMessage data-testid=\"error-message\">\n {typeof error === 'string' ? error : error?.message}\n </FormErrorMessage>\n )}\n </FormControl>\n );\n};\n\nexport const PhoneInput = forwardRef(PhoneInputBase);\n","import styled, { css } from \"styled-components\";\nimport { PhoneInput } from \"react-international-phone\";\nimport \"react-international-phone/style.css\";\nimport { theme } from \"../styles/theme\";\n\nexport const FormLabel = styled.label<{ $textColor?: string }>`\n font-family: ${theme.fonts.primary};\n font-style: normal;\n font-weight: 500;\n font-size: 1rem;\n color: ${(props) => props.$textColor || theme.colors.black};\n display: block;\n margin-bottom: 0.5rem;\n text-align: left;\n`;\n\nexport const StyledPhoneInput = styled(PhoneInput)<{ \n $backgroundColor?: string, \n $borderColor?: string, \n $focusBorderColor?: string, \n $placeholderColor?: string\n $textColor?: string,\n}>`\n width: 100%;\n height: 3.125rem;\n background: ${(props) => props.$backgroundColor || theme.colors.white};\n font-family: ${theme.fonts.primary};\n border: 1px solid ${(props) => props.$borderColor || theme.colors.transparent};\n border-radius: 0.125rem;\n\n &:focus-within {\n border-radius: 0.125rem;\n border: 2px solid ${(props) => props.$focusBorderColor || theme.colors.yellow500};\n outline: none;\n\n .react-international-phone-country-selector-button {\n border-right: 1px solid ${(props) => props.$focusBorderColor || theme.colors.yellow500};\n }\n }\n\n /* Style for the inner phone input container */\n .react-international-phone-input-container {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n overflow: hidden;\n font-family: ${theme.fonts.primary};\n font-size: 1rem;\n font-weight: 500;\n color: ${(props) => props.$textColor || theme.colors.black};\n background: ${(props) => props.$backgroundColor || theme.colors.white};\n }\n\n /* Style for the country selector button */\n .react-international-phone-country-selector-button {\n height: 100%;\n background: ${(props) => props.$backgroundColor || theme.colors.white};\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: ${theme.fonts.primary};\n font-size: 1rem;\n font-weight: 500;\n cursor: pointer;\n outline: none;\n border: none;\n border-right: 1px solid ${(props) => props.$borderColor || theme.colors.transparent};\n padding-left: 10px;\n }\n\n .react-international-phone-input:focus,\n .react-international-phone-input:focus-visible {\n outline: none !important; /* Removes the default blue/browser outline */\n border-color: initial; /* Or set to your desired default border color */\n box-shadow: none !important; /* Remove any default box shadow on focus */\n }\n\n /* Remove apenas o outline azul do botão e dropdown sem alterar outros estilos */\n .react-international-phone-country-selector-button:focus,\n .react-international-phone-country-selector-button:focus-visible {\n outline: none !important;\n }\n\n .react-international-phone-country-selector-dropdown {\n outline: none !important;\n padding: 10px !important;\n }\n\n .react-international-phone-country-selector-dropdown__list-item {\n padding-top: 5px !important;\n padding-bottom: 5px !important;\n }\n\n .react-international-phone-country-selector-dropdown__list-item:focus,\n .react-international-phone-country-selector-dropdown__list-item:focus-visible {\n outline: none !important;\n }\n\n /* Style for the input itself */\n input.react-international-phone-input {\n flex: 1;\n height: 100%;\n padding: 0 0.5rem;\n margin: 0;\n background: ${(props) => props.$backgroundColor || theme.colors.white};\n font-family: ${theme.fonts.primary};\n font-style: normal;\n font-weight: 500;\n font-size: 1rem;\n line-height: 1.5rem;\n color: ${(props) => props.$textColor || theme.colors.black};\n outline: none;\n border: none;\n border-radius: 0.125rem;\n\n &::placeholder {\n font-size: 1rem;\n line-height: 1.5rem;\n color: ${(props) => props.$placeholderColor || theme.colors.gray100};\n font-weight: 700;\n }\n\n &:-webkit-autofill {\n background: ${(props) => props.$backgroundColor || theme.colors.white} !important;\n -webkit-text-fill-color: ${(props) => props.$textColor || theme.colors.black} !important;\n transition: background-color 5000s ease-in-out 0s;\n }\n\n &:-webkit-autofill::first-line {\n font-family: ${theme.fonts.primary};\n font-size: 1rem;\n font-weight: 500;\n }\n }\n`;\n\nexport const FormErrorMessage = styled.small`\n font-size: 0.75rem;\n line-height: 1.125rem;\n color: ${theme.colors.red};\n margin-top: 0.25rem;\n display: block;\n`;\n\nexport const FormControl = styled.div.withConfig({\n shouldForwardProp: (prop) => ![\"isInvalid\"].includes(prop),\n})<{ isInvalid?: boolean }>`\n ${FormLabel} {\n ${(props) =>\n props.isInvalid &&\n css`\n color: ${theme.colors.red};\n `};\n }\n\n ${StyledPhoneInput} {\n ${(props) =>\n props.isInvalid &&\n css`\n border: 1px solid ${theme.colors.red};\n\n &:not(:focus)::placeholder {\n color: ${theme.colors.red};\n font-weight: 600;\n }\n `};\n\n .react-international-phone-input-container {\n ${(props) =>\n props.isInvalid &&\n css`\n border: 1px solid ${theme.colors.red};\n\n &:not(:focus)::placeholder {\n color: ${theme.colors.red};\n font-weight: 600;\n }\n `};\n }\n\n .react-international-phone-country-selector-button {\n ${(props) =>\n props.isInvalid &&\n css`\n border-right: 1px solid ${theme.colors.red};\n `};\n }\n }\n`;\n","import {\n forwardRef,\n ForwardRefRenderFunction,\n SelectHTMLAttributes,\n} from \"react\";\nimport { FieldError } from \"react-hook-form\";\nimport { Product } from \"../../domain/Product\";\n\nimport {\n FormControl,\n FormErrorMessage,\n FormLabel,\n Select as FormSelect,\n} from \"./styles\";\n\ninterface ProductSelectProps extends SelectHTMLAttributes<HTMLSelectElement> {\n id: string;\n label?: string;\n error?: string | FieldError;\n showErrorMessage?: boolean;\n labelTextColor?: string;\n backgroundColor?: string;\n borderColor?: string;\n focusBorderColor?: string;\n textColor?: string;\n products: Product[];\n placeholder?: string;\n}\n\nconst ProductSelectBase: ForwardRefRenderFunction<HTMLSelectElement, ProductSelectProps> = (\n {\n id,\n label,\n error,\n showErrorMessage = true,\n labelTextColor,\n backgroundColor,\n borderColor,\n focusBorderColor,\n textColor,\n products,\n placeholder = \"Selecione um produto\",\n ...rest\n },\n ref\n) => {\n return (\n <FormControl isInvalid={!!error}>\n {!!label && <FormLabel htmlFor={id} $textColor={labelTextColor}>{label}</FormLabel>}\n\n <FormSelect\n id={id}\n ref={ref}\n aria-invalid={!!error && showErrorMessage ? \"true\" : \"false\"}\n $backgroundColor={backgroundColor}\n $borderColor={borderColor}\n $focusBorderColor={focusBorderColor}\n $textColor={textColor}\n {...rest}\n >\n <option value=\"\" disabled>\n {placeholder}\n </option>\n {products.map((product) => (\n <option key={product.id} value={product.id}>\n {product.name}\n </option>\n ))}\n </FormSelect>\n\n {!!error && showErrorMessage && (\n <FormErrorMessage data-testid=\"error-message\">\n {typeof error === 'string' ? error : error.message}\n </FormErrorMessage>\n )}\n </FormControl>\n );\n};\n\nexport const ProductSelect = forwardRef(ProductSelectBase);\n","export type Environment = \"staging\" | \"prod\";\n\ninterface EnvironmentConfig {\n apiUrl: string;\n apiToken: string;\n whatsappPhone: string;\n chatUrl: string;\n}\n\nconst ENVIRONMENTS: Record<Environment, EnvironmentConfig> = {\n staging: {\n apiUrl: \"https://leads-hml.mitrerealty.com.br/api-leads\",\n apiToken:\n \"TEFORElOR19NSVRSRTptZlFXZnhvUHdNbWVZY0FidkF0QWJ3Q2RFYWtKckJBOXg5cGNsOTBvS1V0N2ZsU0d4TEtNdEZZd3k0NFlEc0c3\",\n whatsappPhone: \"551148100601\",\n chatUrl: \"https://crm-hml.mitrerealty.com.br/wcc/UserLoginSubmit.do\",\n },\n prod: {\n apiUrl: \"https://leads.mitrerealty.com.br/api-leads\",\n apiToken:\n \"TEFORElOR19NSVRSRTptZlFXZnhvUHdNbWVZY0FidkF0QWJ3Q2RFYWtKckJBOXg5cGNsOTBvS1V0N2ZsU0d4TEtNdEZZd3k0NFlEc0c3\",\n whatsappPhone: \"551148100601\",\n chatUrl: \"https://crm.mitrerealty.com.br/wcc/UserLoginSubmit.do\",\n },\n};\n\nexport const resolveEnvironment = (\n environment: Environment = \"staging\"\n): EnvironmentConfig | null => {\n return ENVIRONMENTS[environment] ?? null;\n};\n"],"mappings":"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","names":["React","useState","styled","styled","styled","css","FormLabel","styled","FormErrorMessage","FormControl","css","FormControl","FormLabel","FormErrorMessage","Input","styled","css","styled","css","jsx","jsxs","Button","useEffect","useState","useCallback","styled","css","css","styled","jsx","jsxs","useState","useCallback","useEffect","useEffect","HiX","styled","css","keyframes","fadeIn","keyframes","styled","css","jsx","jsxs","useEffect","HiX","forwardRef","styled","css","FormLabel","styled","FormErrorMessage","FormControl","css","jsx","jsxs","FormControl","FormLabel","FormErrorMessage","PhoneInput","forwardRef","forwardRef","jsx","jsxs","forwardRef","Fragment","jsx","jsxs","ContactPreference","React","useState","error","Input","PhoneInput","Button"]}