mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-08-15 02:53:25 +10:00
339 lines
14 KiB
Plaintext
339 lines
14 KiB
Plaintext
---
|
|
title: "Applying Custom Styles"
|
|
description: "Use Reactive Resume Semantic CSS to make safe, targeted, and portable changes to your resume PDF."
|
|
---
|
|
|
|
Custom Styles let you make focused changes that are not available in the regular **Design**, **Typography**, **Layout**,
|
|
**Page**, and **Picture** settings. They use Semantic CSS, a CSS-like language designed for
|
|
resume PDFs.
|
|
|
|
<Note>
|
|
Semantic CSS styles the PDF output, not the browser interface. It cannot load fonts, images, scripts, or other resources, and
|
|
it cannot create new resume content.
|
|
</Note>
|
|
|
|
## Convert existing Custom Styles
|
|
|
|
If a resume still uses the previous Custom Styles form, Reactive Resume creates a converted stylesheet draft. Your
|
|
current rules remain active while you review it.
|
|
|
|
<Steps>
|
|
<Step title="Open Custom Styles">
|
|
Open the resume in the builder, select **Design**, then select **Custom Styles**.
|
|
</Step>
|
|
<Step title="Review the converted draft">
|
|
Check the preview and warnings below the editor. The draft starts with `@version 1;`.
|
|
</Step>
|
|
<Step title="Activate Semantic CSS">
|
|
Select **Activate Semantic CSS** only after the preview matches the legacy result. Reactive Resume never applies both
|
|
systems at once, and keeps the original legacy rules available for rollback.
|
|
</Step>
|
|
</Steps>
|
|
|
|
## Make your first change
|
|
|
|
Open the resume you want to style, select **Design**, then select **Custom Styles**. Start with a complete stylesheet:
|
|
|
|
```css
|
|
@version 1;
|
|
|
|
section[type="experience"] > section-heading {
|
|
color: #0f766e;
|
|
text-transform: uppercase;
|
|
}
|
|
```
|
|
|
|
The first line tells Reactive Resume which language version the stylesheet uses. Keep `@version 1;` at the start of
|
|
every stylesheet.
|
|
|
|
<Steps>
|
|
<Step title="Paste one focused rule">
|
|
Add the stylesheet to the editor. Start with one visual change so it is easy to review in the preview.
|
|
</Step>
|
|
<Step title="Wait for Applied">
|
|
Reactive Resume checks the source and the PDF result. When the status changes to **Applied**, compare the preview
|
|
and export if you are ready to share the resume.
|
|
</Step>
|
|
<Step title="Build on the working rule">
|
|
Add one related change at a time. The editor keeps your draft, undo history, and last valid stylesheet separately.
|
|
</Step>
|
|
</Steps>
|
|
|
|
## Target the right part of your resume
|
|
|
|
Semantic CSS selectors describe resume content rather than a template's internal HTML. Selector and attribute names are
|
|
lowercase and case-sensitive. Prefer semantic selectors when you want a style to work across resumes and templates.
|
|
|
|
### Start with the resume structure
|
|
|
|
| Selector | Targets | Typical use |
|
|
| --- | --- | --- |
|
|
| `resume` | The complete resume | Scope a rule to one template. |
|
|
| `page` | A rendered PDF page | Set a page size. |
|
|
| `region` | Header, main, sidebar, or featured region | Style a layout area. |
|
|
| `header` | The resume header | Style the identity and contact area. |
|
|
| `section` | A resume section | Target a section type or placement. |
|
|
| `section-heading` | A section title | Change heading typography or decoration. |
|
|
| `section-items` | The items in a section | Adjust item layout and gaps. |
|
|
| `item` | One resume item | Control spacing or pagination for an experience, project, or similar item. |
|
|
| `item-header` | An item's summary row | Align the title, company, dates, or similar details. |
|
|
|
|
### Target header and item content
|
|
|
|
| Selector | Targets | Typical use |
|
|
| --- | --- | --- |
|
|
| `picture` | The profile picture | Change dimensions, crop, border, or picture shadow. |
|
|
| `name`, `headline` | Header name and headline | Change the main identity typography. |
|
|
| `contact-list`, `contact-item` | Header contact details | Space or restyle contact details. |
|
|
| `combined-text` | A template-combined value | Style an item value that combines fields. |
|
|
| `field` | A named content field | Target a position, company, date, or other field. |
|
|
| `link` | A structured link | Change linked text or layout. |
|
|
| `icon`, `level` | An icon or level indicator | Restyle decorative elements. |
|
|
|
|
### Target rich text and lists
|
|
|
|
| Selector | Targets |
|
|
| --- | --- |
|
|
| `rich-text`, `rich-heading`, `blockquote`, `paragraph` | Rich-text blocks in descriptions and summaries. |
|
|
| `list`, `list-item`, `list-marker`, `list-item-content` | Lists, the outer item row, its bullet or number, and its content. |
|
|
| `strong`, `emphasis`, `underline`, `strike`, `code`, `text-span`, `mark` | Inline rich-text formatting. |
|
|
| `hard-break`, `horizontal-rule` | A forced line break or horizontal rule. |
|
|
| `template-part` | A template-provided extension point. Use only with a template guard. |
|
|
|
|
### Narrow a selector with attributes
|
|
|
|
Use attributes to make a rule specific without relying on a template layout.
|
|
|
|
| Attribute | Use it with | Example |
|
|
| --- | --- | --- |
|
|
| `type` | `section` | `section[type="experience"]` |
|
|
| `placement` | `region` and `section` | `region[placement="sidebar"]` |
|
|
| `region` | `region` | `region[region="sidebar"]` |
|
|
| `origin` | `section` | `section[origin="main"]` |
|
|
| `part` | `region`, `section`, `contact-item`, and `item-header` | `region[part~="sidebar-background"]` |
|
|
| `template` | `resume` | `resume[template="azurill"]` |
|
|
| `name` | `field` and `template-part` | `field[name="position"]` |
|
|
| `level` | `rich-heading` | `rich-heading[level="2"]` |
|
|
| `direction` | `list-item-content` | `list-item-content[direction="rtl"]` |
|
|
| `id` | Any semantic node when present | `section[id="projects"]` |
|
|
| `role` | Any semantic node when present | `field[role~="secondary-text"]` |
|
|
|
|
Semantic CSS supports selector lists, descendant (` `), child (`>`), adjacent sibling (`+`), and general sibling (`~`)
|
|
combinators. It also supports `:root`, `:first-child`, `:last-child`, `:only-child`, `:is()`, `:where()`, `:not()`,
|
|
`:nth-child()`, and `:nth-of-type()`.
|
|
|
|
```css
|
|
@version 1;
|
|
|
|
section[type="experience"] > section-heading {
|
|
border-bottom: 1pt solid #0f766e;
|
|
}
|
|
|
|
region[placement="sidebar"] {
|
|
background-color: #f8fafc;
|
|
padding: 18pt;
|
|
}
|
|
|
|
section[id="projects"] {
|
|
break-inside: avoid;
|
|
}
|
|
```
|
|
|
|
Use an exact `id` only for a resume-specific adjustment. A type, placement, role, or field name is usually a better
|
|
choice when you expect to copy the stylesheet to another resume.
|
|
|
|
## Reuse your builder settings
|
|
|
|
Semantic CSS exposes the resolved builder settings as read-only `--resume-*` variables. Define your own variables in `:root`, then
|
|
reuse the builder values instead of duplicating colors or dimensions.
|
|
|
|
```css
|
|
@version 1;
|
|
|
|
:root {
|
|
--accent: var(--resume-primary-color);
|
|
--rule: #cbd5e1;
|
|
}
|
|
|
|
section-heading {
|
|
color: var(--accent);
|
|
border-bottom: 1pt solid var(--rule);
|
|
font-size: 11pt;
|
|
font-weight: 600;
|
|
letter-spacing: 0.4pt;
|
|
}
|
|
```
|
|
|
|
Changing the primary color or related setting in the builder updates the corresponding variable automatically. Do not
|
|
assign a value to a `--resume-*` variable; create an author variable such as `--accent` instead.
|
|
|
|
| Builder setting | Read-only variables |
|
|
| --- | --- |
|
|
| Colors | `--resume-primary-color`, `--resume-text-color`, `--resume-background-color` |
|
|
| Typography | `--resume-body-font-size`, `--resume-body-line-height`, `--resume-heading-font-size`, `--resume-heading-line-height` |
|
|
| Page and layout | `--resume-page-gap-x`, `--resume-page-gap-y`, `--resume-page-margin-x`, `--resume-page-margin-y`, `--resume-page-width`, `--resume-page-height`, `--resume-sidebar-width` |
|
|
| Picture | `--resume-picture-size`, `--resume-picture-rotation`, `--resume-picture-aspect-ratio`, `--resume-picture-border-radius`, `--resume-picture-border-width`, `--resume-picture-border-color`, `--resume-picture-shadow-width`, `--resume-picture-shadow-color` |
|
|
|
|
Use `pt` for predictable PDF spacing and type sizes. Semantic CSS also accepts `px`, `in`, `mm`, `cm`, `%`, `vw`, `vh`, `em`,
|
|
and `rem` where the property supports a length.
|
|
|
|
## Style common resume content
|
|
|
|
The most useful declarations usually fall into a few groups:
|
|
|
|
| Goal | Common declarations |
|
|
| --- | --- |
|
|
| Typography | `color`, `font-size`, `font-style`, `font-weight`, `letter-spacing`, `line-height`, `text-align`, `text-decoration`, `text-transform` |
|
|
| Spacing and layout | `margin`, `padding`, `gap`, `width`, `height`, `display`, `flex`, `flex-direction`, `justify-content`, `align-items`, `order` |
|
|
| Visual treatment | `background-color`, `border`, `border-radius`, `opacity`, `transform` |
|
|
| Picture treatment | `object-fit`, `object-position`, `-resume-shadow-color`, `-resume-shadow-width` |
|
|
| PDF structure | `break-before`, `break-inside`, `orphans`, `widows`, `-resume-min-presence-ahead`, `size` |
|
|
|
|
Use `display: none` only to hide an existing semantic node. Semantic CSS cannot add, remove, duplicate, or re-parent resume
|
|
data.
|
|
|
|
### Style rich-text lists
|
|
|
|
`list-item` is the outer row that holds a marker and its content. Use it for row layout and spacing. Use `list-marker`
|
|
for the bullet or number, and `list-item-content` for the text flow.
|
|
|
|
```css
|
|
@version 1;
|
|
|
|
rich-text list-item {
|
|
gap: 4pt;
|
|
}
|
|
|
|
list-marker {
|
|
color: var(--resume-primary-color);
|
|
}
|
|
|
|
list-item-content {
|
|
line-height: 1.35;
|
|
}
|
|
```
|
|
|
|
### Style fields inside an item
|
|
|
|
Named fields let you make a focused change without styling every item value. Use the selector only where that field
|
|
exists in the selected resume and template.
|
|
|
|
```css
|
|
@version 1;
|
|
|
|
section[type="experience"] field[name="position"] {
|
|
font-weight: 600;
|
|
}
|
|
|
|
section[type="experience"] field[name="company"] {
|
|
color: var(--resume-primary-color);
|
|
}
|
|
```
|
|
|
|
## Use template-specific parts carefully
|
|
|
|
Template parts expose optional visual details that are not shared by every template. Always guard a template-part rule
|
|
with `resume[template="..."]`; otherwise the selector may match nothing after a template change.
|
|
|
|
```css
|
|
@version 1;
|
|
|
|
resume[template="azurill"] template-part[name="timeline-line"] {
|
|
background-color: #94a3b8;
|
|
}
|
|
```
|
|
|
|
Some template parts are wrappers, while others are attributes on an existing semantic node. Use the matching selector
|
|
below.
|
|
|
|
| Template | Available selectors |
|
|
| --- | --- |
|
|
| Azurill | `template-part[name="timeline-content"]`, `template-part[name="timeline-dot"]`, `template-part[name="timeline-line"]`, `template-part[name="timeline-marker"]` |
|
|
| Bronzor | `section[part~="interleaved-section-row"]` |
|
|
| Chikorita | `template-part[name="contact-row-primary"]`, `template-part[name="contact-row-secondary"]` |
|
|
| Ditgar | `template-part[name="featured-summary"]`, `item-header[part~="item-header-border"]`, `region[part~="sidebar-background"]` |
|
|
| Ditto | `template-part[name="contact-offset"]`, `template-part[name="header-band"]`, `template-part[name="picture-anchor"]` |
|
|
| Gengar | `template-part[name="featured-summary"]`, `region[part~="sidebar-background"]` |
|
|
| Glalie | `region[part~="sidebar-background"]` |
|
|
| Leafish | `template-part[name="header-body"]`, `template-part[name="header-contact-band"]`, `template-part[name="header-intro"]` |
|
|
| Meowth | `template-part[name="education-grade-row"]`, `template-part[name="inline-item-header-leading"]`, `template-part[name="inline-item-header-middle"]`, `template-part[name="inline-item-header-trailing"]` |
|
|
| Pikachu | `template-part[name="header-divider"]` |
|
|
| Rhyhorn | `template-part[name="contact-item-content"]`, `contact-item[part~="contact-item-last"]` |
|
|
| Scizor | `template-part[name="header-name-rule"]` |
|
|
|
|
Kakuna, Lapras, and Onyx do not expose template-specific parts. Use shared semantic selectors for portable styles.
|
|
|
|
## Control pagination and PDF dimensions
|
|
|
|
Use structural declarations sparingly and review the exported PDF after each change. You can keep an item together,
|
|
leave space before a section, or set a custom page size.
|
|
|
|
```css
|
|
@version 1;
|
|
|
|
page {
|
|
size: 210mm 297mm;
|
|
}
|
|
|
|
section {
|
|
-resume-min-presence-ahead: 72pt;
|
|
}
|
|
|
|
item {
|
|
break-inside: avoid;
|
|
}
|
|
```
|
|
|
|
`size` applies only to `page` and must be outside `@media`. PDF media queries use the authored PDF dimensions, not the
|
|
browser viewport.
|
|
|
|
```css
|
|
@version 1;
|
|
|
|
@media (max-width: 600pt) {
|
|
region[placement="sidebar"] {
|
|
padding: 12pt;
|
|
}
|
|
}
|
|
```
|
|
|
|
Supported media features are `width`, `min-width`, `max-width`, `height`, `min-height`, `max-height`, and
|
|
`orientation: portrait` or `orientation: landscape`.
|
|
|
|
## Apply, diagnose, and recover safely
|
|
|
|
The editor saves your draft even when it has an error. The preview and PDF export continue using the last stylesheet
|
|
that compiled and passed PDF checks, so a mistake does not replace a working result.
|
|
|
|
If a rule does not work:
|
|
|
|
1. Read the status below the editor. Errors include a line and column number when available.
|
|
2. Check the selector's spelling, attribute value, placement, and template guard. A **selector matches nothing**
|
|
warning usually means the resume does not contain that semantic node.
|
|
3. Simplify the rule to one selector and one declaration, then wait for **Applied** before adding more.
|
|
4. Use **Reset to applied stylesheet** to discard the current draft, or use the stylesheet undo and redo controls to
|
|
restore an earlier source and applied pair.
|
|
|
|
Select **Open focus mode** when you need a taller editor. On mobile, it opens a full-width sheet; switch to
|
|
**Preview** to inspect the result.
|
|
|
|
<Warning>
|
|
Review the PDF preview before exporting or sharing a resume with Custom Styles. PDF pagination and template-specific
|
|
details can make a valid stylesheet look different from what you intended.
|
|
</Warning>
|
|
|
|
## Keep styles portable
|
|
|
|
When you copy a stylesheet to another resume, semantic section types, placements, roles, and fields are the safest
|
|
starting point. Exact IDs and template parts are intentionally specific to a resume or template.
|
|
|
|
1. Select **Copy stylesheet** in the source resume.
|
|
2. Open **Design -> Custom Styles** in the destination resume.
|
|
3. Paste the stylesheet and review any warnings.
|
|
4. Replace or remove exact IDs and template-part rules that do not apply.
|
|
5. Wait for **Applied**, then compare the preview and exported PDF.
|
|
|
|
Semantic CSS does not support classes, pseudo-elements, CSS Grid, arbitrary at-rules, `@import`, `@font-face`, `url()`,
|
|
browser APIs, animations, filters, gradients, general box shadows, or external assets. Use the normal builder settings
|
|
when you need a font, image, or broader layout change.
|