// PROJECT_
El Dulce de la Nonna
01. LIVE_DEMO
// LIVE PREVIEW
El Dulce de la Nonna →
02. PROJECT_OVERVIEW
Business website for an artisan alfajores home-baker, built together with my regular development partner under our own studio, Dual-Stack Studio — a small GitHub organization we run to ship client and personal projects together. Customers browse the landing page and submit custom orders through a validated form — the order is dispatched as two transactional emails (owner notification + customer confirmation) with no database storage needed. Built as a server-rendered Laravel 13 monolith with Blade, Tailwind v4 and Carbon date validation enforcing a 48-hour advance order window.
Status
Active Development
Scope
Full-Stack Architecture
Primary Stack
Laravel 13
Repo
Public
03. TECH_STACK & ARCHITECTURE
//Server-rendered monolith — Blade views compiled server-side, zero client-side JS framework
//Orders are email-only: no DB table for encargos, two Mailables dispatched on successful validation
//Carbon enforces 48-hour advance order window — computed on request and re-validated server-side
//Tailwind v4 via Vite: custom design tokens (rosa-pastel, chocolate, crema) define the brand palette
//Two routes: GET /encargar (form) + POST /encargar (store) — standard Laravel resourceful pattern
//SQLite in dev for zero-config setup — swappable to MySQL/PostgreSQL via DATABASE_URL
Laravel 13 + PHP 8.3
Full-Stack Framework
Server-rendered monolith. MVC architecture: routes → controllers → views. Artisan CLI for migrations, mailables and dev tooling. Laravel Pail for real-time log tailing in development.
Blade Templates
View Layer — Templating
Server-side rendered HTML. Layouts via @extends/@section. Components for header and shared UI. No client-side JS framework — all interactivity handled by native browser behavior.
Tailwind CSS v4 + Vite
View Layer — Styling & Assets
Tailwind v4 via @tailwindcss/vite plugin — zero-config CSS bundling. Custom design tokens: rosa-pastel, chocolate, crema, rosa-fuerte. Vite compiles and hashes assets for production.
EncargoController
Controller — Order Flow
create() renders the order form with Carbon-computed minimum delivery date (now + 48h). store() validates the request, dispatches two Mailables and redirects with a success flash message.
Laravel Validation
Server-Side Validation
Request validation on store(): nombre, email, teléfono, dirección, fecha_entrega (after_or_equal: +48h enforced via Carbon), pedido (10–1000 chars). Custom Spanish error messages for all rules.
Laravel Mail + Mailables
Email System
Two Mailables: NuevoEncargoMail dispatched to the business owner (new order alert) and ConfirmacionEncargoClienteMail dispatched to the customer. Both use Blade email templates with order details.
Carbon
Date Handling
Computes the minimum allowed delivery date (Carbon::now()->addDays(2)) on every request — injected into the view and used as the after_or_equal validation constraint.
SQLite + Laravel Migrations
Database
SQLite for local development — zero-config, committed as database.sqlite. Orders are not persisted in the DB (email-only flow). Migrations manage the default Laravel users, cache and jobs tables.
PHPUnit 12
Testing
Laravel's built-in PHPUnit integration. Feature tests cover HTTP request/response cycles. phpunit.xml configures a separate in-memory SQLite instance so tests never touch the dev database.