5.9 KiB
Theming, Templating & Vue Component Standards
Frontend design system for the Go No Go questionnaire application. Built with Vue 3, Inertia.js v2, and Tailwind CSS.
Design Tokens
Color Palette
| Token | Hex | RGB | Tailwind Class | Usage |
|---|---|---|---|---|
| Primary | #d1ec51 |
209, 236, 81 | bg-primary, text-primary |
Buttons (default), accents, highlights |
| Primary Dark | #b5d136 |
181, 209, 54 | bg-primary-dark, text-primary-dark |
Selected/hover state for pill buttons, ~15% darker primary |
| Secondary | #00b7b3 |
0, 183, 179 | bg-secondary, text-secondary |
Button hover states, secondary accents |
| Background | #2b303a |
43, 48, 58 | bg-surface |
Page background, card backgrounds |
| Text | #ffffff |
255, 255, 255 | text-white |
Primary body text on dark background |
| Text Muted | #9ca3af |
156, 163, 175 | text-gray-400 |
Secondary/muted text, labels, placeholders |
Dark background means all primary text is white. Use text-gray-400 for de-emphasized text.
Tailwind Configuration
Register design tokens in tailwind.config.js so they are available as utility classes:
// tailwind.config.js
export default {
theme: {
extend: {
colors: {
primary: '#d1ec51',
secondary: '#00b7b3',
surface: '#2b303a',
},
},
},
};
This enables bg-primary, text-secondary, bg-surface, border-primary, etc.
Layout
resources/js/Layouts/AppLayout.vue is the persistent layout wrapping all authenticated pages.
Structure:
- Header bar:
PageHeadercomponent -- Piccadilly logo (top-left) with the current page title to its right - Main content area: below the header, renders the page slot
Applied via Inertia persistent layouts on each page component:
import AppLayout from '@/Layouts/AppLayout.vue';
defineOptions({ layout: AppLayout });
Pages: Dashboard (/), Session/Show (questionnaire flow), Session/Result (final result).
Components
All shared components live in resources/js/Components/.
AppButton
Central button component. All buttons in the app use this -- no one-off button styling.
| Prop | Type | Default | Description |
|---|---|---|---|
variant |
String |
'primary' |
'primary' / 'danger' / 'ghost' |
size |
String |
'md' |
'sm' / 'md' / 'lg' |
href |
String |
undefined |
When set, renders as Inertia Link instead of button |
disabled |
Boolean |
false |
Disables interaction and applies muted styling |
loading |
Boolean |
false |
Shows spinner and disables interaction |
Default state: bg-primary background, dark text (text-surface or text-gray-900).
Hover state: bg-secondary background.
Danger variant: red background/text for destructive actions.
Ghost variant: transparent background, text-only.
AppLogo
Renders the Piccadilly logo (SVG or image). No props beyond optional size overrides. Used inside PageHeader.
PageHeader
Contains AppLogo (left) and the page title (right of logo). Used inside AppLayout. Accepts a title prop (String).
ScoreIndicator
Displays the running score during a session with color coding based on thresholds. See Scoring Colors for the color rules.
QuestionCard
Renders a single question in the questionnaire flow. Adapts its UI based on the question's field configuration:
has_yes-- show Yes buttonhas_no-- show No buttonhas_na-- show N/A buttondetails-- show a text input for additional notes
RadioButtonGroup
Pill-shaped button group that replaces native radio buttons. Options appear as connected segments with rounded outer edges.
| Prop | Type | Default | Description |
|---|---|---|---|
modelValue |
String | null |
null |
Selected value (v-model) |
options |
Array<{value, label}> |
required | Options to render |
name |
String |
required | HTML radio group name |
disabled |
Boolean |
false |
Disables all options |
Default state: bg-primary with text-gray-900.
Selected & hover state: bg-primary-dark.
Keyboard focus: visible ring using ring-primary-dark.
Used in QuestionCard (3-option: Yes/No/N/A) and Screening/Show (2-option: Yes/No).
Icons
Heroicons is the only icon library. No other icon packages.
npm install @heroicons/vue
Default: outline variant (24x24):
<script setup>
import { ArrowRightIcon } from '@heroicons/vue/24/outline';
</script>
<template>
<ArrowRightIcon class="h-6 w-6" />
</template>
Small/inline contexts: solid variant (20x20):
<script setup>
import { CheckIcon } from '@heroicons/vue/20/solid';
</script>
<template>
<CheckIcon class="h-5 w-5" />
</template>
Scoring Colors
Result-specific colors, separate from brand colors. Used only in ScoreIndicator and the result page.
| Result | Color | Tailwind Class |
|---|---|---|
| GO | Green | text-green-500 / bg-green-500 |
| Consult Leadership | Yellow/Amber | text-amber-500 / bg-amber-500 |
| NO GO | Red | text-red-500 / bg-red-500 |
These are standard Tailwind palette colors, not custom tokens.