Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d296f3a3f1
|
||
|
|
338fee564f
|
||
|
|
1e095a8b26
|
No files matched your search
@@ -17,6 +17,9 @@ links below to their main page.
|
||||
into everyday docs.
|
||||
- [**swank-tex**](https://typst.app/universe/package/swank-tex): Render those
|
||||
funky logos for TeX, LaTeX, and friends.
|
||||
- [**tasteful-pairings**](https://typst.app/universe/package/tasteful-pairings):
|
||||
A carefully curated collection of font pairings focusing on readability and
|
||||
typographic harmony.
|
||||
|
||||
## Templates
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ education, experience, skills, and more.
|
||||
To use this template, import it with the version number and utilize the `resume` or `cv` function:
|
||||
|
||||
```typst
|
||||
#import "@preview/finely-crafted-cv:0.2.0": *
|
||||
#import "@preview/finely-crafted-cv:0.1.0": *
|
||||
|
||||
#show: resume.with(
|
||||
name: "Amira Patel",
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
// Constants
|
||||
#let SIZE_HUGE = 1.5em
|
||||
#let SIZE_HUGE = 1.3em
|
||||
#let SIZE_LARGE = 1.1em
|
||||
#let SIZE_NORMAL = 1em
|
||||
#let SIZE_SMALL = 0.9em
|
||||
#let SIZE_TINY = 0.7em
|
||||
|
||||
#let BODY_FONT = "Source Serif Pro"
|
||||
#let BODY_FONT = "Libertinus Serif"
|
||||
#let BODY_SIZE = 11pt
|
||||
#let BODY_WEIGHT = "light"
|
||||
#let HEADING_FONT = "Source Sans Pro"
|
||||
#let HEADING_FONT = "Libertinus Serif"
|
||||
|
||||
#let PAGE_MARGIN = 0.5in
|
||||
|
||||
@@ -20,28 +20,25 @@
|
||||
#let FOOTER_TEXT_WEIGHT = "thin"
|
||||
|
||||
#let HEADLINE_NAME_SIZE = SIZE_HUGE
|
||||
#let HEADLINE_NAME_WEIGHT = "bold"
|
||||
#let HEADLINE_NAME_WEIGHT = "black"
|
||||
#let HEADLINE_HRULE_STROKE = 1pt + black
|
||||
|
||||
#let TAGLINE_SIZE = SIZE_NORMAL
|
||||
#let TAGLINE_STYLE = "italic"
|
||||
#let TAGLINE_WEIGHT = "regular"
|
||||
|
||||
#let SECTION_HEADING_SIZE = 0.8em // TODO: this seems wrong, should be SIZE_NORMAL (etc)
|
||||
#let SECTION_HEADING_WEIGHT = "semibold"
|
||||
#let SECTION_HEADING_HRULE_STROKE = 0.75pt + navy.lighten(10%)
|
||||
#let SECTION_HEADING_SIZE = 0.7em // TODO: this seems wrong, should be SIZE_NORMAL (etc)
|
||||
#let SECTION_HEADING_WEIGHT = "bold"
|
||||
#let SECTION_HEADING_HRULE_STROKE = 0.75pt + black.lighten(25%)
|
||||
#let SECTION_HEADING_SPACE_ABOVE = 1em
|
||||
#let SECTION_HEADING_SPACE_BELOW = 0.5em
|
||||
#let SECTION_HEADING_BLOCK_FILL = luma(100%) //gradient.linear(blue.lighten(99%), luma(100%))
|
||||
#let SECTION_HEADING_BLOCK_RADIUS = 2pt
|
||||
#let SECTION_HEADING_BLOCK_OUTSET = 0.2em
|
||||
|
||||
#let COMPANY_ICON_SIZE = SIZE_NORMAL
|
||||
#let COMPANY_ICON_SPACING = 0.25em
|
||||
#let COMPANY_NAME_SIZE = SIZE_LARGE
|
||||
#let COMPANY_NAME_WEIGHT = "semibold"
|
||||
#let COMPANY_NAME_WEIGHT = "bold"
|
||||
#let COMPANY_DATE_SIZE = COMPANY_NAME_SIZE
|
||||
#let COMPANY_DATE_WEIGHT = "semibold"
|
||||
#let COMPANY_DATE_WEIGHT = "bold"
|
||||
#let COMPANY_BLOCK_BELOW = 1.3em
|
||||
|
||||
#let JOB_NAME_SIZE = SIZE_NORMAL
|
||||
@@ -52,9 +49,8 @@
|
||||
#let JOB_LOCATION_WEIGHT = "light"
|
||||
#let JOB_BLOCK_ABOVE = 0.6em
|
||||
#let JOB_BLOCK_BELOW = 1em
|
||||
#let EMPTY_JOB_NUDGE = -0.75em
|
||||
|
||||
#let TABLE_HEADER_COLOR = blue.lighten(70%)
|
||||
#let TABLE_HEADER_COLOR = blue.lighten(60%)
|
||||
#let TABLE_ZEBRA_COLOR_0 = green.lighten(85%)
|
||||
#let TABLE_ZEBRA_COLOR_1 = green.lighten(95%)
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
header: context {
|
||||
if here().page() == 1 {
|
||||
text(
|
||||
font: heading-font,
|
||||
size: HEADER_SIZE,
|
||||
grid(
|
||||
columns: (1fr, auto, auto, auto, auto, auto),
|
||||
@@ -80,16 +79,12 @@
|
||||
block(
|
||||
above: SECTION_HEADING_SPACE_ABOVE,
|
||||
below: SECTION_HEADING_SPACE_BELOW,
|
||||
fill: SECTION_HEADING_BLOCK_FILL,
|
||||
radius: SECTION_HEADING_BLOCK_RADIUS,
|
||||
outset: SECTION_HEADING_BLOCK_OUTSET,
|
||||
breakable: false,
|
||||
[
|
||||
#text(size: SECTION_HEADING_SIZE, weight: SECTION_HEADING_WEIGHT, font: heading-font)[
|
||||
#context counter(heading).display()
|
||||
#smallcaps(it.body)
|
||||
#upper(it.body)
|
||||
]
|
||||
#v(-0.25em)
|
||||
#hrule(stroke: SECTION_HEADING_HRULE_STROKE)
|
||||
]
|
||||
)
|
||||
@@ -108,7 +103,6 @@
|
||||
}
|
||||
},
|
||||
)
|
||||
show table.cell.where(y: 0): set text(font: heading-font)
|
||||
|
||||
// Save our settings needed in other functions
|
||||
__set("heading-font", heading-font)
|
||||
@@ -179,12 +173,6 @@
|
||||
#let school-heading = company-heading
|
||||
|
||||
#let job-heading(title, location: none, start: none, end: none, comment: none, body) = {
|
||||
// if we have an empty body, we need to nudge this up
|
||||
let the-body = if repr(body) == "[]" {
|
||||
v(EMPTY_JOB_NUDGE)
|
||||
} else {
|
||||
body
|
||||
}
|
||||
block(
|
||||
above: JOB_BLOCK_ABOVE,
|
||||
below: JOB_BLOCK_BELOW,
|
||||
@@ -230,7 +218,7 @@
|
||||
}
|
||||
),
|
||||
|
||||
grid.cell(colspan: 5, the-body)
|
||||
grid.cell(colspan: 5, body)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
#import "@preview/finely-crafted-cv:0.2.0": *
|
||||
#import "@preview/finely-crafted-cv:0.1.0": *
|
||||
|
||||
#show: resume.with(
|
||||
name: "Amira Patel",
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 977 KiB After Width: | Height: | Size: 395 KiB |
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "finely-crafted-cv"
|
||||
version = "0.2.0"
|
||||
version = "0.1.0"
|
||||
entrypoint = "lib.typ"
|
||||
authors = ["Stephen Waits <steve@waits.net>"]
|
||||
license = "MIT"
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
tests/**/out/
|
||||
tests/**/diff/
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Stephen Waits <steve@waits.net>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,57 @@
|
||||
# Tasteful Pairings
|
||||
|
||||
A carefully curated collection of font pairings for [Typst](https://typst.app/),
|
||||
focusing on readability and typographic harmony. Each pairing combines a
|
||||
sans-serif heading font with a serif body font, following established
|
||||
typographic principles for clear visual hierarchy and optimal reading
|
||||
experience.
|
||||
|
||||
## Installation
|
||||
|
||||
```typ
|
||||
#import "@preview/tasteful-pairings:0.1.0": *
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```typ
|
||||
#let pairing = font-pairings.at("modern-heritage")
|
||||
|
||||
#show heading: set text(font: pairing.heading)
|
||||
#set text(font: pairing.body)
|
||||
|
||||
= Your Document Title
|
||||
Your content here...
|
||||
```
|
||||
|
||||
## Available Pairings
|
||||
|
||||
- **`ibm-plex`** - Modern corporate-friendly superfamily
|
||||
- **`noto`** - Extensive language support, highly legible
|
||||
- **`source`** - Adobe's refined open-source pair
|
||||
- **`friendly-weather`** - Open Fira Sans with space-efficient Merriweather
|
||||
- **`android`** - Complete Roboto family look
|
||||
- **`kindle`** - Amazon's reading-optimized fonts
|
||||
- **`office`** - Classic Microsoft Office combination
|
||||
- **`modern-heritage`** - Contemporary Montserrat with timeless Georgia Pro
|
||||
- **`legible`** - Reading-focused Lexend and Literata
|
||||
|
||||
## Gallery
|
||||
|
||||

|
||||
|
||||
## Philosophy
|
||||
|
||||
The pairings in this collection follow these principles:
|
||||
|
||||
1. **Sans for Headlines, Serif for Body** - Following traditional typographic
|
||||
wisdom for clear hierarchy
|
||||
2. **Readability First** - Each pairing is tested for optimal reading experience
|
||||
3. **Complementary Characteristics** - Fonts are matched based on x-height,
|
||||
weight balance, and character width
|
||||
4. **Practical Applications** - Selected for real-world use cases from corporate
|
||||
documents to digital reading
|
||||
|
||||
## License
|
||||
|
||||
[MIT License](LICENSE).
|
||||
@@ -0,0 +1 @@
|
||||
#import "src/main.typ": font-pairings
|
||||
@@ -0,0 +1,55 @@
|
||||
#let font-pairings = (
|
||||
"ibm-plex": (
|
||||
heading: "IBM Plex Sans",
|
||||
body: "IBM Plex Serif",
|
||||
description: "A modern corporate-friendly superfamily with a wide weight range. Clean, neutral, and highly legible."
|
||||
),
|
||||
|
||||
"noto": (
|
||||
heading: "Noto Sans",
|
||||
body: "Noto Serif",
|
||||
description: "Huge language coverage, highly legible, and neutral. Great for multilingual documents."
|
||||
),
|
||||
|
||||
"source": (
|
||||
heading: "Source Sans 3",
|
||||
body: "Source Serif 4",
|
||||
description: "Adobe's open-source pair. Clean, highly readable, and well-hinted for both screen and print."
|
||||
),
|
||||
|
||||
"friendly-weather": (
|
||||
heading: "Fira Sans",
|
||||
body: "Merriweather",
|
||||
description: "Open, friendly sans plus a space-efficient modern serif. Good for text-heavy documents."
|
||||
),
|
||||
|
||||
"android": (
|
||||
heading: "Roboto",
|
||||
body: "Roboto Serif",
|
||||
description: "A complete Android-friendly look. Roboto is extremely common; Roboto Serif is its matching new serif companion."
|
||||
),
|
||||
|
||||
"kindle": (
|
||||
heading: "Amazon Ember",
|
||||
body: "Bookerly",
|
||||
description: "The Kindle pairing. Bookerly is a warm, book-like serif; Amazon Ember is a clean, readable sans."
|
||||
),
|
||||
|
||||
"office": (
|
||||
heading: "Calibri",
|
||||
body: "Cambria",
|
||||
description: "A classic Microsoft Office pairing. Calibri (sans) for headings, Cambria (serif) for body text."
|
||||
),
|
||||
|
||||
"modern-heritage": (
|
||||
heading: "Montserrat",
|
||||
body: "Georgia Pro",
|
||||
description: "Merges the warm, traditional forms of Georgia Pro with Montserrat’s clean, geometric lines. A modern-yet-classic pairing, equally suited to formal reports or stylish web layouts."
|
||||
),
|
||||
|
||||
"legible": (
|
||||
heading: "Lexend",
|
||||
body: "Literata",
|
||||
description: "An ultra-legible pairing designed for reading fluency. Lexend’s tall x-height and open shapes reduce visual stress, while Literata brings a warm, bookish feel to body text."
|
||||
),
|
||||
)
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 994 KiB |
@@ -0,0 +1,23 @@
|
||||
#import "/lib.typ": *
|
||||
|
||||
#set page(margin: 1em, height: auto, width: 5.5in)
|
||||
#set par(justify: true, linebreaks: "optimized")
|
||||
|
||||
#let keys = font-pairings.keys().sorted()
|
||||
|
||||
#for key in keys {
|
||||
block(
|
||||
stroke: 1pt + navy,
|
||||
inset: 1em,
|
||||
radius: 1em,
|
||||
[
|
||||
#let pairing = font-pairings.at(key)
|
||||
#show heading: set text(font: pairing.heading, weight: "bold")
|
||||
= #pairing.heading & #pairing.body #h(1fr) #text(fill: eastern, weight: "light", size: 0.8em, baseline: -3pt, ["#key"])
|
||||
#set text(font: pairing.body, weight: "light")
|
||||
#pairing.description
|
||||
|
||||
#lorem(20)
|
||||
]
|
||||
)
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 366 KiB |
@@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "tasteful-pairings"
|
||||
version = "0.1.0"
|
||||
entrypoint = "lib.typ"
|
||||
authors = ["Stephen Waits <steve@waits.net>"]
|
||||
license = "MIT"
|
||||
description = "A carefully curated collection of font pairings."
|
||||
keywords = ["font", "pairing", "typography"]
|
||||
repository = "https://github.com/swaits/typst-collection"
|
||||
exclude = ["thumbnail.png", "tests"]
|
||||
Reference in new issue
Block a user