@orbat-mapper/control-measures 0.2.0-alpha.6 → 0.2.0-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -75,8 +75,8 @@ controls how invalid coordinate input is handled:
75
75
 
76
76
  - `validationMode: "silent" | "warn" | "throw"`
77
77
 
78
- When omitted, validation follows each measure's built-in default. `"throw"` is
79
- useful for strict integrations and tests.
78
+ When omitted, validation defaults to `silent` mode — invalid input yields an
79
+ empty render. `"throw"` is useful for strict integrations and tests.
80
80
 
81
81
  ## Supported control measures
82
82
 
@@ -107,10 +107,12 @@ code.
107
107
  | --- | --- | --- | --- |
108
108
  | <img src="media/fortified-area.svg" width="96" height="48" alt=""> | `fortified-area` | Fortified Area | `151000` |
109
109
  | <img src="media/battle-position.svg" width="96" height="48" alt=""> | `battle-position` | Battle Position | `151200` |
110
+ | <img src="media/strong-point.svg" width="96" height="48" alt=""> | `strong-point` | Strong Point | `151203` |
110
111
  | <img src="media/airborne-attack.svg" width="96" height="48" alt=""> | `airborne-attack` | Airborne Attack | `151401` |
111
112
  | <img src="media/attack-helicopter.svg" width="96" height="48" alt=""> | `attack-helicopter` | Attack Helicopter | `151402` |
112
113
  | <img src="media/main-attack.svg" width="96" height="48" alt=""> | `main-attack` | Main Attack | `151403` |
113
114
  | <img src="media/supporting-attack.svg" width="96" height="48" alt=""> | `supporting-attack` | Supporting Attack | `151404` |
115
+ | <img src="media/encirclement.svg" width="96" height="48" alt=""> | `encirclement` | Encirclement | `151800` |
114
116
  | <img src="media/attack-by-fire.svg" width="96" height="48" alt=""> | `attack-by-fire` | Attack by Fire | `152000` |
115
117
  | <img src="media/support-by-fire.svg" width="96" height="48" alt=""> | `support-by-fire` | Support By Fire | `152100` |
116
118
  | <img src="media/search-area.svg" width="96" height="48" alt=""> | `search-area` | Search Area | `152200` |
@@ -148,12 +150,16 @@ code.
148
150
  | <img src="media/delay.svg" width="96" height="48" alt=""> | `delay` | Delay | `340800` |
149
151
  | <img src="media/isolate.svg" width="96" height="48" alt=""> | `isolate` | Isolate | `341500` |
150
152
 
151
- ### Generic Arrows
153
+ ### Generic Graphics
152
154
 
153
155
  | Preview | `kind` | Measure | 2525E Value |
154
156
  | --- | --- | --- | --- |
155
157
  | <img src="media/block-arrow.svg" width="96" height="48" alt=""> | `block-arrow` | Block Arrow | `990001` |
156
158
  | <img src="media/classic-arrow.svg" width="96" height="48" alt=""> | `classic-arrow` | Classic Arrow | `990002` |
159
+ | <img src="media/line.svg" width="96" height="48" alt=""> | `line` | Line | `990101` |
160
+ | <img src="media/polygon.svg" width="96" height="48" alt=""> | `polygon` | Polygon | `990102` |
161
+ | <img src="media/rectangle.svg" width="96" height="48" alt=""> | `rectangle` | Rectangle | `990103` |
162
+ | <img src="media/circle.svg" width="96" height="48" alt=""> | `circle` | Circle | `990104` |
157
163
 
158
164
  <!-- /AUTO-GENERATED:measures-table -->
159
165
 
@@ -292,6 +292,8 @@ interface BoundaryOptions {
292
292
  */
293
293
  smoothResolution?: number;
294
294
  }
295
+ /** Default options for the Boundary control measure. */
296
+ declare const DEFAULT_BOUNDARY_OPTIONS: BoundaryOptions;
295
297
  /**
296
298
  * Creates a Boundary control measure: a polyline through `positions` carrying
297
299
  * repeated echelon + unit-designator labels.
@@ -378,6 +380,8 @@ interface BattlePositionOptions {
378
380
  */
379
381
  smoothResolution?: number;
380
382
  }
383
+ /** Default options for the Battle Position control measure. */
384
+ declare const DEFAULT_BATTLE_POSITION_OPTIONS: BattlePositionOptions;
381
385
  /**
382
386
  * Creates a Battle Position control measure: a closed area through `positions`
383
387
  * carrying a single echelon (Field B) glyph straddling its boundary — anchored
@@ -447,7 +451,7 @@ interface FinalProtectiveFireOptions {
447
451
  * Blade height (its perpendicular reach into the inside of the V) relative
448
452
  * to the bladed arm's own length (default: 0.03).
449
453
  */
450
- bladeHeight?: number;
454
+ bladeHeightRatio?: number;
451
455
  }
452
456
  declare const DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS: Required<FinalProtectiveFireOptions>;
453
457
  type FpfProps = {
@@ -512,8 +516,8 @@ declare const unproject: (x: number, y: number) => Position;
512
516
  //#region src/attack-utils.d.ts
513
517
  interface AttackOptions {
514
518
  shaftWidthRatio?: number;
515
- roundedBends?: boolean;
516
- bendSegments?: number;
519
+ smooth?: boolean;
520
+ smoothResolution?: number;
517
521
  }
518
522
  /**
519
523
  * Calculates the relative metrics (longitudinal and lateral) of the width point
@@ -607,6 +611,7 @@ interface ClassicArrowOptions {
607
611
  /** Arrowhead base width as a fraction of the total path length. */
608
612
  arrowheadWidthRatio?: number;
609
613
  }
614
+ declare const DEFAULT_CLASSIC_ARROW_OPTIONS: Required<ClassicArrowOptions>;
610
615
  /**
611
616
  * Generates a GeoJSON FeatureCollection for the Classic Arrow: a shaft
612
617
  * LineString (trimmed so it doesn't poke through the head) plus a head feature
@@ -638,7 +643,7 @@ declare function createClassicArrow(coordinates: Position[], options?: ClassicAr
638
643
  type BlockArrowHeadStyle = "triangle" | "barbed" | "concave" | "diamond" | "harpoon" | "swallowtail" | "tee";
639
644
  interface BlockArrowOptions {
640
645
  /** Shaft band width as a fraction of the total path length. */
641
- shaftWidth?: number;
646
+ shaftWidthRatio?: number;
642
647
  /** Arrowhead silhouette. */
643
648
  arrowheadStyle?: BlockArrowHeadStyle;
644
649
  /** Arrowhead base width as a fraction of the total path length. */
@@ -652,6 +657,7 @@ interface BlockArrowOptions {
652
657
  /** Fill the body solid; when false the arrow is drawn as an outline only. */
653
658
  filled?: boolean;
654
659
  }
660
+ declare const DEFAULT_BLOCK_ARROW_OPTIONS: Required<BlockArrowOptions>;
655
661
  /**
656
662
  * Generates a GeoJSON FeatureCollection for the Block Arrow: a single filled
657
663
  * Polygon whose outline runs up the left side of the shaft, around the head
@@ -742,8 +748,8 @@ declare function createAttackHelicopter(coordinates: Position[], options?: Attac
742
748
  //#region src/generators/cm15-maneuver-areas/supportByFire.d.ts
743
749
  interface SupportByFireOptions {
744
750
  arrowheadWidthRatio?: number;
745
- backLineLengthRatio?: number;
746
- backLineAngle?: number;
751
+ rearLineLengthRatio?: number;
752
+ rearLineAngle?: number;
747
753
  }
748
754
  declare const DEFAULT_SUPPORT_BY_FIRE_OPTIONS: Required<SupportByFireOptions>;
749
755
  /**
@@ -760,8 +766,8 @@ declare function createSupportByFire(coordinates: Position[], options?: SupportB
760
766
  //#region src/generators/cm15-maneuver-areas/attackByFire.d.ts
761
767
  interface AttackByFireOptions {
762
768
  arrowheadWidthRatio?: number;
763
- backLineLengthRatio?: number;
764
- backLineAngle?: number;
769
+ rearLineLengthRatio?: number;
770
+ rearLineAngle?: number;
765
771
  }
766
772
  declare const DEFAULT_ATTACK_BY_FIRE_OPTIONS: Required<AttackByFireOptions>;
767
773
  /**
@@ -810,7 +816,7 @@ interface FLOTOptions {
810
816
  * Higher values create smoother arcs.
811
817
  * @default 16
812
818
  */
813
- resolution?: number;
819
+ arcSegments?: number;
814
820
  }
815
821
  /**
816
822
  * Default options for the FLOT graphic.
@@ -831,7 +837,7 @@ declare const DEFAULT_FLOT_OPTIONS: Required<Omit<FLOTOptions, "metersPerPixel">
831
837
  * ```typescript
832
838
  * const flot = createFLOT(
833
839
  * [[-122.4194, 37.7749], [-122.4100, 37.7800], [-122.4000, 37.7750]],
834
- * { radius: 100, resolution: 20 }
840
+ * { radius: 100, arcSegments: 20 }
835
841
  * );
836
842
  * ```
837
843
  */
