@tonguetoquill/collection 0.14.0 → 0.15.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tonguetoquill/collection",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/nibsbin/tonguetoquill-collection.git"
@@ -37,6 +37,6 @@
37
37
  "dependencies": {},
38
38
  "devDependencies": {
39
39
  "@quillmark/registry": "^0.12.0",
40
- "@quillmark/wasm": "^0.51.0"
40
+ "@quillmark/wasm": "^0.53.1"
41
41
  }
42
42
  }
@@ -41,7 +41,7 @@ cards:
41
41
  fields:
42
42
  date:
43
43
  title: Date
44
- type: string
44
+ type: date
45
45
  ui:
46
46
  group: Record
47
47
  description: Date of the action (column A).
@@ -63,7 +63,7 @@ cards:
63
63
 
64
64
  written_grade_date:
65
65
  title: Written Grade Date
66
- type: string
66
+ type: date
67
67
  ui:
68
68
  group: Record
69
69
  compact: true
@@ -79,7 +79,7 @@ cards:
79
79
 
80
80
  positional_grade_date:
81
81
  title: Positional Grade Date
82
- type: string
82
+ type: date
83
83
  ui:
84
84
  group: Record
85
85
  compact: true
@@ -30,7 +30,7 @@ commanders_auth: ""
30
30
  <!-- Example 1: Initial assignment to a unit -->
31
31
  ---
32
32
  CARD: experience
33
- date: "15 Jan 25"
33
+ date: 2025-01-15
34
34
  action: "Assigned to 1 ACCS/DOT as Weapons Director"
35
35
  written_grade: ""
36
36
  written_grade_date: ""
@@ -42,10 +42,10 @@ auth_or_remarks: "Initial assignment"
42
42
  <!-- Example 2: Written upgrade evaluation -->
43
43
  ---
44
44
  CARD: experience
45
- date: "15 Mar 25"
45
+ date: 2025-03-15
46
46
  action: "Completed written upgrade evaluation for 3-Level"
47
47
  written_grade: "3"
48
- written_grade_date: "15 Mar 25"
48
+ written_grade_date: 2025-03-15
49
49
  positional_grade: ""
50
50
  positional_grade_date: ""
51
51
  auth_or_remarks: "Per AFMAN 13-1CRCV1"
@@ -54,31 +54,31 @@ auth_or_remarks: "Per AFMAN 13-1CRCV1"
54
54
  <!-- Example 3: Positional (live-environment) upgrade / certification -->
55
55
  ---
56
56
  CARD: experience
57
- date: "20 Jun 25"
57
+ date: 2025-06-20
58
58
  action: "Certified Mission Ready — positional upgrade"
59
59
  written_grade: ""
60
60
  written_grade_date: ""
61
61
  positional_grade: "4"
62
- positional_grade_date: "20 Jun 25"
62
+ positional_grade_date: 2025-06-20
63
63
  auth_or_remarks: "SSgt Jones, T.R."
64
64
  ---
65
65
 
66
66
  <!-- Example 4: Combined written + positional upgrade (both columns filled) -->
67
67
  ---
68
68
  CARD: experience
69
- date: "1 Aug 25"
69
+ date: 2025-08-01
70
70
  action: "Upgrade evaluation — written and positional"
71
71
  written_grade: "4"
72
- written_grade_date: "1 Aug 25"
72
+ written_grade_date: 2025-08-01
73
73
  positional_grade: "4"
74
- positional_grade_date: "1 Aug 25"
74
+ positional_grade_date: 2025-08-01
75
75
  auth_or_remarks: "Verified by unit commander"
76
76
  ---
77
77
 
78
78
  <!-- Example 5: PCS departure — no grade columns needed -->
79
79
  ---
80
80
  CARD: experience
81
- date: "1 Sep 25"
81
+ date: 2025-09-01
82
82
  action: "PCS to 726 ACS/MOC, Tinker AFB OK"
83
83
  written_grade: ""
84
84
  written_grade_date: ""
@@ -3,6 +3,16 @@
3
3
 
4
4
  #set text(font: ("NimbusRomNo9L", "Times New Roman", "serif"))
5
5
 
