+page.svelte 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030
  1. <svelte:head>
  2. <link rel="preconnect" href="https://fonts.googleapis.com">
  3. <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  4. <link href="https://fonts.googleapis.com/css2?family=Cinzel:wght@400;700;900&family=Montserrat:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400;1,500&display=swap" rel="stylesheet">
  5. <title>Inkdigena Tattoo Art Gallery Shop — Donde el arte ancestral cobra vida en tu piel</title>
  6. <meta name="description" content="Estudio de tatuajes y galería de arte en Costa Rica. Tatuajes personalizados, body piercing y arte original con influencia cultural costarricense y precolombina.">
  7. </svelte:head>
  8. <script>
  9. import { onMount } from 'svelte';
  10. let scrollY = $state(0);
  11. let activeSection = $state(0);
  12. let galleryEl = $state(null);
  13. let lightboxOpen = $state(false);
  14. let lightboxImg = $state('');
  15. let mobileMenuOpen = $state(false);
  16. let heroLoaded = $state(false);
  17. const sections = ['inicio', 'filosofia', 'servicios', 'galeria', 'contacto'];
  18. const services = [
  19. {
  20. num: "01",
  21. name: "Tatuajes Personalizados",
  22. description: "Diseño y ejecución de tatuajes en una amplia variedad de estilos: realismo en blanco y negro, color vibrante, lettering cursivo, estilo indígena-tribal y piezas de gran formato con un nivel de detalle excepcional.",
  23. img: "/gallery/2.jpg",
  24. color: "#D64B8A"
  25. },
  26. {
  27. num: "02",
  28. name: "Body Piercing",
  29. description: "Servicio profesional de perforaciones corporales realizadas con técnicas seguras e higiénicas en un ambiente artístico.",
  30. img: "/gallery/6.jpg",
  31. color: "#2A8C7A"
  32. },
  33. {
  34. num: "03",
  35. name: "Galería de Arte Original",
  36. description: "Exhibición y venta de pinturas originales en lienzo con estilos abstractos, vibrantes y temáticas culturales costarricenses que incluyen colibríes, orquídeas, jaguares y motivos precolombinos.",
  37. img: "/gallery/10.jpg",
  38. color: "#D4A044"
  39. },
  40. {
  41. num: "04",
  42. name: "Murales y Arte a Gran Escala",
  43. description: "Creación de murales artísticos de gran formato con diseños detallados que combinan elementos de la naturaleza, cultura indígena y arte contemporáneo.",
  44. img: "/gallery/14.jpg",
  45. color: "#E87C4F"
  46. },
  47. {
  48. num: "05",
  49. name: "Eventos de Arte",
  50. description: "Presencia activa en festivales y eventos artísticos como el Art Fest Costa Rica, donde se exhiben obras y se promueve el arte local.",
  51. img: "/gallery/13.jpg",
  52. color: "#9B7EC8"
  53. }
  54. ];
  55. const galleryImages = [
  56. { src: "/gallery/2.jpg", caption: "Águila y jaguar — estilo indígena" },
  57. { src: "/gallery/6.jpg", caption: "Búho floral — blanco y negro" },
  58. { src: "/gallery/10.jpg", caption: "Colibrí — pintura original" },
  59. { src: "/gallery/3.jpg", caption: "Orquídea a color" },
  60. { src: "/gallery/15.jpg", caption: "Orquídea precolombina" },
  61. { src: "/gallery/4.jpg", caption: "Libélula y flores abstractas" },
  62. { src: "/gallery/11.jpg", caption: "Perezoso tribal — pintura" },
  63. { src: "/gallery/5.jpg", caption: "Pulpo detallado" },
  64. { src: "/gallery/14.jpg", caption: "Mural artístico monumental" },
  65. { src: "/gallery/1.jpg", caption: "Lettering cursivo" },
  66. { src: "/gallery/13.jpg", caption: "Mujer mariposa — pintura" },
  67. { src: "/gallery/7.jpg", caption: "Arte geométrico abstracto" },
  68. { src: "/gallery/8.jpg", caption: "Diseño personalizado" },
  69. { src: "/gallery/9.jpg", caption: "Arte en tinta" },
  70. { src: "/gallery/12.jpg", caption: "Composición abstracta" },
  71. ];
  72. function openLightbox(src) {
  73. lightboxImg = src;
  74. lightboxOpen = true;
  75. }
  76. function closeLightbox() {
  77. lightboxOpen = false;
  78. lightboxImg = '';
  79. }
  80. function scrollGallery(dir) {
  81. if (!galleryEl) return;
  82. const card = galleryEl.querySelector('.filmstrip-card');
  83. if (!card) return;
  84. const w = card.offsetWidth + 16;
  85. galleryEl.scrollBy({ left: dir * w * 2, behavior: 'smooth' });
  86. }
  87. onMount(() => {
  88. heroLoaded = true;
  89. const handleScroll = () => { scrollY = window.scrollY; };
  90. window.addEventListener('scroll', handleScroll, { passive: true });
  91. const sectionEls = sections.map(id => document.getElementById(id));
  92. const observer = new IntersectionObserver((entries) => {
  93. entries.forEach(entry => {
  94. if (entry.isIntersecting) {
  95. const idx = sectionEls.indexOf(entry.target);
  96. if (idx !== -1) activeSection = idx;
  97. }
  98. });
  99. }, { threshold: 0.3 });
  100. sectionEls.forEach(el => { if (el) observer.observe(el); });
  101. const revealObserver = new IntersectionObserver((entries) => {
  102. entries.forEach(entry => {
  103. if (entry.isIntersecting) entry.target.classList.add('in-view');
  104. });
  105. }, { threshold: 0.08, rootMargin: '0px 0px -30px 0px' });
  106. document.querySelectorAll('.fade-up, .fade-left, .fade-right, .scale-in').forEach(el => revealObserver.observe(el));
  107. setTimeout(() => {
  108. document.querySelectorAll('.fade-up, .fade-left, .fade-right, .scale-in').forEach(el => revealObserver.observe(el));
  109. }, 200);
  110. return () => {
  111. window.removeEventListener('scroll', handleScroll);
  112. observer.disconnect();
  113. revealObserver.disconnect();
  114. };
  115. });
  116. </script>
  117. <!-- SIDE DOT NAVIGATION (desktop) -->
  118. <nav class="side-nav" aria-label="Secciones">
  119. {#each sections as sec, i}
  120. <a
  121. href="#{sec}"
  122. class="side-dot {activeSection === i ? 'active' : ''}"
  123. aria-label={sec}
  124. >
  125. <span class="dot-label">{sec === 'inicio' ? 'Inicio' : sec === 'filosofia' ? 'Filosofía' : sec === 'servicios' ? 'Servicios' : sec === 'galeria' ? 'Galería' : 'Contacto'}</span>
  126. </a>
  127. {/each}
  128. </nav>
  129. <!-- TOP BAR — minimal, appears on scroll -->
  130. <header class="top-bar {scrollY > 100 ? 'visible' : ''}">
  131. <a href="/" class="top-logo">
  132. <img src="/logo.png" alt="Inkdigena" class="h-8 sm:h-10 w-auto">
  133. </a>
  134. <div class="hidden md:flex items-center gap-8">
  135. <a href="#servicios" class="top-link">Servicios</a>
  136. <a href="#galeria" class="top-link">Galería</a>
  137. <a href="/about" class="top-link">Nosotros</a>
  138. <a href="https://wa.me/50662692083?text=Hola%2C%20vi%20su%20sitio%20web%20y%20me%20interesan%20sus%20servicios." target="_blank" rel="noopener noreferrer" class="top-cta">Reservar</a>
  139. </div>
  140. <button class="md:hidden w-10 h-10 flex items-center justify-center" onclick={() => mobileMenuOpen = !mobileMenuOpen} aria-label="Menú">
  141. <div class="hamburger">
  142. <span class="hline {mobileMenuOpen ? 'open' : ''}" style="--i:0"></span>
  143. <span class="hline {mobileMenuOpen ? 'open' : ''}" style="--i:1"></span>
  144. <span class="hline {mobileMenuOpen ? 'open' : ''}" style="--i:2"></span>
  145. </div>
  146. </button>
  147. </header>
  148. {#if mobileMenuOpen}
  149. <div class="mobile-overlay" role="dialog">
  150. <button class="absolute inset-0 bg-black/80" onclick={() => mobileMenuOpen = false} aria-label="Cerrar"></button>
  151. <div class="mobile-drawer">
  152. <a href="#inicio" class="drawer-link" onclick={() => mobileMenuOpen = false}>Inicio</a>
  153. <a href="#servicios" class="drawer-link" onclick={() => mobileMenuOpen = false}>Servicios</a>
  154. <a href="#galeria" class="drawer-link" onclick={() => mobileMenuOpen = false}>Galería</a>
  155. <a href="#contacto" class="drawer-link" onclick={() => mobileMenuOpen = false}>Contacto</a>
  156. <a href="/about" class="drawer-link" onclick={() => mobileMenuOpen = false}>Nosotros</a>
  157. <a href="https://wa.me/50662692083?text=Hola%2C%20vi%20su%20sitio%20web%20y%20me%20interesan%20sus%20servicios." target="_blank" rel="noopener noreferrer" class="drawer-cta" onclick={() => mobileMenuOpen = false}>
  158. Reservar Cita
  159. </a>
  160. </div>
  161. </div>
  162. {/if}
  163. <!-- ════════════════ HERO ════════════════ -->
  164. <section id="inicio" class="min-h-screen-ios relative flex flex-col items-center justify-center overflow-hidden">
  165. <video class="hidden sm:block absolute inset-0 w-full h-full object-cover" autoplay muted loop playsinline>
  166. <source src="/hero-bg.mp4" type="video/mp4">
  167. </video>
  168. <video class="sm:hidden absolute inset-0 w-full h-full object-cover" autoplay muted loop playsinline>
  169. <source src="/hero-bg-mobile-v2.mp4" type="video/mp4">
  170. </video>
  171. <div class="absolute inset-0 bg-black/60"></div>
  172. <div class="relative z-10 w-full max-w-[90rem] mx-auto px-5 sm:px-10 text-center mb-16 sm:mb-0">
  173. <!-- Logo -->
  174. <img src="/logo.png" alt="Inkdigena" class="hero-logo {heroLoaded ? 'loaded' : ''}" style="filter: drop-shadow(0 4px 40px rgba(0,0,0,0.7));">
  175. <h1 class="hero-title {heroLoaded ? 'loaded' : ''}">INKDIGENA</h1>
  176. <div class="hero-sub {heroLoaded ? 'loaded' : ''}">
  177. <p class="font-cinzel text-[10px] sm:text-xs tracking-[0.5em] uppercase text-white/50 mb-6">Tattoo &bull; Art Gallery &bull; Shop</p>
  178. <p class="font-mont italic text-lg sm:text-2xl md:text-3xl text-white/80 mb-10 px-4">
  179. Donde el arte ancestral cobra vida en tu piel
  180. </p>
  181. </div>
  182. <div class="hero-btns {heroLoaded ? 'loaded' : ''}">
  183. <a href="https://wa.me/50662692083?text=Hola%2C%20vi%20su%20sitio%20web%20y%20me%20interesan%20sus%20servicios." target="_blank" rel="noopener noreferrer" class="btn-gold">
  184. Agendar por WhatsApp
  185. </a>
  186. <a href="#galeria" class="btn-ghost">
  187. Ver Portfolio
  188. </a>
  189. </div>
  190. </div>
  191. <!-- Scroll cue -->
  192. <div class="absolute bottom-8 left-1/2 -translate-x-1/2 z-10 scroll-cue">
  193. <svg width="24" height="40" viewBox="0 0 24 40" fill="none" class="mx-auto mb-2 opacity-50">
  194. <rect x="1" y="1" width="22" height="38" rx="11" stroke="white" stroke-width="1.5"/>
  195. <circle cx="12" cy="12" r="3" fill="white" class="scroll-dot"/>
  196. </svg>
  197. </div>
  198. </section>
  199. <!-- ═══════ INK DRIP DIVIDER ═══════ -->
  200. <div class="ink-drip">
  201. <svg viewBox="0 0 1440 120" preserveAspectRatio="none" class="w-full h-[60px] sm:h-[80px]">
  202. <path d="M0,0 L1440,0 L1440,40 Q1380,38 1320,50 Q1260,62 1200,55 Q1140,48 1080,60 Q1020,72 960,58 Q900,44 840,56 Q780,68 720,80 Q660,92 600,70 Q540,48 480,62 Q420,76 360,60 Q300,44 240,55 Q180,66 120,50 Q60,34 0,45 Z" fill="#0a0a0a"/>
  203. </svg>
  204. </div>
  205. <!-- ════════════════ PHILOSOPHY ════════════════ -->
  206. <section id="filosofia" class="py-20 sm:py-32 bg-[#0a0a0a] relative overflow-hidden">
  207. <div class="max-w-6xl mx-auto px-5 sm:px-10 grid grid-cols-1 lg:grid-cols-2 gap-10 lg:gap-20 items-center">
  208. <div class="fade-left">
  209. <div class="relative">
  210. <img src="/gallery/11.jpg" alt="Arte tribal" class="w-full aspect-[3/4] object-cover" loading="lazy">
  211. <div class="absolute -bottom-4 -right-4 sm:-bottom-6 sm:-right-6 w-24 h-24 sm:w-32 sm:h-32 border-2 border-gold/30"></div>
  212. <div class="absolute -top-4 -left-4 sm:-top-6 sm:-left-6 w-24 h-24 sm:w-32 sm:h-32 border-2 border-magenta/20"></div>
  213. </div>
  214. </div>
  215. <div class="fade-right">
  216. <span class="font-cinzel text-gold text-[10px] tracking-[0.6em] uppercase block mb-6">Nuestra Filosofía</span>
  217. <blockquote class="font-cinzel text-2xl sm:text-4xl lg:text-5xl text-white/90 leading-[1.2] mb-8">
  218. "El arte no se crea — se despierta de las raíces que llevamos dentro"
  219. </blockquote>
  220. <div class="w-16 h-0.5 bg-gradient-to-r from-gold to-transparent mb-8"></div>
  221. <p class="font-mont text-white/50 text-base sm:text-lg leading-relaxed">
  222. Somos un espacio donde las raíces precolombinas, la riqueza de la naturaleza tropical y la expresión artística moderna convergen. Cada pieza que creamos lleva la memoria de nuestros ancestros y la energía del trópico.
  223. </p>
  224. </div>
  225. </div>
  226. </section>
  227. <!-- ════════════════ SERVICES — Editorial Numbered ════════════════ -->
  228. <section id="servicios" class="bg-[#0f0f0f] relative">
  229. <div class="py-14 sm:py-24 max-w-7xl mx-auto px-5 sm:px-10">
  230. <div class="text-center mb-16 sm:mb-24 fade-up">
  231. <span class="font-cinzel text-gold text-[10px] tracking-[0.6em] uppercase block mb-4">Lo Que Hacemos</span>
  232. <h2 class="font-cinzel text-4xl sm:text-6xl lg:text-7xl text-white tracking-wide">SERVICIOS</h2>
  233. </div>
  234. </div>
  235. <!-- Mobile: compact cards -->
  236. <div class="services-mobile">
  237. {#each services as svc, i}
  238. <div class="svc-card fade-up">
  239. <div class="svc-card-img">
  240. <img src={svc.img} alt={svc.name} loading="lazy">
  241. <span class="svc-card-num" style="color: {svc.color};">{svc.num}</span>
  242. </div>
  243. <div class="svc-card-body">
  244. <h3 class="font-cinzel text-base text-white tracking-wide mb-2">{svc.name}</h3>
  245. <div class="w-8 h-0.5 mb-2" style="background: {svc.color};"></div>
  246. <p class="font-mont text-white/50 text-xs leading-relaxed">{svc.description}</p>
  247. </div>
  248. </div>
  249. {/each}
  250. </div>
  251. <!-- Desktop: alternating editorial blocks -->
  252. {#each services as svc, i}
  253. <div class="service-block {i % 2 === 0 ? '' : 'reverse'}">
  254. <div class="service-img fade-up">
  255. <img src={svc.img} alt={svc.name} class="w-full h-full object-cover" loading="lazy">
  256. <div class="service-img-overlay" style="background: linear-gradient(135deg, {svc.color}22, transparent);"></div>
  257. </div>
  258. <div class="service-text fade-up">
  259. <span class="service-num" style="color: {svc.color};">{svc.num}</span>
  260. <h3 class="font-cinzel text-3xl lg:text-4xl text-white tracking-wide mb-6">{svc.name}</h3>
  261. <div class="w-12 h-0.5 mb-6" style="background: {svc.color};"></div>
  262. <p class="font-mont text-white/50 text-base lg:text-lg leading-relaxed max-w-lg">{svc.description}</p>
  263. </div>
  264. </div>
  265. {/each}
  266. </section>
  267. <!-- ═══════ INK DRIP DIVIDER ═══════ -->
  268. <div class="ink-drip-up">
  269. <svg viewBox="0 0 1440 120" preserveAspectRatio="none" class="w-full h-[60px] sm:h-[80px]">
  270. <path d="M0,120 L1440,120 L1440,80 Q1380,82 1320,70 Q1260,58 1200,65 Q1140,72 1080,60 Q1020,48 960,62 Q900,76 840,64 Q780,52 720,40 Q660,28 600,50 Q540,72 480,58 Q420,44 360,60 Q300,76 240,65 Q180,54 120,70 Q60,86 0,75 Z" fill="#0f0f0f"/>
  271. </svg>
  272. </div>
  273. <!-- ════════════════ GALLERY — Horizontal Filmstrip ════════════════ -->
  274. <section id="galeria" class="py-14 sm:py-24 bg-[#0a0a0a] relative overflow-hidden">
  275. <div class="max-w-7xl mx-auto px-5 sm:px-10 mb-10 sm:mb-16">
  276. <div class="flex flex-col sm:flex-row items-start sm:items-end justify-between gap-4 fade-up">
  277. <div>
  278. <span class="font-cinzel text-gold text-[10px] tracking-[0.6em] uppercase block mb-4">Portfolio</span>
  279. <h2 class="font-cinzel text-4xl sm:text-6xl lg:text-7xl text-white tracking-wide">GALERÍA</h2>
  280. </div>
  281. <div class="flex gap-3">
  282. <button onclick={() => scrollGallery(-1)} class="gallery-arrow" aria-label="Anterior">
  283. <svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M13 4L7 10L13 16" stroke="currentColor" stroke-width="1.5"/></svg>
  284. </button>
  285. <button onclick={() => scrollGallery(1)} class="gallery-arrow" aria-label="Siguiente">
  286. <svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M7 4L13 10L7 16" stroke="currentColor" stroke-width="1.5"/></svg>
  287. </button>
  288. </div>
  289. </div>
  290. </div>
  291. <!-- Filmstrip -->
  292. <div class="filmstrip" bind:this={galleryEl}>
  293. <div class="filmstrip-track">
  294. {#each galleryImages as img, i}
  295. <button class="filmstrip-card" onclick={() => openLightbox(img.src)}>
  296. <img src={img.src} alt={img.caption} class="filmstrip-img" loading="lazy">
  297. <div class="filmstrip-caption">
  298. <span class="font-cinzel text-gold text-[10px] tracking-[0.3em] uppercase">{String(i + 1).padStart(2, '0')}</span>
  299. <span class="font-mont text-white/80 text-xs sm:text-sm">{img.caption}</span>
  300. </div>
  301. </button>
  302. {/each}
  303. </div>
  304. </div>
  305. <div class="max-w-7xl mx-auto px-5 sm:px-10 mt-8 sm:mt-12 fade-up">
  306. <p class="font-mont italic text-white/30 text-sm">Desliza para explorar — toca para ampliar</p>
  307. </div>
  308. </section>
  309. <!-- LIGHTBOX -->
  310. {#if lightboxOpen}
  311. <div class="lightbox" role="dialog" aria-modal="true">
  312. <button class="absolute inset-0 z-0" onclick={closeLightbox} aria-label="Cerrar"></button>
  313. <button class="absolute top-6 right-6 z-20 text-white/60 hover:text-white text-3xl transition-colors" onclick={closeLightbox} aria-label="Cerrar">
  314. <svg width="28" height="28" viewBox="0 0 28 28" fill="none"><path d="M6 6L22 22M22 6L6 22" stroke="currentColor" stroke-width="1.5"/></svg>
  315. </button>
  316. <img src={lightboxImg} alt="Imagen ampliada" class="relative z-10 max-w-[92vw] max-h-[88vh] object-contain">
  317. </div>
  318. {/if}
  319. <!-- ════════════════ CONTACT ════════════════ -->
  320. <section id="contacto" class="py-20 sm:py-32 bg-[#0f0f0f] relative overflow-hidden">
  321. <!-- Decorative circle -->
  322. <div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px] sm:w-[800px] sm:h-[800px] rounded-full border border-white/[0.03] pointer-events-none"></div>
  323. <div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[400px] h-[400px] sm:w-[550px] sm:h-[550px] rounded-full border border-gold/[0.05] pointer-events-none"></div>
  324. <div class="relative z-10 max-w-3xl mx-auto px-5 sm:px-10 text-center">
  325. <div class="fade-up">
  326. <span class="font-cinzel text-gold text-[10px] tracking-[0.6em] uppercase block mb-6">Hablemos</span>
  327. <h2 class="font-cinzel text-4xl sm:text-6xl lg:text-7xl text-white tracking-wide mb-8">CONTACTO</h2>
  328. </div>
  329. <div class="grid grid-cols-1 sm:grid-cols-3 gap-6 sm:gap-4 mb-12 sm:mb-16">
  330. <div class="contact-pill fade-up">
  331. <span class="text-xl mb-2 block">📱</span>
  332. <span class="font-cinzel text-[10px] tracking-[0.3em] uppercase text-white/40 block mb-1">WhatsApp</span>
  333. <a href="https://wa.me/50662692083?text=Hola%2C%20vi%20su%20sitio%20web%20y%20me%20interesan%20sus%20servicios." target="_blank" rel="noopener noreferrer" class="font-mont text-gold hover:text-white transition-colors text-sm sm:text-base">
  334. +506 6269-2083
  335. </a>
  336. </div>
  337. <div class="contact-pill fade-up">
  338. <span class="text-xl mb-2 block">📞</span>
  339. <span class="font-cinzel text-[10px] tracking-[0.3em] uppercase text-white/40 block mb-1">Teléfono</span>
  340. <a href="tel:50662692083" class="font-mont text-gold hover:text-white transition-colors text-sm sm:text-base">
  341. +506 6269-2083
  342. </a>
  343. </div>
  344. <div class="contact-pill fade-up">
  345. <span class="text-xl mb-2 block">📍</span>
  346. <span class="font-cinzel text-[10px] tracking-[0.3em] uppercase text-white/40 block mb-1">Ubicación</span>
  347. <span class="font-mont text-white/70 text-sm sm:text-base">Costa Rica</span>
  348. </div>
  349. </div>
  350. <div class="flex items-center justify-center gap-5 mb-12 sm:mb-16 fade-up">
  351. <a href="https://www.instagram.com/inkdigenatattooshop/" target="_blank" rel="noopener noreferrer" class="social-icon" aria-label="Instagram">
  352. <svg viewBox="0 0 24 24" class="w-5 h-5" fill="currentColor"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"/></svg>
  353. </a>
  354. <a href="https://www.facebook.com/p/Inkdihena-tattoo-shop-100065620533979/" target="_blank" rel="noopener noreferrer" class="social-icon" aria-label="Facebook">
  355. <svg viewBox="0 0 24 24" class="w-5 h-5" fill="currentColor"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>
  356. </a>
  357. </div>
  358. <div class="fade-up">
  359. <a href="https://wa.me/50662692083?text=Hola%2C%20vi%20su%20sitio%20web%20y%20me%20interesan%20sus%20servicios." target="_blank" rel="noopener noreferrer" class="btn-gold inline-block">
  360. Reservar Mi Cita
  361. </a>
  362. </div>
  363. <div class="mt-12 sm:mt-16 fade-up">
  364. <div class="map-wrap">
  365. <iframe
  366. src="https://maps.google.com/maps?q=inkdigena+tattoo+art+gallery+shop&output=embed"
  367. width="100%"
  368. height="300"
  369. style="border:0"
  370. loading="lazy"
  371. title="Mapa de ubicación"
  372. ></iframe>
  373. </div>
  374. </div>
  375. </div>
  376. </section>
  377. <!-- ════════════════ FOOTER ════════════════ -->
  378. <footer class="bg-[#060606] py-10 sm:py-16 border-t border-white/[0.04]">
  379. <div class="max-w-7xl mx-auto px-5 sm:px-10">
  380. <!-- Mobile footer: centered, compact -->
  381. <div class="md:hidden flex flex-col items-center text-center">
  382. <img src="/logo.png" alt="Inkdigena" class="h-12 w-auto mb-2">
  383. <p class="font-cinzel text-white text-sm tracking-wide mb-1">INKDIGENA</p>
  384. <p class="font-mont italic text-white/25 text-xs mb-5">Donde el arte ancestral cobra vida en tu piel</p>
  385. <div class="flex flex-wrap items-center justify-center gap-x-4 gap-y-1 mb-5">
  386. <a href="#inicio" class="font-mont text-white/40 text-xs hover:text-white transition-colors">Inicio</a>
  387. <a href="#servicios" class="font-mont text-white/40 text-xs hover:text-white transition-colors">Servicios</a>
  388. <a href="#galeria" class="font-mont text-white/40 text-xs hover:text-white transition-colors">Galería</a>
  389. <a href="#contacto" class="font-mont text-white/40 text-xs hover:text-white transition-colors">Contacto</a>
  390. <a href="/about" class="font-mont text-white/40 text-xs hover:text-white transition-colors">Nosotros</a>
  391. </div>
  392. <a href="https://wa.me/50662692083" target="_blank" rel="noopener noreferrer" class="font-mont text-gold text-sm mb-1 hover:text-white transition-colors">+506 6269-2083</a>
  393. <span class="font-mont text-white/25 text-xs mb-4">Costa Rica</span>
  394. <div class="flex items-center gap-4 mb-6">
  395. <a href="https://www.instagram.com/inkdigenatattooshop/" target="_blank" rel="noopener noreferrer" class="social-icon-sm" aria-label="Instagram">
  396. <svg viewBox="0 0 24 24" class="w-4 h-4" fill="currentColor"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"/></svg>
  397. </a>
  398. <a href="https://www.facebook.com/p/Inkdihena-tattoo-shop-100065620533979/" target="_blank" rel="noopener noreferrer" class="social-icon-sm" aria-label="Facebook">
  399. <svg viewBox="0 0 24 24" class="w-4 h-4" fill="currentColor"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>
  400. </a>
  401. </div>
  402. <div class="w-full border-t border-white/[0.04] pt-5 flex flex-col items-center gap-2">
  403. <p class="font-mont text-white/20 text-[10px]">&copy; {new Date().getFullYear()} Inkdigena Tattoo Art Gallery Shop</p>
  404. <a href="https://digitalmar.dev" target="_blank" rel="noopener noreferrer" class="text-[10px] text-white/20 hover:text-white/40 transition-colors">Hecho por digitalmar.dev</a>
  405. </div>
  406. </div>
  407. <!-- Desktop footer: 3-column grid -->
  408. <div class="hidden md:grid grid-cols-3 gap-12 items-start">
  409. <div>
  410. <img src="/logo.png" alt="Inkdigena" class="h-14 w-auto mb-3">
  411. <p class="font-mont italic text-white/25 text-sm">Donde el arte ancestral cobra vida en tu piel</p>
  412. </div>
  413. <div class="flex flex-col gap-2">
  414. <span class="font-cinzel text-[10px] tracking-[0.4em] uppercase text-gold/50 mb-2">Explorar</span>
  415. <a href="#inicio" class="font-mont text-white/40 hover:text-white text-sm transition-colors">Inicio</a>
  416. <a href="#servicios" class="font-mont text-white/40 hover:text-white text-sm transition-colors">Servicios</a>
  417. <a href="#galeria" class="font-mont text-white/40 hover:text-white text-sm transition-colors">Galería</a>
  418. <a href="#contacto" class="font-mont text-white/40 hover:text-white text-sm transition-colors">Contacto</a>
  419. <a href="/about" class="font-mont text-white/40 hover:text-white text-sm transition-colors">Nosotros</a>
  420. </div>
  421. <div class="flex flex-col gap-2">
  422. <span class="font-cinzel text-[10px] tracking-[0.4em] uppercase text-gold/50 mb-2">Contacto</span>
  423. <a href="https://wa.me/50662692083" target="_blank" rel="noopener noreferrer" class="font-mont text-white/40 hover:text-gold text-sm transition-colors">WhatsApp: +506 6269-2083</a>
  424. <a href="tel:50662692083" class="font-mont text-white/40 hover:text-gold text-sm transition-colors">Tel: +506 6269-2083</a>
  425. <span class="font-mont text-white/30 text-sm">Costa Rica</span>
  426. <div class="flex items-center gap-3 mt-3">
  427. <a href="https://www.instagram.com/inkdigenatattooshop/" target="_blank" rel="noopener noreferrer" class="social-icon-sm" aria-label="Instagram">
  428. <svg viewBox="0 0 24 24" class="w-4 h-4" fill="currentColor"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"/></svg>
  429. </a>
  430. <a href="https://www.facebook.com/p/Inkdihena-tattoo-shop-100065620533979/" target="_blank" rel="noopener noreferrer" class="social-icon-sm" aria-label="Facebook">
  431. <svg viewBox="0 0 24 24" class="w-4 h-4" fill="currentColor"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>
  432. </a>
  433. </div>
  434. </div>
  435. </div>
  436. <div class="hidden md:flex mt-10 pt-8 border-t border-white/[0.04] items-center justify-between">
  437. <p class="font-mont text-white/20 text-xs">&copy; {new Date().getFullYear()} Inkdigena Tattoo Art Gallery Shop</p>
  438. <a href="https://digitalmar.dev" target="_blank" rel="noopener noreferrer" class="text-xs text-white/20 hover:text-white/40 transition-colors">Hecho por digitalmar.dev</a>
  439. </div>
  440. </div>
  441. </footer>
  442. <!-- FLOATING WHATSAPP -->
  443. <a
  444. href="https://wa.me/50662692083?text=Hola%2C%20vi%20su%20sitio%20web%20y%20me%20interesan%20sus%20servicios."
  445. target="_blank"
  446. rel="noopener noreferrer"
  447. class="wa-float"
  448. aria-label="Contactar por WhatsApp"
  449. >
  450. <svg viewBox="0 0 32 32" class="w-7 h-7" fill="white">
  451. <path d="M16.004 0h-.008C7.174 0 0 7.176 0 16.004c0 3.5 1.128 6.744 3.046 9.378L1.054 31.29l6.118-1.958A15.908 15.908 0 0016.004 32C24.826 32 32 24.826 32 16.004 32 7.176 24.826 0 16.004 0zm9.302 22.602c-.388 1.092-1.922 1.998-3.13 2.264-.826.178-1.904.32-5.534-1.19-4.644-1.932-7.628-6.636-7.862-6.942-.224-.306-1.886-2.512-1.886-4.79 0-2.278 1.194-3.4 1.618-3.864.388-.424.918-.602 1.224-.602.152 0 .286.008.408.014.424.018.636.042.916.71.35.834 1.204 2.936 1.31 3.15.108.214.214.504.068.796-.136.296-.254.48-.468.74-.214.258-.44.458-.654.74-.194.244-.414.506-.17.93.244.424 1.084 1.788 2.328 2.896 1.6 1.424 2.878 1.88 3.346 2.076.352.148.77.112 1.024-.148.32-.332.716-.882 1.118-1.424.286-.388.646-.436 1.032-.29.39.136 2.478 1.168 2.902 1.382.424.214.706.32.81.498.102.178.102 1.03-.286 2.122z"/>
  452. </svg>
  453. </a>
  454. <style>
  455. :global(html, body) { overflow-x: hidden; }
  456. :global(body) { background: #0a0a0a; }
  457. /* ── FONTS ── */
  458. .font-cinzel { font-family: 'Cinzel', serif; }
  459. .font-mont { font-family: 'Montserrat', sans-serif; }
  460. /* ── COLORS ── */
  461. .text-gold { color: #D4A044; }
  462. .border-gold\/30 { border-color: rgba(212,160,68,0.3); }
  463. .border-magenta\/20 { border-color: rgba(214,75,138,0.2); }
  464. /* ── SIDE DOT NAV ── */
  465. .side-nav {
  466. position: fixed;
  467. right: 24px;
  468. top: 50%;
  469. transform: translateY(-50%);
  470. z-index: 90;
  471. display: none;
  472. flex-direction: column;
  473. gap: 20px;
  474. }
  475. @media (min-width: 1024px) { .side-nav { display: flex; } }
  476. .side-dot {
  477. width: 12px;
  478. height: 12px;
  479. border-radius: 50%;
  480. border: 1.5px solid rgba(255,255,255,0.2);
  481. position: relative;
  482. transition: all 0.4s;
  483. background: transparent;
  484. }
  485. .side-dot.active {
  486. border-color: #D4A044;
  487. background: #D4A044;
  488. box-shadow: 0 0 12px rgba(212,160,68,0.4);
  489. }
  490. .side-dot:hover { border-color: rgba(255,255,255,0.5); }
  491. .dot-label {
  492. position: absolute;
  493. right: 24px;
  494. top: 50%;
  495. transform: translateY(-50%);
  496. font-family: 'Cinzel', serif;
  497. font-size: 10px;
  498. letter-spacing: 0.15em;
  499. text-transform: uppercase;
  500. color: white;
  501. white-space: nowrap;
  502. opacity: 0;
  503. pointer-events: none;
  504. transition: opacity 0.3s;
  505. }
  506. .side-dot:hover .dot-label { opacity: 0.6; }
  507. /* ── TOP BAR ── */
  508. .top-bar {
  509. position: fixed;
  510. top: 0;
  511. left: 0;
  512. right: 0;
  513. z-index: 80;
  514. height: 64px;
  515. display: flex;
  516. align-items: center;
  517. justify-content: space-between;
  518. padding: 0 20px;
  519. background: rgba(10,10,10,0.9);
  520. backdrop-filter: blur(20px);
  521. -webkit-backdrop-filter: blur(20px);
  522. border-bottom: 1px solid rgba(255,255,255,0.04);
  523. transform: translateY(-100%);
  524. transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1);
  525. }
  526. @media (min-width: 640px) { .top-bar { padding: 0 40px; } }
  527. .top-bar.visible { transform: translateY(0); }
  528. .top-link {
  529. font-family: 'Cinzel', serif;
  530. font-size: 11px;
  531. letter-spacing: 0.2em;
  532. text-transform: uppercase;
  533. color: rgba(255,255,255,0.5);
  534. transition: color 0.3s;
  535. }
  536. .top-link:hover { color: #D4A044; }
  537. .top-cta {
  538. font-family: 'Cinzel', serif;
  539. font-size: 11px;
  540. letter-spacing: 0.15em;
  541. text-transform: uppercase;
  542. color: #0a0a0a;
  543. background: #D4A044;
  544. padding: 8px 20px;
  545. transition: all 0.3s;
  546. }
  547. .top-cta:hover { background: #e8b654; transform: translateY(-1px); }
  548. /* ── HAMBURGER ── */
  549. .hamburger { width: 22px; height: 16px; position: relative; }
  550. .hline {
  551. display: block;
  552. position: absolute;
  553. left: 0;
  554. width: 100%;
  555. height: 1.5px;
  556. background: #D4A044;
  557. transition: all 0.35s;
  558. top: calc(var(--i) * 8px);
  559. }
  560. .hline.open:nth-child(1) { top: 8px; transform: rotate(45deg); }
  561. .hline.open:nth-child(2) { opacity: 0; }
  562. .hline.open:nth-child(3) { top: 8px; transform: rotate(-45deg); }
  563. /* ── MOBILE DRAWER ── */
  564. .mobile-overlay {
  565. position: fixed;
  566. inset: 0;
  567. z-index: 200;
  568. }
  569. .mobile-drawer {
  570. position: absolute;
  571. top: 0;
  572. right: 0;
  573. width: 280px;
  574. max-width: 80vw;
  575. height: 100%;
  576. background: #0f0f0f;
  577. border-left: 1px solid rgba(212,160,68,0.1);
  578. padding: 80px 32px 32px;
  579. display: flex;
  580. flex-direction: column;
  581. gap: 20px;
  582. z-index: 1;
  583. animation: drawerIn 0.35s cubic-bezier(0.16, 1, 0.3, 1);
  584. }
  585. @keyframes drawerIn {
  586. from { transform: translateX(100%); }
  587. to { transform: translateX(0); }
  588. }
  589. .drawer-link {
  590. font-family: 'Cinzel', serif;
  591. font-size: 18px;
  592. letter-spacing: 0.12em;
  593. text-transform: uppercase;
  594. color: rgba(255,255,255,0.7);
  595. transition: color 0.3s;
  596. }
  597. .drawer-link:hover { color: #D4A044; }
  598. .drawer-cta {
  599. margin-top: auto;
  600. font-family: 'Cinzel', serif;
  601. font-size: 14px;
  602. letter-spacing: 0.12em;
  603. text-transform: uppercase;
  604. text-align: center;
  605. padding: 14px;
  606. background: #D4A044;
  607. color: #0a0a0a;
  608. }
  609. /* ── HERO ── */
  610. .hero-logo {
  611. width: 180px;
  612. height: auto;
  613. margin: 0 auto 1.5rem;
  614. opacity: 0;
  615. transform: translateY(-20px);
  616. transition: all 1s cubic-bezier(0.16, 1, 0.3, 1);
  617. }
  618. @media (min-width: 640px) { .hero-logo { width: 240px; margin-bottom: 2rem; } }
  619. @media (min-width: 1024px) { .hero-logo { width: 280px; } }
  620. .hero-logo.loaded { opacity: 1; transform: translateY(0); }
  621. .hero-title {
  622. font-family: 'Cinzel', serif;
  623. font-weight: 900;
  624. font-size: clamp(2.5rem, 10vw, 7rem);
  625. letter-spacing: 0.12em;
  626. color: white;
  627. line-height: 1;
  628. margin-bottom: 0.75rem;
  629. opacity: 0;
  630. transform: translateY(15px);
  631. transition: all 0.9s cubic-bezier(0.16, 1, 0.3, 1) 0.3s;
  632. }
  633. .hero-title.loaded { opacity: 1; transform: translateY(0); }
  634. .hero-sub {
  635. opacity: 0;
  636. transform: translateY(20px);
  637. transition: all 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.5s;
  638. }
  639. .hero-sub.loaded { opacity: 1; transform: translateY(0); }
  640. .hero-btns {
  641. opacity: 0;
  642. transform: translateY(20px);
  643. transition: all 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.7s;
  644. display: flex;
  645. flex-direction: column;
  646. align-items: center;
  647. gap: 1rem;
  648. }
  649. @media (min-width: 640px) { .hero-btns { flex-direction: row; justify-content: center; } }
  650. .hero-btns.loaded { opacity: 1; transform: translateY(0); }
  651. /* ── BUTTONS ── */
  652. .btn-gold {
  653. font-family: 'Cinzel', serif;
  654. font-size: 13px;
  655. letter-spacing: 0.2em;
  656. text-transform: uppercase;
  657. padding: 16px 36px;
  658. background: linear-gradient(135deg, #D4A044, #E87C4F);
  659. color: #0a0a0a;
  660. transition: all 0.3s;
  661. display: inline-block;
  662. text-align: center;
  663. width: 100%;
  664. }
  665. @media (min-width: 640px) { .btn-gold { width: auto; } }
  666. .btn-gold:hover { transform: translateY(-2px); box-shadow: 0 8px 30px rgba(212,160,68,0.35); }
  667. .btn-ghost {
  668. font-family: 'Cinzel', serif;
  669. font-size: 13px;
  670. letter-spacing: 0.2em;
  671. text-transform: uppercase;
  672. padding: 16px 36px;
  673. border: 1px solid rgba(255,255,255,0.2);
  674. color: rgba(255,255,255,0.7);
  675. transition: all 0.3s;
  676. display: inline-block;
  677. text-align: center;
  678. width: 100%;
  679. }
  680. @media (min-width: 640px) { .btn-ghost { width: auto; } }
  681. .btn-ghost:hover { border-color: #D4A044; color: #D4A044; }
  682. /* ── SCROLL CUE ── */
  683. .scroll-cue { animation: cueFloat 2.5s ease-in-out infinite; }
  684. @keyframes cueFloat {
  685. 0%, 100% { transform: translateX(-50%) translateY(0); opacity: 0.5; }
  686. 50% { transform: translateX(-50%) translateY(8px); opacity: 1; }
  687. }
  688. .scroll-dot { animation: dotScroll 2s ease-in-out infinite; }
  689. @keyframes dotScroll {
  690. 0% { cy: 10; opacity: 1; }
  691. 100% { cy: 30; opacity: 0; }
  692. }
  693. /* ── INK DRIP DIVIDERS ── */
  694. .ink-drip { background: #0a0a0a; margin-top: -1px; }
  695. .ink-drip svg path { fill: #0a0a0a; }
  696. .ink-drip-up { background: #0a0a0a; margin-bottom: -1px; }
  697. .ink-drip-up svg path { fill: #0f0f0f; }
  698. /* ── SERVICE BLOCKS ── */
  699. /* ── MOBILE SERVICE CARDS ── */
  700. .services-mobile {
  701. display: flex;
  702. flex-direction: column;
  703. gap: 1rem;
  704. padding: 0 1.25rem 2rem;
  705. }
  706. @media (min-width: 768px) { .services-mobile { display: none; } }
  707. .svc-card {
  708. display: grid;
  709. grid-template-columns: 110px 1fr;
  710. gap: 0;
  711. background: rgba(255,255,255,0.02);
  712. border: 1px solid rgba(255,255,255,0.06);
  713. overflow: hidden;
  714. }
  715. .svc-card-img {
  716. position: relative;
  717. overflow: hidden;
  718. }
  719. .svc-card-img img {
  720. width: 100%;
  721. height: 100%;
  722. object-fit: cover;
  723. display: block;
  724. }
  725. .svc-card-num {
  726. position: absolute;
  727. bottom: 4px;
  728. left: 6px;
  729. font-family: 'Cinzel', serif;
  730. font-weight: 900;
  731. font-size: 1.5rem;
  732. line-height: 1;
  733. opacity: 0.3;
  734. }
  735. .svc-card-body {
  736. padding: 0.875rem 1rem;
  737. display: flex;
  738. flex-direction: column;
  739. justify-content: center;
  740. }
  741. /* ── DESKTOP SERVICE BLOCKS ── */
  742. .service-block {
  743. display: none;
  744. }
  745. @media (min-width: 768px) {
  746. .service-block {
  747. display: grid;
  748. grid-template-columns: 1fr 1fr;
  749. min-height: 70vh;
  750. }
  751. }
  752. @media (min-width: 768px) {
  753. .service-block.reverse .service-img { order: 2; }
  754. .service-block.reverse .service-text { order: 1; }
  755. }
  756. .service-img {
  757. position: relative;
  758. overflow: hidden;
  759. }
  760. .service-img img {
  761. transition: transform 8s cubic-bezier(0.16, 1, 0.3, 1);
  762. }
  763. .service-img:hover img { transform: scale(1.06); }
  764. .service-img-overlay {
  765. position: absolute;
  766. inset: 0;
  767. pointer-events: none;
  768. }
  769. .service-text {
  770. display: flex;
  771. flex-direction: column;
  772. justify-content: center;
  773. padding: 3rem 2.5rem;
  774. background: #0f0f0f;
  775. }
  776. @media (min-width: 1024px) { .service-text { padding: 4rem 4.5rem; } }
  777. .service-num {
  778. font-family: 'Cinzel', serif;
  779. font-weight: 900;
  780. font-size: clamp(3rem, 6vw, 6rem);
  781. line-height: 1;
  782. opacity: 0.15;
  783. margin-bottom: 0.5rem;
  784. }
  785. /* ── FILMSTRIP GALLERY ── */
  786. .filmstrip {
  787. overflow-x: auto;
  788. overflow-y: hidden;
  789. scroll-snap-type: x mandatory;
  790. -webkit-overflow-scrolling: touch;
  791. scrollbar-width: none;
  792. }
  793. .filmstrip::-webkit-scrollbar { display: none; }
  794. .filmstrip-track {
  795. display: flex;
  796. gap: 16px;
  797. padding: 0 20px;
  798. }
  799. @media (min-width: 640px) { .filmstrip-track { gap: 20px; padding: 0 40px; } }
  800. .filmstrip-card {
  801. scroll-snap-align: start;
  802. flex-shrink: 0;
  803. width: 260px;
  804. position: relative;
  805. cursor: pointer;
  806. border: none;
  807. padding: 0;
  808. background: none;
  809. text-align: left;
  810. }
  811. @media (min-width: 640px) { .filmstrip-card { width: 340px; } }
  812. @media (min-width: 1024px) { .filmstrip-card { width: 400px; } }
  813. .filmstrip-img {
  814. width: 100%;
  815. aspect-ratio: 3/4;
  816. object-fit: cover;
  817. display: block;
  818. transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
  819. }
  820. .filmstrip-card:hover .filmstrip-img { transform: scale(1.03); }
  821. .filmstrip-caption {
  822. padding: 12px 0;
  823. display: flex;
  824. align-items: center;
  825. gap: 12px;
  826. border-bottom: 1px solid rgba(255,255,255,0.06);
  827. }
  828. .gallery-arrow {
  829. width: 44px;
  830. height: 44px;
  831. border: 1px solid rgba(255,255,255,0.15);
  832. display: flex;
  833. align-items: center;
  834. justify-content: center;
  835. color: rgba(255,255,255,0.5);
  836. transition: all 0.3s;
  837. background: none;
  838. cursor: pointer;
  839. }
  840. .gallery-arrow:hover { border-color: #D4A044; color: #D4A044; }
  841. /* ── LIGHTBOX ── */
  842. .lightbox {
  843. position: fixed;
  844. inset: 0;
  845. z-index: 300;
  846. background: rgba(5,5,5,0.96);
  847. backdrop-filter: blur(8px);
  848. display: flex;
  849. align-items: center;
  850. justify-content: center;
  851. animation: lbIn 0.3s ease-out;
  852. }
  853. @keyframes lbIn {
  854. from { opacity: 0; }
  855. to { opacity: 1; }
  856. }
  857. /* ── CONTACT ── */
  858. .contact-pill {
  859. background: rgba(255,255,255,0.02);
  860. border: 1px solid rgba(255,255,255,0.06);
  861. padding: 1.5rem;
  862. text-align: center;
  863. transition: border-color 0.3s;
  864. }
  865. .contact-pill:hover { border-color: rgba(212,160,68,0.2); }
  866. .map-wrap {
  867. border: 1px solid rgba(255,255,255,0.06);
  868. overflow: hidden;
  869. }
  870. .map-wrap iframe {
  871. display: block;
  872. filter: saturate(0) brightness(0.6) contrast(1.2);
  873. transition: filter 0.5s;
  874. }
  875. .map-wrap:hover iframe { filter: saturate(0.8) brightness(0.85) contrast(1.1); }
  876. /* ── SOCIAL ICONS ── */
  877. .social-icon {
  878. width: 40px;
  879. height: 40px;
  880. border-radius: 50%;
  881. border: 1px solid rgba(255,255,255,0.12);
  882. display: flex;
  883. align-items: center;
  884. justify-content: center;
  885. color: rgba(255,255,255,0.5);
  886. transition: all 0.3s;
  887. }
  888. .social-icon:hover { border-color: #D4A044; color: #D4A044; }
  889. .social-icon-sm {
  890. color: rgba(255,255,255,0.3);
  891. transition: color 0.3s;
  892. }
  893. .social-icon-sm:hover { color: #D4A044; }
  894. /* ── WHATSAPP FLOAT ── */
  895. .wa-float {
  896. position: fixed;
  897. bottom: 24px;
  898. right: 24px;
  899. z-index: 70;
  900. width: 56px;
  901. height: 56px;
  902. border-radius: 50%;
  903. background: linear-gradient(135deg, #25d366, #128c7e);
  904. display: flex;
  905. align-items: center;
  906. justify-content: center;
  907. box-shadow: 0 4px 20px rgba(37,211,102,0.4);
  908. animation: waPulse 2.5s ease-in-out infinite;
  909. transition: transform 0.3s;
  910. }
  911. .wa-float:hover { transform: scale(1.1); }
  912. @keyframes waPulse {
  913. 0%, 100% { box-shadow: 0 4px 20px rgba(37,211,102,0.4); }
  914. 50% { box-shadow: 0 4px 30px rgba(37,211,102,0.6), 0 0 0 10px rgba(37,211,102,0.08); }
  915. }
  916. /* ── SCROLL REVEAL ANIMATIONS ── */
  917. :global(.fade-up) {
  918. opacity: 0;
  919. transform: translateY(40px);
  920. transition: opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1), transform 0.8s cubic-bezier(0.16, 1, 0.3, 1);
  921. }
  922. :global(.fade-up.in-view) { opacity: 1; transform: translateY(0); }
  923. :global(.fade-left) {
  924. opacity: 0;
  925. transform: translateX(-50px);
  926. transition: opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1), transform 0.8s cubic-bezier(0.16, 1, 0.3, 1);
  927. }
  928. :global(.fade-left.in-view) { opacity: 1; transform: translateX(0); }
  929. :global(.fade-right) {
  930. opacity: 0;
  931. transform: translateX(50px);
  932. transition: opacity 0.9s cubic-bezier(0.16, 1, 0.3, 1) 0.15s, transform 0.9s cubic-bezier(0.16, 1, 0.3, 1) 0.15s;
  933. }
  934. :global(.fade-right.in-view) { opacity: 1; transform: translateX(0); }
  935. :global(.scale-in) {
  936. opacity: 0;
  937. transform: scale(0.92);
  938. transition: opacity 0.7s, transform 0.7s;
  939. }
  940. :global(.scale-in.in-view) { opacity: 1; transform: scale(1); }
  941. </style>