mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-07-03 01:30:40 +10:00
274 lines
7.1 KiB
Plaintext
274 lines
7.1 KiB
Plaintext
---
|
||
title: "Using Custom CSS"
|
||
description: "Learn how to use the Custom CSS panel in the resume builder, which selectors to target, and copy‑paste examples for common tweaks."
|
||
---
|
||
|
||
## What the Custom CSS section does
|
||
|
||
The **Custom CSS** panel lets you write your own CSS rules to change how your resume looks in the live preview (and exports).
|
||
|
||
- **Live updates**: your changes are applied immediately as you type.
|
||
- **Auto-save**: there is no “Save” button—your CSS is saved automatically when it changes.
|
||
- **Scoped styling (mostly)**: to avoid affecting the rest of the app, your CSS is _usually_ scoped to the resume preview.
|
||
|
||
<Frame caption="Screenshot of the Custom CSS section in the right sidebar">
|
||
<img
|
||
src="/images/guides/using-custom-css/screenshot-1.webp"
|
||
alt="Screenshot of the Custom CSS section in the right sidebar"
|
||
/>
|
||
</Frame>
|
||
|
||
## Where to find it
|
||
|
||
In the resume builder, open the **right sidebar** and select **Custom CSS** (the `CSS` section).
|
||
|
||
## Enable / Disable
|
||
|
||
- Turn on the **Enable** switch to apply your CSS.
|
||
- Turning it off keeps your CSS saved, but stops applying it.
|
||
|
||
## How scoping works (important)
|
||
|
||
Your CSS is injected into the preview and most **top-level selectors** are automatically prefixed with:
|
||
|
||
- `.resume-preview-container`
|
||
|
||
That means:
|
||
|
||
- Writing `.page { ... }` effectively becomes `.resume-preview-container .page { ... }`
|
||
- Writing `h2 { ... }` becomes `.resume-preview-container h2 { ... }`
|
||
- Writing `body { ... }` becomes `.resume-preview-container body { ... }` (which usually matches nothing, because `body` is not inside the preview container)
|
||
|
||
### Scoping limitation: `@media` / `@supports` blocks
|
||
|
||
Rules that start with **at-rules** (like `@media print { ... }`) are **not automatically scoped**. If you want to keep those rules limited to the resume preview, you should **manually** prefix selectors inside at-rules with `.resume-preview-container`.
|
||
|
||
Example:
|
||
|
||
```css
|
||
/* Normal rules: rely on auto-scoping */
|
||
.page a {
|
||
text-decoration: none;
|
||
}
|
||
|
||
/* At-rules: manually scope selectors */
|
||
@media print {
|
||
.resume-preview-container .page a {
|
||
text-decoration: none;
|
||
}
|
||
}
|
||
```
|
||
|
||
### Formatting tip (to avoid scoping edge-cases)
|
||
|
||
Keep each rule's selector on **one line**, for example:
|
||
|
||
```css
|
||
.page-section-experience .section-item-title {
|
||
font-weight: 700;
|
||
}
|
||
```
|
||
|
||
Avoid splitting a selector across multiple lines unless you've confirmed it behaves as expected.
|
||
|
||
## Finding the right selectors
|
||
|
||
### Use autocomplete in the editor
|
||
|
||
In the Custom CSS editor, type a `.` (dot). You'll get suggestions for commonly-used class selectors, including:
|
||
|
||
- **Page-level**: `.page`, `.page-content`, `.page-header`, `.page-basics`, `.page-main`, `.page-sidebar`, `.page-picture`
|
||
- **Section-level**: `.page-section`, `.section-content`
|
||
- **Section types**: `.page-section-experience`, `.page-section-education`, `.page-section-projects`, etc.
|
||
- **Generic item building blocks**: `.section-item`, `.section-item-header`, `.section-item-title`, `.section-item-description`, `.section-item-metadata`, `.section-item-website`, etc.
|
||
- **Per-section item selectors**: `.experience-item`, `.skills-item`, `.profiles-item`, etc.
|
||
- **Template wrapper**: `.template-azurill`, `.template-onyx`, `.template-gengar`, etc.
|
||
|
||
### Stable “starter selectors”
|
||
|
||
If you're not sure where to start, these are usually safe:
|
||
|
||
- `.page` (the resume page container)
|
||
- `.page-section` (each resume section)
|
||
- `.section-item` (each item inside a section)
|
||
- `.page-picture` (profile picture container)
|
||
|
||
### Target a specific template (optional)
|
||
|
||
To apply styles only on one template, prefix with the template wrapper:
|
||
|
||
```css
|
||
.template-azurill .page-header {
|
||
gap: 12pt;
|
||
}
|
||
```
|
||
|
||
### Target a specific page (optional)
|
||
|
||
Each page has a class like `.page-0`, `.page-1`, etc.
|
||
|
||
```css
|
||
.page-0 .page-header {
|
||
margin-bottom: 6pt;
|
||
}
|
||
```
|
||
|
||
### Target a custom section (optional)
|
||
|
||
Custom sections include a dynamic class: `.page-section-<sectionId>`.
|
||
|
||
```css
|
||
.page-section-custom {
|
||
border-top: 1pt solid color-mix(in srgb, var(--page-text-color) 15%, transparent);
|
||
padding-top: 6pt;
|
||
}
|
||
```
|
||
|
||
If you need the exact `<sectionId>`, use your browser devtools on the resume preview to inspect the section element.
|
||
|
||
## Useful built-in CSS variables (you can override them)
|
||
|
||
The preview sets a number of CSS variables you can reuse or override:
|
||
|
||
- `--page-width`, `--page-height`
|
||
- `--page-sidebar-width`
|
||
- `--page-text-color`, `--page-primary-color`, `--page-background-color`
|
||
- `--page-body-font-family`, `--page-body-font-size`, `--page-body-line-height`, `--page-body-font-weight`, `--page-body-font-weight-bold`
|
||
- `--page-heading-font-family`, `--page-heading-font-size`, `--page-heading-line-height`, `--page-heading-font-weight`, `--page-heading-font-weight-bold`
|
||
- `--page-margin-x`, `--page-margin-y`
|
||
- `--page-gap-x`, `--page-gap-y`
|
||
|
||
Example (tighten spacing without changing your layout settings):
|
||
|
||
```css
|
||
.page {
|
||
--page-margin-x: 10pt;
|
||
--page-margin-y: 10pt;
|
||
--page-gap-y: 6pt;
|
||
}
|
||
```
|
||
|
||
## Common examples (copy/paste)
|
||
|
||
### 1) Make section headings bolder and more compact
|
||
|
||
```css
|
||
.page-section > h6 {
|
||
margin-bottom: 2pt;
|
||
font-weight: 800;
|
||
letter-spacing: 0.02em;
|
||
text-transform: uppercase;
|
||
}
|
||
```
|
||
|
||
### 2) Add subtle dividers between sections
|
||
|
||
```css
|
||
.page-section {
|
||
padding-bottom: 8pt;
|
||
border-bottom: 1pt solid color-mix(in srgb, var(--page-text-color) 12%, transparent);
|
||
}
|
||
|
||
.page-section:last-child {
|
||
border-bottom: none;
|
||
}
|
||
```
|
||
|
||
### 3) Reduce the size of metadata (dates/locations)
|
||
|
||
```css
|
||
.section-item-metadata {
|
||
font-size: calc(var(--page-body-font-size) * 0.9pt);
|
||
opacity: 0.75;
|
||
}
|
||
```
|
||
|
||
### 4) Improve readability of rich-text descriptions (bullets, spacing)
|
||
|
||
```css
|
||
.section-item-description {
|
||
opacity: 0.95;
|
||
}
|
||
|
||
.section-item-description ul {
|
||
margin-left: 12pt;
|
||
padding-left: 0;
|
||
}
|
||
|
||
.section-item-description li {
|
||
margin: 2pt 0;
|
||
}
|
||
```
|
||
|
||
### 5) Style links like a “chip” (useful for project links)
|
||
|
||
```css
|
||
.section-item-website a {
|
||
display: inline-block;
|
||
padding: 3pt 9pt;
|
||
border-radius: 999pt;
|
||
border: 2pt solid color-mix(in srgb, var(--page-primary-color) 45%, transparent);
|
||
text-decoration: none;
|
||
}
|
||
```
|
||
|
||
### 6) Hide the profile picture (CSS-only)
|
||
|
||
```css
|
||
.page-picture {
|
||
display: none;
|
||
}
|
||
```
|
||
|
||
### 7) Make the header more compact
|
||
|
||
```css
|
||
.page-header {
|
||
gap: 6pt;
|
||
padding-bottom: 6pt;
|
||
}
|
||
|
||
.basics-headline {
|
||
opacity: 0.8;
|
||
}
|
||
```
|
||
|
||
### 8) Make skills look denser (better use of space)
|
||
|
||
```css
|
||
.skills-item-name {
|
||
font-weight: 700;
|
||
}
|
||
|
||
.skills-item-proficiency {
|
||
margin-top: 1pt;
|
||
}
|
||
|
||
.skills-item-keywords {
|
||
display: block;
|
||
opacity: 0.85;
|
||
}
|
||
```
|
||
|
||
### 9) Highlight a specific section (example: Profiles)
|
||
|
||
```css
|
||
.page-section-profiles {
|
||
background: color-mix(in srgb, var(--page-primary-color) 10%, transparent);
|
||
border-radius: 8pt;
|
||
padding: 8pt 12pt;
|
||
}
|
||
```
|
||
|
||
## Troubleshooting
|
||
|
||
### My CSS doesn't do anything
|
||
|
||
- Make sure **Enable** is turned on.
|
||
- Prefer targeting `.page`, `.page-section`, and `.section-item` instead of `body`.
|
||
- Use your browser devtools to **inspect** the preview and confirm the element/class names.
|
||
|
||
### My `@media` rules affect the whole app / don't apply
|
||
|
||
At-rules aren't auto-scoped. Prefix selectors inside them with `.resume-preview-container` as shown above.
|