@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.
@@ -9,260 +9,230 @@ typst:
9
9
 
10
10
  main:
11
11
  description: Top-level body paragraphs are numbered and nested bullets lettered automatically; do not number them by hand.
12
- ui:
13
- groups: [addressing, letterhead, classification, additional]
14
- fields:
15
- memo_for:
16
- type: array
17
- items:
18
- type: string
19
- ui:
20
- group: addressing
21
- compact: true
22
- description: "Organization/office symbol in UPPERCASE. To address a specific person, add their rank and name in parentheses (e.g., 'ORG/SYMBOL (LT COL JANE DOE)'). For many recipients, enter 'SEE DISTRIBUTION' and list them in the Distribution field."
23
-
24
- memo_from:
25
- type: array
26
- items:
27
- type: string
28
- default: []
29
- ui:
30
- group: addressing
31
- compact: true
32
- description: "If recipients are on the same installation, use only the office symbol. For recipients on other installations, include the full mailing address, one line each, ending 'City ST 12345-6789', to enable return correspondence. Omit entirely to produce a Memorandum for Record (no MEMO FROM line)."
33
-
34
- subject:
35
- type: string
36
- ui:
37
- group: addressing
38
- description: Be brief and clear. Capitalize the first letter of each word except articles, prepositions, and conjunctions. Include suspense dates in parentheses if applicable.
39
-
40
- signature_block:
41
- type: array
42
- items:
43
- type: string
44
- ui:
45
- group: addressing
46
- compact: true
47
- description: "Line 1: Name in UPPERCASE as signed, grade, and service, as in 'FIRST M. LAST, Capt, USAF'. Line 2: Duty title."
48
-
49
- letterhead_title:
50
- type: string
51
- default: DEPARTMENT OF THE AIR FORCE
52
- ui:
53
- group: letterhead
54
- description: Change only for Joint Commands or DoW agencies.
55
-
56
- letterhead_caption:
57
- type: array
58
- items:
59
- type: string
60
- ui:
61
- group: letterhead
62
- description: The full organization name of your unit, as in HEADQUARTERS 123D EXAMPLE WING.
63
-
64
- letterhead_seal:
65
- type: enum
66
- values:
67
- - dow
68
- - dod
69
- default: dow
70
- ui:
71
- group: letterhead
72
- compact: true
73
- description: Department of War (DoW) or Department of Defense (DoD) seal shown in the letterhead.
74
-
75
- letterhead_seal_subtitle:
76
- type: string
77
- default: ""
78
- ui:
79
- group: letterhead
80
- compact: true
81
- description: Bold-caps line below the seal; blank to omit.
82
-
83
- tag_line:
84
- type: richtext
85
- inline: true
86
- default: ""
87
- ui:
88
- group: letterhead
89
- compact: true
90
- description: "Organizational motto at the bottom of the page. Supports Markdown emphasis (e.g. *italics*, **bold**)."
91
-
12
+ sections:
13
+ addressing:
14
+ fields:
15
+ memo_for:
16
+ type: array
17
+ items:
18
+ type: string
19
+ ui:
20
+ compact: true
21
+ description: "Organization/office symbol in UPPERCASE. To address a specific person, add their rank and name in parentheses (e.g., 'ORG/SYMBOL (LT COL JANE DOE)'). For many recipients, enter 'SEE DISTRIBUTION' and list them in the Distribution field."
22
+
23
+ memo_from:
24
+ type: array
25
+ items:
26
+ type: string
27
+ default: []
28
+ ui:
29
+ compact: true
30
+ description: "If recipients are on the same installation, use only the office symbol. For recipients on other installations, include the full mailing address, one line each, ending 'City ST 12345-6789', to enable return correspondence. Omit entirely to produce a Memorandum for Record (no MEMO FROM line)."
31
+
32
+ subject:
33
+ type: string
34
+ description: Be brief and clear. Capitalize the first letter of each word except articles, prepositions, and conjunctions. Include suspense dates in parentheses if applicable.
35
+
36
+ signature_block:
37
+ type: array
38
+ items:
39
+ type: string
40
+ ui:
41
+ compact: true
42
+ description: "Line 1: Name in UPPERCASE as signed, grade, and service, as in 'FIRST M. LAST, Capt, USAF'. Line 2: Duty title."
43
+ letterhead:
44
+ fields:
45
+ letterhead_title:
46
+ type: string
47
+ default: DEPARTMENT OF THE AIR FORCE
48
+ description: Change only for Joint Commands or DoW agencies.
49
+
50
+ letterhead_caption:
51
+ type: array
52
+ items:
53
+ type: string
54
+ description: The full organization name of your unit, as in HEADQUARTERS 123D EXAMPLE WING.
55
+
56
+ letterhead_seal:
57
+ type: enum
58
+ values:
59
+ - dow
60
+ - dod
61
+ default: dow
62
+ ui:
63
+ compact: true
64
+ description: Department of War (DoW) or Department of Defense (DoD) seal shown in the letterhead.
65
+
66
+ letterhead_seal_subtitle:
67
+ type: string
68
+ default: ""
69
+ ui:
70
+ compact: true
71
+ description: Bold-caps line below the seal; blank to omit.
72
+
73
+ tag_line:
74
+ type: richtext
75
+ inline: true
76
+ default: ""
77
+ ui:
78
+ compact: true
79
+ description: "Organizational motto at the bottom of the page. Supports Markdown emphasis (e.g. *italics*, **bold**)."
92
80
  classification:
