mitre-form-component 0.0.15 → 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +242 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +240 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -35,7 +35,25 @@ __export(index_exports, {
|
|
|
35
35
|
module.exports = __toCommonJS(index_exports);
|
|
36
36
|
|
|
37
37
|
// src/components/Form/index.tsx
|
|
38
|
-
var
|
|
38
|
+
var import_react4 = __toESM(require("react"), 1);
|
|
39
|
+
|
|
40
|
+
// src/components/hooks/useError.ts
|
|
41
|
+
var import_react = require("react");
|
|
42
|
+
function useError() {
|
|
43
|
+
const [error, setError] = (0, import_react.useState)(null);
|
|
44
|
+
const handleError = (err) => {
|
|
45
|
+
const errorObj = err instanceof Error ? err : new Error(String(err));
|
|
46
|
+
setError(errorObj);
|
|
47
|
+
console.error(errorObj);
|
|
48
|
+
};
|
|
49
|
+
const clearError = () => setError(null);
|
|
50
|
+
return { error, handleError, clearError };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// src/components/Form/index.tsx
|
|
54
|
+
var import_react_hook_form = require("react-hook-form");
|
|
55
|
+
var import_yup = require("@hookform/resolvers/yup");
|
|
56
|
+
var yup = __toESM(require("yup"), 1);
|
|
39
57
|
|
|
40
58
|
// src/components/styles/utils.ts
|
|
41
59
|
function flex(direction = "row", alignItems, justifyContent) {
|
|
@@ -149,7 +167,7 @@ var Text = import_styled_components.default.p`
|
|
|
149
167
|
|
|
150
168
|
// src/components/styles/global.ts
|
|
151
169
|
var import_styled_components2 = require("styled-components");
|
|
152
|
-
var
|
|
170
|
+
var import_react2 = require("react");
|
|
153
171
|
var GlobalStyles = import_styled_components2.createGlobalStyle`
|
|
154
172
|
:root {
|
|
155
173
|
--red: #e52e4d;
|
|
@@ -297,7 +315,7 @@ var GlobalStyles = import_styled_components2.createGlobalStyle`
|
|
|
297
315
|
|
|
298
316
|
`;
|
|
299
317
|
var FontLoader = () => {
|
|
300
|
-
(0,
|
|
318
|
+
(0, import_react2.useEffect)(() => {
|
|
301
319
|
const link = document.createElement("link");
|
|
302
320
|
link.href = "https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap";
|
|
303
321
|
link.rel = "stylesheet";
|
|
@@ -307,9 +325,153 @@ var FontLoader = () => {
|
|
|
307
325
|
};
|
|
308
326
|
var global_default = FontLoader;
|
|
309
327
|
|
|
310
|
-
// src/components/
|
|
328
|
+
// src/components/Alert/index.tsx
|
|
329
|
+
var import_react3 = require("react");
|
|
330
|
+
|
|
331
|
+
// src/components/Alert/styles.ts
|
|
332
|
+
var import_styled_components3 = __toESM(require("styled-components"), 1);
|
|
333
|
+
var fadeIn = import_styled_components3.keyframes`
|
|
334
|
+
from { opacity: 0; transform: translateY(-10px); }
|
|
335
|
+
to { opacity: 1; transform: translateY(0); }
|
|
336
|
+
`;
|
|
337
|
+
var fadeOut = import_styled_components3.keyframes`
|
|
338
|
+
from { opacity: 1; transform: translateY(0); }
|
|
339
|
+
to { opacity: 0; transform: translateY(-10px); }
|
|
340
|
+
`;
|
|
341
|
+
var typeStyles = {
|
|
342
|
+
error: import_styled_components3.css`
|
|
343
|
+
background-color: var(--red);
|
|
344
|
+
border: 1px solid var(--red);
|
|
345
|
+
color: var(--white);
|
|
346
|
+
svg {
|
|
347
|
+
color: var(--white);
|
|
348
|
+
}
|
|
349
|
+
`,
|
|
350
|
+
warning: import_styled_components3.css`
|
|
351
|
+
background-color: var(--yellow-500);
|
|
352
|
+
border: 1px solid var(--yellow-400);
|
|
353
|
+
color: var(--black);
|
|
354
|
+
svg {
|
|
355
|
+
color: var(--black);
|
|
356
|
+
}
|
|
357
|
+
`,
|
|
358
|
+
info: import_styled_components3.css`
|
|
359
|
+
background-color: var(--blue);
|
|
360
|
+
border: 1px solid var(--blue);
|
|
361
|
+
color: var(--white);
|
|
362
|
+
svg {
|
|
363
|
+
color: var(--white);
|
|
364
|
+
}
|
|
365
|
+
`,
|
|
366
|
+
success: import_styled_components3.css`
|
|
367
|
+
background-color: var(--green);
|
|
368
|
+
border: 1px solid var(--green-2);
|
|
369
|
+
color: var(--white);
|
|
370
|
+
svg {
|
|
371
|
+
color: var(--white);
|
|
372
|
+
}
|
|
373
|
+
`
|
|
374
|
+
};
|
|
375
|
+
var AlertContainer = import_styled_components3.default.div`
|
|
376
|
+
position: fixed;
|
|
377
|
+
width: 500px;
|
|
378
|
+
top: 15px;
|
|
379
|
+
right: 15px;
|
|
380
|
+
padding: 1rem ${({ $dismissible }) => $dismissible ? "2.5rem" : "1rem"} 1rem
|
|
381
|
+
1rem;
|
|
382
|
+
margin-bottom: 1rem;
|
|
383
|
+
animation: ${({ $isClosing }) => $isClosing ? fadeOut : fadeIn} 0.3s
|
|
384
|
+
ease-out;
|
|
385
|
+
animation-fill-mode: forwards;
|
|
386
|
+
align-items: center;
|
|
387
|
+
gap: 0.5rem;
|
|
388
|
+
box-shadow: var(--shadow-500);
|
|
389
|
+
border-radius: 0.5rem;
|
|
390
|
+
font-size: 1rem;
|
|
391
|
+
font-weight: 500;
|
|
392
|
+
|
|
393
|
+
${({ $type }) => typeStyles[$type]}
|
|
394
|
+
`;
|
|
395
|
+
var DismissButton = import_styled_components3.default.button`
|
|
396
|
+
position: absolute;
|
|
397
|
+
background: transparent;
|
|
398
|
+
right: 10px;
|
|
399
|
+
border: none;
|
|
400
|
+
cursor: pointer;
|
|
401
|
+
color: inherit;
|
|
402
|
+
opacity: 1;
|
|
403
|
+
transition: opacity 0.2s;
|
|
404
|
+
|
|
405
|
+
&:hover {
|
|
406
|
+
opacity: 0.7;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
svg {
|
|
410
|
+
width: 1rem;
|
|
411
|
+
height: 1rem;
|
|
412
|
+
}
|
|
413
|
+
`;
|
|
414
|
+
|
|
415
|
+
// src/components/Alert/index.tsx
|
|
416
|
+
var import_hi = require("react-icons/hi");
|
|
311
417
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
312
|
-
var
|
|
418
|
+
var Alert = ({
|
|
419
|
+
type = "info",
|
|
420
|
+
children,
|
|
421
|
+
className,
|
|
422
|
+
dismissible = false,
|
|
423
|
+
onDismiss,
|
|
424
|
+
autoDismiss
|
|
425
|
+
}) => {
|
|
426
|
+
const [isClosing, setIsClosing] = (0, import_react3.useState)(false);
|
|
427
|
+
const handleDismiss = (0, import_react3.useCallback)(() => {
|
|
428
|
+
setIsClosing(true);
|
|
429
|
+
setTimeout(() => onDismiss?.(), 300);
|
|
430
|
+
}, [onDismiss]);
|
|
431
|
+
(0, import_react3.useEffect)(() => {
|
|
432
|
+
if (autoDismiss) {
|
|
433
|
+
const timer = setTimeout(handleDismiss, autoDismiss);
|
|
434
|
+
return () => clearTimeout(timer);
|
|
435
|
+
}
|
|
436
|
+
}, [autoDismiss, handleDismiss]);
|
|
437
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
438
|
+
AlertContainer,
|
|
439
|
+
{
|
|
440
|
+
$type: type,
|
|
441
|
+
$dismissible: dismissible,
|
|
442
|
+
$isClosing: isClosing,
|
|
443
|
+
className,
|
|
444
|
+
role: "alert",
|
|
445
|
+
children: [
|
|
446
|
+
children,
|
|
447
|
+
dismissible && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
448
|
+
DismissButton,
|
|
449
|
+
{
|
|
450
|
+
onClick: handleDismiss,
|
|
451
|
+
"aria-label": "Dismiss alert",
|
|
452
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_hi.HiX, {})
|
|
453
|
+
}
|
|
454
|
+
)
|
|
455
|
+
]
|
|
456
|
+
}
|
|
457
|
+
);
|
|
458
|
+
};
|
|
459
|
+
|
|
460
|
+
// src/components/Form/index.tsx
|
|
461
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
462
|
+
var schema = yup.object().shape({
|
|
463
|
+
name: yup.string().required("Nome \xE9 obrigat\xF3rio"),
|
|
464
|
+
email: yup.string().required("Email \xE9 obrigat\xF3rio").email("Email inv\xE1lido"),
|
|
465
|
+
phone: yup.string().required("Telefone \xE9 obrigat\xF3rio").test(
|
|
466
|
+
"min-digits",
|
|
467
|
+
"N\xFAmero de telefone inv\xE1lido!",
|
|
468
|
+
(value) => {
|
|
469
|
+
const digitsOnly = value?.replace(/\D/g, "") || "";
|
|
470
|
+
return digitsOnly.length >= 8;
|
|
471
|
+
}
|
|
472
|
+
)
|
|
473
|
+
});
|
|
474
|
+
var MitreFormComponent = import_react4.default.forwardRef(({
|
|
313
475
|
productId,
|
|
314
476
|
apiUrl,
|
|
315
477
|
apiToken,
|
|
@@ -323,20 +485,84 @@ var MitreFormComponent = import_react2.default.forwardRef(({
|
|
|
323
485
|
backgroundColor = "#cecece",
|
|
324
486
|
innerPadding = "1rem"
|
|
325
487
|
}, ref) => {
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
488
|
+
const [loading, setIsLoading] = (0, import_react4.useState)(false);
|
|
489
|
+
const { error, handleError, clearError } = useError();
|
|
490
|
+
const [successMessage, setSuccessMessage] = (0, import_react4.useState)("");
|
|
491
|
+
const { register, handleSubmit, formState: { errors }, reset, watch } = (0, import_react_hook_form.useForm)({
|
|
492
|
+
resolver: (0, import_yup.yupResolver)(schema)
|
|
493
|
+
});
|
|
494
|
+
const phoneValue = watch("phone");
|
|
495
|
+
const sendMessage = async (data) => {
|
|
496
|
+
const { name, email, phone } = data;
|
|
497
|
+
const message = "Gostaria de mais informa\xE7\xF5es sobre o produto";
|
|
498
|
+
try {
|
|
499
|
+
setIsLoading(true);
|
|
500
|
+
if (!productId || !utm_source || !utm_medium || !utm_campaign || !utm_term || !apiToken) {
|
|
501
|
+
throw new Error("Par\xE2metros obrigat\xF3rios n\xE3o informados");
|
|
502
|
+
}
|
|
503
|
+
const response = await fetch(`${apiUrl}/leads`, {
|
|
504
|
+
method: "POST",
|
|
505
|
+
headers: {
|
|
506
|
+
"Content-Type": "application/json",
|
|
507
|
+
Authorization: `Basic ${apiToken}`
|
|
508
|
+
},
|
|
509
|
+
body: JSON.stringify({
|
|
510
|
+
name,
|
|
511
|
+
email,
|
|
512
|
+
phone,
|
|
513
|
+
message,
|
|
514
|
+
productId,
|
|
515
|
+
utm_source,
|
|
516
|
+
utm_medium,
|
|
517
|
+
utm_campaign,
|
|
518
|
+
utm_term
|
|
519
|
+
})
|
|
520
|
+
});
|
|
521
|
+
if (!response.ok) {
|
|
522
|
+
throw new Error("Falha ao enviar a mensagem!");
|
|
523
|
+
}
|
|
524
|
+
setSuccessMessage("Mensagem enviada com sucesso!");
|
|
525
|
+
reset();
|
|
526
|
+
} catch (err) {
|
|
527
|
+
handleError(err);
|
|
528
|
+
} finally {
|
|
529
|
+
setIsLoading(false);
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
|
|
533
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(global_default, {}),
|
|
534
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GlobalStyles, {}),
|
|
535
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
536
|
+
Alert,
|
|
537
|
+
{
|
|
538
|
+
type: "error",
|
|
539
|
+
dismissible: true,
|
|
540
|
+
onDismiss: clearError,
|
|
541
|
+
autoDismiss: 5e3,
|
|
542
|
+
children: error.message
|
|
543
|
+
}
|
|
544
|
+
),
|
|
545
|
+
successMessage && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
546
|
+
Alert,
|
|
547
|
+
{
|
|
548
|
+
type: "success",
|
|
549
|
+
dismissible: true,
|
|
550
|
+
onDismiss: () => setSuccessMessage(""),
|
|
551
|
+
autoDismiss: 5e3,
|
|
552
|
+
children: successMessage
|
|
553
|
+
}
|
|
554
|
+
),
|
|
555
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(FormContainer, { ref, children: [
|
|
556
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(HeaderContainer, { children: [
|
|
557
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Title, { children: "Atendimento por mensagem" }),
|
|
558
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { children: "Informe seus dados e retornaremos a mensagem." })
|
|
333
559
|
] }),
|
|
334
|
-
/* @__PURE__ */ (0,
|
|
335
|
-
/* @__PURE__ */ (0,
|
|
336
|
-
/* @__PURE__ */ (0,
|
|
560
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h6", { children: "* Campos de preenchimento obrigat\xF3rio." }),
|
|
561
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ButtonContainer, {}),
|
|
562
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { children: [
|
|
337
563
|
"A Mitre Realty respeita a sua privacidade e utiliza os seus dados pessoais para contat\xE1-lo por e-mail ou telefone aqui registrados. Para saber mais, acesse a nossa",
|
|
338
564
|
" ",
|
|
339
|
-
/* @__PURE__ */ (0,
|
|
565
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
340
566
|
"a",
|
|
341
567
|
{
|
|
342
568
|
href: "https://www.mitrerealty.com.br/politica-de-privacidade",
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/Form/index.tsx","../src/components/styles/utils.ts","../src/components/Form/styles.ts","../src/components/styles/global.ts"],"sourcesContent":["import MitreFormComponent from \"./components/Form\";\n\nexport default MitreFormComponent;\n//export type { MitreFormComponentProps } from \"./components/Form\";\n","import React, { useState } from \"react\";\n\nimport { \n FormContainer, \n HeaderContainer, \n ButtonContainer, \n Form, \n Title, \n Text \n} from \"./styles\";\nimport FontLoader, { GlobalStyles } from \"../styles/global\";\n\nexport interface MitreFormComponentProps {\n productId: string;\n apiUrl: string;\n apiToken: string;\n utm_source: string;\n utm_medium: string;\n utm_campaign: string;\n utm_term: string;\n showHeader?: boolean;\n colorPrimary?: string;\n textColor?: string;\n backgroundColor?: string;\n innerPadding?: string;\n}\n\nconst MitreFormComponent = React.forwardRef<HTMLDivElement, MitreFormComponentProps>(({\n productId,\n apiUrl,\n apiToken,\n utm_source,\n utm_medium,\n utm_campaign,\n utm_term,\n showHeader = true,\n colorPrimary = \"#F6C76B\",\n textColor = \"#2F2F2F\",\n backgroundColor = \"#cecece\",\n innerPadding = \"1rem\",\n}, ref) => {\n return (\n <>\n <FontLoader />\n <GlobalStyles />\n <FormContainer ref={ref} >\n <HeaderContainer>\n <Title >Atendimento por mensagem</Title>\n\n <Text >Informe seus dados e retornaremos a mensagem.</Text>\n </HeaderContainer>\n\n \n\n <h6>* Campos de preenchimento obrigatório.</h6>\n\n <ButtonContainer>\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 </FormContainer>\n </>\n );\n});\n\nMitreFormComponent.displayName = \"MitreFormComponent\";\nexport default MitreFormComponent;\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\";\n\nexport const FormContainer = styled.div`\n ${flex(\"column\")}\n align-items: stretch;\n justify-content: flex-start;\n overflow-x: hidden;\n overflow-y: auto;\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 height: 100%;\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\nexport const Form = styled.form`\n label {\n font-weight: 700;\n }\n\n input {\n background: white;\n margin-bottom: 0.75rem;\n }\n\n p {\n font-family: \"Montserrat\", sans-serif;\n font-style: italic;\n font-weight: 200;\n font-size: 0.8rem;\n text-align: start;\n }\n\n a {\n font-family: \"Montserrat\", sans-serif;\n font-style: italic;\n font-weight: 200;\n font-size: 0.8rem;\n }\n\n h6 {\n text-align: start;\n margin-left: 10px;\n }\n\n & > div {\n margin-bottom: 10px;,\n }\n\n button {\n ${opacityEffect}\n color: var(--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 Title = styled.h2`\n font-size: 1.25rem;\n font-weight: 700;\n line-height: 24px;\n letter-spacing: 0em;\n`;\n\nexport const Text = styled.p`\n font-size: 1rem;\n font-weight: 400;\n line-height: 23px;\n letter-spacing: 0em;\n margin-top: 10px;\n`;\n","import { createGlobalStyle } from \"styled-components\";\nimport React, { useEffect } from \"react\";\n\nexport const GlobalStyles = createGlobalStyle`\n :root {\n --red: #e52e4d;\n --white: #FFF;\n --black: #2F2F2F;\n --black-2:#1E1E1E;\n --alphaBlack: #000000;\n --black-2:#1E1E1E;\n --black-3:#353535;\n\n --yellow-400:#FFD789;\n --yellow-500: #F6C76B;\n --gray-40:#F0F0F0;\n --gray-45:#767676;\n --gray-50: #686A69;\n --gray-60: #8F8F8F;\n --gray-100: #B6B6B6;\n --gray-150: #B9B9B9;\n --gray-200: #D2D2D2;\n --gray-300: #EBEBEB;\n --gray-400: #ECECEC;\n --gray-500: #F4F4F4;\n --gray-550:#6F6F6F;\n --gray-600:#686868;\n --gray-700: #535353;\n --gray-800:#9D9D9D;\n --shadow-500: 0px 4px 8px rgba(91, 91, 91, 0.2);\n --green:#57C06E;\n --green-2:#2DCE68;\n --blue:#007BFF;\n }\n\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n html {\n scroll-behavior: smooth;\n\n @media (max-width: 1080px) {\n font-size: 93.75%;\n }\n @media (max-width: 720px) {\n font-size: 87.5%;\n }\n }\n\n body {\n background: var(--white);\n -webkit-font-smoothing: antialiased;\n }\n\n body, input, textarea, select, button {\n font-family: \"Montserrat\", sans-serif;\n font-weight: 400;\n } \n\n h1, h2, h3, h4, h5, h6, strong {\n font-weight: 600;\n }\n\n button {\n cursor: pointer;\n }\n\n [disabled] {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .hidden {\n overflow: hidden;\n }\n\n ::-webkit-scrollbar {\n -webkit-appearance: none;\n background: var(--gray-500);\n width: 6px;\n height: 10px;\n }\n\n ::-webkit-scrollbar-thumb {\n background-color: var(--gray-50);\n }\n\n .aligncenter {\n text-align: center;\n }\n\n .width-190px {\n width:190px;\n }\n\n .hidden-content {\n display:none !important;\n }\n\n .global-margin-bottom {\n margin-bottom:20px;\n }\n\n .background-light-gray {\n background:#F4F4F4;\n }\n\n .full-width-and-height {\n height:100%;\n width:100%;\n }\n\n .flex-direction-column {\n flex-direction:column;\n }\n\n .bold {\n font-weight:700;\n }\n\n .margin-center-x {\n margin:0 auto;\n }\n\n .border-none {\n border:none;\n }\n\n .text-center {\n text-align:center;\n }\n\n .relative {\n position:relative;\n }\n\n /* accessibility */\n body ._access-menu p._text-center{\n font-family: \"Montserrat\", sans-serif;\n font-style: italic;\n font-size: 1.2rem!important;\n margin-top: 6px;\n margin-bottom: 3px;\n } \n\n`;\n\nconst FontLoader: React.FC = () => {\n useEffect(() => {\n const link = document.createElement(\"link\");\n link.href =\n \"https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap\";\n link.rel = \"stylesheet\";\n document.head.appendChild(link);\n }, []);\n\n return null;\n};\n\nexport default FontLoader;\n"],"mappings":"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","names":["import_react","styled","import_styled_components","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/Form/index.tsx","../src/components/hooks/useError.ts","../src/components/styles/utils.ts","../src/components/Form/styles.ts","../src/components/styles/global.ts","../src/components/Alert/index.tsx","../src/components/Alert/styles.ts"],"sourcesContent":["import MitreFormComponent from \"./components/Form\";\n\nexport default MitreFormComponent;\n//export type { MitreFormComponentProps } from \"./components/Form\";\n","import React, { useState } from \"react\";\nimport { useError } from \"../hooks/useError\";\nimport { useForm, SubmitHandler } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as yup from \"yup\";\n\nimport { \n FormContainer, \n HeaderContainer, \n ButtonContainer, \n Form, \n Title, \n Text \n} from \"./styles\";\nimport FontLoader, { GlobalStyles } from \"../styles/global\";\n\nimport { Alert } from \"../Alert\";\n\nexport interface MitreFormComponentProps {\n productId: string;\n apiUrl: string;\n apiToken: string;\n utm_source: string;\n utm_medium: string;\n utm_campaign: string;\n utm_term: string;\n showHeader?: boolean;\n colorPrimary?: string;\n textColor?: string;\n backgroundColor?: string;\n innerPadding?: string;\n}\n\nconst schema = yup.object().shape({\n name: yup.string().required(\"Nome é obrigatório\"),\n email: yup.string().required(\"Email é obrigatório\").email(\"Email inválido\"),\n phone: yup.string().required(\"Telefone é obrigatório\")\n .test(\n 'min-digits',\n 'Número de telefone inválido!',\n (value) => {\n const digitsOnly = value?.replace(/\\D/g, '') || '';\n //TODO melhorar essa lógica com algum regex\n return digitsOnly.length >= 8\n })\n});\n\nconst MitreFormComponent = React.forwardRef<HTMLDivElement, MitreFormComponentProps>(({\n productId,\n apiUrl,\n apiToken,\n utm_source,\n utm_medium,\n utm_campaign,\n utm_term,\n showHeader = true,\n colorPrimary = \"#F6C76B\",\n textColor = \"#2F2F2F\",\n backgroundColor = \"#cecece\",\n innerPadding = \"1rem\",\n}, ref) => {\n const [loading, setIsLoading] = useState(false);\n const { error, handleError, clearError } = useError();\n const [successMessage, setSuccessMessage] = useState('');\n\n const { register, handleSubmit, formState: { errors }, reset, watch } = useForm({\n resolver: yupResolver(schema),\n });\n\n const phoneValue = watch(\"phone\");\n\n const sendMessage: SubmitHandler<{ name: string; email: string; phone: string; }> = async (data) => {\n const { name, email, phone } = data;\n const message = \"Gostaria de mais informações sobre o produto\";\n\n try {\n setIsLoading(true);\n\n if (!productId || !utm_source || !utm_medium || !utm_campaign || !utm_term || !apiToken) {\n throw new Error(\"Parâmetros obrigatórios não informados\");\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({\n name,\n email,\n phone,\n message,\n productId,\n utm_source,\n utm_medium,\n utm_campaign,\n utm_term,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"Falha ao enviar a mensagem!\");\n }\n\n setSuccessMessage(\"Mensagem enviada com sucesso!\");\n reset();\n } catch (err) {\n handleError(err);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <>\n <FontLoader />\n <GlobalStyles />\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 ref={ref} >\n <HeaderContainer>\n <Title >Atendimento por mensagem</Title>\n\n <Text >Informe seus dados e retornaremos a mensagem.</Text>\n </HeaderContainer>\n\n \n\n <h6>* Campos de preenchimento obrigatório.</h6>\n\n <ButtonContainer>\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 </FormContainer>\n </>\n );\n});\n\nMitreFormComponent.displayName = \"MitreFormComponent\";\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","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\";\n\nexport const FormContainer = styled.div`\n ${flex(\"column\")}\n align-items: stretch;\n justify-content: flex-start;\n overflow-x: hidden;\n overflow-y: auto;\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 height: 100%;\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\nexport const Form = styled.form`\n label {\n font-weight: 700;\n }\n\n input {\n background: white;\n margin-bottom: 0.75rem;\n }\n\n p {\n font-family: \"Montserrat\", sans-serif;\n font-style: italic;\n font-weight: 200;\n font-size: 0.8rem;\n text-align: start;\n }\n\n a {\n font-family: \"Montserrat\", sans-serif;\n font-style: italic;\n font-weight: 200;\n font-size: 0.8rem;\n }\n\n h6 {\n text-align: start;\n margin-left: 10px;\n }\n\n & > div {\n margin-bottom: 10px;,\n }\n\n button {\n ${opacityEffect}\n color: var(--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 Title = styled.h2`\n font-size: 1.25rem;\n font-weight: 700;\n line-height: 24px;\n letter-spacing: 0em;\n`;\n\nexport const Text = styled.p`\n font-size: 1rem;\n font-weight: 400;\n line-height: 23px;\n letter-spacing: 0em;\n margin-top: 10px;\n`;\n","import { createGlobalStyle } from \"styled-components\";\nimport React, { useEffect } from \"react\";\n\nexport const GlobalStyles = createGlobalStyle`\n :root {\n --red: #e52e4d;\n --white: #FFF;\n --black: #2F2F2F;\n --black-2:#1E1E1E;\n --alphaBlack: #000000;\n --black-2:#1E1E1E;\n --black-3:#353535;\n\n --yellow-400:#FFD789;\n --yellow-500: #F6C76B;\n --gray-40:#F0F0F0;\n --gray-45:#767676;\n --gray-50: #686A69;\n --gray-60: #8F8F8F;\n --gray-100: #B6B6B6;\n --gray-150: #B9B9B9;\n --gray-200: #D2D2D2;\n --gray-300: #EBEBEB;\n --gray-400: #ECECEC;\n --gray-500: #F4F4F4;\n --gray-550:#6F6F6F;\n --gray-600:#686868;\n --gray-700: #535353;\n --gray-800:#9D9D9D;\n --shadow-500: 0px 4px 8px rgba(91, 91, 91, 0.2);\n --green:#57C06E;\n --green-2:#2DCE68;\n --blue:#007BFF;\n }\n\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n html {\n scroll-behavior: smooth;\n\n @media (max-width: 1080px) {\n font-size: 93.75%;\n }\n @media (max-width: 720px) {\n font-size: 87.5%;\n }\n }\n\n body {\n background: var(--white);\n -webkit-font-smoothing: antialiased;\n }\n\n body, input, textarea, select, button {\n font-family: \"Montserrat\", sans-serif;\n font-weight: 400;\n } \n\n h1, h2, h3, h4, h5, h6, strong {\n font-weight: 600;\n }\n\n button {\n cursor: pointer;\n }\n\n [disabled] {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .hidden {\n overflow: hidden;\n }\n\n ::-webkit-scrollbar {\n -webkit-appearance: none;\n background: var(--gray-500);\n width: 6px;\n height: 10px;\n }\n\n ::-webkit-scrollbar-thumb {\n background-color: var(--gray-50);\n }\n\n .aligncenter {\n text-align: center;\n }\n\n .width-190px {\n width:190px;\n }\n\n .hidden-content {\n display:none !important;\n }\n\n .global-margin-bottom {\n margin-bottom:20px;\n }\n\n .background-light-gray {\n background:#F4F4F4;\n }\n\n .full-width-and-height {\n height:100%;\n width:100%;\n }\n\n .flex-direction-column {\n flex-direction:column;\n }\n\n .bold {\n font-weight:700;\n }\n\n .margin-center-x {\n margin:0 auto;\n }\n\n .border-none {\n border:none;\n }\n\n .text-center {\n text-align:center;\n }\n\n .relative {\n position:relative;\n }\n\n /* accessibility */\n body ._access-menu p._text-center{\n font-family: \"Montserrat\", sans-serif;\n font-style: italic;\n font-size: 1.2rem!important;\n margin-top: 6px;\n margin-bottom: 3px;\n } \n\n`;\n\nconst FontLoader: React.FC = () => {\n useEffect(() => {\n const link = document.createElement(\"link\");\n link.href =\n \"https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap\";\n link.rel = \"stylesheet\";\n document.head.appendChild(link);\n }, []);\n\n return null;\n};\n\nexport default FontLoader;\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\";\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: var(--red);\n border: 1px solid var(--red);\n color: var(--white);\n svg {\n color: var(--white);\n }\n `,\n warning: css`\n background-color: var(--yellow-500);\n border: 1px solid var(--yellow-400);\n color: var(--black);\n svg {\n color: var(--black);\n }\n `,\n info: css`\n background-color: var(--blue);\n border: 1px solid var(--blue);\n color: var(--white);\n svg {\n color: var(--white);\n }\n `,\n success: css`\n background-color: var(--green);\n border: 1px solid var(--green-2);\n color: var(--white);\n svg {\n color: var(--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: var(--shadow-500);\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"],"mappings":"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","names":["import_react","styled","import_styled_components","import_react","import_react","import_styled_components","styled","import_jsx_runtime","React"]}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
// src/components/Form/index.tsx
|
|
2
|
-
import
|
|
2
|
+
import React3, { useState as useState3 } from "react";
|
|
3
|
+
|
|
4
|
+
// src/components/hooks/useError.ts
|
|
5
|
+
import { useState } from "react";
|
|
6
|
+
function useError() {
|
|
7
|
+
const [error, setError] = useState(null);
|
|
8
|
+
const handleError = (err) => {
|
|
9
|
+
const errorObj = err instanceof Error ? err : new Error(String(err));
|
|
10
|
+
setError(errorObj);
|
|
11
|
+
console.error(errorObj);
|
|
12
|
+
};
|
|
13
|
+
const clearError = () => setError(null);
|
|
14
|
+
return { error, handleError, clearError };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// src/components/Form/index.tsx
|
|
18
|
+
import { useForm } from "react-hook-form";
|
|
19
|
+
import { yupResolver } from "@hookform/resolvers/yup";
|
|
20
|
+
import * as yup from "yup";
|
|
3
21
|
|
|
4
22
|
// src/components/styles/utils.ts
|
|
5
23
|
function flex(direction = "row", alignItems, justifyContent) {
|
|
@@ -271,9 +289,153 @@ var FontLoader = () => {
|
|
|
271
289
|
};
|
|
272
290
|
var global_default = FontLoader;
|
|
273
291
|
|
|
292
|
+
// src/components/Alert/index.tsx
|
|
293
|
+
import { useEffect as useEffect2, useState as useState2, useCallback } from "react";
|
|
294
|
+
|
|
295
|
+
// src/components/Alert/styles.ts
|
|
296
|
+
import styled2, { css, keyframes } from "styled-components";
|
|
297
|
+
var fadeIn = keyframes`
|
|
298
|
+
from { opacity: 0; transform: translateY(-10px); }
|
|
299
|
+
to { opacity: 1; transform: translateY(0); }
|
|
300
|
+
`;
|
|
301
|
+
var fadeOut = keyframes`
|
|
302
|
+
from { opacity: 1; transform: translateY(0); }
|
|
303
|
+
to { opacity: 0; transform: translateY(-10px); }
|
|
304
|
+
`;
|
|
305
|
+
var typeStyles = {
|
|
306
|
+
error: css`
|
|
307
|
+
background-color: var(--red);
|
|
308
|
+
border: 1px solid var(--red);
|
|
309
|
+
color: var(--white);
|
|
310
|
+
svg {
|
|
311
|
+
color: var(--white);
|
|
312
|
+
}
|
|
313
|
+
`,
|
|
314
|
+
warning: css`
|
|
315
|
+
background-color: var(--yellow-500);
|
|
316
|
+
border: 1px solid var(--yellow-400);
|
|
317
|
+
color: var(--black);
|
|
318
|
+
svg {
|
|
319
|
+
color: var(--black);
|
|
320
|
+
}
|
|
321
|
+
`,
|
|
322
|
+
info: css`
|
|
323
|
+
background-color: var(--blue);
|
|
324
|
+
border: 1px solid var(--blue);
|
|
325
|
+
color: var(--white);
|
|
326
|
+
svg {
|
|
327
|
+
color: var(--white);
|
|
328
|
+
}
|
|
329
|
+
`,
|
|
330
|
+
success: css`
|
|
331
|
+
background-color: var(--green);
|
|
332
|
+
border: 1px solid var(--green-2);
|
|
333
|
+
color: var(--white);
|
|
334
|
+
svg {
|
|
335
|
+
color: var(--white);
|
|
336
|
+
}
|
|
337
|
+
`
|
|
338
|
+
};
|
|
339
|
+
var AlertContainer = styled2.div`
|
|
340
|
+
position: fixed;
|
|
341
|
+
width: 500px;
|
|
342
|
+
top: 15px;
|
|
343
|
+
right: 15px;
|
|
344
|
+
padding: 1rem ${({ $dismissible }) => $dismissible ? "2.5rem" : "1rem"} 1rem
|
|
345
|
+
1rem;
|
|
346
|
+
margin-bottom: 1rem;
|
|
347
|
+
animation: ${({ $isClosing }) => $isClosing ? fadeOut : fadeIn} 0.3s
|
|
348
|
+
ease-out;
|
|
349
|
+
animation-fill-mode: forwards;
|
|
350
|
+
align-items: center;
|
|
351
|
+
gap: 0.5rem;
|
|
352
|
+
box-shadow: var(--shadow-500);
|
|
353
|
+
border-radius: 0.5rem;
|
|
354
|
+
font-size: 1rem;
|
|
355
|
+
font-weight: 500;
|
|
356
|
+
|
|
357
|
+
${({ $type }) => typeStyles[$type]}
|
|
358
|
+
`;
|
|
359
|
+
var DismissButton = styled2.button`
|
|
360
|
+
position: absolute;
|
|
361
|
+
background: transparent;
|
|
362
|
+
right: 10px;
|
|
363
|
+
border: none;
|
|
364
|
+
cursor: pointer;
|
|
365
|
+
color: inherit;
|
|
366
|
+
opacity: 1;
|
|
367
|
+
transition: opacity 0.2s;
|
|
368
|
+
|
|
369
|
+
&:hover {
|
|
370
|
+
opacity: 0.7;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
svg {
|
|
374
|
+
width: 1rem;
|
|
375
|
+
height: 1rem;
|
|
376
|
+
}
|
|
377
|
+
`;
|
|
378
|
+
|
|
379
|
+
// src/components/Alert/index.tsx
|
|
380
|
+
import { HiX } from "react-icons/hi";
|
|
381
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
382
|
+
var Alert = ({
|
|
383
|
+
type = "info",
|
|
384
|
+
children,
|
|
385
|
+
className,
|
|
386
|
+
dismissible = false,
|
|
387
|
+
onDismiss,
|
|
388
|
+
autoDismiss
|
|
389
|
+
}) => {
|
|
390
|
+
const [isClosing, setIsClosing] = useState2(false);
|
|
391
|
+
const handleDismiss = useCallback(() => {
|
|
392
|
+
setIsClosing(true);
|
|
393
|
+
setTimeout(() => onDismiss?.(), 300);
|
|
394
|
+
}, [onDismiss]);
|
|
395
|
+
useEffect2(() => {
|
|
396
|
+
if (autoDismiss) {
|
|
397
|
+
const timer = setTimeout(handleDismiss, autoDismiss);
|
|
398
|
+
return () => clearTimeout(timer);
|
|
399
|
+
}
|
|
400
|
+
}, [autoDismiss, handleDismiss]);
|
|
401
|
+
return /* @__PURE__ */ jsxs(
|
|
402
|
+
AlertContainer,
|
|
403
|
+
{
|
|
404
|
+
$type: type,
|
|
405
|
+
$dismissible: dismissible,
|
|
406
|
+
$isClosing: isClosing,
|
|
407
|
+
className,
|
|
408
|
+
role: "alert",
|
|
409
|
+
children: [
|
|
410
|
+
children,
|
|
411
|
+
dismissible && /* @__PURE__ */ jsx(
|
|
412
|
+
DismissButton,
|
|
413
|
+
{
|
|
414
|
+
onClick: handleDismiss,
|
|
415
|
+
"aria-label": "Dismiss alert",
|
|
416
|
+
children: /* @__PURE__ */ jsx(HiX, {})
|
|
417
|
+
}
|
|
418
|
+
)
|
|
419
|
+
]
|
|
420
|
+
}
|
|
421
|
+
);
|
|
422
|
+
};
|
|
423
|
+
|
|
274
424
|
// src/components/Form/index.tsx
|
|
275
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
276
|
-
var
|
|
425
|
+
import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
426
|
+
var schema = yup.object().shape({
|
|
427
|
+
name: yup.string().required("Nome \xE9 obrigat\xF3rio"),
|
|
428
|
+
email: yup.string().required("Email \xE9 obrigat\xF3rio").email("Email inv\xE1lido"),
|
|
429
|
+
phone: yup.string().required("Telefone \xE9 obrigat\xF3rio").test(
|
|
430
|
+
"min-digits",
|
|
431
|
+
"N\xFAmero de telefone inv\xE1lido!",
|
|
432
|
+
(value) => {
|
|
433
|
+
const digitsOnly = value?.replace(/\D/g, "") || "";
|
|
434
|
+
return digitsOnly.length >= 8;
|
|
435
|
+
}
|
|
436
|
+
)
|
|
437
|
+
});
|
|
438
|
+
var MitreFormComponent = React3.forwardRef(({
|
|
277
439
|
productId,
|
|
278
440
|
apiUrl,
|
|
279
441
|
apiToken,
|
|
@@ -287,20 +449,84 @@ var MitreFormComponent = React2.forwardRef(({
|
|
|
287
449
|
backgroundColor = "#cecece",
|
|
288
450
|
innerPadding = "1rem"
|
|
289
451
|
}, ref) => {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
452
|
+
const [loading, setIsLoading] = useState3(false);
|
|
453
|
+
const { error, handleError, clearError } = useError();
|
|
454
|
+
const [successMessage, setSuccessMessage] = useState3("");
|
|
455
|
+
const { register, handleSubmit, formState: { errors }, reset, watch } = useForm({
|
|
456
|
+
resolver: yupResolver(schema)
|
|
457
|
+
});
|
|
458
|
+
const phoneValue = watch("phone");
|
|
459
|
+
const sendMessage = async (data) => {
|
|
460
|
+
const { name, email, phone } = data;
|
|
461
|
+
const message = "Gostaria de mais informa\xE7\xF5es sobre o produto";
|
|
462
|
+
try {
|
|
463
|
+
setIsLoading(true);
|
|
464
|
+
if (!productId || !utm_source || !utm_medium || !utm_campaign || !utm_term || !apiToken) {
|
|
465
|
+
throw new Error("Par\xE2metros obrigat\xF3rios n\xE3o informados");
|
|
466
|
+
}
|
|
467
|
+
const response = await fetch(`${apiUrl}/leads`, {
|
|
468
|
+
method: "POST",
|
|
469
|
+
headers: {
|
|
470
|
+
"Content-Type": "application/json",
|
|
471
|
+
Authorization: `Basic ${apiToken}`
|
|
472
|
+
},
|
|
473
|
+
body: JSON.stringify({
|
|
474
|
+
name,
|
|
475
|
+
email,
|
|
476
|
+
phone,
|
|
477
|
+
message,
|
|
478
|
+
productId,
|
|
479
|
+
utm_source,
|
|
480
|
+
utm_medium,
|
|
481
|
+
utm_campaign,
|
|
482
|
+
utm_term
|
|
483
|
+
})
|
|
484
|
+
});
|
|
485
|
+
if (!response.ok) {
|
|
486
|
+
throw new Error("Falha ao enviar a mensagem!");
|
|
487
|
+
}
|
|
488
|
+
setSuccessMessage("Mensagem enviada com sucesso!");
|
|
489
|
+
reset();
|
|
490
|
+
} catch (err) {
|
|
491
|
+
handleError(err);
|
|
492
|
+
} finally {
|
|
493
|
+
setIsLoading(false);
|
|
494
|
+
}
|
|
495
|
+
};
|
|
496
|
+
return /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
497
|
+
/* @__PURE__ */ jsx2(global_default, {}),
|
|
498
|
+
/* @__PURE__ */ jsx2(GlobalStyles, {}),
|
|
499
|
+
error && /* @__PURE__ */ jsx2(
|
|
500
|
+
Alert,
|
|
501
|
+
{
|
|
502
|
+
type: "error",
|
|
503
|
+
dismissible: true,
|
|
504
|
+
onDismiss: clearError,
|
|
505
|
+
autoDismiss: 5e3,
|
|
506
|
+
children: error.message
|
|
507
|
+
}
|
|
508
|
+
),
|
|
509
|
+
successMessage && /* @__PURE__ */ jsx2(
|
|
510
|
+
Alert,
|
|
511
|
+
{
|
|
512
|
+
type: "success",
|
|
513
|
+
dismissible: true,
|
|
514
|
+
onDismiss: () => setSuccessMessage(""),
|
|
515
|
+
autoDismiss: 5e3,
|
|
516
|
+
children: successMessage
|
|
517
|
+
}
|
|
518
|
+
),
|
|
519
|
+
/* @__PURE__ */ jsxs2(FormContainer, { ref, children: [
|
|
520
|
+
/* @__PURE__ */ jsxs2(HeaderContainer, { children: [
|
|
521
|
+
/* @__PURE__ */ jsx2(Title, { children: "Atendimento por mensagem" }),
|
|
522
|
+
/* @__PURE__ */ jsx2(Text, { children: "Informe seus dados e retornaremos a mensagem." })
|
|
297
523
|
] }),
|
|
298
|
-
/* @__PURE__ */
|
|
299
|
-
/* @__PURE__ */
|
|
300
|
-
/* @__PURE__ */
|
|
524
|
+
/* @__PURE__ */ jsx2("h6", { children: "* Campos de preenchimento obrigat\xF3rio." }),
|
|
525
|
+
/* @__PURE__ */ jsx2(ButtonContainer, {}),
|
|
526
|
+
/* @__PURE__ */ jsxs2("p", { children: [
|
|
301
527
|
"A Mitre Realty respeita a sua privacidade e utiliza os seus dados pessoais para contat\xE1-lo por e-mail ou telefone aqui registrados. Para saber mais, acesse a nossa",
|
|
302
528
|
" ",
|
|
303
|
-
/* @__PURE__ */
|
|
529
|
+
/* @__PURE__ */ jsx2(
|
|
304
530
|
"a",
|
|
305
531
|
{
|
|
306
532
|
href: "https://www.mitrerealty.com.br/politica-de-privacidade",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Form/index.tsx","../src/components/styles/utils.ts","../src/components/Form/styles.ts","../src/components/styles/global.ts","../src/index.ts"],"sourcesContent":["import React, { useState } from \"react\";\n\nimport { \n FormContainer, \n HeaderContainer, \n ButtonContainer, \n Form, \n Title, \n Text \n} from \"./styles\";\nimport FontLoader, { GlobalStyles } from \"../styles/global\";\n\nexport interface MitreFormComponentProps {\n productId: string;\n apiUrl: string;\n apiToken: string;\n utm_source: string;\n utm_medium: string;\n utm_campaign: string;\n utm_term: string;\n showHeader?: boolean;\n colorPrimary?: string;\n textColor?: string;\n backgroundColor?: string;\n innerPadding?: string;\n}\n\nconst MitreFormComponent = React.forwardRef<HTMLDivElement, MitreFormComponentProps>(({\n productId,\n apiUrl,\n apiToken,\n utm_source,\n utm_medium,\n utm_campaign,\n utm_term,\n showHeader = true,\n colorPrimary = \"#F6C76B\",\n textColor = \"#2F2F2F\",\n backgroundColor = \"#cecece\",\n innerPadding = \"1rem\",\n}, ref) => {\n return (\n <>\n <FontLoader />\n <GlobalStyles />\n <FormContainer ref={ref} >\n <HeaderContainer>\n <Title >Atendimento por mensagem</Title>\n\n <Text >Informe seus dados e retornaremos a mensagem.</Text>\n </HeaderContainer>\n\n \n\n <h6>* Campos de preenchimento obrigatório.</h6>\n\n <ButtonContainer>\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 </FormContainer>\n </>\n );\n});\n\nMitreFormComponent.displayName = \"MitreFormComponent\";\nexport default MitreFormComponent;\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\";\n\nexport const FormContainer = styled.div`\n ${flex(\"column\")}\n align-items: stretch;\n justify-content: flex-start;\n overflow-x: hidden;\n overflow-y: auto;\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 height: 100%;\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\nexport const Form = styled.form`\n label {\n font-weight: 700;\n }\n\n input {\n background: white;\n margin-bottom: 0.75rem;\n }\n\n p {\n font-family: \"Montserrat\", sans-serif;\n font-style: italic;\n font-weight: 200;\n font-size: 0.8rem;\n text-align: start;\n }\n\n a {\n font-family: \"Montserrat\", sans-serif;\n font-style: italic;\n font-weight: 200;\n font-size: 0.8rem;\n }\n\n h6 {\n text-align: start;\n margin-left: 10px;\n }\n\n & > div {\n margin-bottom: 10px;,\n }\n\n button {\n ${opacityEffect}\n color: var(--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 Title = styled.h2`\n font-size: 1.25rem;\n font-weight: 700;\n line-height: 24px;\n letter-spacing: 0em;\n`;\n\nexport const Text = styled.p`\n font-size: 1rem;\n font-weight: 400;\n line-height: 23px;\n letter-spacing: 0em;\n margin-top: 10px;\n`;\n","import { createGlobalStyle } from \"styled-components\";\nimport React, { useEffect } from \"react\";\n\nexport const GlobalStyles = createGlobalStyle`\n :root {\n --red: #e52e4d;\n --white: #FFF;\n --black: #2F2F2F;\n --black-2:#1E1E1E;\n --alphaBlack: #000000;\n --black-2:#1E1E1E;\n --black-3:#353535;\n\n --yellow-400:#FFD789;\n --yellow-500: #F6C76B;\n --gray-40:#F0F0F0;\n --gray-45:#767676;\n --gray-50: #686A69;\n --gray-60: #8F8F8F;\n --gray-100: #B6B6B6;\n --gray-150: #B9B9B9;\n --gray-200: #D2D2D2;\n --gray-300: #EBEBEB;\n --gray-400: #ECECEC;\n --gray-500: #F4F4F4;\n --gray-550:#6F6F6F;\n --gray-600:#686868;\n --gray-700: #535353;\n --gray-800:#9D9D9D;\n --shadow-500: 0px 4px 8px rgba(91, 91, 91, 0.2);\n --green:#57C06E;\n --green-2:#2DCE68;\n --blue:#007BFF;\n }\n\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n html {\n scroll-behavior: smooth;\n\n @media (max-width: 1080px) {\n font-size: 93.75%;\n }\n @media (max-width: 720px) {\n font-size: 87.5%;\n }\n }\n\n body {\n background: var(--white);\n -webkit-font-smoothing: antialiased;\n }\n\n body, input, textarea, select, button {\n font-family: \"Montserrat\", sans-serif;\n font-weight: 400;\n } \n\n h1, h2, h3, h4, h5, h6, strong {\n font-weight: 600;\n }\n\n button {\n cursor: pointer;\n }\n\n [disabled] {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .hidden {\n overflow: hidden;\n }\n\n ::-webkit-scrollbar {\n -webkit-appearance: none;\n background: var(--gray-500);\n width: 6px;\n height: 10px;\n }\n\n ::-webkit-scrollbar-thumb {\n background-color: var(--gray-50);\n }\n\n .aligncenter {\n text-align: center;\n }\n\n .width-190px {\n width:190px;\n }\n\n .hidden-content {\n display:none !important;\n }\n\n .global-margin-bottom {\n margin-bottom:20px;\n }\n\n .background-light-gray {\n background:#F4F4F4;\n }\n\n .full-width-and-height {\n height:100%;\n width:100%;\n }\n\n .flex-direction-column {\n flex-direction:column;\n }\n\n .bold {\n font-weight:700;\n }\n\n .margin-center-x {\n margin:0 auto;\n }\n\n .border-none {\n border:none;\n }\n\n .text-center {\n text-align:center;\n }\n\n .relative {\n position:relative;\n }\n\n /* accessibility */\n body ._access-menu p._text-center{\n font-family: \"Montserrat\", sans-serif;\n font-style: italic;\n font-size: 1.2rem!important;\n margin-top: 6px;\n margin-bottom: 3px;\n } \n\n`;\n\nconst FontLoader: React.FC = () => {\n useEffect(() => {\n const link = document.createElement(\"link\");\n link.href =\n \"https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap\";\n link.rel = \"stylesheet\";\n document.head.appendChild(link);\n }, []);\n\n return null;\n};\n\nexport default FontLoader;\n","import MitreFormComponent from \"./components/Form\";\n\nexport default MitreFormComponent;\n//export type { MitreFormComponentProps } from \"./components/Form\";\n"],"mappings":"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","names":["React","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Form/index.tsx","../src/components/hooks/useError.ts","../src/components/styles/utils.ts","../src/components/Form/styles.ts","../src/components/styles/global.ts","../src/components/Alert/index.tsx","../src/components/Alert/styles.ts","../src/index.ts"],"sourcesContent":["import React, { useState } from \"react\";\nimport { useError } from \"../hooks/useError\";\nimport { useForm, SubmitHandler } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as yup from \"yup\";\n\nimport { \n FormContainer, \n HeaderContainer, \n ButtonContainer, \n Form, \n Title, \n Text \n} from \"./styles\";\nimport FontLoader, { GlobalStyles } from \"../styles/global\";\n\nimport { Alert } from \"../Alert\";\n\nexport interface MitreFormComponentProps {\n productId: string;\n apiUrl: string;\n apiToken: string;\n utm_source: string;\n utm_medium: string;\n utm_campaign: string;\n utm_term: string;\n showHeader?: boolean;\n colorPrimary?: string;\n textColor?: string;\n backgroundColor?: string;\n innerPadding?: string;\n}\n\nconst schema = yup.object().shape({\n name: yup.string().required(\"Nome é obrigatório\"),\n email: yup.string().required(\"Email é obrigatório\").email(\"Email inválido\"),\n phone: yup.string().required(\"Telefone é obrigatório\")\n .test(\n 'min-digits',\n 'Número de telefone inválido!',\n (value) => {\n const digitsOnly = value?.replace(/\\D/g, '') || '';\n //TODO melhorar essa lógica com algum regex\n return digitsOnly.length >= 8\n })\n});\n\nconst MitreFormComponent = React.forwardRef<HTMLDivElement, MitreFormComponentProps>(({\n productId,\n apiUrl,\n apiToken,\n utm_source,\n utm_medium,\n utm_campaign,\n utm_term,\n showHeader = true,\n colorPrimary = \"#F6C76B\",\n textColor = \"#2F2F2F\",\n backgroundColor = \"#cecece\",\n innerPadding = \"1rem\",\n}, ref) => {\n const [loading, setIsLoading] = useState(false);\n const { error, handleError, clearError } = useError();\n const [successMessage, setSuccessMessage] = useState('');\n\n const { register, handleSubmit, formState: { errors }, reset, watch } = useForm({\n resolver: yupResolver(schema),\n });\n\n const phoneValue = watch(\"phone\");\n\n const sendMessage: SubmitHandler<{ name: string; email: string; phone: string; }> = async (data) => {\n const { name, email, phone } = data;\n const message = \"Gostaria de mais informações sobre o produto\";\n\n try {\n setIsLoading(true);\n\n if (!productId || !utm_source || !utm_medium || !utm_campaign || !utm_term || !apiToken) {\n throw new Error(\"Parâmetros obrigatórios não informados\");\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({\n name,\n email,\n phone,\n message,\n productId,\n utm_source,\n utm_medium,\n utm_campaign,\n utm_term,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"Falha ao enviar a mensagem!\");\n }\n\n setSuccessMessage(\"Mensagem enviada com sucesso!\");\n reset();\n } catch (err) {\n handleError(err);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <>\n <FontLoader />\n <GlobalStyles />\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 ref={ref} >\n <HeaderContainer>\n <Title >Atendimento por mensagem</Title>\n\n <Text >Informe seus dados e retornaremos a mensagem.</Text>\n </HeaderContainer>\n\n \n\n <h6>* Campos de preenchimento obrigatório.</h6>\n\n <ButtonContainer>\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 </FormContainer>\n </>\n );\n});\n\nMitreFormComponent.displayName = \"MitreFormComponent\";\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","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\";\n\nexport const FormContainer = styled.div`\n ${flex(\"column\")}\n align-items: stretch;\n justify-content: flex-start;\n overflow-x: hidden;\n overflow-y: auto;\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 height: 100%;\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\nexport const Form = styled.form`\n label {\n font-weight: 700;\n }\n\n input {\n background: white;\n margin-bottom: 0.75rem;\n }\n\n p {\n font-family: \"Montserrat\", sans-serif;\n font-style: italic;\n font-weight: 200;\n font-size: 0.8rem;\n text-align: start;\n }\n\n a {\n font-family: \"Montserrat\", sans-serif;\n font-style: italic;\n font-weight: 200;\n font-size: 0.8rem;\n }\n\n h6 {\n text-align: start;\n margin-left: 10px;\n }\n\n & > div {\n margin-bottom: 10px;,\n }\n\n button {\n ${opacityEffect}\n color: var(--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 Title = styled.h2`\n font-size: 1.25rem;\n font-weight: 700;\n line-height: 24px;\n letter-spacing: 0em;\n`;\n\nexport const Text = styled.p`\n font-size: 1rem;\n font-weight: 400;\n line-height: 23px;\n letter-spacing: 0em;\n margin-top: 10px;\n`;\n","import { createGlobalStyle } from \"styled-components\";\nimport React, { useEffect } from \"react\";\n\nexport const GlobalStyles = createGlobalStyle`\n :root {\n --red: #e52e4d;\n --white: #FFF;\n --black: #2F2F2F;\n --black-2:#1E1E1E;\n --alphaBlack: #000000;\n --black-2:#1E1E1E;\n --black-3:#353535;\n\n --yellow-400:#FFD789;\n --yellow-500: #F6C76B;\n --gray-40:#F0F0F0;\n --gray-45:#767676;\n --gray-50: #686A69;\n --gray-60: #8F8F8F;\n --gray-100: #B6B6B6;\n --gray-150: #B9B9B9;\n --gray-200: #D2D2D2;\n --gray-300: #EBEBEB;\n --gray-400: #ECECEC;\n --gray-500: #F4F4F4;\n --gray-550:#6F6F6F;\n --gray-600:#686868;\n --gray-700: #535353;\n --gray-800:#9D9D9D;\n --shadow-500: 0px 4px 8px rgba(91, 91, 91, 0.2);\n --green:#57C06E;\n --green-2:#2DCE68;\n --blue:#007BFF;\n }\n\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n html {\n scroll-behavior: smooth;\n\n @media (max-width: 1080px) {\n font-size: 93.75%;\n }\n @media (max-width: 720px) {\n font-size: 87.5%;\n }\n }\n\n body {\n background: var(--white);\n -webkit-font-smoothing: antialiased;\n }\n\n body, input, textarea, select, button {\n font-family: \"Montserrat\", sans-serif;\n font-weight: 400;\n } \n\n h1, h2, h3, h4, h5, h6, strong {\n font-weight: 600;\n }\n\n button {\n cursor: pointer;\n }\n\n [disabled] {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .hidden {\n overflow: hidden;\n }\n\n ::-webkit-scrollbar {\n -webkit-appearance: none;\n background: var(--gray-500);\n width: 6px;\n height: 10px;\n }\n\n ::-webkit-scrollbar-thumb {\n background-color: var(--gray-50);\n }\n\n .aligncenter {\n text-align: center;\n }\n\n .width-190px {\n width:190px;\n }\n\n .hidden-content {\n display:none !important;\n }\n\n .global-margin-bottom {\n margin-bottom:20px;\n }\n\n .background-light-gray {\n background:#F4F4F4;\n }\n\n .full-width-and-height {\n height:100%;\n width:100%;\n }\n\n .flex-direction-column {\n flex-direction:column;\n }\n\n .bold {\n font-weight:700;\n }\n\n .margin-center-x {\n margin:0 auto;\n }\n\n .border-none {\n border:none;\n }\n\n .text-center {\n text-align:center;\n }\n\n .relative {\n position:relative;\n }\n\n /* accessibility */\n body ._access-menu p._text-center{\n font-family: \"Montserrat\", sans-serif;\n font-style: italic;\n font-size: 1.2rem!important;\n margin-top: 6px;\n margin-bottom: 3px;\n } \n\n`;\n\nconst FontLoader: React.FC = () => {\n useEffect(() => {\n const link = document.createElement(\"link\");\n link.href =\n \"https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap\";\n link.rel = \"stylesheet\";\n document.head.appendChild(link);\n }, []);\n\n return null;\n};\n\nexport default FontLoader;\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\";\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: var(--red);\n border: 1px solid var(--red);\n color: var(--white);\n svg {\n color: var(--white);\n }\n `,\n warning: css`\n background-color: var(--yellow-500);\n border: 1px solid var(--yellow-400);\n color: var(--black);\n svg {\n color: var(--black);\n }\n `,\n info: css`\n background-color: var(--blue);\n border: 1px solid var(--blue);\n color: var(--white);\n svg {\n color: var(--white);\n }\n `,\n success: css`\n background-color: var(--green);\n border: 1px solid var(--green-2);\n color: var(--white);\n svg {\n color: var(--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: var(--shadow-500);\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 MitreFormComponent from \"./components/Form\";\n\nexport default MitreFormComponent;\n//export type { MitreFormComponentProps } from \"./components/Form\";\n"],"mappings":"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","names":["React","useState","useEffect","useState","styled","useState","useEffect","jsx","jsxs","React","useState"]}
|