Files
gruperly-web/src/_includes/layouts/base.njk

150 lines
5.3 KiB
Plaintext

<!DOCTYPE html>
<html lang="es" class="scroll-smooth">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>{{ title or site.name }}</title>
<meta name="description" content="{{ description or site.description }}" />
<link rel="icon" type="image/svg+xml" href="/assets/favicon.svg" />
<link rel="icon" type="image/png" sizes="512x512" href="/assets/isotipo-y-organica-preview.png" />
<link rel="apple-touch-icon" href="/assets/isotipo-y-organica-preview.png" />
<script>
if (localStorage.getItem('theme') === 'dark' || (!localStorage.getItem('theme') && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
document.documentElement.classList.add('dark');
}
</script>
<script>
(function () {
function applyCurrency(currency) {
document.documentElement.setAttribute('data-currency', currency);
}
function countryFromTimeZone() {
try {
var tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
if (tz && tz.indexOf('America/Argentina') === 0) return 'AR';
} catch (e) {}
return null;
}
var country = countryFromTimeZone();
applyCurrency(country === 'AR' ? 'ars' : 'usd');
var controller = new AbortController();
var timer = setTimeout(function () { controller.abort(); }, 3000);
fetch('https://get.geojs.io/v1/ip/country.json', { signal: controller.signal })
.then(function (res) { return res.json(); })
.then(function (data) {
if (data && typeof data.country === 'string' && data.country) {
applyCurrency(data.country === 'AR' ? 'ars' : 'usd');
}
})
.catch(function () {})
.finally(function () { clearTimeout(timer); });
})();
</script>
<script async defer src="https://cloud.umami.is/script.js" data-website-id="5bd25a18-8076-49b2-83c0-2c6a5e16dec9"></script>
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
darkMode: 'class',
theme: {
extend: {
colors: {
brand: {
50: '#eef4ff',
100: '#dbe6fe',
200: '#bfd3fe',
300: '#93b4fd',
400: '#608afa',
500: '#3b63f5',
600: '#2544ea',
700: '#1d33d8',
800: '#1e2cb0',
900: '#1e2b8b',
950: '#171d54',
},
},
fontFamily: {
sans: ['Inter', 'ui-sans-serif', 'system-ui', 'sans-serif'],
},
},
},
};
</script>
<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=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet" />
<style>
[x-cloak] { display: none !important; }
html { scroll-padding-top: 6rem; }
body { text-rendering: optimizeLegibility; }
input[type="range"] { accent-color: #3b63f5; }
.price-ars { display: none; }
html[data-currency="ars"] .price-ars { display: inline; }
html[data-currency="ars"] .price-usd { display: none; }
</style>
</head>
<body class="font-sans antialiased bg-white text-slate-900 dark:bg-slate-950 dark:text-slate-100 transition-colors duration-300">
{% include "partials/header.njk" %}
<main>
{{ content | safe }}
</main>
{% include "partials/footer.njk" %}
<script>
function setupThemeToggle(toggleId, sunId, moonId) {
const toggle = document.getElementById(toggleId);
const iconSun = document.getElementById(sunId);
const iconMoon = document.getElementById(moonId);
function syncIcons() {
const isDark = document.documentElement.classList.contains('dark');
iconSun.classList.toggle('hidden', !isDark);
iconMoon.classList.toggle('hidden', isDark);
}
toggle.addEventListener('click', () => {
const isDark = document.documentElement.classList.toggle('dark');
localStorage.setItem('theme', isDark ? 'dark' : 'light');
syncIcons();
});
syncIcons();
}
setupThemeToggle('theme-toggle', 'icon-sun', 'icon-moon');
setupThemeToggle('theme-toggle-mobile', 'icon-sun-mobile', 'icon-moon-mobile');
const menuToggle = document.getElementById('menu-toggle');
const mobileMenu = document.getElementById('mobile-menu');
const iconMenu = document.getElementById('icon-menu');
const iconClose = document.getElementById('icon-close');
function setMenu(open) {
mobileMenu.classList.toggle('hidden', !open);
iconMenu.classList.toggle('hidden', open);
iconClose.classList.toggle('hidden', !open);
menuToggle.setAttribute('aria-expanded', String(open));
menuToggle.setAttribute('aria-label', open ? 'Cerrar menú' : 'Abrir menú');
}
menuToggle.addEventListener('click', () => setMenu(mobileMenu.classList.contains('hidden')));
document.querySelectorAll('[data-menu-link]').forEach(link => {
link.addEventListener('click', () => setMenu(false));
});
document.addEventListener('keydown', (event) => {
if (event.key === 'Escape' && !mobileMenu.classList.contains('hidden')) {
setMenu(false);
menuToggle.focus();
}
});
</script>
</body>
</html>