<!DOCTYPE html>
<html lang="es-AR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bordados Computarizados en Salta | PuntaTex Salta</title>
<meta name="description" content="Bordados computarizados en Salta: empresas, uniformes, escudos policiales, parches, gorras y colegios. Presupuesto por WhatsApp en el día. Más de 15 años bordando la identidad de Salta.">
<link rel="canonical" href="https://puntatex.com/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="PuntaTex Salta">
<meta property="og:title" content="Bordados Computarizados en Salta | PuntaTex Salta">
<meta property="og:description" content="Cada puntada cuenta tu historia. Bordado computarizado de alta precisión para empresas, instituciones, fuerzas de seguridad y particulares en Salta y el NOA.">
<meta property="og:locale" content="es_AR">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Bordados Computarizados en Salta | PuntaTex Salta">
<meta name="twitter:description" content="Bordado computarizado de alta precisión en Salta: empresas, uniformes, escudos policiales, parches y gorras.">
<meta name="robots" content="index, follow">
<link rel="icon" type="image/png" href="assets/favicon-32.png">
<link rel="apple-touch-icon" href="assets/apple-touch-icon.png">
<meta property="og:image" content="https://puntatex.com/assets/portfolio-parches-policia-full.webp">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,500;9..144,600;9..144,700;9..144,900&family=Inter:wght@400;500;600;700&family=IBM+Plex+Mono:wght@500&display=swap" rel="stylesheet">
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "PuntaTex Salta",
  "slogan": "Cada puntada cuenta tu historia",
  "image": "https://puntatex.com/og-image.jpg",
  "@id": "https://puntatex.com/",
  "url": "https://puntatex.com/",
  "telephone": "+549XXXXXXXXXX",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Barrio San Benjamín, Mz U, Lote 2",
    "addressLocality": "Salta",
    "addressRegion": "Salta",
    "postalCode": "4400",
    "addressCountry": "AR"
  },
  "areaServed": ["Salta Capital", "San Lorenzo", "Cerrillos", "Vaqueros", "Jujuy", "Tucumán"],
  "sameAs": []
}
</script>
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {"@type":"Question","name":"¿Cuánto cuesta bordar una gorra en Salta?","acceptedAnswer":{"@type":"Answer","text":"Depende de la cantidad de puntadas, colores y unidades del pedido. Te confirmamos el valor exacto por WhatsApp con tu diseño."}},
    {"@type":"Question","name":"¿Cuál es la cantidad mínima de pedido?","acceptedAnswer":{"@type":"Answer","text":"Trabajamos pedidos unitarios y producciones grandes, según el tipo de prenda."}},
    {"@type":"Question","name":"¿Cuánto tardan en entregar un pedido?","acceptedAnswer":{"@type":"Answer","text":"Los pedidos estándar salen en 48 a 72 horas hábiles desde que aprobás la muestra digitalizada."}},
    {"@type":"Question","name":"¿Envían a otras provincias además de Salta?","acceptedAnswer":{"@type":"Answer","text":"Sí, además de Salta Capital y el interior de la provincia, enviamos a Jujuy, Tucumán, Catamarca y el resto del NOA."}},
    {"@type":"Question","name":"¿Qué diferencia hay entre bordado y estampado?","acceptedAnswer":{"@type":"Answer","text":"El bordado cose el diseño con hilo, con mayor resistencia al lavado. El estampado imprime tinta y conviene con muchos colores."}}
  ]
}
</script>
<style>
  :root{
    --ink:#15130f;
    --ink-soft:#221f19;
    --paper:#f8f5ef;
    --paper-dim:#efe9de;
    --thread:#e8560a;
    --thread-dark:#b8430a;
    --slate:#55504a;
    --mist:#ada69b;
    --line:#e3ddd0;
    --font-display:'Fraunces', serif;
    --font-body:'Inter', sans-serif;
    --font-mono:'IBM Plex Mono', monospace;
    --container: 1180px;
  }
  *{box-sizing:border-box; margin:0; padding:0;}
  html{scroll-behavior:smooth;}
  @media (prefers-reduced-motion: reduce){
    html{scroll-behavior:auto;}
    *{animation-duration:0.001ms !important; animation-iteration-count:1 !important; transition-duration:0.001ms !important;}
  }
  body{
    background:var(--paper);
    color:var(--ink);
    font-family:var(--font-body);
    line-height:1.5;
    -webkit-font-smoothing:antialiased;
    overflow-x:hidden;
  }
  img{max-width:100%; display:block;}
  a{color:inherit; text-decoration:none;}
  ul{list-style:none;}
  .wrap{max-width:var(--container); margin:0 auto; padding:0 28px;}
  :focus-visible{outline:2px solid var(--thread); outline-offset:3px; border-radius:2px;}
  a:focus-visible, button:focus-visible{outline:2px solid var(--thread); outline-offset:3px;}
  ::selection{background:var(--thread); color:var(--paper);}

  .eyebrow{
    font-family:var(--font-mono);
    font-size:12px;
    letter-spacing:.14em;
    text-transform:uppercase;
    color:var(--thread-dark);
    display:flex; align-items:center; gap:10px;
  }
  .eyebrow::before{content:""; width:22px; height:1px; background:var(--thread-dark);}
  .light-on-dark .eyebrow, .hero-top .eyebrow, .cta-band .eyebrow{color:var(--thread);}
  .light-on-dark .eyebrow::before, .hero-top .eyebrow::before, .cta-band .eyebrow::before{background:var(--thread);}

  h1,h2,h3{font-family:var(--font-display); font-weight:700; letter-spacing:-.01em;}

  /* ---------- stitch divider signature element ---------- */
  .stitch{width:100%; height:14px; overflow:visible;}
  .stitch path{
    fill:none;
    stroke:var(--thread);
    stroke-width:2.5;
    stroke-linecap:round;
    stroke-dasharray:9 8;
    stroke-dashoffset:400;
    transition:stroke-dashoffset 1.4s cubic-bezier(.2,.7,.2,1);
  }
  .stitch.dark path{stroke:var(--paper-dim);}
  .reveal.in-view .stitch path{stroke-dashoffset:0;}

  /* ---------- header ---------- */
  header{
    position:fixed; top:0; left:0; right:0; z-index:100;
    padding:24px 0;
    transition:background .4s ease, padding .35s cubic-bezier(.2,.8,.2,1), border-color .4s ease, box-shadow .4s ease;
    border-bottom:1px solid transparent;
    animation:headerEnter .6s cubic-bezier(.2,.8,.2,1) both;
  }
  @keyframes headerEnter{ from{ opacity:0; transform:translateY(-14px); } to{ opacity:1; transform:translateY(0); } }
  @media (prefers-reduced-motion: reduce){ header{animation:none;} }
  header.solid{
    background:rgba(21,19,15,.86);
    backdrop-filter:blur(14px); -webkit-backdrop-filter:blur(14px);
    padding:15px 0;
    border-color:rgba(255,255,255,.08);
    box-shadow:0 8px 30px rgba(10,9,7,.28);
  }
  header .wrap{display:flex; align-items:center; justify-content:space-between;}
  .logo{font-family:var(--font-display); font-weight:900; font-size:22px; color:var(--paper); position:relative;}
  .logo span{color:var(--thread);}
  .logo-brand{display:flex; align-items:center; gap:11px; transition:opacity .25s ease;}
  .logo-brand:hover, .logo-brand:focus-visible{opacity:.82;}
  .logo-mark{height:38px; width:auto; display:block; border-radius:4px; transition:transform .3s ease;}
  .logo-brand:hover .logo-mark{transform:scale(1.04);}
  nav.primary{display:flex; gap:8px;}
  nav.primary a{
    font-size:14px; color:var(--paper); opacity:.75; letter-spacing:.02em;
    position:relative; padding:8px 14px; border-radius:20px;
    transition:opacity .25s ease, background .25s ease;
  }
  nav.primary a::after{
    content:""; position:absolute; left:14px; right:14px; bottom:4px; height:1px; background:var(--thread);
    transform:scaleX(0); transform-origin:left; transition:transform .3s cubic-bezier(.2,.8,.2,1);
  }
  nav.primary a:hover{opacity:1; background:rgba(255,255,255,.06);}
  nav.primary a:hover::after, nav.primary a.active::after{transform:scaleX(1);}
  nav.primary a.active{opacity:1;}
  .header-cta{
    display:flex; align-items:center; gap:12px;
  }
  .header-cta .btn{padding:12px 22px; font-size:13px;}
  .btn{
    display:inline-flex; align-items:center; justify-content:center; gap:8px;
    font-family:var(--font-body); font-weight:700; font-size:14px;
    padding:13px 26px; border-radius:2px; cursor:pointer; border:1px solid transparent;
    transition:transform .25s ease, background .25s ease, border-color .25s ease, color .25s ease;
  }
  .btn:hover, .btn:focus-visible{transform:translateY(-2px);}
  .btn:active{transform:translateY(0) scale(.98); transition-duration:.1s;}
  .btn:disabled, .btn[aria-disabled="true"]{opacity:.55; cursor:not-allowed; transform:none; pointer-events:none;}
  .btn.is-loading{position:relative; color:transparent !important; pointer-events:none;}
  .btn.is-loading::after{
    content:""; position:absolute; width:16px; height:16px; border-radius:50%;
    border:2px solid rgba(255,255,255,.4); border-top-color:#fff; animation:btnspin .6s linear infinite;
  }
  .btn-ghost-light.is-loading::after{border-color:rgba(21,19,15,.3); border-top-color:var(--ink);}
  @keyframes btnspin{to{transform:rotate(360deg);}}
  @media (prefers-reduced-motion: reduce){ .btn:hover{transform:none;} }
  .btn-primary{background:var(--thread); color:var(--paper);}
  .btn-primary:hover, .btn-primary:focus-visible{background:var(--thread-dark);}
  .btn-ghost-dark{border-color:rgba(255,255,255,.35); color:var(--paper);}
  .btn-ghost-dark:hover, .btn-ghost-dark:focus-visible{border-color:var(--paper);}
  .btn-ghost-light{border-color:var(--ink); color:var(--ink);}
  .btn-ghost-light:hover, .btn-ghost-light:focus-visible{background:var(--ink); color:var(--paper);}
  .menu-toggle{
    display:none; background:none; border:none; color:var(--paper); font-size:24px; cursor:pointer;
    line-height:1; padding:10px; border-radius:50%; transition:background .25s ease;
    width:44px; height:44px; align-items:center; justify-content:center;
  }
  .menu-toggle:hover, .menu-toggle:focus-visible{background:rgba(255,255,255,.08);}
  .mobile-nav{
    position:fixed; top:0; right:0; bottom:0; width:min(78vw,320px); background:var(--ink);
    z-index:150; transform:translateX(100%); transition:transform .35s cubic-bezier(.2,.8,.2,1);
    padding:90px 32px 32px; display:flex; flex-direction:column; gap:6px;
    box-shadow:-20px 0 40px rgba(0,0,0,.3);
  }
  .mobile-nav.open{transform:translateX(0);}
  .mobile-nav a{
    color:var(--paper); font-size:17px; padding:14px 16px; margin:0 -16px; border-radius:10px;
    border-bottom:1px solid rgba(255,255,255,.08); transition:background .25s ease, padding-left .25s ease;
  }
  .mobile-nav a:hover, .mobile-nav a:focus-visible{background:rgba(255,255,255,.06); padding-left:22px;}
  .mobile-nav .btn{margin-top:20px;}
  .nav-scrim{
    position:fixed; inset:0; background:rgba(10,9,7,.6); z-index:140; opacity:0; pointer-events:none;
    transition:opacity .35s ease;
  }
  .nav-scrim.open{opacity:1; pointer-events:auto;}
  .menu-close{position:absolute; top:26px; right:28px; background:none; border:none; color:var(--paper); cursor:pointer; padding:6px; display:flex; align-items:center; justify-content:center;}

  /* ---------- hero ---------- */
  .hero{
    position:relative; min-height:100svh; display:flex; align-items:center;
    background:
      radial-gradient(ellipse at 20% 0%, rgba(232,86,10,.18), transparent 55%),
      repeating-linear-gradient(115deg, #1c1913 0px, #1c1913 2px, #17150f 2px, #17150f 4px),
      var(--ink);
    color:var(--paper);
    padding:132px 0 172px;
    overflow:hidden;
  }
  .hero-video{
    position:absolute; inset:0; width:100%; height:100%; object-fit:cover; object-position:50% 42%; z-index:0;
    filter:contrast(1.08) saturate(1.12) brightness(.97);
  }
  .hero-video-overlay{
    position:absolute; inset:0; z-index:1;
    background:
      radial-gradient(ellipse at 82% 20%, transparent 40%, rgba(10,9,7,.1) 75%),
      linear-gradient(180deg, rgba(15,13,10,.58) 0%, rgba(15,13,10,.62) 32%, rgba(15,13,10,.7) 62%, rgba(15,13,10,.9) 100%);
  }
  .hero-stitch-field{
    position:absolute; inset:0; pointer-events:none; opacity:.32; z-index:1;
  }
  .hero-stitch-field svg{width:100%; height:100%;}
  .hero-stitch-field path{
    fill:none; stroke:rgba(232,86,10,.55); stroke-width:1.6; stroke-dasharray:6 10;
    animation:threadmove 30s linear infinite;
  }
  .hero-stitch-field path:nth-child(2){stroke:rgba(248,245,239,.12); animation-duration:46s; animation-direction:reverse;}
  @keyframes threadmove{ to{ stroke-dashoffset:-1600; } }

  .hero-top{position:relative; z-index:2; width:100%;}
  .hero-top .eyebrow{color:var(--paper); margin-bottom:24px; text-shadow:0 2px 12px rgba(0,0,0,.5);}
  .hero-top .eyebrow::before{background:var(--thread);}
  .hero h1{
    font-size:clamp(46px, 8.2vw, 112px);
    line-height:.96;
    letter-spacing:-.01em;
    margin-bottom:24px;
    text-shadow:0 4px 24px rgba(0,0,0,.35);
  }
  .hero h1 em{
    font-style:normal; color:var(--thread);
    text-shadow:
      0 0 2px rgba(10,9,7,.9), 0 0 6px rgba(10,9,7,.8), 0 0 14px rgba(10,9,7,.7),
      0 2px 4px rgba(10,9,7,.6);
  }
  .hero .slogan-sub{
    font-family:var(--font-display); font-style:italic; font-weight:500; font-size:clamp(18px,2.2vw,24px);
    color:var(--paper); margin-bottom:24px; text-shadow:0 2px 10px rgba(0,0,0,.45);
  }
  .hero p.lede{
    max-width:480px; font-size:17px; line-height:1.6; color:rgba(248,245,239,.82); margin-bottom:40px;
  }
  .hero-actions{display:flex; gap:16px; flex-wrap:wrap; position:relative; z-index:2;}
  .hero-reassurance{font-size:12.5px; color:rgba(248,245,239,.75); margin-top:16px; position:relative; z-index:2; text-shadow:0 1px 6px rgba(0,0,0,.4);}
  .hero-actions .btn{padding:15px 30px; font-size:14px;}
  .hero-actions .btn-primary{box-shadow:0 8px 28px rgba(232,86,10,.35);}
  .hero-actions .btn-primary:hover{box-shadow:0 10px 34px rgba(232,86,10,.5); transform:translateY(-2px);}
  .hero-actions .btn-ghost-dark{
    background:rgba(255,255,255,.06); backdrop-filter:blur(8px); -webkit-backdrop-filter:blur(8px);
    border-color:rgba(255,255,255,.28);
  }
  .hero-actions .btn-ghost-dark:hover{background:rgba(255,255,255,.12); border-color:rgba(255,255,255,.5);}
  .hero-stats{
    position:absolute; left:0; right:0; bottom:0; z-index:2;
    padding-top:24px; padding-bottom:32px;
    background:linear-gradient(180deg, transparent 0%, rgba(11,10,8,.55) 45%, rgba(11,10,8,.72) 100%);
    backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px);
    display:grid; grid-template-columns:repeat(4,1fr);
    border-top:1px solid rgba(255,255,255,.16);
  }
  .hero-stats div{padding:22px 0 0; border-right:1px solid rgba(255,255,255,.16);}
  .hero-stats div:last-child{border-right:none;}
  .hero-stats b{display:block; font-family:var(--font-display); font-size:30px; color:var(--paper); font-variant-numeric:tabular-nums; letter-spacing:-.01em;}
  .hero-stats span{font-family:var(--font-mono); font-size:11px; letter-spacing:.06em; color:rgba(248,245,239,.68); text-transform:uppercase;}

  /* ---------- marquee ---------- */
  .marquee{
    background:var(--ink); color:var(--thread); overflow:hidden; white-space:nowrap;
    padding:13px 0; border-top:1px solid rgba(255,255,255,.08); border-bottom:1px solid rgba(255,255,255,.08);
  }
  .marquee-track{display:inline-flex; animation:scroll 32s linear infinite;}
  .marquee-track span{
    font-family:var(--font-mono); font-size:13px; letter-spacing:.06em; text-transform:uppercase;
    padding:0 26px; display:inline-flex; align-items:center; gap:26px;
  }
  .marquee-track span::after{content:"✦"; opacity:.6; font-size:11px;}
  @keyframes scroll{ from{transform:translateX(0);} to{transform:translateX(-50%);} }

  /* ---------- generic section ---------- */
  section{padding:120px 0;}
  .section-head{max-width:640px; margin-bottom:64px;}
  .section-head h2{font-size:clamp(32px,4.2vw,54px); margin:18px 0 20px; line-height:1.05;}
  .section-head p{color:var(--slate); font-size:16px; max-width:520px;}
  #portfolioTrust{font-family:var(--font-mono); font-size:12px; letter-spacing:.04em; color:var(--thread) !important; margin-top:10px;}
  .light-on-dark{background:var(--ink); color:var(--paper);}
  .light-on-dark .section-head p{color:var(--mist);}

  .reveal{opacity:0; transform:translateY(26px); transition:opacity .8s ease, transform .8s ease;}
  .reveal.in-view{opacity:1; transform:translateY(0);}

  /* ---------- services ---------- */
  .services-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:28px;}
  .service-card{
    position:relative; padding:34px 30px; background:var(--ink); color:var(--paper);
    min-height:280px; display:flex; flex-direction:column; justify-content:flex-end;
    overflow:hidden; transition:transform .4s ease;
  }
  .service-card::before{
    content:""; position:absolute; inset:0;
    background:
      repeating-linear-gradient(70deg, rgba(232,86,10,.14) 0 2px, transparent 2px 26px);
    opacity:.6; transition:opacity .4s ease;
  }
  .service-card:hover{transform:translateY(-6px);}
  .service-card:hover::before{opacity:1;}
  .service-card .tag{font-family:var(--font-mono); font-size:11px; letter-spacing:.06em; color:var(--thread); text-transform:uppercase; position:relative;}
  .service-card h3{font-size:24px; margin:10px 0 12px; position:relative; font-weight:600; line-height:1.3;}
  .service-card p{font-size:13px; color:var(--mist); position:relative; margin-bottom:18px;}
  .service-card .go{font-size:13px; font-weight:600; color:var(--paper); position:relative; display:inline-flex; gap:8px; align-items:center;}
  .service-card .go::after{content:"→"; transition:transform .3s ease;}
  .service-card:hover .go::after{transform:translateX(5px);}

  /* ---------- pill row (que bordamos, compact) ---------- */
  .pill-label{font-family:var(--font-mono); font-size:12px; letter-spacing:.06em; text-transform:uppercase; color:var(--mist); margin:36px 0 14px;}
  .pill-row{display:flex; flex-wrap:wrap; gap:10px;}
  .pill-row a{
    font-size:13px; padding:9px 16px; border:1px solid rgba(255,255,255,.2); color:var(--paper);
    border-radius:999px; transition:all .25s ease;
  }
  .pill-row a:hover, .pill-row a:focus-visible{background:var(--thread); border-color:var(--thread);}

  /* ---------- mini cta strip ---------- */
  .mini-cta{
    background:var(--thread); color:var(--ink); padding:26px 0; display:flex; align-items:center; justify-content:center;
    gap:24px; flex-wrap:wrap; text-align:center;
  }
  .mini-cta p{font-family:var(--font-display); font-weight:700; font-size:20px;}
  .mini-cta .btn-primary{background:var(--ink); color:var(--paper);}
  .mini-cta .btn-primary:hover{background:var(--ink-soft);}

  /* ---------- before / after ---------- */

  /* ---------- chip grid (por qué elegirnos, compact) ---------- */
  .chip-grid{display:grid; grid-template-columns:repeat(6,1fr); gap:14px;}
  .chip{border:1px solid var(--line); padding:22px 16px; text-align:center; transition:transform .25s ease, box-shadow .25s ease, border-color .25s ease;}
  .chip:hover{transform:translateY(-3px); box-shadow:0 10px 24px rgba(21,19,15,.08); border-color:var(--thread);}
  .chip h3{font-size:16px; font-weight:600; margin-bottom:6px; line-height:1.3;}
  .chip p{font-size:12px; color:var(--slate);}

  /* ---------- casos de éxito ---------- */
  .case-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:28px;}
  .case-card{background:var(--ink-soft); padding:0 26px 26px;}
  .case-photo{height:160px; background:linear-gradient(135deg,#2a251c,#17150f); position:relative; margin-bottom:20px;}
  .case-photo::before{content:""; position:absolute; inset:0; background-image:repeating-linear-gradient(60deg, rgba(232,86,10,.2) 0 2px, transparent 2px 18px);}
  .case-card .tag{font-family:var(--font-mono); font-size:11px; letter-spacing:.06em; text-transform:uppercase; color:var(--thread); margin-bottom:8px;}
  .case-card h3{font-size:18px; font-weight:600; margin-bottom:14px; color:var(--paper); line-height:1.3;}
  .case-line{font-size:13px; color:var(--mist); margin-bottom:6px; line-height:1.5;}
  .case-line b{color:var(--paper);}

  /* ---------- formulario ---------- */
  .contact-form{max-width:760px;}
  .form-grid{display:grid; grid-template-columns:repeat(2,1fr); gap:16px; margin-bottom:18px;}
  .contact-form label{display:flex; flex-direction:column; gap:8px; font-family:var(--font-mono); font-size:11px; letter-spacing:.06em; text-transform:uppercase; color:var(--slate); margin-bottom:18px;}
  .form-full{grid-column:1/-1;}
  .contact-form input, .contact-form textarea{
    font-family:var(--font-body); font-size:14px; padding:12px 14px; border:1px solid var(--line); background:var(--paper); color:var(--ink);
  }
  .contact-form input:focus, .contact-form textarea:focus{outline:none; border-color:var(--thread);}
  .contact-form input[type="file"]{padding:9px 10px; background:transparent;}
  .form-more{margin-bottom:22px; border:1px solid var(--line); padding:14px 18px;}
  .form-more summary{
    cursor:pointer; font-size:13.5px; font-weight:600; color:var(--ink); list-style:none;
    display:flex; align-items:center; gap:6px;
  }
  .form-more summary::-webkit-details-marker{display:none;}
  .form-more summary span{font-weight:400; color:var(--slate); font-size:12.5px;}
  .form-note{font-size:13px; color:var(--slate); margin-top:14px;}
  .form-note a{color:var(--thread-dark); font-weight:600;}

  /* ---------- mapa ---------- */
  .map-embed{filter:grayscale(.3) contrast(1.05); border:1px solid rgba(255,255,255,.12); line-height:0;}

  /* ---------- calculadora estimativa ---------- */
  .calc{
    max-width:520px; margin:0 auto 30px; background:rgba(255,255,255,.04); border:1px solid rgba(255,255,255,.14);
    padding:26px; text-align:left;
  }
  .calc-row{display:grid; grid-template-columns:1fr 1fr; gap:16px; margin-bottom:16px;}
  .calc-row label{font-family:var(--font-mono); font-size:11px; letter-spacing:.06em; text-transform:uppercase; color:var(--mist); display:flex; flex-direction:column; gap:8px;}
  .calc-row select{
    font-family:var(--font-body); font-size:14px; padding:13px 12px; background:var(--ink); color:var(--paper);
    border:1px solid rgba(255,255,255,.25); min-height:44px;
  }
  .calc-result{font-size:14px; color:var(--paper); margin-bottom:18px; text-align:center;}
  .calc-result b{color:var(--thread);}

  /* ---------- process ---------- */
  .process{display:grid; grid-template-columns:repeat(5,1fr); gap:0; position:relative;}
  .process::before{
    content:""; position:absolute; top:19px; left:0; right:0; height:1px;
    background:repeating-linear-gradient(90deg, var(--thread) 0 8px, transparent 8px 15px);
  }
  .process-step{padding-right:20px; position:relative;}
  .process-step .dot{width:38px; height:38px; border-radius:50%; background:var(--paper); border:2px solid var(--thread); display:flex; align-items:center; justify-content:center; font-family:var(--font-mono); font-size:13px; color:var(--thread); position:relative; z-index:2; margin-bottom:22px;}
  .process-step h3{font-size:16px; margin-bottom:8px; font-weight:600; line-height:1.3;}
  .process-step p{font-size:13px; color:var(--mist);}

  /* ---------- portafolio ---------- */
  .filters{display:flex; gap:10px; margin-bottom:34px; overflow-x:auto; scrollbar-width:none; -ms-overflow-style:none; scroll-snap-type:x proximity;}
  .filters::-webkit-scrollbar{display:none;}
  .filter-btn{
    font-family:var(--font-mono); font-size:12px; letter-spacing:.06em; text-transform:uppercase;
    padding:13px 18px; border:1px solid var(--line); background:transparent; cursor:pointer;
    color:var(--mist); transition:background .25s ease, color .25s ease, border-color .25s ease, transform .15s ease;
    flex-shrink:0; scroll-snap-align:start;
  }
  .filter-btn.active, .filter-btn:hover, .filter-btn:focus-visible{background:var(--ink); color:var(--paper); border-color:var(--ink);}
  .filter-btn:active{transform:scale(.94);}

  .portfolio-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:28px; perspective:1200px;}
  .portfolio-loadmore-wrap{text-align:center; margin-top:40px;}
  .p-card{
    position:relative; overflow:hidden; cursor:pointer; background:var(--ink-soft);
    box-shadow:0 0 0 rgba(0,0,0,0); transition:transform .4s cubic-bezier(.2,.8,.2,1), box-shadow .4s ease;
    animation:pCardIn .55s cubic-bezier(.2,.8,.2,1) both; animation-delay:calc(var(--i,0) * 70ms);
    will-change:transform;
    cursor:url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2230%22%20height%3D%2230%22%20viewBox%3D%220%200%2030%2030%22%3E%3Cline%20x1%3D%227%22%20y1%3D%226%22%20x2%3D%2225%22%20y2%3D%2224%22%20stroke%3D%22%23e8560a%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22/%3E%3Cline%20x1%3D%2225%22%20y1%3D%2224%22%20x2%3D%2221%22%20y2%3D%2220%22%20stroke%3D%22%23f8f5ef%22%20stroke-width%3D%221%22%20stroke-linecap%3D%22round%22/%3E%3Cellipse%20cx%3D%228.5%22%20cy%3D%227.5%22%20rx%3D%222.4%22%20ry%3D%221.5%22%20transform%3D%22rotate(45%208.5%207.5)%22%20fill%3D%22none%22%20stroke%3D%22%23f8f5ef%22%20stroke-width%3D%221.4%22/%3E%3Cpath%20d%3D%22M6%205%20Q1%202%203%209%22%20fill%3D%22none%22%20stroke%3D%22%23f8f5ef%22%20stroke-width%3D%221%22%20stroke-linecap%3D%22round%22%20opacity%3D%22.7%22/%3E%3C/svg%3E') 15 15, pointer;
  }
  @keyframes pCardIn{ from{opacity:0; transform:translateY(22px);} to{opacity:1; transform:translateY(0);} }
  .portfolio-grid.filtering .p-card{
    animation:pCardOut .25s ease both;
  }
  @keyframes pCardOut{ to{opacity:0; transform:translateY(-10px) scale(.97);} }
  .p-card:hover, .p-card:focus-within{box-shadow:0 24px 48px rgba(0,0,0,.4);}
  .p-cover-wrap{aspect-ratio:4/5; overflow:hidden; background:var(--ink-soft); position:relative;}
  .p-cover-wrap img{
    width:100%; height:100%; object-fit:cover; display:block; opacity:0;
    filter:blur(14px); transform:scale(1.08);
    transition:opacity .5s ease, transform .6s cubic-bezier(.2,.8,.2,1), filter .6s ease;
  }
  .p-cover-wrap img.loaded{opacity:1; filter:blur(0); transform:scale(1);}
  .p-card:hover .p-cover-wrap img.loaded, .p-card:focus-within .p-cover-wrap img.loaded{transform:scale(1.08) translateZ(0);}
  .p-cover-wrap::after{
    content:""; position:absolute; inset:0;
    background:linear-gradient(180deg, transparent 40%, rgba(21,19,15,.88) 100%);
    opacity:0; transition:opacity .35s ease;
  }
  .p-card:hover .p-cover-wrap::after, .p-card:focus-within .p-cover-wrap::after{opacity:1;}
  .p-view-cta{
    position:absolute; left:20px; bottom:16px; z-index:2; color:var(--paper); font-size:13px; font-weight:600;
    display:flex; align-items:center; gap:8px; opacity:0; transform:translateY(10px); transition:all .35s ease;
  }
  .p-view-cta::after{content:"→"; transition:transform .3s ease;}
  .p-card:hover .p-view-cta, .p-card:focus-within .p-view-cta{opacity:1; transform:translateY(0);}
  .p-card:hover .p-view-cta::after{transform:translateX(4px);}
  .p-info{padding:18px 20px 22px; transition:transform .4s cubic-bezier(.2,.8,.2,1);}
  .p-card:hover .p-info{transform:translateY(-2px);}
  .p-info .tag{font-family:var(--font-mono); font-size:11px; letter-spacing:.06em; text-transform:uppercase; color:var(--thread); margin-bottom:6px;}
  .p-info h3{font-size:18px; color:var(--paper); font-weight:600; margin-bottom:6px; line-height:1.3;}
  .p-info p{font-size:13px; color:var(--mist);}
  .p-expand{
    position:absolute; top:16px; right:16px; width:34px; height:34px; border-radius:50%; z-index:2;
    background:rgba(21,19,15,.7); backdrop-filter:blur(4px); display:flex; align-items:center; justify-content:center;
    color:var(--paper); font-size:15px; opacity:0; transform:translateY(-6px); transition:all .3s ease;
  }
  .p-card:hover .p-expand, .p-card:focus-within .p-expand{opacity:1; transform:translateY(0);}
  @media (hover:none){
    .p-card{transform:none !important;}
  }
  @media (prefers-reduced-motion: reduce){
    .p-cover-wrap img{transition:opacity .3s ease;}
    .p-card{animation:none !important; transform:none !important;}
    .portfolio-grid.filtering .p-card{animation:none !important;}
    .service-card, .service-card:hover,
    .chip, .chip:hover,
    .mini-card, .mini-card:has(a):hover,
    .btn:hover, .case-card, .testi-card{transform:none !important;}
  }

  /* ---------- testimonials ---------- */
  .testi-card{border:1px solid var(--line); padding:30px; background:var(--paper);}
  .testi-carousel{max-width:640px; margin:0 auto; overflow:hidden;}
  .testi-track{display:flex; transition:transform .5s cubic-bezier(.2,.7,.2,1);}
  .testi-track .testi-card{flex:0 0 100%; margin:0 4px;}
  .testi-dots{display:flex; justify-content:center; gap:8px; margin-top:20px;}
  .testi-dots button{width:8px; height:8px; border-radius:50%; border:none; background:var(--line); cursor:pointer; padding:0; transition:background .25s ease, transform .25s ease;}
  .testi-dots button.active{background:var(--thread); transform:scale(1.3);}
  .stars{color:var(--thread); font-size:14px; letter-spacing:2px; margin-bottom:16px;}
  .testi-card p{font-size:16px; color:var(--ink); margin-bottom:20px; line-height:1.7;}
  .testi-who{display:flex; align-items:center; gap:12px;}
  .testi-avatar{width:38px; height:38px; border-radius:50%; background:var(--ink); color:var(--thread); display:flex; align-items:center; justify-content:center; font-family:var(--font-display); font-weight:700; font-size:14px;}
  .testi-who b{display:block; font-size:14px;}
  .testi-who span{font-size:12px; color:var(--slate);}

  /* ---------- clients ---------- */
  .clients-grid{display:grid; grid-template-columns:repeat(7,1fr); gap:1px; background:var(--line); border:1px solid var(--line);}
  .client-logo{background:var(--paper); height:88px; display:flex; align-items:center; justify-content:center; font-family:var(--font-mono); font-size:11px; letter-spacing:.06em; color:var(--slate); text-transform:uppercase; text-align:center; padding:10px; transition:color .25s ease, background .25s ease;}
  .client-logo:hover, .client-logo:focus-visible{color:var(--ink); background:var(--paper-dim);}

  /* ---------- faq ---------- */
  .faq-list{max-width:760px; border-top:1px solid rgba(255,255,255,.12);}
  .faq-list details{border-bottom:1px solid rgba(255,255,255,.12); padding:20px 0;}
  .faq-list summary{
    cursor:pointer; font-family:var(--font-display); font-weight:600; font-size:17px;
    color:var(--paper); list-style:none; display:flex; justify-content:space-between; align-items:center; gap:16px;
  }
  .faq-list summary::-webkit-details-marker{display:none;}
  .faq-list summary::after{content:"+"; font-size:22px; color:var(--thread); flex-shrink:0; transition:transform .3s ease;}
  .faq-list details[open] summary::after{transform:rotate(45deg);}
  .faq-list p{margin-top:14px; font-size:14px; color:var(--mist); line-height:1.7;}

  /* ---------- CTA band ---------- */
  .cta-band{
    background:var(--ink); color:var(--paper); text-align:center; padding:110px 0; position:relative; overflow:hidden;
  }
  .cta-band h2{font-size:clamp(32px,4.2vw,54px); margin-bottom:22px; line-height:1.05;}
  .cta-band p{color:var(--mist); max-width:480px; margin:0 auto 36px;}
  .cta-actions{display:flex; gap:16px; justify-content:center; flex-wrap:wrap;}

  /* ---------- footer ---------- */
  footer{background:#0e0c08; color:var(--mist); padding:80px 0 30px;}
  .footer-grid{display:grid; grid-template-columns:1.4fr repeat(4,1fr); gap:40px; margin-bottom:60px;}
  .footer-brand .logo{margin-bottom:16px;}
  .footer-brand p{font-size:14px; max-width:260px; color:var(--mist);}
  footer h4{font-family:var(--font-mono); font-size:12px; letter-spacing:.06em; text-transform:uppercase; color:var(--paper); margin-bottom:18px;}
  footer ul li{margin-bottom:10px;}
  footer ul a{font-size:13px; color:var(--mist); transition:color .2s ease;}
  footer ul a:hover{color:var(--thread);}
  .footer-bottom{
    border-top:1px solid rgba(255,255,255,.1); padding-top:24px; display:flex; justify-content:space-between;
    font-size:12px; color:var(--mist); flex-wrap:wrap; gap:12px;
  }

  /* ---------- floating whatsapp ---------- */
  .float-wa{
    position:fixed; right:26px; bottom:26px; z-index:200; width:58px; height:58px; border-radius:50%;
    background:#20b858; display:flex; align-items:center; justify-content:center; box-shadow:0 8px 24px rgba(0,0,0,.3);
    transition:transform .3s ease;
  }
  .float-wa:hover, .float-wa:focus-visible{transform:scale(1.08);}
  .float-wa svg{width:28px; height:28px; fill:#fff;}

  /* ---------- responsive ---------- */
  @media (max-width:980px){
    nav.primary, .header-cta .btn-ghost-dark{display:none;}
    .menu-toggle{display:flex;}
    .hero{display:block; padding:118px 0 0;}
    .hero-top{margin-bottom:36px;}
    .hero-stats{
      position:static; grid-template-columns:repeat(2,1fr);
      background:none; backdrop-filter:none; -webkit-backdrop-filter:none;
      padding:22px 0 28px;
    }
    .services-grid{grid-template-columns:repeat(2,1fr);}
    .portfolio-grid{grid-template-columns:repeat(2,1fr);}
    .clients-grid{grid-template-columns:repeat(4,1fr);}
    .chip-grid{grid-template-columns:repeat(3,1fr);}
    .case-grid{grid-template-columns:1fr;}
    .process{grid-template-columns:repeat(1,1fr); gap:28px;}
    .process::before{display:none;}
    .footer-grid{grid-template-columns:repeat(2,1fr);}
  }
  @media (max-width:420px){
    .header-cta{display:none;}
  }
  @media (max-width:620px){
    section{padding:80px 0;}
    .services-grid, .portfolio-grid{grid-template-columns:1fr;}
    .clients-grid{grid-template-columns:repeat(2,1fr);}
    .hero-stats{grid-template-columns:repeat(2,1fr);}
    .footer-grid{grid-template-columns:1fr;}
    .cta-actions .btn{width:100%;}
    .hero-actions .btn{width:100%;}
    .chip-grid{grid-template-columns:repeat(2,1fr);}
    .calc-row{grid-template-columns:1fr;}
    .mini-cta{flex-direction:column;}
    .form-grid{grid-template-columns:1fr;}
  }
</style>
</head>
<body>

<header id="siteHeader">
  <div class="wrap">
    <a href="#inicio" class="logo logo-brand"><img src="assets/logo-header.webp" alt="PuntaTex Salta" class="logo-mark" width="38" height="38">Punta<span>Tex</span> Salta</a>
    <nav class="primary">
      <a href="#servicios">Servicios</a>
      <a href="#galeria">Portafolio</a>
      <a href="#nosotros">Nosotros</a>
      <a href="#casos">Casos</a>
      <a href="#opiniones">Opiniones</a>
    </nav>
    <div class="header-cta">
      <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20quiero%20pedir%20un%20presupuesto%20de%20bordado" class="btn btn-ghost-dark" target="_blank" rel="noopener">WhatsApp</a>
      <a href="#contacto" class="btn btn-primary">Solicitar presupuesto</a>
    </div>
    <button class="menu-toggle" id="menuToggle" aria-label="Abrir menú" aria-expanded="false" aria-controls="mobileNav">☰</button>
  </div>
</header>

<div class="nav-scrim" id="navScrim"></div>
<nav class="mobile-nav" id="mobileNav" aria-hidden="true">
  <button class="menu-close" id="menuClose" aria-label="Cerrar menú"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M6 6l12 12M18 6L6 18"/></svg></button>
  <a href="#servicios">Servicios</a>
  <a href="#galeria">Portafolio</a>
  <a href="#nosotros">Nosotros</a>
  <a href="#casos">Casos</a>
  <a href="#opiniones">Opiniones</a>
  <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20quiero%20pedir%20un%20presupuesto%20de%20bordado" class="btn btn-primary" target="_blank" rel="noopener">Solicitar presupuesto</a>
</nav>

<!-- ============ HERO ============ -->
<section class="hero" id="inicio">
  <video class="hero-video" autoplay muted loop playsinline preload="auto" fetchpriority="high" poster="assets/hero-poster.webp" aria-hidden="true">
    <source src="assets/hero-embroidery.mp4" type="video/mp4">
  </video>
  <div class="hero-video-overlay" aria-hidden="true"></div>
  <div class="hero-stitch-field" aria-hidden="true">
    <svg viewBox="0 0 1200 800" preserveAspectRatio="none">
      <path d="M-50 620 Q150 560 300 640 T650 600 T1000 660 T1300 610" />
      <path d="M-50 180 Q200 120 400 200 T800 150 T1250 210" />
    </svg>
  </div>
  <div class="wrap hero-top">
    <p class="eyebrow">Bordado computarizado · Salta, Argentina</p>
    <h1>Bordados Computarizados<br>en <em>Salta.</em></h1>
    <p class="slogan-sub">Cada puntada cuenta tu historia.</p>
    <p class="lede">Bordamos identidad para empresas, instituciones y fuerzas de seguridad de todo el NOA. Precisión de máquina, criterio de sastre.</p>
    <div class="hero-actions">
      <a href="#contacto" class="btn btn-primary">Solicitar presupuesto</a>
      <a href="#galeria" class="btn btn-ghost-dark">Ver trabajos</a>
    </div>
    <p class="hero-reassurance">Sin cargo, sin compromiso — respondemos por WhatsApp o email.</p>
  </div>
  <div class="wrap hero-stats">
    <div><b class="counter" data-target="15" data-suffix=" años">0</b><span>De trayectoria en Salta</span></div>
    <div><b class="counter" data-target="10000" data-suffix="+">0</b><span>Prendas bordadas por año</span></div>
    <div><b class="counter" data-target="300" data-suffix="+">0</b><span>Empresas atendidas</span></div>
    <div><b>48–72h</b><span>Entrega en pedidos estándar</span></div>
  </div>
</section>

<div class="marquee" aria-hidden="true">
  <div class="marquee-track">
    <span>Bordados para empresas</span><span>Uniformes</span><span>Parches y escudos</span><span>Bordados policiales</span><span>Gorras</span><span>Remeras</span><span>Buzos</span><span>Guardapolvos</span><span>Bordados institucionales</span>
    <span>Bordados para empresas</span><span>Uniformes</span><span>Parches y escudos</span><span>Bordados policiales</span><span>Gorras</span><span>Remeras</span><span>Buzos</span><span>Guardapolvos</span><span>Bordados institucionales</span>
  </div>
</div>

<!-- ============ SERVICIOS ============ -->
<section id="servicios" class="light-on-dark">
  <div class="wrap">
    <div class="section-head reveal">
      <p class="eyebrow">Servicios</p>
      <h2>Cada uniforme representa tu empresa.</h2>
      <svg class="stitch dark" viewBox="0 0 200 10" preserveAspectRatio="none"><path d="M0 5 L200 5"/></svg>
      <p>Un bordado para cada rubro, con página propia, precios de referencia y FAQ.</p>
    </div>
    <div class="services-grid">
      <a href="bordados-en-salta.html" class="service-card reveal">
        <p class="tag">Página pilar</p><h3>Bordados en Salta</h3>
        <p>Todo lo que hacemos, en un solo lugar.</p><span class="go">Ver más</span>
      </a>
      <a href="bordados-policiales-salta.html" class="service-card reveal">
        <p class="tag">Fuerzas de seguridad</p><h3>Escudos y bordados policiales</h3>
        <p>Distintivos con terminación reglamentaria.</p><span class="go">Ver servicio</span>
      </a>
      <a href="parches-con-velcro-salta.html" class="service-card reveal">
        <p class="tag">Parches</p><h3>Parches bordados y con velcro</h3>
        <p>Para uniformes intercambiables y mochilas.</p><span class="go">Ver servicio</span>
      </a>
      <a href="bordados-de-gorras-salta.html" class="service-card reveal">
        <p class="tag">Merchandising</p><h3>Gorras y remeras</h3>
        <p>Bordado 3D en gorras, logos en remeras y buzos.</p><span class="go">Ver servicio</span>
      </a>
      <a href="escudos-bordados-salta.html" class="service-card reveal">
        <p class="tag">Instituciones</p><h3>Colegios, clubes e iglesias</h3>
        <p>Escudos y guardapolvos para todo el ciclo lectivo.</p><span class="go">Ver servicio</span>
      </a>
      <a href="bordados-empresariales-salta.html" class="service-card reveal">
        <p class="tag">Rubros específicos</p><h3>Uniformes por rubro</h3>
        <p>A la medida de cada actividad y cada tela.</p><span class="go">Ver servicio</span>
      </a>
    </div>
    <p class="pill-label reveal">También bordamos para:</p>
    <div class="pill-row reveal">
      <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20tengo%20una%20empresa%20y%20quiero%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Empresas</a>
      <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20somos%20una%20fuerza%20de%20seguridad%20y%20queremos%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Policía</a>
      <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20soy%20docente%20y%20quiero%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Docentes</a>
      <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20somos%20un%20club%20y%20queremos%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Clubes</a>
      <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20somos%20un%20hospital%20y%20queremos%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Hospitales</a>
      <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20tengo%20un%20local%20gastron%C3%B3mico%20y%20quiero%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Gastronomía</a>
      <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20somos%20una%20iglesia%20y%20queremos%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Iglesias</a>
      <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20somos%20una%20empresa%20de%20seguridad%20privada%20y%20queremos%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Seguridad privada</a>
      <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20tengo%20un%20hotel%20y%20quiero%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Hoteles</a>
      <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20tengo%20una%20industria%20y%20quiero%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Industrias</a>
      <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20tengo%20una%20constructora%20y%20quiero%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Constructoras</a>
    </div>
  </div>
</section>

<div class="mini-cta reveal">
  <p>Tu uniforme habla antes que vos.</p>
  <a href="#contacto" class="btn btn-primary">Solicitar presupuesto</a>
</div>


<!-- ============ PORTAFOLIO ============ -->
<section id="galeria" class="light-on-dark">
  <div class="wrap">
    <div class="section-head reveal">
      <p class="eyebrow">Portafolio</p>
      <h2>Trabajos reales, en primera persona.</h2>
      <svg class="stitch dark" viewBox="0 0 200 10" preserveAspectRatio="none"><path d="M0 5 L200 5"/></svg>
      <p>Cada tarjeta es un trabajo entregado. Hacé clic para ver el detalle y las fotos completas.</p>
      <p class="portfolio-trust" id="portfolioTrust" aria-hidden="true"></p>
    </div>
    <div class="filters reveal" id="portfolioFilters"></div>
    <div class="portfolio-grid reveal" id="portfolioGrid"></div>
    <div class="portfolio-loadmore-wrap">
      <button class="btn btn-ghost-dark" id="portfolioLoadMore" hidden>Ver más trabajos</button>
    </div>
  </div>
</section>

<!-- ============ POR QUÉ ELEGIRNOS ============ -->
<section id="nosotros">
  <div class="wrap">
    <div class="section-head reveal">
      <p class="eyebrow">Por qué PuntaTex</p>
      <h2>Una marca fuerte merece un bordado de calidad.</h2>
      <svg class="stitch" viewBox="0 0 200 10" preserveAspectRatio="none"><path d="M0 5 L200 5"/></svg>
    </div>
    <div class="chip-grid reveal">
      <div class="chip"><h3>Multi-cabezal</h3><p>Máquinas de última generación.</p></div>
      <div class="chip"><h3>Miles de diseños</h3><p>Digitalización propia, a medida.</p></div>
      <div class="chip"><h3>Entrega rápida</h3><p>48–72h en pedidos estándar.</p></div>
      <div class="chip"><h3>Hilo premium</h3><p>Resiste lavado y sol.</p></div>
      <div class="chip"><h3>Asesoramiento</h3><p>Te guiamos antes de producir.</p></div>
      <div class="chip"><h3>Alta definición</h3><p>El detalle fino no se pierde.</p></div>
    </div>
  </div>
</section>

<!-- ============ CASOS DE ÉXITO ============ -->
<section id="casos" class="light-on-dark">
  <div class="wrap">
    <div class="section-head reveal">
      <p class="eyebrow">Casos de éxito</p>
      <h2>No vendemos bordados. Creamos identidad.</h2>
      <svg class="stitch dark" viewBox="0 0 200 10" preserveAspectRatio="none"><path d="M0 5 L200 5"/></svg>
    </div>
    <div class="case-grid reveal">
      <div class="case-card">
        <div class="case-photo"></div>
        <p class="tag">Gastronomía</p>
        <h3>Uniformar 30 empleados en una semana</h3>
        <p class="case-line"><b>Problema:</b> apertura de local nueva sin tiempo de sobra.</p>
        <p class="case-line"><b>Solución:</b> producción prioritaria en máquinas multi-cabezal.</p>
        <p class="case-line"><b>Resultado:</b> 30 cofias y delantales listos en 4 días.</p>
      </div>
      <div class="case-card">
        <div class="case-photo"></div>
        <p class="tag">Seguridad</p>
        <h3>Escudos con normativa exacta</h3>
        <p class="case-line"><b>Problema:</b> distintivo rechazado por no cumplir medidas.</p>
        <p class="case-line"><b>Solución:</b> digitalización ajustada a la normativa institucional.</p>
        <p class="case-line"><b>Resultado:</b> aprobación en la primera muestra.</p>
      </div>
      <div class="case-card">
        <div class="case-photo"></div>
        <p class="tag">Educación</p>
        <h3>Guardapolvos que duran todo el ciclo</h3>
        <p class="case-line"><b>Problema:</b> el escudo anterior se despegaba al lavarlo.</p>
        <p class="case-line"><b>Solución:</b> bordado directo con hilo de alta resistencia.</p>
        <p class="case-line"><b>Resultado:</b> intacto después de un año de uso semanal.</p>
      </div>
    </div>
  </div>
</section>

<!-- ============ CLIENTES ============ -->
<section>
  <div class="wrap">
    <div class="section-head reveal">
      <p class="eyebrow">Empresas que confiaron en nosotros</p>
      <h2>Municipios, clubes y empresas de Salta.</h2>
      <svg class="stitch" viewBox="0 0 200 10" preserveAspectRatio="none"><path d="M0 5 L200 5"/></svg>
    </div>
    <div class="clients-grid reveal">
      <div class="client-logo">Municipio</div>
      <div class="client-logo">Club</div>
      <div class="client-logo">Empresa</div>
      <div class="client-logo">Policía</div>
      <div class="client-logo">Escuela</div>
      <div class="client-logo">Hotel</div>
      <div class="client-logo">Restaurante</div>
    </div>
  </div>
</section>

<div class="mini-cta reveal">
  <p>Cada uniforme representa tu empresa.</p>
  <a href="#contacto" class="btn btn-primary">Solicitar presupuesto</a>
</div>

<!-- ============ PROCESO ============ -->
<section class="light-on-dark">
  <div class="wrap">
    <div class="section-head reveal">
      <p class="eyebrow">Cómo trabajamos</p>
      <h2>De tu logo a la prenda terminada, en cinco pasos.</h2>
      <svg class="stitch dark" viewBox="0 0 200 10" preserveAspectRatio="none"><path d="M0 5 L200 5"/></svg>
    </div>
    <div class="process">
      <div class="process-step reveal"><div class="dot">01</div><h3>Envíanos tu logo</h3><p>Por WhatsApp o el formulario.</p></div>
      <div class="process-step reveal"><div class="dot">02</div><h3>Digitalizamos el diseño</h3><p>Ajustado a la tela y la prenda.</p></div>
      <div class="process-step reveal"><div class="dot">03</div><h3>Realizamos una muestra</h3><p>Aprobás antes de producir.</p></div>
      <div class="process-step reveal"><div class="dot">04</div><h3>Producción</h3><p>Multi-cabezal, control de calidad.</p></div>
      <div class="process-step reveal"><div class="dot">05</div><h3>Entrega</h3><p>Taller propio o envío al NOA.</p></div>
    </div>
  </div>
</section>

<!-- ============ OPINIONES ============ -->
<section id="opiniones">
  <div class="wrap">
    <div class="section-head reveal">
      <p class="eyebrow">Opiniones</p>
      <h2>Lo que dicen quienes ya nos eligieron.</h2>
      <svg class="stitch" viewBox="0 0 200 10" preserveAspectRatio="none"><path d="M0 5 L200 5"/></svg>
    </div>
    <div class="testi-carousel reveal">
      <div class="testi-track" id="testiTrack">
        <div class="testi-card">
          <div class="stars">★★★★★</div>
          <p>Bordaron los uniformes de todo el local en tiempo récord y quedaron impecables.</p>
          <div class="testi-who"><div class="testi-avatar">M</div><div><b>María F.</b><span>Gastronomía, Salta Capital</span></div></div>
        </div>
        <div class="testi-card">
          <div class="stars">★★★★★</div>
          <p>Nos asesoraron en cada detalle antes de producir. Resultado prolijo y consistente.</p>
          <div class="testi-who"><div class="testi-avatar">J</div><div><b>Javier R.</b><span>Institución de seguridad</span></div></div>
        </div>
        <div class="testi-card">
          <div class="stars">★★★★★</div>
          <p>Un año de lavado semanal después, el bordado sigue intacto.</p>
          <div class="testi-who"><div class="testi-avatar">C</div><div><b>Colegio San Cayetano</b><span>Institución educativa</span></div></div>
        </div>
      </div>
      <div class="testi-dots" id="testiDots"></div>
    </div>
  </div>
</section>

<!-- ============ FAQ ============ -->
<section id="faq" class="light-on-dark">
  <div class="wrap">
    <div class="section-head reveal">
      <p class="eyebrow">Preguntas frecuentes</p>
      <h2>Lo que más nos preguntan antes de pedir un presupuesto.</h2>
      <svg class="stitch dark" viewBox="0 0 200 10" preserveAspectRatio="none"><path d="M0 5 L200 5"/></svg>
      <p>5 de las más de 60 que respondemos en la página de FAQ.</p>
    </div>
    <div class="faq-list reveal">
      <details><summary>¿Cuánto cuesta bordar una gorra en Salta?</summary><p>Depende de puntadas, colores y cantidad. Probá la <a href="#contacto">calculadora estimativa</a> o <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20quiero%20saber%20cu%C3%A1nto%20cuesta%20bordar%20una%20gorra" target="_blank" rel="noopener">escribinos por WhatsApp</a> para el valor exacto.</p></details>
      <details><summary>¿Cuál es la cantidad mínima de pedido?</summary><p>Trabajamos pedidos unitarios y producciones grandes, según el tipo de prenda.</p></details>
      <details><summary>¿Cuánto tardan en entregar un pedido?</summary><p>48 a 72 horas hábiles desde que aprobás la muestra.</p></details>
      <details><summary>¿Envían a otras provincias además de Salta?</summary><p>Sí, a Jujuy, Tucumán, Catamarca y el resto del NOA.</p></details>
      <details><summary>¿Qué diferencia hay entre bordado y estampado?</summary><p>El bordado resiste más el lavado; el estampado conviene con muchos colores. Ver <a href="bordado-vs-estampado.html">la comparación completa</a>.</p></details>
    </div>
  </div>
</section>

<!-- ============ CONTACTO / CALCULADORA ============ -->
<section class="cta-band" id="contacto">
  <div class="wrap">
    <p class="eyebrow" style="justify-content:center;">Empecemos</p>
    <h2>¿Bordamos tu historia?</h2>
    <p>Cada puntada cuenta tu historia. Contanos qué necesitás y te respondemos con presupuesto de referencia el mismo día.</p>

    <div class="calc reveal">
      <div class="calc-row">
        <label>Prenda<select id="calcPrenda"><option value="gorra">Gorra</option><option value="remera">Remera</option><option value="buzo">Buzo</option><option value="campera">Campera</option></select></label>
        <label>Cantidad<select id="calcCantidad"><option value="1">1 a 9</option><option value="10">10 a 49</option><option value="50">50 a 199</option><option value="200">200+</option></select></label>
      </div>
      <p id="calcResult" class="calc-result">Elegí prenda y cantidad para ver un rango estimado.</p>
      <a id="calcCta" href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20quiero%20pedir%20un%20presupuesto%20de%20bordado" class="btn btn-primary" target="_blank" rel="noopener">Pedir presupuesto exacto</a>
    </div>

    <div class="cta-actions">
      <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20quiero%20enviar%20mi%20logo%20para%20un%20presupuesto" class="btn btn-ghost-dark" target="_blank" rel="noopener">Enviar mi logo por WhatsApp</a>
      <a href="mailto:contacto@puntatex.com" class="btn btn-ghost-dark">Enviar por email</a>
    </div>
  </div>
</section>

<section id="formulario">
  <div class="wrap">
    <div class="section-head reveal">
      <p class="eyebrow">Formulario</p>
      <h2>O contanos el detalle acá.</h2>
      <svg class="stitch" viewBox="0 0 200 10" preserveAspectRatio="none"><path d="M0 5 L200 5"/></svg>
      <p>Te respondemos por correo o WhatsApp con el presupuesto.</p>
    </div>
    <form class="contact-form reveal" id="contactForm" action="https://formsubmit.co/contacto@puntatex.com" method="POST" enctype="multipart/form-data">
      <input type="hidden" name="_subject" value="Nueva consulta desde la web — PuntaTex Salta">
      <input type="hidden" name="_template" value="table">
      <input type="hidden" name="_captcha" value="false">
      <div class="form-grid">
        <label>Nombre<input type="text" name="Nombre" required></label>
        <label>Teléfono<input type="tel" name="Teléfono" required></label>
      </div>
      <label class="form-full">Correo<input type="email" name="Correo" required></label>
      <label class="form-full">Mensaje<textarea name="Mensaje" rows="3" placeholder="Contanos qué necesitás bordar"></textarea></label>
      <details class="form-more">
        <summary>+ Agregar detalles del pedido <span>(opcional, pero ayuda a cotizar más rápido)</span></summary>
        <div class="form-grid" style="margin-top:16px;">
          <label>Empresa<input type="text" name="Empresa"></label>
          <label>Cantidad<input type="text" name="Cantidad" placeholder="Ej: 20 unidades"></label>
        </div>
        <label class="form-full">Tipo de prenda<input type="text" name="Tipo de prenda" placeholder="Ej: remeras, gorras, guardapolvos"></label>
        <label class="form-full">Adjuntar logo<input type="file" name="Logo adjunto" accept="image/*,.pdf"></label>
      </details>
      <button type="submit" class="btn btn-primary" id="contactSubmit">Enviar consulta</button>
      <p class="form-note">Sin cargo, sin compromiso. ¿Preferís algo más directo? <a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20quiero%20pedir%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Escribinos por WhatsApp</a>.</p>
    </form>
  </div>
</section>

<section id="mapa" class="light-on-dark">
  <div class="wrap">
    <div class="section-head reveal">
      <p class="eyebrow">Cómo llegar</p>
      <h2>Nuestro taller en Salta.</h2>
      <svg class="stitch dark" viewBox="0 0 200 10" preserveAspectRatio="none"><path d="M0 5 L200 5"/></svg>
      <p>Barrio San Benjamín, Mz U, Lote 2 — Salta Capital (CP 4400).</p>
    </div>
    <div class="map-embed reveal">
      <iframe src="https://www.google.com/maps?q=Barrio+San+Benjamin+Mz+U+Lote+2,+Salta,+Argentina,+CP+4400&output=embed" width="100%" height="380" style="border:0;" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade" title="Ubicación de PuntaTex Salta"></iframe>
    </div>
  </div>
</section>


<footer>
  <div class="wrap">
    <div class="footer-grid">
      <div class="footer-brand">
        <img src="assets/logo-512.webp" alt="PuntaTex Salta — Cada puntada cuenta tu historia" width="160" height="160" loading="lazy" style="margin-bottom:16px; border-radius:8px;">
        <p>Transformamos prendas en identidad. Bordado computarizado de alta precisión para empresas, instituciones y particulares en Salta y el NOA.</p>
      </div>
      <div>
        <h4>Servicios</h4>
        <ul>
          <li><a href="bordados-en-salta.html">Bordados en Salta</a></li>
          <li><a href="bordados-policiales-salta.html">Bordados policiales</a></li>
          <li><a href="parches-con-velcro-salta.html">Parches bordados</a></li>
          <li><a href="bordados-de-gorras-salta.html">Bordados para gorras</a></li>
          <li><a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20quiero%20un%20presupuesto%20de%20bordados%20institucionales" target="_blank" rel="noopener">Bordados institucionales</a></li>
        </ul>
      </div>
      <div>
        <h4>Recursos</h4>
        <ul>
          <li><a href="tecnologia-del-bordado.html">Tecnología del bordado</a></li>
          <li><a href="bordado-vs-estampado.html">Bordado vs. estampado</a></li>
          <li><a href="#faq">Preguntas frecuentes</a></li>
        </ul>
      </div>
      <div>
        <h4>Zonas</h4>
        <ul>
          <li><a href="zonas/salta-capital.html">Salta Capital</a></li>
          <li><a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20escribo%20desde%20San%20Lorenzo%2C%20quiero%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">San Lorenzo</a></li>
          <li><a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20escribo%20desde%20Cerrillos%2C%20quiero%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Cerrillos</a></li>
          <li><a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20escribo%20desde%20Jujuy%2C%20quiero%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Jujuy</a></li>
          <li><a href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20escribo%20desde%20Tucum%C3%A1n%2C%20quiero%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener">Tucumán</a></li>
        </ul>
      </div>
      <div>
        <h4>Contacto</h4>
        <ul>
          <li>Barrio San Benjamín, Mz U, Lote 2</li>
          <li>Salta Capital, CP 4400</li>
          <li><a href="https://wa.me/549XXXXXXXXXX">WhatsApp</a></li>
          <li><a href="mailto:contacto@puntatex.com">contacto@puntatex.com</a></li>
          <li><a href="#">Instagram</a></li>
        </ul>
      </div>
    </div>
    <div class="footer-bottom">
      <span>© 2026 PuntaTex Salta. Todos los derechos reservados.</span>
      <span>Salta, Argentina</span>
    </div>
  </div>
</footer>

<a class="float-wa" href="https://wa.me/549XXXXXXXXXX?text=Hola%2C%20quiero%20pedir%20un%20presupuesto%20de%20bordado" target="_blank" rel="noopener" aria-label="Escribinos por WhatsApp">
  <svg viewBox="0 0 32 32"><path d="M16 2C8.3 2 2 8.3 2 16c0 2.8.8 5.4 2.2 7.6L2 30l6.6-2.1C10.7 29.2 13.3 30 16 30c7.7 0 14-6.3 14-14S23.7 2 16 2zm0 25.5c-2.4 0-4.7-.7-6.6-1.9l-.5-.3-4 1.3 1.3-3.9-.3-.5C4.6 20.4 3.9 18.2 3.9 16 3.9 9.3 9.3 3.9 16 3.9S28.1 9.3 28.1 16 22.7 27.5 16 27.5zm7-8.7c-.4-.2-2.3-1.1-2.6-1.3-.4-.1-.6-.2-.9.2-.3.4-1 1.3-1.2 1.5-.2.3-.4.3-.8.1-.4-.2-1.6-.6-3.1-1.9-1.1-1-1.9-2.3-2.2-2.6-.2-.4 0-.6.2-.8.2-.2.4-.4.5-.6.2-.2.2-.4.4-.6.1-.3 0-.5 0-.7-.1-.2-.9-2.2-1.3-3-.3-.8-.7-.7-.9-.7h-.8c-.3 0-.7.1-1.1.5-.4.4-1.4 1.4-1.4 3.3s1.5 3.8 1.7 4.1c.2.3 2.9 4.5 7.1 6.2 1 .4 1.8.7 2.4.9 1 .3 1.9.3 2.6.2.8-.1 2.3-1 2.7-1.9.3-.9.3-1.7.2-1.9-.1-.2-.4-.3-.8-.5z"/></svg>
</a>

<script>
  const header = document.getElementById('siteHeader');
  window.addEventListener('scroll', () => {
    header.classList.toggle('solid', window.scrollY > 64);
  }, {passive:true});

  // Resaltar en el menú la sección visible actual
  const navLinks = document.querySelectorAll('nav.primary a[href^="#"]');
  const navSections = [...navLinks].map(a => document.querySelector(a.getAttribute('href'))).filter(Boolean);
  if(navSections.length){
    const navIO = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if(entry.isIntersecting){
          const id = '#' + entry.target.id;
          navLinks.forEach(a => a.classList.toggle('active', a.getAttribute('href') === id));
        }
      });
    }, {rootMargin:'-45% 0px -50% 0px'});
    navSections.forEach(s => navIO.observe(s));
  }

  // Trampa de foco reutilizable para modales (hoy la usa el menú móvil)
  function createFocusTrap(container){
    function getFocusable(){
      return [...container.querySelectorAll('a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])')]
        .filter(el => el.offsetParent !== null);
    }
    function handleKeydown(e){
      if(e.key !== 'Tab') return;
      const focusable = getFocusable();
      if(!focusable.length) return;
      const first = focusable[0], last = focusable[focusable.length - 1];
      if(e.shiftKey && document.activeElement === first){ e.preventDefault(); last.focus(); }
      else if(!e.shiftKey && document.activeElement === last){ e.preventDefault(); first.focus(); }
    }
    return {
      activate(){ container.addEventListener('keydown', handleKeydown); },
      deactivate(){ container.removeEventListener('keydown', handleKeydown); }
    };
  }

  // Menú móvil
  const menuToggle = document.getElementById('menuToggle');
  const menuClose = document.getElementById('menuClose');
  const mobileNav = document.getElementById('mobileNav');
  const navScrim = document.getElementById('navScrim');
  const mobileNavTrap = createFocusTrap(mobileNav);
  function openMobileNav(){
    mobileNav.classList.add('open'); navScrim.classList.add('open');
    mobileNav.setAttribute('aria-hidden','false');
    menuToggle.setAttribute('aria-expanded','true');
    document.body.style.overflow = 'hidden';
    menuClose.focus();
    mobileNavTrap.activate();
  }
  function closeMobileNav(){
    mobileNav.classList.remove('open'); navScrim.classList.remove('open');
    mobileNav.setAttribute('aria-hidden','true');
    menuToggle.setAttribute('aria-expanded','false');
    document.body.style.overflow = '';
    menuToggle.focus();
    mobileNavTrap.deactivate();
  }
  menuToggle.addEventListener('click', openMobileNav);
  menuClose.addEventListener('click', closeMobileNav);
  navScrim.addEventListener('click', closeMobileNav);
  mobileNav.querySelectorAll('a').forEach(a => a.addEventListener('click', closeMobileNav));
  document.addEventListener('keydown', (e) => { if(e.key === 'Escape' && mobileNav.classList.contains('open')) closeMobileNav(); });

  // Parallax suave del hero — throttled con rAF, se apaga con prefers-reduced-motion
  const heroField = document.querySelector('.hero-stitch-field');
  const heroVideoEl = document.querySelector('.hero-video');
  const prefersReduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
  if((heroField || heroVideoEl) && !prefersReduced){
    let parallaxTicking = false;
    window.addEventListener('scroll', () => {
      if(parallaxTicking) return;
      parallaxTicking = true;
      requestAnimationFrame(() => {
        const y = window.scrollY;
        if(y < window.innerHeight){
          if(heroField) heroField.style.transform = `translateY(${y * 0.12}px)`;
          if(heroVideoEl) heroVideoEl.style.transform = `translateY(${y * 0.04}px) scale(1.03)`;
        }
        parallaxTicking = false;
      });
    }, {passive:true});
  }

  const io = new IntersectionObserver((entries) => {
    entries.forEach(e => { if(e.isIntersecting) e.target.classList.add('in-view'); });
  }, {threshold:.2});
  document.querySelectorAll('.reveal').forEach(el => io.observe(el));

  // Contadores animados de hero-stats — para editar un número, cambiá solo data-target en el HTML.
  function formatNumber(n){ return n.toLocaleString('es-AR'); }
  function animateCounter(el){
    const target = parseInt(el.dataset.target, 10);
    const suffix = el.dataset.suffix || '';
    const duration = 1400;
    const start = performance.now();
    function tick(now){
      const progress = Math.min((now - start) / duration, 1);
      const eased = 1 - Math.pow(1 - progress, 3);
      el.textContent = formatNumber(Math.floor(eased * target)) + suffix;
      if(progress < 1) requestAnimationFrame(tick);
      else el.textContent = formatNumber(target) + suffix;
    }
    requestAnimationFrame(tick);
  }
  const counterIO = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      if(entry.isIntersecting){
        animateCounter(entry.target);
        counterIO.unobserve(entry.target);
      }
    });
  }, {threshold:.3});
  document.querySelectorAll('.counter').forEach(el => counterIO.observe(el));

  // Feedback de carga al enviar el formulario
  const contactForm = document.getElementById('contactForm');
  if(contactForm){
    contactForm.addEventListener('submit', () => {
      const btn = document.getElementById('contactSubmit');
      btn.classList.add('is-loading');
      btn.setAttribute('aria-disabled','true');
    });
  }

  // Carrusel de opiniones
  const testiTrack = document.getElementById('testiTrack');
  if(testiTrack){
    const slides = testiTrack.children;
    const dotsWrap = document.getElementById('testiDots');
    let testiIndex = 0, testiTimer;
    for(let i=0;i<slides.length;i++){
      const dot = document.createElement('button');
      if(i===0) dot.classList.add('active');
      dot.addEventListener('click', () => goToTesti(i));
      dotsWrap.appendChild(dot);
    }
    function goToTesti(i){
      testiIndex = i;
      testiTrack.style.transform = `translateX(-${i*100}%)`;
      [...dotsWrap.children].forEach((d,di) => d.classList.toggle('active', di===i));
    }
    function nextTesti(){ goToTesti((testiIndex+1) % slides.length); }
    function startTesti(){ testiTimer = setInterval(nextTesti, 6000); }
    startTesti();
    testiTrack.closest('.testi-carousel').addEventListener('mouseenter', () => clearInterval(testiTimer));
    testiTrack.closest('.testi-carousel').addEventListener('mouseleave', startTesti);
  }

  // ============ PORTAFOLIO ============
  // Los datos de cada trabajo viven en assets/portfolio-data.json, no acá.
  // Para agregar un trabajo nuevo: sumá un objeto a ese archivo (la herramienta
  // admin-generador.html genera el bloque listo para pegar, con WebP y alt automáticos).
  let PROJECTS = [];
  const BATCH_SIZE = 12;
  let visibleCount = BATCH_SIZE;

  const grid = document.getElementById('portfolioGrid');
  const filtersEl = document.getElementById('portfolioFilters');
  const loadMoreBtn = document.getElementById('portfolioLoadMore');
  let activeFilter = 'all';

  function renderFilters(){
    const cats = ['all', ...new Set(PROJECTS.flatMap(p => p.tags))];
    filtersEl.innerHTML = cats.map(c =>
      `<button class="filter-btn${c==='all'?' active':''}" data-f="${c}">${c==='all'?'Todos':c}</button>`
    ).join('');
    filtersEl.querySelectorAll('.filter-btn').forEach(btn => {
      btn.addEventListener('click', () => {
        if(btn.classList.contains('active')) return;
        activeFilter = btn.dataset.f;
        visibleCount = BATCH_SIZE;
        filtersEl.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active'));
        btn.classList.add('active');
        const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
        if(reduceMotion || !grid.children.length){ renderGrid(); return; }
        grid.classList.add('filtering');
        setTimeout(() => { renderGrid(); grid.classList.remove('filtering'); }, 220);
      });
    });
  }

  function currentFilteredList(){
    return activeFilter === 'all' ? PROJECTS : PROJECTS.filter(p => p.tags.includes(activeFilter));
  }

  function renderGrid(){
    const items = currentFilteredList();
    const visible = items.slice(0, visibleCount);
    grid.innerHTML = visible.map((p, i) => `
      <a class="p-card" href="${p.pageUrl || '#'}" style="--i:${i}" aria-label="Ver proyecto: ${p.title}">
        <div class="p-cover-wrap">
          <img src="${p.cover}" alt="${p.alt || p.title}" loading="lazy" onload="this.classList.add('loaded')">
          <span class="p-view-cta">Ver proyecto</span>
        </div>
        <span class="p-expand" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"/></svg></span>
        <div class="p-info">
          <p class="tag">${p.category}</p>
          <h3>${p.title}</h3>
          <p>${p.client}</p>
        </div>
      </a>
    `).join('');
    attachTilt();
    loadMoreBtn.hidden = items.length <= visibleCount;
  }

  loadMoreBtn.addEventListener('click', () => {
    visibleCount += BATCH_SIZE;
    renderGrid();
  });

  // Tilt 3D sutil en hover — solo con mouse, nunca en touch ni con reduced-motion
  const canTilt = window.matchMedia('(hover:hover) and (pointer:fine)').matches
    && !window.matchMedia('(prefers-reduced-motion: reduce)').matches;
  function attachTilt(){
    if(!canTilt) return;
    grid.querySelectorAll('.p-card').forEach(card => {
      let rect = null, rafId = null, pendingX = 0, pendingY = 0;
      card.addEventListener('mouseenter', () => { rect = card.getBoundingClientRect(); });
      card.addEventListener('mousemove', (e) => {
        if(!rect) rect = card.getBoundingClientRect();
        pendingX = (e.clientX - rect.left) / rect.width - 0.5;
        pendingY = (e.clientY - rect.top) / rect.height - 0.5;
        if(rafId) return;
        rafId = requestAnimationFrame(() => {
          card.style.transform = `translateY(-6px) rotateX(${(-pendingY*5).toFixed(2)}deg) rotateY(${(pendingX*5).toFixed(2)}deg)`;
          rafId = null;
        });
      });
      card.addEventListener('mouseleave', () => {
        if(rafId){ cancelAnimationFrame(rafId); rafId = null; }
        rect = null;
        card.style.transform = '';
      });
    });
  }

  fetch('assets/portfolio-data.json')
    .then(r => r.json())
    .then(data => {
      PROJECTS = data;
      renderFilters();
      renderGrid();
      const portfolioTrustEl = document.getElementById('portfolioTrust');
      if(portfolioTrustEl) portfolioTrustEl.textContent = `${PROJECTS.length} trabajos reales — no fotos de stock`;
    })
    .catch(() => {
      grid.innerHTML = '<p style="color:var(--mist); grid-column:1/-1;">No pudimos cargar el portafolio en este momento.</p>';
    });

  function currentFilteredList(){
    return activeFilter === 'all' ? PROJECTS : PROJECTS.filter(p => p.tags.includes(activeFilter));
  }

  // Calculadora estimativa — rangos de referencia, no precio final
  const RANGOS = {
    gorra:   {1:'2.500 – 3.500', 10:'2.000 – 2.800', 50:'1.700 – 2.400', 200:'1.400 – 2.000'},
    remera:  {1:'3.000 – 4.200', 10:'2.400 – 3.400', 50:'2.000 – 2.900', 200:'1.700 – 2.500'},
    buzo:    {1:'4.500 – 6.200', 10:'3.800 – 5.200', 50:'3.200 – 4.400', 200:'2.700 – 3.800'},
    campera: {1:'5.500 – 7.500', 10:'4.700 – 6.400', 50:'4.000 – 5.500', 200:'3.400 – 4.700'}
  };
  const calcPrenda = document.getElementById('calcPrenda');
  const calcCantidad = document.getElementById('calcCantidad');
  const calcResult = document.getElementById('calcResult');
  const calcCta = document.getElementById('calcCta');
  function updateCalc(){
    if(!calcPrenda) return;
    const prenda = calcPrenda.value, cant = calcCantidad.value;
    const rango = RANGOS[prenda][cant];
    const nombre = calcPrenda.options[calcPrenda.selectedIndex].text;
    calcResult.innerHTML = `Rango estimado por unidad: <b>$${rango}</b> — ${nombre.toLowerCase()}, referencia sin IVA. El precio final depende de tu diseño.`;
    calcCta.href = `https://wa.me/549XXXXXXXXXX?text=${encodeURIComponent(`Hola, quiero un presupuesto de bordado para ${nombre.toLowerCase()}, cantidad: ${calcCantidad.options[calcCantidad.selectedIndex].text}`)}`;
  }
  if(calcPrenda){ calcPrenda.addEventListener('change', updateCalc); calcCantidad.addEventListener('change', updateCalc); }

</script>
</body>
</html>