93
- type: enum
94
- values:
95
- - UNCLASSIFIED
96
- - CUI
97
- - CONFIDENTIAL
98
- - SECRET
99
- - TOP SECRET
100
- default: ""
101
- ui:
102
- group: classification
103
- compact: true
104
- description: "Select the classification marking shown in the header and footer banner. Unclassified documents typically omit this banner entirely — leave blank unless the document is CUI or classified. Mark per DAFI 16-1404 (DoDM 5200.48 for CUI) and applicable DoD guidance."
105
-
106
- dissemination:
107
- type: string
108
- default: ""
109
- ui:
110
- group: classification
111
- compact: true
112
- description: "Banner dissemination suffix appended after double slash (e.g. 'NF' renders as CUI//NF in the header/footer). Leave blank for no suffix."
113
-
114
- cui_controlled_by:
115
- type: string
116
- default: ""
117
- ui:
118
- group: classification
119
- compact: true
120
- description: "Office or organization that designated this information as CUI (e.g., 'SAF/AA'). Required by DoDM 5200.48 when classification is CUI."
121
-
122
- cui_category:
123
- type: string
124
- default: ""
125
- ui:
126
- group: classification
127
- compact: true
128
- description: "CUI category from the DoD CUI Registry (e.g., 'Privacy/MED', 'CTI', 'PRVCY'). Leave blank to omit."
129
-
130
- cui_limited_dissemination:
131
- type: string
132
- default: ""
133
- ui:
134
- group: classification
135
- compact: true
136
- description: "Limited dissemination control shown in the indicator block (e.g., 'FEDONLY', 'NOFORN'). Independent from the banner suffix above."
137
-
138
- cui_poc:
139
- type: string
140
- default: ""
141
- ui:
142
- group: classification
143
- compact: true
144
- description: "Point of contact for CUI questions (e.g., 'Capt J. Smith, DSN 555-1234, john.smith@us.af.mil'). Required by DoDM 5200.48 when classification is CUI."
145
-
146
- references:
147
- type: array
148
- items:
149
- type: richtext
150
- inline: true
151
- default: []
152
- ui:
153
- group: additional
154
- description: "References, auto-lettered (a), (b), (c) per AFH 33-337. Cite each by organization, type, date, and title; italicize publication titles with *asterisks* (standard Markdown emphasis)."
155
-
156
- cc:
157
- type: array
158
- items:
159
- type: string
160
- default: []
161
- ui:
162
- group: additional
163
- description: List office symbols of recipients to receive copies; for a person, 'Rank and Name, ORG/SYMBOL'.
164
-
165
- distribution:
166
- type: array
167
- items:
168
- type: string
169
- default: []
170
- ui:
171
- group: additional
172
- description: Complete list of recipients if 'SEE DISTRIBUTION' is used in the 'Memo For' field.
81
+ fields:
82
+ classification:
83
+ type: enum
84
+ values:
85
+ - UNCLASSIFIED
86
+ - CUI
87
+ - CONFIDENTIAL
88
+ - SECRET
89
+ - TOP SECRET
90
+ default: ""
91
+ ui:
92
+ compact: true
93
+ description: "Select the classification marking shown in the header and footer banner. Unclassified documents typically omit this banner entirely — leave blank unless the document is CUI or classified. Mark per DAFI 16-1404 (DoDM 5200.48 for CUI) and applicable DoD guidance."
94
+
95
+ dissemination:
96
+ type: string
97
+ default: ""
98
+ ui:
99
+ compact: true
100
+ description: "Banner dissemination suffix appended after double slash (e.g. 'NF' renders as CUI//NF in the header/footer). Leave blank for no suffix."
173
101
 
