diff --git a/brandGuidelinesSidebars.js b/brandGuidelinesSidebars.js
new file mode 100644
index 000000000..20606757c
--- /dev/null
+++ b/brandGuidelinesSidebars.js
@@ -0,0 +1,96 @@
+/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
+const sidebars = {
+ tutorialSidebar: [
+ {
+ type: 'doc',
+ id: 'index',
+ label: 'Overview'
+ },
+ {
+ type: 'category',
+ label: 'Brand Foundation',
+ items: [
+ {
+ type: 'doc',
+ id: 'brand_foundation/dna_mission/index',
+ label: 'DNA & Mission'
+ },
+ {
+ type: 'doc',
+ id: 'brand_foundation/buyer_persona/index',
+ label: 'Buyer Persona'
+ }
+ ]
+ },
+ {
+ type: 'category',
+ label: 'Voice & Communication',
+ items: [
+ {
+ type: 'doc',
+ id: 'voice_communication/tone_of_voice/index',
+ label: 'Tone of Voice'
+ }
+ ]
+ },
+ {
+ type: 'category',
+ label: 'Visual Identity',
+ items: [
+ {
+ type: 'doc',
+ id: 'visual_identity/logo/index',
+ label: 'Logo'
+ },
+ {
+ type: 'doc',
+ id: 'visual_identity/color_system/index',
+ label: 'Color System'
+ },
+ {
+ type: 'doc',
+ id: 'visual_identity/typography/index',
+ label: 'Typography'
+ },
+ {
+ type: 'doc',
+ id: 'visual_identity/elevation/index',
+ label: 'Elevation'
+ }
+ ]
+ },
+ {
+ type: 'category',
+ label: 'Design System',
+ items: [
+ {
+ type: 'doc',
+ id: 'design_system/iconography/index',
+ label: 'Iconography'
+ },
+ {
+ type: 'doc',
+ id: 'design_system/spacing_grid/index',
+ label: 'Spacing & Grid'
+ },
+ {
+ type: 'doc',
+ id: 'design_system/components/index',
+ label: 'Components'
+ },
+ {
+ type: 'doc',
+ id: 'design_system/layout/index',
+ label: 'Layout'
+ },
+ {
+ type: 'doc',
+ id: 'design_system/interaction_behavior/index',
+ label: 'Interaction & Behavior'
+ }
+ ]
+ }
+ ]
+};
+
+module.exports = sidebars;
diff --git a/brand_guidelines/brand_foundation/buyer_persona/buyer.png b/brand_guidelines/brand_foundation/buyer_persona/buyer.png
new file mode 100644
index 000000000..bb4b15726
Binary files /dev/null and b/brand_guidelines/brand_foundation/buyer_persona/buyer.png differ
diff --git a/brand_guidelines/brand_foundation/buyer_persona/index.mdx b/brand_guidelines/brand_foundation/buyer_persona/index.mdx
new file mode 100644
index 000000000..41240f3bb
--- /dev/null
+++ b/brand_guidelines/brand_foundation/buyer_persona/index.mdx
@@ -0,0 +1,50 @@
+# Buyer Persona
+
+
+
+
+
Alex Thompson
+
Age: 35–40
+
Location: Silicon Valley, CA
+
+ Job Title: Senior Software Engineer / Tech Lead
+
+
+ Company Type: Tech company (SaaS / Cloud / AI)
+
+
+
+
+
+> "I want tools that are clear, reliable, and integrate with my workflow — without wasting time on clutter."
+
+### Goals and motivation
+
+- Save time and reduce cognitive load
+- Reliable, scalable tools for enterprise needs
+- Integrate smoothly with existing workflows
+- Professional growth & high-impact projects
+
+### Challenges and pain points
+
+- Cluttered or inconsistent UIs
+- Overloaded with information → needs clear, fast access
+- Skeptical of flashy marketing → prefers data-driven proof
+- Tools must fit developer habits → minimal onboarding
+
+### UX preferences
+
+- Minimalist, clean interfaces
+- Dark/light mode options
+- Predictable navigation
+- Functional icons over decorative elements
diff --git a/brand_guidelines/brand_foundation/dna_mission/index.mdx b/brand_guidelines/brand_foundation/dna_mission/index.mdx
new file mode 100644
index 000000000..0dd2d8613
--- /dev/null
+++ b/brand_guidelines/brand_foundation/dna_mission/index.mdx
@@ -0,0 +1,35 @@
+# DNA & Mission
+
+_This section is ready for your brand DNA and mission content._
+
+## Core values
+
+We are a company built on **hard work**, **excellence**, and **honesty**. No fluff, no gimmicks — just powerful tools that let teams focus on what matters. We believe in solving real problems with precision, not spinning around limitations or unnecessary complexity. Our ethos is simple: build smart, work hard, ship excellent results.
+
+## Mission
+
+We provide a powerful job orchestrator designed for enterprise teams. Our platform comes with built-in editors that let you create scripts, flows, and apps — and deploy them seamlessly — without worrying about dependencies, scalability, or hidden constraints.
+Unlike typical no-code tools that hit limits quickly, our solution is code-first: fully flexible, fully capable. Every “brick” is code, meaning your workflows, automations, and internal apps are limitless, robust, and future-proof.
+
+Mission Statement:
+
+- To empower companies to focus on what their tools do, not how they work.
+
+Value Proposition:
+
+- Efficiency: remove implementation headaches
+- Scalability: no limits, enterprise-ready
+- Control: full code power, minimal friction
+
+## What defines us
+
+| We are... | We are not... |
+| -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
+| ✓ Built on hard work and excellence — Every line of code, every feature, every decision reflects our commitment to quality | ✗ Marketing-heavy with flashy promises — We don't oversell capabilities or hide limitations behind buzzwords |
+| ✓ Honest and transparent — We tell you exactly what our tools can do, when they'll be ready, and how they'll help | ✗ Focused on vanity features — We won't add complexity just to have more bullet points on a feature list |
+| ✓ Problem solvers with precision — We identify real pain points and engineer elegant solutions that actually work | ✗ Compromise-makers on core functionality — We'd rather ship fewer features that work perfectly than many that work poorly |
+| ✓ Focused on what matters — We build tools that let teams concentrate on their core objectives, not fight with software | ✗ Trend-chasers — We adopt new technologies when they solve real problems, not because they're popular |
+| ✓ Performance-driven — Our tools are fast, reliable, and built to scale with your growing needs | ✗ Quick-fix merchants — We don't promise overnight transformations or magic solutions |
+| ✓ Developer-first thinkers — We understand technical workflows and build for the people who live in code | ✗ Feature-factory oriented — We won't ship half-baked features just to meet arbitrary deadlines |
+| ✓ Straightforward communicators — Clear documentation, honest timelines, and direct feedback | ✗ Hiding behind complexity — If something is hard to use, we fix the tool, not write longer documentation |
+| ✓ Continuously improving — We iterate based on real usage, not trends or assumptions | ✗ Satisfied with "good enough" — We push for excellence even when the current version works fine |
diff --git a/brand_guidelines/brand_foundation/index.mdx b/brand_guidelines/brand_foundation/index.mdx
new file mode 100644
index 000000000..57eb75064
--- /dev/null
+++ b/brand_guidelines/brand_foundation/index.mdx
@@ -0,0 +1,11 @@
+# Brand Foundation
+
+This section covers the fundamental elements that define your brand identity and target audience.
+
+## Overview
+
+The brand foundation includes:
+- DNA & Mission: Core values, mission statement, and brand personality
+- Buyer Persona: Target user profiles and their characteristics
+
+Use the navigation on the left to explore each subsection and add your specific brand foundation content.
\ No newline at end of file
diff --git a/brand_guidelines/design_system/components/index.mdx b/brand_guidelines/design_system/components/index.mdx
new file mode 100644
index 000000000..a641061c5
--- /dev/null
+++ b/brand_guidelines/design_system/components/index.mdx
@@ -0,0 +1,94 @@
+---
+title: Components
+description: Component library usage rules and guidelines for Windmill developers
+---
+
+import ButtonShowcase from '@site/src/components/guidelines/ButtonThemeToggle';
+
+# Components
+
+## Core Rules
+
+### 1. Always Use the Component Library
+
+**Never create custom components.** Use only the provided components from Windmill's library. If you need functionality that doesn't exist, request it from the design system team.
+
+### 2. No Style Hacking
+
+**Do not override component styles.** Components provide props for all supported variants and configurations. If you need a different appearance, use the appropriate prop variant.
+
+```jsx
+// ✅ Correct - use provided variants
+Submit
+
+// ❌ Wrong - don't add custom styles
+Submit
+```
+
+### 3. Check Guidelines First
+
+**Always consult these component guidelines** before implementing. Each component section specifies:
+
+- When to use each variant
+- Proper implementation patterns
+- Accessibility requirements
+- Common mistakes to avoid
+
+## Quick Reference
+
+### Before You Code
+
+1. Check if a component exists for your use case
+2. Read the component's specific guidelines
+3. Use only the documented props and variants
+4. Test accessibility with keyboard navigation
+
+## Component Reference
+
+| Component | When to Use | Examples |
+| ----------------------------- | --------------------------------------------------- | -------------------------------------------------- |
+| **[Button.svelte](#buttons)** | User actions, form submissions, navigation triggers | Save, Cancel, Submit, Create, Edit, Delete |
+| **Toggle.svelte** | Binary state changes, enable/disable features | Dark mode, notifications, auto-save, feature flags |
+
+---
+
+## Buttons
+
+Windmill uses **4 button types** with clear hierarchy. Each button type comes in 3 variants (text, icon+text, icon-only) and supports multiple states including hover, active, disabled, and selected (default and subtle only).
+
+
+
+**Button Hierarchy:**
+
+- **Accent Secondary** (Highest Priority): Main conversion CTAs on landing pages - "Sign up", "Get started", "Download"
+- **Accent** (High Priority): Most important action per view - "Save", "Submit", "Create" (only one per screen)
+- **Default** (Standard Priority): Secondary actions and most UI interactions - "Cancel", "Edit", "Delete"
+- **Subtle** (Low Priority): Tertiary actions in dense interfaces - toolbars, button groups
+
+**Button States:**
+
+- **Default**: Standard button appearance
+- **Hover**: Interactive feedback when cursor hovers over button
+- **Active/Pressed**: Visual feedback when button is clicked or pressed
+- **Disabled**: Non-interactive state for unavailable actions
+- **Selected**: Active selection state (available only for Default and Subtle variants)
+
+**Usage Rules:**
+
+- ✅ Use appropriate hierarchy, provide tooltips for icon-only buttons, test all states including disabled and selected
+- ❌ Don't use multiple Accent buttons per view, use Accent Secondary outside marketing, create custom styles, or use selected state on Accent variants
+
+## Form Components
+
+Form components are currently being redesigned and will be documented here when ready.
+
+---
+
+## Implementation Notes
+
+When implementing any component:
+
+1. **Follow the design system**: Use only the components and variants documented here
+2. **Accessibility first**: All components include built-in accessibility features
+3. **Test thoroughly**: Verify functionality across different states and themes
+4. **Ask questions**: When in doubt, consult the design system team before creating custom solutions
diff --git a/brand_guidelines/design_system/iconography/index.mdx b/brand_guidelines/design_system/iconography/index.mdx
new file mode 100644
index 000000000..a20d97415
--- /dev/null
+++ b/brand_guidelines/design_system/iconography/index.mdx
@@ -0,0 +1,41 @@
+---
+title: Iconography
+description: Icon library and usage guidelines for Windmill interfaces
+---
+
+# Iconography
+
+We use the **[Lucide icon library](https://lucide.dev/)** to ensure a consistent, modern, and lightweight visual language. Icons are line-only, aligning with our clean and technical aesthetic.
+
+## Why Lucide?
+
+Lucide provides consistent 2px stroke width, rounded joins, and professional quality across 1,000+ icons. All icons share the same 24x24 grid system and line-only style.
+
+## Sizing
+
+- **16px**: Table cells, compact interfaces
+- **20px**: Form inputs, button icons
+- **24px**: Navigation, primary actions
+- **32px**: Feature highlights, empty states
+
+## Do's and Don'ts
+
+### ✅ Do
+
+- Use Lucide icons consistently throughout the interface
+- Maintain the original 2px stroke width and style
+- Use semantic colors from our color system
+- Pair icons with text labels when possible
+- Use standard sizes (16px, 20px, 24px, 32px)
+- Ensure sufficient contrast for accessibility
+
+### ❌ Don't
+
+- Mix different icon libraries or styles
+- Modify the stroke width or visual style
+- Use icons as pure decoration without function
+- Use icons alone for complex or uncommon actions
+- Scale icons to arbitrary sizes
+- Create custom icons unless absolutely necessary
+
+Icons should enhance usability and clarity, not complicate the interface. When in doubt, prioritize clear text labels over icons alone.
\ No newline at end of file
diff --git a/brand_guidelines/design_system/index.mdx b/brand_guidelines/design_system/index.mdx
new file mode 100644
index 000000000..96a35f822
--- /dev/null
+++ b/brand_guidelines/design_system/index.mdx
@@ -0,0 +1,14 @@
+# Design System
+
+This section covers the complete design system including components, layouts, and interaction patterns.
+
+## Overview
+
+Design System includes:
+- Iconography: Icon library and usage guidelines
+- Spacing & Grid: Layout fundamentals and spacing scales
+- Components: Reusable UI components and specifications
+- Layout: Page structure and content organization principles
+- Interaction & Behavior: Animation principles and micro-interactions
+
+Use the navigation on the left to explore each subsection and add your specific design system content.
\ No newline at end of file
diff --git a/brand_guidelines/design_system/interaction_behavior/index.mdx b/brand_guidelines/design_system/interaction_behavior/index.mdx
new file mode 100644
index 000000000..d2a09903c
--- /dev/null
+++ b/brand_guidelines/design_system/interaction_behavior/index.mdx
@@ -0,0 +1,15 @@
+# Interaction & Behavior
+
+*This section is ready for your interaction and behavior guidelines.*
+
+## Suggested Content Structure
+
+- Animation principles and timing
+- Micro-interactions and hover states
+- Transition guidelines
+- Loading states and feedback
+- User feedback patterns
+- Accessibility considerations for interactions
+- Implementation examples and code
+
+Add your specific interaction and behavior guidelines here.
\ No newline at end of file
diff --git a/brand_guidelines/design_system/layout/index.mdx b/brand_guidelines/design_system/layout/index.mdx
new file mode 100644
index 000000000..2487a6330
--- /dev/null
+++ b/brand_guidelines/design_system/layout/index.mdx
@@ -0,0 +1,109 @@
+---
+title: Layout
+description: Layout guidelines and patterns for consistent user interface design
+---
+
+import ExampleImageDisplay from '@site/src/components/guidelines/ExampleImageDisplay';
+
+# Layout
+
+Our layout system ensures **consistency, clarity, and usability** across all interfaces. These guidelines establish standardized patterns for organizing content and interface elements.
+
+## Form
+
+Forms are fundamental building blocks of our application. They should be clear, efficient, and follow consistent patterns to reduce cognitive load and improve user experience.
+
+### Design Principles
+
+- **Predictable structure**: Consistent vertical hierarchy helps users scan and complete forms efficiently
+- **Clear communication**: Every element serves a purpose in guiding users toward successful completion
+- **Minimal cognitive load**: Use established patterns and clear visual hierarchy
+- **Accessible by default**: Follow semantic HTML and proper labeling conventions
+
+### Vertical Layout Guidelines
+
+All form elements follow a consistent top-to-bottom hierarchy:
+
+**Label → Description → Input → Validation/Hint**
+
+This predictable order allows users to quickly understand what information is needed and how to provide it correctly.
+
+### Spacing Guidelines
+
+Use consistent spacing to create clear relationships between form elements:
+
+- **4px gap (`gap-y-1`)** between all adjacent form elements:
+ - Label to Description
+ - Description to Input
+ - Input to Validation/Hint
+
+This tight, consistent spacing groups related elements while maintaining clear separation between form fields.
+
+### Typography Guidelines
+
+Follow our established [typography system](../../visual_identity/typography/index.mdx) for form elements:
+
+#### Label
+- **Style**: Body emphasized (`text-xs font-medium text-emphasis`)
+- **Purpose**: Clearly identify what information is required
+- **Example**: "Job name:", "Resource type:", "Environment variables:"
+
+#### Description
+- **Style**: Body (`text-xs font-normal text-primary`)
+- **Purpose**: Provide additional context or instructions
+- **Example**: "Choose a descriptive name for your automation job"
+
+#### Validation/Hint
+- **Style**: Caption (`text-2xs font-normal text-secondary`)
+- **Purpose**: Guide users with requirements or feedback
+- **Example**: "Required field", "Must be at least 8 characters", "Optional field"
+
+### Writing Guidelines
+
+#### Descriptions
+- Keep descriptions concise and actionable
+- Focus on the outcome or benefit, not the technical process
+- Use sentence case and avoid unnecessary punctuation
+- Example: ✅ "Choose the Python version for your script execution" vs ❌ "This dropdown allows you to select which Python version will be used when executing your script."
+
+#### Helper Text and Hints
+- Be specific about requirements upfront
+- Use positive language when possible
+- Provide examples for complex inputs
+- Example: ✅ "Use lowercase letters, numbers, and hyphens only" vs ❌ "Invalid characters not allowed"
+
+### Tooltip Usage
+
+Use tooltips sparingly for **additional context** that would otherwise clutter the interface:
+
+- Complex terminology or concepts that need definition
+- Background information that helps with decision-making
+- Links to relevant documentation or resources
+
+**Don't use tooltips for**:
+- Essential information needed to complete the form
+- Error messages or validation feedback
+- Basic instructions that should be in the description
+
+### Visual Example
+
+
+
+The example above demonstrates:
+- Clear label hierarchy using Body emphasized typography
+- Concise description text using Body typography
+- Consistent 4px spacing between all elements
+- Proper input field styling
+- Caption-styled hint text below the input
+
+### Implementation Notes
+
+- Always include proper semantic HTML (``, ` `, etc.)
+- Associate labels with inputs using `for` attributes or wrapping
+- Maintain consistent spacing using Tailwind's `gap-y-1` utility
+- Test form layouts across different viewport sizes
+- Ensure sufficient color contrast for all text elements
\ No newline at end of file
diff --git a/brand_guidelines/design_system/spacing_grid/index.mdx b/brand_guidelines/design_system/spacing_grid/index.mdx
new file mode 100644
index 000000000..889ef1409
--- /dev/null
+++ b/brand_guidelines/design_system/spacing_grid/index.mdx
@@ -0,0 +1,45 @@
+---
+title: Spacing & Layout
+description: Layout system and spacing guidelines for Windmill interfaces
+---
+
+# Spacing & Layout
+
+Windmill uses **Tailwind CSS spacing utilities** and **flex containers** to create consistent, responsive layouts across all interfaces.
+
+## Spacing Scale
+
+Our spacing system follows **Tailwind's default spacing scale** based on 4px increments:
+
+- **`space-1`** (4px): Micro spacing between related elements
+- **`space-2`** (8px): Base unit for component padding and margins
+- **`space-4`** (16px): Standard spacing between components
+- **`space-6`** (24px): Section spacing and larger gaps
+- **`space-8`** (32px): Page margins and major sections
+- **`space-12`** (48px): Large spacing for visual breaks
+- **`space-16`** (64px): Maximum spacing for major layout divisions
+
+## Layout System
+
+We use **Tailwind's flex utilities** for responsive layouts:
+
+- **Flex containers**: `flex flex-col` or `flex flex-row` for layout direction
+- **Spacing**: `space-x-4` and `space-y-4` for consistent gaps between elements
+- **Max width**: `max-w-6xl` (1152px) for content areas
+
+## Do's and Don'ts
+
+### ✅ Do
+
+- Use Tailwind spacing utilities (`p-4`, `m-6`, `space-x-4`) for all measurements
+- Use flex responsive classes (`flex-col md:flex-row`, `justify-between`)
+- Apply consistent container patterns (`container mx-auto px-8`)
+- Use `space-x-*` and `space-y-*` for gaps between flex items
+- Leverage Tailwind's responsive breakpoints (`sm:`, `md:`, `lg:`, `xl:`)
+
+### ❌ Don't
+
+- Use arbitrary spacing values with square brackets `[32px]`
+- Mix CSS spacing with Tailwind utilities in the same component
+- Use fixed pixel values instead of responsive utilities
+- Break responsive design patterns with custom CSS
diff --git a/brand_guidelines/index.mdx b/brand_guidelines/index.mdx
new file mode 100644
index 000000000..f2e8ff8ea
--- /dev/null
+++ b/brand_guidelines/index.mdx
@@ -0,0 +1,22 @@
+# Brand Guidelines
+
+Welcome to Windmill's comprehensive brand guidelines. This documentation serves as the single source of truth for our brand identity, ensuring consistency across all touchpoints and communications.
+
+Use the navigation tree on the left to explore the different sections of our brand guidelines. Each section contains detailed information and specifications that you can customize with your own content.
+
+## Structure Overview
+
+This brand guidelines documentation is organized into four main sections:
+
+1. **Brand Foundation** - Core DNA, mission, and buyer personas
+2. **Voice & Communication** - Tone of voice and communication principles
+3. **Visual Identity** - Logo, colors, and typography
+4. **Design System** - Components, layouts, and interactions
+
+## How to Use This Documentation
+
+Navigate through the sections using the sidebar to find the specific guidelines you need. Each section and subsection is ready for you to add your own content, examples, and specifications.
+
+---
+
+*This brand guidelines structure is ready for customization with your specific brand content.*
\ No newline at end of file
diff --git a/brand_guidelines/visual_identity/color_system/index.mdx b/brand_guidelines/visual_identity/color_system/index.mdx
new file mode 100644
index 000000000..fe9bb081f
--- /dev/null
+++ b/brand_guidelines/visual_identity/color_system/index.mdx
@@ -0,0 +1,554 @@
+---
+title: Color system
+description: Color palette and usage guidelines for the job orchestrator platform
+---
+
+import ColorDisplay from '@site/src/components/guidelines/ColorDisplay';
+import ExampleImageDisplay from '@site/src/components/guidelines/ExampleImageDisplay';
+
+# Color system
+
+Our color system is designed for **reliability, clarity, and trust**. Windmill is destined to be used by big companies, so colors must convey a sense of professionalism and seriousness. We stay away from vibrant colors in the application interface and use monochromatic tones with purposeful accent colors.
+
+## Design Principles
+
+- **Meaningful, not decorative**: Every color serves a functional purpose
+- **Reliability over vibrancy**: Muted tones convey trust and professionalism
+- **Context-aware**: Different palettes for app vs marketing contexts
+- **Accessible**: All colors meet WCAG AA contrast requirements
+- **Consistent**: Systematic approach to color usage across all interfaces
+
+## Color Philosophy
+
+**Colors are meaningful and never decorative.** We distinguish between:
+
+- **App palette**: Less vibrant colors for the core application interface
+- **Web palette**: More vibrant colors for marketing and brand recognition
+- **Monochromatic scale**: Nord-based neutrals for surfaces and backgrounds
+
+## Color Palette Overview
+
+Our complete color system in action, showing how all color categories work together across light and dark themes:
+
+
+
+## Accent Colors
+
+The **luminance-blue** is our primary accent color, used throughout the app for interactive elements, active states, and user actions.
+
+
+
+**When to use:**
+
+- Call-to-action buttons
+- Active navigation items
+- Toggle switches (on state)
+- Progress bars
+- Interactive links
+- Selected states
+
+## Surface Colors
+
+Surface colors create depth and layout structure with clear hierarchy between different interface levels.
+
+
+
+## Text Colors
+
+Text colors provide clear hierarchy and readability across light and dark themes.
+
+
+
+## Border Colors
+
+Border colors define element separation and structure.
+
+
+
+## Feedback Colors
+
+Standard semantic colors for system feedback and status communication.
+
+
+
+## Reserved Colors
+
+These colors are exclusively reserved for specific features and should not be used elsewhere.
+
+
+
+**Usage:**
+
+- AI-powered script generation
+- Magic wand icons
+- AI assistance features
+- Smart suggestions
+
+## Web/Marketing Colors
+
+More vibrant colors used exclusively for marketing materials and the website (not in the core application).
+
+
+
+**Important:** These colors should **never** be used in the core application interface. They are reserved for:
+
+- Marketing website
+- Landing pages
+- Documentation site headers
+- Brand materials
+- Social media assets
+
+## Color Reference
+
+Complete color system with usage guidelines, hex values, and Tailwind classes:
+
+**Implementation Rule:** Always use the provided Tailwind classes in your components. Never use hex values directly in styles - this ensures consistency and theme switching compatibility.
+
+```jsx
+// ✅ Correct - use Tailwind classes
+Save
+Content
+
+// ❌ Wrong - don't use hex values
+Save
+Content
+```
+
+## Do's and Don'ts
+
+### ✅ Do
+
+- Use provided Tailwind classes for all color implementations
+- Use `accent-primary` sparingly for important actions
+- Rely on surface colors for most interface backgrounds
+- Apply text colors according to content hierarchy
+- Use proper border colors for element separation
+- Apply feedback colors consistently for their semantic meaning
+- Test color combinations for accessibility compliance
+- Reserve AI purple exclusively for AI features
+- Follow the defined color token structure
+
+### ❌ Don't
+
+- Use hex values directly in component styles or CSS
+- Mix web/marketing colors with app interface colors
+- Use AI purple for non-AI features
+- Create custom color variations between defined tokens
+- Use color alone to convey meaning (pair with icons/text)
+- Apply accent colors to large surface areas
+- Use marketing blue (`#3B82F6`) in the app interface
+- Use `accent-primary` for large backgrounds
+- Mix different color token categories inappropriately
+
+## Accessibility
+
+### Contrast Requirements
+
+All color combinations meet WCAG AA standards:
+
+- **Normal text** (12px-17px): 4.5:1 contrast ratio minimum
+- **Large text** (18px+): 3:1 contrast ratio minimum
+- **Interactive elements**: 3:1 contrast ratio for focus states
+
+### Color-Blind Considerations
+
+- Never use color alone to convey information
+- Pair color with icons, text, or patterns
+- Test designs with color-blind simulation tools
+- Ensure sufficient contrast in monochrome
+
+### Focus States
+
+Always provide visible focus indicators for interactive elements. Use a 2px ring with the `border-accent` color and appropriate offset for buttons and links.
+
+## Testing Colors
+
+Before using colors in production:
+
+1. **Accessibility**: Test with WebAIM Contrast Checker
+2. **Color blindness**: Use Stark or similar tools
+3. **Dark mode**: Verify appearance in both themes
+4. **Print**: Ensure readability when printed in grayscale
+
+## Quick Reference
+
+| Color Token | Light Theme | Dark Theme | Usage |
+| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
+| **Accent Colors** | | | |
+| `accent-primary` | `#758FF8` | `#758FF8` | Call-to-action buttons, links, active states |
+| `accent-hover` | `#5074F6` | `#5074F6` | Hover states for interactive elements |
+| `accent-clicked` | `#2C5BEB` | `#2C5BEB` | Active/pressed states |
+| `accent-secondary` | `#293676` | `#E8EBFB` | Subtle accent backgrounds and emphasis |
+| `accent-secondary-hover` | `#1E255F` | `#C3C9DF` | Hover state for accent secondary elements |
+| `accent-secondary-clicked` | `#303F82` | `#9DA6CA` | Active/pressed state for accent secondary elements |
+| `accent-selected` | `rgba(191, 219, 254, 0.30)` | `rgba(103, 144, 196, 0.30)` | Selected item backgrounds |
+| **Surface Colors** | | | |
+| `surface-primary` | `#FBFBFD` | `#3B4252` | Main application background |
+| `surface-secondary` | `#EFEFF4` | `#2E3440` | Section backgrounds, panels |
+| `surface-tertiary` | `#FFFFFF` | `#434C5E` | Cards, modals, elevated content |
+| `surface-hover` | `#EEEEF5` | `#454F64` | Hover states for neutral elements |
+| `surface-selected` | `#FFFFFF` | `#434C5E` | Selected neutral elements |
+| `surface-disabled` | `#D8D8E4` | `#212732` | Disabled element backgrounds |
+| **Text Colors** | | | |
+| `text-primary` | `#4A5568` | `#D4D8DD` | Default body text and content |
+| `text-emphasis` | `#2D3748` | `#F3F4F6` | Headers, labels, important content |
+| `text-secondary` | `#718096` | `#AAB0BB` | Supporting information, metadata |
+| `text-tertiary` | `#A4A9B2` | `#A8A9AC` | Subtle text, captions |
+| `text-hint` | `#757E8F` | `#9196A1` | Placeholders, tooltips, form hints |
+| `text-disabled` | `#A0AEC0` | `#727C88` | Disabled or unavailable text |
+| **Border Colors** | | | |
+| `border-light` | `#E5E7EB` | `#495A72` | Subtle dividers, section separators |
+| `border-normal` | `#9CA3AF` | `#AAB0BB` | Standard borders, form inputs |
+| `border-accent` | `#2C5BEB` | `#2C5BEB` | Focus states, accent borders |
+| **Feedback Colors** | | | |
+| `success` | `#22C55E` | `#22C55E` | Success messages, positive feedback |
+| `warning` | `#EAB308` | `#EAB308` | Warning states, caution messages |
+| `error` | `#EF4444` | `#EF4444` | Error states, failed actions |
+| `info` | `#3B82F6` | `#3B82F6` | Information states, neutral notifications |
+| **Reserved Colors** | | | |
+| `ai-primary` | `#DE75F8` | `#DE75F8` | AI features, magic wand icons |
+| **Web/Marketing Colors** | | | |
+| `brand-vibrant` | `#3B82F6` | `#3B82F6` | Marketing primary, website headers |
+| `brand-secondary` | `#1E40AF` | `#1E40AF` | Marketing accent, website CTAs |
+| `brand-tertiary` | `#DBEAFE` | `#DBEAFE` | Marketing backgrounds, website sections |
+
+Remember: **Colors are meaningful, not decorative.** Every color choice should serve a clear functional purpose in the user interface.
diff --git a/brand_guidelines/visual_identity/elevation/index.mdx b/brand_guidelines/visual_identity/elevation/index.mdx
new file mode 100644
index 000000000..b37ca999a
--- /dev/null
+++ b/brand_guidelines/visual_identity/elevation/index.mdx
@@ -0,0 +1,91 @@
+---
+title: Elevation
+description: Surface depth and shadow guidelines for Windmill interfaces
+---
+
+# Elevation
+
+Windmill uses a **minimal elevation system** based on surface colors and strategic shadows. We prioritize clarity and simplicity over complex layering effects.
+
+## Elevation Principles
+
+- **Surface colors create depth**: Darker surfaces appear deeper than lighter ones
+- **Shadows only for overlays and movement**: Not for making elements stand out
+- **Light borders for grouping**: Preferred over shadows for content separation
+- **Use sparingly**: Limit elevation to avoid visual noise
+
+## Surface Depth System
+
+We use surface colors from our color system to create depth hierarchy:
+
+- **`surface-primary`** (#FBFBFD): Default elevation, main backgrounds
+- **`surface-secondary`** (#EFEFF4): Sunken surfaces, recessed areas
+- **`surface-tertiary`** (#FFFFFF): Elevated cards and content areas
+
+## Shadow Usage
+
+### When to Use Shadows
+
+**✅ Use shadows for:**
+- **Overlays**: Modals, dropdowns, tooltips (`shadow-lg`)
+- **Moving elements**: Drag and drop, active states (`shadow-md`)
+
+**❌ Don't use shadows for:**
+- Making buttons or elements stand out
+- Content grouping or separation
+- Decorative purposes
+- Permanent interface elements
+
+### Shadow Specifications
+
+- **`shadow-md`**: For moving elements and temporary elevation
+- **`shadow-lg`**: For overlays and floating content
+- **Light borders**: `border-light` (#E5E7EB) for grouping instead of shadows
+
+## Examples
+
+### Overlay Elevation
+
+Modals, dropdowns, and floating content use `shadow-lg` with light borders:
+
+
+
+
+
+### Sunken Surface
+
+Recessed areas use `surface-secondary` to appear deeper than the main background:
+
+
+
+
+
+## Do's and Don'ts
+
+### ✅ Do
+
+- Use `surface-secondary` for sunken or recessed areas
+- Apply `shadow-lg` only to overlays (modals, dropdowns)
+- Use `shadow-md` for elements being moved or dragged
+- Prefer light borders (`border-light`) for content grouping
+- Keep elevation simple and purposeful
+- Use `surface-tertiary` for elevated cards when needed
+
+### ❌ Don't
+
+- Use shadows to make buttons or static elements stand out
+- Combine multiple elevation techniques unnecessarily
+- Create custom shadow values outside the system
+- Use elevation purely for decoration
+- Apply heavy shadows that distract from content
+- Overuse elevation effects throughout the interface
+
+Remember: **Elevation should enhance usability, not create visual complexity.** When in doubt, use surface colors instead of shadows for depth.
\ No newline at end of file
diff --git a/brand_guidelines/visual_identity/index.mdx b/brand_guidelines/visual_identity/index.mdx
new file mode 100644
index 000000000..f525922c6
--- /dev/null
+++ b/brand_guidelines/visual_identity/index.mdx
@@ -0,0 +1,12 @@
+# Visual Identity
+
+This section covers all visual elements that make up your brand identity.
+
+## Overview
+
+Visual Identity includes:
+- Logo: Usage guidelines, variations, and spacing requirements
+- Color System: Primary, secondary, and semantic colors with specifications
+- Typography: Font families, hierarchy, and implementation guidelines
+
+Use the navigation on the left to explore each subsection and add your specific visual identity content.
\ No newline at end of file
diff --git a/brand_guidelines/visual_identity/logo/index.mdx b/brand_guidelines/visual_identity/logo/index.mdx
new file mode 100644
index 000000000..25f54de1a
--- /dev/null
+++ b/brand_guidelines/visual_identity/logo/index.mdx
@@ -0,0 +1,218 @@
+---
+title: Logo
+description: Logo guidelines and usage for Windmill brand identity
+---
+
+import LogoDownload from '@site/src/components/guidelines/LogoDownload';
+
+# Logo
+
+The Windmill logo represents a windmill with sharp blades, a reference to the first automation in history. The two colors emulate the constant movement of the windmill, conveying **motion, efficiency, and reliability**.
+
+## Logo Philosophy
+
+The Windmill logo embodies our core values:
+
+- **Automation**: Like a windmill harnesses wind power, Windmill harnesses workflow automation
+- **Efficiency**: Continuous rotation represents streamlined, optimized processes
+- **Reliability**: Solid, geometric construction conveys stability and dependability
+- **Innovation**: Modern interpretation of a classic symbol bridges tradition with technology
+
+## Logo Variants
+
+We provide multiple logo variants to ensure optimal display across different contexts and backgrounds.
+
+
+
+### Primary Variant
+
+**When to use:** The primary variant is the preferred logo choice for most applications.
+
+- **Primary**: Use on light backgrounds, white surfaces, and light-colored layouts
+
+### Secondary Variants
+
+**When to use:** Secondary variants provide contrast on dark backgrounds or when the primary logo doesn't have sufficient contrast.
+
+- **Secondary (Dark)**: Use on dark backgrounds, colored surfaces, and dark-themed interfaces
+- **Secondary (Light)**: Use on light backgrounds when you need a subtle, monochromatic appearance
+
+## Logo Animation
+
+The windmill logo is designed to rotate **clockwise** when animated. This direction reinforces the natural movement of wind-powered generators and suggests forward progress.
+
+### Animation Guidelines
+
+- **Direction**: Always rotate clockwise
+- **Speed**: Smooth, moderate rotation (not too fast to be distracting)
+- **Usage**: Use sparingly for loading states, success animations, or brand moments
+- **Duration**: 2-4 seconds per full rotation for optimal visual effect
+
+## Usage Guidelines
+
+### Logo Sizing
+
+**Minimum sizes:**
+
+- Digital: 16px height minimum
+- Print: 0.5 inch (12.7mm) height minimum
+- Favicon: 16px x 16px (use simplified version if needed)
+
+**Optimal sizes:**
+
+- Website headers: 32-48px height
+- App interfaces: 24-32px height
+- Marketing materials: 48px+ height
+- Large displays: Scale proportionally
+
+### Clear Space
+
+Maintain clear space around the logo equal to the height of one windmill blade. This ensures the logo has proper visual breathing room and maintains its impact.
+
+**Clear space = 0.25x logo height on all sides**
+
+
+
+
+
+### Background Usage
+
+**Primary (Blue) logo works on:**
+
+- White backgrounds
+- Light gray backgrounds (#F8F9FA or lighter)
+- Light colored surfaces with sufficient contrast
+
+**Secondary (White) logo works on:**
+
+- Dark backgrounds (#2D3748 or darker)
+- Colored backgrounds (ensure sufficient contrast)
+- Photography with dark tones
+- Brand color backgrounds
+
+## Do's and Don'ts
+
+### ✅ Do
+
+- Use the provided SVG files for the best quality
+- Maintain proper clear space around the logo
+- Use appropriate logo variant for the background
+- Scale the logo proportionally
+- Use high-contrast combinations
+- Rotate clockwise when animating
+- Use the logo on clean, uncluttered backgrounds
+- Use the white logo variant on dark backgrounds
+- Scale proportionally to maintain aspect ratio
+- Use only the approved color variants
+- Use clean, high-contrast backgrounds
+
+### ❌ Don't
+
+- Stretch or distort the logo proportions
+- Use low-resolution or pixelated versions
+- Place logo on busy or conflicting backgrounds
+- Use colors other than the approved variants
+- Rotate counter-clockwise or in other directions
+- Place text too close to the logo
+- Use the logo smaller than minimum size requirements
+- Add effects, shadows, or modifications to the logo
+- Use on backgrounds with insufficient contrast
+- Place the blue logo on dark backgrounds
+- Stretch the logo horizontally or vertically
+- Use custom colors or gradients on the logo
+- Place logo on busy photographic backgrounds
+
+## Technical Specifications
+
+### File Formats
+
+- **SVG**: Primary format for web and digital use
+- **PNG**: High-resolution with transparent background
+- **PDF**: Vector format for print applications
+
+### Color Specifications
+
+**Primary (Blue) Logo:**
+
+- Primary color: #758FF8 (accent-primary)
+- Secondary color: #293676 (accent-secondary)
+- Use on light backgrounds in both light and dark themes
+
+**Secondary (White) Logo:**
+
+- Single color: #FFFFFF (white)
+- Use on dark backgrounds in both light and dark themes
+
+### Export Settings
+
+**For digital use:**
+
+- Format: SVG (vector)
+- Fallback: PNG at 2x resolution
+- Transparent background
+
+**For print use:**
+
+- Format: PDF or EPS (vector)
+- CMYK color mode
+- 300 DPI minimum
+
+## Brand Integration
+
+The Windmill logo should be used consistently across all brand touchpoints:
+
+- **Website**: Header navigation, favicons, loading states
+- **Application**: Interface headers, splash screens, empty states
+- **Marketing**: Business cards, presentations, social media
+- **Documentation**: Headers, watermarks, covers
+- **Merchandise**: T-shirts, stickers, promotional items
+
+## Accessibility
+
+- Always include proper `alt` text: "Windmill" or "Windmill logo"
+- Ensure sufficient color contrast (minimum 3:1 ratio)
+- Provide text alternatives in critical contexts
+- Test logo visibility in high contrast mode
+- Consider users with color vision deficiencies
+
+## Quick Reference
+
+| Context | Logo Variant | Background | File |
+| ----------------- | ----------------- | ----------------- | -------------------------------- |
+| Light backgrounds | Primary (Blue) | White, light gray | windmill-logo-primary.svg |
+| Dark backgrounds | Secondary (White) | Dark gray, black | windmill-logo-secondary-dark.svg |
+| Light theme UI | Primary (Blue) | Light surfaces | windmill-logo-primary.svg |
+| Dark theme UI | Primary (Blue) | Light surfaces | windmill-logo-primary.svg |
+| Dark theme UI | Secondary (White) | Dark surfaces | windmill-logo-secondary-dark.svg |
+| Print materials | Primary (Blue) | White paper | windmill-logo-primary.pdf |
+| Favicons | Primary (Blue) | Browser UI | windmill-favicon.ico |
+
+Remember: **The logo is the cornerstone of our brand identity.** Use it consistently and respectfully to build strong brand recognition and trust.
diff --git a/brand_guidelines/visual_identity/typography/index.mdx b/brand_guidelines/visual_identity/typography/index.mdx
new file mode 100644
index 000000000..1706ab697
--- /dev/null
+++ b/brand_guidelines/visual_identity/typography/index.mdx
@@ -0,0 +1,566 @@
+---
+title: Typography
+description: Typography system and usage guidelines for the job orchestrator platform
+---
+
+import ColorDisplay from '@site/src/components/guidelines/ColorDisplay';
+import TypographyTable from '@site/src/components/guidelines/TypographyTable';
+
+# Typography
+
+Our typography system is designed for **clarity, efficiency, and minimalism**. With limited screen space in a complex developer tool, we prioritize readability and information density over decorative hierarchy.
+
+## Design Principles
+
+- **Space-efficient**: Default to 12px for body text to maximize content visibility
+- **Minimal hierarchy**: Only 3 header levels to avoid confusion
+- **Weight over size**: Use font-weight to create hierarchy, not excessive size changes
+- **Functional**: Every style has a clear, specific purpose
+
+## Font Family
+
+We use **Inter** for all UI text due to its excellent readability at small sizes and professional appearance.
+For technical content (IDs, code snippets, JSON), use the system **monospace** font.
+
+## Text Colors
+
+
+
+### Color Philosophy
+
+We use a **lighter default** with a **darker emphasis option** to:
+
+- Reduce eye strain during extended use
+- Create clear visual hierarchy without relying on size
+- Make emphasized content truly stand out
+- Align with modern developer tool aesthetics
+
+**Key principle:** Use `text-primary` for most content, reserve `text-emphasis` for true importance.
+
+## Type Styles
+
+### Typography Scale Overview
+
+Home,
+ specifications: '24px (text-2xl) • 600 weight (font-semibold) • text-emphasis',
+ usage: 'Main application page titles'
+ },
+ {
+ style: 'Title',
+ example: (
+ Flow inputs
+ ),
+ specifications: '18px (text-lg) • 600 weight (font-semibold) • text-emphasis',
+ usage: 'Top-level page headings, modal titles'
+ },
+ {
+ style: 'Section Header',
+ example: (
+
+ Advanced settings
+
+ ),
+ specifications: '14px (text-sm) • 600 weight (font-semibold) • text-emphasis',
+ usage: 'Panel headers, card titles, sidebar groups'
+ },
+ {
+ style: 'Body',
+ example: (
+
+ Default text throughout the application
+
+ ),
+ specifications: '12px (text-xs) • 400 weight (font-normal) • text-primary',
+ usage: 'Descriptions, content, list items, table cells'
+ },
+ {
+ style: 'Body Emphasized',
+ example: (
+ Field name:
+ ),
+ specifications: '12px (text-xs) • 500 weight (font-medium) • text-emphasis',
+ usage: 'Labels, form field labels, tab labels'
+ },
+ {
+ style: 'Secondary Text',
+ example: (
+
+ Last run 2 hours ago
+
+ ),
+ specifications: '12px (text-xs) • 400 weight (font-normal) • text-secondary',
+ usage: 'Supporting information, metadata, timestamps'
+ },
+ {
+ style: 'Caption',
+ example: (
+ Optional field
+ ),
+ specifications: '11px (text-2xs) • 400 weight (font-normal) • text-secondary',
+ usage: 'Helper text, table headers, annotations'
+ },
+ {
+ style: 'Hint',
+ example: (
+
+ Enter job name...
+
+ ),
+ specifications: '11px (text-2xs) • 400 weight (font-normal) • text-hint',
+ usage: 'Input placeholders, tooltips, empty states'
+ },
+ {
+ style: 'Code/Monospace',
+ example: (
+
+ job_id_12345
+
+ ),
+ specifications: '11px (text-2xs) • 400 weight (font-normal) • monospace (font-mono) • text-emphasis',
+ usage: 'Job IDs, code snippets, file paths, API endpoints'
+ }
+ ]}
+ darkExamples={[
+ {
+ style: 'Page Title',
+ example: Home
,
+ specifications: '24px (text-2xl) • 600 weight (font-semibold) • text-emphasis',
+ usage: 'Main application page titles'
+ },
+ {
+ style: 'Title',
+ example: (
+ Flow inputs
+ ),
+ specifications: '18px (text-lg) • 600 weight (font-semibold) • text-emphasis',
+ usage: 'Top-level page headings, modal titles'
+ },
+ {
+ style: 'Section Header',
+ example: (
+
+ Advanced settings
+
+ ),
+ specifications: '14px (text-sm) • 600 weight (font-semibold) • text-emphasis',
+ usage: 'Panel headers, card titles, sidebar groups'
+ },
+ {
+ style: 'Body',
+ example: (
+
+ Default text throughout the application
+
+ ),
+ specifications: '12px (text-xs) • 400 weight (font-normal) • text-primary',
+ usage: 'Descriptions, content, list items, table cells'
+ },
+ {
+ style: 'Body Emphasized',
+ example: (
+ Field name:
+ ),
+ specifications: '12px (text-xs) • 500 weight (font-medium) • text-emphasis',
+ usage: 'Labels, form field labels, tab labels'
+ },
+ {
+ style: 'Secondary Text',
+ example: (
+
+ Last run 2 hours ago
+
+ ),
+ specifications: '12px (text-xs) • 400 weight (font-normal) • text-secondary',
+ usage: 'Supporting information, metadata, timestamps'
+ },
+ {
+ style: 'Caption',
+ example: (
+ Optional field
+ ),
+ specifications: '11px (text-2xs) • 400 weight (font-normal) • text-secondary',
+ usage: 'Helper text, table headers, annotations'
+ },
+ {
+ style: 'Hint',
+ example: (
+
+ Enter job name...
+
+ ),
+ specifications: '11px (text-2xs) • 400 weight (font-normal) • text-hint',
+ usage: 'Input placeholders, tooltips, empty states'
+ },
+ {
+ style: 'Code/Monospace',
+ example: (
+
+ job_id_12345
+
+ ),
+ specifications: '11px (text-2xs) • 400 weight (font-normal) • monospace (font-mono) • text-emphasis',
+ usage: 'Job IDs, code snippets, file paths, API endpoints'
+ }
+ ]}
+/>
+
+### App Page Title
+
+**When to use**: Main application page titles, primary navigation headings
+
+```tsx
+className = 'font-semibold text-2xl text-emphasis';
+```
+
+- **Size**: 24px (`text-2xl`)
+- **Weight**: 600 (`font-semibold`)
+- **Color**: `text-emphasis`
+- **Example**: "Job Orchestrator", "Flow Builder", "Resource Manager"
+
+---
+
+### Page Title
+
+**When to use**: Top-level page headings, modal titles, main view names
+
+```tsx
+className = 'text-lg font-semibold text-emphasis';
+```
+
+- **Size**: 18px (`text-lg`)
+- **Weight**: 600 (`font-semibold`)
+- **Color**: `text-emphasis`
+- **Example**: "Job Orchestrator Dashboard", "Edit Flow Configuration"
+
+---
+
+### Section Header
+
+**When to use**: Panel headers, card titles, collapsible section names, sidebar groups
+
+```tsx
+className = 'text-sm font-semibold text-emphasis';
+```
+
+- **Size**: 14px (`text-sm`)
+- **Weight**: 600 (`font-semibold`)
+- **Color**: `text-emphasis`
+- **Example**: "Active Jobs", "Configuration", "Environment Variables"
+
+---
+
+### Body
+
+**When to use**: Default text throughout the application - descriptions, content, list items, table cells
+
+```tsx
+className = 'text-xs font-normal text-primary';
+```
+
+- **Size**: 12px (`text-xs`)
+- **Weight**: 400 (`font-normal`)
+- **Color**: `text-primary`
+- **Example**: Form descriptions, paragraph content, dialog text
+
+**This is your default**. When in doubt, use this style.
+
+---
+
+### Body Emphasized
+
+**When to use**: Important labels, form field labels, tab labels, emphasis within body text
+
+```tsx
+className = 'text-xs font-medium text-emphasis';
+```
+
+- **Size**: 12px (`text-xs`)
+- **Weight**: 500 (`font-medium`)
+- **Color**: `text-emphasis`
+- **Example**: "Job Name:", "Status:", button labels
+
+---
+
+### Secondary Text
+
+**When to use**: Supporting information, metadata, timestamps, status descriptions
+
+```tsx
+className = 'text-xs font-normal text-secondary';
+```
+
+- **Size**: 12px (`text-xs`)
+- **Weight**: 400 (`font-normal`)
+- **Color**: `text-secondary`
+- **Example**: "Last run 2 hours ago", "Created by John Doe", file sizes
+
+---
+
+### Caption
+
+**When to use**: Helper text below inputs, table column headers, inline annotations, badges
+
+```tsx
+className = 'text-2xs font-normal text-secondary';
+```
+
+- **Size**: 11px (`text-2xs`)
+- **Weight**: 400 (`font-normal`)
+- **Color**: `text-secondary`
+- **Example**: "Optional field", "Max 100 characters", column headers
+
+---
+
+### Hint
+
+**When to use**: Input placeholders, tooltip content, empty state messages, subtle guidance
+
+```tsx
+className = 'text-2xs font-normal text-hint';
+```
+
+- **Size**: 11px (`text-2xs`)
+- **Weight**: 400 (`font-normal`)
+- **Color**: `text-hint`
+- **Example**: "Enter job name...", "Search flows", tooltip text
+
+---
+
+### Code/Monospace
+
+**When to use**: Job IDs, code snippets, file paths, API endpoints, JSON keys, technical identifiers
+
+```tsx
+className = 'text-2xs font-mono font-normal text-emphasis';
+```
+
+- **Size**: 11px (`text-2xs`)
+- **Weight**: 400 (`font-normal`)
+- **Color**: `text-emphasis`
+- **Font**: System monospace
+- **Example**: `job_id_12345`, `/api/v1/jobs`, `ENV_VAR_NAME`
+
+**Note**: Use `text-emphasis` for code to ensure technical values stand out and are easily scannable.
+
+---
+
+## Usage Guidelines
+
+### Creating Hierarchy
+
+Use these methods in order of preference:
+
+1. **Font weight** - Semibold (600) for headers, medium (500) for emphasis, normal (400) for body
+2. **Color** - Primary for main content, secondary for supporting info, hint for subtle guidance
+3. **Size** - Only change size for true hierarchy levels (page title vs section header vs body)
+
+**Don't** create hierarchy by:
+
+- Making text larger than 24px (except for App Page Titles)
+- Using more than 3 header levels
+- Adding excessive spacing or borders
+
+## Creating Visual Hierarchy - Priority Order
+
+1. **Font Weight** - Use medium (500) or semibold (600) for emphasis
+2. **Color** - Use textEmphasis for important content
+3. **Position & Spacing** - Group related content, add white space
+4. **Size** - Only use defined type styles, never custom sizes
+
+### ❌ Don't
+- Increase font size to make something "stand out"
+- Create one-off font sizes for special cases
+- Use large headers in dense UI areas
+
+### ✅ Do
+- Use font-weight to emphasize within the same size
+- Use textEmphasis color for important content
+- Add spacing around important elements
+
+## Text Casing
+
+### Primary Rule: Use Sentence Case
+
+Use sentence case for all UI text—capitalize only the first word and proper nouns. This approach improves readability and is faster to implement consistently.
+
+**Examples:**
+
+- ✅ "Create new flow"
+- ✅ "Edit Windmill resource"
+- ❌ "Create New Flow"
+- ❌ "SAVE CHANGES"
+
+### Casing by Component Type
+
+**Page titles and headings**
+
+- Use sentence case: "Job orchestrator dashboard"
+
+**Buttons and actions**
+
+- Use sentence case: "Save changes", "Delete job"
+
+**Form labels**
+
+- Use sentence case: "Job name", "Resource type"
+
+**Navigation items**
+
+- Use sentence case: "User settings", "Resource manager"
+
+**Error messages and notifications**
+
+- Use sentence case: "Job completed successfully"
+
+### Always Capitalize
+
+- **Proper nouns**: Windmill, Docker, Python, GitHub
+- **Acronyms**: API, HTTP, JSON, SQL
+- **First word** of any sentence or UI element
+
+### Special Cases
+
+- **Technical identifiers**: Keep original casing (`job_id_123`, `ENV_VAR`)
+- **Brand names**: Follow brand guidelines (iPhone, macOS)
+- **Abbreviations**: Use standard forms (ID, URL, vs.)
+
+### Accessibility Note
+
+Avoid ALL CAPS text except for very short labels (2-3 characters max). All caps text is slower to read and can appear aggressive to users.
+
+## Decision Tree
+
+Not sure which style to use? Follow this:
+
+Is it a main application page title?
+→ **Yes**: App Page Title (24px, semibold)
+→ **No**: Continue
+
+Is it a page or modal title?
+→ **Yes**: Page Title (18px, semibold)
+→ **No**: Continue
+
+Is it a section/panel header?
+→ **Yes**: Section Header (14px, semibold)
+→ **No**: Continue
+
+Is it technical data (ID, code, path)?
+→ **Yes**: Code/Monospace (11px, mono)
+→ **No**: Continue
+
+Is it a placeholder or tooltip?
+→ **Yes**: Hint (11px, hint color)
+→ **No**: Continue
+
+Is it helper text or a table header?
+→ **Yes**: Caption (11px, secondary color)
+→ **No**: Continue
+
+Is it metadata or supporting info?
+→ **Yes**: Secondary Text (12px, secondary color)
+→ **No**: Continue
+
+Is it a label or needs emphasis?
+→ **Yes**: Body Emphasized (12px, medium weight, emphasis color)
+→ **No**: Body (12px, normal, primary color) ← **DEFAULT**
+
+## Accessibility
+
+- Maintain WCAG AA contrast ratios (4.5:1 for normal text, 3:1 for large text)
+- All text colors meet contrast requirements on standard backgrounds
+- Never use font size alone to convey meaning
+- Ensure disabled text (`text-disabled`) is paired with visual disabled states
+
+## Common Mistakes
+
+❌ **Don't** create custom font sizes between defined styles
+✅ **Do** use the defined type styles
+
+❌ **Don't** use Section Header inside table cells
+✅ **Do** use Caption for table headers
+
+❌ **Don't** use Body Emphasized everywhere for "importance"
+✅ **Do** reserve it for labels and truly emphasized content
+
+❌ **Don't** make job IDs or code bold/colored
+✅ **Do** use monospace font with text-emphasis for technical identifiers
+
+❌ **Don't** use text-emphasis for body paragraphs
+✅ **Do** use text-primary for most content, text-emphasis for headers/labels
diff --git a/brand_guidelines/voice_communication/index.mdx b/brand_guidelines/voice_communication/index.mdx
new file mode 100644
index 000000000..3711ff249
--- /dev/null
+++ b/brand_guidelines/voice_communication/index.mdx
@@ -0,0 +1,10 @@
+# Voice & Communication
+
+This section defines how your brand communicates across all channels and touchpoints.
+
+## Overview
+
+Voice & Communication includes:
+- Tone of Voice: Writing guidelines and communication principles
+
+Use the navigation on the left to explore and add your specific voice and communication guidelines.
\ No newline at end of file
diff --git a/brand_guidelines/voice_communication/tone_of_voice/index.mdx b/brand_guidelines/voice_communication/tone_of_voice/index.mdx
new file mode 100644
index 000000000..f37a6c53b
--- /dev/null
+++ b/brand_guidelines/voice_communication/tone_of_voice/index.mdx
@@ -0,0 +1,12 @@
+# Tone of Voice
+
+Your tone of voice should match the serious, professional, no-nonsense character of the product and brand.
+
+## Suggested Content Structure
+
+| **Approach** | **✅ Do This** | **❌ Not This** |
+| ----------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------- |
+| **Direct & Honest** – Say exactly what the product does, no marketing fluff. | "Deploy complex workflows in minutes." | "Experience seamless automation magic." |
+| **Technical & Precise** – Speak like your audience: developers and engineers. | "Scale scripts without worrying about dependencies." | "Your team will love our easy drag-and-drop interface." |
+| **Confident & Assertive** – Show that the product can handle anything. | "No limitations. Every workflow is fully customizable." | "Works well for most use cases." |
+| **Minimalist & Functional** – Avoid unnecessary adjectives or filler words. | | |
diff --git a/docusaurus.config.js b/docusaurus.config.js
index 2d0e1258c..b68e12aa3 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -70,6 +70,15 @@ const config = {
blogSidebarCount: 0,
postsPerPage: 'ALL'
}
+ ],
+ [
+ '@docusaurus/plugin-content-docs',
+ {
+ id: 'brand-guidelines',
+ path: 'brand_guidelines',
+ routeBasePath: 'brand-guidelines',
+ sidebarPath: require.resolve('./brandGuidelinesSidebars.js')
+ }
]
],
presets: [
@@ -79,6 +88,7 @@ const config = {
/** @type {import('@docusaurus/preset-classic').Options} */
({
docs: {
+ id: 'default',
sidebarPath: require.resolve('./sidebars.js')
},
blog: {
@@ -147,7 +157,8 @@ const config = {
type: 'doc',
docId: 'intro',
position: 'left',
- label: 'Docs'
+ label: 'Docs',
+ docsPluginId: 'default'
},
{
to: 'https://app.windmill.dev/',
diff --git a/src/components/guidelines/ButtonThemeToggle.js b/src/components/guidelines/ButtonThemeToggle.js
new file mode 100644
index 000000000..566e7260a
--- /dev/null
+++ b/src/components/guidelines/ButtonThemeToggle.js
@@ -0,0 +1,72 @@
+import React, { useState } from 'react';
+import { twMerge } from 'tailwind-merge';
+
+const ButtonThemeToggle = ({ buttonType, title, description }) => {
+ const [isDark, setIsDark] = useState(false);
+
+ const getImageSrc = (type, theme) => {
+ return `/img/brand/buttons/${type}-${theme}.svg`;
+ };
+
+ return (
+
+
+
{title}
+ setIsDark(!isDark)}
+ className="flex items-center gap-2 px-2 py-1 text-xs border border-gray-300 rounded hover:bg-gray-50 transition-colors"
+ >
+ {isDark ? '☀️' : '🌙'}
+ {isDark ? 'Light' : 'Dark'}
+
+
+
+
+
+
+
+
{description}
+
+ );
+};
+
+const ButtonShowcase = () => {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ButtonShowcase;
diff --git a/src/components/guidelines/ColorDisplay.js b/src/components/guidelines/ColorDisplay.js
new file mode 100644
index 000000000..9f7bf57d4
--- /dev/null
+++ b/src/components/guidelines/ColorDisplay.js
@@ -0,0 +1,42 @@
+import React, { useState } from 'react';
+import DarkModeToggle from './DarkModeToggle';
+import { getTextClass, getSurfaceClass, getBorderClass } from '../../utils/themeColors';
+
+const ColorDisplay = ({ colors, darkColors }) => {
+ const [isDarkMode, setIsDarkMode] = useState(false);
+ const currentColors = isDarkMode && darkColors ? darkColors : colors;
+ const hasToggle = darkColors && darkColors.length > 0;
+
+ return (
+
+ {hasToggle && (
+
+ setIsDarkMode(!isDarkMode)} />
+
+ )}
+
+ {currentColors.map((color, index) => (
+
+
+
+ {color.name}
+
+
+ {color.hex}
+
+ {color.description && (
+
+ {color.description}
+
+ )}
+
+ ))}
+
+
+ );
+};
+
+export default ColorDisplay;
diff --git a/src/components/guidelines/DarkModeToggle.js b/src/components/guidelines/DarkModeToggle.js
new file mode 100644
index 000000000..2439b76d4
--- /dev/null
+++ b/src/components/guidelines/DarkModeToggle.js
@@ -0,0 +1,25 @@
+import React from 'react';
+
+const DarkModeToggle = ({ isDarkMode, onToggle, style = {} }) => {
+ return (
+
+ {isDarkMode ? '☀️ Light mode' : '🌙 Dark mode'}
+
+ );
+};
+
+export default DarkModeToggle;
diff --git a/src/components/guidelines/ExampleImageDisplay.js b/src/components/guidelines/ExampleImageDisplay.js
new file mode 100644
index 000000000..b519bdcde
--- /dev/null
+++ b/src/components/guidelines/ExampleImageDisplay.js
@@ -0,0 +1,44 @@
+import React, { useState } from 'react';
+import DarkModeToggle from './DarkModeToggle';
+
+const ExampleImageDisplay = ({
+ lightImageSrc,
+ darkImageSrc,
+ altTextPrefix = 'Example',
+ className = '',
+ style = {}
+}) => {
+ const [isDarkMode, setIsDarkMode] = useState(false);
+
+ // If no dark image provided, use the same image for both themes
+ const currentImageSrc = isDarkMode && darkImageSrc ? darkImageSrc : lightImageSrc;
+ const currentAltText = `${altTextPrefix} - ${isDarkMode ? 'Dark' : 'Light'} theme`;
+
+ return (
+
+
+ setIsDarkMode(!isDarkMode)} />
+
+
+
+
+
+
+ );
+};
+
+export default ExampleImageDisplay;
\ No newline at end of file
diff --git a/src/components/guidelines/LogoDownload.js b/src/components/guidelines/LogoDownload.js
new file mode 100644
index 000000000..7085980e2
--- /dev/null
+++ b/src/components/guidelines/LogoDownload.js
@@ -0,0 +1,216 @@
+import React, { useState } from 'react';
+
+const LogoDownload = ({ logos }) => {
+ const [downloadStatus, setDownloadStatus] = useState({});
+
+ const downloadSVG = async (url, filename) => {
+ setDownloadStatus(prev => ({ ...prev, [filename]: 'downloading' }));
+
+ try {
+ // First, try the modern fetch + blob approach
+ const response = await fetch(url, {
+ method: 'GET',
+ headers: {
+ 'Accept': 'image/svg+xml,*/*'
+ }
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+
+ const svgContent = await response.text();
+
+ // Create blob with explicit MIME type
+ const blob = new Blob([svgContent], {
+ type: 'image/svg+xml;charset=utf-8'
+ });
+
+ // Try modern download API first (Chrome supports this)
+ if (window.showSaveFilePicker) {
+ try {
+ const fileHandle = await window.showSaveFilePicker({
+ suggestedName: filename,
+ types: [{
+ description: 'SVG files',
+ accept: { 'image/svg+xml': ['.svg'] }
+ }]
+ });
+ const writable = await fileHandle.createWritable();
+ await writable.write(blob);
+ await writable.close();
+ setDownloadStatus(prev => ({ ...prev, [filename]: 'success' }));
+ return;
+ } catch (err) {
+ // User cancelled the save dialog
+ if (err.name === 'AbortError') {
+ setDownloadStatus(prev => ({ ...prev, [filename]: null }));
+ return; // Don't proceed with fallback if user cancelled
+ }
+ // API failed, fall back to traditional method
+ console.log('File System API failed, using fallback:', err);
+ }
+ }
+
+ // Fallback: Traditional blob download (works in Chrome)
+ const downloadUrl = URL.createObjectURL(blob);
+
+ const link = document.createElement('a');
+ link.href = downloadUrl;
+ link.download = filename;
+ link.style.display = 'none';
+
+ // Ensure the link is properly attached before clicking
+ document.body.appendChild(link);
+
+ // Use setTimeout to ensure Chrome processes the DOM change
+ setTimeout(() => {
+ try {
+ link.click();
+ setDownloadStatus(prev => ({ ...prev, [filename]: 'success' }));
+ } catch (clickError) {
+ console.error('Click failed:', clickError);
+ // Final fallback: open in new tab
+ window.open(downloadUrl, '_blank');
+ setDownloadStatus(prev => ({ ...prev, [filename]: 'opened' }));
+ }
+
+ // Cleanup
+ setTimeout(() => {
+ document.body.removeChild(link);
+ URL.revokeObjectURL(downloadUrl);
+ }, 100);
+ }, 50);
+
+ } catch (error) {
+ console.error('Error downloading SVG:', error);
+ setDownloadStatus(prev => ({ ...prev, [filename]: 'error' }));
+
+ // Ultimate fallback: direct navigation to file
+ try {
+ window.open(url, '_blank');
+ setDownloadStatus(prev => ({ ...prev, [filename]: 'opened' }));
+ } catch (fallbackError) {
+ console.error('All download methods failed:', fallbackError);
+ }
+ }
+
+ // Reset status after a delay
+ setTimeout(() => {
+ setDownloadStatus(prev => ({ ...prev, [filename]: null }));
+ }, 3000);
+ };
+
+ const getButtonClasses = (status) => {
+ switch (status) {
+ case 'downloading':
+ return 'bg-gray-400';
+ case 'success':
+ return 'bg-feedback-success';
+ case 'error':
+ return 'bg-feedback-error';
+ case 'opened':
+ return 'bg-feedback-warning';
+ default:
+ return 'bg-accent-primary hover:bg-accent-hover';
+ }
+ };
+
+ const getButtonText = (status) => {
+ switch (status) {
+ case 'downloading':
+ return 'Downloading...';
+ case 'success':
+ return 'Downloaded!';
+ case 'error':
+ return 'Failed - Try Again';
+ case 'opened':
+ return 'Opened in Tab';
+ default:
+ return 'Download SVG';
+ }
+ };
+
+ const getTextClasses = (background) => {
+ // Determine if background is dark based on color value
+ const isDarkBackground = background === '#2d3748' ||
+ background.toLowerCase().includes('dark') ||
+ (background.startsWith('#') && parseInt(background.slice(1), 16) < 0x808080);
+
+ if (isDarkBackground) {
+ return {
+ title: 'text-text-emphasis-dark',
+ description: 'text-text-secondary-dark'
+ };
+ } else {
+ return {
+ title: 'text-text-emphasis-light',
+ description: 'text-text-secondary-light'
+ };
+ }
+ };
+
+ return (
+
+ {logos.map((logo, index) => {
+ const textClasses = getTextClasses(logo.background);
+ return (
+
+
+
+
+
+ {logo.variant}
+
+
+ {logo.description}
+
+
downloadSVG(logo.url, logo.filename)}
+ disabled={downloadStatus[logo.filename] === 'downloading'}
+ className={`text-white border-none rounded-md px-4 py-2 text-xs font-medium transition-colors duration-200 ${
+ downloadStatus[logo.filename] === 'downloading'
+ ? 'cursor-not-allowed opacity-70'
+ : 'cursor-pointer'
+ } ${getButtonClasses(downloadStatus[logo.filename])}`}
+ >
+ {getButtonText(downloadStatus[logo.filename])}
+
+
+ );
+ })}
+
+ );
+};
+
+export default LogoDownload;
\ No newline at end of file
diff --git a/src/components/guidelines/TypographyTable.js b/src/components/guidelines/TypographyTable.js
new file mode 100644
index 000000000..6fa3b6aea
--- /dev/null
+++ b/src/components/guidelines/TypographyTable.js
@@ -0,0 +1,65 @@
+import React, { useState } from 'react';
+import DarkModeToggle from './DarkModeToggle';
+import { getTextClass, getSurfaceClass } from '../../utils/themeColors';
+
+const TypographyTable = ({ lightExamples, darkExamples }) => {
+ const [isDarkMode, setIsDarkMode] = useState(false);
+ const currentExamples = isDarkMode ? darkExamples : lightExamples;
+
+ return (
+
+
+ setIsDarkMode(!isDarkMode)} />
+
+
+
+
+
+
+
+ Style
+
+
+ Example
+
+
+ Specifications
+
+
+ Usage
+
+
+
+
+ {currentExamples.map((row, index) => (
+
+
+ {row.style}
+
+ {row.example}
+
+ {row.specifications}
+
+
+ {row.usage}
+
+
+ ))}
+
+
+
+
+ );
+};
+
+export default TypographyTable;
diff --git a/src/utils/themeColors.js b/src/utils/themeColors.js
new file mode 100644
index 000000000..e367cc916
--- /dev/null
+++ b/src/utils/themeColors.js
@@ -0,0 +1,99 @@
+/**
+ * Utility functions for dynamic color selection based on theme and background
+ */
+
+/**
+ * Get the appropriate text color classes based on background
+ * @param {string} background - Background color hex or identifier
+ * @param {boolean} isDarkMode - Whether dark mode is active
+ * @returns {object} Object with title and description classes
+ */
+export const getTextClasses = (background, isDarkMode = false) => {
+ // Determine if background is dark based on color value
+ const isDarkBackground = background === '#2d3748' ||
+ background.toLowerCase().includes('dark') ||
+ (background.startsWith('#') && parseInt(background.slice(1), 16) < 0x808080);
+
+ if (isDarkBackground) {
+ return {
+ title: 'text-text-emphasis-dark',
+ description: 'text-text-secondary-dark'
+ };
+ } else {
+ return {
+ title: 'text-text-emphasis-light',
+ description: 'text-text-secondary-light'
+ };
+ }
+};
+
+/**
+ * Get button state classes for different statuses
+ * @param {string} status - Button status (downloading, success, error, opened, default)
+ * @returns {string} Tailwind classes for button styling
+ */
+export const getButtonClasses = (status) => {
+ switch (status) {
+ case 'downloading':
+ return 'bg-gray-400';
+ case 'success':
+ return 'bg-feedback-success';
+ case 'error':
+ return 'bg-feedback-error';
+ case 'opened':
+ return 'bg-feedback-warning';
+ default:
+ return 'bg-accent-primary hover:bg-accent-hover';
+ }
+};
+
+/**
+ * Get surface color class based on variant and theme
+ * @param {string} variant - Surface variant (primary, secondary, tertiary, hover, selected, disabled)
+ * @param {boolean} isDarkMode - Whether dark mode is active
+ * @returns {string} Tailwind class for surface color
+ */
+export const getSurfaceClass = (variant = 'primary', isDarkMode = false) => {
+ const theme = isDarkMode ? 'dark' : 'light';
+ return `bg-surface-${variant}-${theme}`;
+};
+
+/**
+ * Get text color class based on variant and theme
+ * @param {string} variant - Text variant (primary, emphasis, secondary, tertiary, hint, disabled)
+ * @param {boolean} isDarkMode - Whether dark mode is active
+ * @returns {string} Tailwind class for text color
+ */
+export const getTextClass = (variant = 'primary', isDarkMode = false) => {
+ const theme = isDarkMode ? 'dark' : 'light';
+ return `text-text-${variant}-${theme}`;
+};
+
+/**
+ * Get border color class based on variant and theme
+ * @param {string} variant - Border variant (light, normal, accent)
+ * @param {boolean} isDarkMode - Whether dark mode is active
+ * @returns {string} Tailwind class for border color
+ */
+export const getBorderClass = (variant = 'normal', isDarkMode = false) => {
+ const theme = isDarkMode ? 'dark' : 'light';
+ return `border-border-${variant}-${theme}`;
+};
+
+/**
+ * Get accent color class based on variant
+ * @param {string} variant - Accent variant (primary, hover, clicked)
+ * @returns {string} Tailwind class for accent color
+ */
+export const getAccentClass = (variant = 'primary') => {
+ return `bg-accent-${variant}`;
+};
+
+/**
+ * Get feedback color class based on type
+ * @param {string} type - Feedback type (success, warning, error, info)
+ * @returns {string} Tailwind class for feedback color
+ */
+export const getFeedbackClass = (type) => {
+ return `bg-feedback-${type}`;
+};
\ No newline at end of file
diff --git a/static/img/brand/buttons/accent-dark.svg b/static/img/brand/buttons/accent-dark.svg
new file mode 100644
index 000000000..442a9a274
--- /dev/null
+++ b/static/img/brand/buttons/accent-dark.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/buttons/accent-light.svg b/static/img/brand/buttons/accent-light.svg
new file mode 100644
index 000000000..ff6d8e38b
--- /dev/null
+++ b/static/img/brand/buttons/accent-light.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/buttons/accent-secondary-dark.svg b/static/img/brand/buttons/accent-secondary-dark.svg
new file mode 100644
index 000000000..3f0b2ea25
--- /dev/null
+++ b/static/img/brand/buttons/accent-secondary-dark.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/buttons/accent-secondary-light.svg b/static/img/brand/buttons/accent-secondary-light.svg
new file mode 100644
index 000000000..d8d443b21
--- /dev/null
+++ b/static/img/brand/buttons/accent-secondary-light.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/buttons/default-dark.svg b/static/img/brand/buttons/default-dark.svg
new file mode 100644
index 000000000..dcdae7f9b
--- /dev/null
+++ b/static/img/brand/buttons/default-dark.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/buttons/default-light.svg b/static/img/brand/buttons/default-light.svg
new file mode 100644
index 000000000..9341566ea
--- /dev/null
+++ b/static/img/brand/buttons/default-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/buttons/subtle-dark.png b/static/img/brand/buttons/subtle-dark.png
new file mode 100644
index 000000000..7f83f1001
Binary files /dev/null and b/static/img/brand/buttons/subtle-dark.png differ
diff --git a/static/img/brand/buttons/subtle-dark.svg b/static/img/brand/buttons/subtle-dark.svg
new file mode 100644
index 000000000..963330e98
--- /dev/null
+++ b/static/img/brand/buttons/subtle-dark.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/buttons/subtle-light.svg b/static/img/brand/buttons/subtle-light.svg
new file mode 100644
index 000000000..6003161d6
--- /dev/null
+++ b/static/img/brand/buttons/subtle-light.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/elevation-overlay.svg b/static/img/brand/elevation-overlay.svg
new file mode 100644
index 000000000..931fae1f5
--- /dev/null
+++ b/static/img/brand/elevation-overlay.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/elevation-sunken.svg b/static/img/brand/elevation-sunken.svg
new file mode 100644
index 000000000..fa55ba97b
--- /dev/null
+++ b/static/img/brand/elevation-sunken.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/example-color-palette-dark.svg b/static/img/brand/example-color-palette-dark.svg
new file mode 100644
index 000000000..7c678af5e
--- /dev/null
+++ b/static/img/brand/example-color-palette-dark.svg
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/example-color-palette-light.svg b/static/img/brand/example-color-palette-light.svg
new file mode 100644
index 000000000..59b2bcf2f
--- /dev/null
+++ b/static/img/brand/example-color-palette-light.svg
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/layout/form-dark.svg b/static/img/brand/layout/form-dark.svg
new file mode 100644
index 000000000..882a4725e
--- /dev/null
+++ b/static/img/brand/layout/form-dark.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/layout/form-light.svg b/static/img/brand/layout/form-light.svg
new file mode 100644
index 000000000..261605d8c
--- /dev/null
+++ b/static/img/brand/layout/form-light.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/logos/windmill-logo-primary.svg b/static/img/brand/logos/windmill-logo-primary.svg
new file mode 100644
index 000000000..2a6df187c
--- /dev/null
+++ b/static/img/brand/logos/windmill-logo-primary.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/logos/windmill-logo-secondary-dark.svg b/static/img/brand/logos/windmill-logo-secondary-dark.svg
new file mode 100644
index 000000000..b6e0eae6f
--- /dev/null
+++ b/static/img/brand/logos/windmill-logo-secondary-dark.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/logos/windmill-logo-secondary-light.svg b/static/img/brand/logos/windmill-logo-secondary-light.svg
new file mode 100644
index 000000000..858c5fe68
--- /dev/null
+++ b/static/img/brand/logos/windmill-logo-secondary-light.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/static/img/brand/margin.svg b/static/img/brand/margin.svg
new file mode 100644
index 000000000..1b7a065aa
--- /dev/null
+++ b/static/img/brand/margin.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tailwind.config.js b/tailwind.config.js
index 67db70eff..011cd7dfd 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -3,6 +3,58 @@ const plugin = require('tailwindcss/plugin');
module.exports = {
darkMode: ['class', '[data-theme="dark"]'],
content: ['./src/**/*.{html,js,jsx,tsx}'],
+ safelist: [
+ // Brand color classes that may be generated dynamically
+ 'bg-surface-primary-light',
+ 'bg-surface-primary-dark',
+ 'bg-surface-secondary-light',
+ 'bg-surface-secondary-dark',
+ 'bg-surface-tertiary-light',
+ 'bg-surface-tertiary-dark',
+ 'bg-surface-hover-light',
+ 'bg-surface-hover-dark',
+ 'bg-surface-selected-light',
+ 'bg-surface-selected-dark',
+ 'bg-surface-disabled-light',
+ 'bg-surface-disabled-dark',
+ 'text-text-primary-light',
+ 'text-text-primary-dark',
+ 'text-text-emphasis-light',
+ 'text-text-emphasis-dark',
+ 'text-text-secondary-light',
+ 'text-text-secondary-dark',
+ 'text-text-tertiary-light',
+ 'text-text-tertiary-dark',
+ 'text-text-hint-light',
+ 'text-text-hint-dark',
+ 'text-text-disabled-light',
+ 'text-text-disabled-dark',
+ 'border-border-light-light',
+ 'border-border-light-dark',
+ 'border-border-normal-light',
+ 'border-border-normal-dark',
+ 'border-border-accent-light',
+ 'border-border-accent-dark',
+ 'bg-accent-primary',
+ 'bg-accent-hover',
+ 'bg-accent-clicked',
+ 'bg-accent-secondary-light',
+ 'bg-accent-secondary-dark',
+ 'bg-feedback-success',
+ 'bg-feedback-warning',
+ 'bg-feedback-error',
+ 'bg-feedback-info',
+ // Typography classes used in guidelines
+ 'text-2xl',
+ 'text-lg',
+ 'text-sm',
+ 'text-xs',
+ 'text-2xs',
+ 'font-normal',
+ 'font-medium',
+ 'font-semibold',
+ 'font-mono'
+ ],
extend: {
height: {
'80v': '80vh',
@@ -28,6 +80,9 @@ module.exports = {
'"Courier New"',
'monospace'
]
+ },
+ fontSize: {
+ '2xs': ['11px', { lineHeight: '16px' }]
}
},
theme: {
@@ -46,6 +101,72 @@ module.exports = {
900: '#2e3440',
950: '#1e232e',
1000: '#181c24'
+ },
+ // Brand accent colors
+ accent: {
+ primary: '#758FF8',
+ hover: '#5074F6',
+ clicked: '#2C5BEB',
+ 'secondary-light': '#293676',
+ 'secondary-dark': '#E8EBFB',
+ 'selected-light': 'rgba(191, 219, 254, 0.3)',
+ 'selected-dark': 'rgba(37, 99, 235, 0.3)'
+ },
+ // Surface colors - flattened for proper Tailwind class generation
+ surface: {
+ 'primary-light': '#FBFBFD',
+ 'primary-dark': '#3B4252',
+ 'secondary-light': '#EFEFF4',
+ 'secondary-dark': '#2E3440',
+ 'tertiary-light': '#FFFFFF',
+ 'tertiary-dark': '#434C5E',
+ 'hover-light': '#EEEEF5',
+ 'hover-dark': '#454F64',
+ 'selected-light': '#FFFFFF',
+ 'selected-dark': '#434C5E',
+ 'disabled-light': '#D8D8E4',
+ 'disabled-dark': '#212732'
+ },
+ // Text colors - flattened for proper Tailwind class generation
+ text: {
+ 'primary-light': '#4A5568',
+ 'primary-dark': '#D4D8DD',
+ 'emphasis-light': '#2D3748',
+ 'emphasis-dark': '#F3F4F6',
+ 'secondary-light': '#718096',
+ 'secondary-dark': '#AAB0BB',
+ 'tertiary-light': '#A4A9B2',
+ 'tertiary-dark': '#A8A9AC',
+ 'hint-light': '#757E8F',
+ 'hint-dark': '#9196A1',
+ 'disabled-light': '#A0AEC0',
+ 'disabled-dark': '#727C88'
+ },
+ // Border colors - flattened for proper Tailwind class generation
+ border: {
+ 'light-light': '#E5E7EB',
+ 'light-dark': '#495A72',
+ 'normal-light': '#9CA3AF',
+ 'normal-dark': '#AAB0BB',
+ 'accent-light': '#758FF8',
+ 'accent-dark': '#FFFFFF'
+ },
+ // Feedback colors (same for light/dark)
+ feedback: {
+ success: '#22C55E',
+ warning: '#EAB308',
+ error: '#EF4444',
+ info: '#3B82F6'
+ },
+ // Reserved colors
+ ai: {
+ primary: '#8B5CF6'
+ },
+ // Web/Marketing colors (not for app use)
+ brand: {
+ vibrant: '#3B82F6',
+ secondary: '#1E40AF',
+ tertiary: '#DBEAFE'
}
}
}