@airmark/quiver 0.23.0 → 0.24.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/README.md +1 -1
- package/package.json +4 -6
- package/quills/af4141/0.1.0/Quill.yaml +3 -3
- package/quills/daf1206/0.1.0/Quill.yaml +0 -1
- package/quills/daf4392/0.1.0/Quill.yaml +3 -3
- package/quills/usaf_memo/0.2.0/Quill.yaml +50 -25
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/frontmatter.typ +6 -1
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/primitives.typ +12 -3
package/README.md
CHANGED
|
@@ -42,7 +42,7 @@ const quiverYaml = fileURLToPath(import.meta.resolve('@airmark/quiver/Quiver.yam
|
|
|
42
42
|
const quiver = await Quiver.fromDir(path.dirname(quiverYaml));
|
|
43
43
|
|
|
44
44
|
const engine = new Quillmark();
|
|
45
|
-
const doc = Document.fromMarkdown(`~~~
|
|
45
|
+
const doc = Document.fromMarkdown(`~~~
|
|
46
46
|
$quill: usaf_memo@0.2
|
|
47
47
|
$kind: main
|
|
48
48
|
memo_for: ["ORG/SYMBOL"]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@airmark/quiver",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.1",
|
|
4
4
|
"description": "Airmark Quiver — Air Force and DAF document Quills for Quillmark.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -16,14 +16,12 @@
|
|
|
16
16
|
"node": ">=24"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"@quillmark/quiver": "^0.
|
|
20
|
-
"@quillmark/wasm": "^0.
|
|
19
|
+
"@quillmark/quiver": "^0.12.0",
|
|
20
|
+
"@quillmark/wasm": "^0.87.0"
|
|
21
21
|
},
|
|
22
22
|
"scripts": {
|
|
23
23
|
"test": "quiver test",
|
|
24
|
-
"preview": "quiver preview"
|
|
25
|
-
"release:patch": "npm version patch -m \"chore(release): %s\" && git push --follow-tags",
|
|
26
|
-
"release:minor": "npm version minor -m \"chore(release): %s\" && git push --follow-tags"
|
|
24
|
+
"preview": "quiver preview"
|
|
27
25
|
},
|
|
28
26
|
"keywords": [
|
|
29
27
|
"quillmark",
|
|
@@ -40,7 +40,7 @@ card_kinds:
|
|
|
40
40
|
enabled: false
|
|
41
41
|
fields:
|
|
42
42
|
date:
|
|
43
|
-
type:
|
|
43
|
+
type: datetime
|
|
44
44
|
default: ""
|
|
45
45
|
ui:
|
|
46
46
|
group: Record
|
|
@@ -62,7 +62,7 @@ card_kinds:
|
|
|
62
62
|
description: Written grade, if applicable (column C).
|
|
63
63
|
|
|
64
64
|
written_grade_date:
|
|
65
|
-
type:
|
|
65
|
+
type: datetime
|
|
66
66
|
default: ""
|
|
67
67
|
ui:
|
|
68
68
|
group: Record
|
|
@@ -78,7 +78,7 @@ card_kinds:
|
|
|
78
78
|
description: Positional grade, if applicable (column E).
|
|
79
79
|
|
|
80
80
|
positional_grade_date:
|
|
81
|
-
type:
|
|
81
|
+
type: datetime
|
|
82
82
|
default: ""
|
|
83
83
|
ui:
|
|
84
84
|
group: Record
|
|
@@ -16,7 +16,7 @@ main:
|
|
|
16
16
|
description: "Matches the check box."
|
|
17
17
|
|
|
18
18
|
departure_date:
|
|
19
|
-
type:
|
|
19
|
+
type: datetime
|
|
20
20
|
default: ""
|
|
21
21
|
example: "2026-06-01"
|
|
22
22
|
ui:
|
|
@@ -59,7 +59,7 @@ main:
|
|
|
59
59
|
description: "Unit / Organization."
|
|
60
60
|
|
|
61
61
|
briefed_date:
|
|
62
|
-
type:
|
|
62
|
+
type: datetime
|
|
63
63
|
default: ""
|
|
64
64
|
example: "2026-05-22"
|
|
65
65
|
ui:
|
|
@@ -100,7 +100,7 @@ card_kinds:
|
|
|
100
100
|
enabled: false
|
|
101
101
|
fields:
|
|
102
102
|
date:
|
|
103
|
-
type:
|
|
103
|
+
type: datetime
|
|
104
104
|
default: ""
|
|
105
105
|
ui:
|
|
106
106
|
group: Itinerary Entry
|
|
@@ -14,16 +14,19 @@ main:
|
|
|
14
14
|
fields:
|
|
15
15
|
memo_for:
|
|
16
16
|
type: array
|
|
17
|
-
|
|
17
|
+
items:
|
|
18
|
+
type: string
|
|
18
19
|
example:
|
|
19
20
|
- ORG1/SYMBOL
|
|
20
21
|
- ORG2/SYMBOL
|
|
21
22
|
ui:
|
|
22
23
|
group: Addressing
|
|
23
|
-
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
|
|
24
|
+
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."
|
|
24
25
|
|
|
25
26
|
memo_from:
|
|
26
27
|
type: array
|
|
28
|
+
items:
|
|
29
|
+
type: string
|
|
27
30
|
default: []
|
|
28
31
|
example:
|
|
29
32
|
- ORG/SYMBOL
|
|
@@ -36,7 +39,6 @@ main:
|
|
|
36
39
|
|
|
37
40
|
subject:
|
|
38
41
|
type: string
|
|
39
|
-
default: ""
|
|
40
42
|
example: Subject of the Memorandum
|
|
41
43
|
ui:
|
|
42
44
|
group: Addressing
|
|
@@ -44,24 +46,27 @@ main:
|
|
|
44
46
|
|
|
45
47
|
signature_block:
|
|
46
48
|
type: array
|
|
47
|
-
|
|
49
|
+
items:
|
|
50
|
+
type: string
|
|
48
51
|
example:
|
|
49
|
-
- "FIRST M. LAST, Rank,
|
|
52
|
+
- "FIRST M. LAST, Rank, USAF"
|
|
50
53
|
- Duty Title
|
|
51
54
|
ui:
|
|
52
55
|
group: Addressing
|
|
53
|
-
description: "Line 1: Name in UPPERCASE as signed, grade, and service. Line 2: Duty title.
|
|
56
|
+
description: "Line 1: Name in UPPERCASE as signed, grade, and service. Line 2: Duty title."
|
|
54
57
|
|
|
55
58
|
letterhead_title:
|
|
56
59
|
type: string
|
|
57
60
|
default: DEPARTMENT OF THE AIR FORCE
|
|
58
61
|
ui:
|
|
59
62
|
group: Letterhead
|
|
60
|
-
description:
|
|
63
|
+
description: Change only for Joint Commands or DoW agencies.
|
|
61
64
|
|
|
62
65
|
letterhead_caption:
|
|
63
66
|
type: array
|
|
64
|
-
|
|
67
|
+
items:
|
|
68
|
+
type: string
|
|
69
|
+
example:
|
|
65
70
|
- HEADQUARTERS [UNIT NAME]
|
|
66
71
|
ui:
|
|
67
72
|
group: Letterhead
|
|
@@ -84,7 +89,7 @@ main:
|
|
|
84
89
|
ui:
|
|
85
90
|
group: Letterhead
|
|
86
91
|
compact: true
|
|
87
|
-
description:
|
|
92
|
+
description: Bold-caps line below the seal; blank to omit.
|
|
88
93
|
|
|
89
94
|
tag_line:
|
|
90
95
|
type: string
|
|
@@ -104,15 +109,20 @@ main:
|
|
|
104
109
|
|
|
105
110
|
references:
|
|
106
111
|
type: array
|
|
112
|
+
items:
|
|
113
|
+
type: markdown
|
|
107
114
|
default: []
|
|
108
115
|
example:
|
|
109
|
-
- "
|
|
116
|
+
- "AFMAN 33-326, 25 November 2011, *Preparing Official Communications*"
|
|
117
|
+
- "AFI 33-360, *Publications and Forms Management*"
|
|
110
118
|
ui:
|
|
111
119
|
group: Additional
|
|
112
|
-
description: "Cite by organization, type, date, and title."
|
|
120
|
+
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)."
|
|
113
121
|
|
|
114
122
|
cc:
|
|
115
123
|
type: array
|
|
124
|
+
items:
|
|
125
|
+
type: string
|
|
116
126
|
default: []
|
|
117
127
|
example:
|
|
118
128
|
- Rank and Name, ORG/SYMBOL
|
|
@@ -122,6 +132,8 @@ main:
|
|
|
122
132
|
|
|
123
133
|
distribution:
|
|
124
134
|
type: array
|
|
135
|
+
items:
|
|
136
|
+
type: string
|
|
125
137
|
default: []
|
|
126
138
|
example:
|
|
127
139
|
- ORG1/SYMBOL
|
|
@@ -132,6 +144,8 @@ main:
|
|
|
132
144
|
|
|
133
145
|
attachments:
|
|
134
146
|
type: array
|
|
147
|
+
items:
|
|
148
|
+
type: string
|
|
135
149
|
default: []
|
|
136
150
|
example:
|
|
137
151
|
- Attachment description, YYYY MMM DD
|
|
@@ -148,19 +162,18 @@ main:
|
|
|
148
162
|
ui:
|
|
149
163
|
group: Additional
|
|
150
164
|
compact: true
|
|
151
|
-
description: "USAF memorandum
|
|
165
|
+
description: "USAF memorandum or DAF headquarters memorandum; DAF changes date format and body paragraph layout per AFH 33-337."
|
|
152
166
|
|
|
153
167
|
font_size:
|
|
154
168
|
type: number
|
|
155
169
|
default: 12
|
|
156
|
-
example: 12
|
|
157
170
|
ui:
|
|
158
171
|
group: Additional
|
|
159
172
|
compact: true
|
|
160
|
-
description:
|
|
173
|
+
description: Body text size in points; decimals allowed (e.g. 11.5).
|
|
161
174
|
|
|
162
175
|
date:
|
|
163
|
-
type:
|
|
176
|
+
type: datetime
|
|
164
177
|
default: ""
|
|
165
178
|
ui:
|
|
166
179
|
group: Additional
|
|
@@ -180,7 +193,7 @@ main:
|
|
|
180
193
|
ui:
|
|
181
194
|
group: Additional
|
|
182
195
|
compact: true
|
|
183
|
-
description: "Select the classification marking
|
|
196
|
+
description: "Select the classification marking shown in the header and footer banner. Mark per DAFI 16-1404 (DoDM 5200.48 for CUI) and applicable DoD guidance. Leave blank to omit the banner."
|
|
184
197
|
|
|
185
198
|
dissemination:
|
|
186
199
|
type: string
|
|
@@ -195,24 +208,28 @@ card_kinds:
|
|
|
195
208
|
description: Chain of routing endorsements. Each endorsement block adds an official response or forwarding action to the original memo.
|
|
196
209
|
ui:
|
|
197
210
|
title: Routing indorsement
|
|
211
|
+
body:
|
|
212
|
+
example: |
|
|
213
|
+
The first paragraph of the endorsement. Top-level paragraphs are auto-numbered; do not add manual numbering.
|
|
214
|
+
|
|
215
|
+
- Nested bullets are automatically lettered.
|
|
198
216
|
fields:
|
|
199
217
|
from:
|
|
200
218
|
type: string
|
|
201
|
-
|
|
219
|
+
example: ORG/SYMBOL
|
|
202
220
|
ui:
|
|
203
221
|
group: Addressing
|
|
204
|
-
description:
|
|
222
|
+
description: Office symbol or Rank Name of the endorsing official.
|
|
205
223
|
for:
|
|
206
224
|
type: string
|
|
207
|
-
|
|
225
|
+
example: ORG/SYMBOL
|
|
208
226
|
ui:
|
|
209
227
|
group: Addressing
|
|
210
228
|
description: Office symbol or organization receiving the endorsed memo.
|
|
211
229
|
signature_block:
|
|
212
230
|
type: array
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
- Duty Title
|
|
231
|
+
items:
|
|
232
|
+
type: string
|
|
216
233
|
example:
|
|
217
234
|
- "FIRST M. LAST, Rank, USAF"
|
|
218
235
|
- Duty Title
|
|
@@ -228,7 +245,7 @@ card_kinds:
|
|
|
228
245
|
default: standard
|
|
229
246
|
ui:
|
|
230
247
|
group: Additional
|
|
231
|
-
description: "
|
|
248
|
+
description: "'standard' (formal, same page), 'informal' (less formal routing), or 'separate_page' (begins on a new page)."
|
|
232
249
|
action:
|
|
233
250
|
type: string
|
|
234
251
|
enum:
|
|
@@ -238,22 +255,30 @@ card_kinds:
|
|
|
238
255
|
- disapprove
|
|
239
256
|
default: ""
|
|
240
257
|
ui:
|
|
241
|
-
group:
|
|
258
|
+
group: Additional
|
|
242
259
|
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."
|
|
243
260
|
attachments:
|
|
244
261
|
type: array
|
|
262
|
+
items:
|
|
263
|
+
type: string
|
|
245
264
|
default: []
|
|
265
|
+
example:
|
|
266
|
+
- Attachment description, YYYY MMM DD
|
|
246
267
|
ui:
|
|
247
268
|
group: Additional
|
|
248
269
|
description: List of attachments specific to this endorsement.
|
|
249
270
|
cc:
|
|
250
271
|
type: array
|
|
272
|
+
items:
|
|
273
|
+
type: string
|
|
251
274
|
default: []
|
|
275
|
+
example:
|
|
276
|
+
- Rank and Name, ORG/SYMBOL
|
|
252
277
|
ui:
|
|
253
278
|
group: Additional
|
|
254
279
|
description: List of office symbols to receive copies of this endorsement.
|
|
255
280
|
date:
|
|
256
|
-
type:
|
|
281
|
+
type: datetime
|
|
257
282
|
default: ""
|
|
258
283
|
ui:
|
|
259
284
|
group: Additional
|
|
@@ -149,7 +149,12 @@
|
|
|
149
149
|
render-date-section(actual_date, memo-style: memo_style)
|
|
150
150
|
render-for-section(memo_for, memo_for_cols)
|
|
151
151
|
if not falsey(memo_from) { render-from-section(memo_from) }
|
|
152
|
-
|
|
152
|
+
let single-ref = if type(references) == array and references.len() == 1 {
|
|
153
|
+
references.at(0)
|
|
154
|
+
} else {
|
|
155
|
+
none
|
|
156
|
+
}
|
|
157
|
+
render-subject-section(subject, inline-reference: single-ref)
|
|
153
158
|
render-references-section(references)
|
|
154
159
|
|
|
155
160
|
// AFH 33-337: "Begin text on second line below subject/references".
|
|
@@ -133,19 +133,28 @@
|
|
|
133
133
|
|
|
134
134
|
// AFH 33-337 "SUBJECT:": "In all uppercase letters place 'SUBJECT:', flush with the
|
|
135
135
|
// left margin, on the second line below the last line of the FROM element"
|
|
136
|
-
#let render-subject-section(subject-text) = {
|
|
136
|
+
#let render-subject-section(subject-text, inline-reference: none) = {
|
|
137
137
|
blank-line()
|
|
138
|
+
let content = if inline-reference != none {
|
|
139
|
+
[#subject-text (#box(inline-reference))]
|
|
140
|
+
} else {
|
|
141
|
+
[#subject-text]
|
|
142
|
+
}
|
|
138
143
|
grid(
|
|
139
144
|
columns: (auto, auto, 1fr),
|
|
140
|
-
"SUBJECT:", " ",
|
|
145
|
+
"SUBJECT:", " ", content,
|
|
141
146
|
)
|
|
142
147
|
}
|
|
143
148
|
|
|
149
|
+
// AFH 33-337: only render References block for two or more references.
|
|
150
|
+
// A single reference is rendered inline after the SUBJECT text instead.
|
|
144
151
|
#let render-references-section(references) = {
|
|
145
|
-
if
|
|
152
|
+
if type(references) == array and references.len() >= 2 {
|
|
146
153
|
blank-line()
|
|
147
154
|
grid(
|
|
148
155
|
columns: (auto, auto, 1fr),
|
|
156
|
+
// Each entry is markdown-converted content; spread them as enum items
|
|
157
|
+
// lettered "(a) (b) (c)" per AFH 33-337.
|
|
149
158
|
"References:", " ", enum(..references, numbering: "(a) ", body-indent: 0pt),
|
|
150
159
|
)
|
|
151
160
|
}
|