2012
Start van het bureau
Een compact ontwikkelteam dat software bouwt die jaren meegaat.
Alle Woordenboek · In het kortcomponentEen component is een afgebakend onderdeel van software met een eigen taak en een duidelijke manier om met andere onderdelen samen te werken.Lees meer worden aangestuurd via JSX-commentaren boven het markdown-element. De algemene syntaxis is:
{/* prop="waarde" andere-prop="waarde" */}
(markdown-element hieronder)Sectie-componenten (Hero, SideBySide, Showcase, FeatureSection, FeatureListSection, TechnologySection, KeyTakeaways, TestimonialCarousel, CaseStudyCarousel, CaseOverview, FAQ, Timeline) worden afgesloten met een horizontale lijn (---).
De Hero is het eerste blok op een pagina. Het ondersteunt een achtergrondafbeelding, titel, opsommingslijst en actieknoppen.
Een pagina met layout: page en dit hero-blok krijgt een pageKind in de frontmatter. Dit bepaalt de hoogte, uitlijning, ornamentiek en het toegestane aantal bullets en knoppen. Zet daarom geen losse height, grid, hexagons of align op de hero-directive.
pageKind | Gebruik | Bullets | Knoppen |
|---|---|---|---|
section-overview | Hoofdoverzicht | maximaal 4 | maximaal 2 |
cluster-overview | Clusteroverzicht | geen | maximaal 1 |
service-detail, method-detail, technology-detail, longtail-landing | Detailpagina of gerichte landing | maximaal 3 | maximaal 1 |
utility | Praktische pagina of documentatie | geen | maximaal 1 |
De optionele overline kan als tekst op de hero-directive blijven staan. Cases en blogartikelen krijgen hun hero automatisch uit hun layout. Contact en Ons team gebruiken een eigen openingsblok.
Op een commentaar voor een link-paragraaf:
| Prop | Waarden |
|---|---|
color | primary, secondary, gray |
icon | arrow-right |
---
layout: page
pageKind: utility
title: Voorbeeldpagina
description: Een voorbeeld van een praktische pagina met een compacte hero.
---
{/* hero */}

