Conference speaker website for Shaïman Thürler, AI specialist and founder of Le Futurologue - the leading French-language podcast on artificial intelligence.
Built with SvelteKit, Tailwind CSS v4, and shadcn-svelte components following Refactoring UI design principles.
adapter-cloudflare)# Install dependencies
pnpm install
# Start development server
pnpm run dev
# Open in browser at http://localhost:5173
pnpm run dev # Start dev server
pnpm run build # Build for production
pnpm run preview # Preview production build
pnpm run check # Type check (run before committing!)
pnpm run lint # Lint with ESLint + Prettier
pnpm run format # Format code with Prettier
src/
├── lib/
│ ├── assets/
│ │ ├── images/ # Photos (imported via Vite)
│ │ └── logos/ # Client logos
│ └── components/
│ ├── ui/ # shadcn-svelte components
│ ├── Section.svelte
│ ├── SectionHeading.svelte
│ └── FormField.svelte
├── routes/
│ └── +page.svelte # Main landing page
└── app.css # Complete design system
The design system uses 34 carefully crafted shades following Refactoring UI principles:
--dark-900 to --dark-300 (pure greys)--green-900 to --green-100 - --green-500 is primary CTA--yellow-900 to --yellow-100 - --yellow-500 is secondary--grey-900 to --grey-100 - subtle warmth, NOT pure greyKey principles:
See docs/design-plan.md for complete specifications.
This project uses Svelte 5 runes (not Svelte 4 patterns):
<!-- State management -->
<script>
let count = $state(0); // NOT: let count = 0
let doubled = $derived(count * 2); // NOT: $: doubled = count * 2
</script>
<!-- Props in components -->
<script>
interface Props {
theme?: 'light' | 'dark';
children: Snippet;
}
let { theme = 'light', children }: Props = $props();
</script>
<!-- Always use keys in #each -->
{#each items as item (item.id)} <!-- Required! -->
...
{/each}
Three reusable wrappers eliminate code repetition:
<!-- Section wrapper -->
<Section theme="dark" width="lg" padding="md">
<SectionHeading>My Heading</SectionHeading>
<!-- Content -->
</Section>
<!-- Form fields -->
<FormField
id="email"
name="email"
type="email"
label="Email"
required
/>
All images imported from $lib/assets/ for Vite optimization:
import heroImage from '$lib/assets/images/hero.jpeg';
<img src={heroImage} alt="..." />
<div style="background-image: url({heroImage});"></div>
Configured for Cloudflare Workers deployment:
pnpm run build.svelte-kit/cloudflare# Build the project
pnpm run build
# Deploy to Cloudflare Workers
wrangler deploy
Forms require server-side handling via SvelteKit form actions. See SvelteKit form actions documentation for details.
npx shadcn-svelte@latest add [component-name]
Currently installed: accordion, aspect-ratio, avatar, badge, button, card, carousel, input, label, separator, sonner, textarea
Private project © 2025 Le Futurologue