Resume — CV & Portfolio
A single-column resume/CV template with an avatar header, contact links, summary, an experience timeline, a skills badge cloud, an education card and a minimal footer.
Preview
@props([])
@php
// Single-column resume / CV. Mostly inline primitive content with two composed
// blocks (an experience timeline and a minimal footer). All content is neutral
// placeholder data so it is safe to copy into any project.
$contactLinks = [
['platform' => 'email', 'label' => __('Email'), 'href' => 'mailto:you@example.com'],
['platform' => 'github', 'label' => __('GitHub'), 'href' => '#'],
['platform' => 'linkedin', 'label' => __('LinkedIn'), 'href' => '#'],
];
$skills = [
'TypeScript', 'React', 'Next.js', 'Laravel', 'PHP', 'Tailwind CSS',
'PostgreSQL', 'GraphQL', 'Node.js', 'Docker', 'AWS', 'Figma',
];
$education = [
[
'school' => 'University of Amsterdam',
'degree' => 'M.Sc. Computer Science',
'period' => '2014 — 2016',
'detail' => 'Specialisation in human–computer interaction. Graduated cum laude.',
],
[
'school' => 'Delft University of Technology',
'degree' => 'B.Sc. Software Engineering',
'period' => '2010 — 2014',
'detail' => 'Foundations in systems design, algorithms and distributed computing.',
],
];
@endphp
<div class="min-h-screen bg-background text-foreground">
<main class="mx-auto w-full max-w-3xl px-4 py-12 sm:px-6 sm:py-16 lg:py-20">
{{-- Header: avatar, identity, contact links, download CV --}}
<header class="flex flex-col items-start gap-6 sm:flex-row sm:items-center sm:justify-between">
<div class="flex items-center gap-6">
<x-ui.avatar size="xl" alt="Jordan Avery" fallback="JA" />
<div class="space-y-2">
<h1 class="text-2xl font-semibold tracking-tight text-foreground sm:text-3xl">{{ __('Jordan Avery') }}</h1>
<p class="text-base text-muted-foreground">{{ __('Senior Product Engineer') }}</p>
<p class="flex items-center gap-2 text-sm text-muted-foreground">
<svg class="size-4 shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z"/><circle cx="12" cy="10" r="3"/></svg>
{{ __('Amsterdam, Netherlands') }}
</p>
</div>
</div>
<div class="flex flex-col items-start gap-4 sm:items-end">
<x-ui.social-links :links="$contactLinks" size="sm" label="Contact links" />
<x-ui.button>
<x-slot:icon>
<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="M7 10l5 5 5-5"/><path d="M12 15V3"/></svg>
</x-slot:icon>
{{ __('Download CV') }}
</x-ui.button>
</div>
</header>
<x-ui.separator class="my-10" />
{{-- Summary --}}
<section aria-labelledby="resume-summary">
<h2 id="resume-summary" class="text-sm font-semibold uppercase tracking-wide text-muted-foreground">{{ __('Summary') }}</h2>
<p class="mt-4 text-base leading-relaxed text-foreground">
{{ __('Product-minded engineer with ten years of experience shipping resilient web platforms end to end — from design systems and accessibility to data pipelines and observability. I lead small teams, sweat the details, and care deeply about the craft of the interface.') }}
</p>
</section>
<x-ui.separator class="my-10" />
{{-- Experience --}}
<section aria-labelledby="resume-experience">
<h2 id="resume-experience" class="text-sm font-semibold uppercase tracking-wide text-muted-foreground">{{ __('Experience') }}</h2>
<div class="mt-6">
<x-blocks.scheduling-gantt />
</div>
</section>
<x-ui.separator class="my-10" />
{{-- Skills --}}
<section aria-labelledby="resume-skills">
<h2 id="resume-skills" class="text-sm font-semibold uppercase tracking-wide text-muted-foreground">{{ __('Skills') }}</h2>
<div class="mt-4 flex flex-wrap gap-2">
@foreach ($skills as $skill)
<x-ui.badge variant="secondary">{{ $skill }}</x-ui.badge>
@endforeach
</div>
</section>
<x-ui.separator class="my-10" />
{{-- Education --}}
<section aria-labelledby="resume-education">
<h2 id="resume-education" class="text-sm font-semibold uppercase tracking-wide text-muted-foreground">{{ __('Education') }}</h2>
<x-ui.card class="mt-4 divide-y divide-border p-0">
@foreach ($education as $entry)
<div class="flex flex-col gap-2 p-6 sm:flex-row sm:items-baseline sm:justify-between sm:gap-6">
<div class="space-y-2">
<h3 class="text-base font-semibold text-foreground">{{ __($entry['degree']) }}</h3>
<p class="text-sm font-medium text-muted-foreground">{{ __($entry['school']) }}</p>
<p class="text-sm text-muted-foreground">{{ __($entry['detail']) }}</p>
</div>
<span class="shrink-0 text-sm text-muted-foreground">{{ __($entry['period']) }}</span>
</div>
@endforeach
</x-ui.card>
</section>
</main>
<x-blocks.footer-minimal
brand="Jordan Avery"
:links="[
['label' => __('Email'), 'href' => 'mailto:you@example.com'],
['label' => __('Resume'), 'href' => '#'],
['label' => __('Portfolio'), 'href' => '#'],
]"
/>
</div>
Installation
php artisan ui:add pages/resume
Registry contract
Install confidence
php artisan ui:add pages/resume
writes only the generated targets below. The CLI validates each file hash before writing and
prompts before replacing local changes unless --force is used.
- Version
- 1.1.2
- License
- open
- Stability
- stable
- Contract
- v1
- Foundation
- ≥ 1.0.0
| Type | Generated target |
|---|---|
| blade | resources/views/pages/resume.blade.php |
Registry dependencies
Package dependencies
composer: jml/brok:^0.2
Use with AI
A brief for your coding agent: what the page is, the install command, how to render it, its props and the rules. Copy it, or open a prompt about this page in an assistant.
# Brok UI page: Resume — CV & Portfolio (`resume`)
A single-column resume/CV template with an avatar header, contact links, summary, an experience timeline, a skills badge cloud, an education card and a minimal footer.
Brok UI is a Laravel Blade registry. `ui:add` copies this page into the app as plain Blade the app owns; it composes installed `<brok:*>` primitives and semantic design tokens.
## Install
```bash
php artisan ui:add pages/resume
```
## Render it
```blade
<x-pages.resume />
```
## Use when
- A single-column resume/CV template: an avatar header, contact links, a summary, an experience timeline, a skills badge cloud, an education card and a minimal footer.
- It composes blocks/scheduling-gantt (reused as an experience timeline), blocks/footer-minimal and primitives (avatar, badge, separator, button, card, social-links).
## Avoid when
- Building a public portfolio landing page rather than a resume document; use typefolio instead.
## Rules
- Render the installed page with `<x-pages.resume />` and pass data through its props; edit the copied file only for structural changes.
- Keep the semantic design tokens (`bg-background`, `text-muted-foreground`); never swap in raw colour utilities.
- Keep the `data-slot` attributes and the logical (start/end) spacing so the markup still mirrors under `dir="rtl"`.
## Links
- Docs: https://brokui.dev/pages/resume
- Registry JSON (files, props, contract): https://brokui.dev/r/open/pages/resume.json
Working in Claude Code, Cursor or Codex? Give the agent the whole registry through the MCP server or the Brok UI skill.
Guidance
Use when
- A single-column resume/CV template: an avatar header, contact links, a summary, an experience timeline, a skills badge cloud, an education card and a minimal footer.
- It composes blocks/scheduling-gantt (reused as an experience timeline), blocks/footer-minimal and primitives (avatar, badge, separator, button, card, social-links).
Avoid when
- Building a public portfolio landing page rather than a resume document; use typefolio instead.
Anti-patterns
- Do not replace semantic props with conflicting utility classes.
- Do not remove labels, focus styles, or state attributes.
Usage
Render the page as a component, or wire it to a route. Pass data where useful:
<x-pages.resume />
Built from blocks & primitives
This page composes installed <brok:*> primitives and semantic design
tokens only — it does not reimplement any primitive. Re-theme it (light, dark, admin, customer) by
editing CSS variables; flip the preview to RTL to confirm it mirrors.
Source
The exact, editable file ui:add writes
into your app. The preview above renders this same source — there are no preview-only pages.
@props([])
@php
// Single-column resume / CV. Mostly inline primitive content with two composed
// blocks (an experience timeline and a minimal footer). All content is neutral
// placeholder data so it is safe to copy into any project.
$contactLinks = [
['platform' => 'email', 'label' => __('Email'), 'href' => 'mailto:you@example.com'],
['platform' => 'github', 'label' => __('GitHub'), 'href' => '#'],
['platform' => 'linkedin', 'label' => __('LinkedIn'), 'href' => '#'],
];
$skills = [
'TypeScript', 'React', 'Next.js', 'Laravel', 'PHP', 'Tailwind CSS',
'PostgreSQL', 'GraphQL', 'Node.js', 'Docker', 'AWS', 'Figma',
];
$education = [
[
'school' => 'University of Amsterdam',
'degree' => 'M.Sc. Computer Science',
'period' => '2014 — 2016',
'detail' => 'Specialisation in human–computer interaction. Graduated cum laude.',
],
[
'school' => 'Delft University of Technology',
'degree' => 'B.Sc. Software Engineering',
'period' => '2010 — 2014',
'detail' => 'Foundations in systems design, algorithms and distributed computing.',
],
];
@endphp
<div class="min-h-screen bg-background text-foreground">
<main class="mx-auto w-full max-w-3xl px-4 py-12 sm:px-6 sm:py-16 lg:py-20">
{{-- Header: avatar, identity, contact links, download CV --}}
<header class="flex flex-col items-start gap-6 sm:flex-row sm:items-center sm:justify-between">
<div class="flex items-center gap-6">
<x-ui.avatar size="xl" alt="Jordan Avery" fallback="JA" />
<div class="space-y-2">
<h1 class="text-2xl font-semibold tracking-tight text-foreground sm:text-3xl">{{ __('Jordan Avery') }}</h1>
<p class="text-base text-muted-foreground">{{ __('Senior Product Engineer') }}</p>
<p class="flex items-center gap-2 text-sm text-muted-foreground">
<svg class="size-4 shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z"/><circle cx="12" cy="10" r="3"/></svg>
{{ __('Amsterdam, Netherlands') }}
</p>
</div>
</div>
<div class="flex flex-col items-start gap-4 sm:items-end">
<x-ui.social-links :links="$contactLinks" size="sm" label="Contact links" />
<x-ui.button>
<x-slot:icon>
<svg class="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="M7 10l5 5 5-5"/><path d="M12 15V3"/></svg>
</x-slot:icon>
{{ __('Download CV') }}
</x-ui.button>
</div>
</header>
<x-ui.separator class="my-10" />
{{-- Summary --}}
<section aria-labelledby="resume-summary">
<h2 id="resume-summary" class="text-sm font-semibold uppercase tracking-wide text-muted-foreground">{{ __('Summary') }}</h2>
<p class="mt-4 text-base leading-relaxed text-foreground">
{{ __('Product-minded engineer with ten years of experience shipping resilient web platforms end to end — from design systems and accessibility to data pipelines and observability. I lead small teams, sweat the details, and care deeply about the craft of the interface.') }}
</p>
</section>
<x-ui.separator class="my-10" />
{{-- Experience --}}
<section aria-labelledby="resume-experience">
<h2 id="resume-experience" class="text-sm font-semibold uppercase tracking-wide text-muted-foreground">{{ __('Experience') }}</h2>
<div class="mt-6">
<x-blocks.scheduling-gantt />
</div>
</section>
<x-ui.separator class="my-10" />
{{-- Skills --}}
<section aria-labelledby="resume-skills">
<h2 id="resume-skills" class="text-sm font-semibold uppercase tracking-wide text-muted-foreground">{{ __('Skills') }}</h2>
<div class="mt-4 flex flex-wrap gap-2">
@foreach ($skills as $skill)
<x-ui.badge variant="secondary">{{ $skill }}</x-ui.badge>
@endforeach
</div>
</section>
<x-ui.separator class="my-10" />
{{-- Education --}}
<section aria-labelledby="resume-education">
<h2 id="resume-education" class="text-sm font-semibold uppercase tracking-wide text-muted-foreground">{{ __('Education') }}</h2>
<x-ui.card class="mt-4 divide-y divide-border p-0">
@foreach ($education as $entry)
<div class="flex flex-col gap-2 p-6 sm:flex-row sm:items-baseline sm:justify-between sm:gap-6">
<div class="space-y-2">
<h3 class="text-base font-semibold text-foreground">{{ __($entry['degree']) }}</h3>
<p class="text-sm font-medium text-muted-foreground">{{ __($entry['school']) }}</p>
<p class="text-sm text-muted-foreground">{{ __($entry['detail']) }}</p>
</div>
<span class="shrink-0 text-sm text-muted-foreground">{{ __($entry['period']) }}</span>
</div>
@endforeach
</x-ui.card>
</section>
</main>
<x-blocks.footer-minimal
brand="Jordan Avery"
:links="[
['label' => __('Email'), 'href' => 'mailto:you@example.com'],
['label' => __('Resume'), 'href' => '#'],
['label' => __('Portfolio'), 'href' => '#'],
]"
/>
</div>
Ownership & lifecycle
Owner, release state, review evidence and adoption for this item.
- Owner
- Platform UI (@JoshJML)
- Current version
-
1.1.2 - Status
- Stable
- License
-
open - Deprecation
- Not deprecated
- Contract
-
v1 - Foundation
-
≥ 1.0.0