@airmark/quiver 0.24.4 → 0.24.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@airmark/quiver",
3
- "version": "0.24.4",
3
+ "version": "0.24.6",
4
4
  "description": "Airmark Quiver — Air Force and DAF document Quills for Quillmark.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -107,6 +107,61 @@ main:
107
107
  compact: true
108
108
  description: Show the America 250 / Freedom 250 commemorative emblem in the letterhead, mirrored opposite the seal.
109
109
 
110
+ classification:
111
+ type: string
112
+ enum:
113
+ - ""
114
+ - UNCLASSIFIED
115
+ - CUI
116
+ - CONFIDENTIAL
117
+ - SECRET
118
+ - TOP SECRET
119
+ default: ""
120
+ ui:
121
+ group: Classification
122
+ compact: true
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
+
125
+ dissemination:
126
+ type: string
127
+ default: ""
128
+ ui:
129
+ group: Classification
130
+ compact: true
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
+
133
+ cui_controlled_by:
134
+ type: string
135
+ default: ""
136
+ ui:
137
+ group: Classification
138
+ compact: true
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
+
141
+ cui_category:
142
+ type: string
143
+ default: ""
144
+ ui:
145
+ group: Classification
146
+ compact: true
147
+ description: "CUI category from the DoD CUI Registry (e.g., 'Privacy/MED', 'CTI', 'PRVCY'). Leave blank to omit."
148
+
149
+ cui_limited_dissemination:
150
+ type: string
151
+ default: ""
152
+ ui:
153
+ group: Classification
154
+ compact: true
155
+ description: "Limited dissemination control shown in the indicator block (e.g., 'FEDONLY', 'NOFORN'). Independent from the banner suffix above."
156
+
157
+ cui_poc:
158
+ type: string
159
+ default: ""
160
+ ui:
161
+ group: Classification
162
+ compact: true
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
+
110
165
  references:
111
166
  type: array
112
167
  items:
@@ -180,61 +235,6 @@ main:
180
235
  compact: true
181
236
  description: YYYY-MM-DD. Leave blank to use today's date.
182
237
 
183
- classification:
184
- type: string
185
- enum:
186
- - ""
187
- - UNCLASSIFIED
188
- - CUI
189
- - CONFIDENTIAL
190
- - SECRET
191
- - TOP SECRET
192
- default: ""
193
- ui:
194
- group: Classification
195
- compact: true
196
- 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."
197
-
198
- dissemination:
199
- type: string
200
- default: ""
201
- ui:
202
- group: Classification
203
- compact: true
204
- description: "Banner dissemination suffix appended after double slash (e.g. 'NF' renders as CUI//NF in the header/footer). Leave blank for no suffix."
205
-
206
- cui_controlled_by:
207
- type: string
208
- default: ""
209
- ui:
210
- group: Classification
211
- compact: true
212
- description: "Office or organization that designated this information as CUI (e.g., 'SAF/AA'). Required by DoDM 5200.48 when classification is CUI."
213
-
214
- cui_category:
215
- type: string
216
- default: ""
217
- ui:
218
- group: Classification
219
- compact: true
220
- description: "CUI category from the DoD CUI Registry (e.g., 'Privacy/MED', 'CTI', 'PRVCY'). Leave blank to omit."
221
-
222
- cui_limited_dissemination:
223
- type: string
224
- default: ""
225
- ui:
226
- group: Classification
227
- compact: true
228
- description: "Limited dissemination control shown in the indicator block (e.g., 'FEDONLY', 'NOFORN'). Independent from the banner suffix above."
229
-
230
- cui_poc:
231
- type: string
232
- default: ""
233
- ui:
234
- group: Classification
235
- compact: true
236
- 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."
237
-
238
238
  card_kinds:
239
239
  indorsement:
240
240
  description: Chain of routing endorsements. Each endorsement block adds an official response or forwarding action to the original memo.
@@ -20,6 +20,7 @@
20
20
  letterhead_seal: none,
21
21
  letterhead_seal_subtitle: none, // optional line under seal (9pt bold caps); ignored if no seal
22
22
  letterhead_emblem: none, // optional image placed opposite the seal (right side)
23
+ letterhead_emblem_height: 1in, // emblem fit-box height; reduce for shorter emblems
23
24
  letterhead_font: DEFAULT_LETTERHEAD_FONTS,
