@orbat-mapper/control-measures 0.2.0-alpha.1 → 0.2.0-alpha.11

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 (60) hide show
  1. package/README.md +16 -3
  2. package/dist/index-C6nqkw1A.d.mts +2552 -0
  3. package/dist/index.d.mts +2 -1441
  4. package/dist/index.mjs +16 -5516
  5. package/dist/preview/index.d.mts +115 -0
  6. package/dist/preview/index.mjs +365 -0
  7. package/dist/renderControlMeasure-NKEYq3Fg.mjs +9799 -0
  8. package/media/airborne-attack.svg +1 -1
  9. package/media/ambush.svg +1 -1
  10. package/media/antitank-ditch-completed.svg +1 -1
  11. package/media/antitank-ditch-under-construction.svg +1 -1
  12. package/media/antitank-wall.svg +1 -1
  13. package/media/area-of-operations.svg +1 -0
  14. package/media/assembly-area.svg +1 -0
  15. package/media/attack-by-fire.svg +1 -1
  16. package/media/attack-helicopter.svg +1 -1
  17. package/media/battle-handover-line.svg +1 -0
  18. package/media/battle-position.svg +1 -0
  19. package/media/block-arrow.svg +1 -1
  20. package/media/block-mission-task.svg +1 -1
  21. package/media/block.svg +1 -1
  22. package/media/boundary.svg +1 -0
  23. package/media/breach.svg +1 -1
  24. package/media/bypass.svg +1 -1
  25. package/media/canalize.svg +1 -1
  26. package/media/circle.svg +1 -0
  27. package/media/classic-arrow.svg +1 -1
  28. package/media/clear.svg +1 -1
  29. package/media/delay.svg +1 -1
  30. package/media/disrupt.svg +1 -1
  31. package/media/encirclement.svg +1 -0
  32. package/media/engineer-work-line.svg +1 -0
  33. package/media/final-protective-fire-left.svg +1 -1
  34. package/media/final-protective-fire-right.svg +1 -1
  35. package/media/fix.svg +1 -1
  36. package/media/flot.svg +1 -1
  37. package/media/fortified-area.svg +1 -1
  38. package/media/fortified-line.svg +1 -1
  39. package/media/generic-c2-line.svg +1 -0
  40. package/media/handover-line.svg +1 -0
  41. package/media/isolate.svg +1 -1
  42. package/media/joint-tactical-action-area.svg +1 -0
  43. package/media/landing-zone.svg +1 -0
  44. package/media/light-line.svg +1 -0
  45. package/media/line.svg +1 -0
  46. package/media/main-attack.svg +1 -1
  47. package/media/obstacle-bypass-difficult.svg +1 -1
  48. package/media/obstacle-bypass-easy.svg +1 -1
  49. package/media/obstacle-bypass-impossible.svg +1 -1
  50. package/media/phase-line.svg +1 -0
  51. package/media/pickup-zone.svg +1 -0
  52. package/media/polygon.svg +1 -0
  53. package/media/principal-direction-of-fire.svg +1 -1
  54. package/media/rectangle.svg +1 -0
  55. package/media/search-area.svg +1 -1
  56. package/media/strong-point.svg +1 -0
  57. package/media/support-by-fire.svg +1 -1
  58. package/media/supporting-attack.svg +1 -1
  59. package/media/turn.svg +1 -1
  60. package/package.json +2 -1