174
- attachments:
175
- type: array
176
- items:
177
- type: string
178
- default: []
179
- ui:
180
- group: additional
181
- description: List attachments in the order they are mentioned in the memo. Briefly describe each and give its date; do not use 'as stated' or abbreviations.
102
+ cui_controlled_by:
103
+ type: string
104
+ default: ""
105
+ ui:
106
+ compact: true
107
+ description: "Office or organization that designated this information as CUI (e.g., 'SAF/AA'). Required by DoDM 5200.48 when classification is CUI."
182
108
 
183
- memo_style:
184
- type: enum
185
- values:
186
- - usaf
187
- - daf
188
- default: usaf
189
- ui:
190
- group: additional
191
- compact: true
192
- description: "USAF memorandum or DAF headquarters memorandum; DAF changes date format and body paragraph layout per AFH 33-337."
109
+ cui_category:
110
+ type: string
111
+ default: ""
112
+ ui:
113
+ compact: true
114
+ description: "CUI category from the DoD CUI Registry (e.g., 'Privacy/MED', 'CTI', 'PRVCY'). Leave blank to omit."
193
115
 
194
- font_size:
195
- type: number
196
- default: 12
197
- ui:
198
- group: additional
199
- compact: true
200
- description: Body text size in points; decimals allowed (e.g. 11.5).
116
+ cui_limited_dissemination:
117
+ type: string
118
+ default: ""
119
+ ui:
120
+ compact: true
121
+ description: "Limited dissemination control shown in the indicator block (e.g., 'FEDONLY', 'NOFORN'). Independent from the banner suffix above."
201
122
 
