A modern SvelteKit-based website for Tandem IT, built with Svelte 5, TailwindCSS 4, and TypeScript. This application showcases Tandem IT's services in network infrastructure and cybersecurity, providing an engaging user experience with smooth navigation and responsive design.
- Framework: SvelteKit (Svelte 5) with TypeScript
- Styling: TailwindCSS 4 with custom design system
- Icons: Lucide Svelte & Tabler Icons
- Fonts: Poppins & Space Grotesk Variable
- Package Manager: pnpm
- Deployment: Docker with Node.js
- Testing: Playwright for E2E tests
src/
βββ components/ # Reusable Svelte components
β βββ Header.svelte # Navigation with smooth scrolling & active states
β βββ Footer.svelte # Site footer
β βββ Aanpak.svelte # Approach section (id: "aanpak")
β βββ Goals.svelte # Mission section (id: "missie")
β βββ Bewijs.svelte # Cases section (id: "cases")
β βββ Enthousiast.svelte # Enthusiasm section
β βββ Team.svelte # Team showcase
β βββ about/ # About page components
β β βββ About.svelte
β βββ projects/ # Project showcase components
β βββ Makecenter.svelte
β βββ Makerspace.svelte
βββ routes/ # SvelteKit file-based routing
β βββ +layout.svelte # Global layout with Header/Footer
β βββ +page.svelte # Homepage
β βββ +error.svelte # Custom error page (404, 500, etc.)
β βββ [...catchall]/ # Catch-all route for 404s
β βββ about/ # About page
β βββ contact/ # Contact page
β βββ projects/ # Projects page
βββ lib/ # Shared utilities and API data
β βββ api/ # Static JSON data
β β βββ listMembers.json
β β βββ summaryReport.json
β βββ index.ts
βββ app.css # Global styles with custom CSS variables
βββ app.html # HTML template
βββ app.d.ts # TypeScript declarations
- Node.js 23.2.0 or higher
- pnpm 9.14.4 or higher
-
Install dependencies:
pnpm install
-
Start development server:
pnpm run dev # Or open in browser automatically pnpm run dev -- --open -
Available Scripts:
pnpm run dev # Start development server pnpm run build # Build for production pnpm run preview # Preview production build pnpm run check # Type checking with svelte-check pnpm run check:watch # Type checking in watch mode pnpm run format # Format code with Prettier pnpm run lint # Check code formatting pnpm run test:e2e # Run Playwright E2E tests
The application uses a carefully crafted design system with CSS custom properties:
/* Primary (Green) */
--color-primary-300: #2ced94 /* Active states, CTAs */
--color-primary-400: #1dce7c /* Hover states */
--color-primary-500: #13a260 /* Primary buttons */
/* Secondary (Blue-grey) */
--color-secondary-50: #ffffff /* Text on dark backgrounds */
--color-secondary-200: #b9cbcc /* Subtle text */
--color-secondary-600: #1a545a /* Card backgrounds */
--color-secondary-700: #004147 /* Section backgrounds */
--color-secondary-800: #002124 /* Dark backgrounds */
--color-secondary-900: #000000 /* Deepest backgrounds */
/* Accent (Warm orange) */
--color-accent-300: #fdba74 /* Warning states */
--color-accent-400: #fb923c /* Hover accents */
--color-accent-500: #f97316 /* Accent buttons */- Primary Font: Poppins (body text, UI elements)
- Display Font: Space Grotesk Variable (headings, brand elements)
The homepage consists of several key sections that can be easily modified:
<h1 class="font-grotesk text-secondary-50 mb-4 text-6xl leading-tight font-medium">
Your main headline here
</h1>
<p class="max-w-lg text-lg">
Your description text here
</p>- Section ID:
aanpak(for navigation) - Purpose: Explain your methodology
- Navigation: Linked from Header "Aanpak"
- Section ID:
missie(for navigation) - Purpose: Company goals and objectives
- Navigation: Linked from Header "Missie"
- Data Structure:
interface Objective { icon: typeof Globe; title: string; description: string; }
- Section ID:
cases(for navigation) - Purpose: Showcase projects and case studies
- Navigation: Linked from Header "Cases"
The main navigation is controlled in src/components/Header.svelte:
const links = [
{ href: '/', name: 'Home', id: null },
{ href: '/#aanpak', name: 'Aanpak', id: 'aanpak' },
{ href: '/#missie', name: 'Missie', id: 'missie' },
{ href: '/#cases', name: 'Cases', id: 'cases' },
{ href: '/about', name: 'Over ons', id: null }
];To add a new section:
- Create the component with a unique
idattribute - Add it to the homepage in
src/routes/+page.svelte - Update the
linksarray inHeader.svelte - Update the Intersection Observer selector in Header.svelte
- Create route directory:
src/routes/your-page/ - Add page component:
src/routes/your-page/+page.svelte - Update navigation: Add to
linksarray inHeader.svelte
Example:
<!-- src/routes/services/+page.svelte -->
<script lang="ts">
// Your page logic
</script>
<div class="wrapper">
<h1>Services Page</h1>
<!-- Your page content -->
</div>- Automatic active section highlighting using Intersection Observer
- Smooth scroll behavior for anchor links
- Mobile-responsive navigation with slide-out menu
- Custom 404/500 error pages with consistent design
- Catch-all route for undefined paths
- User-friendly error messages in Dutch
- Mobile-first approach with Tailwind breakpoints
- Adaptive navigation for mobile/desktop
- Optimized images and assets
- Svelte 5 with modern runes for optimal reactivity
- Static generation with SvelteKit
- Optimized font loading and CSS
The application includes Docker configuration for production deployment:
# Build Docker image
docker build -t tandem-web-app .
# Run container
docker run -p 3000:3000 tandem-web-app# Development
docker-compose -f dev.compose.yml up
# Production
docker-compose -f compose.yml up# Run all tests
pnpm run test:e2e
# Run tests in UI mode
pnpm exec playwright test --ui
# Generate test report
pnpm exec playwright show-report- Navigation not working: Ensure section IDs match the
idvalues in Header.svelte links - Styles not applying: Check that CSS custom properties are properly defined in app.css
- Build errors: Run
pnpm run checkto identify TypeScript issues
- Use
pnpm run check:watchfor continuous type checking - Test responsive design using browser dev tools
- Verify smooth scrolling behavior across different browsers
- Check console for any Intersection Observer warnings
WTFPL - Do What The Fuck You Want To Public License v2.0
See the LICENSE file for full details. In short: you can do whatever the fuck you want with this code! π
For questions or support, contact the development team or create an issue in the project repository.