@airmark/quiver 0.35.7 → 0.35.8

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.
@@ -1,4 +1,4 @@
1
- #import "@local/quillmark-helper:0.1.0": data, ink
1
+ #import "@local/quillmark-helper:0.2.0" as qm
2
2
  #import "@local/ttq-classic-resume:0.1.0": (
3
3
  auto-link, default-config, entry, item-grid, resume, resume-header, section-header,
4
4
  )
@@ -43,9 +43,9 @@
43
43
 
44
44
  #show: resume.with(
45
45
  // An enum's blank is authorable even where the schema declares a default.
46
- paper: if data.paper != "" { data.paper } else { "us-letter" },
47
- size: data.font_size * 1pt,
48
- margin: data.margin * 1in,
46
+ paper: if qm.data.paper != "" { qm.data.paper } else { "us-letter" },
47
+ size: qm.data.font_size * 1pt,
48
+ margin: qm.data.margin * 1in,
49
49
 
50
50
  // The package's stack names two families to fall back to; only the one this
51
51
  // quill bundles is in the render's font book, and naming the absent two
@@ -74,10 +74,10 @@
74
74
  )
75
75
 
76
76
  #resume-header(
77
- name: if data.name.trim() != "" { ink(data).name },
78
- title: data.name.trim(),
79
- author: data.name.trim(),
80
- contacts: data.contacts.zip(ink(data).contacts)
77
+ name: if qm.data.name.trim() != "" { qm.ink(qm.data, "name") },
78
+ title: qm.data.name.trim(),
79
+ author: qm.data.name.trim(),
80
+ contacts: qm.data.contacts.zip(qm.ink(qm.data, "contacts"))
81
81
  .map(((contact, printed)) => linked(contact, printed))
82
82
  .filter(contact => contact != none),
83
83
  )
@@ -103,7 +103,7 @@
103
103
 
104
104
  // The rows an author filled in. A row left wholly blank, as a new one is, would
105
105
  // print as an empty gap.
106
- #let filled(rows) = rows.filter(row => row.values().any(value => {
106
+ #let filled(rows) = rows.filter(row => row.pairs().filter(((key, _)) => not key.starts-with("$")).any(((_, value)) => {
107
107
  or-none(if type(value) == str { value.trim() } else { value }) != none
108
108
  }))
109
109
 
@@ -126,7 +126,7 @@
126
126
  entry(
127
127
  heading: trim-inline(project.name),
128
128
  form: "linked",
129
- url: linked(project.link, ink(project).link),
129
+ url: linked(project.link, qm.ink(project, "link")),
130
130
  body: under-entry(project.details),
131
131
  )
132
132
  },
@@ -139,7 +139,7 @@
139
139
  },
140
140
  )
141
141
 
142
- #for card in data.at("$cards") {
142
+ #for card in qm.data.at("$cards") {
143
143
  let kind = card.at("$kind", default: none)