6
+ // `type: date` fields arrive as Typst `datetime`; PDF overlay expects strings.
7
+ #let form-cell(v) = {
8
+ if v == none { "" }
9
+ else if type(v) == datetime {
10
+ v.display("[month padding:none]/[day padding:none]/[year]")
11
+ } else {
12
+ str(v)
13
+ }
14
+ }
15
+
6
16
  // Column order within each 7-field row group
7
17
  #let col-keys = (
8
18
  "date",
@@ -33,7 +43,7 @@
33
43
  if card.CARD == "experience" {
34
44
  if row < max-rows {
35
45
  for (col, key) in col-keys.enumerate() {
36
- let value = card.at(key, default: "")
46
+ let value = form-cell(card.at(key, default: none))
37
47
  if value != "" {
38
48
  let field-name = if row < 16 {
39
49
  // Page 1: fields start at index 4, stride 7
@@ -38,17 +38,17 @@ cards:
38
38
  title: Section Title
39
39
  type: string
40
40
  default: Experience
41
- headingLeft:
41
+ heading_left:
42
42
  title: Heading Left (e.g., Company/School)
43
43
  type: string
44
44
  required: true
45
- headingRight:
45
+ heading_right:
46
46
  title: Heading Right (e.g., Location)
47
47
  type: string
48
- subheadingLeft:
48
+ subheading_left:
49
49
  title: Subheading Left (e.g., Title/Degree)
50
50
  type: string
51
- subheadingRight:
51
+ subheading_right:
52
52
  title: Subheading Right (e.g., Date)
53
53
  type: string
54
54
 
@@ -36,10 +36,10 @@ cells:
36
36
  ---
37
37
  CARD: experience_section
38
38
  title: Work Experience
39
- headingLeft: Templar Archives Research Division
40
- headingRight: August 2024 – Present
41
- subheadingLeft: Psionic Research Analyst
42
- subheadingRight: Aiur
39
+ heading_left: Templar Archives Research Division
40
+ heading_right: August 2024 – Present
41
+ subheading_left: Psionic Research Analyst
42
+ subheading_right: Aiur
43
43
  ---
44
44
 
45
45
  - Analyzed Khala disruption patterns following Amon's corruption, developing countermeasures to protect remaining neural link infrastructure.
@@ -47,10 +47,10 @@ subheadingRight: Aiur
47
47
 
48
48
  ---
49
49
  CARD: experience_section
50
- headingLeft: Terran Dominion Ghost Academy
51
- headingRight: May 2025 – July 2025
52
- subheadingLeft: Covert Ops Trainee
53
- subheadingRight: Tarsonis (Remote)
50
+ heading_left: Terran Dominion Ghost Academy
51
+ heading_right: May 2025 – July 2025
52
+ subheading_left: Covert Ops Trainee
53
+ subheading_right: Tarsonis (Remote)
54
54
  ---
55
55
 
56
56
  - Developed tactical HUD displays for Ghost operatives integrating real-time Zerg hive cluster intelligence.
@@ -59,10 +59,10 @@ subheadingRight: Tarsonis (Remote)
59
59
 
60
60
  ---
61
61
  CARD: experience_section
62
- headingLeft: Abathur's Evolution Pit
63
- headingRight: June 2023 – July 2023
64
- subheadingLeft: Biomass Research Intern
65
- subheadingRight: Char
62
+ heading_left: Abathur's Evolution Pit
63
+ heading_right: June 2023 – July 2023
64
+ subheading_left: Biomass Research Intern
65
+ subheading_right: Char
66
66
  ---
67
67
 
68
68
  - Developed tracking algorithms for Overlord surveillance networks; supported pattern-of-life analysis for Terran outpost elimination.
@@ -70,10 +70,10 @@ subheadingRight: Char
70
70
 
71
71
  ---
72
72
  CARD: experience_section
73
- headingLeft: Raynor's Raiders
74
- headingRight: January 2018 – June 2020
75
- subheadingLeft: Combat Engineer
76
- subheadingRight: Mar Sara
73
+ heading_left: Raynor's Raiders
74
+ heading_right: January 2018 – June 2020
75
+ subheading_left: Combat Engineer
76
+ subheading_right: Mar Sara
77
77
  ---
78
78
 
79
79
  - Administered Hyperion shipboard systems, SCV maintenance protocols, and bunker defense automation for 30,000+ colonists.
@@ -84,18 +84,18 @@ subheadingRight: Mar Sara
84
84
  ---
85
85
  CARD: experience_section
86
86
  title: Education
87
- headingLeft: Carnegie Mellon University
88
- headingRight: December 2025
89
- subheadingLeft: Master of Information Technology Strategy
90
- subheadingRight: Pittsburgh, PA
87
+ heading_left: Carnegie Mellon University
88
+ heading_right: December 2025
89
+ subheading_left: Master of Information Technology Strategy
90
+ subheading_right: Pittsburgh, PA
91
91
  ---
92
92
 
93
93
  ---
94
94
  CARD: experience_section
95
- headingLeft: United States Air Force Academy
96
- headingRight: May 2024
97
- subheadingLeft: BS, Data Science
98
- subheadingRight: Colorado Springs, CO
95
+ heading_left: United States Air Force Academy
96
+ heading_right: May 2024
97
+ subheading_left: BS, Data Science
98
+ subheading_right: Colorado Springs, CO
99
99
  ---
100
100
 
101
101
  - Distinguished Graduate (top 10%); Chinese language minor (L2+/R1 on DLPT).
@@ -104,24 +104,24 @@ subheadingRight: Colorado Springs, CO
104
104
 
105
105
  ---
106
106
  CARD: experience_section
107
- headingLeft: Western Governors University
108
- headingRight: April 2022
109
- subheadingLeft: BS, Cybersecurity and Information Assurance
110
- subheadingRight: Remote
107
+ heading_left: Western Governors University
108
+ heading_right: April 2022
109
+ subheading_left: BS, Cybersecurity and Information Assurance
110
+ subheading_right: Remote
111
111
  ---
112
112
 
113
113
  ---
114
114
  CARD: experience_section
115
- headingLeft: Community College of the Air Force
116
- headingRight: February 2019
117
- subheadingLeft: AS, Information Systems Technology
118
- subheadingRight: Remote
115
+ heading_left: Community College of the Air Force
116
+ heading_right: February 2019
117
+ subheading_left: AS, Information Systems Technology
118
+ subheading_right: Remote
119
119
  ---
120
120
 
121
121
  ---
122
122
  CARD: experience_section
123
123
  title: Cyber Competition
124
- headingLeft: 1st in SANS Academy Cup 2024
124
+ heading_left: 1st in SANS Academy Cup 2024
125
125
  ---
126
126
 
127
127
  - Competed as the Delogrand Web Exploit SME, solving SQLi, API, and HTTP packet crafting problems.
@@ -129,7 +129,7 @@ headingLeft: 1st in SANS Academy Cup 2024
129
129
 
130
130
  ---
131
131
  CARD: experience_section
132
- headingLeft: 1st in NCX 2023
132
+ heading_left: 1st in NCX 2023
133
133
  ---
134
134
 
135
135
  - Developed strategies, defensive scripts, and exploits for the Cyber Combat event.
@@ -137,7 +137,7 @@ headingLeft: 1st in NCX 2023
137
137
 
138
138
  ---
139
139
  CARD: experience_section
140
- headingLeft: 1st in SANS Academy Cup 2023
140
+ heading_left: 1st in SANS Academy Cup 2023
141
141
  ---
142
142
 
143
143
  - Competed as the Delogrand Web Exploit SME, solving XSS, XXE, SQLi, and HTTP crafting problems.
@@ -145,14 +145,14 @@ headingLeft: 1st in SANS Academy Cup 2023
145
145
 
146
146
  ---
147
147
  CARD: experience_section
148
- headingLeft: 1st in RMCS 2023
148
+ heading_left: 1st in RMCS 2023
149
149
  ---
150
150
 
151
151
  - Competed as the Delogrand Web Exploit SME, solving obfuscated JS, Wasm, XSS, and SQLi problems.
152
152
 
153
153
  ---
154
154
  CARD: experience_section
155
- headingLeft: 1st in NCX 2022
155
+ heading_left: 1st in NCX 2022
156
156
  ---
157
157
 
158
158
  - Trained and strategized teams for the Cyber Combat event.
@@ -1,4 +1,4 @@
1
- #import "@local/quillmark-helper:0.1.0": data, parse-date
1
+ #import "@local/quillmark-helper:0.1.0": data
2
2
  #import "@local/ttq-classic-resume:0.1.0": *
3
3
 
4
4
  #show: resume
@@ -15,10 +15,10 @@
15
15
 
16
16
  if card.CARD == "experience_section" {
17
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),
18
+ heading-left: card.at("heading_left", default: ""),
19
+ heading-right: card.at("heading_right", default: ""),
20
+ subheading-left: card.at("subheading_left", default: none),
21
+ subheading-right: card.at("subheading_right", default: none),
22
22
  body: card.at("BODY", default: none),
23
23
  )
24
24
  } else if card.CARD == "skills_section" {
@@ -1,4 +1,4 @@
1
- #import "@local/quillmark-helper:0.1.0": data, parse-date
1
+ #import "@local/quillmark-helper:0.1.0": data
2
2
  #import "@local/tonguetoquill-cmu-letter:0.1.0": backmatter, frontmatter, mainmatter
3
3
 
4
4
  #show: frontmatter.with(
@@ -6,7 +6,11 @@
6
6
  department: data.department,
7
7
  address: data.address,
8
8
  url: data.url,
9
- date: if "date" in data { parse-date(data.date) } else { datetime.today() },
9
+ date: if "date" in data and data.date != none {
10
+ data.date
11
+ } else {
12
+ datetime.today()
13
+ },
10
14
  recipient: data.recipient,
11
15
  )
12
16
 
@@ -1,5 +1,12 @@
1
1
  #import "@local/quillmark-helper:0.1.0": data
2
2
 
3
+ // `type: date` fields arrive as Typst `datetime`; overlay text must be plain strings.
4
+ #let show-date(v) = {
5
+ if v == none { "" }
6
+ else if type(v) == datetime { v.display("[month padding:none]/[day padding:none]/[year]") }
7
+ else { str(v) }
8
+ }
9
+
3
10
  #set page(width: 8.5in, height: 11in, margin: 0in)
4
11
  #set text(font: "Arimo", size: 10pt)
5
12
 
@@ -19,7 +26,7 @@
19
26
  #check(411pt, 67pt, mode == "other")
20
27
 
21
28
  // Fields
22
- #tf(40pt, 100pt)[#data.at("departure_date", default: "")]
29
+ #tf(40pt, 100pt)[#show-date(data.at("departure_date", default: none))]
23
30
  #tf(123pt, 100pt)[#data.at("final_destination", default: "")]
24
31
 
25
32
  // Itinerary Rows (via CARDS)
@@ -31,7 +38,7 @@
31
38
  for card in data.CARDS {
32
39
  if card.CARD == "itinerary" and row < 10 {
33
40
  let dy = dy-start + (row * dy-step)
34
- tf(80pt, dy)[#card.at("date", default: "")]
41
+ tf(80pt, dy)[#show-date(card.at("date", default: none))]
35
42
  tf(135pt, dy)[#card.at("departure_point", default: "")]
36
43
  tf(295pt, dy)[#card.at("arrival_point", default: "")]
37
44
  tf(450pt, dy)[#card.at("rest_length", default: "")]
@@ -56,7 +63,7 @@
56
63
 
57
64
  // Acknowledgements
58
65
  #tf(40pt, 620pt)[#data.at("organization", default: "")]
59
- #tf(500pt, 620pt)[#data.at("briefed_date", default: "")]
66
+ #tf(500pt, 620pt)[#show-date(data.at("briefed_date", default: none))]
60
67
 
61
68
  #tf(40pt, 650pt)[#data.at("briefee_name", default: "")]
62
69
  #tf(270pt, 650pt)[#data.at("briefee_grade", default: "")]
@@ -80,8 +80,7 @@ main:
80
80
 
81
81
  date:
82
82
  title: Date of memo (YYYY-MM-DD); defaults to today
83
- type: string
84
- default: ""
83
+ type: date
85
84
  ui:
86
85
  group: Additional
87
86
  description: YYYY-MM-DD. Leave blank to use today's date.
@@ -204,7 +203,7 @@ cards:
204
203
  description: List of office symbols to receive copies of this endorsement.
205
204
  date:
206
205
  title: Date of endorsement (YYYY-MM-DD)
207
- type: string
206
+ type: date
208
207
  ui:
209
208
  group: Additional
210
209
  description: Date of the endorsement. Leave blank to omit.
@@ -1,4 +1,4 @@
1
- #import "@local/quillmark-helper:0.1.0": data, parse-date
1
+ #import "@local/quillmark-helper:0.1.0": data
2
2
  #import "@local/tonguetoquill-usaf-memo:1.0.0": backmatter, frontmatter, indorsement, mainmatter
3
3
 
4
4
  // Frontmatter configuration
@@ -9,7 +9,7 @@
9
9
  letterhead_seal: image("assets/dow_seal.jpg"),
10
10
 
11
11
  // Date
12
- date: parse-date(data.date),
12
+ date: data.at("date", default: none),
13
13
 
14
14
  // Receiver information
15
15
  memo_for: data.memo_for,
@@ -78,14 +78,6 @@ main:
78
78
  group: Letterhead
79
79
  description: Organizational motto at the bottom of the page.
80
80
 
81
- date:
82
- title: Date of memo (YYYY-MM-DD); defaults to today
83
- type: string
84
- default: ""
85
- ui:
86
- group: Additional
87
- description: YYYY-MM-DD. Leave blank to use today's date.
88
-
89
81
  references:
90
82
  title: References for the memo
91
83
  type: array
@@ -135,8 +127,9 @@ main:
135
127
  - CONFIDENTIAL
136
128
  ui:
137
129
  group: Additional
130
+ compact: true
138
131
  description: Follow AFI 31-401 and applicable DoD guidance for classification markings. Leave blank for unclassified.
139
-
132
+
140
133
  font_size:
141
134
  title: Font size for the memo text (int pt)
142
135
  type: number
@@ -145,8 +138,18 @@ main:
145
138
  - 11
146
139
  ui:
147
140
  group: Additional
141
+ compact: true
148
142
  description: Font size for the memo text (pt).
149
143
 
144
+ date:
145
+ title: Date of memo (YYYY-MM-DD); defaults to today
146
+ type: date
147
+ default: ""
148
+ ui:
149
+ group: Additional
150
+ description: YYYY-MM-DD. Leave blank to use today's date.
151
+
152
+
150
153
  cards:
151
154
  indorsement:
152
155
  title: Routing indorsement
@@ -214,7 +217,7 @@ cards:
214
217
  description: List of office symbols to receive copies of this endorsement.
215
218
  date:
216
219
  title: Date of endorsement (YYYY-MM-DD)
217
- type: string
220
+ type: date
218
221
  ui:
219
222
  group: Additional
220
223
  description: Date of the endorsement. Leave blank to omit.
@@ -1,4 +1,4 @@
1
- #import "@local/quillmark-helper:0.1.0": data, parse-date
1
+ #import "@local/quillmark-helper:0.1.0": data
2
2
  #import "@local/tonguetoquill-usaf-memo:2.0.0": backmatter, frontmatter, indorsement, mainmatter
3
3
 
4
4
  // Frontmatter configuration
@@ -9,7 +9,7 @@
9
9
  letterhead_seal: image("assets/dow_seal.png"),
10
10
 
11
11
  // Date
12
- date: parse-date(data.date),
12
+ date: data.at("date", default: none),
13
13
 
14
14
  // Receiver information
15
15
  memo_for: data.memo_for,
@@ -13,7 +13,7 @@ commanders_auth: ""
13
13
  <!-- Add one CARD: experience block per row. Duplicate as needed. -->
14
14
  ---
15
15
  CARD: experience
16
- date: "1 Jan 25"
16
+ date: 2025-01-01
17
17
  action: "Describe the action or event"
18
18
  written_grade: ""
19
19
  written_grade_date: ""
@@ -27,13 +27,6 @@
27
27
  "file": "rebuttal.md",
28
28
  "production": true
29
29
  },
30
- {
31
- "id": "taro-template",
32
- "name": "Taro Template",
33
- "description": "Official Taro ice cream template",
34
- "file": "taro.md",
35
- "production": false
36
- },
37
30
  {
38
31
  "id": "cmu-letter",
39
32
  "name": "CMU Letter",