202
- date:
203
- type: date
204
- default: ""
205
- ui:
206
- group: additional
207
- compact: true
208
- description: YYYY-MM-DD. Leave blank to use today's date.
123
+ cui_poc:
124
+ type: string
125
+ default: ""
126
+ ui:
127
+ compact: true
128
+ description: "Point of contact for CUI questions (e.g., 'Capt J. Smith, DSN 555-1234, john.smith@us.af.mil'). Required by DoDM 5200.48 when classification is CUI."
129
+ additional:
130
+ fields:
131
+ references:
132
+ type: array
133
+ items:
134
+ type: richtext
135
+ inline: true
136
+ default: []
137
+ description: "References, auto-lettered (a), (b), (c) per AFH 33-337. Cite each by organization, type, date, and title; italicize publication titles with *asterisks* (standard Markdown emphasis)."
138
+
139
+ cc:
140
+ type: array
141
+ items:
142
+ type: string
143
+ default: []
144
+ description: List office symbols of recipients to receive copies; for a person, 'Rank and Name, ORG/SYMBOL'.
145
+
146
+ distribution:
147
+ type: array
148
+ items:
149
+ type: string
150
+ default: []
151
+ description: Complete list of recipients if 'SEE DISTRIBUTION' is used in the 'Memo For' field.
152
+
153
+ attachments:
154
+ type: array
155
+ items:
156
+ type: string
157
+ default: []
158
+ description: List attachments in the order they are mentioned in the memo. Briefly describe each and give its date; do not use 'as stated' or abbreviations.
159
+
160
+ memo_style:
161
+ type: enum
162
+ values:
163
+ - usaf
164
+ - daf
165
+ default: usaf
166
+ ui:
167
+ compact: true
168
+ description: "USAF memorandum or DAF headquarters memorandum; DAF changes date format and body paragraph layout per AFH 33-337."
169
+
170
+ font_size:
171
+ type: number
172
+ default: 12
173
+ ui:
174
+ compact: true
175
+ description: Body text size in points; decimals allowed (e.g. 11.5).
176
+
177
+ date:
178
+ type: date
179
+ default: ""
180
+ ui:
181
+ compact: true
182
+ description: YYYY-MM-DD. Leave blank to use today's date.
209
183
 
210
184
  card_kinds:
211
185
  indorsement:
212
186
  title: Routing indorsement
213
187
  description: Chain of routing endorsements. Each endorsement block adds an official response or forwarding action to the original memo.
214
- ui:
215
- groups: [addressing, additional]
216
- fields:
217
- from:
218
- type: string
219
- ui:
220
- group: addressing
221
- compact: true
222
- description: Office symbol or Rank Name of the endorsing official.
223
- for:
224
- type: string
225
- ui:
226
- group: addressing
227
- compact: true
228
- description: Office symbol or organization receiving the endorsed memo.
229
- signature_block:
230
- type: array
231
- items:
232
- type: string
233
- ui:
234
- group: addressing
235
- compact: true
236
- description: "Line 1: Name in UPPERCASE as signed, grade, and service, as in 'FIRST M. LAST, Capt, USAF'. Line 2: Duty title."
237
- format:
238
- type: enum
239
- values:
240
- - standard
241
- - informal
242
- - separate_page
243
- default: standard
244
- ui:
245
- group: additional
246
- compact: true
247
- description: "'standard' (formal, same page), 'informal' (less formal routing), or 'separate_page' (begins on a new page)."
248
- action:
249
- type: enum
250
- values:
251
- - undecided
252
- - approve
253
- - disapprove
254
- - undecided_concur
255
- - concur
256
- - nonconcur
257
- default: ""
258
- ui:
259
- group: additional
260
- compact: true
261
- description: "Decision taken by the endorser, shown as an either/or line with the choice circled. Leave blank to hide the line entirely. Approval authority: 'approve' or 'disapprove' (use 'undecided' to print Approve/Disapprove for the endorser to circle by hand). Coordinating official: 'concur' or 'nonconcur' (use 'undecided_concur' to print Concur/Nonconcur unmarked)."
262
- date:
263
- type: date
264
- default: ""
265
- ui:
266
- group: additional
267
- compact: true
268
- description: "YYYY-MM-DD. Date the endorser signs/forwards the memo (per AFH 33-337 Ch. 14, this is distinct from the originating memo's date). Leave blank to render a fill-in line for the endorser to date by hand when signing."
188
+ sections:
189
+ addressing:
190
+ fields:
191
+ from:
192
+ type: string
193
+ ui:
194
+ compact: true
195
+ description: Office symbol or Rank Name of the endorsing official.
196
+ for:
197
+ type: string
198
+ ui:
199
+ compact: true
200
+ description: Office symbol or organization receiving the endorsed memo.
201
+ signature_block:
202
+ type: array
203
+ items:
204
+ type: string
205
+ ui:
206
+ compact: true
207
+ description: "Line 1: Name in UPPERCASE as signed, grade, and service, as in 'FIRST M. LAST, Capt, USAF'. Line 2: Duty title."
208
+ additional:
209
+ fields:
210
+ format:
211
+ type: enum
212
+ values:
213
+ - standard
214
+ - informal
215
+ - separate_page
216
+ default: standard
217
+ ui:
218
+ compact: true
219
+ description: "'standard' (formal, same page), 'informal' (less formal routing), or 'separate_page' (begins on a new page)."
220
+ action:
221
+ type: enum
222
+ values:
223
+ - undecided
224
+ - approve
225
+ - disapprove
226
+ - undecided_concur
227
+ - concur
228
+ - nonconcur
229
+ default: ""
230
+ ui:
231
+ compact: true
232
+ description: "Decision taken by the endorser, shown as an either/or line with the choice circled. Leave blank to hide the line entirely. Approval authority: 'approve' or 'disapprove' (use 'undecided' to print Approve/Disapprove for the endorser to circle by hand). Coordinating official: 'concur' or 'nonconcur' (use 'undecided_concur' to print Concur/Nonconcur unmarked)."
233
+ date:
234
+ type: date
235
+ default: ""
236
+ ui:
237
+ compact: true
238
+ description: "YYYY-MM-DD. Date the endorser signs/forwards the memo (per AFH 33-337 Ch. 14, this is distinct from the originating memo's date). Leave blank to render a fill-in line for the endorser to date by hand when signing."
@@ -1,17 +1,17 @@
1
- #import "@local/quillmark-helper:0.1.0": data, signature-field
1
+ #import "@local/quillmark-helper:0.2.0" as qm
2
2
  #import "@local/tonguetoquill-usaf-memo:3.0.0": backmatter, frontmatter, indorsement, mainmatter
