Skip to main content
< All Topics
Print

ScubaGPT Visual Style Guide

ScubaGPT Visual Style Guide

Overview

The ScubaGPT chatbot visual design is based on the scubagpt.com website, featuring a clean, modern, and professional aesthetic optimized for readability and user engagement.

Design Philosophy

  • Clean & Minimal: Lots of white space, clear hierarchy
  • Professional: Suitable for diving professionals and enthusiasts
  • Readable: High contrast, generous spacing, clear typography
  • Modern: Contemporary UI patterns with subtle animations

Color Palette

Primary Colors

Color Hex Usage
Primary Blue #0095ff User messages, primary actions, links
Primary Blue Dark #0077cc Hover states for primary elements
Primary Blue Light #33adff Focus states, highlights
Accent Red #e63946 Header accent bar, important highlights

Neutral Colors

Color Hex Usage
Black #000000 Primary text
Dark Gray #666666 Secondary text, subtle elements
White #ffffff Backgrounds, user message text
Light Gray #f5f5f5 Bot message backgrounds, input backgrounds
Border Gray #dddddd Borders, dividers

Semantic Colors

Color Hex Usage
Error Red #dc2626 Error messages
Error Background #fef2f2 Error message backgrounds

Typography

Font Family


font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;

Rationale: System font stack ensures optimal readability and performance across all platforms.

Font Sizes & Weights

Element Size Weight Usage
Header Title 20px 400 Main “SCUBAGPT” title
Header Subtitle 14px 400 (italic) “The Scuba Diver’s ChatBot”
Body Text 15px 400 Message content, input
Small Text 14px 400 Suggestions, secondary info
Tiny Text 12px 400 Sources, metadata
Headings 16px 600 Welcome message headings

Line Height

  • Body Text: 1.6 (optimal for readability)
  • Compact Text: 1.5 (headers, buttons)

Layout & Spacing

Border Radius

Element Radius Notes
Message Bubbles 18px Main corners
Message Tail 6px Bottom corner (user right, bot left)
Input Field 24px Pill-shaped for modern look
Buttons (Small) 6px Header buttons
Buttons (Round) 50% Send button, toggle button
Suggestions 24px Pill-shaped

Padding & Spacing

Element Padding Notes
Messages Container 24px All sides
Message Bubble 14px 18px Vertical, Horizontal
Input Area 20px All sides
Header 16px 20px Vertical, Horizontal
Message Gap 20px Between messages

Components

Header