24
25
  body_font: DEFAULT_BODY_FONTS,
25
26
  font_size: 12pt,
@@ -175,6 +176,7 @@
175
176
  letterhead-seal: letterhead_seal,
176
177
  letterhead-seal-subtitle: letterhead_seal_subtitle,
177
178
  letterhead-emblem: letterhead_emblem,
179
+ letterhead-emblem-height: letterhead_emblem_height,
178
180
  )
179
181
 
180
182
  // AFH 33-337 "Date": "Place the date 1 inch from the right edge, 1.75 inches from the top"
@@ -21,6 +21,7 @@
21
21
  letterhead-seal: none,
22
22
  letterhead-seal-subtitle: none,
23
23
  letterhead-emblem: none, // optional image placed opposite the seal (right side)
24
+ letterhead-emblem-height: 1in, // emblem fit-box height; reduce for shorter emblems
24
25
  ) = {
25
26
  font = ensure-array(font)
26
27
  title = ensure-string(title)
@@ -28,6 +29,16 @@
28
29
  title = upper(title)
29
30
  caption = upper(caption)
30
31
 
32
+ // Letterhead corner geometry. The seal (left) and emblem (right) share one
33
+ // reference band so the corners stay in parity: both bleed `corner-overhang`
34
+ // past the page margin and center on the same axis (`band-center`). The
35
+ // emblem may be shorter than the band but stays centered on that axis.
36
+ let corner-overhang = 0.5in
37
+ let corner-width = 2in
38
+ let band-height = 1in // seal height; also the emblem's reference band
39
+ let band-top = -band-height / 2 // puts the band center at dy 0
40
+ let band-center = band-top + band-height / 2
41
+
31
42
  place(
32
43
  dy: 0.625in - spacing.margin,
33
44
  box(
@@ -51,7 +62,7 @@
51
62
  if letterhead-seal != none {
52
63
  let seal-body = if falsey(letterhead-seal-subtitle) {
53
64
  block[
54
- #fit-box(width: 2in, height: 1in)[#letterhead-seal]
65
+ #fit-box(width: corner-width, height: band-height)[#letterhead-seal]
55
66
  ]
56
67
  } else {
57
68
  // Isolate seal column from document `font_size`: stack `em` spacing and subtitle
@@ -63,26 +74,29 @@
63
74
  // Spacing applies between positional stack children only, not one `[…]` body.
64
75
  #stack(
65
76
  spacing: 0.5em,
66
- fit-box(width: 2in, height: 1in)[#letterhead-seal],
77
+ fit-box(width: corner-width, height: band-height)[#letterhead-seal],
67
78
  box(upper(ensure-string(letterhead-seal-subtitle))),
68
79
  )
69
80
  ]
70
81
  }
71
82
  place(
72
83
  left + top,
73
- dx: -0.5in,
74
- dy: -.5in,
84
+ dx: -corner-overhang,
85
+ dy: band-top,
75
86
  seal-body,
76
87
  )
77
88
  }
78
89
 
79
90
  if letterhead-emblem != none {
91
+ // Mirror the seal: same overhang and width, centered on the seal's band
92
+ // axis. Placing the emblem's top at `band-center - height/2` keeps its
93
+ // center on `band-center` for any (possibly shorter) emblem height.
80
94
  place(
81
95
  right + top,
82
- dx: 0.5in,
83
- dy: -.5in,
96
+ dx: corner-overhang,
97
+ dy: band-center - letterhead-emblem-height / 2,
84
98
  block[
85
- #fit-box(width: 2in, height: 1in, alignment: right + horizon)[#letterhead-emblem]
99
+ #fit-box(width: corner-width, height: letterhead-emblem-height, alignment: right + horizon)[#letterhead-emblem]
86
100
  ],
87
101
  )
88
102
  }
@@ -17,7 +17,10 @@
17
17
 
18
18
  // Optional Freedom 250 emblem, placed opposite the seal
19
19
  ..if data.at("freedom250", default: false) {
20
- (letterhead_emblem: image("assets/freedom250.png"))
20
+ (
21
+ letterhead_emblem: image("assets/Freedom250_USAF.png"),
22
+ letterhead_emblem_height: 0.58in,
23
+ )
21
24
  },
22
25
 
23
26
  // Date