# Voorbeeld _hero_
Een korte introductie met één vervolgstap.
{/* color="secondary" icon="arrow-right" */}
[Bekijk cases](/cases)
---Toont een afbeelding naast tekst. De positie van de afbeelding wordt automatisch bepaald: staat de afbeelding boven de tekst, dan verschijnt deze links. Staat de afbeelding onder de tekst, dan verschijnt deze rechts.
| Prop | Waarden | Standaard |
|---|---|---|
background | white, light-grey, dark-secondary, dark-primary, dark-gray | white |
shapes | kommagescheiden: hexagon, dots, rhombus, arrow, polygons | — |
 — Afbeelding```mermaid-diagram of een codeblok (zie hieronder)#### — Overline## — Titel (ondersteunt *emphasis*)- lijst — Bulletlijst (optioneel, ondersteunt **vet** labels)[tekst](url) — Actielink (met optioneel {/* icon="arrow-right" */})De mediaplek accepteert een afbeelding, een mermaid-diagram of een codeblok. Voor een diagram of codeblok geldt dezelfde positielogica (boven de tekst = links, eronder = rechts) en kun je met een commentaar erboven de achtergrond bepalen, net als bij een los Code Block of Mermaid-diagram.
{/* side-by-side shapes="hexagon,dots,rhombus,arrow" */}

#### VOORBEELD • DOCUMENTATIE
## Afbeelding _links_
De afbeelding staat boven de tekst in de MDX, dus wordt deze links getoond. Dit is het standaardgedrag. Zorg voor een regel whitespace tussen tekst en afbeelding.
{/* icon="arrow-right" */}
[Meer informatie](/docs)
---VOORBEELD • DOCUMENTATIE
De afbeelding staat boven de tekst in de MDX, dus wordt deze links getoond. Dit is het standaardgedrag. Zorg voor een regel whitespace tussen tekst en afbeelding.
Meer informatie{/* side-by-side background="light-grey" shapes="polygons" */}
#### VOORBEELD • DOCUMENTATIE
## Afbeelding _rechts_
De afbeelding staat onder de tekst in de MDX, dus wordt deze rechts getoond. De achtergrond is light-grey met polygons shapes. Zorg voor een regel whitespace tussen tekst en afbeelding.

{/* icon="arrow-right" */}
[Meer informatie](/docs)
---VOORBEELD • DOCUMENTATIE
De afbeelding staat onder de tekst in de MDX, dus wordt deze rechts getoond. De achtergrond is light-grey met polygons shapes. Zorg voor een regel whitespace tussen tekst en afbeelding.
Meer informatie{/* side-by-side background="dark-secondary" shapes="polygons" */}

#### DONKERE VARIANT
## Dark-secondary _achtergrond_
Op donkere achtergronden wordt de tekst automatisch wit.
{/* icon="arrow-right" */}
[Bekijk meer](/docs)
---DONKERE VARIANT
Op donkere achtergronden wordt de tekst automatisch wit.
Bekijk meer{/* side-by-side shapes="hexagon,dots" */}
#### DIAGRAM • SIDE-BY-SIDE
## Diagram naast tekst
Zet een mermaid-diagram op de mediaplek in plaats van een afbeelding. Omdat het diagram onder de tekst staat, verschijnt het rechts.
{/* background="dark-secondary" */}
```mermaid
flowchart TD
A[Verzoek] --> B{In cache?}
B -->|Ja| C[Uit cache]
B -->|Nee| D[Ophalen]
D --> E[Opslaan]
```
{/* icon="arrow-right" */}
[Meer informatie](/docs)
---Resultaat:
DIAGRAM • SIDE-BY-SIDE
Zet een mermaid-diagram op de mediaplek in plaats van een afbeelding. Omdat het diagram onder de tekst staat, verschijnt het rechts.
Meer informatie{/* side-by-side background="light-grey" shapes="polygons" */}
{/* background="dark-gray" */}
```typescript
export function greet(name: string) {
return `Hallo, ${name}!`;
}
```
#### CODE • SIDE-BY-SIDE
## Codeblok naast tekst
Ook een codeblok kan de mediaplek innemen. Omdat het codeblok boven de tekst staat, verschijnt het links.
---Resultaat:
CODE • SIDE-BY-SIDE
Ook een codeblok kan de mediaplek innemen. Omdat het codeblok boven de tekst staat, verschijnt het links.
export function greet(name: string) {
return `Hallo, ${name}!`;
}Toont feature-inhoud in een kaartgrid of — met variant="list" — als een scrollbare lijst met detailpaneel. Beide varianten ondersteunen optionele achtergrondpatronen.
| Prop | Waarden |
|---|---|
gridPattern | left, right, both, none |
variant | list (optioneel; zonder variant = kaartgrid) |
| Prop | Waarden |
|---|---|
icon | settings, pencil, arrow-right, etc. |
#### — Overline## — Titel (ondersteunt *emphasis*){/* feature icon="..." */} — Start van elke kaart### — Kaarttitel[tekst](url) — Optionele kaartlink{/* icon="arrow-right" */}) — Sectie-actie{/* feature-section gridPattern="both" */}
#### Documentatie voorbeeld
## Wat we kunnen _betekenen_
{/* feature icon="settings" */}
### Software ontwikkeling
Donec condimentum sit amet magna vel tincidunt. Sed ullamcorper tortor.
[Bekijk cases](/cases)
{/* feature icon="pencil" */}
### Doorontwikkeling
Donec condimentum sit amet magna vel tincidunt. Sed ullamcorper tortor.
[Bekijk cases](/cases)
{/* feature icon="arrow-right" */}
### Support & onderhoud
Donec condimentum sit amet magna vel tincidunt. Sed ullamcorper tortor.
[Bekijk cases](/cases)
{/* icon="arrow-right" */}
[Ontdek onze diensten](/diensten)
---Documentatie voorbeeld
Donec condimentum sit amet magna vel tincidunt. Sed ullamcorper tortor.
Donec condimentum sit amet magna vel tincidunt. Sed ullamcorper tortor.
variant="list")Gebruik dezelfde {/* feature-section ... */} directive met variant="list". Sub-secties blijven {/* feature icon="..." */} heten.
#### — Overline (sectie)## — Titel (sectie, ondersteunt *emphasis*){/* feature icon="..." */} — Start van elk lijstitem#### — Subtitel van het item (getoond in lijst en detailpaneel)### — Titel van het item[tekst](url) — Optionele itemlink{/* icon="arrow-right" */}) — Sectie-actie{/* feature-section variant="list" gridPattern="both" */}
#### Documentatie voorbeeld
## Wat we kunnen _betekenen_
{/* feature icon="settings" */}
#### Van idee tot werkende applicatie
### Software ontwikkeling
Wij bouwen software op maat die naadloos aansluit op jouw processen.
[Bekijk onze projecten](/cases)
{/* feature icon="pencil" */}
#### Bestaande systemen verbeteren
### Software doorontwikkeling
Bestaande applicaties verdienen aandacht. We moderniseren verouderde systemen en voegen nieuwe functionaliteit toe.
[Meer over doorontwikkeling](/cases)
{/* feature icon="wrench" */}
#### Altijd up-to-date en stabiel
### Support & onderhoud
Jouw software blijft bij ons in goede handen met proactief onderhoud en korte lijnen voor support.
[Ontdek ons supportteam](/cases)
{/* icon="arrow-right" */}
[Ontdek onze diensten](/diensten)
---Documentatie voorbeeld
Wij bouwen software op maat die naadloos aansluit op jouw processen.
Bestaande applicaties verdienen aandacht. We moderniseren verouderde systemen en voegen nieuwe functionaliteit toe.
Jouw software blijft bij ons in goede handen met proactief onderhoud en korte lijnen voor support.
Van idee tot werkende applicatie
Wij bouwen software op maat die naadloos aansluit op jouw processen.
Toont een tabblad-sectie met technologiecategorieën. Elke tab heeft een linkerkolom (titel en introductietekst), een donkere kaart met bulletpoints en een rij technologie-logo's. Op de homepage staat dit blok doorgaans direct onder Feature Section; gebruik overlapPrevious="false" wanneer er geen sectie boven staat die visueel moet aansluiten.
| Prop | Waarden | Standaard |
|---|---|---|
titleEmphasis | tekst | — |
buttonText | tekst | Bekijk alle |
buttonHref | URL | /technologie |
overlapPrevious | true, false | true |
Vóór de eerste {/* technology */} (sectie-intro):
#### — Overline## — Titel (zonder emphasis; gebruik titleEmphasis voor het cursieve deel)Per technologie-tab (herhaal {/* technology */}):
Attribuut op {/* technology ... */} | Beschrijving |
|---|---|
label | Tablabel in de tabbalk |
leftTitle | Titel in de linkerkolom wanneer deze tab actief is |
Markdown per tab:
### — Titel op de donkere kaart (cardTitle)leftDescription)- lijst — Bulletpoints op de kaart; gebruik een em dash (—) tussen titel en beschrijving, bijv. - Titel — Beschrijving — Technologie-logo's (één of meer afbeeldingen op rootniveau, niet ingesprongen onder een lijstitem){/* technology-section overlapPrevious="false" titleEmphasis="technologieën" buttonText="Bekijk alle" buttonHref="/technologie" */}
#### hoe we dat doen
## Onze
Donec condimentum sit amet magna vel tincidunt. Sed ullamcorper tortor.
{/* technology label="Back-end" leftTitle="Back-end" */}
### Lorem ipsum dolor
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Donec condimentum sit amet magna vel tincidunt.
- Kwalitatieve technische fundering — Robuuste systemen die meegroeien.
- Proactieve monitoring — Real-time inzicht in performance.


{/* technology label="Front-end" leftTitle="Front-end" */}
### Moderne interfaces
Onze front-end specialisten bouwen snelle, toegankelijke interfaces.
- Moderne frameworks — React, Vue, Angular en Qwik.
- Performance optimalisatie — Snelle laadtijden op elk apparaat.


---hoe we dat doen
Donec condimentum sit amet magna vel tincidunt. Sed ullamcorper tortor.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Donec condimentum sit amet magna vel tincidunt.
Een carousel met getuigenissen (citaat, avatar, naam en rol). Het grid-patroon op de achtergrond is configureerbaar; autoplay is optioneel.
Elke getuigenis begint met {/* testimonial */} (vergelijkbaar met {/* feature */} bij Feature Section). Er is geen sectie-intro vóór de eerste getuigenis: plaats direct {/* testimonial-carousel ... */} gevolgd door {/* testimonial */} en de markdown per slide.
| Prop | Waarden | Standaard |
|---|---|---|
gridPattern | left, right, both, none | — |
autoplayEnabled | true, false | — (autoplay uit) |
autoplayInterval | milliseconden als string, bijv. 6000 | 5000 wanneer autoplay aan staat |
## — Citaat (ondersteunt *emphasis*) — Avatarafbeelding### — Naam{/* testimonial-carousel gridPattern="both" */}
{/* testimonial */}
## 10KB levert precies wat ze beloven — en meer.

### Alex de Vries
CTO bij Voorbeeld BV
{/* testimonial */}
## Tweede getuigenis met _nadruk_.

### Jamie Jansen
Product owner
---Alex de Vries
CTO bij Voorbeeld BV
Jamie Jansen
Product owner
Codeblokken worden automatisch voorzien van syntax highlighting via Shiki. Pas de achtergrondkleur, breedte en decoratieve vormen aan met een commentaar boven het codeblok.
| Prop | Waarden | Standaard |
|---|---|---|
background | dark-gray, light-grey, white, dark-secondary, dark-primary | dark-gray |
contentWidth | proseWide | prose (720px) |
shapes | tech, dots, hexagon, polygons | — |
typescript, javascript, jsx, tsx, css, html, json, bash, shell, yaml, markdown, python, sql, diff, text
```typescript
const greeting: string = "Hello, world!";
function greet(name: string): string {
return `Hello, ${name}!`;
}
console.log(greet("10KB"));
```const greeting: string = "Hello, world!";
function greet(name: string): string {
return `Hello, ${name}!`;
}
console.log(greet("10KB"));{/* background="light-grey" */}
```typescript
interface User {
id: number;
name: string;
email: string;
}
const user: User = {
id: 1,
name: "Ewout",
email: "ewout@10kb.nl",
};
```interface User {
id: number;
name: string;
email: string;
}
const user: User = {
id: 1,
name: "Ewout",
email: "ewout@10kb.nl",
};{/* background="dark-primary" shapes="hexagon" */}
```css
.container {
display: flex;
flex-direction: column;
gap: 1.5rem;
max-width: 720px;
margin: 0 auto;
}
@media (min-width: 768px) {
.container {
flex-direction: row;
}
}
```.container {
display: flex;
flex-direction: column;
gap: 1.5rem;
max-width: 720px;
margin: 0 auto;
}
@media (min-width: 768px) {
.container {
flex-direction: row;
}
}{/* background="dark-gray" shapes="tech" contentWidth="proseWide" */}
```javascript
async function fetchData(url) {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`);
}
return response.json();
}
const data = await fetchData("/api/users");
console.log(data);
```async function fetchData(url) {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`);
}
return response.json();
}
const data = await fetchData("/api/users");
console.log(data);{/* background="dark-gray" shapes="polygons" */}
```typescript
export type Result<T, E = Error> = { ok: true; value: T } | { ok: false; error: E };
function divide(a: number, b: number): Result<number> {
if (b === 0) return { ok: false, error: new Error("Deling door nul") };
return { ok: true, value: a / b };
}
```export type Result<T, E = Error> = { ok: true; value: T } | { ok: false; error: E };
function divide(a: number, b: number): Result<number> {
if (b === 0) return { ok: false, error: new Error("Deling door nul") };
return { ok: true, value: a / b };
}{/* background="light-grey" shapes="dots" */}
```json
{
"name": "website",
"version": "1.0.0",
"dependencies": {
"@builder.io/qwik": "^1.12.1",
"@builder.io/qwik-city": "^1.12.1"
}
}
```{
"name": "website",
"version": "1.0.0",
"dependencies": {
"@builder.io/qwik": "^1.12.1",
"@builder.io/qwik-city": "^1.12.1"
}
}{/* background="white" */}
```bash
# Installeer dependencies en start de dev server
npm install
npm run dev
# Bouw voor productie
npm run build
npm run preview
```# Installeer dependencies en start de dev server
npm install
npm run dev
# Bouw voor productie
npm run build
npm run preview{/* background="dark-secondary" */}
```typescript
import { component$, useSignal } from "@builder.io/qwik";
export const Counter = component$(() => {
const count = useSignal(0);
return (
<div>
<p>Count: {count.value}</p>
<button onClick$={() => count.value++}>Increment</button>
</div>
);
});
```import { component$, useSignal } from "@builder.io/qwik";
export const Counter = component$(() => {
const count = useSignal(0);
return (
<div>
<p>Count: {count.value}</p>
<button onClick$={() => count.value++}>Increment</button>
</div>
);
});Mermaid-diagrammen worden geschreven als een ```mermaid-codeblok. Ze worden tijdens development (pnpm dev) door een headless browser omgezet naar een statische SVG die in de repository wordt vastgelegd (src/assets/mermaid/). De productie- en CI-build lezen alleen die vastgelegde SVG en starten dus nooit een browser. Achtergrond en decoratieve vormen werken exact zoals bij het Code Block: via een commentaar boven het blok.
Ontbreekt de SVG tijdens een productie-build, dan faalt de build met een duidelijke melding — draai dan lokaal pnpm dev of pnpm mermaid:render en Woordenboek · In het kortcommitEen commit is een vastgelegde versie van bestanden in een systeem voor versiebeheer. Elke commit vormt een punt in de ontwikkelgeschiedenis van een project.Lees meer het gegenereerde bestand.
| Prop | Waarden | Standaard |
|---|---|---|
background | dark-gray, light-grey, white, dark-secondary, dark-primary | dark-gray |
contentWidth | proseWide | prose (720px) |
shapes | tech, dots, hexagon, polygons | — |
title | Toegankelijke omschrijving van het diagram | — |
```mermaid
flowchart LR
A[Start] --> B{Beslissing}
B -->|Ja| C[Oké]
B -->|Nee| D[Stop]
```Resultaat:
{/* background="dark-primary" shapes="hexagon" title="Deploymentflow" */}
```mermaid
sequenceDiagram
participant Dev
participant CI
participant Prod
Dev->>CI: Push commit
CI->>Prod: Deploy build
Prod-->>Dev: Status
```Resultaat:
{/* background="light-grey" */}
```mermaid
flowchart TD
A[Idee] --> B[Ontwerp]
B --> C[Implementatie]
C --> D[Release]
```Resultaat:
Een uitgebreid diagram met subgraphs, verschillende vormen (stadium, parallelogram, ruit, subroutine, database, hexagon, asymmetrisch), diverse pijltypes (normaal, gestippeld, dik) en classDef-styling.
{/* background="dark-secondary" shapes="polygons" contentWidth="proseWide" title="Verwerkingspijplijn" */}
```mermaid
flowchart TB
Start([Start]) --> Input[/Invoer/]
Input --> Validate{Valide?}
Validate -->|Nee| Error[[Foutafhandeling]]
Validate -->|Ja| Process
subgraph Process [Verwerking]
direction LR
Load[(Database)] --> Transform[Transformeer]
Transform --> Cache{{Cache}}
Cache -.-> Queue[/Wachtrij/]
end
Process ==> Decision{Klaar?}
Decision -->|Nee| Retry(Opnieuw proberen)
Retry --> Process
Decision -->|Ja| Report[Rapport]
Report --> Notify>Notificatie]
Notify --> Done([Einde])
Error --> Done
classDef success fill:#023020,stroke:#0a5c3e,color:#fff;
classDef danger fill:#a47b0f,stroke:#e2aa14,color:#fff;
class Done,Report success;
class Error danger;
```Resultaat:
Afbeeldingen in de body kunnen voorzien worden van decoratieve vormen via een variant prop.
| Prop | Waarden |
|---|---|
variant | rhombus-left-arrow-right, arrow-left-hexagon-right |
contentWidth | proseWide |
{/* variant="rhombus-left-arrow-right" */}
{/* variant="arrow-left-hexagon-right" */}
{/* variant="rhombus-left-arrow-right" contentWidth="proseWide" */}
Een uitgelicht citaat met optionele auteur en rol.
| Prop | Waarden |
|---|---|
author | tekst |
role | tekst |
contentWidth | proseWide |
{/* pull-quote author="Ewout" role="Founder 10KB" */}
> Software ontwikkeling is een continu proces van verbetering en innovatie. Een vast team dat jouw domein begrijpt maakt het verschil.Software ontwikkeling is een continu proces van verbetering en innovatie. Een vast team dat jouw domein begrijpt maakt het verschil.
Ewout — Founder 10KB
{/* pull-quote author="Google DeepMind" role="Productaankondiging" contentWidth="proseWide" */}
> Gemini 2.5 Pro leidt toonaangevende benchmarks voor coding, wiskunde en wetenschap en is nu breed beschikbaar via de Gemini API.Gemini 2.5 Pro leidt toonaangevende benchmarks voor coding, wiskunde en wetenschap en is nu breed beschikbaar via de Gemini API.
Google DeepMind — Productaankondiging
Een gestileerde lijst met vetgedrukte titels en beschrijvingen. Wordt gebruikt voor samenvattingen of feature-overzichten.
{/* article-list */}
- **Server-side rendering** Alle syntax highlighting wordt server-side uitgevoerd via Shiki, zonder JavaScript in de browser.
- **Comment-syntaxis** Componenten worden aangestuurd via JSX-commentaren, geen imports nodig.
- **Automatische theme-detectie** Donkere achtergronden krijgen automatisch een donker kleurenschema en vice versa.Server-side rendering
Alle syntax highlighting wordt server-side uitgevoerd via Shiki, zonder JavaScript in de browser.
Comment-syntaxis
Componenten worden aangestuurd via JSX-commentaren, geen imports nodig.
Automatische theme-detectie
Donkere achtergronden krijgen automatisch een donker kleurenschema en vice versa.
Een opvallend blok met de belangrijkste punten, afgesloten met een horizontale lijn.
| Prop | Waarden | Standaard |
|---|---|---|
contentWidth | default, proseWide | default |
{/* key-takeaways contentWidth="default" */}
## Key _takeaways_
- Alle componenten gebruiken de comment-syntaxis voor configuratie
- Sectie-componenten worden afgesloten met ---
- Achtergrondkleuren en vormen zijn beschikbaar voor meerdere componenten
- Afbeeldingspositie bij SideBySide wordt automatisch bepaald
---Alle componenten gebruiken de comment-syntaxis voor configuratie
Sectie-componenten worden afgesloten met ---
Achtergrondkleuren en vormen zijn beschikbaar voor meerdere componenten
Afbeeldingspositie bij SideBySide wordt automatisch bepaald
Toont een achtergrondafbeelding met een donker-naar-transparant verloop, grid-patroon en content aan een configureerbare zijde. De eerste paragraaf wordt vet weergegeven als lead-tekst.
| Prop | Waarden | Standaard |
|---|---|---|
grid | true, false | true |
align | left, right | left |
 — Achtergrondafbeelding#### — Overline## — Titel (ondersteunt *emphasis*)- lijst — Bulletlijst (optioneel, ondersteunt **vet** labels)[tekst](url) — Actielink (met optioneel {/* icon="arrow-right" */}){/* showcase */}

#### TECHNIEK 1 • TECHNIEK 2 • TECHNIEK 3
## Toegevoegde waarde als vaste IT _partner_
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque sed lacus ultrices, blandit elit vitae, imperdiet tortor.
Donec condimentum sit amet magna vel tincidunt. Sed ullamcorper tortor maximus, dignissim urna vulputate, tempor libero. Nunc hendrerit diam eu diam eleifend efficitur ut id mauris.
{/* icon="arrow-right" */}
[Lees meer](/cases)
---TECHNIEK 1 • TECHNIEK 2 • TECHNIEK 3
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque sed lacus ultrices, blandit elit vitae, imperdiet tortor.
Donec condimentum sit amet magna vel tincidunt. Sed ullamcorper tortor maximus, dignissim urna vulputate, tempor libero. Nunc hendrerit diam eu diam eleifend efficitur ut id mauris.
Lees meer{/* showcase align="right" */}

#### SOFTWARE ONTWIKKELING
## Mission critical _software_
Wij bouwen software die betrouwbaar, veilig en schaalbaar is.
Donec condimentum sit amet magna vel tincidunt. Sed ullamcorper tortor maximus.
{/* icon="arrow-right" */}
[Ontdek onze diensten](/diensten)
---SOFTWARE ONTWIKKELING
Wij bouwen software die betrouwbaar, veilig en schaalbaar is.
Donec condimentum sit amet magna vel tincidunt. Sed ullamcorper tortor maximus.
Ontdek onze dienstenToont een accordion met veelgestelde vragen, optionele introductietekst en een optionele actieknop. De sectie wordt afgesloten met een horizontale lijn.
Gebruik een kleine letter in het openingscommentaar: {/* faq ... */}. Commentaar zoals {/* FAQ ... */} wordt niet als directive herkend.
| Prop | Waarden | Standaard |
|---|---|---|
contentWidth | default, proseWide | default |
background | white, light-grey | white |
Gebruik background="light-grey" als de FAQ direct na key takeaways staat. De achtergrond loopt over de volle breedte; de vragen en antwoorden blijven op witte vlakken staan.
{/* faq ... */} — Optioneel contentWidth en background (zoals background="light-grey").## — Sectietitel (ondersteunt *emphasis*).### — Optionele introductie (subheader).### — Vraag; daaropvolgende paragrafen en lijsten tot de volgende ### — Antwoord.{/* icon="arrow-right" */} en een link naar de actie (CTA).--- — Einde sectie.{/* faq contentWidth="default" background="light-grey" */}
## Veelgestelde _vragen_
Korte intro vóór de vragen.
### Eerste vraag?
Hier het antwoord. Met een [link](/docs).
### Tweede vraag?
Nog een antwoord.
Nog niet gevonden?
{/* icon="arrow-right" */}
[Neem contact op](/contact)
---Korte intro vóór de vragen.
Hier het antwoord. Met een link.
Nog een antwoord.
Nog niet gevonden?
Neem contact opToont een carrousel met casestudy-kaarten naast een introductiekolom. De directive beschrijft de selectie-intentie; kaartcopy, assets en volgorde komen uit de centrale case-registry.
| Prop | Waarden | Standaard |
|---|---|---|
placement | home, generic, context | verplicht, tenzij context is gezet |
context | een gecontroleerde contexttag uit W03 | — |
limit | positief geheel getal | 6, context standaard 3 |
autoplay | true, false | — (uit component: autoplay uit) |
interval | milliseconden als geheel getal | 5000 (als autoplay gezet wordt) |
#### — Overline## — Titel (ondersteunt *emphasis* in de Markdown-bron)--- — Einde van de carouselVoeg geen handgeschreven {/* case */}-blokken toe. De registry levert alleen
cases die voor de locale en placement door de publicatiegate komen. Het
casesoverzicht op /cases gebruikt {/* case-overview */} in plaats van deze
carousel.
{/* case-study-carousel placement="generic" limit="6" */}
#### ONS WERK
## Cases waar we _trots_ op zijn
Eerste intro paragraaf.
Tweede intro paragraaf.
---ONS WERK
Eerste intro paragraaf.
Tweede intro paragraaf.
{/* case-study-carousel placement="generic" limit="6" autoplay="true" interval="6000" */}
#### CARROUSEL
## Met _autoplay_
Korte intro.
---CARROUSEL
Korte intro.
Toont alle gepubliceerde cases op /cases als afwisselende side-by-side-secties.
Volgorde, copy, assets en de wisseling van achtergrond en beeldpositie komen
uit de centrale case-registry. De pagina schrijft alleen de directive; er
zijn geen extra props.
{/* case-overview */}--- — Einde van het overzicht{/* case-overview */}
---Toont een verticale tijdlijn met historische mijlpalen. Elke mijlpaal heeft een jaartal, een titel en een korte beschrijving. De sectie wordt afgesloten met een horizontale lijn.
| Prop | Waarden | Standaard |
|---|---|---|
background | white, light-grey, dark-secondary, dark-primary, dark-gray | white |
shapes | kommagescheiden: hexagon, dots, rhombus, arrow, polygons | — |
#### — Overline (optioneel)## — Titel (ondersteunt _nadruk_){/* milestone year="..." */} — Start van elke mijlpaal; year is verplicht (vrije tekst, bijvoorbeeld 2012, 2012–2014 of Nu)### — Titel van de mijlpaal (verplicht)--- — Einde van de sectieOp een donkere achtergrond wordt de tekstkleur automatisch meegeschakeld.
{/* timeline background="light-grey" shapes="hexagon,dots" */}
#### Documentatie voorbeeld
## Onze _geschiedenis_
Een korte tijdlijn van momenten die het bureau hebben gevormd.
{/* milestone year="2012" */}
### Start van het bureau
Een compact ontwikkelteam dat software bouwt die jaren meegaat.
{/* milestone year="2016" */}
### Groei van het team
Meer specialisten, dezelfde werkwijze en dezelfde aandacht voor kwaliteit.
{/* milestone year="Nu" */}
### Doorlopende samenwerking
Langetermijnpartnerschappen in plaats van eenmalige projecten.
---Documentatie voorbeeld
Een korte tijdlijn van momenten die het bureau hebben gevormd.
2012
Een compact ontwikkelteam dat software bouwt die jaren meegaat.
2016
Meer specialisten, dezelfde werkwijze en dezelfde aandacht voor kwaliteit.
Nu
Langetermijnpartnerschappen in plaats van eenmalige projecten.
Elke MDX-pagina begint met frontmatter. Er zijn drie layouts beschikbaar: page, blog en blog-overview. De blog-layout heeft een uitgebreid plugin-systeem dat velden automatisch berekent en overerft, en de blog-overview gebruikt diezelfde data om child-pagina's automatisch te tonen.
De URL waarop een MDX-pagina wordt geserveerd wordt automatisch afgeleid uit de bestandslocatie binnen pages/, met uitzondering van de speciale pages/home/ map.
De regels (in volgorde van prioriteit):
url (of slug) in frontmatter — wanneer aanwezig wint deze, met leading/trailing slashes gestript. Dit is de escape hatch om de map-gebaseerde URL te overschrijven (bijv. url: /andere-url of een locale-specifieke URL slug: /en/blog/my-article). Beide sleutels werken hetzelfde; url heeft voorrang wanneer beide aanwezig zijn.pages/home/ map — bestanden in deze map worden op de site-root geserveerd in plaats van onder de mapnaam. Het standaard-locale bestand (nl.mdx) komt op /, elke andere locale op /<locale> (bijv. en.mdx → /en). Deze pagina's krijgen automatisch inBreadcrumbs: false.pages/blog/post/nl.mdx → /blog/post.| Bestand | URL |
|---|---|
pages/home/nl.mdx | / |
pages/home/en.mdx | /en |
pages/diensten/nl.mdx | /diensten |
pages/blog/post/nl.mdx | /blog/post |
pages/blog/post/en.mdx (met slug: /en/blog/post) | /en/blog/post |
pages/diensten/maatwerk/nl.mdx (met url: /software-op-maat) | /software-op-maat |
---
layout: page
title: Paginatitel
description: Meta-beschrijving voor SEO.
------
layout: blog
title: Blogtitel - 10KB
heroTitle: "Titel met\nregelafbreking en *emphasis*"
description: Meta-beschrijving voor SEO.
image: ~/assets/photos/afbeelding.png
authorName: Ewout
date: 2026-01-15
tags: [continuity, software-development]
------
layout: blog-overview
overviewType: blog
title: Blog van 10KB - 10KB
heroTitle: "Inzichten over *softwareontwikkeling*"
description: Artikelen van 10KB over softwareontwikkeling, DevOps en maatwerksoftware.
---| Veld | Layout | Beschrijving |
|---|---|---|
layout | alle | page, blog of blog-overview |
title | alle | Paginatitel (SEO) |
description | alle | Meta-beschrijving |
url | alle | Overschrijf de map-gebaseerde URL (bijv. /software-op-maat). Alias van slug; url heeft voorrang. |
heroTitle | blog | Herotitel met *emphasis* en \n regelafbreking. Valt terug op title. |
image | blog | Hero-afbeelding, ondersteunt ~/assets/... paden |
authorName | blog | Auteursnaam |
date | blog | Publicatiedatum (YYYY-MM-DD) |
tags | blog | Array van tags, gebruikt voor gerelateerde artikelen |
showcase | blog | Boolean waarmee een blogartikel in de showcase-stroom van de blog-overview komt |
slug | blog | URL-pad voor locale-specifieke pagina's (bijv. /en/blog/my-article) |
inheritKeys | blog | Overschrijf welke velden overgeërfd worden (zie Locale-overerving) |
overviewType | blog-overview | Type overview-pagina, momenteel blog |
Deze velden worden door frontmatter-plugins berekend en hoeven niet handmatig ingesteld te worden.
| Veld | Bron | Beschrijving |
|---|---|---|
locale | bestandsnaam | Afgeleid van de bestandsnaam: nl.mdx → "nl", en.mdx → "en" |
readTime | inhoud | Berekend op basis van het aantal woorden (woorden ÷ 200, minimaal 1 minuut). Codeblokken worden overgeslagen. |
dateString | date + locale | Locale-bewuste opmaak van date, bijv. "15 januari 2026" voor NL |
relatedArticles | tags | Automatisch gegenereerd op basis van gedeelde tags. Toont maximaal 3 artikelen in dezelfde taal. Overline en titel worden automatisch vertaald per locale. |
posts | overview-plugin | Voor blog-overview: platte lijst van directe child-artikelen per locale, gesorteerd op datum (nieuwste eerst), gebruikt door de client-side filters |
inBreadcrumbs | pages/home/ map | Automatisch false voor pagina's in pages/home/. Kan handmatig worden overschreven door inBreadcrumbs expliciet in frontmatter te zetten. |
Blog-artikelen ondersteunen automatische overerving van velden tussen taalversies. Bestanden in dezelfde map worden aan elkaar gekoppeld.
Hoe het werkt:
slug veld, bijv. nl.mdx) is de bronslug veld, bijv. en.mdx) erven ontbrekende veldenStandaard overgeërfde velden: image, authorName, tags, date
Dit betekent dat je deze velden alleen in het standaardbestand hoeft in te stellen. De vertalingen erven ze automatisch.
Voorbeeld — standaardbestand (nl.mdx):
---
layout: blog
title: Hoe continuïteit waarde creëert - 10KB
heroTitle: "Hoe continuïteit waarde\ncreëert voor *bedrijven*"
description: Ontdek hoe continuïteit in software ontwikkeling waarde creëert.
image: ~/assets/photos/continuity.png
authorName: Ewout
date: 2026-01-15
tags: [continuity, software-development]
---Voorbeeld — locale-specifiek bestand (en.mdx in dezelfde map):
---
layout: blog
slug: /en/blog/how-continuity-creates-value
title: How Continuity Creates Value - 10KB
heroTitle: "How continuity creates\nvalue for *businesses*"
description: Discover how continuity in software development creates value.
---Het Engelse bestand erft automatisch image, authorName, tags en date van nl.mdx.
Overschrijven: Stel inheritKeys in om te bepalen welke velden overgeërfd worden:
---
inheritKeys: [image, date]
---Frontmatter-plugins worden in twee fasen uitgevoerd:
| Fase | Plugin | Actie |
|---|---|---|
| 1 — per bestand | localePlugin | Leidt locale af uit bestandsnaam |
| 1 — per bestand | readTimePlugin | Berekent readTime uit woordtelling |
| 1 — per bestand | homeBreadcrumbPlugin | Zet inBreadcrumbs: false voor pages/home/ |
| 2 — cross-file | localeInheritPlugin | Erft velden over van standaard-locale |
| 2 — cross-file | breadcrumbPlugin | Bouwt breadcrumb-crumbs en sibling-dropdowns |
| 2 — cross-file | dateFormatPlugin | Formatteert date naar dateString |
| 2 — cross-file | relatedArticlesPlugin | Genereert gerelateerde artikelen op basis van tags |
Fase 1 verwerkt elk bestand apart. Fase 2 draait over alle bestanden tegelijk, zodat latere plugins data zien die door eerdere plugins is verrijkt.
CONTACT
Heb je een vraag of wil je sparren over je software? Laat je gegevens achter, dan nemen we snel contact met je op.