144
144
  if type(kind) == str and kind in rows {
145
145
  let title = or-none(card.title)
@@ -12,317 +12,288 @@ typst:
12
12
  # vectors branching from it over the years the boards and schools fall in. The
13
13
  # bottom half is the record that makes the plan credible.
14
14
  main:
15
- ui:
16
- # The editor opens one group at a time, starting with the first, so each is a
17
- # task finished without looking at another: who you are, where you are
18
- # going, what you have done. The checklist is apart from the record because
19
- # most visits skip it whole. The timeline's start year sits with the officer
20
- # so every required field is in the group that opens.
21
- groups:
22
- officer: {}
23
- plan: {}
24
- record: {}
25
- qualifications: { title: "Qualifications & experience" }
26
15
  # The chart's one piece of prose. It is set on the ruled notes area at the
27
16
  # foot of the page, and a rater goes on writing below it during the discussion.
28
17
  description: "What you want from this discussion: goals, preferences, assignments you'd turn down, questions for your rater. Put constraints that end in a known year under Constraints instead, so they show on the timeline."
29
- fields:
30
- name:
31
- # Read as `string` rather than `plaintext`: it reaches
32
- # `set document(author:)`, which takes no content.
33
- type: string
34
- ui:
35
- group: officer
36
- description: "Your grade and name, for example 'Capt John A. Snuffy'. It also names the PDF."
18
+ # The editor opens one section at a time, starting with the first, so each is
19
+ # a task finished without looking at another: who you are, where you are
20
+ # going, what you have done. The checklist is apart from the record because
21
+ # most visits skip it whole. The timeline's start year sits with the officer
22
+ # so every required field is in the section that opens.
23
+ sections:
24
+ officer:
25
+ fields:
26
+ name:
27
+ # Read as `string` rather than `plaintext`: it reaches
28
+ # `set document(author:)`, which takes no content.
29
+ type: string
30
+ description: "Your grade and name, for example 'Capt John A. Snuffy'. It also names the PDF."
37
31
 
38
- duty_title:
39
- type: plaintext
40
- inline: true
41
- default: ""
42
- ui:
43
- group: officer
44
- description: "Your current job, for example Instructor or Flight Commander."
32
+ duty_title:
33
+ type: plaintext
34
+ inline: true
35
+ default: ""
36
+ description: "Your current job, for example Instructor or Flight Commander."
45
37
 
46
- unit:
47
- type: plaintext
48
- inline: true
49
- default: ""
50
- ui:
51
- group: officer
52
- description: "Your unit and base, for example '333 TRS, Keesler AFB'."
38
+ unit:
39
+ type: plaintext
40
+ inline: true
41
+ default: ""
42
+ description: "Your unit and base, for example '333 TRS, Keesler AFB'."
53
43
 
54
- afsc:
55
- type: plaintext
56
- inline: true
57
- default: ""
58
- ui:
59
- group: officer
60
- compact: true
61
- description: "Your AFSC with its skill level and any prefix, for example 17S3 or K17D3."
44
+ afsc:
45
+ type: plaintext
46
+ inline: true
47
+ default: ""
48
+ ui:
49
+ compact: true
50
+ description: "Your AFSC with its skill level and any prefix, for example 17S3 or K17D3."
62
51
 
63
- commissioning_yg:
64
- type: integer
65
- ui:
66
- group: officer
67
- compact: true
68
- description: "Your commissioning year group. Every milestone on the timeline is counted from it."
52
+ commissioning_yg:
53
+ type: integer
54
+ ui:
55
+ compact: true
56
+ description: "Your commissioning year group. Every milestone on the timeline is counted from it."
69
57
 
70
- adjusted_yg:
71
- type: integer?
72
- ui:
73
- group: officer
74
- compact: true
75
- description: "Your adjusted year group, if a board or a break in service changed it. Leave blank if it hasn't."
58
+ adjusted_yg:
59
+ type: integer?
60
+ ui:
61
+ compact: true
62
+ description: "Your adjusted year group, if a board or a break in service changed it. Leave blank if it hasn't."
76
63
 
77
- date_of_rank:
78
- type: date
79
- default: ""
80
- ui:
81
- group: officer
82
- compact: true
83
- description: "Date of rank in your current grade."
64
+ date_of_rank:
65
+ type: date
66
+ default: ""
67
+ ui:
68
+ compact: true
69
+ description: "Date of rank in your current grade."
84
70
 
85
- date_arrived_station:
86
- type: date
87
- default: ""
88
- ui:
89
- group: officer
90
- compact: true
91
- description: "When you arrived at your current station."
71
+ date_arrived_station:
72
+ type: date
73
+ default: ""
74
+ ui:
75
+ compact: true
76
+ description: "When you arrived at your current station."
92
77
 
93
- timeline_start_year:
94
- type: integer
95
- ui:
96
- group: officer
97
- compact: true
98
- description: "The first year on the timeline, usually this year."
78
+ timeline_start_year:
79
+ type: integer
80
+ ui:
81
+ compact: true
82
+ description: "The first year on the timeline, usually this year."
99
83
 
100
- advanced_degree:
101
- type: plaintext
102
- inline: true
103
- default: ""
104
- ui:
105
- group: officer
106
- description: "Your advanced degree, for example 'MS Cyber Operations, AFIT'. Add '(in progress)' if you're still working on it."
84
+ advanced_degree:
85
+ type: plaintext
86
+ inline: true
87
+ default: ""
88
+ description: "Your advanced degree, for example 'MS Cyber Operations, AFIT'. Add '(in progress)' if you're still working on it."
89
+ plan:
90
+ fields:
91
+ timeline_years:
92
+ type: integer
93
+ default: 12
94
+ ui:
95
+ compact: true
96
+ description: "How many years the timeline covers, up to 18. Twelve takes a Captain past the Lt Col board; go wider to bring the SDE boards into view."
107
97
 
98
+ move_year:
99
+ type: integer?
100
+ ui:
101
+ compact: true
102
+ description: "The year you expect to leave your current assignment. Every vector starts from this move. To stay longer on one vector, make the extension its first tour."
108
103
 
109
- timeline_years:
110
- type: integer
111
- default: 12
112
- ui:
113
- group: plan
114
- compact: true
115
- description: "How many years the timeline covers, up to 18. Twelve takes a Captain past the Lt Col board; go wider to bring the SDE boards into view."
104
+ move_cycle:
105
+ type: enum
106
+ values: [Summer, Winter]
107
+ default: Summer
108
+ ui:
109
+ compact: true
110
+ description: "The VML cycle you expect to move on."
116
111
 
117
- move_year:
118
- type: integer?
119
- ui:
120
- group: plan
121
- compact: true
122
- description: "The year you expect to leave your current assignment. Every vector starts from this move. To stay longer on one vector, make the extension its first tour."
112
+ constraints:
113
+ type: array
114
+ max: 3
115
+ ui:
116
+ layout: table
117
+ items:
118
+ type: object
119
+ properties:
120
+ note:
121
+ type: plaintext
122
+ inline: true
123
+ title: Constraint
124
+ description: "What limits the plan, kept short, for example 'Join-spouse, no OCONUS'."
125
+ through:
126
+ type: integer
127
+ title: Through
128
+ description: "The last year it applies."
129
+ default: []
130
+ description: "Anything that limits where or when you can move and ends in a known year, like a join-spouse assignment or a degree in progress. Each shows as a bar across the timeline."
123
131
 
124
- move_cycle:
125
- type: enum
126
- values: [Summer, Winter]
127
- default: Summer
128
- ui:
129
- group: plan
130
- compact: true
131
- description: "The VML cycle you expect to move on."
132
+ vectors:
133
+ type: array
134
+ max: 3
135
+ items:
136
+ type: object
137
+ properties:
138
+ track:
139
+ type: plaintext
140
+ inline: true
141
+ default: ""
142
+ description: "What this path is for, for example 'Command track' or 'Joint'."
143
+ tours:
144
+ type: array
145
+ ui:
146
+ layout: table
147
+ items:
148
+ type: object
149
+ properties:
150
+ title:
151
+ type: plaintext
152
+ inline: true
153
+ title: Assignment
154
+ description: "The assignment, for example '333 TRS/DO' or 'Joint Staff J6'. Keep it short: about 12 characters per year fits."
155
+ years:
156
+ type: number
157
+ default: 2
158
+ title: Years
159
+ description: "Length in years, from 0.5 to 4 in half-year steps."
160
+ school:
161
+ type: boolean
162
+ default: false
163
+ description: "Whether this is a school, such as IDE, SDE, or Weapons School, rather than a job."
164
+ description: "The assignments on this path, in order. Each starts when the one before it ends."
165
+ default:
166
+ - { track: "", tours: [] }
167
+ - { track: "", tours: [] }
168
+ - { track: "", tours: [] }
169
+ description: "Up to three career paths after your current assignment: primary, alternate, and backup, in that order."
170
+ record:
171
+ fields:
172
+ stratifications:
173
+ type: array
174
+ max: 3
175
+ ui:
176
+ layout: table
177
+ items:
178
+ type: object
179
+ properties:
180
+ year:
181
+ type: integer
182
+ description: "The reporting year."
183
+ rater:
184
+ type: plaintext
185
+ inline: true
186
+ default: ""
187
+ title: Rater
188
+ description: "Your rater's stratification as written, for example '#1/14 Capts'."
189
+ hlr:
190
+ type: plaintext
191
+ inline: true
192
+ default: ""
193
+ title: Higher Level Reviewer
194
+ description: "Your higher level reviewer's stratification, for example '#1/45 CGOs'. Leave blank if you didn't get one."
195
+ default: []
196
+ description: "Your stratifications from the last three years."
132
197
 
133
- constraints:
134
- type: array
135
- max: 3
136
- ui:
137
- group: plan
138
- layout: table
139
- items:
140
- type: object
141
- properties:
142
- note:
198
+ awards:
199
+ type: array
200
+ items:
143
201
  type: plaintext
144
202
  inline: true
145
- title: Constraint
146
- description: "What limits the plan, kept short, for example 'Join-spouse, no OCONUS'."
147
- through:
148
- type: integer
149
- title: Through
150
- description: "The last year it applies."
151
- default: []
152
- description: "Anything that limits where or when you can move and ends in a known year, like a join-spouse assignment or a degree in progress. Each shows as a bar across the timeline."
203
+ default: []
204
+ description: "Major awards, one per line, strongest first. Wing level and above is worth the space."
153
205
 
154
- vectors:
155
- type: array
156
- max: 3
157
- ui:
158
- group: plan
159
- items:
160
- type: object
161
- properties:
162
- track:
206
+ certifications:
207
+ type: array
208
+ items:
163
209
  type: plaintext
164
210
  inline: true
165
- default: ""
166
- description: "What this path is for, for example 'Command track' or 'Joint'."
167
- tours:
168
- type: array
169
- ui:
170
- layout: table
171
- items:
172
- type: object
173
- properties:
174
- title:
175
- type: plaintext
176
- inline: true
177
- title: Assignment
178
- description: "The assignment, for example '333 TRS/DO' or 'Joint Staff J6'. Keep it short: about 12 characters per year fits."
179
- years:
180
- type: number
181
- default: 2
182
- title: Years
183
- description: "Length in years, from 0.5 to 4 in half-year steps."
184
- school:
185
- type: boolean
186
- default: false
187
- description: "Whether this is a school, such as IDE, SDE, or Weapons School, rather than a job."
188
- description: "The assignments on this path, in order. Each starts when the one before it ends."
189
- default:
190
- - { track: "", tours: [] }
191
- - { track: "", tours: [] }
192
- - { track: "", tours: [] }
193
- description: "Up to three career paths after your current assignment: primary, alternate, and backup, in that order."
211
+ default: []
212
+ description: "Certifications a board would recognize, one per line. Mark PME and the Cyber 200 and 300 courses under Qualifications instead."
194
213
 
195
- stratifications:
196
- type: array
197
- max: 3
198
- ui:
199
- group: record
200
- layout: table
201
- items:
202
- type: object
203
- properties:
204
- year:
205
- type: integer
206
- description: "The reporting year."
207
- rater:
208
- type: plaintext
209
- inline: true
210
- default: ""
211
- title: Rater
212
- description: "Your rater's stratification as written, for example '#1/14 Capts'."
213
- hlr:
214
+ deployments:
215
+ type: array
216
+ items:
214
217
  type: plaintext
215
218
  inline: true
216
- default: ""
217
- title: Higher Level Reviewer
218
- description: "Your higher level reviewer's stratification, for example '#1/45 CGOs'. Leave blank if you didn't get one."
219
- default: []
220
- description: "Your stratifications from the last three years."
221
-
222
- awards:
223
- type: array
224
- items:
225
- type: plaintext
226
- inline: true
227
- default: []
228
- ui:
229
- group: record
230
- description: "Major awards, one per line, strongest first. Wing level and above is worth the space."
231
-
232
- certifications:
233
- type: array
234
- items:
235
- type: plaintext
236
- inline: true
237
- default: []
238
- ui:
239
- group: record
240
- description: "Certifications a board would recognize, one per line. Mark PME and the Cyber 200 and 300 courses under Qualifications instead."
241
-
242
- deployments:
243
- type: array
244
- items:
245
- type: plaintext
246
- inline: true
247
- default: []
248
- ui:
249
- group: record
250
- description: "Deployments and short tours, one per line, with the month you returned."
251
-
252
- # The page prints every member in four rows and marks the held ones, so an
253
- # empty box is as much of the chart as a filled one. A row is a property
254
- # here rather than a heading in the plate, so the partition is in the value
255
- # and the address as well as on the page. The plate repeats each `title` as
256
- # its row's label, since the data carries only the members.
219
+ default: []
220
+ description: "Deployments and short tours, one per line, with the month you returned."
257
221
  qualifications:
258
- type: object
259
- ui:
260
- group: qualifications
261
- layout: flat
262
- description: "Mark what you've done. The page lists every qualification and marks the ones you hold. Marking a course or school also marks its milestone done on the timeline."
263
- properties:
264
- command:
265
- type: matrix
266
- title: Leadership & command
222
+ title: "Qualifications & experience"
223
+ fields:
224
+ # The page prints every member in four rows and marks the held ones, so an
225
+ # empty box is as much of the chart as a filled one. A row is a property
226
+ # here rather than a heading in the plate, so the partition is in the value
227
+ # and the address as well as on the page. The plate repeats each `title` as
228
+ # its row's label, since the data carries only the members.
229
+ qualifications:
230
+ type: object
267
231
  ui:
268
- compact: true
269
- members:
270
- sq_cc_candidate: Sq/CC Candidate
271
- do_det_cc_candidate: DO / Det CC Candidate
272
- flight_cc: Flight CC
273
- director_of_operations: Director of Operations
274
- detachment_cc: Detachment CC
275
- squadron_cc: Squadron CC
276
- properties: &detail
277
- detail:
278
- type: plaintext
279
- inline: true
280
- default: ""
281
- description: "The unit, year, or distinction behind it, for example '23 IOS' or 'DG'. Optional."
282
- operations:
283
- type: matrix
284
- title: Operations
285
- ui:
286
- compact: true
287
- members:
288
- dodin_ops: DODIN Ops
289
- dco: DCO (Defensive)
290
- oco: OCO (Offensive)
291
- crew_cc: Crew CC
292
- cyber_engineer: Cyber Engineer
293
- team_lead: Team Lead (MDT / CPT)
294
- expeditionary_comms: Expeditionary Comms
295
- mission_cc: Mission CC
296
- properties: *detail
297
- staff:
298
- type: matrix
299
- title: Staff & functional
300
- ui:
301
- compact: true
302
- members:
303
- exec_aide_cag: Exec / Aide / CAG
304
- haf_staff: HAF Staff
305
- majcom_naf_staff: MAJCOM / NAF Staff
306
- joint_staff: Joint Staff
307
- instructor: Instructor
308
- jqo: Joint Qualified Officer (JQO)
309
- properties: *detail
310
- # Completion and distinction are one tick and its detail, so SOS held
311
- # with detail DG reads as both. Candidate and graduate are two ticks:
312
- # they are different rungs, and a board reads them differently.
313
- education:
314
- type: matrix
315
- title: Education & PME
316
- ui:
317
- compact: true
318
- members:
319
- commissioning_dg: Commissioning Source DG
320
- sos: SOS
321
- cyber_200: Cyber 200
322
- cyber_300: Cyber 300
323
- ide_candidate: IDE Candidate
324
- ide_graduate: IDE Graduate
325
- sde_candidate: SDE Candidate
326
- sde_graduate: SDE Graduate
327
- weapons_school: Weapons School / WIC DG
328
- properties: *detail
232
+ layout: flat
233
+ description: "Mark what you've done. The page lists every qualification and marks the ones you hold. Marking a course or school also marks its milestone done on the timeline."
234
+ properties:
235
+ command:
236
+ type: matrix
237
+ title: Leadership & command
238
+ ui:
239
+ compact: true
240
+ members:
241
+ sq_cc_candidate: Sq/CC Candidate
242
+ do_det_cc_candidate: DO / Det CC Candidate
243
+ flight_cc: Flight CC
244
+ director_of_operations: Director of Operations
245
+ detachment_cc: Detachment CC
246
+ squadron_cc: Squadron CC
247
+ properties: &detail
248
+ detail:
249
+ type: plaintext
250
+ inline: true
251
+ default: ""
252
+ description: "The unit, year, or distinction behind it, for example '23 IOS' or 'DG'. Optional."
253
+ operations:
254
+ type: matrix
255
+ title: Operations
256
+ ui:
257
+ compact: true
258
+ members:
259
+ dodin_ops: DODIN Ops
260
+ dco: DCO (Defensive)
261
+ oco: OCO (Offensive)
262
+ crew_cc: Crew CC
263
+ cyber_engineer: Cyber Engineer
264
+ team_lead: Team Lead (MDT / CPT)
265
+ expeditionary_comms: Expeditionary Comms
266
+ mission_cc: Mission CC
267
+ properties: *detail
268
+ staff:
269
+ type: matrix
270
+ title: Staff & functional
271
+ ui:
272
+ compact: true
273
+ members:
274
+ exec_aide_cag: Exec / Aide / CAG
275
+ haf_staff: HAF Staff
276
+ majcom_naf_staff: MAJCOM / NAF Staff
277
+ joint_staff: Joint Staff
278
+ instructor: Instructor
279
+ jqo: Joint Qualified Officer (JQO)
280
+ properties: *detail
281
+ # Completion and distinction are one tick and its detail, so SOS held
282
+ # with detail DG reads as both. Candidate and graduate are two ticks:
283
+ # they are different rungs, and a board reads them differently.
284
+ education:
285
+ type: matrix
286
+ title: Education & PME
287
+ ui:
288
+ compact: true
289
+ members:
290
+ commissioning_dg: Commissioning Source DG
291
+ sos: SOS
292
+ cyber_200: Cyber 200
293
+ cyber_300: Cyber 300
294
+ ide_candidate: IDE Candidate
295
+ ide_graduate: IDE Graduate
296
+ sde_candidate: SDE Candidate
297
+ sde_graduate: SDE Graduate
298
+ weapons_school: Weapons School / WIC DG
299
+ properties: *detail