@@ -0,0 +1,2552 @@
1
+ import { Feature, FeatureCollection, Geometry, LineString, MultiLineString, MultiPolygon, Point, Polygon, Position } from "geojson";
2
+
3
+ //#region src/internal/api-utils.d.ts
4
+ type ValidationMode = "silent" | "warn" | "throw";
5
+ //#endregion
6
+ //#region src/draw-rules/types.d.ts
7
+ interface AnchorTransformEvent {
8
+ previous: readonly Position[];
9
+ next: readonly Position[];
10
+ activePointIndex?: number;
11
+ }
12
+ interface ControlMeasureDrawRule {
13
+ readonly id: string;
14
+ readonly minimumUserPoints: number;
15
+ readonly canonicalPointCount?: number;
16
+ /**
17
+ * Number of raw (clicked + rubber-band) points at which `derive` can already
18
+ * produce a renderable canonical shape, so the draw controller renders a live
19
+ * symbol preview instead of the bare vertex-marker outline. Lets a measure
20
+ * show feedback before the full `minimumUserPoints` commit threshold is
21
+ * reached — e.g. Area21 pads two points (first click + cursor) up to its
22
+ * three-point search-area shape. Must be <= `minimumUserPoints`. Defaults to
23
+ * `minimumUserPoints` (no early preview).
24
+ */
25
+ readonly minimumPreviewPoints?: number;
26
+ /**
27
+ * Opt a fixed-length draw into the standard dashed interaction guide. Fixed
28
+ * shapes suppress guides by default because their generator preview is
29
+ * normally sufficient. Use this when the guide communicates an incomplete
30
+ * construction state, such as Rectangle's P1-P2 baseline.
31
+ */
32
+ readonly showGuide?: boolean;
33
+ /**
34
+ * Convert raw draw points into the spine rendered by the interaction guide.
35
+ * Defaults to the raw points. A rule may return the first point again at the
36
+ * end when it needs to provide its own closed guide geometry.
37
+ */
38
+ guidePoints?(points: readonly Position[]): Position[];
39
+ /**
40
+ * Number of trailing slots in the canonical control-point array that are
41
+ * NOT user-clicked spine vertices. For Axis1, this is 1 (the width handle
42
+ * at index N-1). Drives four behaviors in TacticalDraw:
43
+ * 1. New clicks insert at `length - trailingFixedSlots` (not appended).
44
+ * 2. Midpoint handles render only between segments inside
45
+ * [0 .. length - 1 - trailingFixedSlots].
46
+ * 3. The "click the last added point to commit" hit test uses
47
+ * `committed[length - 1 - trailingFixedSlots]`.
48
+ * 4. `canCommit` evaluates `length - trailingFixedSlots >= minimumUserPoints`.
49
+ * Defaults to 0 (the entire array is user-clicked spine). See ADR-0008.
50
+ */
51
+ readonly trailingFixedSlots?: number;
52
+ /**
53
+ * The user-spine points form a closed ring even though the first point is not
54
+ * duplicated at the end. TacticalDraw uses this to treat the last→first edge
55
+ * like every other edge for completion and midpoint insertion.
56
+ */
57
+ readonly closedRing?: boolean;
58
+ derive(points: readonly Position[]): Position[];
59
+ transform(event: AnchorTransformEvent): Position[];
60
+ }
61
+ //#endregion
62
+ //#region src/text-amplifiers.d.ts
63
+ /**
64
+ * MIL-STD-2525E Appendix L Table L-II text amplifier fields.
65
+ *
66
+ * A control measure instance carries free-text amplifier fields (unique
67
+ * designation, country, date-time group, …) keyed by their doctrinal field
68
+ * code. Repeated fields use numbered suffixes per the standard (`T`, `T1`,
69
+ * `AS1`, `W1`, …). Graphic amplifiers (echelon `B`, direction of movement `Q`,
70
+ * offset location `BA`) are deliberately excluded — they are geometry
71
+ * concerns, rendered from generator options rather than free text.
72
+ *
73
+ * This module is a leaf: it imports nothing from `./metadata` or
74
+ * `./registry`, so both can depend on it without a cycle.
75
+ */
76
+ type Suffix = "" | "1" | "2";
77
+ /** Doctrinal text amplifier field codes (Table L-II); graphic amplifier fields excluded. */
78
+ type TextAmplifierField = "C" | "H" | "N" | "T" | "V" | "W" | "X" | "Y" | "AM" | "AN" | "AP" | "AS";
79
+ /** A doctrinal field code with its optional repetition suffix, e.g. `"T1"`. */
80
+ type TextAmplifierKey = `${TextAmplifierField}${Suffix}`;
81
+ /**
82
+ * The vocabulary of text amplifier fields: doctrinal code, milsymbol-style
83
+ * friendly alias, and a human-readable label. The single source of truth for
84
+ * both the runtime catalog and the derived alias→code lookup used by
85
+ * {@link normalizeTextAmplifiers}.
86
+ */
87
+ declare const TEXT_AMPLIFIER_FIELDS: {
88
+ readonly C: {
89
+ readonly alias: "quantity";
90
+ readonly label: "Quantity";
91
+ };
92
+ readonly H: {
93
+ readonly alias: "additionalInformation";
94
+ readonly label: "Additional information";
95
+ };
96
+ readonly N: {
97
+ readonly alias: "hostile";
98
+ readonly label: "Hostile (ENY) marker";
99
+ };
100
+ readonly T: {
101
+ readonly alias: "uniqueDesignation";
102
+ readonly label: "Unique designation";
103
+ };
104
+ readonly V: {
105
+ readonly alias: "type";
106
+ readonly label: "Equipment/type";
107
+ };
108
+ readonly W: {
109
+ readonly alias: "dtg";
110
+ readonly label: "Date-time group / O/O";
111
+ };
112
+ readonly X: {
113
+ readonly alias: "altitudeDepth";
114
+ readonly label: "Altitude/depth";
115
+ };
116
+ readonly Y: {
117
+ readonly alias: "location";
118
+ readonly label: "Location";
119
+ };
120
+ readonly AM: {
121
+ readonly alias: "distance";
122
+ readonly label: "Distance/range/radius";
123
+ };
124
+ readonly AN: {
125
+ readonly alias: "azimuth";
126
+ readonly label: "Azimuth";
127
+ };
128
+ readonly AP: {
129
+ readonly alias: "targetNumber";
130
+ readonly label: "Target number";
131
+ };
132
+ readonly AS: {
133
+ readonly alias: "country";
134
+ readonly label: "Country code";
135
+ };
136
+ };
137
+ /** The milsymbol-style friendly alias for a text amplifier field, e.g. `"uniqueDesignation"`. */
138
+ type FriendlyName = (typeof TEXT_AMPLIFIER_FIELDS)[TextAmplifierField]["alias"];
139
+ /** A friendly alias with its optional repetition suffix, e.g. `"country1"`. */
140
+ type FriendlyKey = `${FriendlyName}${Suffix}`;
141
+ /**
142
+ * User-facing amplifier input: either canonical doctrinal keys (`T`, `AS1`,
143
+ * …) or friendly aliases (`uniqueDesignation`, `country1`, …), optionally
144
+ * mixed. Values are free text; see {@link normalizeTextAmplifiers} for how
145
+ * this is resolved to canonical form.
146
+ */
147
+ type TextAmplifiers = Partial<Record<TextAmplifierKey | FriendlyKey, string>>;
148
+ /** Amplifier values resolved to canonical doctrinal keys, as generators receive them. */
149
+ type CanonicalTextAmplifiers = Readonly<Partial<Record<TextAmplifierKey, string>>>;
150
+ /**
151
+ * Resolves any accepted key (canonical or friendly alias, with an optional
152
+ * `1`/`2` suffix) to its canonical key, or `undefined` if unknown — e.g.
153
+ * `"T"` → `"T"`, `"uniqueDesignation1"` → `"T1"`, `"bogus"` → `undefined`.
154
+ */
155
+ declare function canonicalTextAmplifierKey(key: string): TextAmplifierKey | undefined;
156
+ /**
157
+ * Resolves a `TextAmplifiers` record (canonical keys, friendly aliases, or a
158
+ * mix) to `CanonicalTextAmplifiers` keyed purely by doctrinal field code.
159
+ *
160
+ * - Friendly aliases (with an optional `1`/`2` suffix) map to their canonical
161
+ * code (e.g. `country1` → `AS1`).
162
+ * - Values are trimmed; entries that are empty/whitespace-only after
163
+ * trimming, or not strings, are dropped.
164
+ * - When both a canonical key and its friendly alias are present for the same
165
+ * field + suffix, the **canonical key wins** regardless of insertion order.
166
+ * This holds even for an empty/whitespace canonical value: it suppresses
167
+ * (clears) the alias entry rather than letting the alias survive.
168
+ * - Unknown keys are ignored.
169
+ *
170
+ * `undefined` or an empty input returns a shared frozen empty object.
171
+ */
172
+ declare function normalizeTextAmplifiers(input: TextAmplifiers | undefined): CanonicalTextAmplifiers;
173
+ //#endregion
174
+ //#region src/metadata.d.ts
175
+ type ControlMeasureGeometryType = Geometry["type"];
176
+ type ControlMeasureGeometry = "point" | "line" | "area";
177
+ declare const DRAW_RULE_IDS: readonly ["Area1", "Area7", "Area8", "Area11", "Area12", "Area15", "Area21", "Axis1", "Line1", "Line3", "Line9", "Line10", "Line23", "Line24", "Line29", "Point12", "Rectangle"];
178
+ type DrawRuleId = (typeof DRAW_RULE_IDS)[number];
179
+ interface BaseParamDescriptor {
180
+ key: string;
181
+ label: string;
182
+ description?: string;
183
+ visibleWhen?: (opts: Record<string, unknown>) => boolean;
184
+ }
185
+ interface NumberParamDescriptor extends BaseParamDescriptor {
186
+ type: "number";
187
+ min?: number;
188
+ max?: number;
189
+ step?: number;
190
+ unit?: string;
191
+ }
192
+ interface BooleanParamDescriptor extends BaseParamDescriptor {
193
+ type: "boolean";
194
+ }
195
+ interface ColorParamDescriptor extends BaseParamDescriptor {
196
+ type: "color";
197
+ }
198
+ interface EnumParamDescriptor extends BaseParamDescriptor {
199
+ type: "enum";
200
+ options: readonly {
201
+ label: string;
202
+ value: string | number | boolean;
203
+ }[];
204
+ }
205
+ interface TextParamDescriptor extends BaseParamDescriptor {
206
+ type: "text";
207
+ placeholder?: string;
208
+ maxLength?: number;
209
+ /**
210
+ * The doctrinal Table L-II field this free-text option renders (e.g.
211
+ * `phaseLineName` renders field `T`) — lets metadata-driven UIs (e.g. a
212
+ * label-placement preview) substitute a `<T>`-style placeholder for the
213
+ * option, the same way a `TextAmplifierDescriptor` does for a real
214
+ * amplifier field.
215
+ */
216
+ field?: TextAmplifierField;
217
+ }
218
+ type ParamDescriptor = NumberParamDescriptor | BooleanParamDescriptor | ColorParamDescriptor | TextParamDescriptor | EnumParamDescriptor;
219
+ /** Editor-facing description of one text amplifier field a measure accepts. */
220
+ interface TextAmplifierDescriptor {
221
+ key: TextAmplifierKey;
222
+ label: string;
223
+ description?: string;
224
+ placeholder?: string;
225
+ /** Editor hint only — the renderer never truncates the value. */
226
+ maxLength?: number;
227
+ }
228
+ interface ControlMeasureMetadata {
229
+ id: string;
230
+ name: string;
231
+ description: string;
232
+ entity: string;
233
+ entityType: string;
234
+ entitySubtype?: string;
235
+ value: string;
236
+ geometry: ControlMeasureGeometry;
237
+ minCoordinates?: number;
238
+ maxCoordinates?: number;
239
+ geometryTypes?: readonly ControlMeasureGeometryType[];
240
+ drawRule?: DrawRuleId;
241
+ /**
242
+ * Resolved draw rule object (anchor contract) attached by the registry when
243
+ * the kind's `drawRule` id has an implementation. Consumed by the
244
+ * `TacticalDraw` façade to drive click accumulation during draw and
245
+ * vertex-snap during edit — see ADR-0005.
246
+ */
247
+ rule?: ControlMeasureDrawRule;
248
+ params?: readonly ParamDescriptor[];
249
+ /** Text amplifier fields (MIL-STD-2525E Appendix L Table L-II) this measure accepts. */
250
+ textAmplifiers?: readonly TextAmplifierDescriptor[];
251
+ /**
252
+ * Marks a measure that emits a text label whose pixel size should be captured
253
+ * once at draw-commit time (rather than re-resolved on every zoom). Hosts use
254
+ * this to stamp default label sizing onto the committed measure — see
255
+ * `withCommittedAdapterMeasureOptions` in `tactical-draw`. Keeping it on the
256
+ * definition means adding such a measure stays a one-file change (ADR-0013).
257
+ */
258
+ capturesLabelSize?: boolean;
259
+ }
260
+ //#endregion
261
+ //#region src/define.d.ts
262
+ /**
263
+ * The loosest `FeatureCollection` a control-measure generator may emit: any
264
+ * geometry, with per-feature properties that the renderer normalizes.
265
+ */
266
+ type AnyFeatureCollection = FeatureCollection<Geometry, Record<string, unknown> | null>;
267
+ /**
268
+ * A generator's call signature, constrained only by its inputs and output. The
269
+ * options parameter is typed `never` so that a generator with *any* concrete
270
+ * options type satisfies the bound — function parameters are contravariant, so
271
+ * `(o: BlockOptions) => …` is assignable to `(o: never) => …`. The actual
272
+ * options type is recovered covariantly via {@link OptsOf}, never through this
273
+ * bound. See ADR-0013.
274
+ *
275
+ * The optional third parameter carries the instance's normalized text
276
+ * amplifiers (ADR-0027); a generator that ignores text amplifiers just omits
277
+ * the parameter — fewer params is still assignable to this bound.
278
+ */
279
+ type ControlMeasureGenerator = (controlPoints: Position[], options: never, textAmplifiers?: CanonicalTextAmplifiers) => AnyFeatureCollection;
280
+ /**
281
+ * Everything that defines one control measure, co-located with its generator.
282
+ * `registry.ts` collects these into the single `DEFINITIONS` map, from which
283
+ * the `ControlMeasureId` union, `OptionsByKind`, the generator dispatch, the
284
+ * default options, and rule resolution are all derived rather than maintained
285
+ * as parallel tables. See ADR-0013.
286
+ */
287
+ interface ControlMeasureDefinition<Id extends string, G extends ControlMeasureGenerator> {
288
+ /** Catalog metadata; `id` is pinned to the record's literal key. */
289
+ metadata: ControlMeasureMetadata & {
290
+ id: Id;
291
+ };
292
+ /** Pure generator: control points (+ options) → GeoJSON features. */
293
+ generator: G;
294
+ /** Default options, tied to the generator's own options parameter. */
295
+ defaultOptions: NonNullable<Parameters<G>[1]>;
296
+ /**
297
+ * Resolved draw-rule object, merged back onto metadata by the registry. The
298
+ * doctrinal `drawRule` spec id stays on `metadata` (ADR-0005); the registry
299
+ * guards that `rule` agrees with it. See ADR-0013.
300
+ */
301
+ rule?: ControlMeasureDrawRule;
302
+ /**
303
+ * Representative sample used only by the static catalog/thumbnail previews
304
+ * (the `/preview` subpath). Most measures omit it and fall back to a generic
305
+ * layout keyed off `geometry`/`minCoordinates`/`entityType`; a measure whose
306
+ * symbol needs special framing co-locates the override here rather than in a
307
+ * central per-id switch. Points are **unitless** (~`[-1, 1]`); the resolver
308
+ * scales them to the small degree offsets the projected-meter generators
309
+ * expect. `options` is type-checked against this measure's own options. See
310
+ * ADR-0025.
311
+ */
312
+ previewSample?: PreviewSample<NonNullable<Parameters<G>[1]>>;
313
+ /**
314
+ * Pins orientation-derived defaults — options whose default value depends on
315
+ * the shape's current screen orientation (e.g. Battle Position's echelon
316
+ * anchor, which defaults to the bottom edge) — to their current concrete
317
+ * values. Returns an options patch to merge onto the working options, or
318
+ * `undefined` when there is nothing to freeze (already frozen, or nothing
319
+ * visible to pin). Called by edit hosts when a rotate gesture starts, so a
320
+ * subsequent rigid rotation of the control points preserves the rendered
321
+ * appearance instead of an orientation-relative default silently re-deriving
322
+ * against the new orientation. See ADR-0023.
323
+ */
324
+ freezeOrientation?: (controlPoints: Position[], options: NonNullable<Parameters<G>[1]>) => Partial<NonNullable<Parameters<G>[1]>> | undefined;
325
+ }
326
+ /**
327
+ * A measure's representative preview input. Shared between the typed
328
+ * {@link ControlMeasureDefinition} field and the erased
329
+ * {@link AnyControlMeasureDefinition}; `Options` is the measure's own options
330
+ * type (or `unknown` once erased). See ADR-0025.
331
+ */
332
+ interface PreviewSample<Options> {
333
+ controlPoints: readonly (readonly [number, number])[];
334
+ options?: Partial<Options>;
335
+ /**
336
+ * Sample text amplifiers (ADR-0027) rendered onto the representative
337
+ * preview, for measures whose doctrinal appearance is carried by amplifier
338
+ * text (e.g. Boundary-style end/center labels) rather than options alone.
339
+ */
340
+ textAmplifiers?: TextAmplifiers;
341
+ }
342
+ /**
343
+ * Extracts a definition's options type covariantly from its generator's
344
+ * (optional) second parameter — robust where inferring through the
345
+ * contravariant parameter position is not. See ADR-0013.
346
+ */
347
+ type OptsOf<D> = D extends {
348
+ generator: (points: Position[], options?: infer O) => unknown;
349
+ } ? O : never;
350
+ //#endregion
351
+ //#region src/generators/cm11-command-control-lines/boundary.d.ts
352
+ /** Configuration options for the Boundary control measure. */
353
+ interface BoundaryOptions {
354
+ /**
355
+ * Field B echelon. One of the keys in {@link ECHELONS} (e.g. `"battalion"`,
356
+ * `"division"`) or an equivalent symbol form (`"II"`, `"XX"`). `"none"`,
357
+ * empty, or unknown renders no glyph and leaves the line continuous.
358
+ * @default "battalion"
359
+ */
360
+ echelon?: string;
361
+ /**
362
+ * Echelon glyph height in meters (ground-anchored). Ignored when
363
+ * `echelonSizePixels` is supplied together with `metersPerPixel`.
364
+ * @default 750
365
+ */
366
+ echelonSize?: number;
367
+ /**
368
+ * Echelon glyph height in screen pixels (screen-anchored). Resolved to meters
369
+ * against `metersPerPixel`; bakes to a meter size on draw/edit commit
370
+ * (ADR-0020).
371
+ * @default 16
372
+ */
373
+ echelonSizePixels?: number;
374
+ /**
375
+ * Gap left on each side of the echelon glyph, as a ratio of the glyph height.
376
+ * `0` butts the line against the glyph; larger values widen the break.
377
+ * @default 0.3
378
+ */
379
+ echelonPadding?: number;
380
+ /**
381
+ * Meters-per-pixel at the current zoom/latitude. Stamped by the host when the
382
+ * measure is screen-anchored; required to resolve `echelonSizePixels` and to
383
+ * lock the T/AS text size to the glyph height.
384
+ */
385
+ metersPerPixel?: number;
386
+ /**
387
+ * Number of label groups (echelon + designators), spaced evenly by cumulative
388
+ * arc length along the whole boundary. `1` places a single group at the
389
+ * midpoint of the total length (which may fall on any segment).
390
+ * @default 1
391
+ */
392
+ labelRepetitions?: number;
393
+ /**
394
+ * Spacing between label groups when `labelRepetitions > 1`, relative to an even
395
+ * spread across the whole boundary. `1` spreads them evenly end-to-end; `<1`
396
+ * clusters them toward the midpoint; `>1` pushes them toward the ends
397
+ * (clamped to the boundary). No effect for a single group.
398
+ * @default 1
399
+ */
400
+ labelSpacing?: number;
401
+ /**
402
+ * Clearance between the line/echelon glyph and the unit labels, as a ratio
403
+ * of the echelon glyph height (like `echelonPadding`). In `"along"` mode
404
+ * (and on `"standard"` east–west segments) it grows the labels'
405
+ * perpendicular offset from the line; in a `"standard"` north–south crossing
406
+ * row it grows each label's gap to the echelon glyph. Negative values clamp
407
+ * to 0.
408
+ * @default 0.4
409
+ */
410
+ labelPadding?: number;
411
+ /**
412
+ * How the T/AS unit labels and the echelon glyph are oriented:
413
+ *
414
+ * - `"along"` — text runs along the line, offset perpendicular to it, and
415
+ * the echelon glyph turns with the segment (the default).
416
+ * - `"standard"` — MIL-STD-2525E Appendix L §L.5.5.2 / Figure L-10
417
+ * placement. On mostly east–west segments this reads exactly like
418
+ * `"along"`. On mostly north–south segments the whole group rotates to run
419
+ * *perpendicular* to the line instead: a single row of
420
+ * `<unit 1> <echelon> <unit 2>` crossing it (unit 1 on its left-of-travel
421
+ * side), each label aligned away from the glyph so long designations never
422
+ * overlap the line.
423
+ * @default "along"
424
+ */
425
+ labelOrientation?: "along" | "standard";
426
+ /**
427
+ * Round the boundary's corners by curving it through the control points
428
+ * (centripetal Catmull-Rom spline). The spline preserves the endpoints, so
429
+ * the line still meets its drawn anchors.
430
+ * @default false
431
+ */
432
+ smooth?: boolean;
433
+ /**
434
+ * Number of samples per segment when `smooth` is enabled. Higher values yield
435
+ * a denser, smoother curve.
436
+ * @default 12
437
+ */
438
+ smoothResolution?: number;
439
+ }
440
+ /** Default options for the Boundary control measure. */
441
+ declare const DEFAULT_BOUNDARY_OPTIONS: BoundaryOptions;
442
+ /**
443
+ * Creates a Boundary control measure: a polyline through `positions` carrying
444
+ * repeated echelon + unit-designator labels.
445
+ *
446
+ * @param positions - Boundary anchor points (≥2); the input contract is
447
+ * enforced at the render seam (ADR-0014).
448
+ * @param options - {@link BoundaryOptions}.
449
+ * @param textAmplifiers - Normalized text amplifiers (ADR-0027): `T`/`AS` label
450
+ * unit 1 (left-of-travel side), `T1`/`AS1` label unit 2 (right-of-travel side).
451
+ */
452
+ declare function createBoundary(positions: Position[], options?: BoundaryOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<MultiLineString | MultiPolygon | Point>;
453
+ //#endregion
454
+ //#region src/projection.d.ts
455
+ type Point2D = [number, number];
456
+ /**
457
+ * Project WGS84 (Lon/Lat) to Web Mercator (Meters).
458
+ */
459
+ declare const project: (lon: number, lat: number) => Point2D;
460
+ /**
461
+ * Unproject Web Mercator (Meters) back to WGS84 (Lon/Lat).
462
+ */
463
+ declare const unproject: (x: number, y: number) => Position;
464
+ //#endregion
465
+ //#region src/internal/sketch.d.ts
466
+ /**
467
+ * Shared `smooth`/`smoothResolution` option pair for free n-point polyline
468
+ * measures (draw rule Line1): curves the rendered path through the control
469
+ * points via a centripetal Catmull-Rom spline. The spline preserves the
470
+ * endpoints, so the line still meets its drawn anchors, and is a no-op for
471
+ * fewer than three control points (a single segment cannot be smoothed).
472
+ */
473
+ interface SmoothLineOptions {
474
+ /**
475
+ * Round the line's corners by curving the path through the control points
476
+ * (centripetal Catmull-Rom spline). The spline preserves the endpoints, so
477
+ * the line still meets its drawn anchors.
478
+ * @default false
479
+ */
480
+ smooth?: boolean;
481
+ /**
482
+ * Number of samples per segment when `smooth` is enabled. Higher values
483
+ * yield a denser, smoother curve.
484
+ * @default (varies per measure)
485
+ */
486
+ smoothResolution?: number;
487
+ }
488
+ //#endregion
489
+ //#region src/internal/line-labels.d.ts
490
+ /**
491
+ * Label sizing per the size-anchor model (ADR-0020, ADR-0028): the presence of
492
+ * `labelSizePixels` marks the labels screen-anchored; `labelSize` alone is
493
+ * ground-anchored. Carrying both behaves screen-anchored (pixels win),
494
+ * matching the geometry options' precedence.
495
+ */
496
+ interface LabelSizeOptions {
497
+ /** Text height in projected meters — ground-anchored label size (ADR-0028). */
498
+ labelSize?: number;
499
+ /** Text height in CSS pixels — screen-anchored label size (ADR-0028). */
500
+ labelSizePixels?: number;
501
+ /**
502
+ * Meters-per-pixel at the current view. Stamped by the host when the labels
503
+ * are screen-anchored; resolves `labelSizePixels` to the projected-meter
504
+ * height that meter-denominated placement (offsets, gaps, row pitch) needs.
505
+ */
506
+ metersPerPixel?: number;
507
+ }
508
+ /** Shared placement options for the fixed-end-label line measures. */
509
+ interface LineLabelOptions extends LabelSizeOptions {
510
+ /**
511
+ * Extra clearance between the line and its labels, as a ratio of the
512
+ * label's resolved text height (`labelSize`, or `labelSizePixels ×
513
+ * metersPerPixel`), like Boundary's `labelPadding`. Negative values clamp
514
+ * to 0. Only effective when a label size resolves — the no-size fallback
515
+ * offset is a fixed meter value, unaffected by this ratio.
516
+ * @default 0
517
+ */
518
+ labelPadding?: number;
519
+ }
520
+ //#endregion
521
+ //#region src/generators/cm11-command-control-lines/light-line.d.ts
522
+ /** Configuration options for the Light line control measure. */
523
+ interface LightLineOptions extends LineLabelOptions, SmoothLineOptions {
524
+ /**
525
+ * Optional phase line naming: renders `PL <name>` just beyond each end of
526
+ * the line, additive to the fixed "LL" labels. Empty or whitespace-only
527
+ * renders no label.
528
+ * @default none
529
+ */
530
+ phaseLineName?: string;
531
+ /**
532
+ * Prefix the `phaseLineName` label with "PL" (`"PL DAVID"`, or a bare
533
+ * "DAVID" when `false`). No effect when `phaseLineName` is empty — unlike
534
+ * Phase Line itself, this measure already carries its own fixed "LL"
535
+ * label, so there is no bare "PL" fallback.
536
+ * @default true
537
+ */
538
+ includePrefix?: boolean;
539
+ }
540
+ /** Default options for the Light line control measure. */
541
+ declare const DEFAULT_LIGHT_LINE_OPTIONS: LightLineOptions;
542
+ /**
543
+ * Creates a Light line control measure: a polyline through `positions`
544
+ * labeled "LL" above the line near each end.
545
+ */
546
+ declare function createLightLine(positions: Position[], options?: LightLineOptions): FeatureCollection<LineString | Point>;
547
+ //#endregion
548
+ //#region src/generators/cm11-command-control-lines/engineer-work-line.d.ts
549
+ /** Configuration options for the Engineer work line control measure. */
550
+ interface EngineerWorkLineOptions extends LineLabelOptions, SmoothLineOptions {
551
+ /**
552
+ * Optional phase line naming: renders `PL <name>` just beyond each end of
553
+ * the line, additive to the fixed "EWL" labels. Empty or whitespace-only
554
+ * renders no label.
555
+ * @default none
556
+ */
557
+ phaseLineName?: string;
558
+ /**
559
+ * Prefix the `phaseLineName` label with "PL" (`"PL DAVID"`, or a bare
560
+ * "DAVID" when `false`). No effect when `phaseLineName` is empty — unlike
561
+ * Phase Line itself, this measure already carries its own fixed "EWL"
562
+ * label, so there is no bare "PL" fallback.
563
+ * @default true
564
+ */
565
+ includePrefix?: boolean;
566
+ }
567
+ /** Default options for the Engineer work line control measure. */
568
+ declare const DEFAULT_ENGINEER_WORK_LINE_OPTIONS: EngineerWorkLineOptions;
569
+ /**
570
+ * Creates an Engineer work line control measure: a polyline through
571
+ * `positions` labeled "EWL" above the line near each end, plus one center
572
+ * label group at the midpoint of the total arc length carrying the
573
+ * responsible units' Field T/AS designator+country (left-of-travel side
574
+ * above the line, T1/AS1 below). No center group is emitted when all four
575
+ * amplifiers are empty.
576
+ */
577
+ declare function createEngineerWorkLine(positions: Position[], options?: EngineerWorkLineOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<LineString | Point>;
578
+ //#endregion
579
+ //#region src/generators/cm11-command-control-lines/generic-c2-line.d.ts
580
+ /** Configuration options for the Generic command and control line. */
581
+ interface GenericC2LineOptions extends LineLabelOptions, SmoothLineOptions {
582
+ /**
583
+ * Optional phase line naming: renders `PL <name>` just beyond each end of
584
+ * the line, additive to the H/T/W/W1 amplifier labels. Empty or
585
+ * whitespace-only renders no label.
586
+ * @default none
587
+ */
588
+ phaseLineName?: string;
589
+ /**
590
+ * Prefix the `phaseLineName` label with "PL" (`"PL DAVID"`, or a bare
591
+ * "DAVID" when `false`). No effect when `phaseLineName` is empty — this
592
+ * measure already carries its own H/T/W/W1 amplifier labels, so there is
593
+ * no bare "PL" fallback.
594
+ * @default true
595
+ */
596
+ includePrefix?: boolean;
597
+ }
598
+ /** Default options for the Generic command and control line. */
599
+ declare const DEFAULT_GENERIC_C2_LINE_OPTIONS: GenericC2LineOptions;
600
+ /**
601
+ * Creates a Generic command and control line: a polyline through `positions`
602
+ * with optional near-end text — `H`/`T` joined above the line, `W`/`W1`
603
+ * joined as a "from - to" range below it. Both rows share the per-tip
604
+ * placement from {@link import("../../internal/line-labels").aboveEndFrames}
605
+ * (inset from the tip, anchored toward the line's interior), one at
606
+ * `base + perp·offset` and the other at `base − perp·offset`.
607
+ */
608
+ declare function createGenericC2Line(positions: Position[], options?: GenericC2LineOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<LineString | Point>;
609
+ //#endregion
610
+ //#region src/internal/area-labels.d.ts
611
+ /** Shared placement options for the centered-label area measures. */
612
+ interface AreaLabelOptions extends LabelSizeOptions {
613
+ /**
614
+ * Extra row leading (and ENY inset), as a ratio of the label's resolved
615
+ * text height, like the labeled line measures' own `labelPadding`.
616
+ * Negative values clamp to 0.
617
+ * @default 0
618
+ */
619
+ labelPadding?: number;
620
+ }
621
+ /** Options for {@link labeledAreaFeatures}: {@link buildClosedRing}'s
622
+ * smoothing knobs plus the shared {@link AreaLabelOptions} label placement. */
623
+ interface LabeledAreaOptions extends AreaLabelOptions {
624
+ /**
625
+ * Round the area's corners by curving the boundary through the control
626
+ * points (closed centripetal Catmull-Rom spline).
627
+ * @default false
628
+ */
629
+ smooth?: boolean;
630
+ /**
631
+ * Number of samples per segment when `smooth` is enabled.
632
+ * @default 16
633
+ */
634
+ smoothResolution?: number;
635
+ }
636
+ //#endregion
637
+ //#region src/generators/cm15-maneuver-areas/battlePosition.d.ts
638
+ /**
639
+ * Configuration options for the Battle Position control measure. Also
640
+ * carries the shared {@link AreaLabelOptions} placement for its centered
641
+ * Field T (designator) label.
642
+ */
643
+ interface BattlePositionOptions extends AreaLabelOptions {
644
+ /**
645
+ * Field B echelon. One of the keys in the echelon vocabulary (e.g.
646
+ * `"battalion"`, `"division"`) or an equivalent symbol form (`"II"`, `"XX"`).
647
+ * `"none"`, empty, or unknown renders no glyph and leaves the boundary
648
+ * continuous.
649
+ * @default "battalion"
650
+ */
651
+ echelon?: string;
652
+ /**
653
+ * Echelon glyph height in meters (ground-anchored). Ignored when
654
+ * `echelonSizePixels` is supplied together with `metersPerPixel`.
655
+ * @default 750
656
+ */
657
+ echelonSize?: number;
658
+ /**
659
+ * Echelon glyph height in screen pixels (screen-anchored). Resolved to meters
660
+ * against `metersPerPixel`; bakes to a meter size on draw/edit commit
661
+ * (ADR-0020).
662
+ * @default 16
663
+ */
664
+ echelonSizePixels?: number;
665
+ /**
666
+ * Gap left on each side of the echelon glyph, as a ratio of the glyph height.
667
+ * `0` butts the boundary against the glyph; larger values widen the break.
668
+ * @default 0.3
669
+ */
670
+ echelonPadding?: number;
671
+ /**
672
+ * Slides the echelon along the boundary, as a signed fraction of the total
673
+ * perimeter measured from its default anchor on the bottom edge. `0` keeps it
674
+ * centered on the bottom; positive/negative values move it around the ring in
675
+ * either direction (wrapping at the seam).
676
+ * @default 0
677
+ */
678
+ echelonPosition?: number;
679
+ /**
680
+ * Absolute anchor for the echelon glyph, as a fraction of the total
681
+ * perimeter measured from the ring seam (the ring's first vertex), wrapped
682
+ * into `[0, 1)`. When omitted, the anchor is "auto": the bottom edge's
683
+ * midpoint (the side opposite the front), recomputed from the current
684
+ * geometry on every render — the long-standing default behavior.
685
+ * `echelonPosition` still applies on top of this anchor as a signed offset,
686
+ * exactly as it does against the auto anchor.
687
+ *
688
+ * Edit controllers freeze this from "auto" to a concrete fraction the
689
+ * moment a rotate gesture starts (see `freezeEchelonAnchor` /
690
+ * `freezeOrientationOptions`): the transform box rotates only the control
691
+ * points and re-renders, so without a pinned anchor the "bottom edge" would
692
+ * keep re-deriving against the rotated geometry and the glyph would jump to
693
+ * a different edge each time a new edge becomes lowest. Freezing the anchor
694
+ * first makes the rotation rigid — the glyph turns with the shape instead.
695
+ * See ADR-0023.
696
+ */
697
+ echelonAnchor?: number;
698
+ /**
699
+ * Meters-per-pixel at the current zoom/latitude. Stamped by the host when the
700
+ * measure is screen-anchored; required to resolve `echelonSizePixels`.
701
+ */
702
+ metersPerPixel?: number;
703
+ /**
704
+ * Round the area's corners by curving the boundary through the control points
705
+ * (closed centripetal Catmull-Rom spline), matching the rounded shape in the
706
+ * APP-6 template.
707
+ * @default false
708
+ */
709
+ smooth?: boolean;
710
+ /**
711
+ * Number of samples per segment when `smooth` is enabled. Higher values yield
712
+ * a denser, smoother curve.
713
+ * @default 16
714
+ */
715
+ smoothResolution?: number;
716
+ }
717
+ /** Default options for the Battle Position control measure. */
718
+ declare const DEFAULT_BATTLE_POSITION_OPTIONS: BattlePositionOptions;
719
+ /**
720
+ * Creates a Battle Position control measure: a closed area through `positions`
721
+ * carrying a single echelon (Field B) glyph straddling its boundary — anchored
722
+ * to the bottom edge by default, slidable via `echelonPosition`.
723
+ *
724
+ * @param positions - Area anchor points (≥3); the input contract is enforced at
725
+ * the render seam (ADR-0014).
726
+ * @param options - {@link BattlePositionOptions}.
727
+ * @param textAmplifiers - Field T only, centered in the area (no H/W rows —
728
+ * this measure's template pairs the designation with the Field B glyph,
729
+ * not the plain L-15 boundary template).
730
+ */
731
+ declare function createBattlePosition(positions: Position[], options?: BattlePositionOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<MultiLineString | MultiPolygon | Point>;
732
+ //#endregion
733
+ //#region src/generators/cm15-maneuver-areas/strongPoint.d.ts
734
+ /** Configuration options for the Strong Point control measure. */
735
+ type StrongPointOptions = BattlePositionOptions;
736
+ /** Default options for the Strong Point control measure. */
737
+ declare const DEFAULT_STRONG_POINT_OPTIONS: StrongPointOptions;
738
+ /**
739
+ * Creates a Strong Point control measure: a Battle Position boundary/echelon
740
+ * with outward tics whose length and spacing are the Field B echelon height.
741
+ * Shares the perimeter and echelon placement with Battle Position via the
742
+ * `area-echelon` primitive (single source of truth for ring and gap).
743
+ *
744
+ * @param positions - Area anchor points (>=3); the input contract is enforced
745
+ * at the render seam (ADR-0014).
746
+ * @param options - {@link StrongPointOptions}.
747
+ * @param textAmplifiers - Field T only, centered in the area, same as Battle
748
+ * Position.
749
+ */
750
+ declare function createStrongPoint(positions: Position[], options?: StrongPointOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<MultiLineString | MultiPolygon | Point>;
751
+ //#endregion
752
+ //#region src/generators/cm14-maneuver-lines/principalDirectionOfFire.d.ts
753
+ /**
754
+ * Configuration options for the Principal Direction of Fire tactical symbol.
755
+ */
756
+ interface PrincipalDirectionOfFireOptions {
757
+ /** Arrowhead length relative to each arm's own length (default: 0.07) */
758
+ arrowheadLengthRatio?: number;
759
+ /** Arrowhead wing spread relative to the arrowhead length (default: 0.67) */
760
+ arrowheadWidthRatio?: number;
761
+ }
762
+ declare const DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS: Required<PrincipalDirectionOfFireOptions>;
763
+ /**
764
+ * Generates a GeoJSON FeatureCollection for a PRINCIPAL DIRECTION OF FIRE
765
+ * tactical symbol: a "V" of arms from the vertex out to the (independent) tips,
766
+ * each ending in an open arrowhead.
767
+ *
768
+ * Renders one arm per tip, so two points (vertex + one tip) draws the single
769
+ * arm being placed — the live feedback after PT 1 — and three points draws the
770
+ * full V. Points beyond the third are ignored (input contract, ADR-0014).
771
+ *
772
+ * @param coordinates - [PT 1 (vertex), PT 2 (tip), PT 3 (tip)]
773
+ * @param options - Arrowhead sizing parameters
774
+ */
775
+ declare function createPrincipalDirectionOfFire(coordinates: Position[], options?: PrincipalDirectionOfFireOptions): FeatureCollection<MultiLineString, Record<string, never>>;
776
+ //#endregion
777
+ //#region src/generators/cm14-maneuver-lines/finalProtectiveFire.d.ts
778
+ /**
779
+ * Configuration options for the Final Protective Fire tactical symbols.
780
+ *
781
+ * Identical to Principal Direction of Fire (arrowhead sizing), plus a filled
782
+ * "blade" running along the inside of one arm.
783
+ */
784
+ interface FinalProtectiveFireOptions {
785
+ /** Arrowhead length relative to each arm's own length (default: 0.07) */
786
+ arrowheadLengthRatio?: number;
787
+ /** Arrowhead wing spread relative to the arrowhead length (default: 0.67) */
788
+ arrowheadWidthRatio?: number;
789
+ /**
790
+ * Blade height (its perpendicular reach into the inside of the V) relative
791
+ * to the bladed arm's own length (default: 0.03).
792
+ */
793
+ bladeHeightRatio?: number;
794
+ }
795
+ declare const DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS: Required<FinalProtectiveFireOptions>;
796
+ type FpfProps = {
797
+ part?: string;
798
+ fill?: true;
799
+ };
800
+ declare function createFinalProtectiveFireLeft(coordinates: Position[], options?: FinalProtectiveFireOptions): FeatureCollection<MultiLineString | Polygon, FpfProps>;
801
+ declare function createFinalProtectiveFireRight(coordinates: Position[], options?: FinalProtectiveFireOptions): FeatureCollection<MultiLineString | Polygon, FpfProps>;
802
+ //#endregion
803
+ //#region src/generators/cm15-maneuver-areas/encirclement.d.ts
804
+ /**
805
+ * Configuration options for the Encirclement control measure. Also carries
806
+ * the shared {@link AreaLabelOptions} label placement for its Field N (ENY)
807
+ * marker — the doctrinal example shows only the hostile marker, no name/H/W
808
+ * rows.
809
+ */
810
+ interface EncirclementOptions extends AreaLabelOptions {
811
+ /**
812
+ * Spacing between adjacent barbs as a ratio of the symbol's mean radius;
813
+ * smaller values pack the barbs more densely. The barbs are then distributed
814
+ * evenly so they close the ring exactly.
815
+ * @default 0.4
816
+ */
817
+ barbSpacingRatio?: number;
818
+ /**
819
+ * Barb length (height/amplitude) as a ratio of the symbol's mean radius.
820
+ * @default 0.16
821
+ */
822
+ barbLengthRatio?: number;
823
+ /**
824
+ * Round the boundary by curving it through the control points (closed
825
+ * centripetal Catmull-Rom) before tracing the barbs.
826
+ * @default true
827
+ */
828
+ smooth?: boolean;
829
+ /**
830
+ * Number of samples per segment when `smooth` is enabled.
831
+ * @default 16
832
+ */
833
+ smoothResolution?: number;
834
+ }
835
+ /**
836
+ * Default options for the Encirclement control measure. Not `Required<...>`
837
+ * — the inherited label-size options ({@link AreaLabelOptions}) have no
838
+ * static default, so this covers only the barb/smoothing options.
839
+ */
840
+ declare const DEFAULT_ENCIRCLEMENT_OPTIONS: EncirclementOptions;
841
+ /**
842
+ * Creates an Encirclement tactical graphic: a complete smooth boundary ring
843
+ * with outward arrowhead barbs resting on it. The boundary is an unfilled
844
+ * Polygon; the barbs are open "V" strokes (a MultiLineString) whose base is the
845
+ * boundary arc itself. When a Field N (ENY) marker is set, it sits ON the
846
+ * boundary and masks it with a knockout gap (mirroring Field B's echelon
847
+ * glyph, ADR-0023) — the boundary becomes a gapped MultiLineString instead of
848
+ * a closed Polygon, and any barb whose center falls inside the gap is
849
+ * suppressed; the no-`N` case is unaffected.
850
+ *
851
+ * @param positions - Area anchor points (>=3); the input contract is enforced
852
+ * at the render seam (ADR-0014).
853
+ * @param options - {@link EncirclementOptions}.
854
+ * @param textAmplifiers - Field N only — rendered as "ENY" markers at the
855
+ * ring's west and east edges, per the doctrinal hostile example.
856
+ */
857
+ declare function createEncirclement(positions: Position[], options?: EncirclementOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
858
+ //#endregion
859
+ //#region src/generators/cm15-maneuver-areas/area.d.ts
860
+ /** Configuration options for the Area control measure. */
861
+ type AreaOptions = LabeledAreaOptions;
862
+ /**
863
+ * Creates an Area control measure: a closed area through `positions` labeled
864
+ * at its center with an un-prefixed `T` (Field T) plus an `N` (Field N) ENY
865
+ * marker, per {@link labeledAreaFeatures}.
866
+ */
867
+ declare function createArea(positions: Position[], options?: AreaOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
868
+ //#endregion
869
+ //#region src/generators/cm15-maneuver-areas/assemblyArea.d.ts
870
+ /** Configuration options for the Assembly area control measure. */
871
+ type AssemblyAreaOptions = LabeledAreaOptions;
872
+ /** Default options for the Assembly area control measure. */
873
+ declare const DEFAULT_ASSEMBLY_AREA_OPTIONS: AssemblyAreaOptions;
874
+ /**
875
+ * Creates an Assembly area control measure: a closed area through
876
+ * `positions` labeled at its center with "AA "-prefixed `T` (Field T) plus
877
+ * `H`/`W`/`W1`/`N` amplifier rows, per {@link labeledAreaFeatures}.
878
+ */
879
+ declare function createAssemblyArea(positions: Position[], options?: AssemblyAreaOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
880
+ //#endregion
881
+ //#region src/generators/cm15-maneuver-areas/jointTacticalActionArea.d.ts
882
+ /** Configuration options for the Joint tactical action area control measure. */
883
+ type JointTacticalActionAreaOptions = LabeledAreaOptions;
884
+ /** Default options for the Joint tactical action area control measure. */
885
+ declare const DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS: JointTacticalActionAreaOptions;
886
+ /**
887
+ * Creates a Joint tactical action area control measure: a closed area
888
+ * through `positions` labeled at its center with "JTAA -"-prefixed `T`
889
+ * (Field T) plus `H`/`W`/`W1`/`N` amplifier rows, per
890
+ * {@link labeledAreaFeatures}.
891
+ */
892
+ declare function createJointTacticalActionArea(positions: Position[], options?: JointTacticalActionAreaOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
893
+ //#endregion
894
+ //#region src/generators/cm15-maneuver-areas/submarineActionArea.d.ts
895
+ /** Configuration options for the Submarine action area control measure. */
896
+ type SubmarineActionAreaOptions = LabeledAreaOptions;
897
+ /**
898
+ * Creates a Submarine action area control measure: a closed area through
899
+ * `positions` labeled at its center with "SAA -"-prefixed `T` (Field T) plus
900
+ * `W`/`W1`/`N` amplifier rows, per {@link labeledAreaFeatures}.
901
+ */
902
+ declare function createSubmarineActionArea(positions: Position[], options?: SubmarineActionAreaOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
903
+ //#endregion
904
+ //#region src/generators/cm15-maneuver-areas/submarineGeneratedActionArea.d.ts
905
+ /** Configuration options for the Submarine-generated action area control measure. */
906
+ type SubmarineGeneratedActionAreaOptions = LabeledAreaOptions;
907
+ /**
908
+ * Creates a Submarine-generated action area control measure: a closed area
909
+ * through `positions` labeled at its center with "SGSA -"-prefixed `T`
910
+ * (Field T) plus `W`/`W1`/`N` amplifier rows, per {@link labeledAreaFeatures}.
911
+ */
912
+ declare function createSubmarineGeneratedActionArea(positions: Position[], options?: SubmarineGeneratedActionAreaOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
913
+ //#endregion
914
+ //#region src/generators/cm15-maneuver-areas/dropZone.d.ts
915
+ /** Configuration options for the Drop zone control measure. */
916
+ type DropZoneOptions = LabeledAreaOptions;
917
+ /**
918
+ * Creates a Drop zone control measure: a closed area through `positions`
919
+ * labeled at its center with "DZ "-prefixed `T` (Field T) plus an `N`
920
+ * (Field N) ENY marker, per {@link labeledAreaFeatures}.
921
+ */
922
+ declare function createDropZone(positions: Position[], options?: DropZoneOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
923
+ //#endregion
924
+ //#region src/generators/cm15-maneuver-areas/extractionZone.d.ts
925
+ /** Configuration options for the Extraction zone control measure. */
926
+ type ExtractionZoneOptions = LabeledAreaOptions;
927
+ /**
928
+ * Creates an Extraction zone control measure: a closed area through
929
+ * `positions` labeled at its center with "EZ "-prefixed `T` (Field T) plus
930
+ * an `N` (Field N) ENY marker, per {@link labeledAreaFeatures}.
931
+ */
932
+ declare function createExtractionZone(positions: Position[], options?: ExtractionZoneOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
933
+ //#endregion
934
+ //#region src/generators/cm15-maneuver-areas/landingZone.d.ts
935
+ /** Configuration options for the Landing zone control measure. */
936
+ type LandingZoneOptions = LabeledAreaOptions;
937
+ /** Default options for the Landing zone control measure. */
938
+ declare const DEFAULT_LANDING_ZONE_OPTIONS: LandingZoneOptions;
939
+ /**
940
+ * Creates a Landing zone control measure: a closed area through `positions`
941
+ * labeled at its center with "LZ "-prefixed `T` (Field T) plus `H`/`W`/`W1`/`N`
942
+ * amplifier rows, per {@link labeledAreaFeatures}.
943
+ */
944
+ declare function createLandingZone(positions: Position[], options?: LandingZoneOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
945
+ //#endregion
946
+ //#region src/generators/cm15-maneuver-areas/pickupZone.d.ts
947
+ /** Configuration options for the Pickup zone control measure. */
948
+ type PickupZoneOptions = LabeledAreaOptions;
949
+ /** Default options for the Pickup zone control measure. */
950
+ declare const DEFAULT_PICKUP_ZONE_OPTIONS: PickupZoneOptions;
951
+ /**
952
+ * Creates a Pickup zone control measure: a closed area through `positions`
953
+ * labeled at its center with "PZ "-prefixed `T` (Field T) plus `H`/`W`/`W1`/`N`
954
+ * amplifier rows, per {@link labeledAreaFeatures}.
955
+ */
956
+ declare function createPickupZone(positions: Position[], options?: PickupZoneOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
957
+ //#endregion
958
+ //#region src/generators/cm15-maneuver-areas/assaultPosition.d.ts
959
+ /** Configuration options for the Assault position control measure. */
960
+ type AssaultPositionOptions = LabeledAreaOptions;
961
+ /**
962
+ * Creates an Assault position control measure: a closed area through
963
+ * `positions` labeled at its center with "ASLT "-prefixed `T` (Field T) —
964
+ * the sole label row, per {@link labeledAreaFeatures}.
965
+ */
966
+ declare function createAssaultPosition(positions: Position[], options?: AssaultPositionOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
967
+ //#endregion
968
+ //#region src/generators/cm15-maneuver-areas/attackPosition.d.ts
969
+ /** Configuration options for the Attack position control measure. */
970
+ type AttackPositionOptions = LabeledAreaOptions;
971
+ /**
972
+ * Creates an Attack position control measure: a closed area through
973
+ * `positions` labeled at its center with "ATK "-prefixed `T` (Field T) —
974
+ * the sole label row, per {@link labeledAreaFeatures}.
975
+ */
976
+ declare function createAttackPosition(positions: Position[], options?: AttackPositionOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
977
+ //#endregion
978
+ //#region src/generators/cm15-maneuver-areas/objectiveArea.d.ts
979
+ /** Configuration options for the Objective area control measure. */
980
+ type ObjectiveAreaOptions = LabeledAreaOptions;
981
+ /**
982
+ * Creates an Objective area control measure: a closed area through
983
+ * `positions` labeled at its center with "OBJ "-prefixed `T` (Field T) —
984
+ * the sole label row, per {@link labeledAreaFeatures}.
985
+ */
986
+ declare function createObjectiveArea(positions: Position[], options?: ObjectiveAreaOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
987
+ //#endregion
988
+ //#region src/generators/cm12-command-control-areas/area-of-operations.d.ts
989
+ /** Configuration options for the Area of operations control measure. */
990
+ type AreaOfOperationsOptions = LabeledAreaOptions;
991
+ /** Default options for the Area of operations control measure. */
992
+ declare const DEFAULT_AREA_OF_OPERATIONS_OPTIONS: AreaOfOperationsOptions;
993
+ /**
994
+ * Creates an Area of operations control measure: a closed area through
995
+ * `positions` labeled at its center with "AO "-prefixed `T` (Field T) plus
996
+ * `H`/`W`/`W1`/`N` amplifier rows, per {@link labeledAreaFeatures}.
997
+ */
998
+ declare function createAreaOfOperations(positions: Position[], options?: AreaOfOperationsOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
999
+ //#endregion
1000
+ //#region src/generators/cm12-command-control-areas/named-area-of-interest.d.ts
1001
+ /** Configuration options for the Named area of interest control measure. */
1002
+ type NamedAreaOfInterestOptions = LabeledAreaOptions;
1003
+ /**
1004
+ * Creates a Named area of interest control measure: a closed area through
1005
+ * `positions` labeled at its center with "NAI "-prefixed `T` (Field T) —
1006
+ * the sole label row, per {@link labeledAreaFeatures}.
1007
+ */
1008
+ declare function createNamedAreaOfInterest(positions: Position[], options?: NamedAreaOfInterestOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
1009
+ //#endregion
1010
+ //#region src/generators/cm12-command-control-areas/target-area-of-interest.d.ts
1011
+ /** Configuration options for the Target area of interest control measure. */
1012
+ type TargetAreaOfInterestOptions = LabeledAreaOptions;
1013
+ /**
1014
+ * Creates a Target area of interest control measure: a closed area through
1015
+ * `positions` labeled at its center with "TAI "-prefixed `T` (Field T) —
1016
+ * the sole label row, per {@link labeledAreaFeatures}.
1017
+ */
1018
+ declare function createTargetAreaOfInterest(positions: Position[], options?: TargetAreaOfInterestOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
1019
+ //#endregion
1020
+ //#region src/generators/cm12-command-control-areas/airfield-zone.d.ts
1021
+ /** Configuration options for the Airfield zone control measure. */
1022
+ interface AirfieldZoneOptions extends LabeledAreaOptions {
1023
+ /**
1024
+ * The runway glyph's long line, as a ratio of the ring's projected
1025
+ * bounding-box width (full length, not half).
1026
+ * @default 0.55
1027
+ */
1028
+ glyphSizeRatio?: number;
1029
+ }
1030
+ /**
1031
+ * Creates an Airfield zone control measure: a closed area through
1032
+ * `positions` with a runway glyph (two crossed lines forming a shallow
1033
+ * asymmetric X) centered on the ring, and Field H placed outside the area to
1034
+ * the east when set.
1035
+ *
1036
+ * @param positions - Area anchor points (≥3); the input contract is enforced
1037
+ * at the render seam (ADR-0014).
1038
+ * @param options - {@link AirfieldZoneOptions}.
1039
+ * @param textAmplifiers - Field H only.
1040
+ */
1041
+ declare function createAirfieldZone(positions: Position[], options?: AirfieldZoneOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
1042
+ //#endregion
1043
+ //#region src/generators/cm12-command-control-areas/echelon-labeled-area.d.ts
1044
+ /**
1045
+ * Configuration options shared by Base Camp and Guerrilla Base: the full L-15
1046
+ * label placement ({@link LabeledAreaOptions}) plus Battle Position's Field B
1047
+ * echelon knobs.
1048
+ */
1049
+ interface EchelonLabeledAreaOptions extends LabeledAreaOptions {
1050
+ /**
1051
+ * Field B echelon straddling the boundary. `"none"` (the default — the
1052
+ * standard's examples show no echelon glyph), empty, or unknown renders no
1053
+ * glyph and leaves the boundary unaffected by echelon masking.
1054
+ * @default "none"
1055
+ */
1056
+ echelon?: string;
1057
+ /**
1058
+ * Echelon glyph height in meters (ground-anchored). Ignored when
1059
+ * `echelonSizePixels` is supplied together with `metersPerPixel`.
1060
+ * @default 750
1061
+ */
1062
+ echelonSize?: number;
1063
+ /**
1064
+ * Echelon glyph height in screen pixels (screen-anchored). Resolved to
1065
+ * meters against `metersPerPixel`; bakes to a meter size on draw/edit
1066
+ * commit (ADR-0020).
1067
+ * @default 16
1068
+ */
1069
+ echelonSizePixels?: number;
1070
+ /**
1071
+ * Gap left on each side of the echelon glyph, as a ratio of the glyph
1072
+ * height. `0` butts the boundary against the glyph; larger values widen
1073
+ * the break.
1074
+ * @default 0.3
1075
+ */
1076
+ echelonPadding?: number;
1077
+ /**
1078
+ * Slides the echelon along the boundary, as a signed fraction of the total
1079
+ * perimeter measured from its default anchor on the bottom edge.
1080
+ * @default 0
1081
+ */
1082
+ echelonPosition?: number;
1083
+ /**
1084
+ * Absolute anchor for the echelon glyph, as a fraction of the total
1085
+ * perimeter measured from the ring seam, wrapped into `[0, 1)`. See Battle
1086
+ * Position's `echelonAnchor` (ADR-0023) — edit controllers freeze this via
1087
+ * the `freezeOrientation` hook the moment a rotate gesture starts.
1088
+ */
1089
+ echelonAnchor?: number;
1090
+ /**
1091
+ * Meters-per-pixel at the current zoom/latitude. Stamped by the host when
1092
+ * the measure is screen-anchored; required to resolve `echelonSizePixels`.
1093
+ */
1094
+ metersPerPixel?: number;
1095
+ }
1096
+ //#endregion
1097
+ //#region src/generators/cm12-command-control-areas/base-camp.d.ts
1098
+ /** Configuration options for the Base camp control measure. */
1099
+ type BaseCampOptions = EchelonLabeledAreaOptions;
1100
+ /**
1101
+ * Creates a Base camp control measure: a closed area through `positions`
1102
+ * labeled at its center with "BC "-prefixed `T` (Field T) plus `H`/`W`/`W1`/`N`
1103
+ * amplifier rows, and an optional Field B echelon glyph straddling the
1104
+ * boundary, per {@link echelonLabeledAreaFeatures}.
1105
+ */
1106
+ declare function createBaseCamp(positions: Position[], options?: BaseCampOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | MultiPolygon | Point>;
1107
+ //#endregion
1108
+ //#region src/generators/cm12-command-control-areas/guerrilla-base.d.ts
1109
+ /** Configuration options for the Guerrilla base control measure. */
1110
+ type GuerrillaBaseOptions = EchelonLabeledAreaOptions;
1111
+ /**
1112
+ * Creates a Guerrilla base control measure: a closed area through
1113
+ * `positions` labeled at its center with "GB "-prefixed `T` (Field T) plus
1114
+ * `H`/`W`/`W1`/`N` amplifier rows, and an optional Field B echelon glyph
1115
+ * straddling the boundary, per {@link echelonLabeledAreaFeatures}.
1116
+ */
1117
+ declare function createGuerrillaBase(positions: Position[], options?: GuerrillaBaseOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | MultiPolygon | Point>;
1118
+ //#endregion
1119
+ //#region src/generators/cm12-command-control-areas/generic-c2-area.d.ts
1120
+ /** Configuration options for the Generic command and control area control measure. */
1121
+ type GenericC2AreaOptions = LabeledAreaOptions;
1122
+ /**
1123
+ * Creates a Generic command and control area control measure: a closed area
1124
+ * through `positions` labeled at its center with the bare `T` (Field T) plus
1125
+ * `H`/`W`/`W1`/`N` amplifier rows — no prefix, per {@link labeledAreaFeatures}.
1126
+ */
1127
+ declare function createGenericC2Area(positions: Position[], options?: GenericC2AreaOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | MultiLineString | Point>;
1128
+ //#endregion
1129
+ //#region src/attack-utils.d.ts
1130
+ interface AttackOptions {
1131
+ shaftWidthRatio?: number;
1132
+ smooth?: boolean;
1133
+ smoothResolution?: number;
1134
+ }
1135
+ /**
1136
+ * Calculates the relative metrics (longitudinal and lateral) of the width point
1137
+ * relative to the Tip-Neck axis.
1138
+ *
1139
+ * @param pts - Array of positions [Tip, Neck, ..., WidthPoint]
1140
+ * @returns { longitudinal: number, lateral: number } | null
1141
+ */
1142
+ declare function calculateMetrics(pts: Position[]): {
1143
+ longitudinal: number;
1144
+ lateral: number;
1145
+ } | null;
1146
+ /**
1147
+ * Computes an initial Width Point based on the Tip and Neck positions.
1148
+ * It places the point perpendicular to the neck at a default distance relative to the length.
1149
+ *
1150
+ * @param tip - Tip position (Lon/Lat)
1151
+ * @param neck - Neck position (Lon/Lat)
1152
+ * @returns Width Point position (Lon/Lat)
1153
+ */
1154
+ declare function computeInitialWidthPoint(tip: Position, neck: Position): Position;
1155
+ //#endregion
1156
+ //#region src/generators/cm15-maneuver-areas/mainAttack.d.ts
1157
+ declare const DEFAULT_MAIN_ATTACK_OPTIONS: Required<AttackOptions>;
1158
+ type MainAttackOptions = AttackOptions;
1159
+ /**
1160
+ * Generates a GeoJSON FeatureCollection for a Main Attack tactical symbol.
1161
+ *
1162
+ * The symbol consists of a single MultiLineString feature containing:
1163
+ * 1. **Arrowhead**: A line forming a "chevron" or "roof" shape.
1164
+ * 2. **Shaft**: Two parallel lines behind the arrow.
1165
+ *
1166
+ * The shaft is calculated to terminate exactly where it touches the inner walls
1167
+ * of the arrowhead, creating a seamless connection.
1168
+ *
1169
+ * @param coordinates - An array of GeoJSON Positions (Lon/Lat).
1170
+ * Minimum 3 points required.
1171
+ * **Order matters:** * - Index 0: **Tip** (The sharp point of the arrow)
1172
+ * - Index 1 to N-2: **Spine** (The path the shaft follows)
1173
+ * - Index N-1: **Width Control** (Determines the width of the arrowhead)
1174
+ * @param options - Configuration for ratios and properties.
1175
+ * @returns A GeoJSON FeatureCollection containing a single MultiLineString.
1176
+ */
1177
+ declare function createMainAttack(coordinates: Position[], options?: MainAttackOptions): FeatureCollection<MultiLineString>;
1178
+ //#endregion
1179
+ //#region src/generators/cm15-maneuver-areas/supportingAttack.d.ts
1180
+ type SupportingAttackOptions = AttackOptions;
1181
+ declare const DEFAULT_SUPPORTING_ATTACK_OPTIONS: Required<SupportingAttackOptions>;
1182
+ /**
1183
+ * Generates a GeoJSON FeatureCollection for a Supporting Attack tactical symbol.
1184
+ *
1185
+ * The symbol differs from Main Attack in that it is a single LineString
1186
+ * outlining the arrow shape, rather than a filled Polygon header + Shaft lines.
1187
+ *
1188
+ * @param coordinates - An array of GeoJSON Positions.
1189
+ * @param options - Configuration options.
1190
+ * @returns A GeoJSON FeatureCollection<LineString>.
1191
+ */
1192
+ declare function createSupportingAttack(coordinates: Position[], options?: SupportingAttackOptions): FeatureCollection<LineString>;
1193
+ //#endregion
1194
+ //#region src/generators/cm99-generic-arrows/classicArrow.d.ts
1195
+ /**
1196
+ * A plain, clean arrow for illustrations — not a doctrinal symbol. The shaft is
1197
+ * a straight polyline through the drawn control points (Line1 contract) and the
1198
+ * tip carries a solid triangular arrowhead. No wobble, no curve: the canonical
1199
+ * "draw an arrow" graphic.
1200
+ */
1201
+ /**
1202
+ * Arrowhead silhouette:
1203
+ * - `triangle` — solid triangle with a flat back (the default).
1204
+ * - `barbed` — swept-back barbs with a forward notch (classic arrowhead).
1205
+ * - `concave` — a sharper barbed head with a deep forward notch.
1206
+ * - `diamond` — a rhombus, widest at its middle.
1207
+ * - `harpoon` — an asymmetric single-sided barb.
1208
+ * - `swallowtail` — barbs that sweep back into two trailing tails.
1209
+ * - `chevron` — a thick hollow "V".
1210
+ * - `circle` — a round dot terminator.
1211
+ * - `tee` — a flat crossbar terminator (no point).
1212
+ * - `open` — an unfilled "V", drawn as two strokes meeting at the tip.
1213
+ */
1214
+ type ClassicArrowHeadStyle = "triangle" | "barbed" | "concave" | "diamond" | "harpoon" | "swallowtail" | "chevron" | "circle" | "tee" | "open";
1215
+ interface ClassicArrowOptions {
1216
+ /** Arrowhead silhouette. */
1217
+ arrowheadStyle?: ClassicArrowHeadStyle;
1218
+ /** Round the shaft's corners by curving it through the control points. */
1219
+ smooth?: boolean;
1220
+ /** Number of samples per segment when smooth mode is enabled. */
1221
+ smoothResolution?: number;
1222
+ /** Arrowhead length as a fraction of the total path length. */
1223
+ arrowheadLengthRatio?: number;
1224
+ /** Arrowhead base width as a fraction of the total path length. */
1225
+ arrowheadWidthRatio?: number;
1226
+ }
1227
+ declare const DEFAULT_CLASSIC_ARROW_OPTIONS: Required<ClassicArrowOptions>;
1228
+ /**
1229
+ * Generates a GeoJSON FeatureCollection for the Classic Arrow: a shaft
1230
+ * LineString (trimmed so it doesn't poke through the head) plus a head feature
1231
+ * whose silhouette follows `arrowheadStyle` — a filled Polygon for the solid heads,
1232
+ * or an open "V" LineString for `open`.
1233
+ */
1234
+ declare function createClassicArrow(coordinates: Position[], options?: ClassicArrowOptions): FeatureCollection<LineString | Polygon, {
1235
+ part: "shaft" | "head";
1236
+ fill?: boolean;
1237
+ }>;
1238
+ //#endregion
1239
+ //#region src/generators/cm99-generic-arrows/blockArrow.d.ts
1240
+ /**
1241
+ * A solid "block" arrow for illustrations — not a doctrinal symbol. The whole
1242
+ * arrow is one filled polygon: a shaft band of controllable width that runs
1243
+ * through the drawn Axis1 spine and flares into a wider triangular head at the
1244
+ * tip. Axis1 control points are ordered `[tip, neck, ...spine, width]`.
1245
+ */
1246
+ /**
1247
+ * Arrowhead silhouette (all carved from the one filled body):
1248
+ * - `triangle` — a flat-backed triangular head (the default).
1249
+ * - `barbed` — swept-back barbs with the shaft entering at a forward notch.
1250
+ * - `concave` — a sharper barbed head with a deeper notch.
1251
+ * - `diamond` — a kite that flares to its widest mid-head.
1252
+ * - `harpoon` — an asymmetric single-sided barb.
1253
+ * - `swallowtail` — barbs that sweep back into two trailing tails.
1254
+ * - `tee` — a flat crossbar terminator (no point).
1255
+ */
1256
+ type BlockArrowHeadStyle = "triangle" | "barbed" | "concave" | "diamond" | "harpoon" | "swallowtail" | "tee";
1257
+ interface BlockArrowOptions {
1258
+ /** Shaft band width as a fraction of the total path length. */
1259
+ shaftWidthRatio?: number;
1260
+ /** Arrowhead silhouette. */
1261
+ arrowheadStyle?: BlockArrowHeadStyle;
1262
+ /** Arrowhead base width as a fraction of the total path length. */
1263
+ arrowheadWidthRatio?: number;
1264
+ /** Arrowhead length as a fraction of the total path length. */
1265
+ arrowheadLengthRatio?: number;
1266
+ /** Round the shaft's corners by curving it through the control points. */
1267
+ smooth?: boolean;
1268
+ /** Number of samples per segment when smooth mode is enabled. */
1269
+ smoothResolution?: number;
1270
+ /** Fill the body solid; when false the arrow is drawn as an outline only. */
1271
+ filled?: boolean;
1272
+ }
1273
+ declare const DEFAULT_BLOCK_ARROW_OPTIONS: Required<BlockArrowOptions>;
1274
+ /**
1275
+ * Generates a GeoJSON FeatureCollection for the Block Arrow: a single filled
1276
+ * Polygon whose outline runs up the left side of the shaft, around the head
1277
+ * (whose silhouette follows `arrowheadStyle`) to the tip and back, then down the
1278
+ * right side of the shaft.
1279
+ */
1280
+ declare function createBlockArrow(coordinates: Position[], options?: BlockArrowOptions): FeatureCollection<Polygon, {
1281
+ part: "body";
1282
+ fill: boolean;
1283
+ }>;
1284
+ //#endregion
1285
+ //#region src/generators/cm99-generic-graphics/params.d.ts
1286
+ interface SmoothPathOptions {
1287
+ /** Curve the rendered path through the unchanged control points. */
1288
+ smooth?: boolean;
1289
+ /** Number of samples per segment when smoothing is enabled. */
1290
+ smoothResolution?: number;
1291
+ }
1292
+ interface FilledAreaOptions {
1293
+ /** Fill the polygon interior; false renders only its outline. */
1294
+ filled?: boolean;
1295
+ }
1296
+ //#endregion
1297
+ //#region src/generators/cm99-generic-graphics/line.d.ts
1298
+ type GenericLineOptions = SmoothPathOptions;
1299
+ declare const DEFAULT_GENERIC_LINE_OPTIONS: Required<GenericLineOptions>;
1300
+ declare function createGenericLine(coordinates: Position[], options?: GenericLineOptions): FeatureCollection<LineString>;
1301
+ //#endregion
1302
+ //#region src/generators/cm99-generic-graphics/polygon.d.ts
1303
+ interface GenericPolygonOptions extends SmoothPathOptions, FilledAreaOptions {}
1304
+ declare const DEFAULT_GENERIC_POLYGON_OPTIONS: Required<GenericPolygonOptions>;
1305
+ declare function createGenericPolygon(coordinates: Position[], options?: GenericPolygonOptions): FeatureCollection<Polygon, {
1306
+ part: string;
1307
+ fill: boolean;
1308
+ }>;
1309
+ //#endregion
1310
+ //#region src/generators/cm99-generic-graphics/rectangle.d.ts
1311
+ type GenericRectangleOptions = FilledAreaOptions;
1312
+ declare const DEFAULT_GENERIC_RECTANGLE_OPTIONS: Required<GenericRectangleOptions>;
1313
+ declare function createGenericRectangle(coordinates: Position[], options?: GenericRectangleOptions): FeatureCollection<Polygon, {
1314
+ part: string;
1315
+ fill: boolean;
1316
+ }>;
1317
+ //#endregion
1318
+ //#region src/generators/cm99-generic-graphics/circle.d.ts
1319
+ type GenericCircleOptions = FilledAreaOptions;
1320
+ declare const DEFAULT_GENERIC_CIRCLE_OPTIONS: Required<GenericCircleOptions>;
1321
+ declare function createGenericCircle(coordinates: Position[], options?: GenericCircleOptions): FeatureCollection<Polygon, {
1322
+ part: string;
1323
+ fill: boolean;
1324
+ }>;
1325
+ //#endregion
1326
+ //#region src/generators/cm15-maneuver-areas/airborneAttack.d.ts
1327
+ type AirborneAttackOptions = AttackOptions;
1328
+ declare const DEFAULT_AIRBORNE_ATTACK_OPTIONS: Required<AirborneAttackOptions>;
1329
+ /**
1330
+ * Generates a GeoJSON FeatureCollection for an Airborne Attack tactical symbol.
1331
+ *
1332
+ * The symbol is similar to Supporting Attack but features a crossover point
1333
+ * between the shaft and the head (Points 1 and 2/Neck).
1334
+ *
1335
+ * @param coordinates - An array of GeoJSON Positions.
1336
+ * @param options - Configuration options.
1337
+ * @returns A GeoJSON FeatureCollection<LineString>.
1338
+ */
1339
+ declare function createAirborneAttack(coordinates: Position[], options?: AirborneAttackOptions): FeatureCollection<LineString>;
1340
+ //#endregion
1341
+ //#region src/generators/cm15-maneuver-areas/attackHelicopter.d.ts
1342
+ interface AttackHelicopterOptions extends AttackOptions {
1343
+ symbolHeightRatio?: number;
1344
+ triangleSizeRatio?: number;
1345
+ bottomBarWidthRatio?: number;
1346
+ bowtieWidthRatio?: number;
1347
+ }
1348
+ declare const DEFAULT_ATTACK_HELICOPTER_OPTIONS: Required<AttackHelicopterOptions>;
1349
+ /**
1350
+ * Generates a GeoJSON FeatureCollection for an Attack Helicopter tactical symbol.
1351
+ *
1352
+ * The symbol is based on the Airborne Attack (bow tie) geometry but features
1353
+ * an additional symbol (vertical line + triangle) at the crossover point.
1354
+ *
1355
+ * @param coordinates - An array of GeoJSON Positions.
1356
+ * @param options - Configuration options.
1357
+ * @returns A GeoJSON FeatureCollection containing the main graphic and the symbol.
1358
+ */
1359
+ declare function createAttackHelicopter(coordinates: Position[], options?: AttackHelicopterOptions): FeatureCollection<LineString | Polygon>;
1360
+ //#endregion
1361
+ //#region src/generators/cm15-maneuver-areas/supportByFire.d.ts
1362
+ interface SupportByFireOptions {
1363
+ arrowheadWidthRatio?: number;
1364
+ rearLineLengthRatio?: number;
1365
+ rearLineAngle?: number;
1366
+ }
1367
+ declare const DEFAULT_SUPPORT_BY_FIRE_OPTIONS: Required<SupportByFireOptions>;
1368
+ /**
1369
+ * Generates a GeoJSON FeatureCollection for a Support By Fire tactical graphic.
1370
+ *
1371
+ * Input:
1372
+ * - PT1: Left Base
1373
+ * - PT2: Right Base
1374
+ * - PT3: Left Tip
1375
+ * - PT4: Right Tip
1376
+ */
1377
+ declare function createSupportByFire(coordinates: Position[], options?: SupportByFireOptions): FeatureCollection<LineString>;
1378
+ //#endregion
1379
+ //#region src/generators/cm15-maneuver-areas/attackByFire.d.ts
1380
+ interface AttackByFireOptions {
1381
+ arrowheadWidthRatio?: number;
1382
+ rearLineLengthRatio?: number;
1383
+ rearLineAngle?: number;
1384
+ }
1385
+ declare const DEFAULT_ATTACK_BY_FIRE_OPTIONS: Required<AttackByFireOptions>;
1386
+ /**
1387
+ * Generates a GeoJSON FeatureCollection for an Attack By Fire tactical graphic.
1388
+ *
1389
+ * Input:
1390
+ * - PT1: Arrow Tip (Target)
1391
+ * - PT2: Left Base
1392
+ * - PT3: Right Base
1393
+ *
1394
+ * Logic:
1395
+ * - Shaft: Midpoint(PT2, PT3) -> PT1
1396
+ * - Base Line: PT2 -> PT3
1397
+ * - Wings: Splayed out from PT2 and PT3
1398
+ */
1399
+ declare function createAttackByFire(coordinates: Position[], options?: AttackByFireOptions): FeatureCollection<LineString>;
1400
+ //#endregion
1401
+ //#region src/generators/cm14-maneuver-lines/flot.d.ts
1402
+ /**
1403
+ * Configuration options for the FLOT (Forward Line of Own Troops) geometry.
1404
+ */
1405
+ interface FLOTOptions extends SmoothLineOptions {
1406
+ /**
1407
+ * The radius of the semicircular arcs in meters.
1408
+ * Semicircles are placed tangent to each other (diameter = 2 * radius).
1409
+ * This is ignored if radiusPixels is provided along with metersPerPixel.
1410
+ * @default 50
1411
+ */
1412
+ radius?: number;
1413
+ /**
1414
+ * The radius of the semi-circular arcs in pixels.
1415
+ * When provided along with metersPerPixel, the actual meter radius is calculated
1416
+ * dynamically to maintain consistent visual size on screen.
1417
+ * Takes precedence over radius when metersPerPixel is also provided.
1418
+ * @default 10
1419
+ */
1420
+ radiusPixels?: number;
1421
+ /**
1422
+ * The meters-per-pixel ratio at the current zoom level and latitude.
1423
+ * Required when using radiusPixels for zoom-aware sizing.
1424
+ * Can be obtained from the map view's resolution or calculated using getMetersPerPixel().
1425
+ */
1426
+ metersPerPixel?: number;
1427
+ /**
1428
+ * The number of points used to render each individual semi-circle.
1429
+ * Higher values create smoother arcs.
1430
+ * @default 16
1431
+ */
1432
+ arcSegments?: number;
1433
+ }
1434
+ /**
1435
+ * Default options for the FLOT graphic.
1436
+ */
1437
+ declare const DEFAULT_FLOT_OPTIONS: Required<Omit<FLOTOptions, "metersPerPixel">>;
1438
+ /**
1439
+ * Creates a FLOT (Forward Line of Own Troops) tactical graphic.
1440
+ *
1441
+ * Generates a scalloped/arc line representing the forward edge of friendly forces.
1442
+ * The line consists of semi-circular arcs that bulge perpendicular to the base path,
1443
+ * creating a distinctive visual pattern used in military tactical graphics.
1444
+ *
1445
+ * @param positions - Array of GeoJSON positions defining the base path
1446
+ * @param options - Configuration options for the graphic
1447
+ * @returns A GeoJSON FeatureCollection containing the scalloped LineString
1448
+ *
1449
+ * @example
1450
+ * ```typescript
1451
+ * const flot = createFLOT(
1452
+ * [[-122.4194, 37.7749], [-122.4100, 37.7800], [-122.4000, 37.7750]],
1453
+ * { radius: 100, arcSegments: 20 }
1454
+ * );
1455
+ * ```
1456
+ */
1457
+ declare function createFLOT(positions: Position[], options?: FLOTOptions): FeatureCollection<LineString>;
1458
+ //#endregion
1459
+ //#region src/generators/cm14-maneuver-lines/phase-line.d.ts
1460
+ /** Configuration options for the Phase line control measure. */
1461
+ interface PhaseLineOptions extends LineLabelOptions, SmoothLineOptions {
1462
+ /**
1463
+ * Prefix the end labels with "PL" (`"PL ECHO"`, or a bare `"PL"` when no
1464
+ * designation is set). When `false`, the label is the bare designation
1465
+ * (`Field T`) alone, and the line carries no label at all when `T` is empty.
1466
+ * @default true
1467
+ */
1468
+ includePrefix?: boolean;
1469
+ }
1470
+ /** Default options for the Phase line control measure. */
1471
+ declare const DEFAULT_PHASE_LINE_OPTIONS: PhaseLineOptions;
1472
+ /**
1473
+ * Creates a Phase line control measure: a polyline through `positions`
1474
+ * labeled at each end with `T` (optionally "PL"-prefixed).
1475
+ */
1476
+ declare function createPhaseLine(positions: Position[], options?: PhaseLineOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<LineString | Point>;
1477
+ //#endregion
1478
+ //#region src/generators/cm14-maneuver-lines/handover-line.d.ts
1479
+ /** Configuration options for the Handover line control measure. */
1480
+ interface HandoverLineOptions extends LineLabelOptions, SmoothLineOptions {
1481
+ /**
1482
+ * Optional phase line naming: renders `PL <name>` just beyond each end of
1483
+ * the line, additive to the fixed "HOL" labels. Empty or whitespace-only
1484
+ * renders no label.
1485
+ * @default none
1486
+ */
1487
+ phaseLineName?: string;
1488
+ /**
1489
+ * Prefix the `phaseLineName` label with "PL" (`"PL DAVID"`, or a bare
1490
+ * "DAVID" when `false`). No effect when `phaseLineName` is empty — unlike
1491
+ * Phase Line itself, this measure already carries its own fixed "HOL"
1492
+ * label, so there is no bare "PL" fallback.
1493
+ * @default true
1494
+ */
1495
+ includePrefix?: boolean;
1496
+ }
1497
+ /** Default options for the Handover line control measure. */
1498
+ declare const DEFAULT_HANDOVER_LINE_OPTIONS: HandoverLineOptions;
1499
+ /**
1500
+ * Creates a Handover line control measure: a polyline through `positions`
1501
+ * labeled "HOL" above the line near each end.
1502
+ */
1503
+ declare function createHandoverLine(positions: Position[], options?: HandoverLineOptions): FeatureCollection<LineString | Point>;
1504
+ //#endregion
1505
+ //#region src/generators/cm14-maneuver-lines/battle-handover-line.d.ts
1506
+ /** Configuration options for the Battle handover line control measure. */
1507
+ interface BattleHandoverLineOptions extends LineLabelOptions, SmoothLineOptions {
1508
+ /**
1509
+ * Optional phase line naming: renders `PL <name>` just beyond each end of
1510
+ * the line, additive to the fixed "BHL" labels. Empty or whitespace-only
1511
+ * renders no label.
1512
+ * @default none
1513
+ */
1514
+ phaseLineName?: string;
1515
+ /**
1516
+ * Prefix the `phaseLineName` label with "PL" (`"PL DAVID"`, or a bare
1517
+ * "DAVID" when `false`). No effect when `phaseLineName` is empty — unlike
1518
+ * Phase Line itself, this measure already carries its own fixed "BHL"
1519
+ * label, so there is no bare "PL" fallback.
1520
+ * @default true
1521
+ */
1522
+ includePrefix?: boolean;
1523
+ }
1524
+ /** Default options for the Battle handover line control measure. */
1525
+ declare const DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS: BattleHandoverLineOptions;
1526
+ /**
1527
+ * Creates a Battle handover line control measure: a polyline through
1528
+ * `positions` labeled "BHL" above the line near each end.
1529
+ */
1530
+ declare function createBattleHandoverLine(positions: Position[], options?: BattleHandoverLineOptions): FeatureCollection<LineString | Point>;
1531
+ //#endregion
1532
+ //#region src/generators/cm34-mission-tasks/block.d.ts
1533
+ interface BlockMissionTaskOptions {
1534
+ /** Gap for the 'B' label as a ratio of the front length (default: 0.2) */
1535
+ labelGapRatio?: number;
1536
+ /** Text height in projected meters — ground-anchored label size (ADR-0028). */
1537
+ labelSize?: number;
1538
+ /** Text height in CSS pixels — screen-anchored label size (ADR-0028). */
1539
+ labelSizePixels?: number;
1540
+ }
1541
+ declare const DEFAULT_BLOCK_MISSION_TASK_OPTIONS: Required<Omit<BlockMissionTaskOptions, "labelSize" | "labelSizePixels">>;
1542
+ /**
1543
+ * Generates a GeoJSON FeatureCollection for a BLOCK mission task symbol (340100).
1544
+ *
1545
+ * Uses the same T-shape geometry as the protection-area Block symbol, with a
1546
+ * "B" label centered on the shaft.
1547
+ *
1548
+ * @param coordinates - [PT. 1, PT. 2, optional PT. 3] as Position arrays
1549
+ * @param options - Configuration options
1550
+ * @returns GeoJSON FeatureCollection containing MultiLineString and Point features
1551
+ */
1552
+ declare function createBlockMissionTaskSymbol(coordinates: Position[], options?: BlockMissionTaskOptions): FeatureCollection<MultiLineString | Point>;
1553
+ //#endregion
1554
+ //#region src/generators/cm34-mission-tasks/breach.d.ts
1555
+ /**
1556
+ * Configuration options for the BREACH tactical symbol.
1557
+ */
1558
+ interface BreachOptions {
1559
+ /** Tick mark length ratio relative to front opening (default: 0.15) */
1560
+ tickLengthRatio?: number;
1561
+ /** Tick mark angle in degrees from perpendicular (default: 45) */
1562
+ tickAngle?: number;
1563
+ /** Gap for the 'B' label as a ratio of the front length (default: 0.2) */
1564
+ labelGapRatio?: number;
1565
+ /** Text height in projected meters — ground-anchored label size (ADR-0028). */
1566
+ labelSize?: number;
1567
+ /** Text height in CSS pixels — screen-anchored label size (ADR-0028). */
1568
+ labelSizePixels?: number;
1569
+ }
1570
+ /**
1571
+ * Default options for the BREACH symbol.
1572
+ */
1573
+ declare const DEFAULT_BREACH_OPTIONS: Required<Omit<BreachOptions, "labelSize" | "labelSizePixels">>;
1574
+ /**
1575
+ * Generates a GeoJSON FeatureCollection for a BREACH mission task symbol (340200).
1576
+ *
1577
+ * A three-sided bracket (see {@link createBracketSymbol}) whose front opening
1578
+ * endpoints terminate in tick marks pointing **outward** (away from the rear
1579
+ * "B" line).
1580
+ *
1581
+ * @param coordinates - [PT. 1, PT. 2, PT. 3] as Position arrays
1582
+ * @param options - Configuration options
1583
+ * @returns GeoJSON FeatureCollection containing MultiLineString and Point features
1584
+ */
1585
+ declare function createBreachSymbol(coordinates: Position[], options?: BreachOptions): FeatureCollection<MultiLineString | Point>;
1586
+ //#endregion
1587
+ //#region src/generators/cm34-mission-tasks/bypass.d.ts
1588
+ /**
1589
+ * Configuration options for the BYPASS tactical symbol.
1590
+ */
1591
+ interface BypassOptions {
1592
+ /** Arrowhead length ratio relative to front opening (default: 0.2) */
1593
+ arrowheadLengthRatio?: number;
1594
+ /** Gap for the 'B' label as a ratio of the front length (default: 0.2) */
1595
+ labelGapRatio?: number;
1596
+ /** Text height in projected meters — ground-anchored label size (ADR-0028). */
1597
+ labelSize?: number;
1598
+ /** Text height in CSS pixels — screen-anchored label size (ADR-0028). */
1599
+ labelSizePixels?: number;
1600
+ }
1601
+ /**
1602
+ * Default options for the BYPASS symbol.
1603
+ */
1604
+ declare const DEFAULT_BYPASS_OPTIONS: Required<Omit<BypassOptions, "labelSize" | "labelSizePixels">>;
1605
+ /**
1606
+ * Generates a GeoJSON FeatureCollection for a BYPASS mission task symbol (340300).
1607
+ *
1608
+ * A three-sided bracket (see {@link createBracketSymbol}) with a "B" label on
1609
+ * the rear line, whose front opening endpoints terminate in outward-flaring
1610
+ * chevron arrowheads instead of tick marks.
1611
+ *
1612
+ * @param coordinates - [PT. 1, PT. 2, PT. 3] as Position arrays
1613
+ * @param options - Configuration options
1614
+ * @returns GeoJSON FeatureCollection containing MultiLineString and Point features
1615
+ */
1616
+ declare function createBypassSymbol(coordinates: Position[], options?: BypassOptions): FeatureCollection<MultiLineString | Point>;
1617
+ //#endregion
1618
+ //#region src/generators/cm34-mission-tasks/canalize.d.ts
1619
+ /**
1620
+ * Configuration options for the CANALIZE tactical symbol.
1621
+ */
1622
+ interface CanalizeOptions {
1623
+ /** Tick mark length ratio relative to front opening (default: 0.15) */
1624
+ tickLengthRatio?: number;
1625
+ /** Tick mark angle in degrees from perpendicular (default: 45) */
1626
+ tickAngle?: number;
1627
+ /** Gap for the 'C' label as a ratio of the front length (default: 0.2) */
1628
+ labelGapRatio?: number;
1629
+ /** Text height in projected meters — ground-anchored label size (ADR-0028). */
1630
+ labelSize?: number;
1631
+ /** Text height in CSS pixels — screen-anchored label size (ADR-0028). */
1632
+ labelSizePixels?: number;
1633
+ }
1634
+ /**
1635
+ * Default options for the CANALIZE symbol.
1636
+ */
1637
+ declare const DEFAULT_CANALIZE_OPTIONS: Required<Omit<CanalizeOptions, "labelSize" | "labelSizePixels">>;
1638
+ /**
1639
+ * Generates a GeoJSON FeatureCollection for a CANALIZE mission task symbol (340400).
1640
+ *
1641
+ * A three-sided bracket (see {@link createBracketSymbol}) whose front opening
1642
+ * endpoints terminate in tick marks pointing **inward** (toward the rear "C"
1643
+ * line), opposite BREACH's outward-facing ticks.
1644
+ *
1645
+ * @param coordinates - [PT. 1, PT. 2, PT. 3] as Position arrays
1646
+ * @param options - Configuration options
1647
+ * @returns GeoJSON FeatureCollection containing MultiLineString and Point features
1648
+ */
1649
+ declare function createCanalizeSymbol(coordinates: Position[], options?: CanalizeOptions): FeatureCollection<MultiLineString | Point>;
1650
+ //#endregion
1651
+ //#region src/generators/cm34-mission-tasks/clear.d.ts
1652
+ /**
1653
+ * Configuration options for the CLEAR tactical mission task symbol.
1654
+ */
1655
+ interface ClearOptions {
1656
+ /**
1657
+ * Padding between the vertical line's endpoints and the outer arrows, as a
1658
+ * ratio of the symbol height. Insets the top and bottom arrows so they sit
1659
+ * clear of PT. 1 / PT. 2 (default: 0.15).
1660
+ */
1661
+ arrowInsetRatio?: number;
1662
+ /** Arrowhead depth (toward the rear) as a ratio of the symbol height (default: 0.15). */
1663
+ arrowheadLengthRatio?: number;
1664
+ /** Arrowhead width (along the vertical line) as a ratio of the symbol height (default: 0.2). */
1665
+ arrowheadWidthRatio?: number;
1666
+ /** Gap for the 'C' label as a ratio of the shaft length (default: 0.2). */
1667
+ labelGapRatio?: number;
1668
+ /** Text height in projected meters — ground-anchored label size (ADR-0028). */
1669
+ labelSize?: number;
1670
+ /** Text height in CSS pixels — screen-anchored label size (ADR-0028). */
1671
+ labelSizePixels?: number;
1672
+ }
1673
+ /**
1674
+ * Default options for the CLEAR symbol.
1675
+ */
1676
+ declare const DEFAULT_CLEAR_OPTIONS: Required<Omit<ClearOptions, "labelSize" | "labelSizePixels">>;
1677
+ /**
1678
+ * Generates a GeoJSON FeatureCollection for a CLEAR mission task symbol (340500).
1679
+ *
1680
+ * A vertical line (PT. 1 → PT. 2) with three arrows pointing at it,
1681
+ * perpendicular to the line. The arrows come from the rear — the side PT. 3
1682
+ * sits on — and their tips touch the vertical line; each carries a shaft
1683
+ * reaching back to the rear. The arrows are evenly spaced along the line, so
1684
+ * the middle arrow's tip sits at the midpoint of the vertical line and its
1685
+ * shaft carries the 'C' glyph. The arrows stay perpendicular to the vertical
1686
+ * line at any rotation.
1687
+ *
1688
+ * Input Points:
1689
+ * - PT. 1: Top endpoint of the vertical line
1690
+ * - PT. 2: Bottom endpoint of the vertical line — defines height with PT. 1
1691
+ * - PT. 3: Rear point — defines the shaft length (and which side the arrows
1692
+ * come from)
1693
+ *
1694
+ * @param coordinates - [PT. 1, PT. 2, PT. 3] as Position arrays
1695
+ * @param options - Configuration options
1696
+ * @returns GeoJSON FeatureCollection containing MultiLineString and Point features
1697
+ */
1698
+ declare function createClearSymbol(coordinates: Position[], options?: ClearOptions): FeatureCollection<MultiLineString | Point>;
1699
+ //#endregion
1700
+ //#region src/generators/cm34-mission-tasks/delay.d.ts
1701
+ interface DelayOptions {
1702
+ /** Arrowhead depth as a ratio of the straight-line length (default: 0.12). */
1703
+ arrowheadLengthRatio?: number;
1704
+ /** Arrowhead width as a ratio of the straight-line length (default: 0.12). */
1705
+ arrowheadWidthRatio?: number;
1706
+ /** Gap for the 'D' label as a ratio of the straight-line length (default: 0.18). */
1707
+ labelGapRatio?: number;
1708
+ /** Number of segments used to approximate the 180-degree arc (default: 32). */
1709
+ arcSegments?: number;
1710
+ /** Text height in projected meters — ground-anchored label size (ADR-0028). */
1711
+ labelSize?: number;
1712
+ /** Text height in CSS pixels — screen-anchored label size (ADR-0028). */
1713
+ labelSizePixels?: number;
1714
+ }
1715
+ declare const DEFAULT_DELAY_OPTIONS: Required<Omit<DelayOptions, "labelSize" | "labelSizePixels">>;
1716
+ declare function createDelaySymbol(coordinates: Position[], options?: DelayOptions): FeatureCollection<MultiLineString | Point>;
1717
+ //#endregion
1718
+ //#region src/generators/cm34-mission-tasks/isolate.d.ts
1719
+ /**
1720
+ * Configuration options for the ISOLATE tactical mission task symbol.
1721
+ */
1722
+ interface IsolateOptions {
1723
+ /** Angular size of the opening on the friendly side, in degrees (default: 30). */
1724
+ openingAngle?: number;
1725
+ /** Number of inward-pointing arrowhead barbs spaced around the closed arc (default: 9). */
1726
+ barbCount?: number;
1727
+ /** Barb length as a ratio of the symbol radius (default: 0.18). */
1728
+ barbLengthRatio?: number;
1729
+ }
1730
+ /**
1731
+ * Generates a GeoJSON FeatureCollection for an ISOLATE mission task symbol (341500).
1732
+ *
1733
+ * A near-complete circle centered on PT. 1 whose radius reaches PT. 2. The arc
1734
+ * starts (bare) at PT. 2's bearing and sweeps clockwise around the closed
1735
+ * portion to a single arrow tip at the far end; the wedge-shaped gap (default
1736
+ * 30°) between that arrow tip and PT. 2 is the opening — the "friendly side".
1737
+ * Inward-pointing arrowhead barbs are spaced along the closed arc, set in from
1738
+ * both ends so they never touch PT. 2 or the arrow tip, conveying the
1739
+ * sealing-off of the enclosed force. Unlike the bracket mission tasks, isolate
1740
+ * carries no glyph label.
1741
+ *
1742
+ * Input Points:
1743
+ * - PT. 1: Center point
1744
+ * - PT. 2: Start point — fixes the radius and the bearing of the opening
1745
+ *
1746
+ * @param coordinates - [PT. 1, PT. 2] as Position arrays
1747
+ * @param options - Configuration options
1748
+ * @returns GeoJSON FeatureCollection containing a single MultiLineString feature
1749
+ */
1750
+ declare function createIsolateSymbol(coordinates: Position[], options?: IsolateOptions): FeatureCollection<MultiLineString>;
1751
+ //#endregion
1752
+ //#region src/generators/cm29-protection-lines/antitankDitch.d.ts
1753
+ interface AntitankDitchOptions extends SmoothLineOptions {
1754
+ /**
1755
+ * The tooth depth in meters. Target tooth spacing is roughly 1.15x this depth.
1756
+ * Ignored when toothHeightPixels is provided with metersPerPixel.
1757
+ * @default 50
1758
+ */
1759
+ toothHeight?: number;
1760
+ /**
1761
+ * The tooth depth in pixels. When provided with metersPerPixel, the meter
1762
+ * size is calculated dynamically to maintain a consistent visual size.
1763
+ * @default 10
1764
+ */
1765
+ toothHeightPixels?: number;
1766
+ /**
1767
+ * The target base span of each triangular tooth as a multiple of tooth depth.
1768
+ * Lower values make sharper, denser teeth; higher values make flatter teeth.
1769
+ * @default 1.15
1770
+ */
1771
+ toothWidthRatio?: number;
1772
+ /**
1773
+ * The meters-per-pixel ratio at the current zoom level and latitude. Required
1774
+ * when using toothHeightPixels for zoom-aware sizing.
1775
+ */
1776
+ metersPerPixel?: number;
1777
+ }
1778
+ declare const DEFAULT_ANTITANK_DITCH_OPTIONS: Required<Omit<AntitankDitchOptions, "metersPerPixel">>;
1779
+ declare function createAntitankDitchUnderConstruction(positions: Position[], options?: AntitankDitchOptions): FeatureCollection<MultiLineString, {
1780
+ part: "ditch";
1781
+ }>;
1782
+ declare function createAntitankDitchCompleted(positions: Position[], options?: AntitankDitchOptions): FeatureCollection<MultiPolygon, {
1783
+ part: "teeth";
1784
+ fill: boolean;
1785
+ }>;
1786
+ //#endregion
1787
+ //#region src/generators/cm29-protection-lines/antitankWall.d.ts
1788
+ interface AntitankWallOptions extends AntitankDitchOptions {
1789
+ /**
1790
+ * The total gap between consecutive tooth bases as a multiple of tooth base
1791
+ * width. Use 0 for touching teeth; higher values create wider gaps.
1792
+ * @default 1.35
1793
+ */
1794
+ toothSpacingRatio?: number;
1795
+ }
1796
+ declare const DEFAULT_ANTITANK_WALL_OPTIONS: Required<Omit<AntitankWallOptions, "metersPerPixel">>;
1797
+ declare function createAntitankWall(positions: Position[], options?: AntitankWallOptions): FeatureCollection<MultiLineString, {
1798
+ part: "wall";
1799
+ }>;
1800
+ //#endregion
1801
+ //#region src/generators/cm29-protection-lines/fortifiedLine.d.ts
1802
+ /**
1803
+ * Configuration options for the Fortified Line geometry.
1804
+ */
1805
+ interface FortifiedLineOptions {
1806
+ /**
1807
+ * The size of the square teeth in meters.
1808
+ * This controls both the width and height of the castellated pattern.
1809
+ * This is ignored if toothSizePixels is provided along with metersPerPixel.
1810
+ * @default 50
1811
+ */
1812
+ toothSize?: number;
1813
+ /**
1814
+ * The size of the square teeth in pixels.
1815
+ * When provided along with metersPerPixel, the actual meter size is calculated
1816
+ * dynamically to maintain consistent visual size on screen.
1817
+ * Takes precedence over toothSize when metersPerPixel is also provided.
1818
+ * @default 10
1819
+ */
1820
+ toothSizePixels?: number;
1821
+ /**
1822
+ * The meters-per-pixel ratio at the current zoom level and latitude.
1823
+ * Required when using toothSizePixels for zoom-aware sizing.
1824
+ */
1825
+ metersPerPixel?: number;
1826
+ /**
1827
+ * Round the line's corners by curving the base path through the control
1828
+ * points (centripetal Catmull-Rom spline) before generating the castellated
1829
+ * teeth, matching the rounded shape option on the Fortified Area and Battle
1830
+ * Position measures. With fewer than three control points the path is left
1831
+ * unchanged (a single segment cannot be smoothed).
1832
+ * @default false
1833
+ */
1834
+ smooth?: boolean;
1835
+ /**
1836
+ * Number of samples per segment when `smooth` is enabled. Higher values yield
1837
+ * a denser, smoother curve.
1838
+ * @default 16
1839
+ */
1840
+ smoothResolution?: number;
1841
+ }
1842
+ /**
1843
+ * Default options for the Fortified Line graphic.
1844
+ */
1845
+ declare const DEFAULT_FORTIFIED_LINE_OPTIONS: Required<Omit<FortifiedLineOptions, "metersPerPixel">>;
1846
+ /**
1847
+ * Creates a Fortified Line tactical graphic.
1848
+ *
1849
+ * Generates a castellated/square-wave line representing a fortified line.
1850
+ * The line consists of square "teeth" that project perpendicular to the base path.
1851
+ *
1852
+ * @param positions - Array of GeoJSON positions defining the base path
1853
+ * @param options - Configuration options for the graphic
1854
+ * @returns A GeoJSON FeatureCollection containing the castellated LineString
1855
+ */
1856
+ declare function createFortifiedLine(positions: Position[], options?: FortifiedLineOptions): FeatureCollection<LineString>;
1857
+ //#endregion
1858
+ //#region src/generators/cm15-maneuver-areas/fortifiedArea.d.ts
1859
+ /**
1860
+ * Configuration options for the Fortified Area. Inherits the Fortified Line
1861
+ * options (including `smooth`/`smoothResolution`) unchanged; the area applies
1862
+ * the smoothing as a closed Catmull-Rom ring rather than an open spline. Also
1863
+ * carries the shared {@link AreaLabelOptions} label placement (a plain
1864
+ * intersection, not a re-derivation, so the aliased
1865
+ * {@link DEFAULT_FORTIFIED_AREA_OPTIONS} default still typechecks unchanged —
1866
+ * `AreaLabelOptions`'s fields are all optional).
1867
+ */
1868
+ type FortifiedAreaOptions = FortifiedLineOptions & AreaLabelOptions;
1869
+ declare const DEFAULT_FORTIFIED_AREA_OPTIONS: FortifiedAreaOptions;
1870
+ /**
1871
+ * Creates a Fortified Area tactical graphic.
1872
+ *
1873
+ * Generates a polygon with a castellated/square-wave boundary representing a fortified area.
1874
+ * The boundary consists of square "teeth" that project perpendicular to the path.
1875
+ *
1876
+ * @param positions - Array of GeoJSON positions defining the area boundary.
1877
+ * The first and last positions should match to close the polygon,
1878
+ * or it will be closed automatically.
1879
+ * @param options - Configuration options for the graphic
1880
+ * @param textAmplifiers - Field T (bare, no prefix — "TANGO", not "FA TANGO")
1881
+ * plus Field H/W/W1, centered on the pre-teeth boundary ring (see
1882
+ * `boundaryInput` below); no Field N — Fortified Area's L-15 template
1883
+ * carries no ENY marker.
1884
+ * @returns A GeoJSON FeatureCollection containing the castellated Polygon
1885
+ * plus any label Points
1886
+ */
1887
+ declare function createFortifiedArea(positions: Position[], options?: FortifiedAreaOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<Polygon | Point>;
1888
+ //#endregion
1889
+ //#region src/generators/cm27-protection-areas/block.d.ts
1890
+ type BlockOptions = Record<never, never>;
1891
+ declare const DEFAULT_BLOCK_OPTIONS: BlockOptions;
1892
+ /**
1893
+ * Generates a GeoJSON FeatureCollection for a "Block" tactical symbol (T-shape).
1894
+ *
1895
+ * @param coordinates - An array of GeoJSON Positions (Lon/Lat).
1896
+ * Expects exactly 3 points:
1897
+ * - PT1 & PT2: Endpoints of the vertical line.
1898
+ * - PT3: Defines the endpoint of the horizontal line (stem).
1899
+ * @param options - Configuration options.
1900
+ * @returns A GeoJSON FeatureCollection containing a LineString.
1901
+ */
1902
+ declare function createBlock(coordinates: Position[], _options?: BlockOptions): FeatureCollection<LineString>;
1903
+ //#endregion
1904
+ //#region src/generators/cm27-protection-areas/disrupt.d.ts
1905
+ interface DisruptOptions {
1906
+ middleArrowLengthRatio?: number;
1907
+ bottomArrowLengthRatio?: number;
1908
+ shaftLengthRatio?: number;
1909
+ arrowheadLengthRatio?: number;
1910
+ arrowheadWidthRatio?: number;
1911
+ }
1912
+ declare const DEFAULT_DISRUPT_OPTIONS: Required<DisruptOptions>;
1913
+ /**
1914
+ * Generates a GeoJSON FeatureCollection for a DISRUPT tactical symbol.
1915
+ *
1916
+ * Input:
1917
+ * - PT1: Top endpoint of the vertical spine
1918
+ * - PT2: Bottom endpoint of the vertical spine
1919
+ * - PT3: Reference point used to determine the longest-arrow offset
1920
+ *
1921
+ * Geometry:
1922
+ * - Spine: PT1 -> PT2
1923
+ * - PT2 -> PT1 defines the baseline orientation; arrow direction is constrained to its perpendicular axis
1924
+ * - PT3 is decomposed and projected onto the perpendicular axis through PT1 to derive a valid longest-arrow tip
1925
+ * - Three arrows placed at PT1, midpoint(PT1, PT2), and PT2
1926
+ * - Center shaft extends opposite arrow direction from midpoint with the same length as the middle arrow
1927
+ * - Top arrow is longest
1928
+ * - Middle and bottom arrows are proportional to the longest arrow
1929
+ * - Arrow heads are returned as filled triangle polygons
1930
+ */
1931
+ declare function createDisrupt(coordinates: Position[], options?: DisruptOptions): FeatureCollection<MultiLineString | MultiPolygon>;
1932
+ //#endregion
1933
+ //#region src/generators/cm27-protection-areas/fix.d.ts
1934
+ interface FixOptions {
1935
+ arrowheadAngle?: number;
1936
+ arrowheadLengthRatio?: number;
1937
+ endSegmentRatio?: number;
1938
+ }
1939
+ declare const DEFAULT_FIX_OPTIONS: Required<FixOptions>;
1940
+ /**
1941
+ * Generates a GeoJSON FeatureCollection for a FIX tactical symbol.
1942
+ *
1943
+ * Input:
1944
+ * - PT1: Arrow tip end
1945
+ * - PT2: Opposite end
1946
+ *
1947
+ * Notes:
1948
+ * - Requires exactly two points.
1949
+ * - Produces one MultiLineString feature containing the zigzag body and open arrowhead wings.
1950
+ */
1951
+ declare function createFix(coordinates: Position[], options?: FixOptions): FeatureCollection<MultiLineString>;
1952
+ //#endregion
1953
+ //#region src/generators/cm27-protection-areas/turn.d.ts
1954
+ interface TurnOptions {
1955
+ arrowheadLengthRatio?: number;
1956
+ arrowheadWidthRatio?: number;
1957
+ arcSegments?: number;
1958
+ }
1959
+ declare const DEFAULT_TURN_OPTIONS: Required<TurnOptions>;
1960
+ /**
1961
+ * Generates a quarter-circle shaft from PT2 (rear) to the arrowhead base.
1962
+ * The arrowhead continues tangent to the arc and places its tip at PT1.
1963
+ * PT3 selects which side of the PT2 -> PT1 chord contains the arc.
1964
+ */
1965
+ declare function createTurn(coordinates: Position[], options?: TurnOptions): FeatureCollection<MultiLineString | MultiPolygon>;
1966
+ //#endregion
1967
+ //#region src/generators/cm27-protection-areas/obstacleBypassEasy.d.ts
1968
+ interface ObstacleBypassEasyOptions {
1969
+ arrowheadLengthRatio?: number;
1970
+ arrowheadWidthRatio?: number;
1971
+ defaultLengthRatio?: number;
1972
+ }
1973
+ declare const DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS: Required<ObstacleBypassEasyOptions>;
1974
+ /**
1975
+ * Generates a GeoJSON FeatureCollection for an "Obstacle Bypass Easy" symbol.
1976
+ *
1977
+ * Input:
1978
+ * - PT1 and PT2 define the tips of the two arrowheads (opening and symbol height)
1979
+ * - PT3 defines signed symbol length along the perpendicular axis through midpoint(PT1, PT2)
1980
+ *
1981
+ * Geometry:
1982
+ * - Rear line is parallel to opening(PT1-PT2) and has equal length
1983
+ * - Two side rails run from rear endpoints to the arrowheads and are parallel to each other
1984
+ * - Rear line is perpendicular to both side rails
1985
+ * - Arrow heads are filled triangle polygons at PT1 and PT2
1986
+ */
1987
+ declare function createObstacleBypassEasy(coordinates: Position[], options?: ObstacleBypassEasyOptions): FeatureCollection<MultiLineString | MultiPolygon>;
1988
+ //#endregion
1989
+ //#region src/generators/cm27-protection-areas/obstacleBypassDifficult.d.ts
1990
+ interface ObstacleBypassDifficultOptions {
1991
+ arrowheadLengthRatio?: number;
1992
+ arrowheadWidthRatio?: number;
1993
+ defaultLengthRatio?: number;
1994
+ zigzagAmplitudeRatio?: number;
1995
+ zigzagSpacingRatio?: number;
1996
+ }
1997
+ declare const DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS: Required<ObstacleBypassDifficultOptions>;
1998
+ declare function createObstacleBypassDifficult(coordinates: Position[], options?: ObstacleBypassDifficultOptions): FeatureCollection<MultiLineString | MultiPolygon>;
1999
+ //#endregion
2000
+ //#region src/generators/cm27-protection-areas/obstacleBypassImpossible.d.ts
2001
+ interface ObstacleBypassImpossibleOptions {
2002
+ arrowheadLengthRatio?: number;
2003
+ arrowheadWidthRatio?: number;
2004
+ defaultLengthRatio?: number;
2005
+ rearBarLengthRatio?: number;
2006
+ rearGapRatio?: number;
2007
+ }
2008
+ declare const DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS: Required<ObstacleBypassImpossibleOptions>;
2009
+ /**
2010
+ * Generates a GeoJSON FeatureCollection for an "Obstacle Bypass Impossible" symbol.
2011
+ *
2012
+ * Input:
2013
+ * - PT1 and PT2 define the tips of the two arrowheads (opening and symbol height)
2014
+ * - PT3 defines signed symbol length along the perpendicular axis through midpoint(PT1, PT2)
2015
+ *
2016
+ * Geometry:
2017
+ * - Same base as obstacle bypass easy
2018
+ * - Rear line has two short perpendicular bars on the rear side
2019
+ */
2020
+ declare function createObstacleBypassImpossible(coordinates: Position[], options?: ObstacleBypassImpossibleOptions): FeatureCollection<MultiLineString | MultiPolygon>;
2021
+ //#endregion
2022
+ //#region src/registry.d.ts
2023
+ /**
2024
+ * The single source of truth for the catalog: one **control measure
2025
+ * definition** record per measure, co-located with its generator and collected
2026
+ * here. The `ControlMeasureId` union, `OptionsByKind`, the generator dispatch,
2027
+ * the default options, and rule resolution are all *derived* from this map
2028
+ * rather than maintained as parallel tables. Adding a measure is a one-file
2029
+ * change plus one line here. See ADR-0013.
2030
+ */
2031
+ declare const DEFINITIONS: {
2032
+ boundary: ControlMeasureDefinition<"boundary", typeof createBoundary>;
2033
+ "light-line": ControlMeasureDefinition<"light-line", typeof createLightLine>;
2034
+ "engineer-work-line": ControlMeasureDefinition<"engineer-work-line", typeof createEngineerWorkLine>;
2035
+ "generic-c2-line": ControlMeasureDefinition<"generic-c2-line", typeof createGenericC2Line>;
2036
+ "battle-position": ControlMeasureDefinition<"battle-position", typeof createBattlePosition>;
2037
+ "strong-point": ControlMeasureDefinition<"strong-point", typeof createStrongPoint>;
2038
+ ambush: ControlMeasureDefinition<"ambush", (controlPoints: import("geojson").Position[], options?: AmbushOptions) => import("geojson").FeatureCollection<import("geojson").MultiLineString, Record<string, never>>>;
2039
+ "principal-direction-of-fire": ControlMeasureDefinition<"principal-direction-of-fire", typeof createPrincipalDirectionOfFire>;
2040
+ "final-protective-fire-left": ControlMeasureDefinition<"final-protective-fire-left", typeof createFinalProtectiveFireLeft>;
2041
+ "final-protective-fire-right": ControlMeasureDefinition<"final-protective-fire-right", typeof createFinalProtectiveFireRight>;
2042
+ "search-area": ControlMeasureDefinition<"search-area", (controlPoints: import("geojson").Position[], options?: TacticalArrowOptions) => import("geojson").FeatureCollection<import("geojson").MultiLineString | import("geojson").MultiPolygon, {
2043
+ part: "shaft" | "head";
2044
+ fill?: boolean;
2045
+ }>>;
2046
+ encirclement: ControlMeasureDefinition<"encirclement", typeof createEncirclement>;
2047
+ area: ControlMeasureDefinition<"area", typeof createArea>;
2048
+ "assembly-area": ControlMeasureDefinition<"assembly-area", typeof createAssemblyArea>;
2049
+ "joint-tactical-action-area": ControlMeasureDefinition<"joint-tactical-action-area", typeof createJointTacticalActionArea>;
2050
+ "submarine-action-area": ControlMeasureDefinition<"submarine-action-area", typeof createSubmarineActionArea>;
2051
+ "submarine-generated-action-area": ControlMeasureDefinition<"submarine-generated-action-area", typeof createSubmarineGeneratedActionArea>;
2052
+ "drop-zone": ControlMeasureDefinition<"drop-zone", typeof createDropZone>;
2053
+ "extraction-zone": ControlMeasureDefinition<"extraction-zone", typeof createExtractionZone>;
2054
+ "landing-zone": ControlMeasureDefinition<"landing-zone", typeof createLandingZone>;
2055
+ "pickup-zone": ControlMeasureDefinition<"pickup-zone", typeof createPickupZone>;
2056
+ "assault-position": ControlMeasureDefinition<"assault-position", typeof createAssaultPosition>;
2057
+ "attack-position": ControlMeasureDefinition<"attack-position", typeof createAttackPosition>;
2058
+ "objective-area": ControlMeasureDefinition<"objective-area", typeof createObjectiveArea>;
2059
+ "area-of-operations": ControlMeasureDefinition<"area-of-operations", typeof createAreaOfOperations>;
2060
+ "named-area-of-interest": ControlMeasureDefinition<"named-area-of-interest", typeof createNamedAreaOfInterest>;
2061
+ "target-area-of-interest": ControlMeasureDefinition<"target-area-of-interest", typeof createTargetAreaOfInterest>;
2062
+ "airfield-zone": ControlMeasureDefinition<"airfield-zone", typeof createAirfieldZone>;
2063
+ "base-camp": ControlMeasureDefinition<"base-camp", typeof createBaseCamp>;
2064
+ "guerrilla-base": ControlMeasureDefinition<"guerrilla-base", typeof createGuerrillaBase>;
2065
+ "generic-c2-area": ControlMeasureDefinition<"generic-c2-area", typeof createGenericC2Area>;
2066
+ "main-attack": ControlMeasureDefinition<"main-attack", typeof createMainAttack>;
2067
+ "supporting-attack": ControlMeasureDefinition<"supporting-attack", typeof createSupportingAttack>;
2068
+ "classic-arrow": ControlMeasureDefinition<"classic-arrow", typeof createClassicArrow>;
2069
+ "block-arrow": ControlMeasureDefinition<"block-arrow", typeof createBlockArrow>;
2070
+ line: ControlMeasureDefinition<"line", typeof createGenericLine>;
2071
+ polygon: ControlMeasureDefinition<"polygon", typeof createGenericPolygon>;
2072
+ rectangle: ControlMeasureDefinition<"rectangle", typeof createGenericRectangle>;
2073
+ circle: ControlMeasureDefinition<"circle", typeof createGenericCircle>;
2074
+ "airborne-attack": ControlMeasureDefinition<"airborne-attack", typeof createAirborneAttack>;
2075
+ "attack-helicopter": ControlMeasureDefinition<"attack-helicopter", typeof createAttackHelicopter>;
2076
+ "support-by-fire": ControlMeasureDefinition<"support-by-fire", typeof createSupportByFire>;
2077
+ "attack-by-fire": ControlMeasureDefinition<"attack-by-fire", typeof createAttackByFire>;
2078
+ flot: ControlMeasureDefinition<"flot", typeof createFLOT>;
2079
+ "phase-line": ControlMeasureDefinition<"phase-line", typeof createPhaseLine>;
2080
+ "handover-line": ControlMeasureDefinition<"handover-line", typeof createHandoverLine>;
2081
+ "battle-handover-line": ControlMeasureDefinition<"battle-handover-line", typeof createBattleHandoverLine>;
2082
+ "block-mission-task": ControlMeasureDefinition<"block-mission-task", typeof createBlockMissionTaskSymbol>;
2083
+ breach: ControlMeasureDefinition<"breach", typeof createBreachSymbol>;
2084
+ bypass: ControlMeasureDefinition<"bypass", typeof createBypassSymbol>;
2085
+ canalize: ControlMeasureDefinition<"canalize", typeof createCanalizeSymbol>;
2086
+ clear: ControlMeasureDefinition<"clear", typeof createClearSymbol>;
2087
+ delay: ControlMeasureDefinition<"delay", typeof createDelaySymbol>;
2088
+ isolate: ControlMeasureDefinition<"isolate", typeof createIsolateSymbol>;
2089
+ "antitank-ditch-under-construction": ControlMeasureDefinition<"antitank-ditch-under-construction", typeof createAntitankDitchUnderConstruction>;
2090
+ "antitank-ditch-completed": ControlMeasureDefinition<"antitank-ditch-completed", typeof createAntitankDitchCompleted>;
2091
+ "antitank-wall": ControlMeasureDefinition<"antitank-wall", typeof createAntitankWall>;
2092
+ "fortified-line": ControlMeasureDefinition<"fortified-line", typeof createFortifiedLine>;
2093
+ "fortified-area": ControlMeasureDefinition<"fortified-area", typeof createFortifiedArea>;
2094
+ block: ControlMeasureDefinition<"block", typeof createBlock>;
2095
+ disrupt: ControlMeasureDefinition<"disrupt", typeof createDisrupt>;
2096
+ fix: ControlMeasureDefinition<"fix", typeof createFix>;
2097
+ turn: ControlMeasureDefinition<"turn", typeof createTurn>;
2098
+ "obstacle-bypass-easy": ControlMeasureDefinition<"obstacle-bypass-easy", typeof createObstacleBypassEasy>;
2099
+ "obstacle-bypass-difficult": ControlMeasureDefinition<"obstacle-bypass-difficult", typeof createObstacleBypassDifficult>;
2100
+ "obstacle-bypass-impossible": ControlMeasureDefinition<"obstacle-bypass-impossible", typeof createObstacleBypassImpossible>;
2101
+ };
2102
+ type Definitions = typeof DEFINITIONS;
2103
+ /** Stable string id of a control measure — the keys of {@link DEFINITIONS}. */
2104
+ type ControlMeasureId = keyof Definitions;
2105
+ /**
2106
+ * The discriminant for {@link ControlMeasure}. Identical to
2107
+ * {@link ControlMeasureId}; kept as a distinct name for the `<K extends
2108
+ * ControlMeasureKind>` generics threaded through rendering and edit sessions.
2109
+ */
2110
+ type ControlMeasureKind = ControlMeasureId;
2111
+ /** Strips the internal `validationMode` knob from a public options surface. */
2112
+ type PublicOptions<T> = Omit<T, "validationMode">;
2113
+ /**
2114
+ * The per-kind public options map, derived covariantly from each definition's
2115
+ * generator (see {@link OptsOf}). Empty-options kinds resolve to `{}` — exactly
2116
+ * as loose as the former hand-written table. See ADR-0013.
2117
+ */
2118
+ type OptionsByKind = { [K in keyof Definitions]: PublicOptions<OptsOf<Definitions[K]>> };
2119
+ /** Insertion-ordered list of every control-measure id. */
2120
+ declare const CONTROL_MEASURE_IDS: readonly ControlMeasureId[];
2121
+ declare const CONTROL_MEASURE_METADATA: Readonly<Record<ControlMeasureId, ControlMeasureMetadata>>;
2122
+ declare function listControlMeasureMetadata(): readonly ControlMeasureMetadata[];
2123
+ declare function getControlMeasureMetadata(id: ControlMeasureId): ControlMeasureMetadata;
2124
+ declare function getControlMeasureMetadataByValue(value: string): ControlMeasureMetadata | undefined;
2125
+ declare function getDefaultOptions<K extends ControlMeasureKind>(kind: K): OptionsByKind[K];
2126
+ //#endregion
2127
+ //#region src/style.d.ts
2128
+ /**
2129
+ * Framework-agnostic style hints attached to a `ControlMeasure`.
2130
+ *
2131
+ * Mirrors the per-feature subset of what map adapters render. The renderer
2132
+ * fans these into each emitted feature's `properties.style` ([[StyleHints]]).
2133
+ * Adapters merge them over their layer-level style; generator-emitted hints
2134
+ * on individual features win over both.
2135
+ */
2136
+ interface ControlMeasureStyle {
2137
+ /**
2138
+ * The single symbol color. Control measures are monocolor: one color paints
2139
+ * every part, stroked or filled. Input-only — resolved into concrete
2140
+ * `strokeColor` / `fillColor` per feature by the renderer and never emitted
2141
+ * on output. `strokeColor` / `fillColor` act as optional per-channel
2142
+ * overrides. See ADR-0011.
2143
+ */
2144
+ color?: string;
2145
+ strokeColor?: string;
2146
+ strokeWidth?: number;
2147
+ strokeDash?: number[];
2148
+ fillColor?: string;
2149
+ }
2150
+ //#endregion
2151
+ //#region src/instance.d.ts
2152
+ interface ControlMeasure<K extends ControlMeasureKind = ControlMeasureKind> {
2153
+ id: string;
2154
+ kind: K;
2155
+ controlPoints: Position[];
2156
+ options?: OptionsByKind[K];
2157
+ style?: ControlMeasureStyle;
2158
+ properties?: Record<string, unknown>;
2159
+ /** Free-text amplifier fields (MIL-STD-2525E Appendix L Table L-II); see `./text-amplifiers`. */
2160
+ textAmplifiers?: TextAmplifiers;
2161
+ schemaVersion?: 1;
2162
+ }
2163
+ declare function isKind<K extends ControlMeasureKind>(cm: ControlMeasure, kind: K): cm is ControlMeasure<K>;
2164
+ /**
2165
+ * Deep-clone a `ControlMeasure` so held references survive mutations to the
2166
+ * original (and vice versa). Used by the session façade to build the
2167
+ * `measure` half of `ControlMeasureSnapshot`. Nested values inside
2168
+ * `options`, `style`, `properties`, and `textAmplifiers` are cloned too —
2169
+ * `properties` is `Record<string, unknown>` and may carry arbitrary host
2170
+ * metadata, so a shallow copy would leak shared references.
2171
+ *
2172
+ * Backed by `structuredClone`: only structured-cloneable values are
2173
+ * supported (no functions, DOM nodes, class instances). Absent optional
2174
+ * fields stay absent on the clone.
2175
+ */
2176
+ declare function cloneControlMeasure<K extends ControlMeasureKind>(cm: ControlMeasure<K>): ControlMeasure<K>;
2177
+ //#endregion
2178
+ //#region src/rendered.d.ts
2179
+ /**
2180
+ * Per-feature style hints carried on `properties.style`.
2181
+ *
2182
+ * These are *resolved*: `renderControlMeasure` cascades `graphicsStyle` →
2183
+ * `cm.style` → any generator pattern hint, then expands the monocolor `color`
2184
+ * into concrete `strokeColor` / `fillColor` per feature (see ADR-0011 and
2185
+ * `resolveSymbolColor`). Output therefore carries concrete colors, never the
2186
+ * input-only `color` key, and a `fillColor` only on parts the generator
2187
+ * marked filled.
2188
+ *
2189
+ * Generators contribute paint *role* and *pattern* (a part is filled; a
2190
+ * sub-line is dashed regardless of the user's stroke), never a hue. Adapters
2191
+ * merge the resulting `StyleHints` over their layer-level style at draw time.
2192
+ */
2193
+ interface StyleHints extends ControlMeasureStyle {}
2194
+ /**
2195
+ * Per-feature properties emitted by `renderControlMeasure`.
2196
+ *
2197
+ * Stable-id contract — every feature produced by the renderer has:
2198
+ * - `feature.id` of the form `${cmId}:${part}:${index}`
2199
+ * - `properties.part` matching the `part` segment of the id
2200
+ * - `properties.index` matching the `index` segment of the id
2201
+ *
2202
+ * Adapters rely on this contract to diff renders in place without keeping
2203
+ * their own bookkeeping. Use `controlMeasureIdFromFeature` to recover the
2204
+ * `cmId` from a picked feature.
2205
+ */
2206
+ interface FeaturePartProps {
2207
+ part: string;
2208
+ index: number;
2209
+ style?: StyleHints;
2210
+ /** Label text emitted by generators (e.g. breach "B"). */
2211
+ text?: string;
2212
+ /** Label rotation in radians, emitted by generators. */
2213
+ rotation?: number;
2214
+ /**
2215
+ * Horizontal text alignment relative to the label point: `"start"` = the
2216
+ * text begins at the point, `"end"` = it ends there. Absent = centered.
2217
+ */
2218
+ textAnchor?: "start" | "end";
2219
+ /**
2220
+ * Screen-anchored label size in CSS pixels — held constant on screen
2221
+ * (ADR-0028). Mutually exclusive with `textSizeMeters`; absent both,
2222
+ * adapters render their engine default, screen-fixed.
2223
+ */
2224
+ textSizePixels?: number;
2225
+ /**
2226
+ * Ground-anchored label text height in projected meters (ADR-0028).
2227
+ * Adapters render `clamp(textSizeMeters / resolution, min, max)` px, per
2228
+ * their configured clamp band.
2229
+ */
2230
+ textSizeMeters?: number;
2231
+ }
2232
+ /**
2233
+ * Output of `renderControlMeasure`. A GeoJSON `FeatureCollection` whose
2234
+ * features satisfy the `FeaturePartProps` stable-id contract. See ADR-0010.
2235
+ */
2236
+ type ControlMeasureRender = FeatureCollection<Geometry, FeaturePartProps>;
2237
+ /**
2238
+ * A `ControlMeasure` paired with its `Render` at a single point in time.
2239
+ *
2240
+ * The unit delivered to `EditChangeEvent` listeners (as `measure` and
2241
+ * `previous`) and resolved from `TacticalDraw.draw()` / `.edit()`. The
2242
+ * `measure` half is a defensive clone (see `cloneControlMeasure`) so held
2243
+ * references remain valid after the originating session has closed.
2244
+ *
2245
+ * See ADR-0010.
2246
+ */
2247
+ interface ControlMeasureSnapshot<K extends ControlMeasureKind = ControlMeasureKind> {
2248
+ measure: ControlMeasure<K>;
2249
+ render: ControlMeasureRender;
2250
+ }
2251
+ /**
2252
+ * Recover the originating control measure id (`cmId`) from a feature emitted
2253
+ * by `renderControlMeasure`. The feature id must match the stable-id contract
2254
+ * `${cmId}:${part}:${index}`; otherwise this throws.
2255
+ */
2256
+ declare function controlMeasureIdFromFeature(feature: Feature<Geometry, FeaturePartProps> | {
2257
+ id?: string | number;
2258
+ }): string;
2259
+ //#endregion
2260
+ //#region src/renderControlMeasure.d.ts
2261
+ interface RenderOptions {
2262
+ validationMode?: ValidationMode;
2263
+ /**
2264
+ * Façade-level default style (third / lowest-priority layer). Merged
2265
+ * shallowly under `cm.style` and any per-feature generator hint. When
2266
+ * omitted, style resolution matches the prior two-layer behavior.
2267
+ */
2268
+ graphicsStyle?: ControlMeasureStyle;
2269
+ }
2270
+ /**
2271
+ * Pure render: `ControlMeasure` → `ControlMeasureRender` (a
2272
+ * `FeatureCollection` of `FeaturePartProps`-typed features). Per-feature
2273
+ * stable ids follow `${cm.id}:${part}:${index}`. Style is resolved from the
2274
+ * three layers (graphicsStyle, cm.style, generator hint) and stamped on
2275
+ * `properties.style` when non-empty.
2276
+ */
2277
+ declare function renderControlMeasure<K extends ControlMeasureKind>(cm: ControlMeasure<K>, opts?: RenderOptions): ControlMeasureRender;
2278
+ //#endregion
2279
+ //#region src/freeze-orientation.d.ts
2280
+ /**
2281
+ * Dispatches to a measure kind's `freezeOrientation` hook (see
2282
+ * {@link import("./define").ControlMeasureDefinition.freezeOrientation}),
2283
+ * pinning orientation-derived option defaults to their current concrete
2284
+ * values ahead of a rigid rotation of `controlPoints`. Returns `undefined`
2285
+ * when the kind declares no hook, or when the hook itself finds nothing to
2286
+ * freeze. Edit hosts call this when a rotate gesture starts (ADR-0023).
2287
+ */
2288
+ declare function freezeOrientationOptions<K extends ControlMeasureKind>(kind: K, controlPoints: Position[], options: OptionsByKind[K] | undefined): Partial<OptionsByKind[K]> | undefined;
2289
+ //#endregion
2290
+ //#region src/styleResolver.d.ts
2291
+ /**
2292
+ * Three-layer style precedence for `renderControlMeasure`.
2293
+ *
2294
+ * Lower-priority → higher-priority: `graphicsStyle` (façade default) →
2295
+ * `measureStyle` (`cm.style`) → `generatorStyle` (per-feature hint emitted
2296
+ * by a generator). Merge is shallow and per-property; higher-priority layers
2297
+ * win key by key. Explicit `null` / `undefined` in a higher-priority layer
2298
+ * is treated as "no opinion" and does not clear a lower-priority key.
2299
+ *
2300
+ * Returns `undefined` when all three layers are absent so the renderer can
2301
+ * omit `properties.style` entirely — keeps the no-style case byte-identical
2302
+ * to a property-less feature.
2303
+ *
2304
+ * Pure function: inputs are never mutated; the returned object is always a
2305
+ * fresh allocation when defined.
2306
+ */
2307
+ declare function resolveStyleHints(graphicsStyle: ControlMeasureStyle | undefined, measureStyle: ControlMeasureStyle | undefined, generatorStyle: StyleHints | undefined): StyleHints | undefined;
2308
+ //#endregion
2309
+ //#region src/toSimpleStyle.d.ts
2310
+ /**
2311
+ * simplestyle-spec properties (the subset this library can express), flat on
2312
+ * `properties`. All keys are optional.
2313
+ *
2314
+ * @see https://github.com/mapbox/simplestyle-spec
2315
+ */
2316
+ interface SimpleStyleProps extends FeaturePartProps {
2317
+ stroke?: string;
2318
+ "stroke-width"?: number;
2319
+ "stroke-opacity"?: number;
2320
+ fill?: string;
2321
+ "fill-opacity"?: number;
2322
+ }
2323
+ /**
2324
+ * A `FeatureCollection` whose features carry simplestyle-spec keys instead of
2325
+ * the nested `properties.style` slot. The `FeaturePartProps` stable-id
2326
+ * contract (`part`, `index`, `feature.id`) is preserved.
2327
+ */
2328
+ type SimpleStyleRender = FeatureCollection<Geometry, SimpleStyleProps>;
2329
+ /**
2330
+ * Lossy interop transform: `ControlMeasureRender` → a `FeatureCollection`
2331
+ * whose features carry simplestyle-spec keys. Operates on the already-resolved
2332
+ * per-feature `style`, so it composes after `renderControlMeasure`'s
2333
+ * three-layer merge and stays a pure post-processing step.
2334
+ *
2335
+ * Lossy mapping, by design:
2336
+ * - `strokeDash` has no simplestyle equivalent and is dropped — dashed
2337
+ * doctrinal sub-lines render solid in simplestyle consumers.
2338
+ * - colors must be hex or `rgb()/rgba()`; alpha becomes `*-opacity`. Other
2339
+ * color forms (named, `hsl()`) are omitted rather than guessed.
2340
+ */
2341
+ declare function toSimpleStyle(render: ControlMeasureRender): SimpleStyleRender;
2342
+ //#endregion
2343
+ //#region src/internal/graphics-utils.d.ts
2344
+ /**
2345
+ * Small value used to avoid division by zero and floating-point precision issues.
2346
+ */
2347
+ declare const EPSILON = 0.000001;
2348
+ /**
2349
+ * Rounds a number to a specified number of decimal places.
2350
+ */
2351
+ declare const roundToFixed: (v: number, precision?: number) => number;
2352
+ /**
2353
+ * Calculates the meters-per-pixel ratio at a given latitude and zoom level.
2354
+ *
2355
+ * This is essential for maintaining consistent visual sizes on the map
2356
+ * regardless of zoom level. The formula accounts for:
2357
+ * - The Web Mercator projection's tile-based structure
2358
+ * - The latitude-dependent scale distortion in Mercator projection
2359
+ *
2360
+ * @param latitude - The latitude in degrees (affects scale due to projection)
2361
+ * @param zoomLevel - The current map zoom level
2362
+ * @returns The number of meters represented by one pixel at the given location and zoom
2363
+ *
2364
+ * @example
2365
+ * ```typescript
2366
+ * // At zoom 10, latitude 45°
2367
+ * const mpp = getMetersPerPixel(45, 10);
2368
+ * // To get a 20-pixel radius in meters:
2369
+ * const radiusMeters = 20 * mpp;
2370
+ * ```
2371
+ */
2372
+ declare const getMetersPerPixel: (latitude: number, zoomLevel: number) => number;
2373
+ //#endregion
2374
+ //#region src/draw-rules/baseline-frame.d.ts
2375
+ type BaselineFrameOrigin = "p1" | "p2" | "midpoint";
2376
+ type BaselineFrameNormal = "right" | "left";
2377
+ interface BaselineFrameOptions {
2378
+ origin?: BaselineFrameOrigin;
2379
+ normal?: BaselineFrameNormal;
2380
+ }
2381
+ interface BaselineFrame {
2382
+ readonly p1: Point2D;
2383
+ readonly p2: Point2D;
2384
+ readonly origin: Point2D;
2385
+ readonly direction: Point2D;
2386
+ readonly normal: Point2D;
2387
+ readonly length: number;
2388
+ signedNormalDistance(point: Position): number;
2389
+ pointAtNormalDistance(distance: number): Position | null;
2390
+ }
2391
+ declare function createBaselineFrame(p1: Position, p2: Position, options?: BaselineFrameOptions): BaselineFrame | null;
2392
+ //#endregion
2393
+ //#region src/draw-rules/midpoint-perpendicular.d.ts
2394
+ interface MidpointPerpendicularDrawRuleOptions {
2395
+ id: string;
2396
+ defaultDistanceRatio?: number;
2397
+ /** User clicks required to commit. Defaults to `2` (the third point is auto-derived). */
2398
+ minimumUserPoints?: number;
2399
+ /** Raw points at which a live preview can be derived. See {@link ControlMeasureDrawRule}. */
2400
+ minimumPreviewPoints?: number;
2401
+ /**
2402
+ * Index of the slot whose point is constrained to the perpendicular axis
2403
+ * through the configured origin of the other two ("baseline") slots. Must be
2404
+ * `0` or `2`. Defaults to `2`.
2405
+ *
2406
+ * Area11 (Block) and Point12 (obstacle-bypass) use `2`: P1/P2 are the free
2407
+ * baseline endpoints and P3 is constrained. Area7 (Attack-By-Fire) uses `0`:
2408
+ * P1 is the constrained arrowhead tip and P2/P3 are the free back-line
2409
+ * endpoints.
2410
+ */
2411
+ constrainedIndex?: 0 | 2;
2412
+ /** Frame origin for the perpendicular axis. Defaults to `"midpoint"`. */
2413
+ origin?: BaselineFrameOrigin;
2414
+ /** Side the positive normal points to. Defaults to `"right"`. */
2415
+ normal?: BaselineFrameNormal;
2416
+ }
2417
+ declare function createMidpointPerpendicularDrawRule(options: MidpointPerpendicularDrawRuleOptions): ControlMeasureDrawRule;
2418
+ declare function computeDefaultMidpointPerpendicularPoint(p1: Position, p2: Position, distanceRatio?: number): Position | null;
2419
+ declare function getMidpointPerpendicularSignedDistance(p1: Position, p2: Position, controlPoint: Position): number | null;
2420
+ declare function pointOnMidpointPerpendicularAxis(p1: Position, p2: Position, distance: number | null): Position | null;
2421
+ declare function snapToMidpointPerpendicular(p1: Position, p2: Position, controlPoint: Position): Position | null;
2422
+ //#endregion
2423
+ //#region src/draw-rules/area11.d.ts
2424
+ declare const blockDrawRule: ControlMeasureDrawRule;
2425
+ //#endregion
2426
+ //#region src/draw-rules/area12.d.ts
2427
+ /**
2428
+ * Area12 anchor draw rule for Disrupt.
2429
+ *
2430
+ * P1/P2 are the free spine endpoints. P3 is the longest-arrow tip, constrained
2431
+ * to the perpendicular axis through P1 (not the baseline midpoint).
2432
+ */
2433
+ declare const disruptDrawRule: ControlMeasureDrawRule;
2434
+ //#endregion
2435
+ //#region src/draw-rules/area15.d.ts
2436
+ declare const centerRadiusDrawRule: ControlMeasureDrawRule;
2437
+ //#endregion
2438
+ //#region src/draw-rules/point12.d.ts
2439
+ /**
2440
+ * Point12 anchor draw rule for the obstacle-bypass family.
2441
+ *
2442
+ * Shared by `obstacle-bypass-easy`, `obstacle-bypass-difficult`, and
2443
+ * `obstacle-bypass-impossible`: P1/P2 are the arrowhead tips and define the
2444
+ * opening; P3 is constrained to the perpendicular axis through
2445
+ * `midpoint(P1, P2)` and defines the rear of the symbol. Rear-line decoration
2446
+ * (plain, zigzag, barrier marks) is a generator concern, not a draw-rule one.
2447
+ */
2448
+ declare const point12DrawRule: ControlMeasureDrawRule;
2449
+ //#endregion
2450
+ //#region src/draw-rules/area7.d.ts
2451
+ /**
2452
+ * Area7 anchor draw rule for Attack By Fire.
2453
+ *
2454
+ * P2/P3 are the free back-line endpoints; P1 (slot index 0) is the arrowhead
2455
+ * tip, constrained to the perpendicular axis through `midpoint(P2, P3)`.
2456
+ */
2457
+ declare const attackByFireDrawRule: ControlMeasureDrawRule;
2458
+ //#endregion
2459
+ //#region src/draw-rules/line29.d.ts
2460
+ /**
2461
+ * Line29 anchor draw rule for Ambush.
2462
+ *
2463
+ * P2/P3 are the free back-line endpoints; P1 (slot index 0) is the arrowhead
2464
+ * tip, constrained to the perpendicular axis through `midpoint(P2, P3)`.
2465
+ */
2466
+ declare const ambushDrawRule: ControlMeasureDrawRule;
2467
+ //#endregion
2468
+ //#region src/draw-rules/line1.d.ts
2469
+ declare const line1DrawRule: ControlMeasureDrawRule;
2470
+ //#endregion
2471
+ //#region src/draw-rules/line10.d.ts
2472
+ /**
2473
+ * Line10 — PT1 is the arrow tip, PT2 is the rear, and derived PT3 selects
2474
+ * which side of the PT2 -> PT1 chord contains the 90-degree arc.
2475
+ */
2476
+ declare const turnDrawRule: ControlMeasureDrawRule;
2477
+ //#endregion
2478
+ //#region src/draw-rules/line23.d.ts
2479
+ /**
2480
+ * Line23 anchor draw rule for the Clear mission task.
2481
+ *
2482
+ * P1/P2 are the endpoints of the symbol's vertical line (its height); P3 is
2483
+ * constrained to the perpendicular axis through `midpoint(P1, P2)` and defines
2484
+ * the rear of the symbol (the shaft length). Geometrically identical to the
2485
+ * obstacle-bypass `Point12` rule, but kept as its own spec id to match the
2486
+ * doctrinal draw rule for Clear.
2487
+ */
2488
+ declare const line23DrawRule: ControlMeasureDrawRule;
2489
+ //#endregion
2490
+ //#region src/draw-rules/line24.d.ts
2491
+ /**
2492
+ * Line24 anchor draw rule for the Delay mission task.
2493
+ *
2494
+ * PT. 1 and PT. 2 are the free straight-line endpoints. PT. 3 is constrained to
2495
+ * the perpendicular axis through PT. 2, where its signed distance from PT. 2
2496
+ * defines the semicircular arc diameter and side. Unlike the sibling Line23
2497
+ * (Clear) rule, the third point must be placed explicitly (three user clicks),
2498
+ * with a two-point live preview before commit.
2499
+ */
2500
+ declare const line24DrawRule: ControlMeasureDrawRule;
2501
+ //#endregion
2502
+ //#region src/draw-rules/area8.d.ts
2503
+ declare const supportByFireDrawRule: ControlMeasureDrawRule;
2504
+ //#endregion
2505
+ //#region src/draw-rules/axis1.d.ts
2506
+ declare const axis1DrawRule: ControlMeasureDrawRule;
2507
+ //#endregion
2508
+ //#region src/draw-rules/rectangle.d.ts
2509
+ declare const rectangleDrawRule: ControlMeasureDrawRule;
2510
+ //#endregion
2511
+ //#region src/generators/cm14-maneuver-lines/ambush.d.ts
2512
+ /**
2513
+ * Configuration options for the Ambush tactical symbol.
2514
+ */
2515
+ interface AmbushOptions {
2516
+ /** Number of segments used to draw the quadratic curve (default: 30) */
2517
+ arcSegments?: number;
2518
+ /** Size of arrowhead relative to chord span (default: 0.15) */
2519
+ arrowheadLengthRatio?: number;
2520
+ /** Width of arrowhead wings relative to its length (default: 0.5) */
2521
+ arrowheadWidthRatio?: number;
2522
+ /** Length of parallel hatches relative to chord span (default: 0.15) */
2523
+ hatchLengthRatio?: number;
2524
+ /** Number of parallel hatches along the curve (default: 5) */
2525
+ hatchCount?: number;
2526
+ /** Depth of the curve toward PT 1 relative to chord span (default: 0.25) */
2527
+ curveDepthRatio?: number;
2528
+ }
2529
+ declare const DEFAULT_AMBUSH_OPTIONS: Required<AmbushOptions>;
2530
+ //#endregion
2531
+ //#region src/generators/cm15-maneuver-areas/searchArea.d.ts
2532
+ /**
2533
+ * Configuration options to tweak the tactical arrow's geometry.
2534
+ */
2535
+ interface TacticalArrowOptions {
2536
+ /** Ratio of arrowhead length to total leg length (default: 0.12) */
2537
+ arrowheadLengthRatio?: number;
2538
+ /** Width multiplier for the arrowhead wings (default: 0.5) */
2539
+ arrowheadWidthRatio?: number;
2540
+ /** Percentage along the leg where the zigzag begins, 0.0-1.0 (default: 0.55) */
2541
+ zigzagStart?: number;
2542
+ /** Percentage along the leg where the zigzag returns, 0.0-1.0 (default: 0.45) */
2543
+ zigzagEnd?: number;
2544
+ /** Perpendicular offset for the lightning "kink", relative to leg length (default: 0.07) */
2545
+ zigzagAmplitudeRatio?: number;
2546
+ }
2547
+ /**
2548
+ * Default options for the tactical arrow.
2549
+ */
2550
+ declare const DEFAULT_TACTICAL_ARROW_OPTIONS: Required<TacticalArrowOptions>;
2551
+ //#endregion
2552
+ export { getControlMeasureMetadata as $, ControlMeasureMetadata as $n, DEFAULT_GENERIC_CIRCLE_OPTIONS as $t, getMetersPerPixel as A, EncirclementOptions as An, DEFAULT_CANALIZE_OPTIONS as At, ControlMeasureSnapshot as B, GenericC2LineOptions as Bn, HandoverLineOptions as Bt, snapToMidpointPerpendicular as C, DEFAULT_LANDING_ZONE_OPTIONS as Cn, AntitankDitchOptions as Ct, BaselineFrameOrigin as D, AssemblyAreaOptions as Dn, ClearOptions as Dt, BaselineFrameOptions as E, JointTacticalActionAreaOptions as En, DelayOptions as Et, resolveStyleHints as F, DEFAULT_STRONG_POINT_OPTIONS as Fn, BlockMissionTaskOptions as Ft, cloneControlMeasure as G, LabelSizeOptions as Gn, AttackByFireOptions as Gt, StyleHints as H, EngineerWorkLineOptions as Hn, PhaseLineOptions as Ht, freezeOrientationOptions as I, StrongPointOptions as In, DEFAULT_BLOCK_MISSION_TASK_OPTIONS as It, CONTROL_MEASURE_IDS as J, unproject as Jn, SupportByFireOptions as Jt, isKind as K, Point2D as Kn, DEFAULT_ATTACK_BY_FIRE_OPTIONS as Kt, RenderOptions as L, BattlePositionOptions as Ln, BattleHandoverLineOptions as Lt, SimpleStyleProps as M, FinalProtectiveFireOptions as Mn, DEFAULT_BYPASS_OPTIONS as Mt, SimpleStyleRender as N, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS as Nn, BreachOptions as Nt, createBaselineFrame as O, DEFAULT_ASSEMBLY_AREA_OPTIONS as On, DEFAULT_CLEAR_OPTIONS as Ot, toSimpleStyle as P, PrincipalDirectionOfFireOptions as Pn, DEFAULT_BREACH_OPTIONS as Pt, OptionsByKind as Q, ControlMeasureGeometryType as Qn, DEFAULT_AIRBORNE_ATTACK_OPTIONS as Qt, renderControlMeasure as R, DEFAULT_BATTLE_POSITION_OPTIONS as Rn, DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS as Rt, pointOnMidpointPerpendicularAxis as S, PickupZoneOptions as Sn, DEFAULT_ANTITANK_WALL_OPTIONS as St, BaselineFrameNormal as T, DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS as Tn, DEFAULT_DELAY_OPTIONS as Tt, controlMeasureIdFromFeature as U, DEFAULT_LIGHT_LINE_OPTIONS as Un, DEFAULT_FLOT_OPTIONS as Ut, FeaturePartProps as V, DEFAULT_ENGINEER_WORK_LINE_OPTIONS as Vn, DEFAULT_PHASE_LINE_OPTIONS as Vt, ControlMeasure as W, LightLineOptions as Wn, FLOTOptions as Wt, ControlMeasureId as X, DEFAULT_BOUNDARY_OPTIONS as Xn, DEFAULT_ATTACK_HELICOPTER_OPTIONS as Xt, CONTROL_MEASURE_METADATA as Y, BoundaryOptions as Yn, AttackHelicopterOptions as Yt, ControlMeasureKind as Z, ControlMeasureGeometry as Zn, AirborneAttackOptions as Zt, blockDrawRule as _, calculateMetrics as _n, DEFAULT_FORTIFIED_AREA_OPTIONS as _t, rectangleDrawRule as a, DEFAULT_GENERIC_LINE_OPTIONS as an, TextAmplifierKey as ar, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS as at, createMidpointPerpendicularDrawRule as b, DEFAULT_AREA_OF_OPERATIONS_OPTIONS as bn, FortifiedLineOptions as bt, line24DrawRule as c, BlockArrowOptions as cn, normalizeTextAmplifiers as cr, ObstacleBypassEasyOptions as ct, line1DrawRule as d, ClassicArrowOptions as dn, DEFAULT_FIX_OPTIONS as dt, GenericCircleOptions as en, ParamDescriptor as er, getControlMeasureMetadataByValue as et, ambushDrawRule as f, DEFAULT_CLASSIC_ARROW_OPTIONS as fn, FixOptions as ft, disruptDrawRule as g, MainAttackOptions as gn, DEFAULT_BLOCK_OPTIONS as gt, centerRadiusDrawRule as h, DEFAULT_MAIN_ATTACK_OPTIONS as hn, BlockOptions as ht, DEFAULT_AMBUSH_OPTIONS as i, GenericPolygonOptions as in, TextAmplifierField as ir, ObstacleBypassImpossibleOptions as it, roundToFixed as j, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS as jn, BypassOptions as jt, EPSILON as k, DEFAULT_ENCIRCLEMENT_OPTIONS as kn, CanalizeOptions as kt, line23DrawRule as l, DEFAULT_BLOCK_ARROW_OPTIONS as ln, AnchorTransformEvent as lr, DEFAULT_TURN_OPTIONS as lt, point12DrawRule as m, SupportingAttackOptions as mn, DisruptOptions as mt, TacticalArrowOptions as n, GenericRectangleOptions as nn, CanonicalTextAmplifiers as nr, listControlMeasureMetadata as nt, axis1DrawRule as o, GenericLineOptions as on, TextAmplifiers as or, ObstacleBypassDifficultOptions as ot, attackByFireDrawRule as p, DEFAULT_SUPPORTING_ATTACK_OPTIONS as pn, DEFAULT_DISRUPT_OPTIONS as pt, ControlMeasureStyle as q, project as qn, DEFAULT_SUPPORT_BY_FIRE_OPTIONS as qt, AmbushOptions as r, DEFAULT_GENERIC_POLYGON_OPTIONS as rn, TEXT_AMPLIFIER_FIELDS as rr, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS as rt, supportByFireDrawRule as s, BlockArrowHeadStyle as sn, canonicalTextAmplifierKey as sr, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS as st, DEFAULT_TACTICAL_ARROW_OPTIONS as t, DEFAULT_GENERIC_RECTANGLE_OPTIONS as tn, TextAmplifierDescriptor as tr, getDefaultOptions as tt, turnDrawRule as u, ClassicArrowHeadStyle as un, ControlMeasureDrawRule as ur, TurnOptions as ut, MidpointPerpendicularDrawRuleOptions as v, computeInitialWidthPoint as vn, FortifiedAreaOptions as vt, BaselineFrame as w, LandingZoneOptions as wn, DEFAULT_ANTITANK_DITCH_OPTIONS as wt, getMidpointPerpendicularSignedDistance as x, DEFAULT_PICKUP_ZONE_OPTIONS as xn, AntitankWallOptions as xt, computeDefaultMidpointPerpendicularPoint as y, AreaOfOperationsOptions as yn, DEFAULT_FORTIFIED_LINE_OPTIONS as yt, ControlMeasureRender as z, DEFAULT_GENERIC_C2_LINE_OPTIONS as zn, DEFAULT_HANDOVER_LINE_OPTIONS as zt };