Skip to content
Brok UI

Loading…

No results

Resume — CV & Portfolio

Open source

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.

Responsive Dark mode RTL Localized SEO

Preview

resources/views/pages/resume.blade.php Blade
@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

terminal
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

blocks/scheduling-gantt blocks/footer-minimal avatar badge separator button card social-links

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.

resume.md
# 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:

resources/views/welcome.blade.php Blade
<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.

resources/views/pages/resume.blade.php Blade
@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