Canvas Design System
Main Site Tokens

Composition Examples

Common combinations of components. These patterns show how components work together in real UI.

Card + Avatar + Badge

A user profile or team member card.

JD
Jane Doe
Lead Facilitator
Active
Design Sprint Retro 120+ hours
<?php ws_card_start(['variant' => 'content', 'bordered' => true]); ?>
  <div style="display: flex; align-items: center; gap: 12px; margin-bottom: 12px;">
    <?= ws_avatar('Jane Doe', ['size' => 'md']) ?>
    <div>
      <div style="font-weight: 600;">Jane Doe</div>
      <div style="font-size: 13px; color: #78716C;">Lead Facilitator</div>
    </div>
    <?= ws_status('Active', 'success') ?>
  </div>
  <div style="display: flex; gap: 8px;">
    <?= ws_badge('Design Sprint', ['variant' => 'category', 'color' => '#3B82F6']) ?>
    <?= ws_badge('Retro', ['variant' => 'category', 'color' => '#EC4899']) ?>
    <?= ws_duration('120+ hours') ?>
  </div>
<?php ws_card_end(); ?>

Section Header + Feature Cards

A feature/benefits section on a landing page.

<section class="section">
  <?= ws_section_header('Everything you need to run', [
      'subtitle' => 'world-class workshops.',
      'description' => 'Workshopr brings the energy of in-person collaboration to your remote team.',
  ]) ?>

  <div class="features-grid">
    <?= ws_feature_card('Curated Library', 'Browse workshops, exercises, and icebreakers.', [
        'icon' => 'menu_book',
    ]) ?>
    <?= ws_feature_card('AI Coach', 'Intelligent recommendations and live coaching.', [
        'icon' => 'smart_toy',
    ]) ?>
    <?= ws_feature_card('Clear Agendas', 'Every workshop includes timing and tips.', [
        'icon' => 'calendar_month',
    ]) ?>
  </div>
</section>

Alert + Form Fields

A form with validation errors.

Please enter a valid email address.

<?= ws_alert('Please fix the errors below.', ['variant' => 'error', 'title' => 'Form Error']) ?>

<form style="display: flex; flex-direction: column; gap: 16px;">
  <?= ws_form_row(ws_input('name'), ['label' => 'Name', 'required' => true]) ?>
  <?= ws_form_row(ws_input('email', ['type' => 'email']), [
      'label' => 'Email', 'required' => true,
      'error' => 'Please enter a valid email address.',
  ]) ?>
  <?= ws_button('Submit', ['variant' => 'primary', 'type' => 'submit']) ?>
</form>

Breadcrumb + Section Header

Detail page intro pattern.

Design Sprint
by Jake Knapp

A 5-day process for answering critical business questions through design, prototyping, and testing.

Strategy 5 days Popular
<?= ws_breadcrumb([
    ['label' => 'Home', 'href' => '/'],
    ['label' => 'Workshops', 'href' => '/library/workshops/'],
    ['label' => 'Design Sprint'],
]) ?>

<?= ws_section_header('Design Sprint', [
    'subtitle' => 'by Jake Knapp',
    'description' => 'A 5-day process for answering critical business questions.',
    'align' => 'left',
]) ?>

<div style="display: flex; gap: 8px;">
  <?= ws_category('Strategy', '#3B82F6') ?>
  <?= ws_duration('5 days') ?>
  <?= ws_status('Popular', 'success') ?>
</div>

Empty State + Action

When a list has no results.

No workshops found

Try adjusting your search or browse all workshops.

<?= ws_empty_state('No workshops found', [
    'description' => 'Try adjusting your search or browse all workshops.',
    'icon' => 'search_off',
    'action' => 'Browse All Workshops',
    'actionHref' => '/library/workshops/',
]) ?>

Tabs + Content Panels

Tabbed interface for switching between content sections.

<?= ws_tabs([
    ['id' => 'overview', 'label' => 'Overview', 'active' => true],
    ['id' => 'agenda',   'label' => 'Agenda'],
    ['id' => 'reviews',  'label' => 'Reviews', 'count' => 12],
], ['variant' => 'underline']) ?>

<div id="tab-overview" class="tab-panel active">
  <?php ws_card_start(['variant' => 'content']); ?>
    <p>Workshop overview content...</p>
  <?php ws_card_end(); ?>
</div>

<div id="tab-agenda" class="tab-panel" style="display:none;">
  <?php ws_card_start(['variant' => 'content']); ?>
    <p>Agenda timeline...</p>
  <?php ws_card_end(); ?>
</div>

Stats + Checklist

Marketing social proof section.

50+ Workshops
120+ Exercises
  • Pre-built agendas for every session
  • Expert-curated exercise library
  • AI-powered facilitation coaching
  • Free to get started
<div style="display: flex; gap: 40px;">
  <?= ws_stats([
      ['value' => '50+', 'label' => 'Workshops', 'color' => '#E54D4D'],
      ['value' => '120+', 'label' => 'Exercises', 'color' => '#E54D4D'],
  ]) ?>

  <?= ws_checklist([
      'Pre-built agendas for every session',
      'Expert-curated exercise library',
      'AI-powered facilitation coaching',
      'Free to get started',
  ]) ?>
</div>