Merge remote-tracking branch 'origin/develop'

This commit is contained in:
2026-05-31 00:02:57 -03:00
26 changed files with 698 additions and 33378 deletions
+27
View File
@@ -5,6 +5,33 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <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 --> <!-- Google tag (gtag.js) - Ads + Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-16714813566"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=AW-16714813566"></script>
<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
+4 -4
View File
@@ -1,7 +1,7 @@
"use client"; "use client";
import { import {
Presence Presence
} from "./chunk-KKEH7IGY.js"; } from "./chunk-INCCO7S4.js";
import { import {
Combination_default, Combination_default,
DismissableLayer, DismissableLayer,
@@ -9,7 +9,7 @@ import {
Portal, Portal,
hideOthers, hideOthers,
useFocusGuards useFocusGuards
} from "./chunk-QF76HVLY.js"; } from "./chunk-LIWCVBQK.js";
import { import {
Primitive, Primitive,
composeEventHandlers, composeEventHandlers,
@@ -17,12 +17,12 @@ import {
createContextScope, createContextScope,
useControllableState, useControllableState,
useId useId
} from "./chunk-X34PLQQA.js"; } from "./chunk-MOFDO34C.js";
import "./chunk-YF4B4G2L.js";
import { import {
composeRefs, composeRefs,
useComposedRefs useComposedRefs
} from "./chunk-2VUH7NEY.js"; } from "./chunk-2VUH7NEY.js";
import "./chunk-YF4B4G2L.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-2YVA4HRZ.js"; } from "./chunk-2YVA4HRZ.js";
+1 -1
View File
@@ -2,10 +2,10 @@
import { import {
createSlot createSlot
} from "./chunk-YWBEB5PG.js"; } from "./chunk-YWBEB5PG.js";
import "./chunk-2VUH7NEY.js";
import { import {
require_react_dom require_react_dom
} from "./chunk-YF4B4G2L.js"; } from "./chunk-YF4B4G2L.js";
import "./chunk-2VUH7NEY.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-2YVA4HRZ.js"; } from "./chunk-2YVA4HRZ.js";
+6 -6
View File
@@ -1,13 +1,13 @@
"use client"; "use client";
import {
Presence
} from "./chunk-INCCO7S4.js";
import { import {
createCollection, createCollection,
useDirection, useDirection,
usePrevious, usePrevious,
useSize useSize
} from "./chunk-D4MYACAJ.js"; } from "./chunk-L2OGOWTU.js";
import {
Presence
} from "./chunk-KKEH7IGY.js";
import { import {
Primitive, Primitive,
composeEventHandlers, composeEventHandlers,
@@ -15,11 +15,11 @@ import {
useCallbackRef, useCallbackRef,
useControllableState, useControllableState,
useId useId
} from "./chunk-X34PLQQA.js"; } from "./chunk-MOFDO34C.js";
import "./chunk-YF4B4G2L.js";
import { import {
useComposedRefs useComposedRefs
} from "./chunk-2VUH7NEY.js"; } from "./chunk-2VUH7NEY.js";
import "./chunk-YF4B4G2L.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-2YVA4HRZ.js"; } from "./chunk-2YVA4HRZ.js";
+11 -11
View File
@@ -1,10 +1,4 @@
"use client"; "use client";
import {
createCollection,
useDirection,
usePrevious,
useSize
} from "./chunk-D4MYACAJ.js";
import { import {
Combination_default, Combination_default,
DismissableLayer, DismissableLayer,
@@ -12,7 +6,13 @@ import {
Portal, Portal,
hideOthers, hideOthers,
useFocusGuards useFocusGuards
} from "./chunk-QF76HVLY.js"; } from "./chunk-LIWCVBQK.js";
import {
createCollection,
useDirection,
usePrevious,
useSize
} from "./chunk-L2OGOWTU.js";
import { import {
Primitive, Primitive,
composeEventHandlers, composeEventHandlers,
@@ -21,14 +21,14 @@ import {
useControllableState, useControllableState,
useId, useId,
useLayoutEffect2 useLayoutEffect2
} from "./chunk-X34PLQQA.js"; } from "./chunk-MOFDO34C.js";
import {
require_react_dom
} from "./chunk-YF4B4G2L.js";
import { import {
composeRefs, composeRefs,
useComposedRefs useComposedRefs
} from "./chunk-2VUH7NEY.js"; } from "./chunk-2VUH7NEY.js";
import {
require_react_dom
} from "./chunk-YF4B4G2L.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-2YVA4HRZ.js"; } from "./chunk-2YVA4HRZ.js";
+29 -29
View File
@@ -7,109 +7,109 @@
"react": { "react": {
"src": "../../react/index.js", "src": "../../react/index.js",
"file": "react.js", "file": "react.js",
"fileHash": "5b37d437", "fileHash": "d2a0cc23",
"needsInterop": true "needsInterop": true
}, },
"react-dom": { "react-dom": {
"src": "../../react-dom/index.js", "src": "../../react-dom/index.js",
"file": "react-dom.js", "file": "react-dom.js",
"fileHash": "a8665bbc", "fileHash": "e89a827d",
"needsInterop": true "needsInterop": true
}, },
"react/jsx-dev-runtime": { "react/jsx-dev-runtime": {
"src": "../../react/jsx-dev-runtime.js", "src": "../../react/jsx-dev-runtime.js",
"file": "react_jsx-dev-runtime.js", "file": "react_jsx-dev-runtime.js",
"fileHash": "5962ef4b", "fileHash": "9ce7ae60",
"needsInterop": true "needsInterop": true
}, },
"react/jsx-runtime": { "react/jsx-runtime": {
"src": "../../react/jsx-runtime.js", "src": "../../react/jsx-runtime.js",
"file": "react_jsx-runtime.js", "file": "react_jsx-runtime.js",
"fileHash": "cc4583ea", "fileHash": "8ba5f754",
"needsInterop": true "needsInterop": true
}, },
"@radix-ui/react-dialog": { "@radix-ui/react-dialog": {
"src": "../../@radix-ui/react-dialog/dist/index.mjs", "src": "../../@radix-ui/react-dialog/dist/index.mjs",
"file": "@radix-ui_react-dialog.js", "file": "@radix-ui_react-dialog.js",
"fileHash": "e65a7fe9", "fileHash": "312e2a39",
"needsInterop": false "needsInterop": false
}, },
"@radix-ui/react-label": { "@radix-ui/react-label": {
"src": "../../@radix-ui/react-label/dist/index.mjs", "src": "../../@radix-ui/react-label/dist/index.mjs",
"file": "@radix-ui_react-label.js", "file": "@radix-ui_react-label.js",
"fileHash": "d5676393", "fileHash": "3b607856",
"needsInterop": false "needsInterop": false
}, },
"@radix-ui/react-radio-group": { "@radix-ui/react-radio-group": {
"src": "../../@radix-ui/react-radio-group/dist/index.mjs", "src": "../../@radix-ui/react-radio-group/dist/index.mjs",
"file": "@radix-ui_react-radio-group.js", "file": "@radix-ui_react-radio-group.js",
"fileHash": "8a90e2b5", "fileHash": "20509c2b",
"needsInterop": false "needsInterop": false
}, },
"@radix-ui/react-select": { "@radix-ui/react-select": {
"src": "../../@radix-ui/react-select/dist/index.mjs", "src": "../../@radix-ui/react-select/dist/index.mjs",
"file": "@radix-ui_react-select.js", "file": "@radix-ui_react-select.js",
"fileHash": "0b10fc7e", "fileHash": "91be68ee",
"needsInterop": false "needsInterop": false
}, },
"@radix-ui/react-slot": { "@radix-ui/react-slot": {
"src": "../../@radix-ui/react-slot/dist/index.mjs", "src": "../../@radix-ui/react-slot/dist/index.mjs",
"file": "@radix-ui_react-slot.js", "file": "@radix-ui_react-slot.js",
"fileHash": "c8dbd881", "fileHash": "ce1344ec",
"needsInterop": false "needsInterop": false
}, },
"class-variance-authority": { "class-variance-authority": {
"src": "../../class-variance-authority/dist/index.mjs", "src": "../../class-variance-authority/dist/index.mjs",
"file": "class-variance-authority.js", "file": "class-variance-authority.js",
"fileHash": "5acda8ac", "fileHash": "0e5017ff",
"needsInterop": false "needsInterop": false
}, },
"clsx": { "clsx": {
"src": "../../clsx/dist/clsx.mjs", "src": "../../clsx/dist/clsx.mjs",
"file": "clsx.js", "file": "clsx.js",
"fileHash": "694a54a4", "fileHash": "2dbad761",
"needsInterop": false "needsInterop": false
}, },
"gsap": { "gsap": {
"src": "../../gsap/index.js", "src": "../../gsap/index.js",
"file": "gsap.js", "file": "gsap.js",
"fileHash": "7ddb7298", "fileHash": "1393a05a",
"needsInterop": false "needsInterop": false
}, },
"gsap/ScrollTrigger": { "gsap/ScrollTrigger": {
"src": "../../gsap/ScrollTrigger.js", "src": "../../gsap/ScrollTrigger.js",
"file": "gsap_ScrollTrigger.js", "file": "gsap_ScrollTrigger.js",
"fileHash": "a71932dd", "fileHash": "965be7ec",
"needsInterop": false "needsInterop": false
}, },
"lucide-react": { "lucide-react": {
"src": "../../lucide-react/dist/esm/lucide-react.js", "src": "../../lucide-react/dist/esm/lucide-react.js",
"file": "lucide-react.js", "file": "lucide-react.js",
"fileHash": "6ea882ab", "fileHash": "3db69029",
"needsInterop": false "needsInterop": false
}, },
"react-dom/client": { "react-dom/client": {
"src": "../../react-dom/client.js", "src": "../../react-dom/client.js",
"file": "react-dom_client.js", "file": "react-dom_client.js",
"fileHash": "f07d8307", "fileHash": "8798ba07",
"needsInterop": true "needsInterop": true
}, },
"react-helmet-async": { "react-helmet-async": {
"src": "../../react-helmet-async/lib/index.esm.js", "src": "../../react-helmet-async/lib/index.esm.js",
"file": "react-helmet-async.js", "file": "react-helmet-async.js",
"fileHash": "b7d7d0af", "fileHash": "60b58734",
"needsInterop": false "needsInterop": false
}, },
"react-router-dom": { "react-router-dom": {
"src": "../../react-router-dom/dist/index.mjs", "src": "../../react-router-dom/dist/index.mjs",
"file": "react-router-dom.js", "file": "react-router-dom.js",
"fileHash": "9ac7c1ba", "fileHash": "03035af3",
"needsInterop": false "needsInterop": false
}, },
"tailwind-merge": { "tailwind-merge": {
"src": "../../tailwind-merge/dist/bundle-mjs.mjs", "src": "../../tailwind-merge/dist/bundle-mjs.mjs",
"file": "tailwind-merge.js", "file": "tailwind-merge.js",
"fileHash": "0cfdfcd3", "fileHash": "afbfe76d",
"needsInterop": false "needsInterop": false
} }
}, },
@@ -117,27 +117,27 @@
"chunk-U7P2NEEE": { "chunk-U7P2NEEE": {
"file": "chunk-U7P2NEEE.js" "file": "chunk-U7P2NEEE.js"
}, },
"chunk-D4MYACAJ": { "chunk-INCCO7S4": {
"file": "chunk-D4MYACAJ.js" "file": "chunk-INCCO7S4.js"
}, },
"chunk-YWBEB5PG": { "chunk-YWBEB5PG": {
"file": "chunk-YWBEB5PG.js" "file": "chunk-YWBEB5PG.js"
}, },
"chunk-KKEH7IGY": { "chunk-LIWCVBQK": {
"file": "chunk-KKEH7IGY.js" "file": "chunk-LIWCVBQK.js"
}, },
"chunk-QF76HVLY": { "chunk-L2OGOWTU": {
"file": "chunk-QF76HVLY.js" "file": "chunk-L2OGOWTU.js"
}, },
"chunk-X34PLQQA": { "chunk-MOFDO34C": {
"file": "chunk-X34PLQQA.js" "file": "chunk-MOFDO34C.js"
},
"chunk-YF4B4G2L": {
"file": "chunk-YF4B4G2L.js"
}, },
"chunk-2VUH7NEY": { "chunk-2VUH7NEY": {
"file": "chunk-2VUH7NEY.js" "file": "chunk-2VUH7NEY.js"
}, },
"chunk-YF4B4G2L": {
"file": "chunk-YF4B4G2L.js"
},
"chunk-2YVA4HRZ": { "chunk-2YVA4HRZ": {
"file": "chunk-2YVA4HRZ.js" "file": "chunk-2YVA4HRZ.js"
}, },
@@ -1,6 +1,6 @@
import { import {
useLayoutEffect2 useLayoutEffect2
} from "./chunk-X34PLQQA.js"; } from "./chunk-MOFDO34C.js";
import { import {
useComposedRefs useComposedRefs
} from "./chunk-2VUH7NEY.js"; } from "./chunk-2VUH7NEY.js";
@@ -140,4 +140,4 @@ function getElementRef(element) {
export { export {
Presence Presence
}; };
//# sourceMappingURL=chunk-KKEH7IGY.js.map //# sourceMappingURL=chunk-INCCO7S4.js.map
@@ -1,7 +1,7 @@
import { import {
createContextScope, createContextScope,
useLayoutEffect2 useLayoutEffect2
} from "./chunk-X34PLQQA.js"; } from "./chunk-MOFDO34C.js";
import { import {
composeRefs, composeRefs,
useComposedRefs useComposedRefs
@@ -245,4 +245,4 @@ export {
useSize, useSize,
usePrevious usePrevious
}; };
//# sourceMappingURL=chunk-D4MYACAJ.js.map //# sourceMappingURL=chunk-L2OGOWTU.js.map
@@ -4,13 +4,13 @@ import {
dispatchDiscreteCustomEvent, dispatchDiscreteCustomEvent,
useCallbackRef, useCallbackRef,
useLayoutEffect2 useLayoutEffect2
} from "./chunk-X34PLQQA.js"; } from "./chunk-MOFDO34C.js";
import {
require_react_dom
} from "./chunk-YF4B4G2L.js";
import { import {
useComposedRefs useComposedRefs
} from "./chunk-2VUH7NEY.js"; } from "./chunk-2VUH7NEY.js";
import {
require_react_dom
} from "./chunk-YF4B4G2L.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-2YVA4HRZ.js"; } 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 // 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 import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
var AUTOFOCUS_ON_MOUNT = "focusScope.autoFocusOnMount"; var AUTOFOCUS_ON_MOUNT = "focusScope.autoFocusOnMount";
var AUTOFOCUS_ON_UNMOUNT = "focusScope.autoFocusOnUnmount"; var AUTOFOCUS_ON_UNMOUNT = "focusScope.autoFocusOnUnmount";
var EVENT_OPTIONS = { bubbles: false, cancelable: true }; var EVENT_OPTIONS = { bubbles: false, cancelable: true };
var FOCUS_SCOPE_NAME = "FocusScope"; var FOCUS_SCOPE_NAME = "FocusScope";
var FocusScope = React4.forwardRef((props, forwardedRef) => { var FocusScope = React3.forwardRef((props, forwardedRef) => {
const { const {
loop = false, loop = false,
trapped = false, trapped = false,
@@ -287,12 +259,12 @@ var FocusScope = React4.forwardRef((props, forwardedRef) => {
onUnmountAutoFocus: onUnmountAutoFocusProp, onUnmountAutoFocus: onUnmountAutoFocusProp,
...scopeProps ...scopeProps
} = props; } = props;
const [container, setContainer] = React4.useState(null); const [container, setContainer] = React3.useState(null);
const onMountAutoFocus = useCallbackRef(onMountAutoFocusProp); const onMountAutoFocus = useCallbackRef(onMountAutoFocusProp);
const onUnmountAutoFocus = useCallbackRef(onUnmountAutoFocusProp); const onUnmountAutoFocus = useCallbackRef(onUnmountAutoFocusProp);
const lastFocusedElementRef = React4.useRef(null); const lastFocusedElementRef = React3.useRef(null);
const composedRefs = useComposedRefs(forwardedRef, (node) => setContainer(node)); const composedRefs = useComposedRefs(forwardedRef, (node) => setContainer(node));
const focusScope = React4.useRef({ const focusScope = React3.useRef({
paused: false, paused: false,
pause() { pause() {
this.paused = true; this.paused = true;
@@ -301,7 +273,7 @@ var FocusScope = React4.forwardRef((props, forwardedRef) => {
this.paused = false; this.paused = false;
} }
}).current; }).current;
React4.useEffect(() => { React3.useEffect(() => {
if (trapped) { if (trapped) {
let handleFocusIn2 = function(event) { let handleFocusIn2 = function(event) {
if (focusScope.paused || !container) return; if (focusScope.paused || !container) return;
@@ -337,7 +309,7 @@ var FocusScope = React4.forwardRef((props, forwardedRef) => {
}; };
} }
}, [trapped, container, focusScope.paused]); }, [trapped, container, focusScope.paused]);
React4.useEffect(() => { React3.useEffect(() => {
if (container) { if (container) {
focusScopesStack.add(focusScope); focusScopesStack.add(focusScope);
const previouslyFocusedElement = document.activeElement; const previouslyFocusedElement = document.activeElement;
@@ -368,7 +340,7 @@ var FocusScope = React4.forwardRef((props, forwardedRef) => {
}; };
} }
}, [container, onMountAutoFocus, onUnmountAutoFocus, focusScope]); }, [container, onMountAutoFocus, onUnmountAutoFocus, focusScope]);
const handleKeyDown = React4.useCallback( const handleKeyDown = React3.useCallback(
(event) => { (event) => {
if (!loop && !trapped) return; if (!loop && !trapped) return;
if (focusScope.paused) return; if (focusScope.paused) return;
@@ -477,139 +449,46 @@ function removeLinks(items) {
} }
// node_modules/@radix-ui/react-portal/dist/index.mjs // 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_react_dom = __toESM(require_react_dom(), 1);
var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1); var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
var PORTAL_NAME = "Portal"; var PORTAL_NAME = "Portal";
var Portal = React5.forwardRef((props, forwardedRef) => { var Portal = React4.forwardRef((props, forwardedRef) => {
const { container: containerProp, ...portalProps } = props; const { container: containerProp, ...portalProps } = props;
const [mounted, setMounted] = React5.useState(false); const [mounted, setMounted] = React4.useState(false);
useLayoutEffect2(() => setMounted(true), []); useLayoutEffect2(() => setMounted(true), []);
const container = containerProp || mounted && globalThis?.document?.body; 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; return container ? import_react_dom.default.createPortal((0, import_jsx_runtime3.jsx)(Primitive.div, { ...portalProps, ref: forwardedRef }), container) : null;
}); });
Portal.displayName = PORTAL_NAME; Portal.displayName = PORTAL_NAME;
// node_modules/aria-hidden/dist/es2015/index.js // node_modules/@radix-ui/react-focus-guards/dist/index.mjs
var getDefaultParent = function(originalTarget) { var React5 = __toESM(require_react(), 1);
if (typeof document === "undefined") { var count = 0;
return null; function useFocusGuards() {
} React5.useEffect(() => {
var sampleTarget = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget; const edgeGuards = document.querySelectorAll("[data-radix-focus-guard]");
return sampleTarget.ownerDocument.body; document.body.insertAdjacentElement("afterbegin", edgeGuards[0] ?? createFocusGuard());
}; document.body.insertAdjacentElement("beforeend", edgeGuards[1] ?? createFocusGuard());
var counterMap = /* @__PURE__ */ new WeakMap(); count++;
var uncontrolledNodes = /* @__PURE__ */ new WeakMap(); return () => {
var markerMap = {}; if (count === 1) {
var lockCount = 0; document.querySelectorAll("[data-radix-focus-guard]").forEach((node) => node.remove());
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);
}
} }
}); count--;
};
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"); 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 // node_modules/tslib/tslib.es6.mjs
var __assign = function() { var __assign = function() {
@@ -1341,12 +1220,133 @@ var ReactRemoveScroll = React14.forwardRef(function(props, ref) {
ReactRemoveScroll.classNames = RemoveScroll.classNames; ReactRemoveScroll.classNames = RemoveScroll.classNames;
var Combination_default = ReactRemoveScroll; 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 { export {
DismissableLayer, DismissableLayer,
useFocusGuards,
FocusScope, FocusScope,
Portal, Portal,
hideOthers, useFocusGuards,
Combination_default 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 { import {
composeRefs composeRefs
} from "./chunk-2VUH7NEY.js"; } from "./chunk-2VUH7NEY.js";
import {
require_react_dom
} from "./chunk-YF4B4G2L.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-2YVA4HRZ.js"; } from "./chunk-2YVA4HRZ.js";
@@ -102,30 +102,122 @@ function composeContextScopes(...scopes) {
return createScope; 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 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); var ReactDOM = __toESM(require_react_dom(), 1);
// node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.mjs // 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); var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
function createSlot(ownerName) { function createSlot(ownerName) {
const SlotClone = createSlotClone(ownerName); const SlotClone = createSlotClone(ownerName);
const Slot2 = React2.forwardRef((props, forwardedRef) => { const Slot2 = React6.forwardRef((props, forwardedRef) => {
const { children, ...slotProps } = props; const { children, ...slotProps } = props;
const childrenArray = React2.Children.toArray(children); const childrenArray = React6.Children.toArray(children);
const slottable = childrenArray.find(isSlottable); const slottable = childrenArray.find(isSlottable);
if (slottable) { if (slottable) {
const newElement = slottable.props.children; const newElement = slottable.props.children;
const newChildren = childrenArray.map((child) => { const newChildren = childrenArray.map((child) => {
if (child === slottable) { if (child === slottable) {
if (React2.Children.count(newElement) > 1) return React2.Children.only(null); if (React6.Children.count(newElement) > 1) return React6.Children.only(null);
return React2.isValidElement(newElement) ? newElement.props.children : null; return React6.isValidElement(newElement) ? newElement.props.children : null;
} else { } else {
return child; 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 }); return (0, import_jsx_runtime2.jsx)(SlotClone, { ...slotProps, ref: forwardedRef, children });
}); });
@@ -134,17 +226,17 @@ function createSlot(ownerName) {
} }
var Slot = createSlot("Slot"); var Slot = createSlot("Slot");
function createSlotClone(ownerName) { function createSlotClone(ownerName) {
const SlotClone = React2.forwardRef((props, forwardedRef) => { const SlotClone = React6.forwardRef((props, forwardedRef) => {
const { children, ...slotProps } = props; const { children, ...slotProps } = props;
if (React2.isValidElement(children)) { if (React6.isValidElement(children)) {
const childrenRef = getElementRef(children); const childrenRef = getElementRef(children);
const props2 = mergeProps(slotProps, children.props); const props2 = mergeProps(slotProps, children.props);
if (children.type !== React2.Fragment) { if (children.type !== React6.Fragment) {
props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef; 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`; SlotClone.displayName = `${ownerName}.SlotClone`;
return SlotClone; return SlotClone;
@@ -160,7 +252,7 @@ function createSlottable(ownerName) {
} }
var Slottable = createSlottable("Slottable"); var Slottable = createSlottable("Slottable");
function isSlottable(child) { 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) { function mergeProps(slotProps, childProps) {
const overrideProps = { ...childProps }; const overrideProps = { ...childProps };
@@ -223,7 +315,7 @@ var NODES = [
]; ];
var Primitive = NODES.reduce((primitive, node) => { var Primitive = NODES.reduce((primitive, node) => {
const Slot2 = createSlot(`Primitive.${node}`); const Slot2 = createSlot(`Primitive.${node}`);
const Node = React3.forwardRef((props, forwardedRef) => { const Node = React7.forwardRef((props, forwardedRef) => {
const { asChild, ...primitiveProps } = props; const { asChild, ...primitiveProps } = props;
const Comp = asChild ? Slot2 : node; const Comp = asChild ? Slot2 : node;
if (typeof window !== "undefined") { if (typeof window !== "undefined") {
@@ -239,116 +331,24 @@ function dispatchDiscreteCustomEvent(target, event) {
} }
// node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs // 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) { function useCallbackRef(callback) {
const callbackRef = React4.useRef(callback); const callbackRef = React8.useRef(callback);
React4.useEffect(() => { React8.useEffect(() => {
callbackRef.current = callback; callbackRef.current = callback;
}); });
return React4.useMemo(() => (...args) => callbackRef.current?.(...args), []); return React8.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";
} }
export { export {
composeEventHandlers, composeEventHandlers,
createContext2, createContext2,
createContextScope, createContextScope,
Primitive,
dispatchDiscreteCustomEvent,
useCallbackRef,
useLayoutEffect2, useLayoutEffect2,
useId, 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" "arm"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -4490,9 +4487,6 @@
"arm" "arm"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -4507,9 +4501,6 @@
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -4524,9 +4515,6 @@
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -4541,9 +4529,6 @@
"loong64" "loong64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -4558,9 +4543,6 @@
"loong64" "loong64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -4575,9 +4557,6 @@
"ppc64" "ppc64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -4592,9 +4571,6 @@
"ppc64" "ppc64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -4609,9 +4585,6 @@
"riscv64" "riscv64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -4626,9 +4599,6 @@
"riscv64" "riscv64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -4643,9 +4613,6 @@
"s390x" "s390x"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -4660,9 +4627,6 @@
"x64" "x64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -4677,9 +4641,6 @@
"x64" "x64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
+10 -23
View File
@@ -1,26 +1,13 @@
# ============================================================================= # ============================================================================
# ROBOTS.TXT - VERSAO HOMOLOGACAO/DESENVOLVIMENTO # AVANZATO TECNOLOGIA - ROBOTS.TXT (GENERICO)
# ============================================================================= # ============================================================================
# Este arquivo BLOQUEIA TODOS os crawlers. # O controle real de indexacao e feito pelo <meta name="robots"> no HTML:
# # - Producao (avanzato.com.br): index, follow
# Para PRODUCAO (avanzato.com.br), substitua por: # - Homologacao (hml.avanzato.com.br): noindex, nofollow
# User-agent: * # - Desenvolvimento (localhost): noindex, nofollow
# Allow: / # ============================================================================
# Sitemap: https://avanzato.com.br/sitemap.xml
# =============================================================================
User-agent: * User-agent: *
Disallow: / Allow: /
# Bloqueio explicito de todos os bots Sitemap: https://avanzato.com.br/sitemap.xml
User-agent: Googlebot
Disallow: /
User-agent: Bingbot
Disallow: /
User-agent: Slurp
Disallow: /
# Sitemap comentado (descomente em producao)
# Sitemap: https://avanzato.com.br/sitemap.xml
+2 -2
View File
@@ -1,5 +1,5 @@
{ {
"version": "1.1.3", "version": "1.2.1",
"date": "2026-05-31", "date": "2026-05-31",
"environment": "development" "environment": "auto-detect"
} }
+13 -10
View File
@@ -1,31 +1,34 @@
import { useState } from 'react'; import { useState } from 'react';
import { AlertTriangle, X } from 'lucide-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 * Banner visual que aparece em ambiente NAO-producao
* Avisa que Mautic, Google Ads e Facebook Pixel estao em modo simulacao * Avisa qual ambiente esta rodando
*/ */
export default function HomologationBanner() { export default function AmbientBanner() {
const [dismissed, setDismissed] = useState(false); 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 ( return (
<div className="fixed bottom-4 right-4 z-[100] max-w-md"> <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"> <div className="flex items-start gap-3">
<AlertTriangle className="w-5 h-5 shrink-0 mt-0.5" /> <AlertTriangle className="w-5 h-5 shrink-0 mt-0.5" />
<div className="flex-1"> <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"> <p className="text-xs mt-1 opacity-90">
Mautic, Google Ads e Facebook Pixel estao em modo <strong>simulacao</strong>. Tracking desativado | SEO: noindex |
Nenhum dado real e enviado. Verifique o console (F12) para ver o que seria enviado. Nenhum dado enviado a Mautic, GA4, Ads ou Pixel.
</p> </p>
</div> </div>
<button <button
onClick={() => setDismissed(true)} 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" aria-label="Fechar"
> >
<X className="w-4 h-4" /> <X className="w-4 h-4" />
+4 -3
View File
@@ -9,6 +9,7 @@
import { Helmet } from 'react-helmet-async'; import { Helmet } from 'react-helmet-async';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom';
import { ENV_CONFIG } from '../config/environment';
interface SEOProps { interface SEOProps {
title?: string; title?: string;
@@ -16,7 +17,7 @@ interface SEOProps {
keywords?: string; keywords?: string;
ogImage?: string; ogImage?: string;
ogType?: string; ogType?: string;
noindex?: boolean; noindex?: boolean; // Se true, forca noindex mesmo em producao
schema?: Record<string, any>; schema?: Record<string, any>;
} }
@@ -55,8 +56,8 @@ export default function SEO({
{/* Canonical - DINAMICO por pagina */} {/* Canonical - DINAMICO por pagina */}
<link rel="canonical" href={canonicalUrl} /> <link rel="canonical" href={canonicalUrl} />
{/* Robots */} {/* Robots - automatico por ambiente, override com prop noindex */}
{noindex ? ( {noindex || !ENV_CONFIG.allowIndexing ? (
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
) : ( ) : (
<meta name="robots" content="index, follow" /> <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');
}
}
+10 -15
View File
@@ -1,12 +1,7 @@
// Configuracao do Mautic - Avanzato // Configuracao do Mautic - Avanzato
// URL: https://mkt.avanzato.com.br // URL: https://mkt.avanzato.com.br
// --- DETECAO DE AMBIENTE --- import { IS_PRODUCTION } from './environment';
// 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);
export const MAUTIC_CONFIG = { export const MAUTIC_CONFIG = {
baseUrl: 'https://mkt.avanzato.com.br', baseUrl: 'https://mkt.avanzato.com.br',
@@ -17,8 +12,8 @@ export const MAUTIC_CONFIG = {
contato: { id: '4', enabled: true }, contato: { id: '4', enabled: true },
}, },
// Desativa envio real em homologacao // So envia dados reais em producao
enabled: !IS_HOMOLOGATION, enabled: IS_PRODUCTION,
}; };
/** /**
@@ -37,9 +32,9 @@ export const sendLeadToMautic = (
return false; return false;
} }
// MODO HOMOLOGACAO: simula envio, nao manda dados reais // MODO NAO-PRODUCAO: simula envio, nao manda dados reais
if (IS_HOMOLOGATION) { if (!IS_PRODUCTION) {
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'); 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] Form: ${formType} | Form ID: ${formConfig.id}`);
console.log(`[Mautic] Dados que seriam enviados:`, JSON.stringify(formData, null, 2)); 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}`); 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 * Desativado em homologacao para nao poluir dados
*/ */
export const trackConversion = (): void => { export const trackConversion = (): void => {
if (IS_HOMOLOGATION) { if (!IS_PRODUCTION) {
console.log('%c[HOMOLOGACAO] Google Ads conversion NAO disparado (ambiente de teste)', 'color:#f59e0b'); console.log('%c[' + (window as any).__AVANZATO_ENV__ + '] Google Ads conversion NAO disparado', 'color:#f59e0b');
return; return;
} }
if (typeof window !== 'undefined' && (window as any).gtag) { if (typeof window !== 'undefined' && (window as any).gtag) {
@@ -142,8 +137,8 @@ export const trackConversion = (): void => {
* Desativado em homologacao * Desativado em homologacao
*/ */
export const trackFacebookPixel = (eventName: string = 'Lead', params?: Record<string, any>): void => { export const trackFacebookPixel = (eventName: string = 'Lead', params?: Record<string, any>): void => {
if (IS_HOMOLOGATION) { if (!IS_PRODUCTION) {
console.log(`%c[HOMOLOGACAO] Facebook Pixel "${eventName}" NAO disparado (ambiente de teste)`, 'color:#f59e0b', params); console.log(`%c[${(window as any).__AVANZATO_ENV__}] Facebook Pixel "${eventName}" NAO disparado`, 'color:#f59e0b', params);
return; return;
} }
if (typeof window !== 'undefined' && (window as any).fbq) { if (typeof window !== 'undefined' && (window as any).fbq) {