@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 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(`~~~card-yaml
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.23.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.11.0",
20
- "@quillmark/wasm": "^0.85.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: date
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: date
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: date
81
+ type: datetime
82
82
  default: ""
83
83
  ui:
84
84
  group: Record
@@ -63,4 +63,3 @@ card_kinds:
63
63
  body:
64
64
  example: |
65
65
  - Continued accomplishment bullet.
66
- fields: {}
@@ -16,7 +16,7 @@ main:
16
16
  description: "Matches the check box."
17
17
 
18
18
  departure_date:
19
- type: date
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: date
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: date
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
- default: []
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 numerous recipients, use 'DISTRIBUTION'."
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
- default: []
49
+ items:
50
+ type: string
48
51
  example:
49
- - "FIRST M. LAST, Rank, USSF"
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. Spell out 'Colonel' and general officer ranks."
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: Standard title. Only change for Joint Commands or DoW Agencies.
63
+ description: Change only for Joint Commands or DoW agencies.
61
64
 
62
65
  letterhead_caption:
63
66
  type: array
64
- default:
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: Optional line below the DoW seal (bold caps). Leave blank to omit.
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
- - "AFM 33-326, 31 July 2019, Preparing Official Communications"
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 (default) or DAF headquarters memorandum. DAF changes date formatting and body paragraph layout per AFH 33-337."
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: Font size for the memo text (pt). Decimal values (e.g. 11.5) are supported.
173
+ description: Body text size in points; decimals allowed (e.g. 11.5).
161
174
 
162
175
  date:
163
- type: date
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 displayed in the header/footer banner. Banner colors follow DoD/CAPCO marking guidance (UNCLASSIFIED green, CUI/CONFIDENTIAL black, SECRET red, TOP SECRET orange). Follow AFI 31-401 and applicable DoD guidance. Leave blank to omit the banner."
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
- default: ORG/SYMBOL
219
+ example: ORG/SYMBOL
202
220
  ui:
203
221
  group: Addressing
204
- description: "Office symbol or Rank Name of the endorsing official (e.g., 'ORG/SYMBOL')."
222
+ description: Office symbol or Rank Name of the endorsing official.
205
223
  for:
206
224
  type: string
207
- default: ORG/SYMBOL
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
- default:
214
- - "FIRST M. LAST, Rank, USAF"
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: "Format style: 'standard' (formal on same page), 'informal' (less formal routing), or 'separate_page' (starts on new page)."
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: Addressing
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: date
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
- render-subject-section(subject)
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:", " ", [#subject-text],
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 not falsey(references) {
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
  }