Compare commits

...

6 Commits

Author SHA1 Message Date
avanzato 8c056b0c50 Release PROD: Revisão Logo, Favicon, Robots
Deploy PROD Avanzato / deploy-prod (push) Successful in 33s
2026-05-31 00:03:02 -03:00
avanzato b284c4d258 Merge remote-tracking branch 'origin/develop' 2026-05-31 00:02:57 -03:00
avanzato 3d36e98185 Log release HML: Revisão Logo, Favicon, Robots
Deploy HML Avanzato / deploy-hml (push) Successful in 59s
2026-05-30 23:54:49 -03:00
avanzato 4e26c13240 Revisão Logo, Favicon, Robots 2026-05-30 23:54:48 -03:00
avanzato 3e91269f12 Log release HML: Revisão logo
Deploy HML Avanzato / deploy-hml (push) Successful in 33s
2026-05-30 23:52:08 -03:00
avanzato b3b8917a96 Revisão logo 2026-05-30 23:52:07 -03:00
27 changed files with 722 additions and 33378 deletions
+27
View File
@@ -5,6 +5,33 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- DETECAO DE AMBIENTE - Inline (executa antes de tudo) -->
<script>
(function() {
var h = location.hostname;
var IS_PROD = h === 'avanzato.com.br' || h === 'www.avanzato.com.br';
// Se NAO for producao, desativa tracking globalmente
if (!IS_PROD) {
window.__AVANZATO_ENV__ = h === 'hml.avanzato.com.br' ? 'homologation' : 'development';
// Bloqueia gtag
window.dataLayer = { push: function(){} };
window.gtag = function(){};
// Bloqueia fbq (Facebook Pixel)
window.fbq = function(){};
// Bloqueia Mautic
window.MauticSDKLoaded = true;
console.log('[Avanzato] Ambiente: ' + window.__AVANZATO_ENV__ + ' | Tracking bloqueado');
} else {
window.__AVANZATO_ENV__ = 'production';
}
})();
</script>
<!-- Google tag (gtag.js) - Ads + Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-16714813566"></script>
<script>
File diff suppressed because it is too large Load Diff
-33
View File
@@ -1,33 +0,0 @@
# Release HML
Data: sáb 30 mai 2026 23:14:48 -03
Ambiente:
HML
Descrição:
Favivon - Correção
Branch:
develop
Arquivos alterados antes do commit:
M package-lock.json
M src/sections/Footer.tsx
?? infra/releases/2026-05-30_23-14-47_HML.md
?? public/favicon.png
Status:
Preparado para publicação
Commit:
643f4a3f
Arquivos no commit:
infra/releases/2026-05-30_23-14-47_HML.md
package-lock.json
public/favicon.png
src/sections/Footer.tsx
Status final:
Publicado no Gitea / aguardando pipeline HML
+205
View File
@@ -0,0 +1,205 @@
# Release HML
Data: sáb 30 mai 2026 23:54:46 -03
Ambiente:
HML
Descrição:
Revisão Logo, Favicon, Robots
Branch:
develop
Arquivos alterados antes do commit:
D .github/workflows/README-CI-CD.md
D .github/workflows/deploy.yml
D .gitignore
M index.html
D infra/releases/2026-05-30_23-52-07_HML.md
M node_modules/.package-lock.json
M node_modules/.vite/deps/@radix-ui_react-dialog.js
M node_modules/.vite/deps/@radix-ui_react-radio-group.js
M node_modules/.vite/deps/@radix-ui_react-select.js
M node_modules/.vite/deps/_metadata.json
M package-lock.json
M package.json
M public/robots.txt
M public/sitemap.xml
M scripts/dev.sh
M src/App.tsx
M src/components/HomologationBanner.tsx
M src/config/mautic.ts
M src/config/site.ts
M src/main.tsx
M src/pages/Blog.tsx
M src/pages/Cases.tsx
M src/pages/Condominios.tsx
M src/pages/Privacidade.tsx
M src/pages/Sobre.tsx
M src/pages/Tecnologias.tsx
M src/pages/Termos.tsx
M src/pages/nichos/Advocacia.tsx
M src/pages/nichos/BackupCorporativo.tsx
M src/pages/nichos/Contabilidade.tsx
M src/pages/nichos/FirewallPfSense.tsx
M src/pages/nichos/Monitoramento.tsx
M src/pages/nichos/VoipEmpresarial.tsx
M src/pages/services/Backup.tsx
M src/pages/services/CloudComputing.tsx
M src/pages/services/Consultoria.tsx
M src/pages/services/Noc.tsx
M src/pages/services/Pabx.tsx
M src/pages/services/Redes.tsx
M src/pages/services/Seguranca.tsx
M src/pages/services/Servidores.tsx
M src/pages/services/Suporte.tsx
M src/pages/services/TiGerenciada.tsx
M src/pages/tech/Cisco.tsx
M src/pages/tech/Linux.tsx
M src/pages/tech/PfSense.tsx
M src/pages/tech/Proxmox.tsx
M src/pages/tech/Sharepoint.tsx
M src/pages/tech/Vmware.tsx
M src/pages/tech/WindowsServer.tsx
M src/sections/Footer.tsx
M src/sections/Navigation.tsx
M vite.config.ts
?? DEPLOY-DOCKER.md
?? GUIA-NGINX.md
?? infra/releases/2026-05-30_23-54-46_HML.md
?? nginx-docker.conf
?? node_modules/.vite/deps/chunk-INCCO7S4.js
?? node_modules/.vite/deps/chunk-INCCO7S4.js.map
?? node_modules/.vite/deps/chunk-L2OGOWTU.js
?? node_modules/.vite/deps/chunk-L2OGOWTU.js.map
?? node_modules/.vite/deps/chunk-LIWCVBQK.js
?? node_modules/.vite/deps/chunk-LIWCVBQK.js.map
?? node_modules/.vite/deps/chunk-MOFDO34C.js
?? node_modules/.vite/deps/chunk-MOFDO34C.js.map
?? node_modules/.vite/deps/react-helmet-async.js
?? node_modules/.vite/deps/react-helmet-async.js.map
?? node_modules/invariant/
?? node_modules/react-fast-compare/
?? node_modules/react-helmet-async/
?? node_modules/shallowequal/
?? public/version.json
?? scripts/build-static-routes.sh
?? src/components/SEO.tsx
?? src/config/environment.ts
Status:
Preparado para publicação
Commit:
4e26c132
Arquivos no commit:
.github/workflows/README-CI-CD.md
.github/workflows/deploy.yml
.gitignore
DEPLOY-DOCKER.md
GUIA-NGINX.md
index.html
infra/releases/2026-05-30_23-52-07_HML.md
infra/releases/2026-05-30_23-54-46_HML.md
nginx-docker.conf
node_modules/.package-lock.json
node_modules/.vite/deps/@radix-ui_react-dialog.js
node_modules/.vite/deps/@radix-ui_react-radio-group.js
node_modules/.vite/deps/@radix-ui_react-select.js
node_modules/.vite/deps/_metadata.json
node_modules/.vite/deps/chunk-INCCO7S4.js
node_modules/.vite/deps/chunk-INCCO7S4.js.map
node_modules/.vite/deps/chunk-L2OGOWTU.js
node_modules/.vite/deps/chunk-L2OGOWTU.js.map
node_modules/.vite/deps/chunk-LIWCVBQK.js
node_modules/.vite/deps/chunk-LIWCVBQK.js.map
node_modules/.vite/deps/chunk-MOFDO34C.js
node_modules/.vite/deps/chunk-MOFDO34C.js.map
node_modules/.vite/deps/react-helmet-async.js
node_modules/.vite/deps/react-helmet-async.js.map
node_modules/invariant/CHANGELOG.md
node_modules/invariant/LICENSE
node_modules/invariant/README.md
node_modules/invariant/browser.js
node_modules/invariant/invariant.js
node_modules/invariant/invariant.js.flow
node_modules/invariant/package.json
node_modules/react-fast-compare/LICENSE
node_modules/react-fast-compare/README.md
node_modules/react-fast-compare/index.d.ts
node_modules/react-fast-compare/index.js
node_modules/react-fast-compare/package.json
node_modules/react-helmet-async/LICENSE
node_modules/react-helmet-async/README.md
node_modules/react-helmet-async/lib/Dispatcher.d.ts
node_modules/react-helmet-async/lib/HelmetData.d.ts
node_modules/react-helmet-async/lib/Provider.d.ts
node_modules/react-helmet-async/lib/React19Dispatcher.d.ts
node_modules/react-helmet-async/lib/client.d.ts
node_modules/react-helmet-async/lib/constants.d.ts
node_modules/react-helmet-async/lib/index.d.ts
node_modules/react-helmet-async/lib/index.esm.js
node_modules/react-helmet-async/lib/index.js
node_modules/react-helmet-async/lib/reactVersion.d.ts
node_modules/react-helmet-async/lib/server.d.ts
node_modules/react-helmet-async/lib/types.d.ts
node_modules/react-helmet-async/lib/utils.d.ts
node_modules/react-helmet-async/package.json
node_modules/shallowequal/LICENSE
node_modules/shallowequal/README.md
node_modules/shallowequal/index.js
node_modules/shallowequal/index.js.flow
node_modules/shallowequal/index.original.js
node_modules/shallowequal/package.json
package-lock.json
package.json
public/robots.txt
public/sitemap.xml
public/version.json
scripts/build-static-routes.sh
scripts/dev.sh
src/App.tsx
src/components/HomologationBanner.tsx
src/components/SEO.tsx
src/config/environment.ts
src/config/mautic.ts
src/config/site.ts
src/main.tsx
src/pages/Blog.tsx
src/pages/Cases.tsx
src/pages/Condominios.tsx
src/pages/Privacidade.tsx
src/pages/Sobre.tsx
src/pages/Tecnologias.tsx
src/pages/Termos.tsx
src/pages/nichos/Advocacia.tsx
src/pages/nichos/BackupCorporativo.tsx
src/pages/nichos/Contabilidade.tsx
src/pages/nichos/FirewallPfSense.tsx
src/pages/nichos/Monitoramento.tsx
src/pages/nichos/VoipEmpresarial.tsx
src/pages/services/Backup.tsx
src/pages/services/CloudComputing.tsx
src/pages/services/Consultoria.tsx
src/pages/services/Noc.tsx
src/pages/services/Pabx.tsx
src/pages/services/Redes.tsx
src/pages/services/Seguranca.tsx
src/pages/services/Servidores.tsx
src/pages/services/Suporte.tsx
src/pages/services/TiGerenciada.tsx
src/pages/tech/Cisco.tsx
src/pages/tech/Linux.tsx
src/pages/tech/PfSense.tsx
src/pages/tech/Proxmox.tsx
src/pages/tech/Sharepoint.tsx
src/pages/tech/Vmware.tsx
src/pages/tech/WindowsServer.tsx
src/sections/Footer.tsx
src/sections/Navigation.tsx
vite.config.ts
Status final:
Publicado no Gitea / aguardando pipeline HML
@@ -0,0 +1,24 @@
# Release PROD
Data: dom 31 mai 2026 00:03:02 -03
Ambiente:
PROD
Descrição:
Revisão Logo, Favicon, Robots
Branch:
main
Commit:
b284c4d2
Último commit develop:
3d36e981
Arquivos alterados no último commit:
Status:
Preparado para publicação em produção
+4 -4
View File
@@ -1,7 +1,7 @@
"use client";
import {
Presence
} from "./chunk-KKEH7IGY.js";
} from "./chunk-INCCO7S4.js";
import {
Combination_default,
DismissableLayer,
@@ -9,7 +9,7 @@ import {
Portal,
hideOthers,
useFocusGuards
} from "./chunk-QF76HVLY.js";
} from "./chunk-LIWCVBQK.js";
import {
Primitive,
composeEventHandlers,
@@ -17,12 +17,12 @@ import {
createContextScope,
useControllableState,
useId
} from "./chunk-X34PLQQA.js";
import "./chunk-YF4B4G2L.js";
} from "./chunk-MOFDO34C.js";
import {
composeRefs,
useComposedRefs
} from "./chunk-2VUH7NEY.js";
import "./chunk-YF4B4G2L.js";
import {
require_jsx_runtime
} from "./chunk-2YVA4HRZ.js";
+1 -1
View File
@@ -2,10 +2,10 @@
import {
createSlot
} from "./chunk-YWBEB5PG.js";
import "./chunk-2VUH7NEY.js";
import {
require_react_dom
} from "./chunk-YF4B4G2L.js";
import "./chunk-2VUH7NEY.js";
import {
require_jsx_runtime
} from "./chunk-2YVA4HRZ.js";
+6 -6
View File
@@ -1,13 +1,13 @@
"use client";
import {
Presence
} from "./chunk-INCCO7S4.js";
import {
createCollection,
useDirection,
usePrevious,
useSize
} from "./chunk-D4MYACAJ.js";
import {
Presence
} from "./chunk-KKEH7IGY.js";
} from "./chunk-L2OGOWTU.js";
import {
Primitive,
composeEventHandlers,
@@ -15,11 +15,11 @@ import {
useCallbackRef,
useControllableState,
useId
} from "./chunk-X34PLQQA.js";
import "./chunk-YF4B4G2L.js";
} from "./chunk-MOFDO34C.js";
import {
useComposedRefs
} from "./chunk-2VUH7NEY.js";
import "./chunk-YF4B4G2L.js";
import {
require_jsx_runtime
} from "./chunk-2YVA4HRZ.js";
+11 -11
View File
@@ -1,10 +1,4 @@
"use client";
import {
createCollection,
useDirection,
usePrevious,
useSize
} from "./chunk-D4MYACAJ.js";
import {
Combination_default,
DismissableLayer,
@@ -12,7 +6,13 @@ import {
Portal,
hideOthers,
useFocusGuards
} from "./chunk-QF76HVLY.js";
} from "./chunk-LIWCVBQK.js";
import {
createCollection,
useDirection,
usePrevious,
useSize
} from "./chunk-L2OGOWTU.js";
import {
Primitive,
composeEventHandlers,
@@ -21,14 +21,14 @@ import {
useControllableState,
useId,
useLayoutEffect2
} from "./chunk-X34PLQQA.js";
import {
require_react_dom
} from "./chunk-YF4B4G2L.js";
} from "./chunk-MOFDO34C.js";
import {
composeRefs,
useComposedRefs
} from "./chunk-2VUH7NEY.js";
import {
require_react_dom
} from "./chunk-YF4B4G2L.js";
import {
require_jsx_runtime
} from "./chunk-2YVA4HRZ.js";
+29 -29
View File
@@ -7,109 +7,109 @@
"react": {
"src": "../../react/index.js",
"file": "react.js",
"fileHash": "5b37d437",
"fileHash": "d2a0cc23",
"needsInterop": true
},
"react-dom": {
"src": "../../react-dom/index.js",
"file": "react-dom.js",
"fileHash": "a8665bbc",
"fileHash": "e89a827d",
"needsInterop": true
},
"react/jsx-dev-runtime": {
"src": "../../react/jsx-dev-runtime.js",
"file": "react_jsx-dev-runtime.js",
"fileHash": "5962ef4b",
"fileHash": "9ce7ae60",
"needsInterop": true
},
"react/jsx-runtime": {
"src": "../../react/jsx-runtime.js",
"file": "react_jsx-runtime.js",
"fileHash": "cc4583ea",
"fileHash": "8ba5f754",
"needsInterop": true
},
"@radix-ui/react-dialog": {
"src": "../../@radix-ui/react-dialog/dist/index.mjs",
"file": "@radix-ui_react-dialog.js",
"fileHash": "e65a7fe9",
"fileHash": "312e2a39",
"needsInterop": false
},
"@radix-ui/react-label": {
"src": "../../@radix-ui/react-label/dist/index.mjs",
"file": "@radix-ui_react-label.js",
"fileHash": "d5676393",
"fileHash": "3b607856",
"needsInterop": false
},
"@radix-ui/react-radio-group": {
"src": "../../@radix-ui/react-radio-group/dist/index.mjs",
"file": "@radix-ui_react-radio-group.js",
"fileHash": "8a90e2b5",
"fileHash": "20509c2b",
"needsInterop": false
},
"@radix-ui/react-select": {
"src": "../../@radix-ui/react-select/dist/index.mjs",
"file": "@radix-ui_react-select.js",
"fileHash": "0b10fc7e",
"fileHash": "91be68ee",
"needsInterop": false
},
"@radix-ui/react-slot": {
"src": "../../@radix-ui/react-slot/dist/index.mjs",
"file": "@radix-ui_react-slot.js",
"fileHash": "c8dbd881",
"fileHash": "ce1344ec",
"needsInterop": false
},
"class-variance-authority": {
"src": "../../class-variance-authority/dist/index.mjs",
"file": "class-variance-authority.js",
"fileHash": "5acda8ac",
"fileHash": "0e5017ff",
"needsInterop": false
},
"clsx": {
"src": "../../clsx/dist/clsx.mjs",
"file": "clsx.js",
"fileHash": "694a54a4",
"fileHash": "2dbad761",
"needsInterop": false
},
"gsap": {
"src": "../../gsap/index.js",
"file": "gsap.js",
"fileHash": "7ddb7298",
"fileHash": "1393a05a",
"needsInterop": false
},
"gsap/ScrollTrigger": {
"src": "../../gsap/ScrollTrigger.js",
"file": "gsap_ScrollTrigger.js",
"fileHash": "a71932dd",
"fileHash": "965be7ec",
"needsInterop": false
},
"lucide-react": {
"src": "../../lucide-react/dist/esm/lucide-react.js",
"file": "lucide-react.js",
"fileHash": "6ea882ab",
"fileHash": "3db69029",
"needsInterop": false
},
"react-dom/client": {
"src": "../../react-dom/client.js",
"file": "react-dom_client.js",
"fileHash": "f07d8307",
"fileHash": "8798ba07",
"needsInterop": true
},
"react-helmet-async": {
"src": "../../react-helmet-async/lib/index.esm.js",
"file": "react-helmet-async.js",
"fileHash": "b7d7d0af",
"fileHash": "60b58734",
"needsInterop": false
},
"react-router-dom": {
"src": "../../react-router-dom/dist/index.mjs",
"file": "react-router-dom.js",
"fileHash": "9ac7c1ba",
"fileHash": "03035af3",
"needsInterop": false
},
"tailwind-merge": {
"src": "../../tailwind-merge/dist/bundle-mjs.mjs",
"file": "tailwind-merge.js",
"fileHash": "0cfdfcd3",
"fileHash": "afbfe76d",
"needsInterop": false
}
},
@@ -117,27 +117,27 @@
"chunk-U7P2NEEE": {
"file": "chunk-U7P2NEEE.js"
},
"chunk-D4MYACAJ": {
"file": "chunk-D4MYACAJ.js"
"chunk-INCCO7S4": {
"file": "chunk-INCCO7S4.js"
},
"chunk-YWBEB5PG": {
"file": "chunk-YWBEB5PG.js"
},
"chunk-KKEH7IGY": {
"file": "chunk-KKEH7IGY.js"
"chunk-LIWCVBQK": {
"file": "chunk-LIWCVBQK.js"
},
"chunk-QF76HVLY": {
"file": "chunk-QF76HVLY.js"
"chunk-L2OGOWTU": {
"file": "chunk-L2OGOWTU.js"
},
"chunk-X34PLQQA": {
"file": "chunk-X34PLQQA.js"
},
"chunk-YF4B4G2L": {
"file": "chunk-YF4B4G2L.js"
"chunk-MOFDO34C": {
"file": "chunk-MOFDO34C.js"
},
"chunk-2VUH7NEY": {
"file": "chunk-2VUH7NEY.js"
},
"chunk-YF4B4G2L": {
"file": "chunk-YF4B4G2L.js"
},
"chunk-2YVA4HRZ": {
"file": "chunk-2YVA4HRZ.js"
},
@@ -1,6 +1,6 @@
import {
useLayoutEffect2
} from "./chunk-X34PLQQA.js";
} from "./chunk-MOFDO34C.js";
import {
useComposedRefs
} from "./chunk-2VUH7NEY.js";
@@ -140,4 +140,4 @@ function getElementRef(element) {
export {
Presence
};
//# sourceMappingURL=chunk-KKEH7IGY.js.map
//# sourceMappingURL=chunk-INCCO7S4.js.map
@@ -1,7 +1,7 @@
import {
createContextScope,
useLayoutEffect2
} from "./chunk-X34PLQQA.js";
} from "./chunk-MOFDO34C.js";
import {
composeRefs,
useComposedRefs
@@ -245,4 +245,4 @@ export {
useSize,
usePrevious
};
//# sourceMappingURL=chunk-D4MYACAJ.js.map
//# sourceMappingURL=chunk-L2OGOWTU.js.map
@@ -4,13 +4,13 @@ import {
dispatchDiscreteCustomEvent,
useCallbackRef,
useLayoutEffect2
} from "./chunk-X34PLQQA.js";
import {
require_react_dom
} from "./chunk-YF4B4G2L.js";
} from "./chunk-MOFDO34C.js";
import {
useComposedRefs
} from "./chunk-2VUH7NEY.js";
import {
require_react_dom
} from "./chunk-YF4B4G2L.js";
import {
require_jsx_runtime
} from "./chunk-2YVA4HRZ.js";
@@ -244,42 +244,14 @@ function handleAndDispatchCustomEvent(name, handler, detail, { discrete }) {
}
}
// node_modules/@radix-ui/react-focus-guards/dist/index.mjs
var React3 = __toESM(require_react(), 1);
var count = 0;
function useFocusGuards() {
React3.useEffect(() => {
const edgeGuards = document.querySelectorAll("[data-radix-focus-guard]");
document.body.insertAdjacentElement("afterbegin", edgeGuards[0] ?? createFocusGuard());
document.body.insertAdjacentElement("beforeend", edgeGuards[1] ?? createFocusGuard());
count++;
return () => {
if (count === 1) {
document.querySelectorAll("[data-radix-focus-guard]").forEach((node) => node.remove());
}
count--;
};
}, []);
}
function createFocusGuard() {
const element = document.createElement("span");
element.setAttribute("data-radix-focus-guard", "");
element.tabIndex = 0;
element.style.outline = "none";
element.style.opacity = "0";
element.style.position = "fixed";
element.style.pointerEvents = "none";
return element;
}
// node_modules/@radix-ui/react-focus-scope/dist/index.mjs
var React4 = __toESM(require_react(), 1);
var React3 = __toESM(require_react(), 1);
var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
var AUTOFOCUS_ON_MOUNT = "focusScope.autoFocusOnMount";
var AUTOFOCUS_ON_UNMOUNT = "focusScope.autoFocusOnUnmount";
var EVENT_OPTIONS = { bubbles: false, cancelable: true };
var FOCUS_SCOPE_NAME = "FocusScope";
var FocusScope = React4.forwardRef((props, forwardedRef) => {
var FocusScope = React3.forwardRef((props, forwardedRef) => {
const {
loop = false,
trapped = false,
@@ -287,12 +259,12 @@ var FocusScope = React4.forwardRef((props, forwardedRef) => {
onUnmountAutoFocus: onUnmountAutoFocusProp,
...scopeProps
} = props;
const [container, setContainer] = React4.useState(null);
const [container, setContainer] = React3.useState(null);
const onMountAutoFocus = useCallbackRef(onMountAutoFocusProp);
const onUnmountAutoFocus = useCallbackRef(onUnmountAutoFocusProp);
const lastFocusedElementRef = React4.useRef(null);
const lastFocusedElementRef = React3.useRef(null);
const composedRefs = useComposedRefs(forwardedRef, (node) => setContainer(node));
const focusScope = React4.useRef({
const focusScope = React3.useRef({
paused: false,
pause() {
this.paused = true;
@@ -301,7 +273,7 @@ var FocusScope = React4.forwardRef((props, forwardedRef) => {
this.paused = false;
}
}).current;
React4.useEffect(() => {
React3.useEffect(() => {
if (trapped) {
let handleFocusIn2 = function(event) {
if (focusScope.paused || !container) return;
@@ -337,7 +309,7 @@ var FocusScope = React4.forwardRef((props, forwardedRef) => {
};
}
}, [trapped, container, focusScope.paused]);
React4.useEffect(() => {
React3.useEffect(() => {
if (container) {
focusScopesStack.add(focusScope);
const previouslyFocusedElement = document.activeElement;
@@ -368,7 +340,7 @@ var FocusScope = React4.forwardRef((props, forwardedRef) => {
};
}
}, [container, onMountAutoFocus, onUnmountAutoFocus, focusScope]);
const handleKeyDown = React4.useCallback(
const handleKeyDown = React3.useCallback(
(event) => {
if (!loop && !trapped) return;
if (focusScope.paused) return;
@@ -477,139 +449,46 @@ function removeLinks(items) {
}
// node_modules/@radix-ui/react-portal/dist/index.mjs
var React5 = __toESM(require_react(), 1);
var React4 = __toESM(require_react(), 1);
var import_react_dom = __toESM(require_react_dom(), 1);
var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
var PORTAL_NAME = "Portal";
var Portal = React5.forwardRef((props, forwardedRef) => {
var Portal = React4.forwardRef((props, forwardedRef) => {
const { container: containerProp, ...portalProps } = props;
const [mounted, setMounted] = React5.useState(false);
const [mounted, setMounted] = React4.useState(false);
useLayoutEffect2(() => setMounted(true), []);
const container = containerProp || mounted && globalThis?.document?.body;
return container ? import_react_dom.default.createPortal((0, import_jsx_runtime3.jsx)(Primitive.div, { ...portalProps, ref: forwardedRef }), container) : null;
});
Portal.displayName = PORTAL_NAME;
// node_modules/aria-hidden/dist/es2015/index.js
var getDefaultParent = function(originalTarget) {
if (typeof document === "undefined") {
return null;
}
var sampleTarget = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;
return sampleTarget.ownerDocument.body;
};
var counterMap = /* @__PURE__ */ new WeakMap();
var uncontrolledNodes = /* @__PURE__ */ new WeakMap();
var markerMap = {};
var lockCount = 0;
var unwrapHost = function(node) {
return node && (node.host || unwrapHost(node.parentNode));
};
var correctTargets = function(parent, targets) {
return targets.map(function(target) {
if (parent.contains(target)) {
return target;
}
var correctedTarget = unwrapHost(target);
if (correctedTarget && parent.contains(correctedTarget)) {
return correctedTarget;
}
console.error("aria-hidden", target, "in not contained inside", parent, ". Doing nothing");
return null;
}).filter(function(x) {
return Boolean(x);
});
};
var applyAttributeToOthers = function(originalTarget, parentNode, markerName, controlAttribute) {
var targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
if (!markerMap[markerName]) {
markerMap[markerName] = /* @__PURE__ */ new WeakMap();
}
var markerCounter = markerMap[markerName];
var hiddenNodes = [];
var elementsToKeep = /* @__PURE__ */ new Set();
var elementsToStop = new Set(targets);
var keep = function(el) {
if (!el || elementsToKeep.has(el)) {
return;
}
elementsToKeep.add(el);
keep(el.parentNode);
};
targets.forEach(keep);
var deep = function(parent) {
if (!parent || elementsToStop.has(parent)) {
return;
}
Array.prototype.forEach.call(parent.children, function(node) {
if (elementsToKeep.has(node)) {
deep(node);
} else {
try {
var attr = node.getAttribute(controlAttribute);
var alreadyHidden = attr !== null && attr !== "false";
var counterValue = (counterMap.get(node) || 0) + 1;
var markerValue = (markerCounter.get(node) || 0) + 1;
counterMap.set(node, counterValue);
markerCounter.set(node, markerValue);
hiddenNodes.push(node);
if (counterValue === 1 && alreadyHidden) {
uncontrolledNodes.set(node, true);
}
if (markerValue === 1) {
node.setAttribute(markerName, "true");
}
if (!alreadyHidden) {
node.setAttribute(controlAttribute, "true");
}
} catch (e) {
console.error("aria-hidden: cannot operate on ", node, e);
}
// node_modules/@radix-ui/react-focus-guards/dist/index.mjs
var React5 = __toESM(require_react(), 1);
var count = 0;
function useFocusGuards() {
React5.useEffect(() => {
const edgeGuards = document.querySelectorAll("[data-radix-focus-guard]");
document.body.insertAdjacentElement("afterbegin", edgeGuards[0] ?? createFocusGuard());
document.body.insertAdjacentElement("beforeend", edgeGuards[1] ?? createFocusGuard());
count++;
return () => {
if (count === 1) {
document.querySelectorAll("[data-radix-focus-guard]").forEach((node) => node.remove());
}
});
};
deep(parentNode);
elementsToKeep.clear();
lockCount++;
return function() {
hiddenNodes.forEach(function(node) {
var counterValue = counterMap.get(node) - 1;
var markerValue = markerCounter.get(node) - 1;
counterMap.set(node, counterValue);
markerCounter.set(node, markerValue);
if (!counterValue) {
if (!uncontrolledNodes.has(node)) {
node.removeAttribute(controlAttribute);
}
uncontrolledNodes.delete(node);
}
if (!markerValue) {
node.removeAttribute(markerName);
}
});
lockCount--;
if (!lockCount) {
counterMap = /* @__PURE__ */ new WeakMap();
counterMap = /* @__PURE__ */ new WeakMap();
uncontrolledNodes = /* @__PURE__ */ new WeakMap();
markerMap = {};
}
};
};
var hideOthers = function(originalTarget, parentNode, markerName) {
if (markerName === void 0) {
markerName = "data-aria-hidden";
}
var targets = Array.from(Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
var activeParentNode = parentNode || getDefaultParent(originalTarget);
if (!activeParentNode) {
return function() {
return null;
count--;
};
}
targets.push.apply(targets, Array.from(activeParentNode.querySelectorAll("[aria-live], script")));
return applyAttributeToOthers(targets, activeParentNode, markerName, "aria-hidden");
};
}, []);
}
function createFocusGuard() {
const element = document.createElement("span");
element.setAttribute("data-radix-focus-guard", "");
element.tabIndex = 0;
element.style.outline = "none";
element.style.opacity = "0";
element.style.position = "fixed";
element.style.pointerEvents = "none";
return element;
}
// node_modules/tslib/tslib.es6.mjs
var __assign = function() {
@@ -1341,12 +1220,133 @@ var ReactRemoveScroll = React14.forwardRef(function(props, ref) {
ReactRemoveScroll.classNames = RemoveScroll.classNames;
var Combination_default = ReactRemoveScroll;
// node_modules/aria-hidden/dist/es2015/index.js
var getDefaultParent = function(originalTarget) {
if (typeof document === "undefined") {
return null;
}
var sampleTarget = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;
return sampleTarget.ownerDocument.body;
};
var counterMap = /* @__PURE__ */ new WeakMap();
var uncontrolledNodes = /* @__PURE__ */ new WeakMap();
var markerMap = {};
var lockCount = 0;
var unwrapHost = function(node) {
return node && (node.host || unwrapHost(node.parentNode));
};
var correctTargets = function(parent, targets) {
return targets.map(function(target) {
if (parent.contains(target)) {
return target;
}
var correctedTarget = unwrapHost(target);
if (correctedTarget && parent.contains(correctedTarget)) {
return correctedTarget;
}
console.error("aria-hidden", target, "in not contained inside", parent, ". Doing nothing");
return null;
}).filter(function(x) {
return Boolean(x);
});
};
var applyAttributeToOthers = function(originalTarget, parentNode, markerName, controlAttribute) {
var targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
if (!markerMap[markerName]) {
markerMap[markerName] = /* @__PURE__ */ new WeakMap();
}
var markerCounter = markerMap[markerName];
var hiddenNodes = [];
var elementsToKeep = /* @__PURE__ */ new Set();
var elementsToStop = new Set(targets);
var keep = function(el) {
if (!el || elementsToKeep.has(el)) {
return;
}
elementsToKeep.add(el);
keep(el.parentNode);
};
targets.forEach(keep);
var deep = function(parent) {
if (!parent || elementsToStop.has(parent)) {
return;
}
Array.prototype.forEach.call(parent.children, function(node) {
if (elementsToKeep.has(node)) {
deep(node);
} else {
try {
var attr = node.getAttribute(controlAttribute);
var alreadyHidden = attr !== null && attr !== "false";
var counterValue = (counterMap.get(node) || 0) + 1;
var markerValue = (markerCounter.get(node) || 0) + 1;
counterMap.set(node, counterValue);
markerCounter.set(node, markerValue);
hiddenNodes.push(node);
if (counterValue === 1 && alreadyHidden) {
uncontrolledNodes.set(node, true);
}
if (markerValue === 1) {
node.setAttribute(markerName, "true");
}
if (!alreadyHidden) {
node.setAttribute(controlAttribute, "true");
}
} catch (e) {
console.error("aria-hidden: cannot operate on ", node, e);
}
}
});
};
deep(parentNode);
elementsToKeep.clear();
lockCount++;
return function() {
hiddenNodes.forEach(function(node) {
var counterValue = counterMap.get(node) - 1;
var markerValue = markerCounter.get(node) - 1;
counterMap.set(node, counterValue);
markerCounter.set(node, markerValue);
if (!counterValue) {
if (!uncontrolledNodes.has(node)) {
node.removeAttribute(controlAttribute);
}
uncontrolledNodes.delete(node);
}
if (!markerValue) {
node.removeAttribute(markerName);
}
});
lockCount--;
if (!lockCount) {
counterMap = /* @__PURE__ */ new WeakMap();
counterMap = /* @__PURE__ */ new WeakMap();
uncontrolledNodes = /* @__PURE__ */ new WeakMap();
markerMap = {};
}
};
};
var hideOthers = function(originalTarget, parentNode, markerName) {
if (markerName === void 0) {
markerName = "data-aria-hidden";
}
var targets = Array.from(Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
var activeParentNode = parentNode || getDefaultParent(originalTarget);
if (!activeParentNode) {
return function() {
return null;
};
}
targets.push.apply(targets, Array.from(activeParentNode.querySelectorAll("[aria-live], script")));
return applyAttributeToOthers(targets, activeParentNode, markerName, "aria-hidden");
};
export {
DismissableLayer,
useFocusGuards,
FocusScope,
Portal,
hideOthers,
Combination_default
useFocusGuards,
Combination_default,
hideOthers
};
//# sourceMappingURL=chunk-QF76HVLY.js.map
//# sourceMappingURL=chunk-LIWCVBQK.js.map
File diff suppressed because one or more lines are too long
@@ -1,9 +1,9 @@
import {
require_react_dom
} from "./chunk-YF4B4G2L.js";
import {
composeRefs
} from "./chunk-2VUH7NEY.js";
import {
require_react_dom
} from "./chunk-YF4B4G2L.js";
import {
require_jsx_runtime
} from "./chunk-2YVA4HRZ.js";
@@ -102,30 +102,122 @@ function composeContextScopes(...scopes) {
return createScope;
}
// node_modules/@radix-ui/react-primitive/dist/index.mjs
// node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs
var React2 = __toESM(require_react(), 1);
var useLayoutEffect2 = globalThis?.document ? React2.useLayoutEffect : () => {
};
// node_modules/@radix-ui/react-id/dist/index.mjs
var React3 = __toESM(require_react(), 1);
var useReactId = React3[" useId ".trim().toString()] || (() => void 0);
var count = 0;
function useId(deterministicId) {
const [id, setId] = React3.useState(useReactId());
useLayoutEffect2(() => {
if (!deterministicId) setId((reactId) => reactId ?? String(count++));
}, [deterministicId]);
return deterministicId || (id ? `radix-${id}` : "");
}
// node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
var React5 = __toESM(require_react(), 1);
var React22 = __toESM(require_react(), 1);
// node_modules/@radix-ui/react-use-effect-event/dist/index.mjs
var React4 = __toESM(require_react(), 1);
var useReactEffectEvent = React4[" useEffectEvent ".trim().toString()];
var useReactInsertionEffect = React4[" useInsertionEffect ".trim().toString()];
// node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
var useInsertionEffect = React5[" useInsertionEffect ".trim().toString()] || useLayoutEffect2;
function useControllableState({
prop,
defaultProp,
onChange = () => {
},
caller
}) {
const [uncontrolledProp, setUncontrolledProp, onChangeRef] = useUncontrolledState({
defaultProp,
onChange
});
const isControlled = prop !== void 0;
const value = isControlled ? prop : uncontrolledProp;
if (true) {
const isControlledRef = React5.useRef(prop !== void 0);
React5.useEffect(() => {
const wasControlled = isControlledRef.current;
if (wasControlled !== isControlled) {
const from = wasControlled ? "controlled" : "uncontrolled";
const to = isControlled ? "controlled" : "uncontrolled";
console.warn(
`${caller} is changing from ${from} to ${to}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`
);
}
isControlledRef.current = isControlled;
}, [isControlled, caller]);
}
const setValue = React5.useCallback(
(nextValue) => {
if (isControlled) {
const value2 = isFunction(nextValue) ? nextValue(prop) : nextValue;
if (value2 !== prop) {
onChangeRef.current?.(value2);
}
} else {
setUncontrolledProp(nextValue);
}
},
[isControlled, prop, setUncontrolledProp, onChangeRef]
);
return [value, setValue];
}
function useUncontrolledState({
defaultProp,
onChange
}) {
const [value, setValue] = React5.useState(defaultProp);
const prevValueRef = React5.useRef(value);
const onChangeRef = React5.useRef(onChange);
useInsertionEffect(() => {
onChangeRef.current = onChange;
}, [onChange]);
React5.useEffect(() => {
if (prevValueRef.current !== value) {
onChangeRef.current?.(value);
prevValueRef.current = value;
}
}, [value, prevValueRef]);
return [value, setValue, onChangeRef];
}
function isFunction(value) {
return typeof value === "function";
}
// node_modules/@radix-ui/react-primitive/dist/index.mjs
var React7 = __toESM(require_react(), 1);
var ReactDOM = __toESM(require_react_dom(), 1);
// node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.mjs
var React2 = __toESM(require_react(), 1);
var React6 = __toESM(require_react(), 1);
var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
function createSlot(ownerName) {
const SlotClone = createSlotClone(ownerName);
const Slot2 = React2.forwardRef((props, forwardedRef) => {
const Slot2 = React6.forwardRef((props, forwardedRef) => {
const { children, ...slotProps } = props;
const childrenArray = React2.Children.toArray(children);
const childrenArray = React6.Children.toArray(children);
const slottable = childrenArray.find(isSlottable);
if (slottable) {
const newElement = slottable.props.children;
const newChildren = childrenArray.map((child) => {
if (child === slottable) {
if (React2.Children.count(newElement) > 1) return React2.Children.only(null);
return React2.isValidElement(newElement) ? newElement.props.children : null;
if (React6.Children.count(newElement) > 1) return React6.Children.only(null);
return React6.isValidElement(newElement) ? newElement.props.children : null;
} else {
return child;
}
});
return (0, import_jsx_runtime2.jsx)(SlotClone, { ...slotProps, ref: forwardedRef, children: React2.isValidElement(newElement) ? React2.cloneElement(newElement, void 0, newChildren) : null });
return (0, import_jsx_runtime2.jsx)(SlotClone, { ...slotProps, ref: forwardedRef, children: React6.isValidElement(newElement) ? React6.cloneElement(newElement, void 0, newChildren) : null });
}
return (0, import_jsx_runtime2.jsx)(SlotClone, { ...slotProps, ref: forwardedRef, children });
});
@@ -134,17 +226,17 @@ function createSlot(ownerName) {
}
var Slot = createSlot("Slot");
function createSlotClone(ownerName) {
const SlotClone = React2.forwardRef((props, forwardedRef) => {
const SlotClone = React6.forwardRef((props, forwardedRef) => {
const { children, ...slotProps } = props;
if (React2.isValidElement(children)) {
if (React6.isValidElement(children)) {
const childrenRef = getElementRef(children);
const props2 = mergeProps(slotProps, children.props);
if (children.type !== React2.Fragment) {
if (children.type !== React6.Fragment) {
props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;
}
return React2.cloneElement(children, props2);
return React6.cloneElement(children, props2);
}
return React2.Children.count(children) > 1 ? React2.Children.only(null) : null;
return React6.Children.count(children) > 1 ? React6.Children.only(null) : null;
});
SlotClone.displayName = `${ownerName}.SlotClone`;
return SlotClone;
@@ -160,7 +252,7 @@ function createSlottable(ownerName) {
}
var Slottable = createSlottable("Slottable");
function isSlottable(child) {
return React2.isValidElement(child) && typeof child.type === "function" && "__radixId" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;
return React6.isValidElement(child) && typeof child.type === "function" && "__radixId" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;
}
function mergeProps(slotProps, childProps) {
const overrideProps = { ...childProps };
@@ -223,7 +315,7 @@ var NODES = [
];
var Primitive = NODES.reduce((primitive, node) => {
const Slot2 = createSlot(`Primitive.${node}`);
const Node = React3.forwardRef((props, forwardedRef) => {
const Node = React7.forwardRef((props, forwardedRef) => {
const { asChild, ...primitiveProps } = props;
const Comp = asChild ? Slot2 : node;
if (typeof window !== "undefined") {
@@ -239,116 +331,24 @@ function dispatchDiscreteCustomEvent(target, event) {
}
// node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs
var React4 = __toESM(require_react(), 1);
var React8 = __toESM(require_react(), 1);
function useCallbackRef(callback) {
const callbackRef = React4.useRef(callback);
React4.useEffect(() => {
const callbackRef = React8.useRef(callback);
React8.useEffect(() => {
callbackRef.current = callback;
});
return React4.useMemo(() => (...args) => callbackRef.current?.(...args), []);
}
// node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs
var React5 = __toESM(require_react(), 1);
var useLayoutEffect2 = globalThis?.document ? React5.useLayoutEffect : () => {
};
// node_modules/@radix-ui/react-id/dist/index.mjs
var React6 = __toESM(require_react(), 1);
var useReactId = React6[" useId ".trim().toString()] || (() => void 0);
var count = 0;
function useId(deterministicId) {
const [id, setId] = React6.useState(useReactId());
useLayoutEffect2(() => {
if (!deterministicId) setId((reactId) => reactId ?? String(count++));
}, [deterministicId]);
return deterministicId || (id ? `radix-${id}` : "");
}
// node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
var React8 = __toESM(require_react(), 1);
var React22 = __toESM(require_react(), 1);
// node_modules/@radix-ui/react-use-effect-event/dist/index.mjs
var React7 = __toESM(require_react(), 1);
var useReactEffectEvent = React7[" useEffectEvent ".trim().toString()];
var useReactInsertionEffect = React7[" useInsertionEffect ".trim().toString()];
// node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
var useInsertionEffect = React8[" useInsertionEffect ".trim().toString()] || useLayoutEffect2;
function useControllableState({
prop,
defaultProp,
onChange = () => {
},
caller
}) {
const [uncontrolledProp, setUncontrolledProp, onChangeRef] = useUncontrolledState({
defaultProp,
onChange
});
const isControlled = prop !== void 0;
const value = isControlled ? prop : uncontrolledProp;
if (true) {
const isControlledRef = React8.useRef(prop !== void 0);
React8.useEffect(() => {
const wasControlled = isControlledRef.current;
if (wasControlled !== isControlled) {
const from = wasControlled ? "controlled" : "uncontrolled";
const to = isControlled ? "controlled" : "uncontrolled";
console.warn(
`${caller} is changing from ${from} to ${to}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`
);
}
isControlledRef.current = isControlled;
}, [isControlled, caller]);
}
const setValue = React8.useCallback(
(nextValue) => {
if (isControlled) {
const value2 = isFunction(nextValue) ? nextValue(prop) : nextValue;
if (value2 !== prop) {
onChangeRef.current?.(value2);
}
} else {
setUncontrolledProp(nextValue);
}
},
[isControlled, prop, setUncontrolledProp, onChangeRef]
);
return [value, setValue];
}
function useUncontrolledState({
defaultProp,
onChange
}) {
const [value, setValue] = React8.useState(defaultProp);
const prevValueRef = React8.useRef(value);
const onChangeRef = React8.useRef(onChange);
useInsertionEffect(() => {
onChangeRef.current = onChange;
}, [onChange]);
React8.useEffect(() => {
if (prevValueRef.current !== value) {
onChangeRef.current?.(value);
prevValueRef.current = value;
}
}, [value, prevValueRef]);
return [value, setValue, onChangeRef];
}
function isFunction(value) {
return typeof value === "function";
return React8.useMemo(() => (...args) => callbackRef.current?.(...args), []);
}
export {
composeEventHandlers,
createContext2,
createContextScope,
Primitive,
dispatchDiscreteCustomEvent,
useCallbackRef,
useLayoutEffect2,
useId,
useControllableState
useControllableState,
Primitive,
dispatchDiscreteCustomEvent,
useCallbackRef
};
//# sourceMappingURL=chunk-X34PLQQA.js.map
//# sourceMappingURL=chunk-MOFDO34C.js.map
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-39
View File
@@ -4473,9 +4473,6 @@
"arm"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -4490,9 +4487,6 @@
"arm"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -4507,9 +4501,6 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -4524,9 +4515,6 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -4541,9 +4529,6 @@
"loong64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -4558,9 +4543,6 @@
"loong64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -4575,9 +4557,6 @@
"ppc64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -4592,9 +4571,6 @@
"ppc64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -4609,9 +4585,6 @@
"riscv64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -4626,9 +4599,6 @@
"riscv64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -4643,9 +4613,6 @@
"s390x"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -4660,9 +4627,6 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -4677,9 +4641,6 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
+10 -23
View File
@@ -1,26 +1,13 @@
# =============================================================================
# ROBOTS.TXT - VERSAO HOMOLOGACAO/DESENVOLVIMENTO
# =============================================================================
# Este arquivo BLOQUEIA TODOS os crawlers.
#
# Para PRODUCAO (avanzato.com.br), substitua por:
# User-agent: *
# Allow: /
# Sitemap: https://avanzato.com.br/sitemap.xml
# =============================================================================
# ============================================================================
# AVANZATO TECNOLOGIA - ROBOTS.TXT (GENERICO)
# ============================================================================
# O controle real de indexacao e feito pelo <meta name="robots"> no HTML:
# - Producao (avanzato.com.br): index, follow
# - Homologacao (hml.avanzato.com.br): noindex, nofollow
# - Desenvolvimento (localhost): noindex, nofollow
# ============================================================================
User-agent: *
Disallow: /
Allow: /
# Bloqueio explicito de todos os bots
User-agent: Googlebot
Disallow: /
User-agent: Bingbot
Disallow: /
User-agent: Slurp
Disallow: /
# Sitemap comentado (descomente em producao)
# Sitemap: https://avanzato.com.br/sitemap.xml
Sitemap: https://avanzato.com.br/sitemap.xml
+3 -3
View File
@@ -1,5 +1,5 @@
{
"version": "1.1.3",
"version": "1.2.1",
"date": "2026-05-31",
"environment": "development"
}
"environment": "auto-detect"
}
+13 -10
View File
@@ -1,31 +1,34 @@
import { useState } from 'react';
import { AlertTriangle, X } from 'lucide-react';
import { IS_HOMOLOGATION } from '@/config/mautic';
import { ENV_CONFIG, IS_PRODUCTION } from '../config/environment';
/**
* Banner visual que aparece em ambiente de homologacao
* Avisa que Mautic, Google Ads e Facebook Pixel estao em modo simulacao
* Banner visual que aparece em ambiente NAO-producao
* Avisa qual ambiente esta rodando
*/
export default function HomologationBanner() {
export default function AmbientBanner() {
const [dismissed, setDismissed] = useState(false);
if (!IS_HOMOLOGATION || dismissed) return null;
// So mostra em producao
if (IS_PRODUCTION || dismissed) return null;
const { bannerText, bannerColor } = ENV_CONFIG;
return (
<div className="fixed bottom-4 right-4 z-[100] max-w-md">
<div className="bg-amber-500 text-[#0e0e0e] rounded-xl shadow-2xl p-4 border-2 border-amber-400">
<div className={`${bannerColor} text-[#0e0e0e] rounded-xl shadow-2xl p-4 border-2 border-white/20`}>
<div className="flex items-start gap-3">
<AlertTriangle className="w-5 h-5 shrink-0 mt-0.5" />
<div className="flex-1">
<p className="font-bold text-sm">Ambiente de Homologacao</p>
<p className="font-bold text-sm">Ambiente: {bannerText}</p>
<p className="text-xs mt-1 opacity-90">
Mautic, Google Ads e Facebook Pixel estao em modo <strong>simulacao</strong>.
Nenhum dado real e enviado. Verifique o console (F12) para ver o que seria enviado.
Tracking desativado | SEO: noindex |
Nenhum dado enviado a Mautic, GA4, Ads ou Pixel.
</p>
</div>
<button
onClick={() => setDismissed(true)}
className="shrink-0 p-1 hover:bg-amber-600 rounded-lg transition-colors"
className="shrink-0 p-1 hover:bg-black/20 rounded-lg transition-colors"
aria-label="Fechar"
>
<X className="w-4 h-4" />
+4 -3
View File
@@ -9,6 +9,7 @@
import { Helmet } from 'react-helmet-async';
import { useLocation } from 'react-router-dom';
import { ENV_CONFIG } from '../config/environment';
interface SEOProps {
title?: string;
@@ -16,7 +17,7 @@ interface SEOProps {
keywords?: string;
ogImage?: string;
ogType?: string;
noindex?: boolean;
noindex?: boolean; // Se true, forca noindex mesmo em producao
schema?: Record<string, any>;
}
@@ -55,8 +56,8 @@ export default function SEO({
{/* Canonical - DINAMICO por pagina */}
<link rel="canonical" href={canonicalUrl} />
{/* Robots */}
{noindex ? (
{/* Robots - automatico por ambiente, override com prop noindex */}
{noindex || !ENV_CONFIG.allowIndexing ? (
<meta name="robots" content="noindex, nofollow" />
) : (
<meta name="robots" content="index, follow" />
+73
View File
@@ -0,0 +1,73 @@
// ============================================================================
// DETECAO DE AMBIENTE - Automatico por hostname
// ============================================================================
// Um unico build serve todos os ambientes:
// - PRODUCAO (avanzato.com.br): index, tracking ativo
// - HOMOLOGACAO (hml.avanzato.com.br): noindex, tracking desativado
// - DESENVOLVIMENTO (localhost): noindex, tracking desativado
// ============================================================================
const hostname = typeof window !== 'undefined' ? window.location.hostname : '';
export type Environment = 'production' | 'homologation' | 'development';
function detectEnvironment(): Environment {
// Producao: domínio principal
if (hostname === 'avanzato.com.br' || hostname === 'www.avanzato.com.br') {
return 'production';
}
// Homologacao: subdominio hml
if (hostname === 'hml.avanzato.com.br') {
return 'homologation';
}
// Desenvolvimento: localhost, 127.0.0.1, IPs locais, previews
if (
hostname === 'localhost' ||
hostname === '127.0.0.1' ||
hostname.startsWith('192.168.') ||
hostname.startsWith('10.') ||
hostname.startsWith('172.') ||
hostname.includes('kimi.page') || // previews
hostname === '' // SSR
) {
return 'development';
}
// Fallback: se nao reconhece, trata como homologacao (seguro)
return 'homologation';
}
export const ENV = detectEnvironment();
// Helpers
export const IS_PRODUCTION = ENV === 'production';
export const IS_HOMOLOGATION = ENV === 'homologation';
export const IS_DEVELOPMENT = ENV === 'development';
// Configuracoes por ambiente
export const ENV_CONFIG = {
// SEO / Indexacao
allowIndexing: IS_PRODUCTION, // So producao permite Google indexar
robotsMeta: IS_PRODUCTION ? 'index, follow' : 'noindex, nofollow',
// Tracking / Integracoes
mauticActive: IS_PRODUCTION, // So envia leads reais em producao
googleAnalytics: IS_PRODUCTION, // So trackeia em producao
googleAds: IS_PRODUCTION, // So dispara conversões em producao
facebookPixel: IS_PRODUCTION, // So dispara pixel em producao
// Visual
showBanner: !IS_PRODUCTION, // Banner de ambiente em hom/dev
bannerText: IS_HOMOLOGATION ? 'HOMOLOGACAO' : 'DESENVOLVIMENTO',
bannerColor: IS_HOMOLOGATION ? 'bg-yellow-500' : 'bg-blue-500',
} as const;
// Log para debug
if (typeof window !== 'undefined') {
console.log(`[Ambiente] ${ENV.toUpperCase()} | Host: ${hostname}`);
if (!IS_PRODUCTION) {
console.log('[Ambiente] Tracking desativado | SEO: noindex');
}
}
+11 -16
View File
@@ -1,12 +1,7 @@
// Configuracao do Mautic - Avanzato
// URL: https://mkt.avanzato.com.br
// --- DETECAO DE AMBIENTE ---
// Em homologacao (localhost, IP, ou nao-producao), o Mautic fica em modo simulacao
// Apenas loga no console, nao envia dados reais
const hostname = typeof window !== 'undefined' ? window.location.hostname : '';
const PROD_HOSTS = ['avanzato.com.br'];
export const IS_HOMOLOGATION = !PROD_HOSTS.includes(hostname);
import { IS_PRODUCTION } from './environment';
export const MAUTIC_CONFIG = {
baseUrl: 'https://mkt.avanzato.com.br',
@@ -17,8 +12,8 @@ export const MAUTIC_CONFIG = {
contato: { id: '4', enabled: true },
},
// Desativa envio real em homologacao
enabled: !IS_HOMOLOGATION,
// So envia dados reais em producao
enabled: IS_PRODUCTION,
};
/**
@@ -37,9 +32,9 @@ export const sendLeadToMautic = (
return false;
}
// MODO HOMOLOGACAO: simula envio, nao manda dados reais
if (IS_HOMOLOGATION) {
console.log('%c[HOMOLOGACAO] Mautic em modo simulacao - dados NAO enviados ao servidor real', 'background:#f59e0b;color:#000;font-weight:bold;padding:4px 8px;border-radius:4px');
// MODO NAO-PRODUCAO: simula envio, nao manda dados reais
if (!IS_PRODUCTION) {
console.log('%c[' + (window as any).__AVANZATO_ENV__?.toUpperCase() + '] Mautic em modo simulacao - dados NAO enviados', 'background:#f59e0b;color:#000;font-weight:bold;padding:4px 8px;border-radius:4px');
console.log(`[Mautic] Form: ${formType} | Form ID: ${formConfig.id}`);
console.log(`[Mautic] Dados que seriam enviados:`, JSON.stringify(formData, null, 2));
console.log(`[Mautic] Em producao, enviaria para: ${MAUTIC_CONFIG.baseUrl}/form/submit?formId=${formConfig.id}`);
@@ -123,8 +118,8 @@ export const sendLeadViaMailto = (formData: Record<string, string>): void => {
* Desativado em homologacao para nao poluir dados
*/
export const trackConversion = (): void => {
if (IS_HOMOLOGATION) {
console.log('%c[HOMOLOGACAO] Google Ads conversion NAO disparado (ambiente de teste)', 'color:#f59e0b');
if (!IS_PRODUCTION) {
console.log('%c[' + (window as any).__AVANZATO_ENV__ + '] Google Ads conversion NAO disparado', 'color:#f59e0b');
return;
}
if (typeof window !== 'undefined' && (window as any).gtag) {
@@ -142,12 +137,12 @@ export const trackConversion = (): void => {
* Desativado em homologacao
*/
export const trackFacebookPixel = (eventName: string = 'Lead', params?: Record<string, any>): void => {
if (IS_HOMOLOGATION) {
console.log(`%c[HOMOLOGACAO] Facebook Pixel "${eventName}" NAO disparado (ambiente de teste)`, 'color:#f59e0b', params);
if (!IS_PRODUCTION) {
console.log(`%c[${(window as any).__AVANZATO_ENV__}] Facebook Pixel "${eventName}" NAO disparado`, 'color:#f59e0b', params);
return;
}
if (typeof window !== 'undefined' && (window as any).fbq) {
(window as any).fbq('track', eventName, params || {});
console.log(`[Facebook Pixel] Evento: ${eventName}`, params);
}
};
};