iphone1-landing / script.js
victor's picture
victor HF Staff
apple landing page for new iphone
4a5bd8c verified
// Simple color and theme management
(function () {
const config = {
primary: "gray",
secondary: "slate",
theme: "light", // light | dark
};
function applyTheme(theme) {
const root = document.documentElement;
if (theme === "dark") {
root.classList.add("dark");
} else {
root.classList.remove("dark");
}
}
// Theme toggle
const toggle = document.getElementById("themeToggle");
if (toggle) {
toggle.addEventListener("click", () => {
const isDark = document.documentElement.classList.toggle("dark");
const next = isDark ? "dark" : "light";
try {
localStorage.setItem("theme", next);
} catch (_) {}
});
}
// Restore saved theme
try {
const saved = localStorage.getItem("theme");
if (saved === "dark" || saved === "light") {
applyTheme(saved);
} else {
applyTheme(config.theme);
}
} catch (_) {
applyTheme(config.theme);
}
// Device tilt effect (hero)
const device = document.getElementById("device3d");
if (device) {
let raf = null;
let rx = 0, ry = 0, tx = 0, ty = 0;
const max = 8;
const onMove = (e) => {
const rect = device.getBoundingClientRect();
const cx = rect.left + rect.width / 2;
const cy = rect.top + rect.height / 2;
const dx = (e.clientX - cx) / (rect.width / 2);
const dy = (e.clientY - cy) / (rect.height / 2);
tx = Math.max(-1, Math.min(1, dx));
ty = Math.max(-1, Math.min(1, dy));
ry = tx * max;
rx = -ty * max;
if (!raf) {
raf = requestAnimationFrame(() => {
device.style.transform = `perspective(1000px) rotateX(${rx.toFixed(2)}deg) rotateY(${ry.toFixed(2)}deg) translateZ(0)`;
raf = null;
});
}
};
const reset = () => {
device.style.transform = "perspective(1000px) rotateX(0deg) rotateY(0deg)";
};
window.addEventListener("mousemove", onMove, { passive: true });
window.addEventListener("mouseleave", reset);
window.addEventListener("touchmove", (e) => {
if (!e.touches || e.touches.length === 0) return;
const t = e.touches[0];
onMove({ clientX: t.clientX, clientY: t.clientY });
}, { passive: true });
window.addEventListener("touchend", reset);
}
// Optional: uncomment to log config or expose it for debugging
// console.log("iPhone 1 Landing — Config:", config);
})();