Design System - joinruach/JoinRuach GitHub Wiki
Design System
Overview
The Ruach Studios design system is the visual and experiential language that unifies all our digital and physical touchpoints. It's built on principles of clarity, beauty, and purpose.
We design for:
- Readability — Information should be easy to consume
- Accessibility — Everyone should be able to engage
- Emotion — Design should evoke meaning, not just function
- Consistency — Patterns should feel familiar across platforms
Brand Identity
Mission-Driven Aesthetics
Our visual language reflects who we are:
- Grounded, not flashy — Substance over style
- Modern, not trendy — Timeless, not temporary
- Warm, not cold — Human, not robotic
- Bold, not loud — Confident, not obnoxious
Color Palette
Primary Colors
Ruach Blue — Identity & Trust
- Primary:
#1A56DB(rgb(26, 86, 219)) - Light:
#3F83F8(rgb(63, 131, 248)) - Dark:
#1E429F(rgb(30, 66, 159))
Usage:
- Primary CTAs (Call-to-Actions)
- Links and interactive elements
- Brand accents
Ruach Charcoal — Grounding & Depth
- Primary:
#1F2937(rgb(31, 41, 55)) - Light:
#374151(rgb(55, 65, 81)) - Dark:
#111827(rgb(17, 24, 39))
Usage:
- Body text
- Headers
- Backgrounds
Ruach Cream — Warmth & Light
- Primary:
#FFF8E7(rgb(255, 248, 231)) - Light:
#FFFCF5(rgb(255, 252, 245)) - Dark:
#F9F3E3(rgb(249, 243, 227))
Usage:
- Backgrounds (light mode)
- Card backgrounds
- Section dividers
Secondary Colors
Ember Orange — Energy & Action
- Primary:
#F97316(rgb(249, 115, 22)) - Usage: Highlights, alerts, secondary CTAs
Sage Green — Growth & Renewal
- Primary:
#10B981(rgb(16, 185, 129)) - Usage: Success states, positive feedback
Stone Gray — Neutrality & Balance
- Primary:
#6B7280(rgb(107, 114, 128)) - Usage: Muted text, borders, disabled states
System Colors
- Success:
#10B981(Green) - Warning:
#F59E0B(Amber) - Error:
#EF4444(Red) - Info:
#3B82F6(Blue)
Typography
Font Families
Headings: Inter (sans-serif)
- Modern, clean, highly readable
- Available via Google Fonts
- Font weights: 400 (Regular), 600 (Semi-Bold), 700 (Bold)
Body: Inter (sans-serif)
- Same as headings for consistency
- Font weight: 400 (Regular)
Code: Fira Code or JetBrains Mono (monospace)
- For technical documentation and code snippets
Type Scale
| Element | Size (rem) | Size (px) | Line Height | Weight |
|---|---|---|---|---|
| Display | 4.5 | 72 | 1.1 | 700 (Bold) |
| H1 | 3.0 | 48 | 1.2 | 700 (Bold) |
| H2 | 2.25 | 36 | 1.2 | 700 (Bold) |
| H3 | 1.875 | 30 | 1.3 | 600 |
| H4 | 1.5 | 24 | 1.4 | 600 |
| H5 | 1.25 | 20 | 1.4 | 600 |
| H6 | 1.125 | 18 | 1.4 | 600 |
| Body Large | 1.125 | 18 | 1.6 | 400 |
| Body | 1.0 | 16 | 1.6 | 400 |
| Body Small | 0.875 | 14 | 1.5 | 400 |
| Caption | 0.75 | 12 | 1.4 | 400 |
Usage Examples
/* Display */
font-size: 4.5rem;
line-height: 1.1;
font-weight: 700;
/* Heading 1 */
font-size: 3rem;
line-height: 1.2;
font-weight: 700;
/* Body Text */
font-size: 1rem;
line-height: 1.6;
font-weight: 400;
Spacing
We use an 8px base unit for consistent spacing across the design system.
Spacing Scale
| Token | Value (rem) | Value (px) | Usage |
|---|---|---|---|
| xs | 0.25 | 4 | Tight spacing (icons, badges) |
| sm | 0.5 | 8 | Small gaps (inline elements) |
| md | 1.0 | 16 | Default spacing (buttons, cards) |
| lg | 1.5 | 24 | Larger gaps (sections) |
| xl | 2.0 | 32 | Section padding |
| 2xl | 3.0 | 48 | Large sections |
| 3xl | 4.0 | 64 | Hero sections |
Layout
Grid System
We use a 12-column grid with responsive breakpoints.
Breakpoints
| Size | Min Width | Max Width | Columns |
|---|---|---|---|
| xs | 0px | 639px | 4 |
| sm | 640px | 767px | 8 |
| md | 768px | 1023px | 12 |
| lg | 1024px | 1279px | 12 |
| xl | 1280px | 1535px | 12 |
| 2xl | 1536px+ | — | 12 |
Container Max-Widths
- xs: 100%
- sm: 640px
- md: 768px
- lg: 1024px
- xl: 1280px
- 2xl: 1536px
Components
Buttons
Primary Button
- Background: Ruach Blue (
#1A56DB) - Text: White
- Padding:
12px 24px - Border Radius:
8px - Font Weight: 600
- Hover: Darken by 10%
Secondary Button
- Background: Transparent
- Border: 2px solid Ruach Blue
- Text: Ruach Blue
- Padding:
12px 24px - Border Radius:
8px - Hover: Fill with Ruach Blue, text becomes white
Tertiary Button
- Background: Stone Gray (
#6B7280) - Text: White
- Padding:
12px 24px - Border Radius:
8px - Hover: Darken by 10%
Input Fields
- Height:
48px - Padding:
12px 16px - Border: 1px solid
#D1D5DB - Border Radius:
8px - Font Size:
16px - Focus State: Border color changes to Ruach Blue, add 2px shadow
Cards
- Background: White (light mode) or Charcoal (dark mode)
- Border: 1px solid
#E5E7EB - Border Radius:
12px - Padding:
24px - Shadow:
0 1px 3px rgba(0,0,0,0.1) - Hover: Lift with shadow (
0 4px 6px rgba(0,0,0,0.1))
Navigation
- Height:
64px - Background: White with slight transparency
- Sticky: Yes (stays at top on scroll)
- Logo: Left-aligned
- Links: Right-aligned, horizontal spacing of 32px
Footer
- Background: Ruach Charcoal (
#1F2937) - Text: Stone Gray (
#9CA3AF) - Links: White on hover
- Padding:
64px 24px - Layout: Multi-column (responsive)
Iconography
Icon Set
We use Lucide Icons (open-source, consistent, and well-maintained).
Icon Sizes
- Small: 16px
- Medium: 24px (default)
- Large: 32px
Icon Colors
- Primary: Ruach Blue
- Secondary: Stone Gray
- Muted: Light Gray
Usage
import { Home, User, Settings } from 'lucide-react';
<Home size={24} color="#1A56DB" />
Imagery
Photography Style
- Natural lighting — Avoid overly staged or artificial looks
- Human-centered — People over objects
- Authentic moments — Real emotions, not stock photo smiles
- High contrast — Bold shadows and light
Aspect Ratios
- Hero images: 16:9
- Card images: 4:3
- Profile images: 1:1 (square)
- Banner images: 21:9 (ultra-wide)
Image Optimization
- Format: WebP (with JPG fallback)
- Compression: 80% quality
- Lazy loading: Yes (for below-the-fold images)
Motion & Animation
Principles
- Purposeful — Animations guide attention, don't distract
- Subtle — Smooth and refined, not flashy
- Fast — Animations should feel snappy (200-300ms)
Easing Functions
- Ease-in:
cubic-bezier(0.4, 0, 1, 1)— Starts slow, ends fast - Ease-out:
cubic-bezier(0, 0, 0.2, 1)— Starts fast, ends slow (default) - Ease-in-out:
cubic-bezier(0.4, 0, 0.2, 1)— Smooth both ways
Common Animations
Fade In
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
Slide Up
@keyframes slideUp {
from { transform: translateY(20px); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
Button Hover
button {
transition: all 200ms ease-out;
}
button:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
Accessibility
Color Contrast
All text must meet WCAG AA standards (4.5:1 contrast ratio for normal text, 3:1 for large text).
Tools to check:
- WebAIM Contrast Checker
- Chrome DevTools Accessibility Panel
Focus States
All interactive elements must have visible focus states for keyboard navigation.
button:focus-visible {
outline: 2px solid #1A56DB;
outline-offset: 2px;
}
Alt Text for Images
Every image must have descriptive alt text.
<img src="hero.jpg" alt="A man standing on a mountain at sunrise, arms raised in victory" />
Design Tokens (Tailwind Config)
module.exports = {
theme: {
colors: {
ruach: {
blue: '#1A56DB',
blueLight: '#3F83F8',
blueDark: '#1E429F',
charcoal: '#1F2937',
cream: '#FFF8E7',
ember: '#F97316',
sage: '#10B981',
stone: '#6B7280',
},
},
fontFamily: {
sans: ['Inter', 'sans-serif'],
mono: ['Fira Code', 'monospace'],
},
spacing: {
xs: '0.25rem', // 4px
sm: '0.5rem', // 8px
md: '1rem', // 16px
lg: '1.5rem', // 24px
xl: '2rem', // 32px
'2xl': '3rem', // 48px
'3xl': '4rem', // 64px
},
},
};
Resources
Figma Files
Tools
- Figma — Design and prototyping
- Tailwind CSS — Utility-first CSS framework
- Lucide Icons — Icon library
Questions?
If you have questions about the design system:
- GitHub Discussions: Design Topics
- Email: [email protected]
"The Lord has filled him with the Spirit of God, with skill, with intelligence, with knowledge, and with all craftsmanship." — Exodus 35:31