3
3
 
4
4
  // Frontmatter configuration
5
5
  #show: frontmatter.with(
6
6
  // Letterhead configuration
7
- letterhead_title: data.letterhead_title,
8
- letterhead_caption: data.letterhead_caption,
9
- letterhead_seal_subtitle: data.letterhead_seal_subtitle,
7
+ letterhead_title: qm.data.letterhead_title,
8
+ letterhead_caption: qm.data.letterhead_caption,
9
+ letterhead_seal_subtitle: qm.data.letterhead_seal_subtitle,
10
10
  // Enum blank is `""`, not a seal. Omit so the package renders none rather
11
11
  // than treating the blank as DoW.
12
- ..if data.letterhead_seal != "" {
12
+ ..if qm.data.letterhead_seal != "" {
13
13
  (letterhead_seal: image(
14
- if data.letterhead_seal == "dod" {
14
+ if qm.data.letterhead_seal == "dod" {
15
15
  "assets/dod_seal.png"
16
16
  } else {
17
17
  "assets/dow_seal.png"
@@ -20,40 +20,40 @@
20
20
  },
21
21
 
22
22
  // Date
23
- date: data.date,
23
+ date: qm.data.date,
24
24
 
25
25
  // Receiver information
26
- memo_for: data.memo_for,
26
+ memo_for: qm.data.memo_for,
27
27
 
28
28
  // Sender information (omitted for Memorandum for Record)
29
- ..if data.memo_from.len() > 0 { (memo_from: data.memo_from) },
29
+ ..if qm.data.memo_from.len() > 0 { (memo_from: qm.data.memo_from) },
30
30
 
31
31
  // Subject line
32
- subject: data.subject,
32
+ subject: qm.data.subject,
33
33
 
34
34
  // Optional references
35
- ..if data.references.len() > 0 { (references: data.references) },
35
+ ..if qm.data.references.len() > 0 { (references: qm.data.references) },
36
36
 
37
37
  // Optional footer tag line
38
- footer_tag_line: data.tag_line,
38
+ footer_tag_line: qm.data.tag_line,
39
39
 
40
40
  // Optional classification level
41
- ..if data.classification != "" { (classification_level: data.classification) },
41
+ ..if qm.data.classification != "" { (classification_level: qm.data.classification) },
42
42
 
43
- ..if data.dissemination != "" { (dissemination: data.dissemination) },
43
+ ..if qm.data.dissemination != "" { (dissemination: qm.data.dissemination) },
44
44
 
45
45
  // CUI designation indicator block fields (DoDM 5200.48)
46
- ..if data.cui_controlled_by != "" { (cui_controlled_by: data.cui_controlled_by) },
47
- ..if data.cui_category != "" { (cui_category: data.cui_category) },
48
- ..if data.cui_limited_dissemination != "" { (cui_limited_dissemination: data.cui_limited_dissemination) },
49
- ..if data.cui_poc != "" { (cui_poc: data.cui_poc) },
46
+ ..if qm.data.cui_controlled_by != "" { (cui_controlled_by: qm.data.cui_controlled_by) },
47
+ ..if qm.data.cui_category != "" { (cui_category: qm.data.cui_category) },
48
+ ..if qm.data.cui_limited_dissemination != "" { (cui_limited_dissemination: qm.data.cui_limited_dissemination) },
49
+ ..if qm.data.cui_poc != "" { (cui_poc: qm.data.cui_poc) },
50
50
 
51
51
  // USAF vs DAF memorandum style (date format, body indentation). Blank
52
52
  // falls through to the package's `"usaf"` default.
53
- ..if data.memo_style != "" { (memo_style: data.memo_style) },
53
+ ..if qm.data.memo_style != "" { (memo_style: qm.data.memo_style) },
54
54
 
55
55
  // Font size
56
- font_size: data.font_size * 1pt,
56
+ font_size: qm.data.font_size * 1pt,
57
57
 
58
58
  // List recipients in vertical list
59
59
  memo_for_cols: 1,
@@ -64,27 +64,27 @@
64
64
  // auto-numbering), but the rebuilt glyphs keep their spans, which is what
65
65
  // the backend reads regions from.
66
66
  #mainmatter[
67
- #data.at("$body")
67
+ #qm.data.at("$body")
68
68
  ]
69
69
 
70
70
  // Backmatter
71
71
  #backmatter(
72
72
  // Signature block
73
- signature_block: data.signature_block,
74
- signing_field: signature-field("Signature", field: "signature_block"),
73
+ signature_block: qm.data.signature_block,
74
+ signing_field: qm.signature-field("Signature", field: "signature_block"),
75
75
 
76
76
  // Optional cc
77
- ..if data.cc.len() > 0 { (cc: data.cc) },
77
+ ..if qm.data.cc.len() > 0 { (cc: qm.data.cc) },
78
78
 
79
79
  // Optional distribution
80
- ..if data.distribution.len() > 0 { (distribution: data.distribution) },
80
+ ..if qm.data.distribution.len() > 0 { (distribution: qm.data.distribution) },
81
81
 
82
82
  // Optional attachments
83
- ..if data.attachments.len() > 0 { (attachments: data.attachments) },
83
+ ..if qm.data.attachments.len() > 0 { (attachments: qm.data.attachments) },
84
84
  )
85
85
 
86
86
  // Indorsements - iterate through CARDS array and filter by CARD tag
87
- #for (i, card) in data.at("$cards").enumerate() {
87
+ #for (i, card) in qm.data.at("$cards").enumerate() {
88
88
  if card.at("$kind", default: none) == "indorsement" {
89
89
  // The quillmark helper leaves an unset/whitespace-only markdown body as
90
90
  // the empty string `""`; only non-empty bodies are eval'd into content.
@@ -112,7 +112,7 @@
112
112
  from: card.at("from", default: ""),
113
113
  to: card.at("for", default: ""),
114
114
  signature_block: card.signature_block,
115
- signing_field: signature-field(
115
+ signing_field: qm.signature-field(
116
116
  "Ind_" + str(i) + "_Signature",
117
117
  field: card.at("$path") + "signature_block",
118
118
  ),