/* 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.title} )}
№ {post.ref} {post.category}
{post.date}

{post.title}

{post.excerpt}

{readLabel}
); } window.Philosophy = Philosophy;