+page.svelte 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  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 mobileMenuOpen = $state(false);
  12. let navSolid = $derived(scrollY > 80);
  13. let lightboxOpen = $state(false);
  14. let lightboxImg = $state('');
  15. const services = [
  16. {
  17. name: "Tatuajes Personalizados",
  18. 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.",
  19. icon: "✦",
  20. accent: "#D64B8A"
  21. },
  22. {
  23. name: "Body Piercing",
  24. description: "Servicio profesional de perforaciones corporales realizadas con técnicas seguras e higiénicas en un ambiente artístico.",
  25. icon: "◈",
  26. accent: "#2A8C7A"
  27. },
  28. {
  29. name: "Galería de Arte Original",
  30. 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.",
  31. icon: "❋",
  32. accent: "#D4A044"
  33. },
  34. {
  35. name: "Murales y Arte a Gran Escala",
  36. 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.",
  37. icon: "◆",
  38. accent: "#E87C4F"
  39. },
  40. {
  41. name: "Eventos de Arte",
  42. 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.",
  43. icon: "✧",
  44. accent: "#9B7EC8"
  45. }
  46. ];
  47. const galleryImages = [
  48. { src: "/gallery/2.jpg", caption: "Águila y jaguar — estilo indígena", span: "col-span-2 row-span-2" },
  49. { src: "/gallery/6.jpg", caption: "Búho floral — blanco y negro", span: "" },
  50. { src: "/gallery/10.jpg", caption: "Colibrí — pintura original", span: "" },
  51. { src: "/gallery/3.jpg", caption: "Orquídea a color", span: "" },
  52. { src: "/gallery/15.jpg", caption: "Orquídea precolombina", span: "col-span-2" },
  53. { src: "/gallery/4.jpg", caption: "Libélula y flores abstractas", span: "" },
  54. { src: "/gallery/11.jpg", caption: "Perezoso tribal — pintura", span: "" },
  55. { src: "/gallery/5.jpg", caption: "Pulpo detallado", span: "" },
  56. { src: "/gallery/14.jpg", caption: "Mural artístico monumental", span: "col-span-2" },
  57. { src: "/gallery/1.jpg", caption: "Lettering cursivo", span: "" },
  58. { src: "/gallery/13.jpg", caption: "Mujer mariposa — pintura", span: "" },
  59. { src: "/gallery/7.jpg", caption: "Arte geométrico abstracto", span: "" },
  60. ];
  61. function openLightbox(src) {
  62. lightboxImg = src;
  63. lightboxOpen = true;
  64. }
  65. function closeLightbox() {
  66. lightboxOpen = false;
  67. lightboxImg = '';
  68. }
  69. onMount(() => {
  70. const handleScroll = () => {
  71. scrollY = window.scrollY;
  72. };
  73. window.addEventListener('scroll', handleScroll, { passive: true });
  74. const observer = new IntersectionObserver(
  75. (entries) => {
  76. entries.forEach((entry) => {
  77. if (entry.isIntersecting) {
  78. entry.target.classList.add('revealed');
  79. }
  80. });
  81. },
  82. { threshold: 0.05, rootMargin: '0px 0px -20px 0px' }
  83. );
  84. const observeAll = () => {
  85. document.querySelectorAll('.reveal').forEach((el) => observer.observe(el));
  86. };
  87. observeAll();
  88. // Re-observe after a short delay to catch any elements that rendered late
  89. setTimeout(observeAll, 100);
  90. setTimeout(observeAll, 500);
  91. return () => {
  92. window.removeEventListener('scroll', handleScroll);
  93. observer.disconnect();
  94. };
  95. });
  96. </script>
  97. <!-- NAVIGATION -->
  98. <nav class={navSolid ? 'nav-bar nav-solid' : 'nav-bar nav-transparent'}>
  99. <div class="max-w-7xl mx-auto px-5 sm:px-8 flex items-center justify-between h-full">
  100. <a href="/" class="nav-logo">
  101. <img src="/logo.png" alt="Inkdigena" class="h-10 sm:h-12 w-auto">
  102. </a>
  103. <!-- Desktop nav -->
  104. <div class="hidden md:flex items-center gap-8">
  105. <a href="/" class="nav-link font-bebas text-sm tracking-widest uppercase">Inicio</a>
  106. <a href="#servicios" class="nav-link font-bebas text-sm tracking-widest uppercase">Servicios</a>
  107. <a href="#galeria" class="nav-link font-bebas text-sm tracking-widest uppercase">Galería</a>
  108. <a href="#contacto" class="nav-link font-bebas text-sm tracking-widest uppercase">Contacto</a>
  109. <a href="/about" class="nav-link font-bebas text-sm tracking-widest uppercase">Nosotros</a>
  110. <a href="https://wa.me/50662692083?text=Hola%2C%20vi%20su%20sitio%20web%20y%20me%20interesan%20sus%20servicios." target="_blank" rel="noopener noreferrer" class="nav-cta font-bebas text-sm tracking-widest uppercase px-5 py-2 rounded-none">
  111. Reservar Cita
  112. </a>
  113. </div>
  114. <!-- Mobile hamburger -->
  115. <button class="md:hidden relative z-50 w-10 h-10 flex items-center justify-center" onclick={() => mobileMenuOpen = !mobileMenuOpen} aria-label="Menú">
  116. <div class="hamburger-lines">
  117. <span class={mobileMenuOpen ? 'line line-1 open' : 'line line-1'}></span>
  118. <span class={mobileMenuOpen ? 'line line-2 open' : 'line line-2'}></span>
  119. <span class={mobileMenuOpen ? 'line line-3 open' : 'line line-3'}></span>
  120. </div>
  121. </button>
  122. </div>
  123. <!-- Mobile menu -->
  124. {#if mobileMenuOpen}
  125. <div class="mobile-menu md:hidden">
  126. <div class="flex flex-col items-center gap-6 py-12">
  127. <a href="/" class="font-bebas text-2xl tracking-widest uppercase text-white" onclick={() => mobileMenuOpen = false}>Inicio</a>
  128. <a href="#servicios" class="font-bebas text-2xl tracking-widest uppercase text-white" onclick={() => mobileMenuOpen = false}>Servicios</a>
  129. <a href="#galeria" class="font-bebas text-2xl tracking-widest uppercase text-white" onclick={() => mobileMenuOpen = false}>Galería</a>
  130. <a href="#contacto" class="font-bebas text-2xl tracking-widest uppercase text-white" onclick={() => mobileMenuOpen = false}>Contacto</a>
  131. <a href="/about" class="font-bebas text-2xl tracking-widest uppercase text-white" onclick={() => mobileMenuOpen = false}>Nosotros</a>
  132. <a href="https://wa.me/50662692083?text=Hola%2C%20vi%20su%20sitio%20web%20y%20me%20interesan%20sus%20servicios." target="_blank" rel="noopener noreferrer" class="nav-cta-mobile font-bebas text-xl tracking-widest uppercase px-8 py-3 mt-4">
  133. Reservar Cita
  134. </a>
  135. </div>
  136. </div>
  137. {/if}
  138. </nav>
  139. <!-- HERO -->
  140. <section class="min-h-screen-ios relative flex items-center justify-center overflow-hidden">
  141. <video class="hidden sm:block absolute inset-0 w-full h-full object-cover" autoplay muted loop playsinline>
  142. <source src="/hero-bg.mp4" type="video/mp4">
  143. </video>
  144. <video class="sm:hidden absolute inset-0 w-full h-full object-cover" autoplay muted loop playsinline>
  145. <source src="/hero-bg-mobile.mp4" type="video/mp4">
  146. </video>
  147. <div class="hero-overlay absolute inset-0"></div>
  148. <div class="grain-overlay absolute inset-0"></div>
  149. <div class="relative z-10 text-center px-5 sm:px-8 max-w-5xl mx-auto w-full">
  150. <img src="/logo.png" alt="Inkdigena" class="w-40 sm:w-56 md:w-64 mx-auto mb-4 sm:mb-6 reveal" style="filter: drop-shadow(0 4px 40px rgba(0,0,0,0.6));">
  151. <div class="flex items-center justify-center gap-3 sm:gap-4 mb-6 reveal flex-wrap" style="animation-delay: 0.15s;">
  152. <span class="h-px w-8 sm:w-20 bg-gold opacity-60"></span>
  153. <span class="font-bebas text-gold text-xs sm:text-sm tracking-[0.3em] sm:tracking-[0.4em] uppercase">Tattoo • Art • Gallery</span>
  154. <span class="h-px w-8 sm:w-20 bg-gold opacity-60"></span>
  155. </div>
  156. <p class="font-playfair italic text-xl sm:text-2xl md:text-3xl text-white/90 mb-10 sm:mb-12 reveal px-2" style="animation-delay: 0.3s;">
  157. Donde el arte ancestral cobra vida en tu piel
  158. </p>
  159. <div class="flex flex-col sm:flex-row items-center justify-center gap-4 sm:gap-6 reveal" style="animation-delay: 0.45s;">
  160. <a href="https://wa.me/50662692083?text=Hola%2C%20vi%20su%20sitio%20web%20y%20me%20interesan%20sus%20servicios." target="_blank" rel="noopener noreferrer" class="hero-btn-primary font-bebas text-base sm:text-lg tracking-widest uppercase px-10 py-4 w-full sm:w-auto text-center">
  161. Agendar por WhatsApp
  162. </a>
  163. <a href="tel:50662692083" class="hero-btn-secondary font-bebas text-base sm:text-lg tracking-widest uppercase px-10 py-4 w-full sm:w-auto text-center">
  164. Llamar Ahora
  165. </a>
  166. </div>
  167. </div>
  168. <!-- Scroll indicator -->
  169. <div class="absolute bottom-8 left-1/2 -translate-x-1/2 z-10 scroll-indicator">
  170. <div class="w-px h-16 bg-gradient-to-b from-gold/80 to-transparent mx-auto mb-2"></div>
  171. <span class="font-montserrat text-[10px] tracking-[0.3em] uppercase text-white/50">Explorar</span>
  172. </div>
  173. </section>
  174. <!-- EDITORIAL PULL QUOTE -->
  175. <section class="bg-navy py-14 sm:py-24 relative overflow-hidden">
  176. <div class="absolute inset-0 opacity-5">
  177. <div class="tribal-pattern"></div>
  178. </div>
  179. <div class="max-w-4xl mx-auto px-5 sm:px-8 text-center reveal">
  180. <span class="font-bebas text-gold text-xs tracking-[0.5em] uppercase block mb-6">Nuestra Filosofía</span>
  181. <blockquote class="font-playfair italic text-2xl sm:text-4xl md:text-5xl text-white/90 leading-tight">
  182. "El arte no se crea — se despierta de las raíces que llevamos dentro"
  183. </blockquote>
  184. <div class="mt-8 flex items-center justify-center gap-3">
  185. <span class="h-px w-16 bg-magenta/40"></span>
  186. <span class="text-gold text-2xl">✦</span>
  187. <span class="h-px w-16 bg-magenta/40"></span>
  188. </div>
  189. </div>
  190. </section>
  191. <!-- SERVICES -->
  192. <section id="servicios" class="py-14 sm:py-24 bg-off-dark relative overflow-hidden">
  193. <div class="grain-overlay absolute inset-0"></div>
  194. <div class="max-w-7xl mx-auto px-5 sm:px-8 relative z-10">
  195. <div class="text-center mb-12 sm:mb-20 reveal">
  196. <span class="font-bebas text-gold text-xs tracking-[0.5em] uppercase block mb-4">Lo Que Hacemos</span>
  197. <h2 class="font-bebas text-4xl sm:text-6xl md:text-7xl text-white tracking-wide uppercase">Nuestros Servicios</h2>
  198. <div class="mx-auto mt-4 w-24 h-1 bg-gradient-to-r from-magenta via-gold to-teal"></div>
  199. </div>
  200. <div class="services-grid">
  201. {#each services as service, i}
  202. <div class="service-card reveal" style="animation-delay: {i * 0.1}s;">
  203. <div class="service-accent-line" style="background: {service.accent};"></div>
  204. <div class="p-5 sm:p-8">
  205. <span class="text-3xl sm:text-4xl block mb-4" style="color: {service.accent};">{service.icon}</span>
  206. <h3 class="font-bebas text-xl sm:text-2xl tracking-wider uppercase text-white mb-3">{service.name}</h3>
  207. <p class="font-montserrat text-sm sm:text-base text-white/60 leading-relaxed">{service.description}</p>
  208. </div>
  209. </div>
  210. {/each}
  211. </div>
  212. </div>
  213. </section>
  214. <!-- FEATURED ARTWORK BANNER -->
  215. <section class="relative h-[50vh] sm:h-[60vh] overflow-hidden">
  216. <img src="/gallery/11.jpg" alt="Arte tribal — perezoso y jaguar" class="absolute inset-0 w-full h-full object-cover" loading="lazy">
  217. <div class="absolute inset-0 bg-gradient-to-t from-navy via-navy/40 to-transparent"></div>
  218. <div class="absolute bottom-0 left-0 right-0 p-5 sm:p-16 z-10 banner-text-visible">
  219. <span class="font-bebas text-gold text-xs tracking-[0.5em] uppercase block mb-2">Arte Original</span>
  220. <h3 class="font-dancing text-3xl sm:text-5xl text-white">Donde la cultura se encuentra con el lienzo</h3>
  221. </div>
  222. </section>
  223. <!-- GALLERY -->
  224. <section id="galeria" class="py-14 sm:py-24 bg-navy relative overflow-hidden">
  225. <div class="max-w-7xl mx-auto px-5 sm:px-8">
  226. <div class="flex flex-col sm:flex-row items-start sm:items-end justify-between mb-12 sm:mb-20 gap-4 reveal">
  227. <div>
  228. <span class="font-bebas text-gold text-xs tracking-[0.5em] uppercase block mb-4">Portfolio</span>
  229. <h2 class="font-bebas text-4xl sm:text-6xl md:text-7xl text-white tracking-wide uppercase">Galería</h2>
  230. </div>
  231. <p class="font-playfair italic text-white/50 text-lg sm:text-xl sm:max-w-md">
  232. Cada pieza cuenta una historia — de raíces, naturaleza y la fuerza del arte.
  233. </p>
  234. </div>
  235. <div class="gallery-masonry">
  236. {#each galleryImages as img, i}
  237. <button class="gallery-item {img.span} gallery-visible" style="animation-delay: {i * 0.06}s;" onclick={() => openLightbox(img.src)}>
  238. <img src={img.src} alt={img.caption} class="w-full h-full object-cover" loading="lazy">
  239. <div class="gallery-overlay">
  240. <span class="font-montserrat text-xs sm:text-sm text-white/90 tracking-wide">{img.caption}</span>
  241. </div>
  242. </button>
  243. {/each}
  244. </div>
  245. </div>
  246. </section>
  247. <!-- LIGHTBOX -->
  248. {#if lightboxOpen}
  249. <div class="lightbox-backdrop" role="dialog" aria-modal="true">
  250. <button class="absolute inset-0 z-0" onclick={closeLightbox} aria-label="Cerrar"></button>
  251. <button class="absolute top-6 right-6 z-20 text-white/70 hover:text-white text-4xl font-light transition-colors" onclick={closeLightbox} aria-label="Cerrar">✕</button>
  252. <img src={lightboxImg} alt="Imagen ampliada" class="relative z-10 max-w-[90vw] max-h-[85vh] object-contain rounded-sm shadow-2xl">
  253. </div>
  254. {/if}
  255. <!-- CONTACT -->
  256. <section id="contacto" class="py-14 sm:py-24 bg-off-dark relative overflow-hidden">
  257. <div class="grain-overlay absolute inset-0"></div>
  258. <div class="max-w-7xl mx-auto px-5 sm:px-8 relative z-10">
  259. <div class="text-center mb-12 sm:mb-20 reveal">
  260. <span class="font-bebas text-gold text-xs tracking-[0.5em] uppercase block mb-4">Hablemos</span>
  261. <h2 class="font-bebas text-4xl sm:text-6xl md:text-7xl text-white tracking-wide uppercase">Contacto</h2>
  262. <div class="mx-auto mt-4 w-24 h-1 bg-gradient-to-r from-teal via-gold to-coral"></div>
  263. </div>
  264. <div class="grid grid-cols-1 lg:grid-cols-2 gap-8 sm:gap-12">
  265. <!-- Contact Info -->
  266. <div class="space-y-6 sm:space-y-8 reveal">
  267. <div class="contact-card">
  268. <div class="flex items-start gap-4 sm:gap-5">
  269. <div class="contact-icon-ring" style="--ring-color: #2A8C7A;">
  270. <span class="text-xl sm:text-2xl">📱</span>
  271. </div>
  272. <div class="min-w-0">
  273. <h4 class="font-bebas text-lg tracking-wider text-white uppercase mb-1">WhatsApp</h4>
  274. <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-montserrat text-gold hover:text-magenta transition-colors text-base sm:text-lg break-all">
  275. +506 6269-2083
  276. </a>
  277. <p class="font-montserrat text-white/40 text-sm mt-1">Escríbenos para agendar tu cita</p>
  278. </div>
  279. </div>
  280. </div>
  281. <div class="contact-card">
  282. <div class="flex items-start gap-4 sm:gap-5">
  283. <div class="contact-icon-ring" style="--ring-color: #D64B8A;">
  284. <span class="text-xl sm:text-2xl">📞</span>
  285. </div>
  286. <div class="min-w-0">
  287. <h4 class="font-bebas text-lg tracking-wider text-white uppercase mb-1">Teléfono</h4>
  288. <a href="tel:50662692083" class="font-montserrat text-gold hover:text-magenta transition-colors text-base sm:text-lg">
  289. +506 6269-2083
  290. </a>
  291. <p class="font-montserrat text-white/40 text-sm mt-1">Llámanos directamente</p>
  292. </div>
  293. </div>
  294. </div>
  295. <div class="contact-card">
  296. <div class="flex items-start gap-4 sm:gap-5">
  297. <div class="contact-icon-ring" style="--ring-color: #D4A044;">
  298. <span class="text-xl sm:text-2xl">📍</span>
  299. </div>
  300. <div class="min-w-0">
  301. <h4 class="font-bebas text-lg tracking-wider text-white uppercase mb-1">Ubicación</h4>
  302. <p class="font-montserrat text-white/70 text-base sm:text-lg">Costa Rica</p>
  303. </div>
  304. </div>
  305. </div>
  306. <a href="https://wa.me/50662692083?text=Hola%2C%20vi%20su%20sitio%20web%20y%20me%20interesan%20sus%20servicios." target="_blank" rel="noopener noreferrer" class="contact-cta-btn font-bebas text-lg tracking-widest uppercase block text-center py-4 mt-4">
  307. Reservar Mi Cita →
  308. </a>
  309. </div>
  310. <!-- Map -->
  311. <div class="reveal" style="animation-delay: 0.15s;">
  312. <div class="map-container">
  313. <iframe
  314. src="https://maps.google.com/maps?q=Costa%20Rica&output=embed"
  315. width="100%"
  316. height="400"
  317. style="border:0"
  318. loading="lazy"
  319. title="Mapa de ubicación"
  320. ></iframe>
  321. </div>
  322. </div>
  323. </div>
  324. </div>
  325. </section>
  326. <!-- FOOTER -->
  327. <footer class="bg-navy border-t border-white/5 py-12 sm:py-16 relative overflow-hidden">
  328. <div class="max-w-7xl mx-auto px-5 sm:px-8">
  329. <div class="flex flex-col items-center text-center">
  330. <a href="/" class="mb-4"><img src="/logo.png" alt="Inkdigena" class="h-16 w-auto mx-auto"></a>
  331. <p class="font-montserrat text-white/40 text-sm mb-2">Tattoo Art Gallery Shop</p>
  332. <p class="font-playfair italic text-white/25 text-sm mb-8">Donde el arte ancestral cobra vida en tu piel</p>
  333. <div class="flex items-center justify-center gap-3 sm:gap-6 mb-8 flex-wrap px-2">
  334. <a href="/" class="font-bebas text-xs tracking-widest uppercase text-white/40 hover:text-gold transition-colors">Inicio</a>
  335. <span class="text-white/10 hidden sm:inline">|</span>
  336. <a href="#servicios" class="font-bebas text-xs tracking-widest uppercase text-white/40 hover:text-gold transition-colors">Servicios</a>
  337. <span class="text-white/10 hidden sm:inline">|</span>
  338. <a href="#galeria" class="font-bebas text-xs tracking-widest uppercase text-white/40 hover:text-gold transition-colors">Galería</a>
  339. <span class="text-white/10 hidden sm:inline">|</span>
  340. <a href="#contacto" class="font-bebas text-xs tracking-widest uppercase text-white/40 hover:text-gold transition-colors">Contacto</a>
  341. <span class="text-white/10 hidden sm:inline">|</span>
  342. <a href="/about" class="font-bebas text-xs tracking-widest uppercase text-white/40 hover:text-gold transition-colors">Nosotros</a>
  343. </div>
  344. <div class="flex items-center gap-3 mb-6">
  345. <span class="h-px w-12 bg-gold/20"></span>
  346. <span class="text-gold/40 text-sm">✦</span>
  347. <span class="h-px w-12 bg-gold/20"></span>
  348. </div>
  349. <p class="font-montserrat text-white/25 text-xs mb-4">
  350. © {new Date().getFullYear()} Inkdigena Tattoo Art Gallery Shop. Todos los derechos reservados.
  351. </p>
  352. <a href="https://digitalmar.dev" target="_blank" rel="noopener noreferrer" class="text-xs opacity-40 hover:opacity-70 transition-opacity text-white/50">
  353. Hecho por digitalmar.dev
  354. </a>
  355. </div>
  356. </div>
  357. </footer>
  358. <!-- FLOATING WHATSAPP -->
  359. <a
  360. href="https://wa.me/50662692083?text=Hola%2C%20vi%20su%20sitio%20web%20y%20me%20interesan%20sus%20servicios."
  361. target="_blank"
  362. rel="noopener noreferrer"
  363. class="whatsapp-float"
  364. aria-label="Contactar por WhatsApp"
  365. >
  366. <svg viewBox="0 0 32 32" class="w-7 h-7" fill="white">
  367. <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"/>
  368. </svg>
  369. </a>
  370. <style>
  371. :global(html, body) {
  372. overflow-x: hidden;
  373. }
  374. .font-dancing { font-family: 'Cinzel', serif; letter-spacing: 0.12em; }
  375. .font-bebas { font-family: 'Cinzel', serif; letter-spacing: 0.12em; }
  376. .font-montserrat { font-family: 'Montserrat', sans-serif; }
  377. .font-playfair { font-family: 'Montserrat', sans-serif; font-style: italic; }
  378. .bg-navy { background-color: #2A2A2A; }
  379. .bg-off-dark { background-color: #1E1E1E; }
  380. .bg-gold { background-color: #D4A044; }
  381. .text-gold { color: #D4A044; }
  382. .text-magenta { color: #D64B8A; }
  383. .text-teal { color: #2A8C7A; }
  384. .text-coral { color: #E87C4F; }
  385. /* NAV */
  386. .nav-bar {
  387. position: fixed;
  388. top: 0;
  389. left: 0;
  390. right: 0;
  391. z-index: 100;
  392. height: 72px;
  393. transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
  394. }
  395. .nav-transparent {
  396. background: transparent;
  397. }
  398. .nav-solid {
  399. background: rgba(30, 30, 30, 0.95);
  400. backdrop-filter: blur(20px);
  401. -webkit-backdrop-filter: blur(20px);
  402. border-bottom: 1px solid rgba(212, 160, 68, 0.1);
  403. }
  404. .nav-link {
  405. color: rgba(255,255,255,0.7);
  406. transition: color 0.3s;
  407. position: relative;
  408. }
  409. .nav-link:hover { color: #D4A044; }
  410. .nav-link::after {
  411. content: '';
  412. position: absolute;
  413. bottom: -4px;
  414. left: 0;
  415. right: 0;
  416. height: 1px;
  417. background: #D4A044;
  418. transform: scaleX(0);
  419. transition: transform 0.3s;
  420. }
  421. .nav-link:hover::after { transform: scaleX(1); }
  422. .nav-cta {
  423. background: transparent;
  424. border: 1px solid #D4A044;
  425. color: #D4A044;
  426. transition: all 0.3s;
  427. }
  428. .nav-cta:hover {
  429. background: #D4A044;
  430. color: #2A2A2A;
  431. }
  432. .nav-cta-mobile {
  433. background: #D4A044;
  434. color: #2A2A2A;
  435. }
  436. /* Hamburger */
  437. .hamburger-lines { width: 24px; height: 18px; position: relative; }
  438. .line {
  439. display: block;
  440. position: absolute;
  441. left: 0;
  442. width: 100%;
  443. height: 2px;
  444. background: #D4A044;
  445. transition: all 0.3s;
  446. }
  447. .line-1 { top: 0; }
  448. .line-2 { top: 8px; }
  449. .line-3 { top: 16px; }
  450. .line-1.open { top: 8px; transform: rotate(45deg); }
  451. .line-2.open { opacity: 0; }
  452. .line-3.open { top: 8px; transform: rotate(-45deg); }
  453. .mobile-menu {
  454. position: absolute;
  455. top: 72px;
  456. left: 0;
  457. right: 0;
  458. background: rgba(30, 30, 30, 0.98);
  459. backdrop-filter: blur(30px);
  460. -webkit-backdrop-filter: blur(30px);
  461. border-bottom: 1px solid rgba(212, 160, 68, 0.15);
  462. animation: slideDown 0.3s ease-out;
  463. }
  464. @keyframes slideDown {
  465. from { opacity: 0; transform: translateY(-10px); }
  466. to { opacity: 1; transform: translateY(0); }
  467. }
  468. /* HERO */
  469. .hero-overlay {
  470. background: linear-gradient(
  471. to bottom,
  472. rgba(30, 30, 30, 0.3) 0%,
  473. rgba(30, 30, 30, 0.5) 40%,
  474. rgba(30, 30, 30, 0.85) 100%
  475. );
  476. }
  477. .grain-overlay {
  478. background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
  479. pointer-events: none;
  480. mix-blend-mode: overlay;
  481. opacity: 0.6;
  482. }
  483. .hero-btn-primary {
  484. background: linear-gradient(135deg, #D4A044 0%, #E87C4F 100%);
  485. color: #2A2A2A;
  486. transition: all 0.3s;
  487. border: none;
  488. position: relative;
  489. overflow: hidden;
  490. }
  491. .hero-btn-primary:hover {
  492. transform: translateY(-2px);
  493. box-shadow: 0 8px 30px rgba(212, 160, 68, 0.4);
  494. }
  495. .hero-btn-secondary {
  496. background: transparent;
  497. color: white;
  498. border: 1px solid rgba(255,255,255,0.3);
  499. transition: all 0.3s;
  500. }
  501. .hero-btn-secondary:hover {
  502. border-color: #D4A044;
  503. color: #D4A044;
  504. }
  505. .scroll-indicator {
  506. animation: scrollFade 2s ease-in-out infinite;
  507. }
  508. @keyframes scrollFade {
  509. 0%, 100% { opacity: 0.4; transform: translateX(-50%) translateY(0); }
  510. 50% { opacity: 1; transform: translateX(-50%) translateY(6px); }
  511. }
  512. /* SERVICES */
  513. .services-grid {
  514. display: grid;
  515. grid-template-columns: 1fr;
  516. gap: 1rem;
  517. }
  518. @media (min-width: 640px) {
  519. .services-grid {
  520. grid-template-columns: repeat(2, 1fr);
  521. gap: 1.5rem;
  522. }
  523. }
  524. @media (min-width: 1024px) {
  525. .services-grid {
  526. grid-template-columns: repeat(3, 1fr);
  527. }
  528. }
  529. .service-card {
  530. background: rgba(42, 42, 42, 0.5);
  531. border: 1px solid rgba(255,255,255,0.05);
  532. position: relative;
  533. overflow: hidden;
  534. transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
  535. }
  536. .service-card:hover {
  537. transform: translateY(-4px);
  538. border-color: rgba(212, 160, 68, 0.2);
  539. box-shadow: 0 12px 40px rgba(0,0,0,0.3);
  540. }
  541. .service-accent-line {
  542. height: 3px;
  543. width: 100%;
  544. }
  545. /* BANNER TEXT - always visible, no reveal needed */
  546. .banner-text-visible {
  547. opacity: 1;
  548. transform: none;
  549. }
  550. /* GALLERY */
  551. .gallery-masonry {
  552. display: grid;
  553. grid-template-columns: repeat(2, 1fr);
  554. gap: 0.5rem;
  555. }
  556. @media (min-width: 640px) {
  557. .gallery-masonry {
  558. grid-template-columns: repeat(3, 1fr);
  559. gap: 0.75rem;
  560. }
  561. }
  562. @media (min-width: 1024px) {
  563. .gallery-masonry {
  564. grid-template-columns: repeat(4, 1fr);
  565. gap: 1rem;
  566. }
  567. }
  568. /* Gallery items are always visible - no reveal animation to prevent stuck opacity */
  569. .gallery-visible {
  570. opacity: 1 !important;
  571. transform: none !important;
  572. }
  573. .gallery-item {
  574. position: relative;
  575. overflow: hidden;
  576. aspect-ratio: 1;
  577. cursor: pointer;
  578. border: none;
  579. padding: 0;
  580. background: #0a0a0a;
  581. }
  582. .gallery-item img {
  583. transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
  584. }
  585. .gallery-item:hover img {
  586. transform: scale(1.08);
  587. }
  588. .gallery-overlay {
  589. position: absolute;
  590. inset: 0;
  591. background: linear-gradient(to top, rgba(30, 30, 30, 0.9) 0%, transparent 60%);
  592. opacity: 0;
  593. transition: opacity 0.4s;
  594. display: flex;
  595. align-items: flex-end;
  596. padding: 0.75rem;
  597. }
  598. .gallery-item:hover .gallery-overlay {
  599. opacity: 1;
  600. }
  601. .col-span-2 { grid-column: span 2; }
  602. .row-span-2 { grid-row: span 2; }
  603. .col-span-2.row-span-2 { aspect-ratio: auto; }
  604. @media (max-width: 639px) {
  605. .col-span-2 { grid-column: span 2; }
  606. .row-span-2 { grid-row: span 1; }
  607. .col-span-2.row-span-2 { aspect-ratio: 2/1; }
  608. }
  609. /* LIGHTBOX */
  610. .lightbox-backdrop {
  611. position: fixed;
  612. inset: 0;
  613. z-index: 200;
  614. background: rgba(10, 10, 10, 0.95);
  615. backdrop-filter: blur(10px);
  616. display: flex;
  617. align-items: center;
  618. justify-content: center;
  619. animation: fadeIn 0.3s ease-out;
  620. }
  621. @keyframes fadeIn {
  622. from { opacity: 0; }
  623. to { opacity: 1; }
  624. }
  625. /* CONTACT */
  626. .contact-card {
  627. background: rgba(42, 42, 42, 0.4);
  628. border: 1px solid rgba(255,255,255,0.05);
  629. padding: 1.25rem;
  630. transition: border-color 0.3s;
  631. }
  632. @media (min-width: 640px) {
  633. .contact-card { padding: 1.5rem; }
  634. }
  635. .contact-card:hover {
  636. border-color: rgba(212, 160, 68, 0.2);
  637. }
  638. .contact-icon-ring {
  639. width: 48px;
  640. height: 48px;
  641. min-width: 48px;
  642. border-radius: 50%;
  643. border: 2px solid var(--ring-color);
  644. display: flex;
  645. align-items: center;
  646. justify-content: center;
  647. background: rgba(255,255,255,0.02);
  648. }
  649. @media (min-width: 640px) {
  650. .contact-icon-ring {
  651. width: 52px;
  652. height: 52px;
  653. min-width: 52px;
  654. }
  655. }
  656. .contact-cta-btn {
  657. background: linear-gradient(135deg, #D4A044 0%, #E87C4F 100%);
  658. color: #2A2A2A;
  659. transition: all 0.3s;
  660. border: none;
  661. }
  662. .contact-cta-btn:hover {
  663. transform: translateY(-2px);
  664. box-shadow: 0 8px 30px rgba(212, 160, 68, 0.35);
  665. }
  666. .map-container {
  667. border: 1px solid rgba(212, 160, 68, 0.15);
  668. overflow: hidden;
  669. background: #0a0a0a;
  670. }
  671. .map-container iframe {
  672. display: block;
  673. filter: saturate(0.6) brightness(0.8) contrast(1.1);
  674. transition: filter 0.4s;
  675. }
  676. .map-container:hover iframe {
  677. filter: saturate(1) brightness(1) contrast(1);
  678. }
  679. /* TRIBAL PATTERN */
  680. .tribal-pattern {
  681. width: 100%;
  682. height: 100%;
  683. background-image: repeating-linear-gradient(
  684. 45deg,
  685. transparent,
  686. transparent 30px,
  687. rgba(212, 160, 68, 0.06) 30px,
  688. rgba(212, 160, 68, 0.06) 31px
  689. );
  690. }
  691. /* WHATSAPP FLOAT */
  692. .whatsapp-float {
  693. position: fixed;
  694. bottom: 24px;
  695. right: 24px;
  696. z-index: 90;
  697. width: 60px;
  698. height: 60px;
  699. border-radius: 50%;
  700. background: linear-gradient(135deg, #25d366, #128c7e);
  701. display: flex;
  702. align-items: center;
  703. justify-content: center;
  704. box-shadow: 0 4px 20px rgba(37, 211, 102, 0.4);
  705. animation: waPulse 2s ease-in-out infinite;
  706. transition: transform 0.3s;
  707. }
  708. .whatsapp-float:hover {
  709. transform: scale(1.1);
  710. }
  711. @keyframes waPulse {
  712. 0%, 100% { box-shadow: 0 4px 20px rgba(37, 211, 102, 0.4); }
  713. 50% { box-shadow: 0 4px 35px rgba(37, 211, 102, 0.7), 0 0 0 12px rgba(37, 211, 102, 0.1); }
  714. }
  715. /* SCROLL REVEAL */
  716. .reveal {
  717. opacity: 0;
  718. transform: translateY(30px);
  719. transition: opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1), transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);
  720. }
  721. .reveal.revealed {
  722. opacity: 1;
  723. transform: translateY(0);
  724. }
  725. </style>