@airmark/quiver 0.26.0 → 0.28.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/README.md +79 -31
- package/package.json +7 -5
- package/quills/af4141/0.1.0/Quill.yaml +21 -11
- package/quills/af4141/0.1.0/packages/typst-af4141/lib.typ +17 -3
- package/quills/af4141/0.1.0/plate.typ +12 -5
- package/quills/daf1206/0.1.0/Quill.yaml +3 -1
- package/quills/daf4392/0.1.0/Quill.yaml +12 -9
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/fonts/GNU General Public License.txt +340 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/fonts/NimbusRomNo9L-Med.otf +0 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/fonts/NimbusRomNo9L-MedIta.otf +0 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/fonts/NimbusRomNo9L-Reg.otf +0 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/fonts/NimbusRomNo9L-RegIta.otf +0 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/lib.typ +21 -4
- package/quills/daf4392/0.1.0/plate.typ +1 -1
- package/quills/usaf_memo/0.2.0/Quill.yaml +47 -42
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/Cinzel[wght].ttf +0 -0
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/indorsement.typ +57 -24
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/utils.typ +33 -4
- package/quills/usaf_memo/0.2.0/plate.typ +19 -14
- package/quills/af4141/0.1.0/assets/Figtree-Bold.ttf +0 -0
- package/quills/af4141/0.1.0/assets/Figtree-Italic.ttf +0 -0
- package/quills/af4141/0.1.0/assets/Figtree-Regular.ttf +0 -0
- package/quills/af4141/0.1.0/design/TASK.md +0 -20
- package/quills/af4141/0.1.0/design/af4141.pdf +0 -0
- package/quills/daf1206/0.1.0/DAFForm_1206_prepared.pdf +0 -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/usaf_memo/0.2.0/.quillignore +0 -31
- package/quills/usaf_memo/0.2.0/assets/Freedom250_USAF.png +0 -0
- package/quills/usaf_memo/0.2.0/assets/Freedom250_USSF.png +0 -0
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/Cinzel-Regular.ttf +0 -0
- /package/quills/af4141/0.1.0/{assets → packages/typst-af4141/fonts}/GNU General Public License.txt +0 -0
- /package/quills/af4141/0.1.0/{assets → packages/typst-af4141/fonts}/NimbusRomNo9L-Med.otf +0 -0
- /package/quills/af4141/0.1.0/{assets → packages/typst-af4141/fonts}/NimbusRomNo9L-MedIta.otf +0 -0
- /package/quills/af4141/0.1.0/{assets → packages/typst-af4141/fonts}/NimbusRomNo9L-Reg.otf +0 -0
- /package/quills/af4141/0.1.0/{assets → packages/typst-af4141/fonts}/NimbusRomNo9L-RegIta.otf +0 -0
|
@@ -2,10 +2,14 @@ quill:
|
|
|
2
2
|
name: usaf_memo
|
|
3
3
|
version: 0.2.0
|
|
4
4
|
backend: typst
|
|
5
|
-
plate_file: plate.typ
|
|
6
5
|
description: U.S. Air Force and Space Force Official Memorandum
|
|
7
6
|
|
|
7
|
+
typst:
|
|
8
|
+
plate_file: plate.typ
|
|
9
|
+
|
|
8
10
|
main:
|
|
11
|
+
ui:
|
|
12
|
+
groups: [addressing, letterhead, classification, additional]
|
|
9
13
|
body:
|
|
10
14
|
example: |
|
|
11
15
|
The first paragraph. Top-level paragraphs are auto-numbered; do not add manual numbering.
|
|
@@ -20,7 +24,8 @@ main:
|
|
|
20
24
|
- ORG1/SYMBOL
|
|
21
25
|
- ORG2/SYMBOL
|
|
22
26
|
ui:
|
|
23
|
-
group:
|
|
27
|
+
group: addressing
|
|
28
|
+
compact: true
|
|
24
29
|
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."
|
|
25
30
|
|
|
26
31
|
memo_from:
|
|
@@ -34,14 +39,15 @@ main:
|
|
|
34
39
|
- 123 Street Ave
|
|
35
40
|
- City ST 12345-6789
|
|
36
41
|
ui:
|
|
37
|
-
group:
|
|
42
|
+
group: addressing
|
|
43
|
+
compact: true
|
|
38
44
|
description: "If recipients are on the same installation, use only the office symbol. For recipients on other installations, include the full mailing address to enable return correspondence. Omit entirely to produce a Memorandum for Record (no MEMO FROM line)."
|
|
39
45
|
|
|
40
46
|
subject:
|
|
41
47
|
type: string
|
|
42
48
|
example: Subject of the Memorandum
|
|
43
49
|
ui:
|
|
44
|
-
group:
|
|
50
|
+
group: addressing
|
|
45
51
|
description: Be brief and clear. Capitalize the first letter of each word except articles, prepositions, and conjunctions. Include suspense dates in parentheses if applicable.
|
|
46
52
|
|
|
47
53
|
signature_block:
|
|
@@ -52,14 +58,15 @@ main:
|
|
|
52
58
|
- "FIRST M. LAST, Rank, USAF"
|
|
53
59
|
- Duty Title
|
|
54
60
|
ui:
|
|
55
|
-
group:
|
|
61
|
+
group: addressing
|
|
62
|
+
compact: true
|
|
56
63
|
description: "Line 1: Name in UPPERCASE as signed, grade, and service. Line 2: Duty title."
|
|
57
64
|
|
|
58
65
|
letterhead_title:
|
|
59
66
|
type: string
|
|
60
67
|
default: DEPARTMENT OF THE AIR FORCE
|
|
61
68
|
ui:
|
|
62
|
-
group:
|
|
69
|
+
group: letterhead
|
|
63
70
|
description: Change only for Joint Commands or DoW agencies.
|
|
64
71
|
|
|
65
72
|
letterhead_caption:
|
|
@@ -69,7 +76,7 @@ main:
|
|
|
69
76
|
example:
|
|
70
77
|
- HEADQUARTERS [UNIT NAME]
|
|
71
78
|
ui:
|
|
72
|
-
group:
|
|
79
|
+
group: letterhead
|
|
73
80
|
description: The full organization name of your unit.
|
|
74
81
|
|
|
75
82
|
letterhead_seal:
|
|
@@ -79,7 +86,7 @@ main:
|
|
|
79
86
|
- dod
|
|
80
87
|
default: dow
|
|
81
88
|
ui:
|
|
82
|
-
group:
|
|
89
|
+
group: letterhead
|
|
83
90
|
compact: true
|
|
84
91
|
description: Department of War (DoW) or Department of Defense (DoD) seal shown in the letterhead.
|
|
85
92
|
|
|
@@ -87,26 +94,19 @@ main:
|
|
|
87
94
|
type: string
|
|
88
95
|
default: ""
|
|
89
96
|
ui:
|
|
90
|
-
group:
|
|
97
|
+
group: letterhead
|
|
91
98
|
compact: true
|
|
92
99
|
description: Bold-caps line below the seal; blank to omit.
|
|
93
100
|
|
|
94
101
|
tag_line:
|
|
95
|
-
type:
|
|
102
|
+
type: richtext
|
|
103
|
+
inline: true
|
|
96
104
|
default: ""
|
|
97
105
|
ui:
|
|
98
|
-
group:
|
|
106
|
+
group: letterhead
|
|
99
107
|
compact: true
|
|
100
108
|
description: "Organizational motto at the bottom of the page. Supports Markdown emphasis (e.g. *italics*, **bold**)."
|
|
101
109
|
|
|
102
|
-
freedom250:
|
|
103
|
-
type: boolean
|
|
104
|
-
default: false
|
|
105
|
-
ui:
|
|
106
|
-
group: Letterhead
|
|
107
|
-
compact: true
|
|
108
|
-
description: Show the America 250 / Freedom 250 commemorative emblem in the letterhead, mirrored opposite the seal.
|
|
109
|
-
|
|
110
110
|
classification:
|
|
111
111
|
type: string
|
|
112
112
|
enum:
|
|
@@ -118,7 +118,7 @@ main:
|
|
|
118
118
|
- TOP SECRET
|
|
119
119
|
default: ""
|
|
120
120
|
ui:
|
|
121
|
-
group:
|
|
121
|
+
group: classification
|
|
122
122
|
compact: true
|
|
123
123
|
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."
|
|
124
124
|
|
|
@@ -126,7 +126,7 @@ main:
|
|
|
126
126
|
type: string
|
|
127
127
|
default: ""
|
|
128
128
|
ui:
|
|
129
|
-
group:
|
|
129
|
+
group: classification
|
|
130
130
|
compact: true
|
|
131
131
|
description: "Banner dissemination suffix appended after double slash (e.g. 'NF' renders as CUI//NF in the header/footer). Leave blank for no suffix."
|
|
132
132
|
|
|
@@ -134,7 +134,7 @@ main:
|
|
|
134
134
|
type: string
|
|
135
135
|
default: ""
|
|
136
136
|
ui:
|
|
137
|
-
group:
|
|
137
|
+
group: classification
|
|
138
138
|
compact: true
|
|
139
139
|
description: "Office or organization that designated this information as CUI (e.g., 'SAF/AA'). Required by DoDM 5200.48 when classification is CUI."
|
|
140
140
|
|
|
@@ -142,7 +142,7 @@ main:
|
|
|
142
142
|
type: string
|
|
143
143
|
default: ""
|
|
144
144
|
ui:
|
|
145
|
-
group:
|
|
145
|
+
group: classification
|
|
146
146
|
compact: true
|
|
147
147
|
description: "CUI category from the DoD CUI Registry (e.g., 'Privacy/MED', 'CTI', 'PRVCY'). Leave blank to omit."
|
|
148
148
|
|
|
@@ -150,7 +150,7 @@ main:
|
|
|
150
150
|
type: string
|
|
151
151
|
default: ""
|
|
152
152
|
ui:
|
|
153
|
-
group:
|
|
153
|
+
group: classification
|
|
154
154
|
compact: true
|
|
155
155
|
description: "Limited dissemination control shown in the indicator block (e.g., 'FEDONLY', 'NOFORN'). Independent from the banner suffix above."
|
|
156
156
|
|
|
@@ -158,20 +158,21 @@ main:
|
|
|
158
158
|
type: string
|
|
159
159
|
default: ""
|
|
160
160
|
ui:
|
|
161
|
-
group:
|
|
161
|
+
group: classification
|
|
162
162
|
compact: true
|
|
163
163
|
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."
|
|
164
164
|
|
|
165
165
|
references:
|
|
166
166
|
type: array
|
|
167
167
|
items:
|
|
168
|
-
type:
|
|
168
|
+
type: richtext
|
|
169
|
+
inline: true
|
|
169
170
|
default: []
|
|
170
171
|
example:
|
|
171
172
|
- "AFMAN 33-326, 25 November 2011, *Preparing Official Communications*"
|
|
172
173
|
- "AFI 33-360, *Publications and Forms Management*"
|
|
173
174
|
ui:
|
|
174
|
-
group:
|
|
175
|
+
group: additional
|
|
175
176
|
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)."
|
|
176
177
|
|
|
177
178
|
cc:
|
|
@@ -182,7 +183,7 @@ main:
|
|
|
182
183
|
example:
|
|
183
184
|
- Rank and Name, ORG/SYMBOL
|
|
184
185
|
ui:
|
|
185
|
-
group:
|
|
186
|
+
group: additional
|
|
186
187
|
description: List office symbols of recipients to receive copies.
|
|
187
188
|
|
|
188
189
|
distribution:
|
|
@@ -194,7 +195,7 @@ main:
|
|
|
194
195
|
- ORG1/SYMBOL
|
|
195
196
|
- ORG2/SYMBOL
|
|
196
197
|
ui:
|
|
197
|
-
group:
|
|
198
|
+
group: additional
|
|
198
199
|
description: Complete list of recipients if 'SEE DISTRIBUTION' is used in the 'Memo For' field.
|
|
199
200
|
|
|
200
201
|
attachments:
|
|
@@ -205,7 +206,7 @@ main:
|
|
|
205
206
|
example:
|
|
206
207
|
- Attachment description, YYYY MMM DD
|
|
207
208
|
ui:
|
|
208
|
-
group:
|
|
209
|
+
group: additional
|
|
209
210
|
description: List attachments in the order they are mentioned in the memo. Briefly describe each; do not use 'as stated' or abbreviations.
|
|
210
211
|
|
|
211
212
|
memo_style:
|
|
@@ -215,7 +216,7 @@ main:
|
|
|
215
216
|
- daf
|
|
216
217
|
default: usaf
|
|
217
218
|
ui:
|
|
218
|
-
group:
|
|
219
|
+
group: additional
|
|
219
220
|
compact: true
|
|
220
221
|
description: "USAF memorandum or DAF headquarters memorandum; DAF changes date format and body paragraph layout per AFH 33-337."
|
|
221
222
|
|
|
@@ -223,15 +224,15 @@ main:
|
|
|
223
224
|
type: number
|
|
224
225
|
default: 12
|
|
225
226
|
ui:
|
|
226
|
-
group:
|
|
227
|
+
group: additional
|
|
227
228
|
compact: true
|
|
228
229
|
description: Body text size in points; decimals allowed (e.g. 11.5).
|
|
229
230
|
|
|
230
231
|
date:
|
|
231
|
-
type:
|
|
232
|
+
type: date
|
|
232
233
|
default: ""
|
|
233
234
|
ui:
|
|
234
|
-
group:
|
|
235
|
+
group: additional
|
|
235
236
|
compact: true
|
|
236
237
|
description: YYYY-MM-DD. Leave blank to use today's date.
|
|
237
238
|
|
|
@@ -240,18 +241,21 @@ card_kinds:
|
|
|
240
241
|
description: Chain of routing endorsements. Each endorsement block adds an official response or forwarding action to the original memo.
|
|
241
242
|
ui:
|
|
242
243
|
title: Routing indorsement
|
|
244
|
+
groups: [addressing, additional]
|
|
243
245
|
fields:
|
|
244
246
|
from:
|
|
245
247
|
type: string
|
|
246
248
|
example: ORG/SYMBOL
|
|
247
249
|
ui:
|
|
248
|
-
group:
|
|
250
|
+
group: addressing
|
|
251
|
+
compact: true
|
|
249
252
|
description: Office symbol or Rank Name of the endorsing official.
|
|
250
253
|
for:
|
|
251
254
|
type: string
|
|
252
255
|
example: ORG/SYMBOL
|
|
253
256
|
ui:
|
|
254
|
-
group:
|
|
257
|
+
group: addressing
|
|
258
|
+
compact: true
|
|
255
259
|
description: Office symbol or organization receiving the endorsed memo.
|
|
256
260
|
signature_block:
|
|
257
261
|
type: array
|
|
@@ -261,7 +265,8 @@ card_kinds:
|
|
|
261
265
|
- "FIRST M. LAST, Rank, USAF"
|
|
262
266
|
- Duty Title
|
|
263
267
|
ui:
|
|
264
|
-
group:
|
|
268
|
+
group: addressing
|
|
269
|
+
compact: true
|
|
265
270
|
description: "Line 1: Name in UPPERCASE as signed, grade, and service. Line 2: Duty title."
|
|
266
271
|
format:
|
|
267
272
|
type: string
|
|
@@ -271,7 +276,7 @@ card_kinds:
|
|
|
271
276
|
- separate_page
|
|
272
277
|
default: standard
|
|
273
278
|
ui:
|
|
274
|
-
group:
|
|
279
|
+
group: additional
|
|
275
280
|
compact: true
|
|
276
281
|
description: "'standard' (formal, same page), 'informal' (less formal routing), or 'separate_page' (begins on a new page)."
|
|
277
282
|
action:
|
|
@@ -283,13 +288,13 @@ card_kinds:
|
|
|
283
288
|
- disapprove
|
|
284
289
|
default: ""
|
|
285
290
|
ui:
|
|
286
|
-
group:
|
|
291
|
+
group: additional
|
|
287
292
|
compact: true
|
|
288
293
|
description: "Action taken by the endorser. Leave blank to hide the Approve/Disapprove line entirely, 'undecided' to display the line with neither option circled, 'approve' or 'disapprove' to circle the selected option."
|
|
289
294
|
date:
|
|
290
|
-
type:
|
|
295
|
+
type: date
|
|
291
296
|
default: ""
|
|
292
297
|
ui:
|
|
293
|
-
group:
|
|
298
|
+
group: additional
|
|
294
299
|
compact: true
|
|
295
|
-
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
|
|
300
|
+
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."
|
|
Binary file
|
|
@@ -77,33 +77,66 @@
|
|
|
77
77
|
let indorsement_number = counters.indorsement.get().at(0, default: 1)
|
|
78
78
|
let indorsement_label = format-indorsement-number(indorsement_number)
|
|
79
79
|
|
|
80
|
+
let ind_date = align(right)[#if actual_date != none { display-date(actual_date, memo-style: memo-style) } else { date-placeholder-line() }]
|
|
81
|
+
|
|
82
|
+
// Separate-page header body: restates the original memo's identity (FROM,
|
|
83
|
+
// date, subject) on its own line, since the indorsement no longer shares a
|
|
84
|
+
// page with the action document. Rendered as a non-breakable, sticky unit
|
|
85
|
+
// so it travels to the next page *with* the content it heads rather than
|
|
86
|
+
// being stranded at the bottom of a page.
|
|
87
|
+
let separate-page-body = block(breakable: false, sticky: true)[
|
|
88
|
+
#[#indorsement_label to #original_from, #display-date(original_date, memo-style: memo-style), #original_subject]
|
|
89
|
+
#blank-line()
|
|
90
|
+
#grid(columns: (auto, 1fr), ind_from, ind_date)
|
|
91
|
+
#blank-line()
|
|
92
|
+
#grid(columns: (auto, auto, 1fr), "MEMORANDUM FOR", " ", ind_for)
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
// Standard header: terse "Nth Ind, FROM date" line, used when the
|
|
96
|
+
// indorsement stays on the same page as the action document. Same
|
|
97
|
+
// non-breakable + sticky treatment so the two header lines never split
|
|
98
|
+
// across a page boundary and never detach from the body/signature below.
|
|
99
|
+
let standard-header = block(breakable: false, sticky: true)[
|
|
100
|
+
#blank-line()
|
|
101
|
+
#grid(columns: (auto, 1fr), [#indorsement_label, #ind_from], ind_date)
|
|
102
|
+
#blank-line()
|
|
103
|
+
#grid(columns: (auto, auto, 1fr), "MEMORANDUM FOR", " ", ind_for)
|
|
104
|
+
]
|
|
105
|
+
|
|
80
106
|
if format == "separate_page" {
|
|
107
|
+
// Explicit separate-page indorsement always begins on a fresh page.
|
|
81
108
|
pagebreak()
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
blank-line()
|
|
85
|
-
grid(
|
|
86
|
-
columns: (auto, 1fr),
|
|
87
|
-
ind_from, align(right)[#if actual_date != none { display-date(actual_date, memo-style: memo-style) }],
|
|
88
|
-
)
|
|
89
|
-
|
|
90
|
-
blank-line()
|
|
91
|
-
grid(
|
|
92
|
-
columns: (auto, auto, 1fr),
|
|
93
|
-
"MEMORANDUM FOR", " ", ind_for,
|
|
94
|
-
)
|
|
109
|
+
separate-page-body
|
|
95
110
|
} else {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
111
|
+
// AFH 33-337: a standard indorsement that no longer fits on the action
|
|
112
|
+
// document's page moves to a separate page, where it carries the fuller
|
|
113
|
+
// separate-page identifying header (it has lost its visual link to the
|
|
114
|
+
// original). Auto-upgrade to that header when the indorsement is pushed
|
|
115
|
+
// to a new page, rather than printing the terse same-page header at the
|
|
116
|
+
// top of a continuation page where it no longer makes sense.
|
|
117
|
+
//
|
|
118
|
+
// Detection: because the header is a non-breakable, sticky unit, Typst
|
|
119
|
+
// moves it wholesale to the next page when it would not fit — so a
|
|
120
|
+
// pushed indorsement lands at the top content margin. If the header's
|
|
121
|
+
// resolved position is at the top of its page, it was pushed; emit the
|
|
122
|
+
// separate-page body (no extra pagebreak — we are already at page top).
|
|
123
|
+
// Otherwise the header flows in place with the standard form.
|
|
124
|
+
let stride = {
|
|
125
|
+
let s = LINE_STRIDE.get()
|
|
126
|
+
if s == none {
|
|
127
|
+
let one-line = measure(par(spacing: 0pt)[x]).height
|
|
128
|
+
measure(par(spacing: 0pt)[x#linebreak()x]).height - one-line
|
|
129
|
+
} else { s }
|
|
130
|
+
}
|
|
131
|
+
// here().position().y is the resolved flow position of this header. On a
|
|
132
|
+
// continuation page the first content sits at the top margin; allow one
|
|
133
|
+
// line stride of tolerance for baseline/rounding.
|
|
134
|
+
let pushed-to-new-page = here().position().y <= spacing.margin + stride
|
|
135
|
+
if pushed-to-new-page {
|
|
136
|
+
separate-page-body
|
|
137
|
+
} else {
|
|
138
|
+
standard-header
|
|
139
|
+
}
|
|
107
140
|
}
|
|
108
141
|
}
|
|
109
142
|
// Header→content gap. Skipped when there is neither an action line nor
|
|
@@ -89,10 +89,15 @@
|
|
|
89
89
|
|
|
90
90
|
/// Formats a date for the memo heading.
|
|
91
91
|
///
|
|
92
|
-
///
|
|
93
|
-
/// -
|
|
92
|
+
/// Dispatches on the shape a date field can arrive in:
|
|
93
|
+
/// - str: shown as-is (fixed text like a placeholder).
|
|
94
|
+
/// - datetime: a native Typst datetime (e.g. `datetime.today()`) — USAF style
|
|
95
|
+
/// `DD Month YYYY`, DAF style `Month DD, YYYY`.
|
|
96
|
+
/// - dict: a Quillmark `date`/`datetime` field lowers to a click-to-edit value
|
|
97
|
+
/// object `{ value: datetime, display: closure }`; `display` is a stored closure
|
|
98
|
+
/// over `.display`, so call it through parentheses — a dict has no `.display` method.
|
|
94
99
|
///
|
|
95
|
-
/// - date (str|datetime): Date to format for display
|
|
100
|
+
/// - date (str | datetime | dict): Date to format for display
|
|
96
101
|
/// - memo-style (str): `"usaf"` or `"daf"`
|
|
97
102
|
/// -> content
|
|
98
103
|
#let display-date(date, memo-style: "usaf") = {
|
|
@@ -108,10 +113,34 @@
|
|
|
108
113
|
} else {
|
|
109
114
|
"[day padding:none] [month repr:long] [year]"
|
|
110
115
|
}
|
|
111
|
-
date
|
|
116
|
+
if type(date) == datetime {
|
|
117
|
+
date.display(pattern)
|
|
118
|
+
} else {
|
|
119
|
+
(date.display)(pattern)
|
|
120
|
+
}
|
|
112
121
|
}
|
|
113
122
|
}
|
|
114
123
|
|
|
124
|
+
/// Renders a horizontal rule sized to fit a handwritten date.
|
|
125
|
+
///
|
|
126
|
+
/// Used for indorsements whose signing date is unknown at compile time: the
|
|
127
|
+
/// endorser writes the date on the line by hand when signing. The rule sits at
|
|
128
|
+
/// the baseline with one line of height above it so handwritten text can be
|
|
129
|
+
/// written on the line without colliding with surrounding header text.
|
|
130
|
+
///
|
|
131
|
+
/// - width (length): Length of the fill-in rule; defaults to fit a long date
|
|
132
|
+
/// such as "15 September 2026".
|
|
133
|
+
/// -> content
|
|
134
|
+
#let date-placeholder-line(width: 1in) = box(
|
|
135
|
+
width: width,
|
|
136
|
+
height: 1em,
|
|
137
|
+
// Keep the rule on the line's baseline so it aligns with where the printed
|
|
138
|
+
// date would sit. The 1em box height reserves the writing space above it.
|
|
139
|
+
// (A positive baseline shift would drop the rule a full line too low.)
|
|
140
|
+
baseline: 0pt,
|
|
141
|
+
stroke: (bottom: 0.5pt + black),
|
|
142
|
+
)
|
|
143
|
+
|
|
115
144
|
/// Gets the banner color for a classification marking.
|
|
116
145
|
///
|
|
117
146
|
/// Matches when `level` (trimmed) starts with a known prefix: TOP SECRET, SECRET,
|
|
@@ -15,14 +15,6 @@
|
|
|
15
15
|
}
|
|
16
16
|
),
|
|
17
17
|
|
|
18
|
-
// Optional Freedom 250 emblem, placed opposite the seal
|
|
19
|
-
..if data.at("freedom250", default: false) {
|
|
20
|
-
(
|
|
21
|
-
letterhead_emblem: image("assets/Freedom250_USAF.png"),
|
|
22
|
-
letterhead_emblem_height: 0.58in,
|
|
23
|
-
)
|
|
24
|
-
},
|
|
25
|
-
|
|
26
18
|
// Date
|
|
27
19
|
date: data.at("date", default: none),
|
|
28
20
|
|
|
@@ -62,7 +54,10 @@
|
|
|
62
54
|
memo_for_cols: 1,
|
|
63
55
|
)
|
|
64
56
|
|
|
65
|
-
// Mainmatter
|
|
57
|
+
// Mainmatter. The body's region needs no recovery step here: the package's
|
|
58
|
+
// render-body rebuilds paragraphs through a state buffer (AFH 33-337
|
|
59
|
+
// auto-numbering), but the rebuilt glyphs keep their spans, which is what
|
|
60
|
+
// the backend reads regions from.
|
|
66
61
|
#mainmatter[
|
|
67
62
|
#data.at("$body")
|
|
68
63
|
]
|
|
@@ -71,7 +66,7 @@
|
|
|
71
66
|
#backmatter(
|
|
72
67
|
// Signature block
|
|
73
68
|
signature_block: data.signature_block,
|
|
74
|
-
signing_field: signature-field("Signature"),
|
|
69
|
+
signing_field: signature-field("Signature", field: "signature_block"),
|
|
75
70
|
|
|
76
71
|
// Optional cc
|
|
77
72
|
..if "cc" in data { (cc: data.cc) },
|
|
@@ -93,19 +88,29 @@
|
|
|
93
88
|
let body = card.at("$body", default: "")
|
|
94
89
|
let body_content = if type(body) == str { [] } else { body }
|
|
95
90
|
// Per AFH 33-337 Ch. 14, an indorsement is dated when the endorser signs
|
|
96
|
-
// it (distinct from the originating memo's date).
|
|
97
|
-
//
|
|
91
|
+
// it (distinct from the originating memo's date). The signing date is
|
|
92
|
+
// generally unknown at compile time and filled in by hand, so a blank or
|
|
93
|
+
// omitted date renders a fill-in line rather than stamping the compile date.
|
|
98
94
|
let card_date = card.at("date", default: none)
|
|
99
95
|
let resolved_date = if card_date == none or card_date == "" {
|
|
100
|
-
|
|
96
|
+
none
|
|
101
97
|
} else {
|
|
102
98
|
card_date
|
|
103
99
|
}
|
|
100
|
+
// The card's `$path` prefix composes its canonical schema addresses
|
|
101
|
+
// (`$cards.indorsement.<n>.…`, per-kind ordinal) — the absolute loop
|
|
102
|
+
// index `i` is NOT that ordinal once kinds interleave, so it stays a
|
|
103
|
+
// widget-name suffix only. The card body's region rides its own glyph
|
|
104
|
+
// spans through the package rebuild, per-card because each card's body
|
|
105
|
+
// has its own backend-generated eval site.
|
|
104
106
|
indorsement(
|
|
105
107
|
from: card.at("from", default: ""),
|
|
106
108
|
to: card.at("for", default: ""),
|
|
107
109
|
signature_block: card.signature_block,
|
|
108
|
-
signing_field: signature-field(
|
|
110
|
+
signing_field: signature-field(
|
|
111
|
+
"Ind_" + str(i) + "_Signature",
|
|
112
|
+
field: card.at("$path") + "signature_block",
|
|
113
|
+
),
|
|
109
114
|
format: card.at("format", default: "standard"),
|
|
110
115
|
date: resolved_date,
|
|
111
116
|
..if "action" in card { (action: card.action) },
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
I visually mapped out a bunch of fields on the form to the typst field names. The intent is to write a plate and field schema that interfaces with the Typst form and exposes an ergonomic API to the Quill consumer. See [Creating Quills](https://quillmark.readthedocs.io/en/latest/guides/creating-quills/) to learn how to write the field schema.
|
|
2
|
-
|
|
3
|
-
Note that the following field names are not authortative; use your discretion to name them ergonomically.
|
|
4
|
-
|
|
5
|
-
## Admin Fields
|
|
6
|
-
|
|
7
|
-
Name: `commonforms_text_p1_1`
|
|
8
|
-
Unit: `commonforms_text_p1_2`
|
|
9
|
-
Grade/CCC Level: `commonforms_text_p1_3`
|
|
10
|
-
|
|
11
|
-
## Record of Experience table fields
|
|
12
|
-
|
|
13
|
-
Date: `commonforms_text_p1_{4,7,18,...,109}` and `commonforms_text_p2_{1,8,15,...141}`
|
|
14
|
-
Mandatory Actions to be Reported: `commonforms_text_p1_{5,12,19,...,110}` and `commonforms_text_p2_{2,9,16,...,142}`
|
|
15
|
-
written_grade: `commonforms_text_p1_{6,13,...111}` and `commonforms_text_p2_{3,10,...,143}`
|
|
16
|
-
writen_grade_date: `commonforms_text_p1_{7,14,...,112}` and `commonforms_text_p2_{4,11,144}`
|
|
17
|
-
positional_grade: `commonforms_text_p1_{8,15,...,113}` and `commonforms_text_p2_{5,12,...,145}`
|
|
18
|
-
positional_grade_date: `commonforms_text_p1_{9,...,114}` and
|
|
19
|
-
`commonforms_text_p2_{6,...,145}`
|
|
20
|
-
auth_or_remarks: `commonforms_text_p1_{10,...,115}` and `commonforms_text_p2_{7,...,146}`
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,31 +0,0 @@
|
|
|
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
|
-
logs/
|
|
Binary file
|
|
Binary file
|
package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/Cinzel-Regular.ttf
DELETED
|
Binary file
|
/package/quills/af4141/0.1.0/{assets → packages/typst-af4141/fonts}/GNU General Public License.txt
RENAMED
|
File without changes
|
|
File without changes
|
/package/quills/af4141/0.1.0/{assets → packages/typst-af4141/fonts}/NimbusRomNo9L-MedIta.otf
RENAMED
|
File without changes
|
|
File without changes
|
/package/quills/af4141/0.1.0/{assets → packages/typst-af4141/fonts}/NimbusRomNo9L-RegIta.otf
RENAMED
|
File without changes
|