Design:

  • White background
  • 3px red accent bar at bottom (#e63946)
  • Black text
  • Subtle shadow: 0 2px 4px rgba(0, 0, 0, 0.08)

Elements:

  • Logo icon (24x24px)
  • Title: “SCUBAGPT” (20px, regular)
  • Subtitle: “The Scuba Diver’s ChatBot” (14px, italic, gray)
  • Action buttons with light gray background
  • Close button (subtle gray icon)

Message Bubbles

User Messages (Right-aligned)

  • Background: Bright blue (#0095ff)
  • Text: White
  • Alignment: Right
  • Max Width: 80%
  • Border Radius: 18px (main), 6px (bottom-right)
  • Padding: 14px 18px

Bot Messages (Left-aligned)

  • Background: Light gray (#f5f5f5)
  • Text: Black
  • Alignment: Left
  • Max Width: 80%
  • Border: 1px solid #dddddd
  • Border Radius: 18px (main), 6px (bottom-left)
  • Padding: 14px 18px

Welcome Message

Design:

  • Styled like a bot message (left-aligned)
  • Light gray background with border
  • Contains welcome text and suggestion pills
  • No icon or heading (clean and minimal)

Input Area

Input Field:

  • Background: Light gray (#f5f5f5)
  • Border: 1px solid #dddddd
  • Border Radius: 24px (pill-shaped)
  • Padding: 12px 18px
  • Focus State:
  • Border: Primary blue
  • Background: White
  • Shadow: 0 0 0 3px rgba(0, 149, 255, 0.1)

Send Button:

  • Shape: Circle (50% border-radius)
  • Background: Primary blue
  • Size: 44x44px
  • Icon: White, 20x20px
  • Shadow: 0 2px 8px rgba(0, 149, 255, 0.3)
  • Hover: Scale 1.05, darker blue, stronger shadow

Toggle Button (Floating Widget)

  • Shape: Circle
  • Size: 60x60px
  • Background: Primary blue
  • Icon: White, 28x28px
  • Shadow: 0 4px 16px rgba(0, 149, 255, 0.3)
  • Hover: Scale 1.08, darker blue, stronger shadow

Suggestions

  • Background: White
  • Border: 1px solid #dddddd
  • Border Radius: 24px (pill-shaped)
  • Padding: 10px 16px
  • Font Size: 14px
  • Hover:
  • Background: Primary blue
  • Text: White
  • Transform: translateY(-1px)
  • Shadow: 0 2px 8px rgba(0, 149, 255, 0.3)

Links

In Bot Messages:

  • Color: Primary blue (#0095ff)
  • Decoration: None by default
  • Hover: 1px border-bottom in primary blue

In User Messages:

  • Color: White
  • Decoration: 1px border-bottom (50% opacity)
  • Hover: Full opacity border

Shadows

Elevation Levels

Level Shadow Usage
Low 0 1px 3px rgba(0, 0, 0, 0.08) Subtle elements
Medium 0 2px 8px rgba(0, 149, 255, 0.3) Interactive elements
High 0 4px 16px rgba(0, 149, 255, 0.3) Floating elements
Focus 0 0 0 3px rgba(0, 149, 255, 0.1) Focus rings

Animations & Transitions

Transition Timing


transition: all 0.2s ease;

Used for:

  • Button hovers
  • Input focus
  • Color changes

Animations

Fade In (Messages)


@keyframes scubagpt-fade-in {
    from {
        opacity: 0;
        transform: translateY(10px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

Duration: 0.3s ease

Typing Indicator


@keyframes scubagpt-typing {
    0%, 80%, 100% {
        transform: scale(0);
        opacity: 0.5;
    }
    40% {
        transform: scale(1);
        opacity: 1;
    }
}

Duration: 1.4s infinite

Cursor Blink


@keyframes scubagpt-blink {
    0%, 50% { opacity: 1; }
    51%, 100% { opacity: 0; }
}

Duration: 1s infinite

Hover Effects

Element Effect
Buttons Background color change
Send Button Scale 1.05 + shadow increase
Toggle Button Scale 1.08 + shadow increase
Suggestions Background to blue + lift 1px
Links Border-bottom appears

Dark Mode

Color Adjustments

Element Light Mode Dark Mode
Background #ffffff #1a1a1a
Secondary BG #f5f5f5 #2a2a2a
Text #000000 #ffffff
Text Light #666666 #999999
Border #dddddd #3a3a3a
Bot Message BG #f5f5f5 #2a2a2a

Note: Primary blue and accent red remain the same in dark mode for brand consistency.

Accessibility

Contrast Ratios

All text meets WCAG AA standards:

  • Normal Text: Minimum 4.5:1
  • Large Text: Minimum 3:1
  • Interactive Elements: Minimum 3:1

Focus States

All interactive elements have visible focus indicators:

  • Outline: 2px solid primary blue
  • Offset: 2px
  • Alternative: 3px shadow ring for inputs

Screen Reader Support

  • Semantic HTML structure
  • ARIA labels on icon buttons
  • Role attributes on dialog elements
  • Alt text on images

Reduced Motion


@media (prefers-reduced-motion: reduce) {
    * {
        animation-duration: 0.01ms !important;
        transition-duration: 0.01ms !important;
    }
}

Responsive Design

Breakpoints

Breakpoint Width Adjustments
Mobile < 480px Full-width window, smaller toggle
Tablet 480px – 768px Standard sizing
Desktop > 768px Standard sizing

Mobile Optimizations

  • Window: calc(100vw - 20px) width
  • Window: calc(100vh - 100px) height
  • Toggle: 54x54px (smaller)
  • Messages: 90% max-width (more space)

Best Practices

Do’s ✅

  • Use system fonts for best performance
  • Maintain generous spacing for readability
  • Keep animations subtle and purposeful
  • Ensure high contrast for text
  • Test in both light and dark modes
  • Provide hover states for all interactive elements

Don’ts ❌

  • Don’t use custom fonts (slows loading)
  • Don’t reduce spacing below guidelines
  • Don’t use animations longer than 0.3s
  • Don’t use low-contrast color combinations
  • Don’t forget focus states
  • Don’t make clickable areas smaller than 44x44px

Implementation Notes

CSS Variables

All colors and key values are defined as CSS variables in :root:


:root {
    --scubagpt-primary: #0095ff;
    --scubagpt-accent: #e63946;
    --scubagpt-text: #000000;
    /* ... etc */
}

This allows for easy theming and consistency across components.

Browser Support

  • Modern browsers (Chrome, Firefox, Safari, Edge)
  • CSS Grid and Flexbox
  • CSS Variables
  • CSS Animations
  • Backdrop filters (optional enhancement)

Performance Considerations

  • System fonts (no web font loading)
  • CSS animations (GPU-accelerated)
  • Minimal box-shadows
  • Efficient selectors
  • No large background images

Comparison with scubagpt.com

Similarities ✓

  • Clean, minimal design
  • Bright blue user messages (#0095ff)
  • Light gray bot messages (#f5f5f5)
  • Red accent bar in header (#e63946)
  • Simple typography with system fonts
  • Generous spacing and padding
  • Rounded message bubbles
  • Pill-shaped suggestions

Adaptations for Widget

  • Added floating toggle button (not needed on main site)
  • Compact header for smaller viewport
  • Optimized spacing for widget size
  • Added dark mode support
  • Enhanced focus states for accessibility
  • Mobile-responsive adjustments

Map Components (v1.5.0)

Map Container

Default dimensions: 1024×768px (configurable via shortcode width/height attributes)
Accessibility: role="region", aria-label="Interactive dive site and operator map"

Map Marker Icons

Marker Color Shape Size
Dive Site Blue (#0077be) with dark stroke (#005a8e) Circle with diver wave motif 24×24 SVG
Dive Operator Orange (#e68a00) with dark stroke (#b36b00) Circle with shop/building motif 24×24 SVG

Map Cluster Markers

Cluster type Background Text Border
Site Cluster rgba(0, 119, 190, 0.7) White, bold 2px solid rgba(0, 119, 190, 0.9)
Operator Cluster rgba(230, 138, 0, 0.7) White, bold 2px solid rgba(230, 138, 0, 0.9)

Cluster sizing: Small (< 10): 30×30px, Medium (10–99): 40×40px, Large (100+): 50×50px
Shape: Circular with border-radius: 50%

Map Search Control

  • Position: Top of map container
  • Background: White with border-radius 4px
  • Shadow: 0 2px 4px rgba(0,0,0,0.2)
  • Input: Full-width text input with 8px padding
  • Clear button: Appears when text is present
  • Badge: Shows “N of M” filtered count per layer

Map Detail Modal

Overlay: Semi-transparent dark backdrop
Modal panel: White background, max-width 500px, border-radius 8px
Animation: Fade-in on open
Header: Title with close button (×), padding 16px
Body: Scrollable content area with table layout for key-value pairs
Table styling: Alternating row backgrounds, left-aligned keys in bold
Description block: Full-width paragraph below the table
Nearby sites list: Bulleted list when applicable (operators)
Footer: Copy button for clipboard export
Accessibility: role="dialog", aria-modal="true", aria-labelledby, Escape to close, focus trapping

Map Layer Control

Leaflet layer control is overridden to match the ScubaGPT style:

  • White background with subtle shadow
  • Checkboxes for “Dive Sites” and “Dive Operators” layers
  • Standard Leaflet positioning (top-right)

## Streaming & Processing Components (v1.5.0)

### Processing Indicator

Displayed while waiting for the AI response to begin streaming:

Container class: .scubagpt-processing-indicator

Spinner: CSS-only rotating circle (.scubagpt-processing-spinner)

– Size: 16×16px

– Border: 2px solid light gray, top border primary blue

– Animation: spin 0.8s linear infinite

Text: “Thinking about your question…” in secondary gray

Reduced motion: Spinner animation disabled when prefers-reduced-motion: reduce

### Streaming Content

During active streaming, the message element has class .streaming-content:

Cursor: Blinking bar (|) appended to the end of content

– Animation: scubagpt-blink 1s infinite

Markdown: Rendered progressively via innerHTML with formatMessage()

Transition: On finalization, streaming classes are removed and content stabilizes

### Image Upload

| Element | Style |

|———|——-|

| Image button | Icon button in input area, same sizing as send button |

| Preview | Thumbnail with remove (×) button, max-height constrained |

| Drag overlay | .dragover state applies dashed border highlight |

### Voice Input

| State | Style |

|——-|——-|

| Idle | Microphone icon button, standard input-area styling |

| Listening | .listening class adds red background, pulse animation |

| Pulse | @keyframes pulse — scale oscillation 1.0→1.1→1.0 over 1.5s |

### Offline Banner

Background: Warning yellow or muted gray

Text: “You’re offline — reconnect to chat with our dive experts.”

Position: Top of chat container, dismissible on reconnect

Version History

  • v1.5.0 (2026-04-19): Map and streaming visual components
  • Added dual-layer map styling (site/operator markers, clusters, search, modals)
  • Added streaming processing indicator and spinner
  • Added image upload, voice input, and offline banner styles
  • Added dark mode, print styles, and prefers-reduced-motion support
  • v1.2.0 (2026-01-13): Adopted scubagpt.com visual style
  • Updated color palette to match site
  • Changed header to white with red accent bar
  • Updated message bubble styling
  • Refined typography and spacing
  • Added subtitle to header
  • Improved hover and focus states

This style guide ensures visual consistency across the ScubaGPT chatbot and maintains alignment with the scubagpt.com brand identity.

Table of Contents