mitre-form-component 0.1.2 → 0.1.4

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../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/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/PhoneInput/index.tsx","../src/components/PhoneInput/styles.ts","../src/components/ProductSelect/index.tsx","../src/components/ProductSelect/styles.ts"],"sourcesContent":["export { default as MitreFormComponent } from \"./components/Form\";\nexport type { MitreFormComponentProps, RequestBody } from \"./components/Form\";\n","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 { theme } from \"../styles/theme\";\nimport { useMontserratFont } from \"../styles/FontLoader\";\n\nimport { Input } from \"../Input\";\nimport { Button } from \"../Button\";\nimport { Alert } from \"../Alert\";\nimport { PhoneInput } from \"../PhoneInput\";\nimport { ProductSelect } from \"../ProductSelect\";\n\nexport interface MitreFormComponentProps {\n products: Product[];\n apiUrl: string;\n apiToken: string;\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 onSuccess?: (requestBody: RequestBody, leadId: string) => void;\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}\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 apiUrl,\n apiToken,\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 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\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 productsValidationError = validateProducts();\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 }>({\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 }> = async (data) => {\n const { name, email, phone, productId } = 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 try {\n setIsLoading(true);\n\n if (!products || products.length === 0 || !apiToken) {\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 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 };\n\n const response = await fetch(`${apiUrl}/leads`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${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 setSuccessMessage(\"Mensagem enviada com sucesso!\");\n resetForm();\n onSuccess?.(requestBody, leadId);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(\"Erro desconhecido\");\n handleError(err);\n onError?.(error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Se houver erro na validação dos produtos, renderizar erro no lugar do formulário\n if (productsValidationError) {\n // Logar o erro específico no console para debug\n console.error('Erro na validação dos produtos:', productsValidationError);\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 <FormContainer $backgroundColor={backgroundColor} $innerPadding={innerPadding} ref={ref} >\n {showHeader &&\n <HeaderContainer>\n <Title $textColor={textColor}>{title}</Title>\n\n <Subtitle $textColor={textColor}>{subtitle}</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 <h6>* Campos de preenchimento obrigatório.</h6>\n\n <ButtonContainer>\n <Button bgColor={buttonBackgroundColor} color={buttonTextColor} type=\"submit\" isSubmitting={loading}>\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 { 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 {\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-right: 5px;\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: 800;\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","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"],"mappings":"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","names":["import_react","styled","import_react","import_react","import_styled_components","styled","Input","import_styled_components","styled","import_jsx_runtime","Button","import_react","import_styled_components","styled","import_jsx_runtime","import_react","import_styled_components","FormLabel","styled","FormErrorMessage","FormControl","import_jsx_runtime","FormControl","FormLabel","FormErrorMessage","PhoneInput","import_react","import_styled_components","FormLabel","styled","FormErrorMessage","FormControl","import_jsx_runtime","FormControl","FormLabel","FormErrorMessage","import_jsx_runtime","React","error","Input","PhoneInput","Button"]}
1
+ {"version":3,"sources":["../src/index.ts","../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/PhoneInput/index.tsx","../src/components/PhoneInput/styles.ts","../src/components/ProductSelect/index.tsx"],"sourcesContent":["export { default as MitreFormComponent, PreferenciaContato } from \"./components/Form\";\nexport type { MitreFormComponentProps, RequestBody } from \"./components/Form\";\n","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 { PhoneInput } from \"../PhoneInput\";\nimport { ProductSelect } from \"../ProductSelect\";\n\nexport enum PreferenciaContato {\n Whatsapp = \"Whatsapp\",\n Email = \"Email\",\n Ligacao = \"Ligação\",\n}\n\nexport interface MitreFormComponentProps {\n products: Product[];\n apiUrl: string;\n apiToken: string;\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 showPreferenciaContato?: boolean;\n onSuccess?: (requestBody: RequestBody, leadId: string) => void;\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}\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 apiUrl,\n apiToken,\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 showPreferenciaContato = false,\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\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 productsValidationError = validateProducts();\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 try {\n setIsLoading(true);\n\n if (!products || products.length === 0 || !apiToken) {\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 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 ...(showPreferenciaContato && preferencia_contato\n ? { preferencia_contato }\n : {}),\n };\n\n const response = await fetch(`${apiUrl}/leads`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${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 setSuccessMessage(\"Mensagem enviada com sucesso!\");\n resetForm();\n onSuccess?.(requestBody, leadId);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(\"Erro desconhecido\");\n handleError(err);\n onError?.(error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Se houver erro na validação dos produtos, renderizar erro no lugar do formulário\n if (productsValidationError) {\n // Logar o erro específico no console para debug\n console.error('Erro na validação dos produtos:', productsValidationError);\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 <FormContainer $backgroundColor={backgroundColor} $innerPadding={innerPadding} ref={ref} >\n {showHeader &&\n <HeaderContainer>\n <Title $textColor={textColor}>{title}</Title>\n\n <Subtitle $textColor={textColor}>{subtitle}</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 {showPreferenciaContato && (\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(PreferenciaContato).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 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 {\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"],"mappings":"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","names":["import_react","styled","import_styled_components","styled","import_react","import_react","import_styled_components","FormLabel","styled","FormErrorMessage","FormControl","FormControl","FormLabel","FormErrorMessage","Input","import_styled_components","styled","import_jsx_runtime","Button","import_react","import_styled_components","styled","import_jsx_runtime","import_react","import_styled_components","FormLabel","styled","FormErrorMessage","FormControl","import_jsx_runtime","FormControl","FormLabel","FormErrorMessage","PhoneInput","import_react","import_jsx_runtime","import_jsx_runtime","PreferenciaContato","React","error","Input","PhoneInput","Button"]}
package/dist/index.d.cts CHANGED
@@ -5,6 +5,11 @@ interface Product {
5
5
  name: string;
6
6
  }
