@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.
Files changed (38) hide show
  1. package/README.md +79 -31
  2. package/package.json +7 -5
  3. package/quills/af4141/0.1.0/Quill.yaml +21 -11
  4. package/quills/af4141/0.1.0/packages/typst-af4141/lib.typ +17 -3
  5. package/quills/af4141/0.1.0/plate.typ +12 -5
  6. package/quills/daf1206/0.1.0/Quill.yaml +3 -1
  7. package/quills/daf4392/0.1.0/Quill.yaml +12 -9
  8. package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/fonts/GNU General Public License.txt +340 -0
  9. package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/fonts/NimbusRomNo9L-Med.otf +0 -0
  10. package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/fonts/NimbusRomNo9L-MedIta.otf +0 -0
  11. package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/fonts/NimbusRomNo9L-Reg.otf +0 -0
  12. package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/fonts/NimbusRomNo9L-RegIta.otf +0 -0
  13. package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/lib.typ +21 -4
  14. package/quills/daf4392/0.1.0/plate.typ +1 -1
  15. package/quills/usaf_memo/0.2.0/Quill.yaml +47 -42
  16. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/Cinzel[wght].ttf +0 -0
  17. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/indorsement.typ +57 -24
  18. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/utils.typ +33 -4
  19. package/quills/usaf_memo/0.2.0/plate.typ +19 -14
  20. package/quills/af4141/0.1.0/assets/Figtree-Bold.ttf +0 -0
  21. package/quills/af4141/0.1.0/assets/Figtree-Italic.ttf +0 -0
  22. package/quills/af4141/0.1.0/assets/Figtree-Regular.ttf +0 -0
  23. package/quills/af4141/0.1.0/design/TASK.md +0 -20
  24. package/quills/af4141/0.1.0/design/af4141.pdf +0 -0
  25. package/quills/daf1206/0.1.0/DAFForm_1206_prepared.pdf +0 -0
  26. package/quills/daf4392/0.1.0/assets/arimo-v35-latin-700.ttf +0 -0
  27. package/quills/daf4392/0.1.0/assets/arimo-v35-latin-700italic.ttf +0 -0
  28. package/quills/daf4392/0.1.0/assets/arimo-v35-latin-italic.ttf +0 -0
  29. package/quills/daf4392/0.1.0/assets/arimo-v35-latin-regular.ttf +0 -0
  30. package/quills/usaf_memo/0.2.0/.quillignore +0 -31
  31. package/quills/usaf_memo/0.2.0/assets/Freedom250_USAF.png +0 -0
  32. package/quills/usaf_memo/0.2.0/assets/Freedom250_USSF.png +0 -0
  33. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/Cinzel-Regular.ttf +0 -0
  34. /package/quills/af4141/0.1.0/{assets → packages/typst-af4141/fonts}/GNU General Public License.txt +0 -0
  35. /package/quills/af4141/0.1.0/{assets → packages/typst-af4141/fonts}/NimbusRomNo9L-Med.otf +0 -0
  36. /package/quills/af4141/0.1.0/{assets → packages/typst-af4141/fonts}/NimbusRomNo9L-MedIta.otf +0 -0
  37. /package/quills/af4141/0.1.0/{assets → packages/typst-af4141/fonts}/NimbusRomNo9L-Reg.otf +0 -0
  38. /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: Addressing
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: Addressing
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: Addressing
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: Addressing
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: Letterhead
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: Letterhead
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: Letterhead
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: Letterhead
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: markdown
102
+ type: richtext
103
+ inline: true
96
104
  default: ""
97
105
  ui:
98
- group: Letterhead
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: Classification
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: Classification
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: Classification
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: Classification
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: Classification
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: Classification
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: markdown
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: Additional
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: Additional
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: Additional
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: Additional
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: Additional
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: Additional
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: datetime
232
+ type: date
232
233
  default: ""
233
234
  ui:
234
- group: Additional
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: Addressing
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: Addressing
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: Addressing
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: Additional
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: Additional
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: datetime
295
+ type: date
291
296
  default: ""
292
297
  ui:
293
- group: Additional
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 use today's date."
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."
@@ -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
- [#indorsement_label to #original_from, #display-date(original_date, memo-style: memo-style), #original_subject]
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
- blank-line()
97
- grid(
98
- columns: (auto, 1fr),
99
- [#indorsement_label, #ind_from], align(right)[#if actual_date != none { display-date(actual_date, memo-style: memo-style) }],
100
- )
101
-
102
- blank-line()
103
- grid(
104
- columns: (auto, auto, 1fr),
105
- "MEMORANDUM FOR", " ", ind_for,
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
- /// - String: shown as-is (use for fixed text like placeholders).
93
- /// - datetime: USAF style `DD Month YYYY`; DAF style `Month DD, YYYY`.
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.display(pattern)
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 configuration
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). Default to today when
97
- // the card omits or leaves the date blank.
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
- datetime.today()
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("Ind_" + str(i) + "_Signature"),
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) },
@@ -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}`
@@ -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/