OWLS Design System
Component Library & Style Guide — Phase 1: New Skin / Visual Refresh
Mona Sans | Fluent UI Icons | Current State Reference
Bootstrap-convention 50-950 scale. Used for text, backgrounds, borders, UI chrome. Preserves the cool blue undertone of the OWLS heading color.
#F7F7F8
#EFF0F1
#DEE0E2
#D0D3D8
anchor
#B0B6BF
#8891A0
#647081
label
#495260
#303640
#191E24
#0F1115
Bootstrap-convention 50-950 scale. Used for brand accent, header, highlights, CTAs. 500 is the base OWLS secondary color.
#FAF5F6
#F6E4E8
#F1C6CE
#ED97A8
#F4718B
#FF5073
base
#F91F4B
#D50B34
#A00D2A
#6E0C20
#430A15
Bootstrap-convention 50-950 scale. Near-triadic pairing (118°) with the coral accent. Used for functional UI — primary CTAs (indigo-700), focus rings (indigo-500 @ 20% alpha), links, and cool-tone neutrals. The mid-tones dip slightly in saturation (39–42%) for a "professional / grown up" feel; the dark end spikes to 70–100% saturation to give navy shades weight. Blue appears ~5-8% darker in measured L% than coral at matching steps — this compensates for the Helmholtz-Kohlrausch perceptual brightness bias so the two scales feel tonally balanced.
#F4F6FB
#E8ECF7
#C0C9E7
#98A5D7
#7F8DCC
#6372C0
base
#4C5CAC
#344598
CTA
#212F7D
#111D62
#000B47
indigo-700 → primary CTA bg (WCAG AAA on white text) ·
indigo-800 → CTA hover ·
indigo-900 → CTA active/pressed ·
indigo-500 → focus-ring outline (4.18:1 vs white) ·
indigo-500 @ 20% α → focus-ring box-shadow ·
indigo-50 / 100 → subtle hover / selected-row bg
#FF8C42
indigo-600
#D50B34
#34AD6C
#FFC107
Transcript: "when we hover over a field, the label of the field, it pops up with information about that field". Add data-help="…" to any .owls-field-label and hovering it reveals the help text as a dark tooltip above the label. Use for per-field guidance that's too long for a visible placeholder.
Hover either label to see the tooltip.
Transcript: "field has highlighted the label as highlighted red. And when you hover over it, it gives you what the error". Add .has-error + data-error="…" to the .owls-field-group wrapper. The label text turns red; hovering it shows the error message as a red tooltip. The input itself gets the existing .is-invalid class for the red border.
Hover either red label to see the error message.
Full-width charcoal bar (48px tall). Logo + welcome text on the left, muted-gray action buttons on the right. The logo is OWL + a coral <span class="owls-logo-accent">S</span>. Header buttons use .owls-btn-header (default muted icon) with optional data-icon-color variants, and .owls-btn-header-danger for the log-out variant that turns coral on hover.
The primary CTA is .btn-owls-primary (indigo). Use it for serious brand actions — "Generate Policy", "Save", "Commit", "Sign In". Orange (.btn-owls-action) is the legacy bright-action color, kept for compatibility; prefer indigo for new work. Green is reserved for Search/Confirm. Blue is used sparingly for Info. Danger is red.
Transcript: "certain sections of the screen you can search just using the fields in there… like this one here is a client information search". The pattern is a section-scoped search that queries only the fields inside one form section, not the whole screen. Place the green search button (from above) as a right-aligned action row at the top of the .owls-section-card-body (see §9 Section Card). No new component needed.
The "Client Information Search" button is scoped to the client fields in this section only, not the whole screen. Placement: first action row of the section body, right-aligned.
Native <select> is kept as the accessible baseline. Use the styled .owls-dropdown component when visual polish matters (sparingly — filter rows, modals, form fields where brand consistency is visible).
.owls-dropdown)Transcript: "autocompletes filter based on what you're typing". Unlike .owls-dropdown[data-searchable] (which opens on click), autocomplete opens as the user types and highlights matching substrings. Use for long free-form lists like brokers, policyholders, and product codes.
Text input with calendar icon is the collapsed state. Click opens the .owls-calendar popover. The calendar is also usable inline (no input) for schedulers and range pickers.
Standard <input type="password"> wrapped with an optional show/hide toggle. Click the eye icon to reveal the value.
Static text in a field layout — used for computed values, descriptions, and informational rows. Transcript: "a field that displays text".
White-pill-on-gray-track pattern for field-level selectors. Active option lifts with shadow. Use for mutually exclusive choices within a form.
Fixed 30px height, coral outline selection. No size change on toggle. Used for multi-select options like additional covers.
Dashed-border card for search-first entry flows. Contains icon, title, description, and CTA button.
Label/value list for fee breakdowns. Total row emphasized with background and larger font.
Collapsible section cards with monochrome icon chips, progress fractions, and chevron toggles. Shadow elevation on hover. Icon turns pink on header hover.
Section content here. Click header to collapse.
This content is hidden when collapsed.
Collapsible tree nav with search filter input. Pink highlight on selected item. Parent categories toggle open/closed.
| Policy No. arrow_sort | Client Name arrow_sort | Status | Premium | Inception Date | Cancellation Date | Actions |
|---|---|---|---|---|---|---|
| POL-001 | John Smith | Active | R 1,250.00 | 2026-01-15 | - | |
| POL-002 | Sarah Johnson | Pending | R 2,100.00 | 2026-02-01 | - | |
| POL-003 | Michael Williams | Cancelled | R 950.00 | 2025-06-10 | 2026-03-01 | |
| POL-004 | Emma Davis | Error | R 0.00 | 2026-03-20 | - | |
| POL-005 | David Brown | Active | R 3,400.00 | 2025-11-01 | - |
Basic coverage plan with standard benefits and premium structure.
Enhanced coverage with additional riders and lower excess.
Full coverage plan with all benefits and priority support.
The dominant pattern for grouping related fields on a hero screen. White header bar with a coral Fluent icon on the left, title in the middle, animated +/- toggle on the right. Click anywhere on the header to collapse/expand. Section-level actions (Client Information Search, Add, Export, etc.) live inside the body as the first row — NOT in the header.
Section body content goes here. Click the header above to expand.
Click either header to toggle collapse/expand. The +/- control is two CSS spans — the horizontal line is always visible (the minus), the vertical line rotates 90° and fades out when expanded, leaving just the minus; when collapsed it rotates back to 0° and appears, forming a plus.
Transcript: "different cards for each of the sections to say, that's my selection… essentially radio button groups, but as cards". Click a card to select it. Keyboard accessible: Tab to focus, Space/Enter to select.
Third-party only
Third-party, fire & theft
Full cover with extras
Are you sure you want to apply this amendment to policy POL-001?
Transcript: "this pop up or overlay… just indicating what the system is currently doing". Full-page busy indicator with a spinner and a status message. Shown during long-running operations (search, KYC lookup, policy generation). Closes automatically when the operation completes — no dismiss control.
Inline preview (what the overlay looks like)
Transcript: "when I click search it now then shows me all the valid options that I can select from. I double click that and it loads down to the bottom screen". The distinctive OWLS search pattern: click a Search button → panel opens with filter input + results list → double-click a result → panel closes and the detail loads into the underlying screen.
20px Regular weight, ligature web font. Usage: <i class="fluent-icons-20">icon_name</i>
4px
8px
12px
16px
24px
32px
| Element | Padding | Margin / Gap | Token |
|---|---|---|---|
| Label to input | - | 0 0 4px 0 | --space-xs |
| Field input | 4px 8px | - | xs / sm |
| Field group | - | 0 0 12px 0 | --space-md |
| Field row (horiz. group) | - | gap: 8px | --space-sm |
| Section heading | 8px 12px | 24px 0 16px 0 | sm md / xl lg |
| Button | 6px 16px | - | ~sm lg |
| Button icon gap | - | margin-right: 4px | --space-xs |
| Card | 16px | 0 0 12px 0 | --space-lg / md |
| Grid cell | 5px 8px | - | ~xs sm |
| Alert | 10px 16px | 0 0 12px 0 | ~sm lg / md |
| Alert icon gap | - | margin-right: 6px | ~xs |
| Modal body | 24px | - | --space-xl |
| Sidebar item | 6px 16px | - | ~sm lg |
| Sidebar icon gap | - | margin-right: 6px | ~xs |
| Relationship | Spacing | Token |
|---|---|---|
| Label to its input | 4px below | --space-xs |
| Related fields in a row | 8px gap | --space-sm |
| Between field groups (rows) | 12px below | --space-md |
| Section heading to first field | 16px below | --space-lg |
| Between sections | 24px above heading | --space-xl |
| Between major page areas | 32px | --space-2xl |
Wraps an .owls-field-input with an inline text prefix and/or suffix (e.g. R for Rand currency, % for percentages). Add .has-prefix and/or .has-suffix to the wrapper to reserve padding on the input. Prefix/suffix spans are pointer-event transparent so clicks still focus the input. Used throughout the Policy Quote screen (7 currency inputs alone).
Fixed footer bar docked to the viewport bottom. Icon-only buttons with tooltips on the left, separator, progress bar + count, then stacked total + primary CTA on the right. Uses .owls-action-bar (fixed), .btn-owls-icon-only for compact buttons, .owls-action-bar-separator, .owls-action-bar-progress, and .owls-action-bar-total.