/* global React, useReveal, useLocale */
// Jullia — Philosophy. A blog-like index of short essays in the atelier's own
// voice: cover image, category, title, excerpt. Clicking an entry opens
// PhilosophyDetail. Data-driven by window.JULLIA_BLOG_POSTS.
function Philosophy({ onOpen }) {
const { Eyebrow } = window.JulliaDesignSystem_b654aa;
const { t, localize } = useLocale();
const posts = (window.JULLIA_BLOG_POSTS || []).map(localize);
const ref = useReveal();
return (
{/* Header statement */}
{t('philosophy.eyebrow')}
{t('philosophy.heroTitle')}
{t('philosophy.heroSub')}
{/* Entries — the blog grid */}
{t('philosophy.entriesLabel')}
{posts.length} {t('philosophy.entries')}
{posts.map((post) => (
))}
);
}
// A single blog entry tile — cover image, ref/date, category, title, excerpt.
// The whole tile is clickable, like the commission tiles elsewhere on the site.
function PostTile({ post, readLabel, onOpen }) {
const [hover, setHover] = React.useState(false);
return (
onOpen && onOpen(post.id)}
onMouseEnter={() => setHover(true)}
onMouseLeave={() => setHover(false)}
style={{ cursor: 'pointer', border: '1px solid var(--hairline)', borderColor: hover ? 'var(--hairline-strong)' : 'var(--hairline)', transition: 'border-color var(--dur-med) var(--ease-quiet)', background: 'var(--surface)' }}
>
{post.cover && (

)}
№ {post.ref}
{post.category}
{post.date}
{post.title}
{post.excerpt}
{readLabel} →
);
}
window.Philosophy = Philosophy;