From 37bac1853468ab947fbe74b36ca4bb833753ecc6 Mon Sep 17 00:00:00 2001 From: admtracksteel Date: Sat, 30 May 2026 14:52:07 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20Auto-deploy:=20melhoria=20no=20s?= =?UTF-8?q?nap=20e=20medi=C3=A7=C3=A3o=20AR=20em=2030/05/2026=2014:52:07?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/LandingContent.tsx | 76 +++++++++++++++++++++++++++++++ src/pages/Index.tsx | 11 ++++- src/pages/MeetingRoom.tsx | 26 +++++++---- 3 files changed, 101 insertions(+), 12 deletions(-) create mode 100644 src/components/LandingContent.tsx diff --git a/src/components/LandingContent.tsx b/src/components/LandingContent.tsx new file mode 100644 index 0000000..7d1dc4f --- /dev/null +++ b/src/components/LandingContent.tsx @@ -0,0 +1,76 @@ +import { ShieldCheck, Ruler, Scissors, ArrowRight } from 'lucide-react'; +import { Button } from '@/components/ui/button'; + +export function LandingContent() { + return ( +
+ {/* Hero Section */} +
+

+ Controle total da qualidade em obras metálicas e civis —
+ direto no canteiro, em Realidade Aumentada. +

+

+ visualize. Meça. inspire confiança. +

+
+ + {/* Benefits Section */} +
+
+
+ +
+

+ Inspeção por Checklist Digital com Gravação de Voz +

+

+ Elimine planilhas de papel. Faça inspeções de qualidade diretamente no modelo 3D, com aprovação ou reprovação de cada item e anotações por voz — tudo rastreável e auditável. +

+
+ +
+
+ +
+

+ Medições Precisas em AR com Snap Inteligente +

+

+ O controlador XR identifica automaticamente vértices, arestas e furos nos modelos IFC. O resultado são medições em milímetros reais, sem depender de trena ou cálculos manuais. +

+
+ +
+
+ +
+

+ Cortes de Seção Interativos para Análise Estrutural +

+

+ Visualize o interior de estruturas metálicas com cortes dinâmicos nos eixos X, Y e Z — sem desmontar nada. Ideal para validar projetos complexos antes da montagem. +

+
+
+ + {/* Final CTA Section */} +
+
+

+ Atrasos por erros de medição, retrabalho por falhas de comunicação e perdas por não conformidade são o pesadelo de qualquer gestão de produção metalmecânica ou obra civil. O TrackSteelXR coloca o modelo 3D IFC no canteiro — em AR — para que engenheiros e gestores tomem decisões precisas no momento certo. Menos retrabalho, mais produtividade, entregas dentro do prazo. +

+
+ + +
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index 2cc728b..4424d07 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -1,6 +1,7 @@ import { useEffect, useRef, useCallback, useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import { Upload, Glasses, CheckCircle, XCircle, Loader2, Box, Package, Users } from 'lucide-react'; +import { Upload, Glasses, CheckCircle, XCircle, Loader2, Box, Package, Users, Info } from 'lucide-react'; +import { LandingContent } from '@/components/LandingContent'; import { Button } from '@/components/ui/button'; import { useModelStore } from '@/stores/useModelStore'; import { toast } from 'sonner'; @@ -20,6 +21,7 @@ const Index = () => { const fileInputRef = useRef(null); const [loadingDemoIFC, setLoadingDemoIFC] = useState(false); const [loadingDemoCotovelo, setLoadingDemoCotovelo] = useState(false); + const [showLanding, setShowLanding] = useState(false); const [converting, setConverting] = useState(false); const { model, addModel, models, maxModels, xrSupported, setXrSupported } = useModelStore(); @@ -209,18 +211,23 @@ const Index = () => { {/* Logo area */} -
+

TrackSteelXR

+

Inspeção de Qualidade Industrial

+ {showLanding && } + {/* Main card */}
{/* Import button */} diff --git a/src/pages/MeetingRoom.tsx b/src/pages/MeetingRoom.tsx index de4fa18..0538879 100644 --- a/src/pages/MeetingRoom.tsx +++ b/src/pages/MeetingRoom.tsx @@ -531,6 +531,7 @@ function HologramModel({ model, presentationState, isPresenter, onPresentationCh const { scene } = useGLTF(model.url); const clone = useMemo(() => scene.clone(), [scene]); const presentationGroupRef = useRef(null); + const [presenterGroup, setPresenterGroup] = useState(null); const baseScaleRef = useRef(1); const centerRef = useRef(new THREE.Vector3()); const [isDragging, setIsDragging] = useState(false); @@ -590,13 +591,14 @@ function HologramModel({ model, presentationState, isPresenter, onPresentationCh // Aplica transformações de Rotação e Escala compartilhadas no grupo externo de apresentação useFrame(() => { - if (presentationGroupRef.current && presentationState && !isDragging) { + const targetGroup = presentationGroupRef.current || presenterGroup; + if (targetGroup && presentationState && !isDragging) { const { rotation, scale } = presentationState; if (rotation) { - presentationGroupRef.current.rotation.set(rotation[0], rotation[1], rotation[2]); + targetGroup.rotation.set(rotation[0], rotation[1], rotation[2]); } if (scale) { - presentationGroupRef.current.scale.setScalar(baseScaleRef.current * scale); + targetGroup.scale.setScalar(baseScaleRef.current * scale); } } }); @@ -666,20 +668,20 @@ function HologramModel({ model, presentationState, isPresenter, onPresentationCh return ( <> - {isPresenter && ( + {isPresenter && presenterGroup && ( setIsDragging(true)} onMouseUp={() => setIsDragging(false)} onChange={() => { - if (isDragging && presentationGroupRef.current) { + if (isDragging && presenterGroup) { onPresentationChange({ rotation: [ - presentationGroupRef.current.rotation.x, - presentationGroupRef.current.rotation.y, - presentationGroupRef.current.rotation.z + presenterGroup.rotation.x, + presenterGroup.rotation.y, + presenterGroup.rotation.z ] }); } @@ -687,7 +689,11 @@ function HologramModel({ model, presentationState, isPresenter, onPresentationCh /> )} {/* Grupo Externo de Apresentação Compartilhada */} - + { + // @ts-ignore + presentationGroupRef.current = node; + setPresenterGroup(node); + }}> {/* Ignoramos fineTuning.posX/Y/Z para ancorar perfeitamente à mesa */} {/* Grupo de Rotação Fina e Escala Fina */}