@airmark/quiver 0.18.0 → 0.19.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 CHANGED
@@ -74,7 +74,6 @@ quills/
74
74
  <x.y.z>/
75
75
  Quill.yaml
76
76
  plate.typ
77
- example.md
78
77
  assets/
79
78
  packages/
80
79
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@airmark/quiver",
3
- "version": "0.18.0",
3
+ "version": "0.19.0",
4
4
  "description": "Airmark Quiver — Air Force and DAF document Quills for Quillmark.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -16,11 +16,12 @@
16
16
  "node": ">=24"
17
17
  },
18
18
  "devDependencies": {
19
- "@quillmark/quiver": "^0.7.0",
20
- "@quillmark/wasm": "^0.78.0"
19
+ "@quillmark/quiver": "^0.11.0",
20
+ "@quillmark/wasm": "^0.80.0"
21
21
  },
22
22
  "scripts": {
23
- "test": "node --test quiver.test.js",
23
+ "test": "quiver test",
24
+ "preview": "quiver preview",
24
25
  "release:patch": "npm version patch -m \"chore(release): %s\" && git push --follow-tags",
25
26
  "release:minor": "npm version minor -m \"chore(release): %s\" && git push --follow-tags"
26
27
  },
@@ -3,7 +3,6 @@ quill:
3
3
  version: 0.1.0
4
4
  backend: typst
5
5
  plate_file: plate.typ
6
- example_file: example.md
7
6
  description: "AF Form 4141 — Individual's Record of Duties and Experience, Ground Environment Personnel"
8
7
 
9
8
  main:
@@ -28,7 +27,7 @@ main:
28
27
  type: string
29
28
  description: Commander's authentication entry on page 1.
30
29
 
31
- leaf_kinds:
30
+ card_kinds:
32
31
  experience:
33
32
  description: Each card represents one row in the Record of Experience table. Rows fill page 1 (up to 16 rows) then page 2 (up to 21 rows), for a maximum of 37 rows.
34
33
  ui:
@@ -35,14 +35,14 @@
35
35
  #if "grade" in data { vals.insert("commonforms_text_p1_3", data.grade) }
36
36
  #if "commanders_auth" in data { vals.insert("commonforms_text_p1_116", data.commanders_auth) }
37
37
 
38
- // --- Experience table rows from LEAVES ---
38
+ // --- Experience table rows from CARDS ---
39
39
  // The form supports 16 rows on page 1 and 21 rows on page 2 (37 total).
40
40
  // Overflow rows are silently ignored.
41
41
  #let max-rows = 37
42
42
  #{
43
43
  let row = 0
