@tonguetoquill/collection 0.2.4 → 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,70 +1,70 @@
|
|
|
1
|
-
// primitives.typ: Reusable rendering primitives for CMU letterhead sections
|
|
2
|
-
//
|
|
3
|
-
// This module implements the visual rendering functions for all sections
|
|
4
|
-
// of a CMU letterhead letter following the official guidelines.
|
|
5
|
-
|
|
6
|
-
#import "config.typ": *
|
|
7
|
-
#import "utils.typ": *
|
|
8
|
-
|
|
9
|
-
// =============================================================================
|
|
10
|
-
// HEADER RENDERING
|
|
11
|
-
// =============================================================================
|
|
12
|
-
// Guidelines section 4: Header Composition
|
|
13
|
-
// - Wordmark (Top-Left)
|
|
14
|
-
// - Sender's Address Block (Immediately below wordmark)
|
|
15
|
-
|
|
16
|
-
#let render-header(
|
|
17
|
-
wordmark,
|
|
18
|
-
department: none,
|
|
19
|
-
address: none,
|
|
20
|
-
url: none,
|
|
21
|
-
) = {
|
|
22
|
-
// CMU Wordmark
|
|
23
|
-
// Guidelines 4.1: Width approx 2.25" to 2.5"
|
|
24
|
-
if wordmark != none {
|
|
25
|
-
let wordmark_content = box(width: 2.5in)[
|
|
26
|
-
#set image(width: 100%)
|
|
27
|
-
#wordmark
|
|
28
|
-
]
|
|
29
|
-
|
|
30
|
-
// Hyperlink wordmark to URL if provided
|
|
31
|
-
if url != none {
|
|
32
|
-
link("https://" + url)[#wordmark_content]
|
|
33
|
-
} else {
|
|
34
|
-
wordmark_content
|
|
35
|
-
}
|
|
36
|
-
linebreak()
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
// Sender's Address Block
|
|
41
|
-
// Guidelines 4.2: Flush Left
|
|
42
|
-
|
|
43
|
-
// Department Name: Bold and darker
|
|
44
|
-
if department != none {
|
|
45
|
-
text(weight: "bold", fill: black)[#department]
|
|
46
|
-
linebreak()
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
set text(fill: CMU_IRON_GRAY)
|
|
50
|
-
|
|
51
|
-
// University Name: Regular
|
|
52
|
-
[Carnegie Mellon University]
|
|
53
|
-
linebreak()
|
|
54
|
-
|
|
55
|
-
// Address Lines: Regular
|
|
56
|
-
if address != none {
|
|
57
|
-
let address_lines = if type(address) == "string" {
|
|
58
|
-
(address,)
|
|
59
|
-
} else {
|
|
60
|
-
address
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
for line in address_lines {
|
|
64
|
-
[#line]
|
|
65
|
-
linebreak()
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// URL is now hyperlinked to wordmark, not displayed as text
|
|
70
|
-
}
|
|
1
|
+
// primitives.typ: Reusable rendering primitives for CMU letterhead sections
|
|
2
|
+
//
|
|
3
|
+
// This module implements the visual rendering functions for all sections
|
|
4
|
+
// of a CMU letterhead letter following the official guidelines.
|
|
5
|
+
|
|
6
|
+
#import "config.typ": *
|
|
7
|
+
#import "utils.typ": *
|
|
8
|
+
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// HEADER RENDERING
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// Guidelines section 4: Header Composition
|
|
13
|
+
// - Wordmark (Top-Left)
|
|
14
|
+
// - Sender's Address Block (Immediately below wordmark)
|
|
15
|
+
|
|
16
|
+
#let render-header(
|
|
17
|
+
wordmark,
|
|
18
|
+
department: none,
|
|
19
|
+
address: none,
|
|
20
|
+
url: none,
|
|
21
|
+
) = {
|
|
22
|
+
// CMU Wordmark
|
|
23
|
+
// Guidelines 4.1: Width approx 2.25" to 2.5"
|
|
24
|
+
if wordmark != none {
|
|
25
|
+
let wordmark_content = box(width: 2.5in)[
|
|
26
|
+
#set image(width: 100%)
|
|
27
|
+
#wordmark
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
// Hyperlink wordmark to URL if provided
|
|
31
|
+
if url != none {
|
|
32
|
+
link("https://" + url)[#wordmark_content]
|
|
33
|
+
} else {
|
|
34
|
+
wordmark_content
|
|
35
|
+
}
|
|
36
|
+
linebreak()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
// Sender's Address Block
|
|
41
|
+
// Guidelines 4.2: Flush Left
|
|
42
|
+
|
|
43
|
+
// Department Name: Bold and darker
|
|
44
|
+
if department != none {
|
|
45
|
+
text(weight: "bold", fill: black)[#department]
|
|
46
|
+
linebreak()
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
set text(fill: CMU_IRON_GRAY)
|
|
50
|
+
|
|
51
|
+
// University Name: Regular
|
|
52
|
+
[Carnegie Mellon University]
|
|
53
|
+
linebreak()
|
|
54
|
+
|
|
55
|
+
// Address Lines: Regular
|
|
56
|
+
if address != none {
|
|
57
|
+
let address_lines = if type(address) == "string" {
|
|
58
|
+
(address,)
|
|
59
|
+
} else {
|
|
60
|
+
address
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
for line in address_lines {
|
|
64
|
+
[#line]
|
|
65
|
+
linebreak()
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// URL is now hyperlinked to wordmark, not displayed as text
|
|
70
|
+
}
|
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
// utils.typ: Utility functions for CMU letterhead template
|
|
2
|
-
//
|
|
3
|
-
// This module provides core utility functions used by the main letterhead template.
|
|
4
|
-
|
|
5
|
-
#import "config.typ": *
|
|
6
|
-
|
|
7
|
-
// =============================================================================
|
|
8
|
-
// SPACING UTILITIES
|
|
9
|
-
// =============================================================================
|
|
10
|
-
|
|
11
|
-
/// Creates vertical spacing equivalent to multiple blank lines.
|
|
12
|
-
///
|
|
13
|
-
/// - count (int): Number of blank lines to create
|
|
14
|
-
/// - weak (bool): Whether spacing can be compressed at page breaks
|
|
15
|
-
/// -> content
|
|
16
|
-
#let blank-lines(count, weak: true) = {
|
|
17
|
-
for i in range(0, count) {
|
|
18
|
-
v(1.4em)
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/// Creates vertical spacing equivalent to one blank line.
|
|
23
|
-
/// -> content
|
|
24
|
-
#let blank-line(weak: true) = blank-lines(1, weak: weak)
|
|
25
|
-
|
|
26
|
-
// =============================================================================
|
|
27
|
-
// GENERAL UTILITIES
|
|
28
|
-
// =============================================================================
|
|
29
|
-
|
|
30
|
-
/// Checks if a value is "falsey" (none, false, empty array, or empty string).
|
|
31
|
-
///
|
|
32
|
-
/// - value (any): The value to check
|
|
33
|
-
/// -> bool
|
|
34
|
-
#let falsey(value) = {
|
|
35
|
-
value == none or value == false or (type(value) == array and value.len() == 0) or (type(value) == str and value == "")
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/// Ensures the input is a string. If an array, joins elements with separator.
|
|
39
|
-
///
|
|
40
|
-
/// - value: Any value to normalize to string form
|
|
41
|
-
/// - separator: String to use when joining array elements (default: "\n")
|
|
42
|
-
/// -> str
|
|
43
|
-
#let ensure-string(value, separator: "\n") = {
|
|
44
|
-
if value == none {
|
|
45
|
-
""
|
|
46
|
-
} else if type(value) == array {
|
|
47
|
-
value.join(separator)
|
|
48
|
-
} else {
|
|
49
|
-
str(value)
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/// Scales content to fit within a specified box while maintaining aspect ratio.
|
|
54
|
-
///
|
|
55
|
-
/// - width (length): Maximum width for the content
|
|
56
|
-
/// - height (length): Maximum height for the content
|
|
57
|
-
/// - alignment (alignment): Content alignment within the box
|
|
58
|
-
/// - body (content): Content to scale and fit
|
|
59
|
-
/// -> content
|
|
60
|
-
#let fit-box(width: 2in, height: 1in, alignment: left + horizon, body) = context {
|
|
61
|
-
let s = measure(body)
|
|
62
|
-
let f = calc.min(width / s.width, height / s.height) * 100%
|
|
63
|
-
box(width: width, height: height, clip: true)[
|
|
64
|
-
#align(alignment)[
|
|
65
|
-
#scale(f, reflow: true)[#body]
|
|
66
|
-
]
|
|
67
|
-
]
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// =============================================================================
|
|
71
|
-
// DATE FORMATTING
|
|
72
|
-
// =============================================================================
|
|
73
|
-
|
|
74
|
-
/// Formats a date in CMU civilian format: "Month Day, Year"
|
|
75
|
-
/// Guidelines section 3.2: Date format is "Month Day, Year" (e.g., November 29, 2025)
|
|
76
|
-
///
|
|
77
|
-
/// - date (str|datetime): Date to format
|
|
78
|
-
/// -> str
|
|
79
|
-
#let display-date(date) = {
|
|
80
|
-
if type(date) == str {
|
|
81
|
-
date
|
|
82
|
-
} else {
|
|
83
|
-
date.display("[month repr:long] [day padding:none], [year]")
|
|
84
|
-
}
|
|
85
|
-
}
|
|
1
|
+
// utils.typ: Utility functions for CMU letterhead template
|
|
2
|
+
//
|
|
3
|
+
// This module provides core utility functions used by the main letterhead template.
|
|
4
|
+
|
|
5
|
+
#import "config.typ": *
|
|
6
|
+
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// SPACING UTILITIES
|
|
9
|
+
// =============================================================================
|
|
10
|
+
|
|
11
|
+
/// Creates vertical spacing equivalent to multiple blank lines.
|
|
12
|
+
///
|
|
13
|
+
/// - count (int): Number of blank lines to create
|
|
14
|
+
/// - weak (bool): Whether spacing can be compressed at page breaks
|
|
15
|
+
/// -> content
|
|
16
|
+
#let blank-lines(count, weak: true) = {
|
|
17
|
+
for i in range(0, count) {
|
|
18
|
+
v(1.4em)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/// Creates vertical spacing equivalent to one blank line.
|
|
23
|
+
/// -> content
|
|
24
|
+
#let blank-line(weak: true) = blank-lines(1, weak: weak)
|
|
25
|
+
|
|
26
|
+
// =============================================================================
|
|
27
|
+
// GENERAL UTILITIES
|
|
28
|
+
// =============================================================================
|
|
29
|
+
|
|
30
|
+
/// Checks if a value is "falsey" (none, false, empty array, or empty string).
|
|
31
|
+
///
|
|
32
|
+
/// - value (any): The value to check
|
|
33
|
+
/// -> bool
|
|
34
|
+
#let falsey(value) = {
|
|
35
|
+
value == none or value == false or (type(value) == array and value.len() == 0) or (type(value) == str and value == "")
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/// Ensures the input is a string. If an array, joins elements with separator.
|
|
39
|
+
///
|
|
40
|
+
/// - value: Any value to normalize to string form
|
|
41
|
+
/// - separator: String to use when joining array elements (default: "\n")
|
|
42
|
+
/// -> str
|
|
43
|
+
#let ensure-string(value, separator: "\n") = {
|
|
44
|
+
if value == none {
|
|
45
|
+
""
|
|
46
|
+
} else if type(value) == array {
|
|
47
|
+
value.join(separator)
|
|
48
|
+
} else {
|
|
49
|
+
str(value)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// Scales content to fit within a specified box while maintaining aspect ratio.
|
|
54
|
+
///
|
|
55
|
+
/// - width (length): Maximum width for the content
|
|
56
|
+
/// - height (length): Maximum height for the content
|
|
57
|
+
/// - alignment (alignment): Content alignment within the box
|
|
58
|
+
/// - body (content): Content to scale and fit
|
|
59
|
+
/// -> content
|
|
60
|
+
#let fit-box(width: 2in, height: 1in, alignment: left + horizon, body) = context {
|
|
61
|
+
let s = measure(body)
|
|
62
|
+
let f = calc.min(width / s.width, height / s.height) * 100%
|
|
63
|
+
box(width: width, height: height, clip: true)[
|
|
64
|
+
#align(alignment)[
|
|
65
|
+
#scale(f, reflow: true)[#body]
|
|
66
|
+
]
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// =============================================================================
|
|
71
|
+
// DATE FORMATTING
|
|
72
|
+
// =============================================================================
|
|
73
|
+
|
|
74
|
+
/// Formats a date in CMU civilian format: "Month Day, Year"
|
|
75
|
+
/// Guidelines section 3.2: Date format is "Month Day, Year" (e.g., November 29, 2025)
|
|
76
|
+
///
|
|
77
|
+
/// - date (str|datetime): Date to format
|
|
78
|
+
/// -> str
|
|
79
|
+
#let display-date(date) = {
|
|
80
|
+
if type(date) == str {
|
|
81
|
+
date
|
|
82
|
+
} else {
|
|
83
|
+
date.display("[month repr:long] [day padding:none], [year]")
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
[package]
|
|
2
|
-
name = "tonguetoquill-cmu-letter"
|
|
3
|
-
version = "0.1.0"
|
|
4
|
-
compiler = "0.14.0"
|
|
5
|
-
entrypoint = "src/lib.typ"
|
|
6
|
-
repository = "https://github.com/nibsbin/tonguetoquill-cmu-letter"
|
|
7
|
-
authors = ["Nibs"]
|
|
8
|
-
license = "MIT"
|
|
9
|
-
description = "Typeset letters that comply with Carnegie Mellon University letterhead standards."
|
|
10
|
-
keywords = ["CMU", "Carnegie Mellon", "letterhead", "letter", "university", "official", "correspondence", "formatting"]
|
|
11
|
-
categories = ["office", "report"]
|
|
12
|
-
disciplines = ["business", "engineering", "education"]
|
|
13
|
-
|
|
14
|
-
[template]
|
|
15
|
-
path = "template"
|
|
16
|
-
entrypoint = "cmu-template.typ"
|
|
17
|
-
thumbnail = "template/assets/thumbnail.png"
|
|
1
|
+
[package]
|
|
2
|
+
name = "tonguetoquill-cmu-letter"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
compiler = "0.14.0"
|
|
5
|
+
entrypoint = "src/lib.typ"
|
|
6
|
+
repository = "https://github.com/nibsbin/tonguetoquill-cmu-letter"
|
|
7
|
+
authors = ["Nibs"]
|
|
8
|
+
license = "MIT"
|
|
9
|
+
description = "Typeset letters that comply with Carnegie Mellon University letterhead standards."
|
|
10
|
+
keywords = ["CMU", "Carnegie Mellon", "letterhead", "letter", "university", "official", "correspondence", "formatting"]
|
|
11
|
+
categories = ["office", "report"]
|
|
12
|
+
disciplines = ["business", "engineering", "education"]
|
|
13
|
+
|
|
14
|
+
[template]
|
|
15
|
+
path = "template"
|
|
16
|
+
entrypoint = "cmu-template.typ"
|
|
17
|
+
thumbnail = "template/assets/thumbnail.png"
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
#import "@local/quillmark-helper:0.1.0": data, eval-markup, parse-date
|
|
2
|
-
#import "@local/tonguetoquill-cmu-letter:0.1.0": backmatter, frontmatter, mainmatter
|
|
3
|
-
|
|
4
|
-
#show: frontmatter.with(
|
|
5
|
-
wordmark: image("assets/cmu-wordmark.svg"),
|
|
6
|
-
department: data.department,
|
|
7
|
-
address: data.address,
|
|
8
|
-
url: data.url,
|
|
9
|
-
date: if "date" in data { parse-date(data.date) } else { datetime.today() },
|
|
10
|
-
recipient: data.recipient,
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
#show: mainmatter
|
|
14
|
-
|
|
15
|
-
#eval-markup(data.BODY)
|
|
16
|
-
|
|
17
|
-
#backmatter(
|
|
18
|
-
signature_block: data.signature_block,
|
|
19
|
-
)
|
|
1
|
+
#import "@local/quillmark-helper:0.1.0": data, eval-markup, parse-date
|
|
2
|
+
#import "@local/tonguetoquill-cmu-letter:0.1.0": backmatter, frontmatter, mainmatter
|
|
3
|
+
|
|
4
|
+
#show: frontmatter.with(
|
|
5
|
+
wordmark: image("assets/cmu-wordmark.svg"),
|
|
6
|
+
department: data.department,
|
|
7
|
+
address: data.address,
|
|
8
|
+
url: data.url,
|
|
9
|
+
date: if "date" in data { parse-date(data.date) } else { datetime.today() },
|
|
10
|
+
recipient: data.recipient,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
#show: mainmatter
|
|
14
|
+
|
|
15
|
+
#eval-markup(data.BODY)
|
|
16
|
+
|
|
17
|
+
#backmatter(
|
|
18
|
+
signature_block: data.signature_block,
|
|
19
|
+
)
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
Quill:
|
|
2
|
+
name: daf4392
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
backend: typst
|
|
5
|
+
plate_file: plate.typ
|
|
6
|
+
ui:
|
|
7
|
+
hide_body: true
|
|
8
|
+
example_file: example.md
|
|
9
|
+
description: "DAF Form 4392 - Pre-Departure Safety Briefing (Page 2)"
|
|
10
|
+
|
|
11
|
+
fields:
|
|
12
|
+
transportation_mode:
|
|
13
|
+
title: Mode of Transportation
|
|
14
|
+
type: string
|
|
15
|
+
required: true
|
|
16
|
+
description: "Matches the check box. Valid options: pmv, airplane, bus, train, motorcycle, other."
|
|
17
|
+
|
|
18
|
+
departure_date:
|
|
19
|
+
title: Departure Date
|
|
20
|
+
type: string
|
|
21
|
+
required: true
|
|
22
|
+
description: "Date of initial departure."
|
|
23
|
+
|
|
24
|
+
final_destination:
|
|
25
|
+
title: Final Destination
|
|
26
|
+
type: string
|
|
27
|
+
required: true
|
|
28
|
+
description: "Final travel destination."
|
|
29
|
+
|
|
30
|
+
notes:
|
|
31
|
+
title: Notes
|
|
32
|
+
type: string
|
|
33
|
+
description: "Additional notes or remarks for the travel."
|
|
34
|
+
|
|
35
|
+
organization:
|
|
36
|
+
title: Organization
|
|
37
|
+
type: string
|
|
38
|
+
required: true
|
|
39
|
+
description: "Unit / Organization conducting the brief."
|
|
40
|
+
|
|
41
|
+
briefed_date:
|
|
42
|
+
title: Date Briefed
|
|
43
|
+
type: string
|
|
44
|
+
required: true
|
|
45
|
+
description: "Date the brief took place."
|
|
46
|
+
|
|
47
|
+
briefee_name:
|
|
48
|
+
title: Individual Receiving Brief (Name)
|
|
49
|
+
type: string
|
|
50
|
+
required: true
|
|
51
|
+
description: "Name (Last, First) of the individual receiving the brief."
|
|
52
|
+
|
|
53
|
+
briefee_grade:
|
|
54
|
+
title: Individual Receiving Brief (Grade)
|
|
55
|
+
type: string
|
|
56
|
+
description: "Grade of the individual receiving the brief."
|
|
57
|
+
|
|
58
|
+
briefer_name:
|
|
59
|
+
title: Briefer / Reviewer Name
|
|
60
|
+
type: string
|
|
61
|
+
required: true
|
|
62
|
+
description: "Name (Last, First) of the briefer."
|
|
63
|
+
|
|
64
|
+
briefer_grade:
|
|
65
|
+
title: Briefer / Reviewer Grade
|
|
66
|
+
type: string
|
|
67
|
+
description: "Grade of the briefer."
|
|
68
|
+
|
|
69
|
+
emergency_contact:
|
|
70
|
+
title: Emergency Contact
|
|
71
|
+
type: string
|
|
72
|
+
description: "Name and phone number of the emergency contact person at the bottom of the form."
|
|
73
|
+
|
|
74
|
+
cards:
|
|
75
|
+
itinerary:
|
|
76
|
+
title: Proposed Travel Itinerary
|
|
77
|
+
description: "Each card represents one row in the travel itinerary table. Up to 5 rows are supported."
|
|
78
|
+
ui:
|
|
79
|
+
hide_body: true
|
|
80
|
+
fields:
|
|
81
|
+
date:
|
|
82
|
+
title: Date
|
|
83
|
+
type: string
|
|
84
|
+
ui:
|
|
85
|
+
group: Itinerary Entry
|
|
86
|
+
description: "Date for the itinerary row."
|
|
87
|
+
departure_point:
|
|
88
|
+
title: Departure Point
|
|
89
|
+
type: string
|
|
90
|
+
ui:
|
|
91
|
+
group: Itinerary Entry
|
|
92
|
+
description: "Point of departure."
|
|
93
|
+
arrival_point:
|
|
94
|
+
title: Arrival Point
|
|
95
|
+
type: string
|
|
96
|
+
ui:
|
|
97
|
+
group: Itinerary Entry
|
|
98
|
+
description: "Point of arrival."
|
|
99
|
+
rest_length:
|
|
100
|
+
title: Length of Rest Period
|
|
101
|
+
type: string
|
|
102
|
+
ui:
|
|
103
|
+
group: Itinerary Entry
|
|
104
|
+
description: "Duration of rest period."
|
|
105
|
+
mileage:
|
|
106
|
+
title: Approximate Mileage
|
|
107
|
+
type: string
|
|
108
|
+
ui:
|
|
109
|
+
group: Itinerary Entry
|
|
110
|
+
description: "Approximate mileage for this leg."
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
QUILL: daf4392
|
|
3
|
+
|
|
4
|
+
transportation_mode: "other"
|
|
5
|
+
departure_date: "XX Mar 26"
|
|
6
|
+
final_destination: "123 Sesame St, Fake City, MS"
|
|
7
|
+
notes: "Visiting Donald Duck over 3 day weekend."
|
|
8
|
+
organization: "333 TRS"
|
|
9
|
+
briefed_date: "XX Mar 26"
|
|
10
|
+
briefee_name: "Doe, Jane"
|
|
11
|
+
briefee_grade: "O-1"
|
|
12
|
+
briefer_name: ""
|
|
13
|
+
briefer_grade: ""
|
|
14
|
+
emergency_contact: "John Doe: 999-999-9999"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
CARD: itinerary
|
|
19
|
+
date: "XX Mar"
|
|
20
|
+
departure_point: "Biloxi, MS"
|
|
21
|
+
arrival_point: "Fake City, MS"
|
|
22
|
+
rest_length: "2 days"
|
|
23
|
+
mileage: "250"
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
CARD: itinerary
|
|
28
|
+
date: "XX Mar"
|
|
29
|
+
departure_point: "Fake City, MS"
|
|
30
|
+
arrival_point: "Biloxi, MS"
|
|
31
|
+
rest_length: "0"
|
|
32
|
+
mileage: "0"
|
|
33
|
+
---
|