Skip to content

Commit 16c514c

Browse files
yunanwgclaude
andauthored
feat: add per-component color override parameter (#154)
Add optional `color` parameter to all accent-color-using components: cv-section, cv-entry, cv-entry-start, cv-entry-continued, cv-honor. When omitted, behavior is unchanged (uses accent color from metadata). When provided, overrides accent color for that specific component. Closes #153 Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 7ef8268 commit 16c514c

File tree

1 file changed

+23
-18
lines changed

1 file changed

+23
-18
lines changed

src/cv.typ

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@
274274
title,
275275
highlighted: true,
276276
letters: 3,
277+
color: none,
277278
metadata: none,
278279
// New parameter names (recommended)
279280
awesome-colors: none,
@@ -282,18 +283,18 @@
282283
) = context {
283284
let metadata = if metadata != none { metadata } else { cv-metadata.get() }
284285
// Backward compatibility logic (remove this block when deprecating)
285-
let awesome-colors = if awesome-colors != none {
286-
awesome-colors
287-
} else {
286+
let awesome-colors = if awesome-colors != none {
287+
awesome-colors
288+
} else {
288289
// TODO: Add deprecation warning in future version
289290
// Currently Typst doesn't have a standard warning mechanism for user functions
290-
awesomeColors
291+
awesomeColors
291292
}
292-
293+
293294
let lang = metadata.language
294295
let non-latin = _is-non-latin(lang)
295296
let before-section-skip = _get-layout-value(metadata, "before_section_skip", 1pt)
296-
let accent-color = _set-accent-color(awesome-colors, metadata)
297+
let accent-color = if color != none { color } else { _set-accent-color(awesome-colors, metadata) }
297298
let highlighted-text = title.slice(0, letters)
298299
let normal-text = title.slice(letters)
299300

@@ -321,17 +322,17 @@
321322

322323
/// Prepare common entry parameters
323324
/// -> dictionary
324-
#let _prepare-entry-params(metadata, awesome-colors, awesomeColors) = {
325+
#let _prepare-entry-params(metadata, awesome-colors, awesomeColors, color: none) = {
325326
// Backward compatibility logic
326-
let awesome-colors = if awesome-colors != none {
327-
awesome-colors
328-
} else {
327+
let awesome-colors = if awesome-colors != none {
328+
awesome-colors
329+
} else {
329330
// TODO: Add deprecation warning in future version
330-
awesomeColors
331+
awesomeColors
331332
}
332-
333+
333334
// Common parameter calculations
334-
let accent-color = _set-accent-color(awesome-colors, metadata)
335+
let accent-color = if color != none { color } else { _set-accent-color(awesome-colors, metadata) }
335336
let before-entry-skip = eval(metadata.layout.at("before_entry_skip", default: 1pt))
336337
let before-entry-description-skip = eval(metadata.layout.at("before_entry_description_skip", default: 1pt))
337338
let date-width = metadata.layout.at("date_width", default: none)
@@ -555,14 +556,15 @@
555556
description: "Description",
556557
logo: "",
557558
tags: (),
559+
color: none,
558560
metadata: none,
559561
// New parameter names (recommended)
560562
awesome-colors: none,
561563
// Old parameter names (deprecated, for backward compatibility)
562564
awesomeColors: _awesome-colors,
563565
) = context {
564566
let metadata = if metadata != none { metadata } else { cv-metadata.get() }
565-
let params = _prepare-entry-params(metadata, awesome-colors, awesomeColors)
567+
let params = _prepare-entry-params(metadata, awesome-colors, awesomeColors, color: color)
566568

567569
_make-cv-entry(
568570
"full",
@@ -590,6 +592,7 @@
590592
society: "Society",
591593
location: "Location",
592594
logo: "",
595+
color: none,
593596
metadata: none,
594597
// New parameter names (recommended)
595598
awesome-colors: none,
@@ -602,7 +605,7 @@
602605
panic("display_entry_society_first must be true to use cvEntryStart")
603606
}
604607

605-
let params = _prepare-entry-params(metadata, awesome-colors, awesomeColors)
608+
let params = _prepare-entry-params(metadata, awesome-colors, awesomeColors, color: color)
606609

607610
_make-cv-entry(
608611
"start",
@@ -619,6 +622,7 @@
619622
date: "Date",
620623
description: "Description",
621624
tags: (),
625+
color: none,
622626
metadata: none,
623627
// New parameter names (recommended)
624628
awesome-colors: none,
@@ -630,8 +634,8 @@
630634
if not metadata.layout.entry.display_entry_society_first {
631635
panic("display_entry_society_first must be true to use cvEntryContinued")
632636
}
633-
634-
let params = _prepare-entry-params(metadata, awesome-colors, awesomeColors)
637+
638+
let params = _prepare-entry-params(metadata, awesome-colors, awesomeColors, color: color)
635639

636640
_make-cv-entry(
637641
"continued",
@@ -737,11 +741,12 @@
737741
issuer: "",
738742
url: "",
739743
location: "",
744+
color: none,
740745
awesome-colors: _awesome-colors,
741746
metadata: none,
742747
) = context {
743748
let metadata = if metadata != none { metadata } else { cv-metadata.get() }
744-
let accent-color = _set-accent-color(awesome-colors, metadata)
749+
let accent-color = if color != none { color } else { _set-accent-color(awesome-colors, metadata) }
745750

746751
let honor-date-style(str) = {
747752
align(right, text(str))

0 commit comments

Comments
 (0)