theme-scss
Complete SCSS variable reference for Odoo themes. Covers all three core variable systems: $o-theme-font-configs (Google Fonts), $o-color-palettes (color system with 5 semantic colors), and $o-website-values-palettes (115+ keys for typography, buttons, inputs, headers, footers, layout). Includes SCSS load order rules and color derivation. <example> Context: User asks about SCSS variables user: "What SCSS variables can I configure in my Odoo theme?" assistant: "I will use the theme-scss skill to show the complete variable reference." <commentary>Variable reference lookup.</commentary> </example> <example> Context: User wants to configure colors user: "How do I set up o-color-1 through o-color-5?" assistant: "I will explain the semantic color system and palette configuration." <commentary>Color palette configuration.</commentary> </example> <example> Context: User gets undefined variable error user: "I get 'Undefined variable $o-color-palettes' in my theme" assistant: "This is a SCSS load order issue. Theme files load BEFORE core variables." <commentary>SCSS debugging - load order issue.</commentary> </example> <example> Context: User wants to configure fonts user: "How do I add Google Fonts to my Odoo theme?" assistant: "Use $o-theme-font-configs with the font query parameter, not the full URL." <commentary>Font configuration.</commentary> </example>
What this skill does
# Odoo Theme SCSS Variable Reference
## Critical Load Order Rule
Theme SCSS files load BEFORE core Odoo variables are defined:
```
1. YOUR theme's primary_variables.scss (via prepend) ← FIRST
2. Odoo core primary_variables.scss ← SECOND
CONSEQUENCE: CANNOT use map-merge() with core variables!
```
**WRONG**: `$o-color-palettes: map-merge($o-color-palettes, (...));` → Undefined variable error
**RIGHT**: Define standalone variables without map-merge
---
## 1. $o-theme-font-configs — Google Fonts
```scss
$o-theme-font-configs: (
'<Font Name>': (
'family': (<CSS font-family list>), // Required
'url': '<Google Fonts query param>', // Required — NOT the full URL!
'properties': ( // Optional: per-context overrides
'<font-alias>': ( '<key>': <value> ),
),
),
);
```
**CRITICAL**: The `'url'` key contains **only the query parameter**:
```scss
// CORRECT
'url': 'Poppins:300,300i,400,400i,600,600i,700,700i'
// WRONG — do NOT include full URL
'url': 'https://fonts.googleapis.com/css?family=Poppins:300,400,700'
```
### Font Weight Format
```scss
'url': 'Poppins:300,300i,400,400i,600,600i,700,700i'
// Light Light-i Regular Regular-i SemiBold ...
// Number alone = normal, Number + 'i' = italic
```
### Multi-word Font Names
```scss
'url': 'Open+Sans:300,300i,400,400i,700,700i'
'url': 'IBM+Plex+Sans+Arabic:100,200,300,400,500,600,700'
```
### Font Aliases (for 'properties')
| Alias | Maps To | Usage |
|-------|---------|-------|
| `'base'` | `'font'` | Body text |
| `'headings'` | `'headings-font'` | All headings |
| `'navbar'` | `'navbar-font'` | Navigation |
| `'buttons'` | `'buttons-font'` | Buttons |
### Complete Example
```scss
$o-theme-font-configs: (
'Poppins': (
'family': ('Poppins', sans-serif),
'url': 'Poppins:300,300i,400,400i,500,500i,600,600i,700,700i',
'properties': (
'base': ( 'font-size-base': (15 / 16) * 1rem ),
),
),
'Playfair Display': (
'family': ('Playfair Display', serif),
'url': 'Playfair+Display:400,400i,700,700i',
),
);
```
### Arabic/RTL Fonts
```scss
$o-theme-font-configs: (
'IBM Plex Sans Arabic': (
'family': ('IBM Plex Sans Arabic', sans-serif),
'url': 'IBM+Plex+Sans+Arabic:100,200,300,400,500,600,700',
),
'Cairo': (
'family': ('Cairo', sans-serif),
'url': 'Cairo:200,300,400,500,600,700,800,900',
),
);
```
---
## 2. $o-color-palettes — Color System
### The Five Semantic Colors
| Color | Meaning | Typical Usage |
|-------|---------|---------------|
| `o-color-1` | **Primary/Accent** | Brand color, buttons, links |
| `o-color-2` | **Secondary** | Accent, secondary buttons |
| `o-color-3` | **Light Background** | Section backgrounds, cards |
| `o-color-4` | **White/Lightest** | Content background (#FFFFFF) |
| `o-color-5` | **Dark/Text** | Headings, footer, dark sections |
### Color Combinations (o_cc1 - o_cc5)
| Class | Background | Usage |
|-------|-----------|-------|
| `o_cc1` | `o-color-4` (White) | Main content |
| `o_cc2` | `o-color-3` (Light) | Alternate sections |
| `o_cc3` | `o-color-2` (Secondary) | Accent sections |
| `o_cc4` | `o-color-1` (Primary) | CTA sections |
| `o_cc5` | `o-color-5` (Dark) | Footer, dark |
### Palette Structure
```scss
$o-color-palettes: map-merge($o-color-palettes, (
'my-palette': (
'o-color-1': #09294F,
'o-color-2': #FFA807,
'o-color-3': #F6F4F0,
'o-color-4': #FFFFFF,
'o-color-5': #1B212C,
// Component assignments
'menu': 1,
'footer': 5,
'copyright': 5,
// Color combination overrides
'o-cc5-link': 'o-color-4',
'o-cc5-btn-primary': 'o-color-2',
),
));
```
**NOTE**: `map-merge` with `$o-color-palettes` works ONLY in non-theme modules. In themes (which use prepend), use `$o-website-values-palettes` with `'color-palettes-name'` instead.
### HTML Usage
```xml
<section class="o_cc o_cc1 pt32 pb32"><!-- White bg --></section>
<section class="o_cc o_cc2 pt32 pb32"><!-- Light bg --></section>
<section class="o_cc o_cc5 pt32 pb32"><!-- Dark bg --></section>
```
### Color Derivation (when only 2 colors are available)
```
o-color-3 = lighten(primary, 45%)
o-color-4 = #FFFFFF
o-color-5 = darken(primary, 40%) or #191A19
```
---
## 3. $o-website-values-palettes — Master Configuration (115+ Keys)
### Quick Reference
| Category | Count | Description |
|----------|-------|-------------|
| Typography & Fonts | 13 | Font family configuration |
| Font Sizes | 13 | Base and heading sizes |
| Line Heights | 11 | Text spacing |
| Margins | 22 | Heading and paragraph margins |
| Buttons | 17 | Button styling |
| Inputs | 12 | Form field styling |
| Header | 13 | Header/navigation config |
| Footer | 3 | Footer config |
| Links | 1 | Underline behavior |
| Layout | 3 | Page layout |
| Colors & Gradients | 5 | Palette and gradients |
| Google Fonts | 2 | Additional font loading |
### 3.1 Typography & Fonts
| Key | Description |
|-----|-------------|
| `'font'` | Base font for entire site |
| `'headings-font'` | Font for H1-H6 |
| `'navbar-font'` | Navigation menu font |
| `'buttons-font'` | Button text font |
| `'h2-font'` to `'h6-font'` | Individual heading fonts |
| `'display-1-font'` to `'display-4-font'` | Display text fonts |
### 3.2 Font Sizes
| Key | Default | Description |
|-----|---------|-------------|
| `'font-size-base'` | `1rem` | Base font size (16px) |
| `'small-font-size'` | `0.875rem` | Small text (14px) |
| `'h1-font-size'` to `'h6-font-size'` | Calculated | Heading sizes |
| `'display-1-font-size'` to `'display-6-font-size'` | 5rem-2.5rem | Display sizes |
### 3.3 Line Heights & Margins
| Key | Default | Description |
|-----|---------|-------------|
| `'body-line-height'` | `1.5` | Body text |
| `'headings-line-height'` | `1.2` | All headings |
| `'h2-line-height'` to `'h6-line-height'` | Inherits | Individual |
| `'paragraph-margin-top'` | `0` | Paragraph top |
| `'paragraph-margin-bottom'` | `16px` | Paragraph bottom |
| `'headings-margin-top'` / `'headings-margin-bottom'` | `0` / `0.5rem` | Headings |
### 3.4 Buttons (17 Keys)
| Key | Description |
|-----|-------------|
| `'btn-padding-y'` / `'btn-padding-x'` | Default padding |
| `'btn-font-size'` | Font size |
| `'btn-padding-y-sm'` / `'btn-padding-x-sm'` | Small button |
| `'btn-padding-y-lg'` / `'btn-padding-x-lg'` | Large button |
| `'btn-border-width'` | Border thickness |
| `'btn-border-radius'` / `-sm` / `-lg` | Corner radius |
| `'btn-primary-outline'` | Primary as outline (bool) |
| `'btn-secondary-outline'` | Secondary as outline (bool) |
| `'btn-primary-flat'` / `'btn-secondary-flat'` | Flat style (bool) |
| `'btn-ripple'` | Material ripple effect (bool) |
### 3.5 Inputs (12 Keys)
| Key | Description |
|-----|-------------|
| `'input-padding-y'` / `'input-padding-x'` | Input padding |
| `'input-font-size'` | Input font size |
| `'input-border-width'` | Border thickness |
| `'input-border-radius'` / `-sm` / `-lg` | Corner radius |
### 3.6 Header & Navigation (13 Keys)
| Key | Values | Description |
|-----|--------|-------------|
| `'header-template'` | `'default'` / `'hamburger'` / `'vertical'` / `'sidebar'` | Header layout |
| `'header-links-style'` | `'default'` / `'fill'` / `'outline'` / `'pills'` / `'block'` / `'border-bottom'` | Link style |
| `'header-font-size'` | CSS length | Header text size |
| `'logo-height'` | CSS length | Logo height |
| `'fixed-logo-height'` | CSS length | Logo when fixed |
| `'hamburger-position'` | `'left'` / `'center'` / `'right'` | Desktop position |
| `'hamburger-position-mobile'` | `'left'` / `'center'` / `'right'` | Mobile position |
### 3.7 Footer (3 Keys)
| Key | Values | Description |
|-----|--------|-------------|
| `'footer-template'` | `'default'` / `'centered'` / `'minimalist'` / `'links'` / `'descriptive'` | Layout |
| Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.