@tonguetoquill/collection 0.2.3 → 0.2.5-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -201
- package/README.md +39 -39
- package/index.d.ts +2 -2
- package/index.js +8 -8
- package/package.json +41 -41
- package/quills/af4141/0.1.0/Quill.yaml +88 -88
- package/quills/af4141/0.1.0/design/TASK.md +19 -19
- package/quills/af4141/0.1.0/example.md +35 -35
- package/quills/af4141/0.1.0/packages/typst-af4141/FIELDS.json +3169 -3169
- package/quills/af4141/0.1.0/packages/typst-af4141/form.typ +538 -538
- package/quills/af4141/0.1.0/packages/typst-af4141/lib.typ +227 -227
- package/quills/af4141/0.1.0/packages/typst-af4141/typst.toml +7 -7
- package/quills/af4141/0.1.0/plate.typ +48 -48
- package/quills/classic_resume/0.1.0/Quill.yaml +118 -118
- package/quills/classic_resume/0.1.0/example.md +232 -232
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/LICENSE +21 -21
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/README.md +38 -38
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/src/components.typ +184 -184
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/src/layout.typ +42 -42
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/src/lib.typ +5 -5
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/typst.toml +26 -26
- package/quills/classic_resume/0.1.0/plate.typ +44 -44
- package/quills/cmu_letter/0.1.0/.quillignore +30 -30
- package/quills/cmu_letter/0.1.0/Quill.yaml +64 -64
- package/quills/cmu_letter/0.1.0/assets/cmu-wordmark.svg +174 -174
- package/quills/cmu_letter/0.1.0/example.md +30 -30
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/LICENSE +21 -21
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/fonts/README.txt +100 -100
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/backmatter.typ +13 -13
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/config.typ +39 -39
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/frontmatter.typ +72 -72
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/lib.typ +47 -47
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/mainmatter.typ +42 -42
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/primitives.typ +70 -70
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/utils.typ +85 -85
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/typst.toml +17 -17
- package/quills/cmu_letter/0.1.0/plate.typ +19 -19
- package/quills/daf4392/0.1.0/Quill.yaml +110 -0
- package/quills/daf4392/0.1.0/assets/arimo-v35-latin-700.ttf +0 -0
- package/quills/daf4392/0.1.0/assets/arimo-v35-latin-700italic.ttf +0 -0
- package/quills/daf4392/0.1.0/assets/arimo-v35-latin-italic.ttf +0 -0
- package/quills/daf4392/0.1.0/assets/arimo-v35-latin-regular.ttf +0 -0
- package/quills/daf4392/0.1.0/assets/page1.png +0 -0
- package/quills/daf4392/0.1.0/example.md +33 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/FIELDS.json +9 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/form.typ +14 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/lib.typ +227 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/out/debug.typ +4 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/out/example.typ +4 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/page1.png +0 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/typst.toml +7 -0
- package/quills/daf4392/0.1.0/plate.typ +60 -0
- package/quills/taro/0.1.0/Quill.yaml +29 -29
- package/quills/taro/0.1.0/example.md +26 -26
- package/quills/taro/0.1.0/plate.typ +31 -31
- package/quills/usaf_memo/0.1.0/.quillignore +30 -30
- package/quills/usaf_memo/0.1.0/Quill.yaml +209 -209
- package/quills/usaf_memo/0.1.0/example.md +54 -54
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/LICENSE +21 -21
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/LICENSE +93 -93
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/fonts/CopperplateCC/LICENSE.md +79 -79
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/fonts/NimbusRomanNo9L/GNU General Public License.txt +339 -339
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/backmatter.typ +28 -28
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/body.typ +332 -332
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/config.typ +63 -63
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/frontmatter.typ +114 -114
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/indorsement.typ +118 -118
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/lib.typ +55 -55
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/mainmatter.typ +32 -32
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/primitives.typ +272 -272
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/utils.typ +377 -377
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/typst.toml +16 -16
- package/quills/usaf_memo/0.1.0/plate.typ +74 -74
- package/quills/usaf_memo/0.2.0/.quillignore +30 -30
- package/quills/usaf_memo/0.2.0/Quill.yaml +219 -219
- package/quills/usaf_memo/0.2.0/example.md +55 -55
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/.gitignore +6 -6
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/LICENSE +21 -21
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/LICENSE +93 -93
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/CopperplateCC/LICENSE.md +79 -79
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/NimbusRomanNo9L/GNU General Public License.txt +339 -339
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/backmatter.typ +28 -28
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/body.typ +333 -333
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/config.typ +64 -64
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/frontmatter.typ +114 -114
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/indorsement.typ +118 -118
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/lib.typ +55 -55
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/mainmatter.typ +32 -32
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/primitives.typ +293 -293
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/utils.typ +374 -374
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/typst.toml +27 -27
- package/quills/usaf_memo/0.2.0/plate.typ +75 -75
- package/templates/af4141.md +88 -88
- package/templates/cmu_letter_template.md +37 -37
- package/templates/daf4392.md +33 -0
- package/templates/loc.md +78 -78
- package/templates/pass_request.md +43 -43
- package/templates/rebuttal.md +55 -55
- package/templates/taro.md +26 -26
- package/templates/templates.json +55 -49
- package/templates/usaf_template.md +23 -23
- package/templates/ussf_template.md +29 -29
|
@@ -1,184 +1,184 @@
|
|
|
1
|
-
// components.typ
|
|
2
|
-
#import "layout.typ": config, vgap
|
|
3
|
-
|
|
4
|
-
// --- Utility Functions ---
|
|
5
|
-
|
|
6
|
-
// Horizontal Rule
|
|
7
|
-
#let hrule = {
|
|
8
|
-
line(length: 100%, stroke: 0.75pt)
|
|
9
|
-
v(-2pt)
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// --- Constants ---
|
|
13
|
-
#let bullet_marker_width = 3.5pt
|
|
14
|
-
#let bullet_body_indent = 0.8em
|
|
15
|
-
#let bullet_text_offset = bullet_marker_width + bullet_body_indent
|
|
16
|
-
|
|
17
|
-
// --- Component Exports ---
|
|
18
|
-
|
|
19
|
-
// Resume Header
|
|
20
|
-
#let resume-header(name: "", contacts: ()) = {
|
|
21
|
-
set align(left)
|
|
22
|
-
|
|
23
|
-
// Name
|
|
24
|
-
block(text(size: 18pt, weight: "bold", name))
|
|
25
|
-
|
|
26
|
-
set text(size: config.base-size, weight: "regular")
|
|
27
|
-
|
|
28
|
-
vgap(config.entry-spacing)
|
|
29
|
-
|
|
30
|
-
// Contacts
|
|
31
|
-
// Separator: ' ❖ '
|
|
32
|
-
for i in range(0, contacts.len()) {
|
|
33
|
-
let contact = contacts.at(i)
|
|
34
|
-
if i > 0 {
|
|
35
|
-
[~~#text("❖", size: 8pt)~~#contact]
|
|
36
|
-
} else {
|
|
37
|
-
[#contact]
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
//block(contact_text)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
// Section Header
|
|
46
|
-
#let section-header(title, extra: none) = {
|
|
47
|
-
vgap(config.section-spacing)
|
|
48
|
-
set align(left)
|
|
49
|
-
|
|
50
|
-
// Title
|
|
51
|
-
block({
|
|
52
|
-
text(weight: "bold", upper(title))
|
|
53
|
-
if extra != none {
|
|
54
|
-
text(weight: "bold", " " + extra)
|
|
55
|
-
}
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
hrule
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Timeline Entry
|
|
62
|
-
#let timeline-entry(
|
|
63
|
-
heading-left: "",
|
|
64
|
-
heading-right: "",
|
|
65
|
-
subheading-left: none,
|
|
66
|
-
subheading-right: none,
|
|
67
|
-
body: none,
|
|
68
|
-
) = {
|
|
69
|
-
vgap(config.entry-spacing)
|
|
70
|
-
block(breakable: false, {
|
|
71
|
-
// Header Grid (combined for alignment and spacing)
|
|
72
|
-
let cells = (
|
|
73
|
-
align(left, text(weight: "bold", heading-left)),
|
|
74
|
-
align(right, text(weight: "bold", heading-right)),
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
if subheading-left != none or subheading-right != none {
|
|
78
|
-
cells.push(align(left, text(style: "italic", subheading-left)))
|
|
79
|
-
cells.push(align(right, text(style: "italic", subheading-right)))
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
grid(
|
|
83
|
-
columns: (1fr, auto),
|
|
84
|
-
row-gutter: config.leading, // Use global vertical rhythm
|
|
85
|
-
..cells,
|
|
86
|
-
)
|
|
87
|
-
|
|
88
|
-
// Body content (Optional)
|
|
89
|
-
if body != none {
|
|
90
|
-
// Style native Typst lists to match previous bullet styling
|
|
91
|
-
show list: set list(
|
|
92
|
-
marker: box(fill: black, width: bullet_marker_width, height: bullet_marker_width, radius: 0pt, baseline: .5em),
|
|
93
|
-
body-indent: bullet_body_indent,
|
|
94
|
-
indent: 0em,
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
body
|
|
98
|
-
}
|
|
99
|
-
})
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Unified Table Component
|
|
103
|
-
// Auto-detects structure from item shape:
|
|
104
|
-
// Categorized: ((category: content, text: content), ...)
|
|
105
|
-
// Flat: (content, content, ...)
|
|
106
|
-
#let table(items: (), columns: 2) = {
|
|
107
|
-
if items.len() == 0 { return }
|
|
108
|
-
|
|
109
|
-
// Auto-detect from item shape
|
|
110
|
-
let is_categorized = (
|
|
111
|
-
type(items.at(0)) == dictionary and "category" in items.at(0)
|
|
112
|
-
)
|
|
113
|
-
|
|
114
|
-
vgap(config.entry-spacing)
|
|
115
|
-
|
|
116
|
-
let render_cell(item) = {
|
|
117
|
-
if is_categorized {
|
|
118
|
-
block({
|
|
119
|
-
text(weight: "bold", item.category)
|
|
120
|
-
linebreak()
|
|
121
|
-
item.text
|
|
122
|
-
})
|
|
123
|
-
} else {
|
|
124
|
-
item
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
pad(
|
|
129
|
-
left: bullet_text_offset,
|
|
130
|
-
grid(
|
|
131
|
-
columns: (1fr,) * columns,
|
|
132
|
-
row-gutter: if is_categorized {
|
|
133
|
-
config.leading + config.entry-spacing
|
|
134
|
-
} else {
|
|
135
|
-
config.leading
|
|
136
|
-
},
|
|
137
|
-
column-gutter: 1em,
|
|
138
|
-
..items.map(render_cell),
|
|
139
|
-
),
|
|
140
|
-
)
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Backward compatibility shims (deprecated)
|
|
144
|
-
// These will be removed in a future major version
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
// Project Entry (PROJECTS section)
|
|
148
|
-
#let project-entry(
|
|
149
|
-
name: "",
|
|
150
|
-
url: none,
|
|
151
|
-
body: none,
|
|
152
|
-
) = {
|
|
153
|
-
vgap(config.entry-spacing)
|
|
154
|
-
block(breakable: false, {
|
|
155
|
-
// Header Grid
|
|
156
|
-
grid(
|
|
157
|
-
columns: (1fr, auto),
|
|
158
|
-
row-gutter: config.leading,
|
|
159
|
-
align(left, text(weight: "bold", name)),
|
|
160
|
-
align(right, {
|
|
161
|
-
if url != none {
|
|
162
|
-
// Only hyperlink if it looks like a URL
|
|
163
|
-
if url.starts-with("http") {
|
|
164
|
-
text(size: 8pt, font: "Courier New", emph(link(url)[#url]))
|
|
165
|
-
} else {
|
|
166
|
-
text(size: 8pt, font: "Courier New", url)
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}),
|
|
170
|
-
)
|
|
171
|
-
|
|
172
|
-
// Body content (Optional)
|
|
173
|
-
if body != none {
|
|
174
|
-
// Style native Typst lists to match previous bullet styling
|
|
175
|
-
show list: set list(
|
|
176
|
-
marker: box(fill: black, width: bullet_marker_width, height: bullet_marker_width, radius: 0pt, baseline: .5em),
|
|
177
|
-
body-indent: bullet_body_indent,
|
|
178
|
-
indent: 0em,
|
|
179
|
-
)
|
|
180
|
-
|
|
181
|
-
body
|
|
182
|
-
}
|
|
183
|
-
})
|
|
184
|
-
}
|
|
1
|
+
// components.typ
|
|
2
|
+
#import "layout.typ": config, vgap
|
|
3
|
+
|
|
4
|
+
// --- Utility Functions ---
|
|
5
|
+
|
|
6
|
+
// Horizontal Rule
|
|
7
|
+
#let hrule = {
|
|
8
|
+
line(length: 100%, stroke: 0.75pt)
|
|
9
|
+
v(-2pt)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// --- Constants ---
|
|
13
|
+
#let bullet_marker_width = 3.5pt
|
|
14
|
+
#let bullet_body_indent = 0.8em
|
|
15
|
+
#let bullet_text_offset = bullet_marker_width + bullet_body_indent
|
|
16
|
+
|
|
17
|
+
// --- Component Exports ---
|
|
18
|
+
|
|
19
|
+
// Resume Header
|
|
20
|
+
#let resume-header(name: "", contacts: ()) = {
|
|
21
|
+
set align(left)
|
|
22
|
+
|
|
23
|
+
// Name
|
|
24
|
+
block(text(size: 18pt, weight: "bold", name))
|
|
25
|
+
|
|
26
|
+
set text(size: config.base-size, weight: "regular")
|
|
27
|
+
|
|
28
|
+
vgap(config.entry-spacing)
|
|
29
|
+
|
|
30
|
+
// Contacts
|
|
31
|
+
// Separator: ' ❖ '
|
|
32
|
+
for i in range(0, contacts.len()) {
|
|
33
|
+
let contact = contacts.at(i)
|
|
34
|
+
if i > 0 {
|
|
35
|
+
[~~#text("❖", size: 8pt)~~#contact]
|
|
36
|
+
} else {
|
|
37
|
+
[#contact]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//block(contact_text)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
// Section Header
|
|
46
|
+
#let section-header(title, extra: none) = {
|
|
47
|
+
vgap(config.section-spacing)
|
|
48
|
+
set align(left)
|
|
49
|
+
|
|
50
|
+
// Title
|
|
51
|
+
block({
|
|
52
|
+
text(weight: "bold", upper(title))
|
|
53
|
+
if extra != none {
|
|
54
|
+
text(weight: "bold", " " + extra)
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
hrule
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Timeline Entry
|
|
62
|
+
#let timeline-entry(
|
|
63
|
+
heading-left: "",
|
|
64
|
+
heading-right: "",
|
|
65
|
+
subheading-left: none,
|
|
66
|
+
subheading-right: none,
|
|
67
|
+
body: none,
|
|
68
|
+
) = {
|
|
69
|
+
vgap(config.entry-spacing)
|
|
70
|
+
block(breakable: false, {
|
|
71
|
+
// Header Grid (combined for alignment and spacing)
|
|
72
|
+
let cells = (
|
|
73
|
+
align(left, text(weight: "bold", heading-left)),
|
|
74
|
+
align(right, text(weight: "bold", heading-right)),
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
if subheading-left != none or subheading-right != none {
|
|
78
|
+
cells.push(align(left, text(style: "italic", subheading-left)))
|
|
79
|
+
cells.push(align(right, text(style: "italic", subheading-right)))
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
grid(
|
|
83
|
+
columns: (1fr, auto),
|
|
84
|
+
row-gutter: config.leading, // Use global vertical rhythm
|
|
85
|
+
..cells,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
// Body content (Optional)
|
|
89
|
+
if body != none {
|
|
90
|
+
// Style native Typst lists to match previous bullet styling
|
|
91
|
+
show list: set list(
|
|
92
|
+
marker: box(fill: black, width: bullet_marker_width, height: bullet_marker_width, radius: 0pt, baseline: .5em),
|
|
93
|
+
body-indent: bullet_body_indent,
|
|
94
|
+
indent: 0em,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
body
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Unified Table Component
|
|
103
|
+
// Auto-detects structure from item shape:
|
|
104
|
+
// Categorized: ((category: content, text: content), ...)
|
|
105
|
+
// Flat: (content, content, ...)
|
|
106
|
+
#let table(items: (), columns: 2) = {
|
|
107
|
+
if items.len() == 0 { return }
|
|
108
|
+
|
|
109
|
+
// Auto-detect from item shape
|
|
110
|
+
let is_categorized = (
|
|
111
|
+
type(items.at(0)) == dictionary and "category" in items.at(0)
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
vgap(config.entry-spacing)
|
|
115
|
+
|
|
116
|
+
let render_cell(item) = {
|
|
117
|
+
if is_categorized {
|
|
118
|
+
block({
|
|
119
|
+
text(weight: "bold", item.category)
|
|
120
|
+
linebreak()
|
|
121
|
+
item.text
|
|
122
|
+
})
|
|
123
|
+
} else {
|
|
124
|
+
item
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
pad(
|
|
129
|
+
left: bullet_text_offset,
|
|
130
|
+
grid(
|
|
131
|
+
columns: (1fr,) * columns,
|
|
132
|
+
row-gutter: if is_categorized {
|
|
133
|
+
config.leading + config.entry-spacing
|
|
134
|
+
} else {
|
|
135
|
+
config.leading
|
|
136
|
+
},
|
|
137
|
+
column-gutter: 1em,
|
|
138
|
+
..items.map(render_cell),
|
|
139
|
+
),
|
|
140
|
+
)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Backward compatibility shims (deprecated)
|
|
144
|
+
// These will be removed in a future major version
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
// Project Entry (PROJECTS section)
|
|
148
|
+
#let project-entry(
|
|
149
|
+
name: "",
|
|
150
|
+
url: none,
|
|
151
|
+
body: none,
|
|
152
|
+
) = {
|
|
153
|
+
vgap(config.entry-spacing)
|
|
154
|
+
block(breakable: false, {
|
|
155
|
+
// Header Grid
|
|
156
|
+
grid(
|
|
157
|
+
columns: (1fr, auto),
|
|
158
|
+
row-gutter: config.leading,
|
|
159
|
+
align(left, text(weight: "bold", name)),
|
|
160
|
+
align(right, {
|
|
161
|
+
if url != none {
|
|
162
|
+
// Only hyperlink if it looks like a URL
|
|
163
|
+
if url.starts-with("http") {
|
|
164
|
+
text(size: 8pt, font: "Courier New", emph(link(url)[#url]))
|
|
165
|
+
} else {
|
|
166
|
+
text(size: 8pt, font: "Courier New", url)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}),
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
// Body content (Optional)
|
|
173
|
+
if body != none {
|
|
174
|
+
// Style native Typst lists to match previous bullet styling
|
|
175
|
+
show list: set list(
|
|
176
|
+
marker: box(fill: black, width: bullet_marker_width, height: bullet_marker_width, radius: 0pt, baseline: .5em),
|
|
177
|
+
body-indent: bullet_body_indent,
|
|
178
|
+
indent: 0em,
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
body
|
|
182
|
+
}
|
|
183
|
+
})
|
|
184
|
+
}
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
// layout.typ
|
|
2
|
-
|
|
3
|
-
// --- Configurations ---
|
|
4
|
-
#let config = (
|
|
5
|
-
font: "eb garamond",
|
|
6
|
-
base-size: 12pt,
|
|
7
|
-
leading: 0.5em, // Global spacing value (vertical rhythm)
|
|
8
|
-
section-spacing: 5pt,
|
|
9
|
-
entry-spacing: 5pt,
|
|
10
|
-
margin: 0.5in,
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
// --- Utility Functions ---
|
|
14
|
-
#let vgap(amount) = v(amount)
|
|
15
|
-
|
|
16
|
-
// --- Resume Show Rule (Global Setup) ---
|
|
17
|
-
#let resume(content) = {
|
|
18
|
-
set page(
|
|
19
|
-
paper: "us-letter",
|
|
20
|
-
margin: config.margin,
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
set text(
|
|
24
|
-
font: config.font,
|
|
25
|
-
size: config.base-size,
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
set par(
|
|
29
|
-
leading: config.leading,
|
|
30
|
-
justify: false,
|
|
31
|
-
spacing: config.leading, // Space between paragraphs
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
// Enforce global block spacing for vertical rhythm
|
|
35
|
-
set block(above: config.leading, below: config.leading)
|
|
36
|
-
set list(spacing: config.leading)
|
|
37
|
-
|
|
38
|
-
// Hyperlinks should be standard black text
|
|
39
|
-
show link: set text(fill: black)
|
|
40
|
-
|
|
41
|
-
content
|
|
42
|
-
}
|
|
1
|
+
// layout.typ
|
|
2
|
+
|
|
3
|
+
// --- Configurations ---
|
|
4
|
+
#let config = (
|
|
5
|
+
font: "eb garamond",
|
|
6
|
+
base-size: 12pt,
|
|
7
|
+
leading: 0.5em, // Global spacing value (vertical rhythm)
|
|
8
|
+
section-spacing: 5pt,
|
|
9
|
+
entry-spacing: 5pt,
|
|
10
|
+
margin: 0.5in,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
// --- Utility Functions ---
|
|
14
|
+
#let vgap(amount) = v(amount)
|
|
15
|
+
|
|
16
|
+
// --- Resume Show Rule (Global Setup) ---
|
|
17
|
+
#let resume(content) = {
|
|
18
|
+
set page(
|
|
19
|
+
paper: "us-letter",
|
|
20
|
+
margin: config.margin,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
set text(
|
|
24
|
+
font: config.font,
|
|
25
|
+
size: config.base-size,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
set par(
|
|
29
|
+
leading: config.leading,
|
|
30
|
+
justify: false,
|
|
31
|
+
spacing: config.leading, // Space between paragraphs
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
// Enforce global block spacing for vertical rhythm
|
|
35
|
+
set block(above: config.leading, below: config.leading)
|
|
36
|
+
set list(spacing: config.leading)
|
|
37
|
+
|
|
38
|
+
// Hyperlinks should be standard black text
|
|
39
|
+
show link: set text(fill: black)
|
|
40
|
+
|
|
41
|
+
content
|
|
42
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// lib.typ
|
|
2
|
-
// Classic Resume Template Logic
|
|
3
|
-
|
|
4
|
-
#import "layout.typ": config, resume
|
|
5
|
-
#import "components.typ": project-entry, resume-header, section-header, table, timeline-entry
|
|
1
|
+
// lib.typ
|
|
2
|
+
// Classic Resume Template Logic
|
|
3
|
+
|
|
4
|
+
#import "layout.typ": config, resume
|
|
5
|
+
#import "components.typ": project-entry, resume-header, section-header, table, timeline-entry
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
[package]
|
|
2
|
-
name = "ttq-classic-resume"
|
|
3
|
-
version = "0.1.0"
|
|
4
|
-
compiler = "0.14.0"
|
|
5
|
-
entrypoint = "src/lib.typ"
|
|
6
|
-
repository = "https://github.com/nibsbin/ttq-classic-resume"
|
|
7
|
-
authors = ["Nibs"]
|
|
8
|
-
license = "MIT"
|
|
9
|
-
description = "A clean and modern resume."
|
|
10
|
-
|
|
11
|
-
keywords = [
|
|
12
|
-
"resume",
|
|
13
|
-
"cv",
|
|
14
|
-
"curriculum vitae",
|
|
15
|
-
"job",
|
|
16
|
-
"career",
|
|
17
|
-
"professional",
|
|
18
|
-
"template",
|
|
19
|
-
]
|
|
20
|
-
categories = ["cv"]
|
|
21
|
-
disciplines = ["business", "computer-science", "engineering", "communication"]
|
|
22
|
-
|
|
23
|
-
[template]
|
|
24
|
-
path = "template"
|
|
25
|
-
entrypoint = "resume.typ"
|
|
26
|
-
thumbnail = "thumbnail.png"
|
|
1
|
+
[package]
|
|
2
|
+
name = "ttq-classic-resume"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
compiler = "0.14.0"
|
|
5
|
+
entrypoint = "src/lib.typ"
|
|
6
|
+
repository = "https://github.com/nibsbin/ttq-classic-resume"
|
|
7
|
+
authors = ["Nibs"]
|
|
8
|
+
license = "MIT"
|
|
9
|
+
description = "A clean and modern resume."
|
|
10
|
+
|
|
11
|
+
keywords = [
|
|
12
|
+
"resume",
|
|
13
|
+
"cv",
|
|
14
|
+
"curriculum vitae",
|
|
15
|
+
"job",
|
|
16
|
+
"career",
|
|
17
|
+
"professional",
|
|
18
|
+
"template",
|
|
19
|
+
]
|
|
20
|
+
categories = ["cv"]
|
|
21
|
+
disciplines = ["business", "computer-science", "engineering", "communication"]
|
|
22
|
+
|
|
23
|
+
[template]
|
|
24
|
+
path = "template"
|
|
25
|
+
entrypoint = "resume.typ"
|
|
26
|
+
thumbnail = "thumbnail.png"
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
#import "@local/quillmark-helper:0.1.0": data, eval-markup, parse-date
|
|
2
|
-
#import "@local/ttq-classic-resume:0.1.0": *
|
|
3
|
-
|
|
4
|
-
#show: resume
|
|
5
|
-
|
|
6
|
-
#resume-header(
|
|
7
|
-
name: data.name,
|
|
8
|
-
contacts: data.contacts,
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
#for card in data.CARDS {
|
|
12
|
-
if "title" in card and card.title != "" {
|
|
13
|
-
section-header(card.title)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
if card.CARD == "experience_section" {
|
|
17
|
-
timeline-entry(
|
|
18
|
-
heading-left: card.at("headingLeft", default: ""),
|
|
19
|
-
heading-right: card.at("headingRight", default: ""),
|
|
20
|
-
subheading-left: card.at("subheadingLeft", default: none),
|
|
21
|
-
subheading-right: card.at("subheadingRight", default: none),
|
|
22
|
-
body: eval-markup(card.at("BODY", default: "")),
|
|
23
|
-
)
|
|
24
|
-
} else if card.CARD == "skills_section" {
|
|
25
|
-
table(
|
|
26
|
-
columns: 2,
|
|
27
|
-
items: card.cells.map(item => (
|
|
28
|
-
category: item.category,
|
|
29
|
-
text: item.skills,
|
|
30
|
-
))
|
|
31
|
-
)
|
|
32
|
-
} else if card.CARD == "projects_section" {
|
|
33
|
-
project-entry(
|
|
34
|
-
name: card.name,
|
|
35
|
-
url: card.at("url", default: none),
|
|
36
|
-
body: eval-markup(card.at("BODY", default: "")),
|
|
37
|
-
)
|
|
38
|
-
} else if card.CARD == "certifications_section" {
|
|
39
|
-
table(
|
|
40
|
-
columns: 2,
|
|
41
|
-
items: card.cells
|
|
42
|
-
)
|
|
43
|
-
}
|
|
44
|
-
}
|
|
1
|
+
#import "@local/quillmark-helper:0.1.0": data, eval-markup, parse-date
|
|
2
|
+
#import "@local/ttq-classic-resume:0.1.0": *
|
|
3
|
+
|
|
4
|
+
#show: resume
|
|
5
|
+
|
|
6
|
+
#resume-header(
|
|
7
|
+
name: data.name,
|
|
8
|
+
contacts: data.contacts,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
#for card in data.CARDS {
|
|
12
|
+
if "title" in card and card.title != "" {
|
|
13
|
+
section-header(card.title)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if card.CARD == "experience_section" {
|
|
17
|
+
timeline-entry(
|
|
18
|
+
heading-left: card.at("headingLeft", default: ""),
|
|
19
|
+
heading-right: card.at("headingRight", default: ""),
|
|
20
|
+
subheading-left: card.at("subheadingLeft", default: none),
|
|
21
|
+
subheading-right: card.at("subheadingRight", default: none),
|
|
22
|
+
body: eval-markup(card.at("BODY", default: "")),
|
|
23
|
+
)
|
|
24
|
+
} else if card.CARD == "skills_section" {
|
|
25
|
+
table(
|
|
26
|
+
columns: 2,
|
|
27
|
+
items: card.cells.map(item => (
|
|
28
|
+
category: item.category,
|
|
29
|
+
text: item.skills,
|
|
30
|
+
))
|
|
31
|
+
)
|
|
32
|
+
} else if card.CARD == "projects_section" {
|
|
33
|
+
project-entry(
|
|
34
|
+
name: card.name,
|
|
35
|
+
url: card.at("url", default: none),
|
|
36
|
+
body: eval-markup(card.at("BODY", default: "")),
|
|
37
|
+
)
|
|
38
|
+
} else if card.CARD == "certifications_section" {
|
|
39
|
+
table(
|
|
40
|
+
columns: 2,
|
|
41
|
+
items: card.cells
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
# Example .quillignore for usaf_memo template
|
|
2
|
-
# This demonstrates the .quillignore functionality
|
|
3
|
-
|
|
4
|
-
# Ignore temporary and backup files
|
|
5
|
-
*.tmp
|
|
6
|
-
*.bak
|
|
7
|
-
*~
|
|
8
|
-
*.swp
|
|
9
|
-
|
|
10
|
-
# Ignore build artifacts
|
|
11
|
-
target/
|
|
12
|
-
dist/
|
|
13
|
-
build/
|
|
14
|
-
|
|
15
|
-
# Ignore OS-specific files
|
|
16
|
-
.DS_Store
|
|
17
|
-
Thumbs.db
|
|
18
|
-
desktop.ini
|
|
19
|
-
|
|
20
|
-
# Ignore version control
|
|
21
|
-
.git/
|
|
22
|
-
.svn/
|
|
23
|
-
|
|
24
|
-
# Ignore editor files
|
|
25
|
-
.vscode/
|
|
26
|
-
.idea/
|
|
27
|
-
*.sublime-*
|
|
28
|
-
|
|
29
|
-
# Ignore log files
|
|
30
|
-
*.log
|
|
1
|
+
# Example .quillignore for usaf_memo template
|
|
2
|
+
# This demonstrates the .quillignore functionality
|
|
3
|
+
|
|
4
|
+
# Ignore temporary and backup files
|
|
5
|
+
*.tmp
|
|
6
|
+
*.bak
|
|
7
|
+
*~
|
|
8
|
+
*.swp
|
|
9
|
+
|
|
10
|
+
# Ignore build artifacts
|
|
11
|
+
target/
|
|
12
|
+
dist/
|
|
13
|
+
build/
|
|
14
|
+
|
|
15
|
+
# Ignore OS-specific files
|
|
16
|
+
.DS_Store
|
|
17
|
+
Thumbs.db
|
|
18
|
+
desktop.ini
|
|
19
|
+
|
|
20
|
+
# Ignore version control
|
|
21
|
+
.git/
|
|
22
|
+
.svn/
|
|
23
|
+
|
|
24
|
+
# Ignore editor files
|
|
25
|
+
.vscode/
|
|
26
|
+
.idea/
|
|
27
|
+
*.sublime-*
|
|
28
|
+
|
|
29
|
+
# Ignore log files
|
|
30
|
+
*.log
|
|
31
31
|
logs/
|