@@ -1126,21 +1132,21 @@ interface FortifiedLineOptions {
1126
1132
  /**
1127
1133
  * The size of the square teeth in meters.
1128
1134
  * This controls both the width and height of the castellated pattern.
1129
- * This is ignored if sizePixels is provided along with metersPerPixel.
1135
+ * This is ignored if toothSizePixels is provided along with metersPerPixel.
1130
1136
  * @default 50
1131
1137
  */
1132
- size?: number;
1138
+ toothSize?: number;
1133
1139
  /**
1134
1140
  * The size of the square teeth in pixels.
1135
1141
  * When provided along with metersPerPixel, the actual meter size is calculated
1136
1142
  * dynamically to maintain consistent visual size on screen.
1137
- * Takes precedence over size when metersPerPixel is also provided.
1143
+ * Takes precedence over toothSize when metersPerPixel is also provided.
1138
1144
  * @default 10
1139
1145
  */
1140
- sizePixels?: number;
1146
+ toothSizePixels?: number;
1141
1147
  /**
1142
1148
  * The meters-per-pixel ratio at the current zoom level and latitude.
1143
- * Required when using sizePixels for zoom-aware sizing.
1149
+ * Required when using toothSizePixels for zoom-aware sizing.
1144
1150
  */
1145
1151
  metersPerPixel?: number;
1146
1152
  /**
@@ -1787,7 +1793,7 @@ declare const rectangleDrawRule: ControlMeasureDrawRule;
1787
1793
  */
1788
1794
  interface AmbushOptions {
1789
1795
  /** Number of segments used to draw the quadratic curve (default: 30) */
1790
- resolution?: number;
1796
+ arcSegments?: number;
1791
1797
  /** Size of arrowhead relative to chord span (default: 0.15) */
1792
1798
  arrowheadLengthRatio?: number;
1793
1799
  /** Width of arrowhead wings relative to its length (default: 0.5) */
@@ -1822,4 +1828,4 @@ interface TacticalArrowOptions {
1822
1828
  */
1823
1829
  declare const DEFAULT_TACTICAL_ARROW_OPTIONS: Required<TacticalArrowOptions>;
1824
1830
  //#endregion
1825
- export { getControlMeasureMetadata as $, DEFAULT_GENERIC_LINE_OPTIONS as $t, getMetersPerPixel as A, DEFAULT_CANALIZE_OPTIONS as At, ControlMeasureSnapshot as B, DEFAULT_ATTACK_BY_FIRE_OPTIONS as Bt, snapToMidpointPerpendicular as C, ControlMeasureDrawRule as Cn, AntitankDitchOptions as Ct, BaselineFrameOrigin as D, ClearOptions as Dt, BaselineFrameOptions as E, DelayOptions as Et, resolveStyleHints as F, BlockMissionTaskOptions as Ft, cloneControlMeasure as G, AirborneAttackOptions as Gt, StyleHints as H, SupportByFireOptions as Ht, freezeOrientationOptions as I, DEFAULT_BLOCK_MISSION_TASK_OPTIONS as It, CONTROL_MEASURE_IDS as J, GenericCircleOptions as Jt, isKind as K, DEFAULT_AIRBORNE_ATTACK_OPTIONS as Kt, RenderOptions as L, DEFAULT_FLOT_OPTIONS as Lt, SimpleStyleProps as M, DEFAULT_BYPASS_OPTIONS as Mt, SimpleStyleRender as N, BreachOptions as Nt, createBaselineFrame as O, DEFAULT_CLEAR_OPTIONS as Ot, toSimpleStyle as P, DEFAULT_BREACH_OPTIONS as Pt, OptionsByKind as Q, GenericPolygonOptions as Qt, renderControlMeasure as R, FLOTOptions as Rt, pointOnMidpointPerpendicularAxis as S, AnchorTransformEvent as Sn, DEFAULT_ANTITANK_WALL_OPTIONS as St, BaselineFrameNormal as T, DEFAULT_DELAY_OPTIONS as Tt, controlMeasureIdFromFeature as U, AttackHelicopterOptions as Ut, FeaturePartProps as V, DEFAULT_SUPPORT_BY_FIRE_OPTIONS as Vt, ControlMeasure as W, DEFAULT_ATTACK_HELICOPTER_OPTIONS as Wt, ControlMeasureId as X, GenericRectangleOptions as Xt, CONTROL_MEASURE_METADATA as Y, DEFAULT_GENERIC_RECTANGLE_OPTIONS as Yt, ControlMeasureKind as Z, DEFAULT_GENERIC_POLYGON_OPTIONS as Zt, blockDrawRule as _, StrongPointOptions as _n, DEFAULT_FORTIFIED_AREA_OPTIONS as _t, rectangleDrawRule as a, calculateMetrics as an, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS as at, createMidpointPerpendicularDrawRule as b, ControlMeasureMetadata as bn, FortifiedLineOptions as bt, line24DrawRule as c, project as cn, ObstacleBypassEasyOptions as ct, line1DrawRule as d, EncirclementOptions as dn, DEFAULT_FIX_OPTIONS as dt, GenericLineOptions as en, getControlMeasureMetadataByValue as et, ambushDrawRule as f, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS as fn, FixOptions as ft, disruptDrawRule as g, DEFAULT_STRONG_POINT_OPTIONS as gn, DEFAULT_BLOCK_OPTIONS as gt, centerRadiusDrawRule as h, PrincipalDirectionOfFireOptions as hn, BlockOptions as ht, DEFAULT_AMBUSH_OPTIONS as i, MainAttackOptions as in, ObstacleBypassImpossibleOptions as it, roundToFixed as j, BypassOptions as jt, EPSILON as k, CanalizeOptions as kt, line23DrawRule as l, unproject as ln, DEFAULT_TURN_OPTIONS as lt, point12DrawRule as m, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS as mn, DisruptOptions as mt, TacticalArrowOptions as n, SupportingAttackOptions as nn, listControlMeasureMetadata as nt, axis1DrawRule as o, computeInitialWidthPoint as on, ObstacleBypassDifficultOptions as ot, attackByFireDrawRule as p, FinalProtectiveFireOptions as pn, DEFAULT_DISRUPT_OPTIONS as pt, ControlMeasureStyle as q, DEFAULT_GENERIC_CIRCLE_OPTIONS as qt, AmbushOptions as r, DEFAULT_MAIN_ATTACK_OPTIONS as rn, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS as rt, supportByFireDrawRule as s, Point2D as sn, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS as st, DEFAULT_TACTICAL_ARROW_OPTIONS as t, DEFAULT_SUPPORTING_ATTACK_OPTIONS as tn, getDefaultOptions as tt, turnDrawRule as u, DEFAULT_ENCIRCLEMENT_OPTIONS as un, TurnOptions as ut, MidpointPerpendicularDrawRuleOptions as v, ControlMeasureGeometry as vn, FortifiedAreaOptions as vt, BaselineFrame as w, DEFAULT_ANTITANK_DITCH_OPTIONS as wt, getMidpointPerpendicularSignedDistance as x, ParamDescriptor as xn, AntitankWallOptions as xt, computeDefaultMidpointPerpendicularPoint as y, ControlMeasureGeometryType as yn, DEFAULT_FORTIFIED_LINE_OPTIONS as yt, ControlMeasureRender as z, AttackByFireOptions as zt };
1831
+ export { getControlMeasureMetadata as $, DEFAULT_GENERIC_LINE_OPTIONS as $t, getMetersPerPixel as A, ControlMeasureMetadata as An, DEFAULT_CANALIZE_OPTIONS as At, ControlMeasureSnapshot as B, DEFAULT_ATTACK_BY_FIRE_OPTIONS as Bt, snapToMidpointPerpendicular as C, StrongPointOptions as Cn, AntitankDitchOptions as Ct, BaselineFrameOrigin as D, DEFAULT_BOUNDARY_OPTIONS as Dn, ClearOptions as Dt, BaselineFrameOptions as E, BoundaryOptions as En, DelayOptions as Et, resolveStyleHints as F, BlockMissionTaskOptions as Ft, cloneControlMeasure as G, AirborneAttackOptions as Gt, StyleHints as H, SupportByFireOptions as Ht, freezeOrientationOptions as I, DEFAULT_BLOCK_MISSION_TASK_OPTIONS as It, CONTROL_MEASURE_IDS as J, GenericCircleOptions as Jt, isKind as K, DEFAULT_AIRBORNE_ATTACK_OPTIONS as Kt, RenderOptions as L, DEFAULT_FLOT_OPTIONS as Lt, SimpleStyleProps as M, AnchorTransformEvent as Mn, DEFAULT_BYPASS_OPTIONS as Mt, SimpleStyleRender as N, ControlMeasureDrawRule as Nn, BreachOptions as Nt, createBaselineFrame as O, ControlMeasureGeometry as On, DEFAULT_CLEAR_OPTIONS as Ot, toSimpleStyle as P, DEFAULT_BREACH_OPTIONS as Pt, OptionsByKind as Q, GenericPolygonOptions as Qt, renderControlMeasure as R, FLOTOptions as Rt, pointOnMidpointPerpendicularAxis as S, DEFAULT_STRONG_POINT_OPTIONS as Sn, DEFAULT_ANTITANK_WALL_OPTIONS as St, BaselineFrameNormal as T, DEFAULT_BATTLE_POSITION_OPTIONS as Tn, DEFAULT_DELAY_OPTIONS as Tt, controlMeasureIdFromFeature as U, AttackHelicopterOptions as Ut, FeaturePartProps as V, DEFAULT_SUPPORT_BY_FIRE_OPTIONS as Vt, ControlMeasure as W, DEFAULT_ATTACK_HELICOPTER_OPTIONS as Wt, ControlMeasureId as X, GenericRectangleOptions as Xt, CONTROL_MEASURE_METADATA as Y, DEFAULT_GENERIC_RECTANGLE_OPTIONS as Yt, ControlMeasureKind as Z, DEFAULT_GENERIC_POLYGON_OPTIONS as Zt, blockDrawRule as _, EncirclementOptions as _n, DEFAULT_FORTIFIED_AREA_OPTIONS as _t, rectangleDrawRule as a, ClassicArrowOptions as an, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS as at, createMidpointPerpendicularDrawRule as b, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS as bn, FortifiedLineOptions as bt, line24DrawRule as c, SupportingAttackOptions as cn, ObstacleBypassEasyOptions as ct, line1DrawRule as d, calculateMetrics as dn, DEFAULT_FIX_OPTIONS as dt, GenericLineOptions as en, getControlMeasureMetadataByValue as et, ambushDrawRule as f, computeInitialWidthPoint as fn, FixOptions as ft, disruptDrawRule as g, DEFAULT_ENCIRCLEMENT_OPTIONS as gn, DEFAULT_BLOCK_OPTIONS as gt, centerRadiusDrawRule as h, unproject as hn, BlockOptions as ht, DEFAULT_AMBUSH_OPTIONS as i, ClassicArrowHeadStyle as in, ObstacleBypassImpossibleOptions as it, roundToFixed as j, ParamDescriptor as jn, BypassOptions as jt, EPSILON as k, ControlMeasureGeometryType as kn, CanalizeOptions as kt, line23DrawRule as l, DEFAULT_MAIN_ATTACK_OPTIONS as ln, DEFAULT_TURN_OPTIONS as lt, point12DrawRule as m, project as mn, DisruptOptions as mt, TacticalArrowOptions as n, BlockArrowOptions as nn, listControlMeasureMetadata as nt, axis1DrawRule as o, DEFAULT_CLASSIC_ARROW_OPTIONS as on, ObstacleBypassDifficultOptions as ot, attackByFireDrawRule as p, Point2D as pn, DEFAULT_DISRUPT_OPTIONS as pt, ControlMeasureStyle as q, DEFAULT_GENERIC_CIRCLE_OPTIONS as qt, AmbushOptions as r, DEFAULT_BLOCK_ARROW_OPTIONS as rn, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS as rt, supportByFireDrawRule as s, DEFAULT_SUPPORTING_ATTACK_OPTIONS as sn, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS as st, DEFAULT_TACTICAL_ARROW_OPTIONS as t, BlockArrowHeadStyle as tn, getDefaultOptions as tt, turnDrawRule as u, MainAttackOptions as un, TurnOptions as ut, MidpointPerpendicularDrawRuleOptions as v, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS as vn, FortifiedAreaOptions as vt, BaselineFrame as w, BattlePositionOptions as wn, DEFAULT_ANTITANK_DITCH_OPTIONS as wt, getMidpointPerpendicularSignedDistance as x, PrincipalDirectionOfFireOptions as xn, AntitankWallOptions as xt, computeDefaultMidpointPerpendicularPoint as y, FinalProtectiveFireOptions as yn, DEFAULT_FORTIFIED_LINE_OPTIONS as yt, ControlMeasureRender as z, AttackByFireOptions as zt };
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as getControlMeasureMetadata, $t as DEFAULT_GENERIC_LINE_OPTIONS, A as getMetersPerPixel, At as DEFAULT_CANALIZE_OPTIONS, B as ControlMeasureSnapshot, Bt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, C as snapToMidpointPerpendicular, Cn as ControlMeasureDrawRule, Ct as AntitankDitchOptions, D as BaselineFrameOrigin, Dt as ClearOptions, E as BaselineFrameOptions, Et as DelayOptions, F as resolveStyleHints, Ft as BlockMissionTaskOptions, G as cloneControlMeasure, Gt as AirborneAttackOptions, H as StyleHints, Ht as SupportByFireOptions, I as freezeOrientationOptions, It as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, J as CONTROL_MEASURE_IDS, Jt as GenericCircleOptions, K as isKind, Kt as DEFAULT_AIRBORNE_ATTACK_OPTIONS, L as RenderOptions, Lt as DEFAULT_FLOT_OPTIONS, M as SimpleStyleProps, Mt as DEFAULT_BYPASS_OPTIONS, N as SimpleStyleRender, Nt as BreachOptions, O as createBaselineFrame, Ot as DEFAULT_CLEAR_OPTIONS, P as toSimpleStyle, Pt as DEFAULT_BREACH_OPTIONS, Q as OptionsByKind, Qt as GenericPolygonOptions, R as renderControlMeasure, Rt as FLOTOptions, S as pointOnMidpointPerpendicularAxis, Sn as AnchorTransformEvent, St as DEFAULT_ANTITANK_WALL_OPTIONS, T as BaselineFrameNormal, Tt as DEFAULT_DELAY_OPTIONS, U as controlMeasureIdFromFeature, Ut as AttackHelicopterOptions, V as FeaturePartProps, Vt as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, W as ControlMeasure, Wt as DEFAULT_ATTACK_HELICOPTER_OPTIONS, X as ControlMeasureId, Xt as GenericRectangleOptions, Y as CONTROL_MEASURE_METADATA, Yt as DEFAULT_GENERIC_RECTANGLE_OPTIONS, Z as ControlMeasureKind, Zt as DEFAULT_GENERIC_POLYGON_OPTIONS, _ as blockDrawRule, _n as StrongPointOptions, _t as DEFAULT_FORTIFIED_AREA_OPTIONS, a as rectangleDrawRule, an as calculateMetrics, at as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, b as createMidpointPerpendicularDrawRule, bn as ControlMeasureMetadata, bt as FortifiedLineOptions, c as line24DrawRule, cn as project, ct as ObstacleBypassEasyOptions, d as line1DrawRule, dn as EncirclementOptions, dt as DEFAULT_FIX_OPTIONS, en as GenericLineOptions, et as getControlMeasureMetadataByValue, f as ambushDrawRule, fn as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, ft as FixOptions, g as disruptDrawRule, gn as DEFAULT_STRONG_POINT_OPTIONS, gt as DEFAULT_BLOCK_OPTIONS, h as centerRadiusDrawRule, hn as PrincipalDirectionOfFireOptions, ht as BlockOptions, i as DEFAULT_AMBUSH_OPTIONS, in as MainAttackOptions, it as ObstacleBypassImpossibleOptions, j as roundToFixed, jt as BypassOptions, k as EPSILON, kt as CanalizeOptions, l as line23DrawRule, ln as unproject, lt as DEFAULT_TURN_OPTIONS, m as point12DrawRule, mn as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, mt as DisruptOptions, n as TacticalArrowOptions, nn as SupportingAttackOptions, nt as listControlMeasureMetadata, o as axis1DrawRule, on as computeInitialWidthPoint, ot as ObstacleBypassDifficultOptions, p as attackByFireDrawRule, pn as FinalProtectiveFireOptions, pt as DEFAULT_DISRUPT_OPTIONS, q as ControlMeasureStyle, qt as DEFAULT_GENERIC_CIRCLE_OPTIONS, r as AmbushOptions, rn as DEFAULT_MAIN_ATTACK_OPTIONS, rt as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, s as supportByFireDrawRule, sn as Point2D, st as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, t as DEFAULT_TACTICAL_ARROW_OPTIONS, tn as DEFAULT_SUPPORTING_ATTACK_OPTIONS, tt as getDefaultOptions, u as turnDrawRule, un as DEFAULT_ENCIRCLEMENT_OPTIONS, ut as TurnOptions, v as MidpointPerpendicularDrawRuleOptions, vn as ControlMeasureGeometry, vt as FortifiedAreaOptions, w as BaselineFrame, wt as DEFAULT_ANTITANK_DITCH_OPTIONS, x as getMidpointPerpendicularSignedDistance, xn as ParamDescriptor, xt as AntitankWallOptions, y as computeDefaultMidpointPerpendicularPoint, yn as ControlMeasureGeometryType, yt as DEFAULT_FORTIFIED_LINE_OPTIONS, z as ControlMeasureRender, zt as AttackByFireOptions } from "./index-DUGzYzPy.mjs";
2
- export { type AirborneAttackOptions, type AmbushOptions, type AnchorTransformEvent, type AntitankDitchOptions, type AntitankWallOptions, type AttackByFireOptions, type AttackHelicopterOptions, type BaselineFrame, type BaselineFrameNormal, type BaselineFrameOptions, type BaselineFrameOrigin, type BlockMissionTaskOptions, type BlockOptions, type BreachOptions, type BypassOptions, CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, type CanalizeOptions, type ClearOptions, type ControlMeasure, type ControlMeasureDrawRule, type ControlMeasureGeometry, type ControlMeasureGeometryType, type ControlMeasureId, type ControlMeasureKind, type ControlMeasureMetadata, type ControlMeasureRender, type ControlMeasureSnapshot, type ControlMeasureStyle, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_OPTIONS, DEFAULT_BLOCK_MISSION_TASK_OPTIONS, DEFAULT_BLOCK_OPTIONS, DEFAULT_BREACH_OPTIONS, DEFAULT_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, type DelayOptions, type DisruptOptions, EPSILON, type EncirclementOptions, type FLOTOptions, type FeaturePartProps, type FinalProtectiveFireOptions, type FixOptions, type FortifiedAreaOptions, type FortifiedLineOptions, type GenericCircleOptions, type GenericLineOptions, type GenericPolygonOptions, type GenericRectangleOptions, type MainAttackOptions, type MidpointPerpendicularDrawRuleOptions, type ObstacleBypassDifficultOptions, type ObstacleBypassEasyOptions, type ObstacleBypassImpossibleOptions, type OptionsByKind, type ParamDescriptor, type Point2D, type PrincipalDirectionOfFireOptions, type RenderOptions, type SimpleStyleProps, type SimpleStyleRender, type StrongPointOptions, type StyleHints, type SupportByFireOptions, type SupportingAttackOptions, type TacticalArrowOptions, type TurnOptions, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
1
+ import { $ as getControlMeasureMetadata, $t as DEFAULT_GENERIC_LINE_OPTIONS, A as getMetersPerPixel, An as ControlMeasureMetadata, At as DEFAULT_CANALIZE_OPTIONS, B as ControlMeasureSnapshot, Bt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, C as snapToMidpointPerpendicular, Cn as StrongPointOptions, Ct as AntitankDitchOptions, D as BaselineFrameOrigin, Dn as DEFAULT_BOUNDARY_OPTIONS, Dt as ClearOptions, E as BaselineFrameOptions, En as BoundaryOptions, Et as DelayOptions, F as resolveStyleHints, Ft as BlockMissionTaskOptions, G as cloneControlMeasure, Gt as AirborneAttackOptions, H as StyleHints, Ht as SupportByFireOptions, I as freezeOrientationOptions, It as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, J as CONTROL_MEASURE_IDS, Jt as GenericCircleOptions, K as isKind, Kt as DEFAULT_AIRBORNE_ATTACK_OPTIONS, L as RenderOptions, Lt as DEFAULT_FLOT_OPTIONS, M as SimpleStyleProps, Mn as AnchorTransformEvent, Mt as DEFAULT_BYPASS_OPTIONS, N as SimpleStyleRender, Nn as ControlMeasureDrawRule, Nt as BreachOptions, O as createBaselineFrame, On as ControlMeasureGeometry, Ot as DEFAULT_CLEAR_OPTIONS, P as toSimpleStyle, Pt as DEFAULT_BREACH_OPTIONS, Q as OptionsByKind, Qt as GenericPolygonOptions, R as renderControlMeasure, Rt as FLOTOptions, S as pointOnMidpointPerpendicularAxis, Sn as DEFAULT_STRONG_POINT_OPTIONS, St as DEFAULT_ANTITANK_WALL_OPTIONS, T as BaselineFrameNormal, Tn as DEFAULT_BATTLE_POSITION_OPTIONS, Tt as DEFAULT_DELAY_OPTIONS, U as controlMeasureIdFromFeature, Ut as AttackHelicopterOptions, V as FeaturePartProps, Vt as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, W as ControlMeasure, Wt as DEFAULT_ATTACK_HELICOPTER_OPTIONS, X as ControlMeasureId, Xt as GenericRectangleOptions, Y as CONTROL_MEASURE_METADATA, Yt as DEFAULT_GENERIC_RECTANGLE_OPTIONS, Z as ControlMeasureKind, Zt as DEFAULT_GENERIC_POLYGON_OPTIONS, _ as blockDrawRule, _n as EncirclementOptions, _t as DEFAULT_FORTIFIED_AREA_OPTIONS, a as rectangleDrawRule, an as ClassicArrowOptions, at as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, b as createMidpointPerpendicularDrawRule, bn as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, bt as FortifiedLineOptions, c as line24DrawRule, cn as SupportingAttackOptions, ct as ObstacleBypassEasyOptions, d as line1DrawRule, dn as calculateMetrics, dt as DEFAULT_FIX_OPTIONS, en as GenericLineOptions, et as getControlMeasureMetadataByValue, f as ambushDrawRule, fn as computeInitialWidthPoint, ft as FixOptions, g as disruptDrawRule, gn as DEFAULT_ENCIRCLEMENT_OPTIONS, gt as DEFAULT_BLOCK_OPTIONS, h as centerRadiusDrawRule, hn as unproject, ht as BlockOptions, i as DEFAULT_AMBUSH_OPTIONS, in as ClassicArrowHeadStyle, it as ObstacleBypassImpossibleOptions, j as roundToFixed, jn as ParamDescriptor, jt as BypassOptions, k as EPSILON, kn as ControlMeasureGeometryType, kt as CanalizeOptions, l as line23DrawRule, ln as DEFAULT_MAIN_ATTACK_OPTIONS, lt as DEFAULT_TURN_OPTIONS, m as point12DrawRule, mn as project, mt as DisruptOptions, n as TacticalArrowOptions, nn as BlockArrowOptions, nt as listControlMeasureMetadata, o as axis1DrawRule, on as DEFAULT_CLASSIC_ARROW_OPTIONS, ot as ObstacleBypassDifficultOptions, p as attackByFireDrawRule, pn as Point2D, pt as DEFAULT_DISRUPT_OPTIONS, q as ControlMeasureStyle, qt as DEFAULT_GENERIC_CIRCLE_OPTIONS, r as AmbushOptions, rn as DEFAULT_BLOCK_ARROW_OPTIONS, rt as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, s as supportByFireDrawRule, sn as DEFAULT_SUPPORTING_ATTACK_OPTIONS, st as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, t as DEFAULT_TACTICAL_ARROW_OPTIONS, tn as BlockArrowHeadStyle, tt as getDefaultOptions, u as turnDrawRule, un as MainAttackOptions, ut as TurnOptions, v as MidpointPerpendicularDrawRuleOptions, vn as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, vt as FortifiedAreaOptions, w as BaselineFrame, wn as BattlePositionOptions, wt as DEFAULT_ANTITANK_DITCH_OPTIONS, x as getMidpointPerpendicularSignedDistance, xn as PrincipalDirectionOfFireOptions, xt as AntitankWallOptions, y as computeDefaultMidpointPerpendicularPoint, yn as FinalProtectiveFireOptions, yt as DEFAULT_FORTIFIED_LINE_OPTIONS, z as ControlMeasureRender, zt as AttackByFireOptions } from "./index-BHWESyWA.mjs";
2
+ export { type AirborneAttackOptions, type AmbushOptions, type AnchorTransformEvent, type AntitankDitchOptions, type AntitankWallOptions, type AttackByFireOptions, type AttackHelicopterOptions, type BaselineFrame, type BaselineFrameNormal, type BaselineFrameOptions, type BaselineFrameOrigin, type BattlePositionOptions, type BlockArrowHeadStyle, type BlockArrowOptions, type BlockMissionTaskOptions, type BlockOptions, type BoundaryOptions, type BreachOptions, type BypassOptions, CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, type CanalizeOptions, type ClassicArrowHeadStyle, type ClassicArrowOptions, type ClearOptions, type ControlMeasure, type ControlMeasureDrawRule, type ControlMeasureGeometry, type ControlMeasureGeometryType, type ControlMeasureId, type ControlMeasureKind, type ControlMeasureMetadata, type ControlMeasureRender, type ControlMeasureSnapshot, type ControlMeasureStyle, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_OPTIONS, DEFAULT_BATTLE_POSITION_OPTIONS, DEFAULT_BLOCK_ARROW_OPTIONS, DEFAULT_BLOCK_MISSION_TASK_OPTIONS, DEFAULT_BLOCK_OPTIONS, DEFAULT_BOUNDARY_OPTIONS, DEFAULT_BREACH_OPTIONS, DEFAULT_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLASSIC_ARROW_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, type DelayOptions, type DisruptOptions, EPSILON, type EncirclementOptions, type FLOTOptions, type FeaturePartProps, type FinalProtectiveFireOptions, type FixOptions, type FortifiedAreaOptions, type FortifiedLineOptions, type GenericCircleOptions, type GenericLineOptions, type GenericPolygonOptions, type GenericRectangleOptions, type MainAttackOptions, type MidpointPerpendicularDrawRuleOptions, type ObstacleBypassDifficultOptions, type ObstacleBypassEasyOptions, type ObstacleBypassImpossibleOptions, type OptionsByKind, type ParamDescriptor, type Point2D, type PrincipalDirectionOfFireOptions, type RenderOptions, type SimpleStyleProps, type SimpleStyleRender, type StrongPointOptions, type StyleHints, type SupportByFireOptions, type SupportingAttackOptions, type TacticalArrowOptions, type TurnOptions, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as point12DrawRule, A as DEFAULT_GENERIC_POLYGON_OPTIONS, B as DEFAULT_ANTITANK_WALL_OPTIONS, C as DEFAULT_FIX_OPTIONS, D as DEFAULT_DELAY_OPTIONS, E as DEFAULT_DISRUPT_OPTIONS, F as DEFAULT_BREACH_OPTIONS, G as axis1DrawRule, H as DEFAULT_AMBUSH_OPTIONS, I as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, J as line23DrawRule, K as supportByFireDrawRule, L as DEFAULT_BLOCK_OPTIONS, M as DEFAULT_GENERIC_CIRCLE_OPTIONS, N as DEFAULT_CANALIZE_OPTIONS, O as DEFAULT_CLEAR_OPTIONS, P as DEFAULT_BYPASS_OPTIONS, Q as attackByFireDrawRule, R as DEFAULT_ATTACK_HELICOPTER_OPTIONS, S as DEFAULT_FLOT_OPTIONS, T as DEFAULT_ENCIRCLEMENT_OPTIONS, U as DEFAULT_AIRBORNE_ATTACK_OPTIONS, V as DEFAULT_ANTITANK_DITCH_OPTIONS, W as rectangleDrawRule, X as line1DrawRule, Y as turnDrawRule, Z as ambushDrawRule, _ as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, a as DEFINITIONS, at as getMidpointPerpendicularSignedDistance, b as DEFAULT_FORTIFIED_AREA_OPTIONS, c as getDefaultOptions, ct as createBaselineFrame, d as DEFAULT_SUPPORTING_ATTACK_OPTIONS, dt as project, et as centerRadiusDrawRule, f as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, ft as unproject, g as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, h as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, ht as roundToFixed, i as CONTROL_MEASURE_METADATA, it as createMidpointPerpendicularDrawRule, j as DEFAULT_GENERIC_LINE_OPTIONS, k as DEFAULT_GENERIC_RECTANGLE_OPTIONS, l as listControlMeasureMetadata, lt as calculateMetrics, m as DEFAULT_TACTICAL_ARROW_OPTIONS, mt as getMetersPerPixel, n as resolveStyleHints, nt as blockDrawRule, o as getControlMeasureMetadata, ot as pointOnMidpointPerpendicularAxis, p as DEFAULT_STRONG_POINT_OPTIONS, pt as EPSILON, q as line24DrawRule, r as CONTROL_MEASURE_IDS, rt as computeDefaultMidpointPerpendicularPoint, s as getControlMeasureMetadataByValue, st as snapToMidpointPerpendicular, t as renderControlMeasure, tt as disruptDrawRule, u as DEFAULT_TURN_OPTIONS, ut as computeInitialWidthPoint, v as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, w as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, x as DEFAULT_FORTIFIED_LINE_OPTIONS, y as DEFAULT_MAIN_ATTACK_OPTIONS, z as DEFAULT_ATTACK_BY_FIRE_OPTIONS } from "./renderControlMeasure-D5NKuws0.mjs";
1
+ import { $ as turnDrawRule, A as DEFAULT_GENERIC_POLYGON_OPTIONS, B as DEFAULT_BLOCK_OPTIONS, C as DEFAULT_FIX_OPTIONS, D as DEFAULT_DELAY_OPTIONS, E as DEFAULT_DISRUPT_OPTIONS, F as DEFAULT_BYPASS_OPTIONS, G as DEFAULT_ANTITANK_DITCH_OPTIONS, H as DEFAULT_ATTACK_HELICOPTER_OPTIONS, I as DEFAULT_BREACH_OPTIONS, J as rectangleDrawRule, K as DEFAULT_AMBUSH_OPTIONS, L as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, M as DEFAULT_GENERIC_CIRCLE_OPTIONS, N as DEFAULT_CLASSIC_ARROW_OPTIONS, O as DEFAULT_CLEAR_OPTIONS, P as DEFAULT_CANALIZE_OPTIONS, Q as line23DrawRule, R as DEFAULT_BOUNDARY_OPTIONS, S as DEFAULT_FLOT_OPTIONS, T as DEFAULT_ENCIRCLEMENT_OPTIONS, U as DEFAULT_ATTACK_BY_FIRE_OPTIONS, V as DEFAULT_BATTLE_POSITION_OPTIONS, W as DEFAULT_ANTITANK_WALL_OPTIONS, X as supportByFireDrawRule, Y as axis1DrawRule, Z as line24DrawRule, _ as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, _t as EPSILON, a as DEFINITIONS, at as disruptDrawRule, b as DEFAULT_FORTIFIED_AREA_OPTIONS, c as getDefaultOptions, ct as createMidpointPerpendicularDrawRule, d as DEFAULT_SUPPORTING_ATTACK_OPTIONS, dt as snapToMidpointPerpendicular, et as line1DrawRule, f as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, ft as createBaselineFrame, g as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, gt as unproject, h as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, ht as project, i as CONTROL_MEASURE_METADATA, it as centerRadiusDrawRule, j as DEFAULT_GENERIC_LINE_OPTIONS, k as DEFAULT_GENERIC_RECTANGLE_OPTIONS, l as listControlMeasureMetadata, lt as getMidpointPerpendicularSignedDistance, m as DEFAULT_TACTICAL_ARROW_OPTIONS, mt as computeInitialWidthPoint, n as resolveStyleHints, nt as attackByFireDrawRule, o as getControlMeasureMetadata, ot as blockDrawRule, p as DEFAULT_STRONG_POINT_OPTIONS, pt as calculateMetrics, q as DEFAULT_AIRBORNE_ATTACK_OPTIONS, r as CONTROL_MEASURE_IDS, rt as point12DrawRule, s as getControlMeasureMetadataByValue, st as computeDefaultMidpointPerpendicularPoint, t as renderControlMeasure, tt as ambushDrawRule, u as DEFAULT_TURN_OPTIONS, ut as pointOnMidpointPerpendicularAxis, v as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, vt as getMetersPerPixel, w as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, x as DEFAULT_FORTIFIED_LINE_OPTIONS, y as DEFAULT_MAIN_ATTACK_OPTIONS, yt as roundToFixed, z as DEFAULT_BLOCK_ARROW_OPTIONS } from "./renderControlMeasure-DnM2w9jS.mjs";
2
2
  //#region src/freeze-orientation.ts
3
3
  /**
4
4
  * Dispatches to a measure kind's `freezeOrientation` hook (see
@@ -114,4 +114,4 @@ function toHexChannel(value) {
114
114
  return Math.max(0, Math.min(255, Math.round(value))).toString(16).padStart(2, "0");
115
115
  }
116
116
  //#endregion
117
- export { CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_OPTIONS, DEFAULT_BLOCK_MISSION_TASK_OPTIONS, DEFAULT_BLOCK_OPTIONS, DEFAULT_BREACH_OPTIONS, DEFAULT_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, EPSILON, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
117
+ export { CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_OPTIONS, DEFAULT_BATTLE_POSITION_OPTIONS, DEFAULT_BLOCK_ARROW_OPTIONS, DEFAULT_BLOCK_MISSION_TASK_OPTIONS, DEFAULT_BLOCK_OPTIONS, DEFAULT_BOUNDARY_OPTIONS, DEFAULT_BREACH_OPTIONS, DEFAULT_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLASSIC_ARROW_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, EPSILON, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
@@ -1,4 +1,4 @@
1
- import { X as ControlMeasureId } from "../index-DUGzYzPy.mjs";
1
+ import { X as ControlMeasureId } from "../index-BHWESyWA.mjs";
2
2
  import { FeatureCollection, Geometry } from "geojson";
3
3
 
4
4
  //#region src/preview/index.d.ts
@@ -1,4 +1,4 @@
1
- import { a as DEFINITIONS, t as renderControlMeasure } from "../renderControlMeasure-D5NKuws0.mjs";
1
+ import { a as DEFINITIONS, t as renderControlMeasure } from "../renderControlMeasure-DnM2w9jS.mjs";
2
2
  //#region src/preview/index.ts
3
3
  /**
4
4
  * Unitless `previewSample` points (~`[-1, 1]`) are scaled by this degree offset
@@ -181,7 +181,7 @@ function pointToInfiniteLineDistance(p, a, b) {
181
181
  }
182
182
  /**
183
183
  * Calculates intersection of two line segments p1-p2 and p3-p4.
184
- * Returns null if parallel. Assuming they cross as per design.
184
+ * Returns null if parallel or if the infinite lines intersect outside either segment.
185
185
  */
186
186
  function lineIntersection(p1, p2, p3, p4) {
187
187
  const x1 = p1[0], y1 = p1[1];
@@ -191,6 +191,8 @@ function lineIntersection(p1, p2, p3, p4) {
191
191
  const denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);
192
192
  if (Math.abs(denom) < 1e-6) return null;
193
193
  const ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denom;
194
+ const ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denom;
195
+ if (ua < -1e-6 || ua > 1.000001 || ub < -1e-6 || ub > 1.000001) return null;
194
196
  return [x1 + ua * (x2 - x1), y1 + ua * (y2 - y1)];
195
197
  }
196
198
  //#endregion
@@ -204,8 +206,8 @@ const SHAFT_MAX_RATIO = .9;
204
206
  */
205
207
  function processAttackGeometry(coordinates, options = {}) {
206
208
  const shaftRatio = clamp(options.shaftWidthRatio ?? .6, SHAFT_MIN_RATIO, SHAFT_MAX_RATIO);
207
- const roundedBends = options.roundedBends ?? false;
208
- const bendSegments = options.bendSegments ?? 5;
209
+ const smooth = options.smooth ?? false;
210
+ const smoothResolution = options.smoothResolution ?? 5;
209
211
  const points = coordinates.map((c) => project(c[0], c[1]));
210
212
  const numPoints = points.length;
211
213
  const ptTip = points[0];
@@ -215,18 +217,41 @@ function processAttackGeometry(coordinates, options = {}) {
215
217
  const p = points[i];
216
218
  if (p) spinePoints.push(p);
217
219
  }
218
- return { geometry: calculateSymbolGeometry(ptTip, ptWidth, spinePoints, shaftRatio, roundedBends, bendSegments) };
219
- }
220
- function calculateSymbolGeometry(ptTip, ptWidth, spine, shaftRatio, roundedBends, bendSegments) {
221
- const ptNeck = spine[spine.length - 1];
220
+ return { geometry: calculateSymbolGeometry(ptTip, ptWidth, spinePoints, shaftRatio, smooth, smoothResolution) };
221
+ }
222
+ function calculateSymbolGeometry(ptTip, ptWidth, spine, shaftRatio, smooth, smoothResolution) {
223
+ const initialNeck = spine[spine.length - 1];
224
+ if (!initialNeck) return null;
225
+ const initialTipDir = vecNorm(vecSub(ptTip, initialNeck));
226
+ if (vecMag(initialTipDir) < 1e-6) return null;
227
+ const headHalfWidth = pointToInfiniteLineDistance(ptWidth, initialNeck, ptTip);
228
+ const vecTipToWidth = vecSub(ptTip, ptWidth);
229
+ const requestedHeadLength = Math.max(EPSILON, vecDot(vecTipToWidth, initialTipDir));
230
+ const path = [...spine, ptTip];
231
+ let totalArcLength = 0;
232
+ for (let i = 1; i < path.length; i++) totalArcLength += vecMag(vecSub(path[i], path[i - 1]));
233
+ const minimumShaftLength = Math.max(EPSILON, totalArcLength * .01);
234
+ let distanceRemaining = clamp(requestedHeadLength, EPSILON, Math.max(EPSILON, totalArcLength - minimumShaftLength));
235
+ let ptBase = ptTip;
236
+ let remainingSpine = spine;
237
+ for (let i = path.length - 1; i > 0; i--) {
238
+ const segmentEnd = path[i];
239
+ const segmentStart = path[i - 1];
240
+ const segment = vecSub(segmentStart, segmentEnd);
241
+ const segmentLength = vecMag(segment);
242
+ if (segmentLength < 1e-6) continue;
243
+ if (distanceRemaining < segmentLength) {
244
+ ptBase = vecAdd(segmentEnd, vecScale(segment, distanceRemaining / segmentLength));
245
+ remainingSpine = path.slice(0, i);
246
+ break;
247
+ }
248
+ distanceRemaining -= segmentLength;
249
+ }
250
+ const ptNeck = remainingSpine[remainingSpine.length - 1];
222
251
  if (!ptNeck) return null;
223
252
  const tipDir = vecNorm(vecSub(ptTip, ptNeck));
224
253
  if (vecMag(tipDir) < 1e-6) return null;
225
- const headHalfWidth = pointToInfiniteLineDistance(ptWidth, ptNeck, ptTip);
226
- const vecTipToWidth = vecSub(ptTip, ptWidth);
227
- const maxHeadLength = Math.max(0, vecMag(vecSub(ptTip, ptNeck)) - .1);
228
- const headLength = clamp(vecDot(vecTipToWidth, tipDir), EPSILON, maxHeadLength);
229
- const ptBase = vecSub(ptTip, vecScale(tipDir, headLength));
254
+ const headLength = vecMag(vecSub(ptTip, ptBase));
230
255
  const shaftHalfWidth = headHalfWidth * shaftRatio;
231
256
  const perpDir = [-tipDir[1], tipDir[0]];
232
257
  const outerLeft = vecAdd(ptBase, vecScale(perpDir, headHalfWidth));
@@ -234,7 +259,8 @@ function calculateSymbolGeometry(ptTip, ptWidth, spine, shaftRatio, roundedBends
234
259
  const innerLeft = vecAdd(ptBase, vecScale(perpDir, shaftHalfWidth));
235
260
  const innerRight = vecAdd(ptBase, vecScale(perpDir, -shaftHalfWidth));
236
261
  const notchDepth = headLength * shaftRatio;
237
- const innerTip = vecAdd(ptBase, vecScale(tipDir, Math.min(notchDepth, headLength - EPSILON)));
262
+ const safeNotchDepth = Math.min(notchDepth, headLength - EPSILON);
263
+ const innerTip = vecAdd(ptBase, vecScale(tipDir, safeNotchDepth));
238
264
  const shaftEndCenter = ptBase;
239
265
  const headRing = [
240
266
  outerLeft,
@@ -245,10 +271,10 @@ function calculateSymbolGeometry(ptTip, ptWidth, spine, shaftRatio, roundedBends
245
271
  innerLeft,
246
272
  outerLeft
247
273
  ];
248
- const fullSpine = [...spine, shaftEndCenter];
274
+ const fullSpine = [...remainingSpine, shaftEndCenter];
249
275
  return {
250
- shaftLeft: offsetPolyline(fullSpine, shaftHalfWidth, roundedBends, bendSegments),
251
- shaftRight: offsetPolyline(fullSpine, -shaftHalfWidth, roundedBends, bendSegments),
276
+ shaftLeft: offsetPolyline(fullSpine, shaftHalfWidth, smooth, smoothResolution),
277
+ shaftRight: offsetPolyline(fullSpine, -shaftHalfWidth, smooth, smoothResolution),
252
278
  headRing,
253
279
  ptTip,
254
280
  ptNeck,
@@ -949,20 +975,20 @@ const ATTACK_SHAFT_PARAMS = [
949
975
  step: .05
950
976
  },
951
977
  {
952
- key: "roundedBends",
953
- label: "Rounded bends",
978
+ key: "smooth",
979
+ label: "Smooth",
954
980
  description: "Round the corners where the shaft changes direction.",
955
981
  type: "boolean"
956
982
  },
957
983
  {
958
- key: "bendSegments",
959
- label: "Bend segments",
960
- description: "Number of segments approximating each rounded bend",
984
+ key: "smoothResolution",
985
+ label: "Smooth resolution",
986
+ description: "Number of segments approximating each rounded bend when smooth mode is enabled.",
961
987
  type: "number",
962
988
  min: 1,
963
989
  max: 20,
964
990
  step: 1,
965
- visibleWhen: (opts) => opts.roundedBends === true
991
+ visibleWhen: (opts) => opts.smooth === true
966
992
  }
967
993
  ];
968
994
  const FIRE_ARROW_PARAMS = [
@@ -976,8 +1002,8 @@ const FIRE_ARROW_PARAMS = [
976
1002
  step: .01
977
1003
  },
978
1004
  {
979
- key: "backLineLengthRatio",
980
- label: "Back line length",
1005
+ key: "rearLineLengthRatio",
1006
+ label: "Rear line length",
981
1007
  description: "Length of the rear flare lines as a ratio of the head",
982
1008
  type: "number",
983
1009
  min: .05,
@@ -985,8 +1011,8 @@ const FIRE_ARROW_PARAMS = [
985
1011
  step: .01
986
1012
  },
987
1013
  {
988
- key: "backLineAngle",
989
- label: "Back line angle",
1014
+ key: "rearLineAngle",
1015
+ label: "Rear line angle",
990
1016
  description: "Angle of the rear flare lines, in degrees",
991
1017
  type: "number",
992
1018
  min: 0,
@@ -995,8 +1021,8 @@ const FIRE_ARROW_PARAMS = [
995
1021
  }
996
1022
  ];
997
1023
  const FORTIFIED_AREA_SIZE_PARAMS = [{
998
- key: "sizePixels",
999
- label: "Size",
1024
+ key: "toothSizePixels",
1025
+ label: "Tooth size",
1000
1026
  description: "Size of the fortified-area teeth, in pixels",
1001
1027
  type: "number",
1002
1028
  min: 5,
@@ -1004,8 +1030,8 @@ const FORTIFIED_AREA_SIZE_PARAMS = [{
1004
1030
  step: 1,
1005
1031
  unit: "px"
1006
1032
  }, {
1007
- key: "size",
1008
- label: "Size",
1033
+ key: "toothSize",
1034
+ label: "Tooth size",
1009
1035
  description: "Size of the fortified-area teeth, in meters",
1010
1036
  type: "number",
1011
1037
  min: 1,
@@ -1072,8 +1098,8 @@ const FORTIFIED_AREA_PARAMS = [
1072
1098
  //#region src/generators/cm15-maneuver-areas/airborneAttack.ts
1073
1099
  const DEFAULT_AIRBORNE_ATTACK_OPTIONS = {
1074
1100
  shaftWidthRatio: DEFAULT_SHAFT_WIDTH_RATIO,
1075
- roundedBends: false,
1076
- bendSegments: 5
1101
+ smooth: false,
1102
+ smoothResolution: 5
1077
1103
  };
1078
1104
  const AIRBORNE_ATTACK_METADATA = {
1079
1105
  id: "airborne-attack",
@@ -1168,7 +1194,7 @@ const DEFAULT_AMBUSH_OPTIONS = {
1168
1194
  hatchLengthRatio: .15,
1169
1195
  hatchCount: 5,
1170
1196
  curveDepthRatio: .25,
1171
- resolution: 30
1197
+ arcSegments: 30
1172
1198
  };
1173
1199
  const AMBUSH_METADATA = {
1174
1200
  id: "ambush",
@@ -1229,8 +1255,8 @@ const AMBUSH_METADATA = {
1229
1255
  step: .01
1230
1256
  },
1231
1257
  {
1232
- key: "resolution",
1233
- label: "Resolution",
1258
+ key: "arcSegments",
1259
+ label: "Arc segments",
1234
1260
  description: "Number of segments used to render the curve",
1235
1261
  type: "number",
1236
1262
  min: 4,
@@ -1252,11 +1278,11 @@ const quadBezier = (t, a, b, c) => {
1252
1278
  * @returns GeoJSON FeatureCollection containing LineString components
1253
1279
  */
1254
1280
  function createAmbushSymbol(coordinates, options = {}) {
1255
- const { arrowheadLengthRatio, arrowheadWidthRatio, hatchLengthRatio, hatchCount, curveDepthRatio, resolution } = {
1281
+ const { arrowheadLengthRatio, arrowheadWidthRatio, hatchLengthRatio, hatchCount, curveDepthRatio, arcSegments } = {
1256
1282
  ...DEFAULT_AMBUSH_OPTIONS,
1257
1283
  ...options
1258
1284
  };
1259
- const safeResolution = Math.max(1, Math.floor(resolution));
1285
+ const safeArcSegments = Math.max(1, Math.floor(arcSegments));
1260
1286
  const safeHatchCount = Math.max(0, Math.floor(hatchCount));
1261
1287
  const safeArrowheadLengthRatio = Math.max(0, arrowheadLengthRatio);
1262
1288
  const safeArrowheadWidthRatio = Math.max(0, arrowheadWidthRatio);
@@ -1289,8 +1315,8 @@ function createAmbushSymbol(coordinates, options = {}) {
1289
1315
  vecSub(hBase, vecScale(perp, hw))
1290
1316
  ]);
1291
1317
  const curve = [];
1292
- for (let i = 0; i <= safeResolution; i++) {
1293
- const t = i / safeResolution;
1318
+ for (let i = 0; i <= safeArcSegments; i++) {
1319
+ const t = i / safeArcSegments;
1294
1320
  curve.push(quadBezier(t, p2, ctrl, p3));
1295
1321
  }
1296
1322
  lines.push(curve);
@@ -1337,8 +1363,8 @@ const FORTIFIED_PARAMS = [
1337
1363
  visibleWhen: (opts) => Boolean(opts.smooth)
1338
1364
  },
1339
1365
  {
1340
- key: "sizePixels",
1341
- label: "Size",
1366
+ key: "toothSizePixels",
1367
+ label: "Tooth size",
1342
1368
  description: "Side length of the square crenellations",
1343
1369
  type: "number",
1344
1370
  min: 5,
@@ -1347,8 +1373,8 @@ const FORTIFIED_PARAMS = [
1347
1373
  unit: "px"
1348
1374
  },
1349
1375
  {
1350
- key: "size",
1351
- label: "Size",
1376
+ key: "toothSize",
1377
+ label: "Tooth size",
1352
1378
  description: "Side length of the square crenellations",
1353
1379
  type: "number",
1354
1380
  min: 1,
@@ -1597,8 +1623,8 @@ const ANTITANK_WALL = defineControlMeasure({
1597
1623
  //#region src/generators/cm15-maneuver-areas/attackByFire.ts
1598
1624
  const DEFAULT_ATTACK_BY_FIRE_OPTIONS = {
1599
1625
  arrowheadWidthRatio: .3,
1600
- backLineLengthRatio: .3,
1601
- backLineAngle: 45
1626
+ rearLineLengthRatio: .3,
1627
+ rearLineAngle: 45
1602
1628
  };
1603
1629
  const ATTACK_BY_FIRE_METADATA = {
1604
1630
  id: "attack-by-fire",
@@ -1629,8 +1655,8 @@ const ATTACK_BY_FIRE_METADATA = {
1629
1655
  function createAttackByFire(coordinates, options = {}) {
1630
1656
  const featureProps = {};
1631
1657
  const arrowheadWidthRatio = options.arrowheadWidthRatio ?? DEFAULT_ATTACK_BY_FIRE_OPTIONS.arrowheadWidthRatio;
1632
- const backLineLengthRatio = options.backLineLengthRatio ?? DEFAULT_ATTACK_BY_FIRE_OPTIONS.backLineLengthRatio;
1633
- const backLineAngle = options.backLineAngle ?? DEFAULT_ATTACK_BY_FIRE_OPTIONS.backLineAngle;
1658
+ const rearLineLengthRatio = options.rearLineLengthRatio ?? DEFAULT_ATTACK_BY_FIRE_OPTIONS.rearLineLengthRatio;
1659
+ const rearLineAngle = options.rearLineAngle ?? DEFAULT_ATTACK_BY_FIRE_OPTIONS.rearLineAngle;
1634
1660
  const c1 = coordinates[0];
1635
1661
  const c2 = coordinates[1];
1636
1662
  const c3 = coordinates[2];
@@ -1656,13 +1682,13 @@ function createAttackByFire(coordinates, options = {}) {
1656
1682
  const lenShaft = Math.abs(signedTipDistance);
1657
1683
  const lenBase = frame.length;
1658
1684
  const dirBase = frame.direction;
1659
- const angleRad = backLineAngle * Math.PI / 180;
1685
+ const angleRad = rearLineAngle * Math.PI / 180;
1660
1686
  const baseAngle = -Math.PI / 2;
1661
1687
  const angleLeft = baseAngle - angleRad;
1662
1688
  const dirBackLeft = [dirBase[0] * Math.cos(angleLeft) - dirBase[1] * Math.sin(angleLeft), dirBase[0] * Math.sin(angleLeft) + dirBase[1] * Math.cos(angleLeft)];
1663
1689
  const angleRight = baseAngle + angleRad;
1664
1690
  const dirBackRight = [dirBase[0] * Math.cos(angleRight) - dirBase[1] * Math.sin(angleRight), dirBase[0] * Math.sin(angleRight) + dirBase[1] * Math.cos(angleRight)];
1665
- const backLen = lenBase * backLineLengthRatio;
1691
+ const backLen = lenBase * rearLineLengthRatio;
1666
1692
  const p2Back = vecAdd(p2, vecScale(dirBackLeft, backLen));
1667
1693
  const p3Back = vecAdd(p3, vecScale(dirBackRight, backLen));
1668
1694
  const headWidth = lenShaft * arrowheadWidthRatio;
@@ -1737,8 +1763,8 @@ const ATTACK_BY_FIRE = defineControlMeasure({
1737
1763
  //#region src/generators/cm15-maneuver-areas/attackHelicopter.ts
1738
1764
  const DEFAULT_ATTACK_HELICOPTER_OPTIONS = {
1739
1765
  shaftWidthRatio: DEFAULT_SHAFT_WIDTH_RATIO,
1740
- roundedBends: false,
1741
- bendSegments: 5,
1766
+ smooth: false,
1767
+ smoothResolution: 5,
1742
1768
  symbolHeightRatio: .45,
1743
1769
  triangleSizeRatio: .25,
1744
1770
  bottomBarWidthRatio: 1.5,
@@ -1826,7 +1852,7 @@ function createAttackHelicopter(coordinates, options = {}) {
1826
1852
  type: "FeatureCollection",
1827
1853
  features: []
1828
1854
  };
1829
- const center = lineIntersection(pL, pIR, pR, pIL);
1855
+ const center = lineIntersection(pL, pIR, pR, pIL) ?? geometry.ptBase;
1830
1856
  const features = [{
1831
1857
  type: "Feature",
1832
1858
  properties: {},
@@ -2338,15 +2364,18 @@ function closedCatmullRom(points, samples) {
2338
2364
  }
2339
2365
  //#endregion
2340
2366
  //#region src/internal/area-echelon.ts
2341
- /** Mean of the ring's distinct vertices, used as the outward-normal reference. */
2342
- function ringCentroid(verts, count) {
2343
- let cx = 0;
2344
- let cy = 0;
2345
- for (let i = 0; i < count; i++) {
2346
- cx += verts[i][0];
2347
- cy += verts[i][1];
2367
+ /**
2368
+ * Twice the ring's signed area (shoelace). Positive when the ring winds
2369
+ * counter-clockwise in projected (y-up) coordinates.
2370
+ */
2371
+ function ringSignedArea2(verts) {
2372
+ let area2 = 0;
2373
+ for (let i = 0; i < verts.length - 1; i++) {
2374
+ const a = verts[i];
2375
+ const b = verts[i + 1];
2376
+ area2 += a[0] * b[1] - b[0] * a[1];
2348
2377
  }
2349
- return [cx / count, cy / count];
2378
+ return area2;
2350
2379
  }
2351
2380
  /**
2352
2381
  * Projects `positions` and returns a closed ring (first == last), optionally
@@ -2366,7 +2395,7 @@ function buildClosedRing(positions, smooth, smoothResolution, defaultSmoothResol
2366
2395
  * projected y), the side opposite the front.
2367
2396
  */
2368
2397
  function buildAreaPerimeter(verts) {
2369
- const centroid = ringCentroid(verts, verts.length - 1);
2398
+ const ccw = ringSignedArea2(verts) > 0;
2370
2399
  const segs = [];
2371
2400
  let totalLength = 0;
2372
2401
  let anchorTarget = 0;
@@ -2379,8 +2408,7 @@ function buildAreaPerimeter(verts) {
2379
2408
  if (length < 1e-6) continue;
2380
2409
  const along = vecNorm(edge);
2381
2410
  const mid = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];
2382
- let perp = [-along[1], along[0]];
2383
- if (perp[0] * (mid[0] - centroid[0]) + perp[1] * (mid[1] - centroid[1]) < 0) perp = [-perp[0], -perp[1]];
2411
+ const perp = ccw ? [along[1], -along[0]] : [-along[1], along[0]];
2384
2412
  segs.push({
2385
2413
  start: a,
2386
2414
  along,
@@ -2701,7 +2729,7 @@ const DEFAULT_SMOOTH_RESOLUTION$5 = 12;
2701
2729
  const MIN_SMOOTH_RESOLUTION$1 = 2;
2702
2730
  const MAX_SMOOTH_RESOLUTION$1 = 64;
2703
2731
  const DEFAULT_BLOCK_ARROW_OPTIONS = {
2704
- shaftWidth: .06,
2732
+ shaftWidthRatio: .06,
2705
2733
  arrowheadStyle: "triangle",
2706
2734
  arrowheadWidthRatio: .18,
2707
2735
  arrowheadLengthRatio: .22,
@@ -2723,7 +2751,7 @@ const BLOCK_ARROW_METADATA = {
2723
2751
  drawRule: "Axis1",
2724
2752
  params: [
2725
2753
  {
2726
- key: "shaftWidth",
2754
+ key: "shaftWidthRatio",
2727
2755
  label: "Shaft width",
2728
2756
  description: "Shaft band width as a fraction of the total path length",
2729
2757
  type: "number",
@@ -2816,7 +2844,7 @@ const BLOCK_ARROW_METADATA = {
2816
2844
  * right side of the shaft.
2817
2845
  */
2818
2846
  function createBlockArrow(coordinates, options = {}) {
2819
- const { shaftWidth, arrowheadStyle, arrowheadWidthRatio, arrowheadLengthRatio, smooth, smoothResolution, filled } = {
2847
+ const { shaftWidthRatio, arrowheadStyle, arrowheadWidthRatio, arrowheadLengthRatio, smooth, smoothResolution, filled } = {
2820
2848
  ...DEFAULT_BLOCK_ARROW_OPTIONS,
2821
2849
  ...options
2822
2850
  };
@@ -2829,7 +2857,7 @@ function createBlockArrow(coordinates, options = {}) {
2829
2857
  const { pts, pathLength, tip, dir, perp, segLength } = axis;
2830
2858
  const requestedHeadLen = axis1.headLength ?? pathLength * arrowheadLengthRatio;
2831
2859
  const headLen = Math.min(requestedHeadLen, segLength * .95);
2832
- const halfShaft = pathLength * shaftWidth / 2;
2860
+ const halfShaft = pathLength * shaftWidthRatio / 2;
2833
2861
  const halfHead = axis1.headHalfWidth ?? pathLength * arrowheadWidthRatio / 2;
2834
2862
  const onAxis = (d, side = 0) => [tip[0] - dir[0] * d + perp[0] * side, tip[1] - dir[1] * d + perp[1] * side];
2835
2863
  let shaftEndDist;
@@ -2928,7 +2956,7 @@ const BLOCK_ARROW = defineControlMeasure({
2928
2956
  [-1.5, 0],
2929
2957
  [.95, .4]
2930
2958
  ],
2931
- options: { shaftWidth: .2 }
2959
+ options: { shaftWidthRatio: .2 }
2932
2960
  }
2933
2961
  });
2934
2962
  function axis1Geometry(coordinates) {
@@ -4962,7 +4990,7 @@ const BLADE_LENGTH_FRACTION = .8;
4962
4990
  const DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS = {
4963
4991
  arrowheadLengthRatio: .07,
4964
4992
  arrowheadWidthRatio: .67,
4965
- bladeHeight: .03
4993
+ bladeHeightRatio: .03
4966
4994
  };
4967
4995
  const FPF_SHARED = {
4968
4996
  entity: "Maneuver Lines",
@@ -4992,7 +5020,7 @@ const FPF_SHARED = {
4992
5020
  step: .01
4993
5021
  },
4994
5022
  {
4995
- key: "bladeHeight",
5023
+ key: "bladeHeightRatio",
4996
5024
  label: "Blade height",
4997
5025
  description: "Blade's perpendicular reach into the V, as a fraction of its arm's length",
4998
5026
  type: "number",
@@ -5022,7 +5050,7 @@ const FINAL_PROTECTIVE_FIRE_RIGHT_METADATA = {
5022
5050
  * Builds the filled "blade": a uniform-width rectangle hugging the inside of
5023
5051
  * one arm. One long edge lies on the central 80% of the arm line (connected to
5024
5052
  * the line); the strip bulges perpendicularly into the inside of the V by
5025
- * `bladeHeight * armLength`.
5053
+ * `bladeHeightRatio * armLength`.
5026
5054
  *
5027
5055
  * @param vertex - PT 1, the shared vertex of the V (projected)
5028
5056
  * @param tip - the outward tip of the bladed arm (projected)
@@ -5030,7 +5058,7 @@ const FINAL_PROTECTIVE_FIRE_RIGHT_METADATA = {
5030
5058
  * be undefined during live single-arm feedback, in which case a default side
5031
5059
  * is chosen
5032
5060
  */
5033
- function bladeRectangle(vertex, tip, otherTip, bladeHeight) {
5061
+ function bladeRectangle(vertex, tip, otherTip, bladeHeightRatio) {
5034
5062
  const v = vecSub(tip, vertex);
5035
5063
  const armLength = vecMag(v);
5036
5064
  if (armLength < 1e-6) return null;
@@ -5043,7 +5071,7 @@ function bladeRectangle(vertex, tip, otherTip, bladeHeight) {
5043
5071
  const gap = (1 - BLADE_LENGTH_FRACTION) / 2;
5044
5072
  const onLineNear = vecAdd(vertex, vecScale(dir, armLength * gap));
5045
5073
  const onLineFar = vecAdd(vertex, vecScale(dir, armLength * (1 - gap)));
5046
- const height = vecScale(perp, armLength * bladeHeight);
5074
+ const height = vecScale(perp, armLength * bladeHeightRatio);
5047
5075
  return [
5048
5076
  onLineNear,
5049
5077
  onLineFar,
@@ -5065,7 +5093,7 @@ function bladeRectangle(vertex, tip, otherTip, bladeHeight) {
5065
5093
  * @param options - Arrowhead and blade sizing parameters
5066
5094
  */
5067
5095
  function createFinalProtectiveFire(coordinates, bladedArm, options = {}) {
5068
- const { arrowheadLengthRatio, arrowheadWidthRatio, bladeHeight } = {
5096
+ const { arrowheadLengthRatio, arrowheadWidthRatio, bladeHeightRatio } = {
5069
5097
  ...DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS,
5070
5098
  ...options
5071
5099
  };
@@ -5085,7 +5113,7 @@ function createFinalProtectiveFire(coordinates, bladedArm, options = {}) {
5085
5113
  const bladeTip = v.tips[bladedArm];
5086
5114
  if (bladeTip) {
5087
5115
  const otherTip = v.tips[bladedArm === 0 ? 1 : 0];
5088
- const blade = bladeRectangle(v.vertex, bladeTip, otherTip, Math.max(0, bladeHeight));
5116
+ const blade = bladeRectangle(v.vertex, bladeTip, otherTip, Math.max(0, bladeHeightRatio));
5089
5117
  if (blade) {
5090
5118
  const ring = [...blade, blade[0]].map((c) => unproject(c[0], c[1]));
5091
5119
  features.push({
@@ -5271,14 +5299,14 @@ const FIX = defineControlMeasure({
5271
5299
  //#region src/generators/cm14-maneuver-lines/flot.ts
5272
5300
  const DEFAULT_RADIUS = 50;
5273
5301
  const DEFAULT_RADIUS_PIXELS = 10;
5274
- const DEFAULT_RESOLUTION = 16;
5302
+ const DEFAULT_ARC_SEGMENTS = 16;
5275
5303
  /**
5276
5304
  * Default options for the FLOT graphic.
5277
5305
  */
5278
5306
  const DEFAULT_FLOT_OPTIONS = {
5279
5307
  radius: DEFAULT_RADIUS,
5280
5308
  radiusPixels: DEFAULT_RADIUS_PIXELS,
5281
- resolution: DEFAULT_RESOLUTION
5309
+ arcSegments: DEFAULT_ARC_SEGMENTS
5282
5310
  };
5283
5311
  const FLOT_METADATA = {
5284
5312
  id: "flot",
@@ -5313,8 +5341,8 @@ const FLOT_METADATA = {
5313
5341
  unit: "m"
5314
5342
  },
5315
5343
  {
5316
- key: "resolution",
5317
- label: "Resolution",
5344
+ key: "arcSegments",
5345
+ label: "Arc segments",
5318
5346
  description: "Number of points used to render each semicircle",
5319
5347
  type: "number",
5320
5348
  min: 4,
@@ -5334,16 +5362,16 @@ const FLOT_METADATA = {
5334
5362
  * @param segmentDir - Direction vector of the segment (normalized)
5335
5363
  * @param perpDir - Perpendicular direction vector (normalized)
5336
5364
  * @param radius - Radius of the semicircle
5337
- * @param resolution - Number of points in the arc
5365
+ * @param arcSegments - Number of points in the arc
5338
5366
  * @param includeStart - Whether to include the start point
5339
5367
  * @returns Array of arc points forming a true semicircle
5340
5368
  */
5341
- function generateArcPoints(startPoint, segmentDir, perpDir, radius, resolution, includeStart) {
5369
+ function generateArcPoints(startPoint, segmentDir, perpDir, radius, arcSegments, includeStart) {
5342
5370
  const points = [];
5343
5371
  const startIndex = includeStart ? 0 : 1;
5344
5372
  const center = vecAdd(startPoint, vecScale(segmentDir, radius));
5345
- for (let i = startIndex; i <= resolution; i++) {
5346
- const t = i / resolution;
5373
+ for (let i = startIndex; i <= arcSegments; i++) {
5374
+ const t = i / arcSegments;
5347
5375
  const angle = Math.PI * (1 - t);
5348
5376
  const alongSegment = Math.cos(angle) * radius;
5349
5377
  const perpOffset = Math.sin(angle) * radius;
@@ -5358,11 +5386,11 @@ function generateArcPoints(startPoint, segmentDir, perpDir, radius, resolution,
5358
5386
  * @param p1 - Start position (projected)
5359
5387
  * @param p2 - End position (projected)
5360
5388
  * @param radius - Radius of each semicircle
5361
- * @param resolution - Points per arc
5389
+ * @param arcSegments - Points per arc
5362
5390
  * @param isFirstSegment - Whether this is the first segment (include start point)
5363
5391
  * @returns Array of points forming the scalloped line for this segment
5364
5392
  */
5365
- function processSegment(p1, p2, radius, resolution, isFirstSegment) {
5393
+ function processSegment(p1, p2, radius, arcSegments, isFirstSegment) {
5366
5394
  const segmentVec = vecSub(p2, p1);
5367
5395
  const segmentLength = vecMag(segmentVec);
5368
5396
  if (segmentLength < 1e-6) return isFirstSegment ? [p1] : [];
@@ -5374,14 +5402,14 @@ function processSegment(p1, p2, radius, resolution, isFirstSegment) {
5374
5402
  const remainingLength = segmentLength - numFullArcs * diameter;
5375
5403
  let currentPos = p1;
5376
5404
  for (let arcIndex = 0; arcIndex < numFullArcs; arcIndex++) {
5377
- const arcPoints = generateArcPoints(currentPos, segmentDir, perpDir, radius, resolution, arcIndex === 0 && isFirstSegment);
5405
+ const arcPoints = generateArcPoints(currentPos, segmentDir, perpDir, radius, arcSegments, arcIndex === 0 && isFirstSegment);
5378
5406
  points.push(...arcPoints);
5379
5407
  currentPos = vecAdd(currentPos, vecScale(segmentDir, diameter));
5380
5408
  }
5381
5409
  if (remainingLength > diameter * .1) {
5382
5410
  const partialRadius = remainingLength / 2;
5383
- const partialResolution = Math.max(3, Math.round(resolution * (partialRadius / radius)));
5384
- const arcPoints = generateArcPoints(currentPos, segmentDir, perpDir, partialRadius, partialResolution, numFullArcs === 0 && isFirstSegment);
5411
+ const partialArcSegments = Math.max(3, Math.round(arcSegments * (partialRadius / radius)));
5412
+ const arcPoints = generateArcPoints(currentPos, segmentDir, perpDir, partialRadius, partialArcSegments, numFullArcs === 0 && isFirstSegment);
5385
5413
  points.push(...arcPoints);
5386
5414
  }
5387
5415
  return points;
@@ -5401,22 +5429,22 @@ function processSegment(p1, p2, radius, resolution, isFirstSegment) {
5401
5429
  * ```typescript
5402
5430
  * const flot = createFLOT(
5403
5431
  * [[-122.4194, 37.7749], [-122.4100, 37.7800], [-122.4000, 37.7750]],
5404
- * { radius: 100, resolution: 20 }
5432
+ * { radius: 100, arcSegments: 20 }
5405
5433
  * );
5406
5434
  * ```
5407
5435
  */
5408
5436
  function createFLOT(positions, options = {}) {
5409
- const { radius = DEFAULT_RADIUS, radiusPixels, metersPerPixel, resolution = DEFAULT_RESOLUTION } = options;
5437
+ const { radius = DEFAULT_RADIUS, radiusPixels, metersPerPixel, arcSegments = DEFAULT_ARC_SEGMENTS } = options;
5410
5438
  let effectiveRadius = radius;
5411
5439
  if (radiusPixels !== void 0 && metersPerPixel !== void 0 && metersPerPixel > 0) effectiveRadius = radiusPixels * metersPerPixel;
5412
5440
  const safeRadius = Math.max(EPSILON, effectiveRadius);
5413
- const safeResolution = Math.max(3, Math.round(resolution));
5441
+ const safeArcSegments = Math.max(3, Math.round(arcSegments));
5414
5442
  const projectedPoints = positions.map((p) => project(p[0], p[1]));
5415
5443
  const allPoints = [];
5416
5444
  for (let i = 0; i < projectedPoints.length - 1; i++) {
5417
5445
  const p1 = projectedPoints[i];
5418
5446
  const p2 = projectedPoints[i + 1];
5419
- const segmentPoints = processSegment(p1, p2, safeRadius, safeResolution, i === 0);
5447
+ const segmentPoints = processSegment(p1, p2, safeRadius, safeArcSegments, i === 0);
5420
5448
  allPoints.push(...segmentPoints);
5421
5449
  }
5422
5450
  if (allPoints.length > 0 && projectedPoints.length > 1) {
@@ -5445,15 +5473,15 @@ const FLOT = defineControlMeasure({
5445
5473
  });
5446
5474
  //#endregion
5447
5475
  //#region src/generators/cm29-protection-lines/fortifiedLine.ts
5448
- const DEFAULT_SIZE = 50;
5449
- const DEFAULT_SIZE_PIXELS = 10;
5476
+ const DEFAULT_TOOTH_SIZE = 50;
5477
+ const DEFAULT_TOOTH_SIZE_PIXELS = 10;
5450
5478
  const DEFAULT_SMOOTH_RESOLUTION$1 = 16;
5451
5479
  /**
5452
5480
  * Default options for the Fortified Line graphic.
5453
5481
  */
5454
5482
  const DEFAULT_FORTIFIED_LINE_OPTIONS = {
5455
- size: DEFAULT_SIZE,
5456
- sizePixels: DEFAULT_SIZE_PIXELS,
5483
+ toothSize: DEFAULT_TOOTH_SIZE,
5484
+ toothSizePixels: DEFAULT_TOOTH_SIZE_PIXELS,
5457
5485
  smooth: false,
5458
5486
  smoothResolution: DEFAULT_SMOOTH_RESOLUTION$1
5459
5487
  };
@@ -5543,9 +5571,9 @@ function processFortifiedSegment(p1, p2, size, isFirstSegment) {
5543
5571
  * Calculates the effective size based on options and projection.
5544
5572
  */
5545
5573
  function calculateEffectiveSize(options) {
5546
- const { size = DEFAULT_SIZE, sizePixels, metersPerPixel } = options;
5547
- let effectiveSize = size;
5548
- if (sizePixels !== void 0 && metersPerPixel !== void 0 && metersPerPixel > 0) effectiveSize = sizePixels * metersPerPixel;
5574
+ const { toothSize = DEFAULT_TOOTH_SIZE, toothSizePixels, metersPerPixel } = options;
5575
+ let effectiveSize = toothSize;
5576
+ if (toothSizePixels !== void 0 && metersPerPixel !== void 0 && metersPerPixel > 0) effectiveSize = toothSizePixels * metersPerPixel;
5549
5577
  return Math.max(EPSILON, effectiveSize);
5550
5578
  }
5551
5579
  /**
@@ -5797,8 +5825,8 @@ const ISOLATE = defineControlMeasure({
5797
5825
  //#region src/generators/cm15-maneuver-areas/mainAttack.ts
5798
5826
  const DEFAULT_MAIN_ATTACK_OPTIONS = {
5799
5827
  shaftWidthRatio: DEFAULT_SHAFT_WIDTH_RATIO,
5800
- roundedBends: false,
5801
- bendSegments: 5
5828
+ smooth: false,
5829
+ smoothResolution: 5
5802
5830
  };
5803
5831
  const MAIN_ATTACK_METADATA = {
5804
5832
  id: "main-attack",
@@ -6703,8 +6731,8 @@ const STRONG_POINT = defineControlMeasure({
6703
6731
  //#region src/generators/cm15-maneuver-areas/supportByFire.ts
6704
6732
  const DEFAULT_SUPPORT_BY_FIRE_OPTIONS = {
6705
6733
  arrowheadWidthRatio: .3,
6706
- backLineLengthRatio: .3,
6707
- backLineAngle: 45
6734
+ rearLineLengthRatio: .3,
6735
+ rearLineAngle: 45
6708
6736
  };
6709
6737
  const SUPPORT_BY_FIRE_METADATA = {
6710
6738
  id: "support-by-fire",
@@ -6731,8 +6759,8 @@ const SUPPORT_BY_FIRE_METADATA = {
6731
6759
  function createSupportByFire(coordinates, options = {}) {
6732
6760
  const featureProps = {};
6733
6761
  const arrowheadWidthRatio = options.arrowheadWidthRatio ?? DEFAULT_SUPPORT_BY_FIRE_OPTIONS.arrowheadWidthRatio;
6734
- const backLineLengthRatio = options.backLineLengthRatio ?? DEFAULT_SUPPORT_BY_FIRE_OPTIONS.backLineLengthRatio;
6735
- const backLineAngle = options.backLineAngle ?? DEFAULT_SUPPORT_BY_FIRE_OPTIONS.backLineAngle;
6762
+ const rearLineLengthRatio = options.rearLineLengthRatio ?? DEFAULT_SUPPORT_BY_FIRE_OPTIONS.rearLineLengthRatio;
6763
+ const rearLineAngle = options.rearLineAngle ?? DEFAULT_SUPPORT_BY_FIRE_OPTIONS.rearLineAngle;
6736
6764
  const c1 = coordinates[0];
6737
6765
  const c2 = coordinates[1];
6738
6766
  const c3 = coordinates[2];
@@ -6748,13 +6776,13 @@ function createSupportByFire(coordinates, options = {}) {
6748
6776
  type: "FeatureCollection",
6749
6777
  features: []
6750
6778
  };
6751
- const angleRad = backLineAngle * Math.PI / 180;
6779
+ const angleRad = rearLineAngle * Math.PI / 180;
6752
6780
  const baseAngle = -Math.PI / 2;
6753
6781
  const angleLeft = baseAngle - angleRad;
6754
6782
  const dirBackLeft = [dirBase[0] * Math.cos(angleLeft) - dirBase[1] * Math.sin(angleLeft), dirBase[0] * Math.sin(angleLeft) + dirBase[1] * Math.cos(angleLeft)];
6755
6783
  const angleRight = baseAngle + angleRad;
6756
6784
  const dirBackRight = [dirBase[0] * Math.cos(angleRight) - dirBase[1] * Math.sin(angleRight), dirBase[0] * Math.sin(angleRight) + dirBase[1] * Math.cos(angleRight)];
6757
- const backLen = lenBase * backLineLengthRatio;
6785
+ const backLen = lenBase * rearLineLengthRatio;
6758
6786
  const p1Back = vecAdd(p1, vecScale(dirBackLeft, backLen));
6759
6787
  const p2Back = vecAdd(p2, vecScale(dirBackRight, backLen));
6760
6788
  const vLeft = vecSub(p3, p1);
@@ -6849,8 +6877,8 @@ const SUPPORT_BY_FIRE = defineControlMeasure({
6849
6877
  //#region src/generators/cm15-maneuver-areas/supportingAttack.ts
6850
6878
  const DEFAULT_SUPPORTING_ATTACK_OPTIONS = {
6851
6879
  shaftWidthRatio: DEFAULT_SHAFT_WIDTH_RATIO,
6852
- roundedBends: false,
6853
- bendSegments: 5
6880
+ smooth: false,
6881
+ smoothResolution: 5
6854
6882
  };
6855
6883
  const SUPPORTING_ATTACK_METADATA = {
6856
6884
  id: "supporting-attack",
@@ -7293,4 +7321,4 @@ function assertNever(value) {
7293
7321
  throw new Error(`Unhandled control measure kind: ${String(value)}`);
7294
7322
  }
7295
7323
  //#endregion
7296
- export { point12DrawRule as $, DEFAULT_GENERIC_POLYGON_OPTIONS as A, DEFAULT_ANTITANK_WALL_OPTIONS as B, DEFAULT_FIX_OPTIONS as C, DEFAULT_DELAY_OPTIONS as D, DEFAULT_DISRUPT_OPTIONS as E, DEFAULT_BREACH_OPTIONS as F, axis1DrawRule as G, DEFAULT_AMBUSH_OPTIONS as H, DEFAULT_BLOCK_MISSION_TASK_OPTIONS as I, line23DrawRule as J, supportByFireDrawRule as K, DEFAULT_BLOCK_OPTIONS as L, DEFAULT_GENERIC_CIRCLE_OPTIONS as M, DEFAULT_CANALIZE_OPTIONS as N, DEFAULT_CLEAR_OPTIONS as O, DEFAULT_BYPASS_OPTIONS as P, attackByFireDrawRule as Q, DEFAULT_ATTACK_HELICOPTER_OPTIONS as R, DEFAULT_FLOT_OPTIONS as S, DEFAULT_ENCIRCLEMENT_OPTIONS as T, DEFAULT_AIRBORNE_ATTACK_OPTIONS as U, DEFAULT_ANTITANK_DITCH_OPTIONS as V, rectangleDrawRule as W, line1DrawRule as X, turnDrawRule as Y, ambushDrawRule as Z, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS as _, DEFINITIONS as a, getMidpointPerpendicularSignedDistance as at, DEFAULT_FORTIFIED_AREA_OPTIONS as b, getDefaultOptions as c, createBaselineFrame as ct, DEFAULT_SUPPORTING_ATTACK_OPTIONS as d, project as dt, centerRadiusDrawRule as et, DEFAULT_SUPPORT_BY_FIRE_OPTIONS as f, unproject as ft, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS as g, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS as h, roundToFixed as ht, CONTROL_MEASURE_METADATA as i, createMidpointPerpendicularDrawRule as it, DEFAULT_GENERIC_LINE_OPTIONS as j, DEFAULT_GENERIC_RECTANGLE_OPTIONS as k, listControlMeasureMetadata as l, calculateMetrics as lt, DEFAULT_TACTICAL_ARROW_OPTIONS as m, getMetersPerPixel as mt, resolveStyleHints as n, blockDrawRule as nt, getControlMeasureMetadata as o, pointOnMidpointPerpendicularAxis as ot, DEFAULT_STRONG_POINT_OPTIONS as p, EPSILON as pt, line24DrawRule as q, CONTROL_MEASURE_IDS as r, computeDefaultMidpointPerpendicularPoint as rt, getControlMeasureMetadataByValue as s, snapToMidpointPerpendicular as st, renderControlMeasure as t, disruptDrawRule as tt, DEFAULT_TURN_OPTIONS as u, computeInitialWidthPoint as ut, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS as v, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS as w, DEFAULT_FORTIFIED_LINE_OPTIONS as x, DEFAULT_MAIN_ATTACK_OPTIONS as y, DEFAULT_ATTACK_BY_FIRE_OPTIONS as z };
7324
+ export { turnDrawRule as $, DEFAULT_GENERIC_POLYGON_OPTIONS as A, DEFAULT_BLOCK_OPTIONS as B, DEFAULT_FIX_OPTIONS as C, DEFAULT_DELAY_OPTIONS as D, DEFAULT_DISRUPT_OPTIONS as E, DEFAULT_BYPASS_OPTIONS as F, DEFAULT_ANTITANK_DITCH_OPTIONS as G, DEFAULT_ATTACK_HELICOPTER_OPTIONS as H, DEFAULT_BREACH_OPTIONS as I, rectangleDrawRule as J, DEFAULT_AMBUSH_OPTIONS as K, DEFAULT_BLOCK_MISSION_TASK_OPTIONS as L, DEFAULT_GENERIC_CIRCLE_OPTIONS as M, DEFAULT_CLASSIC_ARROW_OPTIONS as N, DEFAULT_CLEAR_OPTIONS as O, DEFAULT_CANALIZE_OPTIONS as P, line23DrawRule as Q, DEFAULT_BOUNDARY_OPTIONS as R, DEFAULT_FLOT_OPTIONS as S, DEFAULT_ENCIRCLEMENT_OPTIONS as T, DEFAULT_ATTACK_BY_FIRE_OPTIONS as U, DEFAULT_BATTLE_POSITION_OPTIONS as V, DEFAULT_ANTITANK_WALL_OPTIONS as W, supportByFireDrawRule as X, axis1DrawRule as Y, line24DrawRule as Z, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS as _, EPSILON as _t, DEFINITIONS as a, disruptDrawRule as at, DEFAULT_FORTIFIED_AREA_OPTIONS as b, getDefaultOptions as c, createMidpointPerpendicularDrawRule as ct, DEFAULT_SUPPORTING_ATTACK_OPTIONS as d, snapToMidpointPerpendicular as dt, line1DrawRule as et, DEFAULT_SUPPORT_BY_FIRE_OPTIONS as f, createBaselineFrame as ft, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS as g, unproject as gt, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS as h, project as ht, CONTROL_MEASURE_METADATA as i, centerRadiusDrawRule as it, DEFAULT_GENERIC_LINE_OPTIONS as j, DEFAULT_GENERIC_RECTANGLE_OPTIONS as k, listControlMeasureMetadata as l, getMidpointPerpendicularSignedDistance as lt, DEFAULT_TACTICAL_ARROW_OPTIONS as m, computeInitialWidthPoint as mt, resolveStyleHints as n, attackByFireDrawRule as nt, getControlMeasureMetadata as o, blockDrawRule as ot, DEFAULT_STRONG_POINT_OPTIONS as p, calculateMetrics as pt, DEFAULT_AIRBORNE_ATTACK_OPTIONS as q, CONTROL_MEASURE_IDS as r, point12DrawRule as rt, getControlMeasureMetadataByValue as s, computeDefaultMidpointPerpendicularPoint as st, renderControlMeasure as t, ambushDrawRule as tt, DEFAULT_TURN_OPTIONS as u, pointOnMidpointPerpendicularAxis as ut, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS as v, getMetersPerPixel as vt, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS as w, DEFAULT_FORTIFIED_LINE_OPTIONS as x, DEFAULT_MAIN_ATTACK_OPTIONS as y, roundToFixed as yt, DEFAULT_BLOCK_ARROW_OPTIONS as z };
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Battle Position"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M19.57 33.43 L34.59 33.43" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M61.41 33.43 L76.43 33.43 L76.43 5.00 L19.57 5.00 L19.57 33.43" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M40.34 23.85 L40.34 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M55.66 23.85 L55.66 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Battle Position"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M21.43 34.89 L23.39 35.66 L25.90 36.34 L28.87 36.91 L32.23 37.38 L35.90 37.74 L39.25 37.96" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M52.61 38.14 L56.20 38.00 L60.10 37.74 L63.77 37.38 L67.13 36.91 L70.10 36.34 L72.61 35.66 L74.57 34.89 L76.12 33.91 L77.47 32.66 L78.61 31.17 L79.55 29.49 L80.27 27.66 L80.79 25.70 L81.10 23.67 L81.21 21.60 L81.10 19.54 L80.79 17.51 L80.27 15.55 L79.54 13.72 L78.61 12.03 L77.47 10.55 L76.12 9.30 L74.57 8.32 L72.61 7.55 L70.10 6.87 L67.13 6.30 L63.77 5.83 L60.10 5.47 L56.20 5.21 L52.14 5.05 L48.00 5.00 L43.86 5.05 L39.80 5.21 L35.90 5.47 L32.23 5.83 L28.87 6.30 L25.90 6.87 L23.39 7.55 L21.43 8.32 L19.88 9.30 L18.53 10.55 L17.39 12.03 L16.46 13.72 L15.73 15.55 L15.21 17.51 L14.90 19.54 L14.79 21.60 L14.90 23.67 L15.21 25.70 L15.73 27.66 L16.46 29.49 L17.39 31.17 L18.53 32.66 L19.88 33.91 L21.43 34.89" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M42.17 33.36 L42.05 42.90" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M49.81 33.46 L49.69 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Circle"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M67.00 24.00 L66.91 22.14 L66.63 20.30 L66.18 18.49 L65.56 16.73 L64.76 15.04 L63.80 13.45 L62.69 11.94 L61.43 10.57 L60.06 9.31 L58.55 8.20 L56.96 7.24 L55.27 6.44 L53.51 5.82 L51.70 5.37 L49.86 5.09 L48.00 5.00 L46.14 5.09 L44.30 5.37 L42.49 5.82 L40.73 6.44 L39.04 7.24 L37.45 8.20 L35.94 9.31 L34.57 10.57 L33.31 11.94 L32.20 13.45 L31.24 15.04 L30.44 16.73 L29.82 18.49 L29.37 20.30 L29.09 22.14 L29.00 24.00 L29.09 25.86 L29.37 27.71 L29.82 29.51 L30.44 31.27 L31.24 32.96 L32.20 34.55 L33.31 36.06 L34.57 37.43 L35.94 38.69 L37.45 39.80 L39.04 40.76 L40.73 41.56 L42.49 42.18 L44.30 42.63 L46.14 42.91 L48.00 43.00 L49.86 42.91 L51.70 42.63 L53.51 42.18 L55.27 41.56 L56.96 40.76 L58.55 39.80 L60.06 38.69 L61.43 37.43 L62.69 36.06 L63.80 34.55 L64.76 32.96 L65.56 31.27 L66.18 29.51 L66.63 27.71 L66.91 25.86 L67.00 24.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Encirclement"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M30.33 32.84 L30.69 33.55 L31.12 34.20 L31.61 34.79 L32.15 35.33 L32.74 35.83 L33.37 36.27 L34.04 36.67 L34.75 37.03 L35.48 37.36 L36.23 37.66 L37.00 37.93 L37.78 38.18 L38.57 38.41 L39.37 38.62 L40.15 38.83 L40.93 39.02 L41.72 39.20 L42.55 39.36 L43.41 39.49 L44.30 39.60 L45.21 39.68 L46.13 39.74 L47.06 39.78 L48.00 39.79 L48.94 39.78 L49.87 39.74 L50.79 39.68 L51.70 39.60 L52.59 39.49 L53.45 39.36 L54.28 39.20 L55.07 39.02 L55.85 38.83 L56.63 38.62 L57.43 38.41 L58.22 38.18 L59.00 37.93 L59.77 37.66 L60.52 37.36 L61.25 37.03 L61.96 36.67 L62.63 36.27 L63.26 35.83 L63.85 35.33 L64.39 34.79 L64.88 34.20 L65.31 33.55 L65.67 32.84 L65.98 32.03 L66.25 31.10 L66.48 30.07 L66.66 28.95 L66.81 27.77 L66.92 26.54 L66.98 25.28 L67.00 24.00 L66.98 22.72 L66.92 21.46 L66.81 20.23 L66.66 19.05 L66.48 17.93 L66.25 16.90 L65.98 15.97 L65.67 15.16 L65.31 14.45 L64.88 13.80 L64.39 13.21 L63.85 12.67 L63.26 12.17 L62.63 11.73 L61.96 11.33 L61.25 10.97 L60.52 10.64 L59.77 10.34 L59.00 10.07 L58.22 9.82 L57.43 9.59 L56.63 9.38 L55.85 9.17 L55.07 8.98 L54.28 8.80 L53.45 8.64 L52.59 8.51 L51.70 8.40 L50.79 8.32 L49.87 8.26 L48.94 8.22 L48.00 8.21 L47.06 8.22 L46.13 8.26 L45.21 8.32 L44.30 8.40 L43.41 8.51 L42.55 8.64 L41.72 8.80 L40.93 8.98 L40.15 9.17 L39.37 9.38 L38.57 9.59 L37.78 9.82 L37.00 10.07 L36.23 10.34 L35.48 10.64 L34.75 10.97 L34.04 11.33 L33.37 11.73 L32.74 12.17 L32.15 12.67 L31.61 13.21 L31.12 13.80 L30.69 14.45 L30.33 15.16 L30.02 15.97 L29.75 16.90 L29.52 17.93 L29.34 19.05 L29.19 20.23 L29.08 21.46 L29.02 22.72 L29.00 24.00 L29.02 25.28 L29.08 26.54 L29.19 27.77 L29.34 28.95 L29.52 30.07 L29.75 31.10 L30.02 32.03 L30.33 32.84 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><path d="M29.81 31.29 L27.43 34.32 L31.15 34.24" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M34.18 36.74 L34.45 40.46 L37.18 37.98" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M40.99 39.03 L42.09 42.58 L44.20 39.59" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M48.15 39.79 L49.90 43.00 L51.40 39.63" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M55.29 38.96 L57.72 41.70 L58.43 38.11" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M62.08 36.60 L65.51 38.19 L64.59 34.55" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M66.27 31.01 L69.80 29.95 L66.81 27.80" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M66.99 23.85 L70.20 22.07 L66.84 20.60" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M66.19 16.71 L68.57 13.68 L64.85 13.76" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M61.82 11.26 L61.55 7.54 L58.82 10.02" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M55.01 8.97 L53.91 5.42 L51.80 8.41" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M47.85 8.21 L46.10 5.00 L44.60 8.37" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M40.71 9.04 L38.28 6.30 L37.57 9.89" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M33.92 11.40 L30.49 9.81 L31.41 13.45" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M29.73 16.99 L26.20 18.05 L29.19 20.20" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M29.01 24.15 L25.80 25.93 L29.16 27.40" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
package/media/line.svg ADDED
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Line"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.78 43.00 L48.00 5.00 L90.22 34.56" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Polygon"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M23.93 43.00 L67.00 40.47 L72.07 12.60 L36.60 5.00 L23.93 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Rectangle"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M16.91 43.00 L79.09 43.00 L79.09 5.00 L16.91 5.00 L16.91 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Strong Point"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M28.58 33.73 L30.01 34.29 L31.84 34.78 L34.00 35.20 L36.45 35.54 L39.13 35.81 L41.58 35.97" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M51.31 36.10 L53.93 36.00 L56.78 35.81 L59.45 35.54 L61.90 35.20 L64.07 34.78 L65.89 34.29 L67.32 33.73 L68.45 33.01 L69.44 32.10 L70.27 31.02 L70.95 29.79 L71.48 28.45 L71.86 27.03 L72.08 25.55 L72.16 24.04 L72.08 22.54 L71.86 21.06 L71.48 19.63 L70.95 18.29 L70.27 17.07 L69.44 15.99 L68.45 15.07 L67.32 14.36 L65.89 13.79 L64.07 13.30 L61.90 12.88 L59.45 12.54 L56.78 12.28 L53.93 12.09 L50.97 11.98 L47.95 11.94 L44.93 11.98 L41.97 12.09 L39.13 12.28 L36.45 12.54 L34.00 12.88 L31.84 13.30 L30.01 13.79 L28.58 14.36 L27.45 15.07 L26.46 15.99 L25.63 17.07 L24.95 18.29 L24.42 19.63 L24.04 21.06 L23.82 22.54 L23.74 24.04 L23.82 25.55 L24.04 27.03 L24.42 28.45 L24.95 29.79 L25.63 31.02 L26.46 32.10 L27.45 33.01 L28.58 33.73" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M31.89 34.80 L30.57 41.63" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M38.78 35.77 L38.09 42.70" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M52.68 36.04 L52.95 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M59.62 35.52 L60.58 42.41" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M66.41 34.09 L68.98 40.56" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M71.15 29.30 L77.62 31.86" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M72.08 22.47 L78.96 21.42" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M69.53 16.11 L75.05 11.86" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M63.38 13.17 L64.70 6.33" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M56.49 12.26 L56.95 5.31" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M49.54 11.96 L49.62 5.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M42.58 12.07 L42.31 5.11" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M35.65 12.65 L34.69 5.76" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M28.89 14.23 L26.32 7.77" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M24.52 19.39 L18.05 16.83" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M23.92 26.25 L17.04 27.30" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M26.82 32.43 L22.09 37.53" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M43.70 32.61 L43.62 39.57" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M49.27 32.68 L49.18 39.64" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orbat-mapper/control-measures",
3
- "version": "0.2.0-alpha.6",
3
+ "version": "0.2.0-alpha.8",
4
4
  "description": "Library for drawing tactical graphics and control measures according to MIL-STD-2525 and APP-6 standards.",
5
5
  "license": "MIT",
6
6
  "author": "Orbat Mapper",