// Reusable primitives + sensual glyphs (no nooses, no knives)
const { useEffect, useRef, useState } = React;
function Reveal({ children, delay = 0, as = 'div', className = '', ...rest }) {
// Simple passthrough — animations on every scroll were causing intermittent
// invisibility bugs and adding visual noise. Content is always shown.
const Tag = as;
return (
{children}
);
}
// — Sensual glyphs —
// Dagger through a rose
function DaggerRose({ size = 24, color = 'currentColor' }) {
return (
);
}
// Ribbon-bow
function RibbonBow({ size = 24, color = 'currentColor' }) {
return (
);
}
// Lipstick kiss (a simple stylized mouth)
function KissMark({ size = 24, color = 'currentColor' }) {
return (
);
}
// Heart with a serpent
function SerpentHeart({ size = 24, color = 'currentColor' }) {
return (
);
}
// Apple with bite
function AppleBite({ size = 24, color = 'currentColor' }) {
return (
);
}
// Calligraphic ornament (florish/swash)
function Florish({ width = 200, color = 'currentColor' }) {
return (
);
}
// Snake (sensual, for series ornament)
function SnakeRose({ size = 24, color = 'currentColor' }) {
return (
);
}
function scrollToId(id) {
const el = document.getElementById(id);
if (!el) return;
const top = el.getBoundingClientRect().top + window.scrollY - 70;
window.scrollTo({ top, behavior: 'smooth' });
}
Object.assign(window, {
Reveal, scrollToId,
DaggerRose, RibbonBow, KissMark, SerpentHeart, AppleBite, Florish, SnakeRose });