7
7
 
8
+ declare enum PreferenciaContato {
9
+ Whatsapp = "Whatsapp",
10
+ Email = "Email",
11
+ Ligacao = "Liga\u00E7\u00E3o"
12
+ }
8
13
  interface MitreFormComponentProps {
9
14
  products: Product[];
10
15
  apiUrl: string;
@@ -22,6 +27,7 @@ interface MitreFormComponentProps {
22
27
  inputBorderColor?: string;
23
28
  inputTextColor?: string;
24
29
  inputPlaceholderColor?: string;
30
+ showPreferenciaContato?: boolean;
25
31
  onSuccess?: (requestBody: RequestBody, leadId: string) => void;
26
32
  onError?: (error: Error) => void;
27
33
  }
@@ -35,7 +41,8 @@ interface RequestBody {
35
41
  utm_medium?: string;
36
42
  utm_campaign?: string;
37
43
  utm_term?: string;
44
+ preferencia_contato?: string;
38
45
  }
39
46
  declare const MitreFormComponent: React.ForwardRefExoticComponent<MitreFormComponentProps & React.RefAttributes<HTMLDivElement>>;
40
47
 
41
- export { MitreFormComponent, type MitreFormComponentProps, type RequestBody };
48
+ export { MitreFormComponent, type MitreFormComponentProps, PreferenciaContato, type RequestBody };
package/dist/index.d.ts CHANGED
@@ -5,6 +5,11 @@ interface Product {
5
5
  name: string;
6
6
  }
7
7
 
8
+ declare enum PreferenciaContato {
9
+ Whatsapp = "Whatsapp",
10
+ Email = "Email",
11
+ Ligacao = "Liga\u00E7\u00E3o"
12
+ }
8
13
  interface MitreFormComponentProps {
9
14
  products: Product[];
10
15
  apiUrl: string;
@@ -22,6 +27,7 @@ interface MitreFormComponentProps {
22
27
  inputBorderColor?: string;
23
28
  inputTextColor?: string;
24
29
  inputPlaceholderColor?: string;
30
+ showPreferenciaContato?: boolean;
25
31
  onSuccess?: (requestBody: RequestBody, leadId: string) => void;
26
32
  onError?: (error: Error) => void;
27
33
  }
@@ -35,7 +41,8 @@ interface RequestBody {
35
41
  utm_medium?: string;
36
42
  utm_campaign?: string;
37
43
  utm_term?: string;
44
+ preferencia_contato?: string;
38
45
  }
39
46
  declare const MitreFormComponent: React.ForwardRefExoticComponent<MitreFormComponentProps & React.RefAttributes<HTMLDivElement>>;
40
47
 
41
- export { MitreFormComponent, type MitreFormComponentProps, type RequestBody };
48
+ export { MitreFormComponent, type MitreFormComponentProps, PreferenciaContato, type RequestBody };