44
- for card in data.LEAVES {
45
- if card.KIND == "experience" {
44
+ for card in data.CARDS {
45
+ if card.CARD == "experience" {
46
46
  if row < max-rows {
47
47
  for (col, key) in col-keys.enumerate() {
48
48
  let value = form-cell(card.at(key, default: none))
@@ -3,7 +3,6 @@ quill:
3
3
  version: 0.1.0
4
4
  backend: typst
5
5
  plate_file: plate.typ
6
- example_file: example.md
7
6
  description: "DAF Form 1206 — Nomination for Award"
8
7
 
9
8
  main:
@@ -39,7 +38,7 @@ main:
39
38
  unit_commander_rank_name_and_telephone:
40
39
  type: string
41
40
 
42
- leaf_kinds:
41
+ card_kinds:
43
42
  accomplishments_continued:
44
43
  description: Optional. Add this card only when page 2 overflow is required. Use the card body for continued bullets. Rank/name on page 2 matches the main nominee line automatically.
45
44
  ui:
@@ -38,8 +38,8 @@
38
38
  }
39
39
 
40
40
  #let continued-key = "SPECIFIC_ACCOMPLISHMENTS_Use_Performance_Statements_IAW_DAFMAN_362806_Continued"
41
- #for card in data.LEAVES {
42
- if card.KIND == "accomplishments_continued" and continued-key not in vals and "BODY" in card {
41
+ #for card in data.CARDS {
42
+ if card.CARD == "accomplishments_continued" and continued-key not in vals and "BODY" in card {
43
43
  vals.insert(continued-key, card.BODY)
44
44
  }
45
45
  }
@@ -3,7 +3,6 @@ quill:
3
3
  version: 0.1.0
4
4
  backend: typst
5
5
  plate_file: plate.typ
6
- example_file: example.md
7
6
  description: "DAF Form 4392 - Pre-Departure Safety Briefing (Page 2)"
8
7
 
9
8
  main:
@@ -81,7 +80,7 @@ main:
81
80
  type: string
82
81
  description: "Put in your Emergency Contact's Phone Number."
83
82
 
84
- leaf_kinds:
83
+ card_kinds:
85
84
  itinerary:
86
85
  description: "Each card represents one row in the travel itinerary table. Up to 10 rows are supported."
87
86
  ui:
@@ -29,14 +29,14 @@
29
29
  #tf(40pt, 100pt)[#show-date(data.at("departure_date", default: none))]
30
30
  #tf(123pt, 100pt)[#data.at("final_destination", default: "")]
31
31
 
32
- // Itinerary Rows (via LEAVES)
32
+ // Itinerary Rows (via CARDS)
33
33
  #{
34
34
  let row = 0
35
35
  let dy-start = 160pt
36
36
  let dy-step = 40pt
37
- if "LEAVES" in data {
38
- for card in data.LEAVES {
39
- if card.KIND == "itinerary" and row < 10 {
37
+ if "CARDS" in data {
38
+ for card in data.CARDS {
39
+ if card.CARD == "itinerary" and row < 10 {
40
40
  let dy = dy-start + (row * dy-step)
41
41
  tf(80pt, dy)[#show-date(card.at("date", default: none))]
42
42
  tf(135pt, dy)[#card.at("departure_point", default: "")]
@@ -3,7 +3,6 @@ quill:
3
3
  version: 0.2.0
4
4
  backend: typst
5
5
  plate_file: plate.typ
6
- example_file: example.md
7
6
  description: U.S. Air Force and Space Force Official Memorandum
8
7
 
9
8
  main:
@@ -182,7 +181,7 @@ main:
182
181
  compact: true
183
182
  description: "Optional marking appended after double slash (e.g. NF with classification CUI renders as CUI//NF). Leave blank to show only the classification with no //."
184
183
 
185
- leaf_kinds:
184
+ card_kinds:
186
185
  indorsement:
187
186
  description: Chain of routing endorsements. Each endorsement block adds an official response or forwarding action to the original memo.
188
187
  ui:
@@ -353,7 +353,9 @@
353
353
  (if attachment-count == 1 { "Attachment" } else { str(attachment-count) + " Attachments" })
354
354
  + " (listed on next page):"
355
355
  )
356
- render-backmatter-section(attachments, section-label, numbering-style: "1.", continuation-label: continuation-label)
356
+ // AFH 33-337: a single attachment is not numbered; numbering applies to two or more.
357
+ let numbering-style = if attachment-count == 1 { none } else { "1." }
358
+ render-backmatter-section(attachments, section-label, numbering-style: numbering-style, continuation-label: continuation-label)
357
359
  }
358
360
 
359
361
  if cc != none and cc.len() > 0 {
@@ -69,9 +69,9 @@
69
69
  ..if "attachments" in data { (attachments: data.attachments) },
70
70
  )
71
71
 
72
- // Indorsements - iterate through LEAVES array and filter by KIND type
73
- #for (i, card) in data.LEAVES.enumerate() {
74
- if card.KIND == "indorsement" {
72
+ // Indorsements - iterate through CARDS array and filter by CARD tag
73
+ #for (i, card) in data.CARDS.enumerate() {
74
+ if card.CARD == "indorsement" {
75
75
  // The quillmark helper leaves an unset/whitespace-only markdown body as
76
76
  // the empty string `""`; only non-empty bodies are eval'd into content.
77
77
  // Pass truly empty content (`[]`) in the empty case so indorsement can
@@ -1,86 +0,0 @@
1
- ---
2
- QUILL: af4141@0.1
3
- # EDIT: Full name in Last, First, Middle Initial format
4
- name: "LAST, FIRST M."
5
- # EDIT: Unit of assignment (e.g., "1 ACCS/DOT", "726 ACS/MOC")
6
- unit: "UNIT/SYMBOL"
7
- # EDIT: Current grade or CCC level (e.g., "SSgt", "GS-12", "3")
8
- grade: "GRADE"
9
- # EDIT: Commander's authentication entry — often a commander's name/signature block or "Verified by unit commander"
10
- commanders_auth: ""
11
- ---
12
-
13
- <!-- ═══════════════════════════════════════════════════════════════
14
- RECORD OF EXPERIENCE LEAVES
15
- Each card below becomes one row in the experience table.
16
- Page 1 holds up to 16 rows; Page 2 holds up to 21 rows (37 max).
17
-
18
- Required reportable actions include:
19
- • Initial/subsequent duty assignment
20
- • Written and/or positional upgrade evaluations
21
- • Certification events (Mission Ready, Senior Director, etc.)
22
- • Downgrade or decertification
23
- • PCS/PCA departure
24
- • Temporary duty of significant duration
25
- • Any other commander-directed entry
26
-
27
- Leave blank any columns that do not apply to a given entry.
28
- ═══════════════════════════════════════════════════════════════ -->
29
-
30
- <!-- Example 1: Initial assignment to a unit -->
31
- ---
32
- KIND: experience
33
- date: 2025-01-15
34
- action: "Assigned to 1 ACCS/DOT as Weapons Director"
35
- written_grade: ""
36
- written_grade_date: 2025-01-15
37
- positional_grade: ""
38
- positional_grade_date: 2025-01-15
39
- auth_or_remarks: "Initial assignment"
40
- ---
41
-
42
- <!-- Example 2: Written upgrade evaluation -->
43
- ---
44
- KIND: experience
45
- date: 2025-03-15
46
- action: "Completed written upgrade evaluation for 3-Level"
47
- written_grade: "3"
48
- written_grade_date: 2025-03-15
49
- positional_grade: ""
50
- positional_grade_date: 2025-03-15
51
- auth_or_remarks: "Per AFMAN 13-1CRCV1"
52
- ---
53
-
54
- <!-- Example 3: Positional (live-environment) upgrade / certification -->
55
- ---
56
- KIND: experience
57
- date: 2025-06-20
58
- action: "Certified Mission Ready — positional upgrade"
59
- written_grade: ""
60
- written_grade_date: 2025-06-20
61
- positional_grade: "4"
62
- positional_grade_date: 2025-06-20
63
- auth_or_remarks: "SSgt Jones, T.R."
64
- ---
65
-
66
- <!-- Example 4: Combined written + positional upgrade (both columns filled) -->
67
- ---
68
- KIND: experience
69
- date: 2025-08-01
70
- action: "Upgrade evaluation — written and positional"
71
- written_grade: "4"
72
- written_grade_date: 2025-08-01
73
- positional_grade: "4"
74
- positional_grade_date: 2025-08-01
75
- auth_or_remarks: "Verified by unit commander"
76
- ---
77
-
78
- <!-- Example 5: PCS departure — no written/positional grade; omit grade dates (or use "") -->
79
- ---
80
- KIND: experience
81
- date: 2025-09-01
82
- action: "PCS to 726 ACS/MOC, Tinker AFB OK"
83
- written_grade: ""
84
- positional_grade: ""
85
- auth_or_remarks: "Outprocessed 1 ACCS/DOT"
86
- ---
@@ -1,23 +0,0 @@
1
- ---
2
- QUILL: daf1206@0.1.0
3
- award: "CY2018 Stripes for Exceptional Performers II Board"
4
- category_if_applicable: "Senior Master Sgt"
5
- award_period: "N/A"
6
- rankname_of_nominee: "Smith, John Q., SMSgt"
7
- majcom_fldcom_foa_or_dru: "MAJCOM of Assignment"
8
- dafsc_duty_title: "3F071/NCOIC, 123rd Force Support Squadron"
9
- nominees_telephone_dsn_commercial: "DSN XXXX-XXXX, Comm (XXX) XXX-XXXX"
10
- unit_office_symbol_street_address_base_state_zip: "123 FSS/FMSPD, Someplace AFB, CO XXXXX"
11
- unit_commander_rank_name_and_telephone: "Lt Col Jane C. Doe, DSN XXX-XXXXXXX, Comm (XXX) XXX-XXXX"
12
- ---
13
-
14
- Use this main body for page 1 accomplishments.
15
- - Keep bullet format.
16
- - Replace all placeholder values.
17
-
18
- ---
19
- KIND: accomplishments_continued
20
- ---
21
-
22
- Use this card body only if page 2 overflow is needed.
23
- - Add continuation bullets here.
@@ -1,34 +0,0 @@
1
- ---
2
- QUILL: daf4392
3
-
4
- transportation_mode: "other"
5
- departure_date: 2026-03-26
6
- final_destination: "123 Sesame St, Fake City, MS"
7
- notes: "Visiting Donald Duck over 3 day weekend."
8
- organization: "333 TRS"
9
- briefed_date: 2026-03-25
10
- briefee_name: "Doe, Jane"
11
- briefee_grade: "O-1"
12
- briefer_name: ""
13
- briefer_grade: ""
14
- emergency_contact_name: "John Doe"
15
- emergency_contact_phone: "999-999-9999"
16
- ---
17
-
18
- ---
19
- KIND: itinerary
20
- date: 2026-03-26
21
- departure_point: "Biloxi, MS"
22
- arrival_point: "Fake City, MS"
23
- rest_length: "2 days"
24
- mileage: "250"
25
- ---
26
-
27
- ---
28
- KIND: itinerary
29
- date: 2026-03-29
30
- departure_point: "Fake City, MS"
31
- arrival_point: "Biloxi, MS"
32
- rest_length: "0"
33
- mileage: "0"
34
- ---
@@ -1,56 +0,0 @@
1
- ---
2
- # Essential
3
- #===========
4
- QUILL: usaf_memo@0.2.0
5
- letterhead_title: DEPARTMENT OF THE AIR FORCE
6
- letterhead_caption:
7
- - HEADQUARTERS YOUR UNIT NAME
8
- date: 2504-10-05
9
- memo_for:
10
- - ORG/SYMBOL # Organization/office symbol in UPPERCASE
11
- # - DISTRIBUTION # For numerous recipients, use 'DISTRIBUTION' and list them below
12
- memo_from:
13
- - ORG/SYMBOL
14
- - Organization Name
15
- - 123 Street Ave
16
- - City ST 12345-6789
17
- subject: Subject of the Memorandum
18
-
19
- # Optional
20
- #===========
21
- references:
22
- - AFM 33-326, 31 July 2019, Preparing Official Communications
23
- cc:
24
- - ORG/SYMBOL
25
- distribution:
26
- - 1st ORG/SYMBOL
27
- attachments:
28
- - Attachment description, YYYY MMM DD
29
- signature_block:
30
- - FIRST M. LAST, Rank, USAF
31
- - Duty Title
32
- tag_line: Aim High
33
- classification: UNCLASSIFIED
34
- ---
35
-
36
- The `usaf_memo` Quill package takes care of all 33-337 formatting details. Focus on the content.
37
-
38
- **Numbering** Top-level paragraphs like this one are automatically numbered. NEVER manually number your paragraphs.
39
-
40
- - Use bullets for hierarchical paragraph nesting. These are automatically numbered or lettered as well.
41
- - Up to five levels of paragraphs are supported
42
-
43
- Do not include a complimentary close (e.g. "Respectfully,") in official memorandums.
44
-
45
- ---
46
- KIND: indorsement
47
- for: ORG/SYMBOL
48
- format: standard
49
- from: ORG/SYMBOL
50
- action: undecided
51
- signature_block:
52
- - FIRST M. LAST, Rank, USAF
53
- - Duty Title
54
- ---
55
-
56
- This body and the metdata above are an indorsement card. Multiple or no indorsements leaves can be used.