Fix broken production CSS from invalid changelog bullet character.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
eric 2026-08-29 00:56:54 -05:00
parent 96d3d83906
commit 2dd448874e
3 changed files with 30 additions and 10 deletions

View File

@ -1270,7 +1270,8 @@ img { max-width: 100%; display: block; }
transition: opacity 0.6s ease, visibility 0.6s ease; transition: opacity 0.6s ease, visibility 0.6s ease;
} }
.loader.hidden { .loader.hidden,
.loader.loader-done {
opacity: 0; opacity: 0;
visibility: hidden; visibility: hidden;
pointer-events: none; pointer-events: none;
@ -7477,7 +7478,7 @@ img { max-width: 100%; display: block; }
} }
.changelog-item li::before { .changelog-item li::before {
content: "•"; content: "\2022";
position: absolute; position: absolute;
left: 0; left: 0;
color: var(--accent-3); color: var(--accent-3);

View File

@ -101,6 +101,7 @@ export default function HomeClient(props: Props) {
{ threshold: 0.1, rootMargin: "0px 0px -50px 0px" } { threshold: 0.1, rootMargin: "0px 0px -50px 0px" }
); );
let scheduled = 0;
const observeAll = () => { const observeAll = () => {
document.querySelectorAll(".reveal:not(.visible)").forEach((el, i) => { document.querySelectorAll(".reveal:not(.visible)").forEach((el, i) => {
(el as HTMLElement).style.transitionDelay = `${(i % 6) * 0.1}s`; (el as HTMLElement).style.transitionDelay = `${(i % 6) * 0.1}s`;
@ -108,12 +109,21 @@ export default function HomeClient(props: Props) {
}); });
}; };
const schedule = () => {
if (scheduled) return;
scheduled = window.setTimeout(() => {
scheduled = 0;
observeAll(); observeAll();
const mo = new MutationObserver(observeAll); }, 80);
};
observeAll();
const mo = new MutationObserver(schedule);
mo.observe(document.body, { childList: true, subtree: true }); mo.observe(document.body, { childList: true, subtree: true });
return () => { return () => {
observer.disconnect(); observer.disconnect();
mo.disconnect(); mo.disconnect();
if (scheduled) clearTimeout(scheduled);
}; };
}, []); }, []);

View File

@ -1,18 +1,27 @@
"use client"; "use client";
import { useEffect } from "react"; import { useEffect, useState } from "react";
export default function Loader() { export default function Loader() {
const [done, setDone] = useState(false);
useEffect(() => { useEffect(() => {
const loader = document.getElementById("loader"); const hide = () => setDone(true);
const hide = () => loader?.classList.add("hidden"); const onLoad = () => setTimeout(hide, 900);
window.addEventListener("load", () => setTimeout(hide, 1800)); if (document.readyState === "complete") {
const t = setTimeout(hide, 3000); const t = setTimeout(hide, 900);
return () => clearTimeout(t); return () => clearTimeout(t);
}
window.addEventListener("load", onLoad);
const fallback = setTimeout(hide, 2200);
return () => {
window.removeEventListener("load", onLoad);
clearTimeout(fallback);
};
}, []); }, []);
return ( return (
<div className="loader" id="loader"> <div className={`loader${done ? " loader-done" : ""}`} id="loader" aria-hidden={done}>
<div className="loader-inner"> <div className="loader-inner">
<svg className="loader-globe" viewBox="0 0 80 80" fill="none"> <svg className="loader-globe" viewBox="0 0 80 80" fill="none">
<circle cx="40" cy="40" r="35" stroke="url(#loaderGrad)" strokeWidth="3" strokeDasharray="60 160" className="loader-ring" /> <circle cx="40" cy="40" r="35" stroke="url(#loaderGrad)" strokeWidth="3" strokeDasharray="60 160" className="loader-ring" />