@orbat-mapper/control-measures 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,6 +14,12 @@ interface ControlMeasureDrawRule {
14
14
  readonly id: string;
15
15
  readonly minimumUserPoints: number;
16
16
  readonly canonicalPointCount?: number;
17
+ /**
18
+ * Canonical control-point slots that are derived geometry rather than user
19
+ * controls. Edit hosts omit vertex handles for these indices while retaining
20
+ * the points in the generator input.
21
+ */
22
+ readonly hiddenControlPointIndices?: readonly number[];
17
23
  /**
18
24
  * Number of raw (clicked + rubber-band) points at which `derive` can already
19
25
  * produce a renderable canonical shape, so the draw controller renders a live
@@ -219,7 +225,7 @@ declare function normalizeTextAmplifiers(input: TextAmplifiers | undefined): Can
219
225
  //#region src/metadata.d.ts
220
226
  type ControlMeasureGeometryType = Geometry["type"];
221
227
  type ControlMeasureGeometry = "point" | "line" | "area";
222
- declare const DRAW_RULE_IDS: readonly ["Area1", "Area5", "Area6", "Area7", "Area8", "Area11", "Area12", "Area15", "Area17", "Area21", "Area27", "Axis1", "Line1", "Line3", "Line9", "Line10", "Line11", "Line23", "Line24", "Line26", "Line27", "Line29", "Point1", "Point2", "Point12", "Point18", "Rectangle", "Sector"];
228
+ declare const DRAW_RULE_IDS: readonly ["Area1", "Area5", "Area6", "Area7", "Area8", "Area11", "Area12", "Area15", "Area17", "Area21", "Area27", "Axis1", "Line1", "Line3", "Line9", "Line10", "Line11", "Line23", "Line24", "Line26", "Line27", "Line29", "Line31", "Line32", "Point1", "Point2", "Point12", "Point18", "Rectangle", "Sector"];
223
229
  type DrawRuleId = (typeof DRAW_RULE_IDS)[number];
224
230
  declare const PARAMETER_PRESENTATION_TIERS: readonly ["primary", "standard", "advanced"];
225
231
  type ParameterPresentationTier = (typeof PARAMETER_PRESENTATION_TIERS)[number];
@@ -2480,6 +2486,34 @@ declare const DEFAULT_DISRUPT_MISSION_TASK_OPTIONS: Required<Omit<DisruptMission
2480
2486
  /** Generates the DISRUPT mission task symbol (341000). */
2481
2487
  declare function createDisruptMissionTaskSymbol(coordinates: Position[], options?: DisruptMissionTaskOptions): FeatureCollection<MultiLineString | Point>;
2482
2488
  //#endregion
2489
+ //#region src/generators/cm34-mission-tasks/envelopment.d.ts
2490
+ interface EnvelopmentOptions extends LabelSizeOptions, ArcResolutionOptions {
2491
+ /** Arrowhead depth as a ratio of the arc diameter. */
2492
+ arrowheadLengthRatio?: number;
2493
+ /** Arrowhead base width as a ratio of the arc diameter. */
2494
+ arrowheadWidthRatio?: number;
2495
+ /** Position of the E label along the straight portion, from PT. 1 to PT. 2. */
2496
+ labelPosition?: number;
2497
+ /** Gap around the E label as a ratio of the straight portion. */
2498
+ labelGapRatio?: number;
2499
+ }
2500
+ /** Generates the Envelopment mission task symbol (343500). */
2501
+ declare function createEnvelopment(coordinates: Position[], options?: EnvelopmentOptions): FeatureCollection<MultiLineString | Point>;
2502
+ //#endregion
2503
+ //#region src/generators/cm34-mission-tasks/infiltration.d.ts
2504
+ interface InfiltrationOptions extends LabelSizeOptions, ArcResolutionOptions {
2505
+ /** Arrowhead depth as a ratio of the Point 1–Point 3 span. */
2506
+ arrowheadLengthRatio?: number;
2507
+ /** Arrowhead base width as a ratio of the Point 1–Point 3 span. */
2508
+ arrowheadWidthRatio?: number;
2509
+ /** Position of the IN label along the initial straight portion. */
2510
+ labelPosition?: number;
2511
+ /** Gap around the IN label as a ratio of the initial straight portion. */
2512
+ labelGapRatio?: number;
2513
+ }
2514
+ /** Generates the Infiltration mission task symbol (343800). */
2515
+ declare function createInfiltration(coordinates: Position[], options?: InfiltrationOptions): FeatureCollection<MultiLineString | Point>;
2516
+ //#endregion
2483
2517
  //#region src/generators/cm34-mission-tasks/guard.d.ts
2484
2518
  type GuardOptions = SecurityTaskOptions;
2485
2519
  declare const DEFAULT_GUARD_OPTIONS: Required<Omit<SecurityTaskOptions, "labelSize" | "labelSizePixels">>;
@@ -3021,6 +3055,8 @@ declare const DEFINITIONS: {
3021
3055
  delay: ControlMeasureDefinition<"delay", typeof createDelaySymbol>;
3022
3056
  disengage: ControlMeasureDefinition<"disengage", typeof createDisengageSymbol>;
3023
3057
  "disrupt-mission-task": ControlMeasureDefinition<"disrupt-mission-task", typeof createDisruptMissionTaskSymbol>;
3058
+ envelopment: ControlMeasureDefinition<"envelopment", typeof createEnvelopment>;
3059
+ infiltration: ControlMeasureDefinition<"infiltration", typeof createInfiltration>;
3024
3060
  guard: ControlMeasureDefinition<"guard", typeof createGuardSymbol>;
3025
3061
  isolate: ControlMeasureDefinition<"isolate", typeof createIsolateSymbol>;
3026
3062
  penetrate: ControlMeasureDefinition<"penetrate", typeof createPenetrateSymbol>;
package/dist/index.d.mts CHANGED
@@ -1,3 +1,3 @@
1
- import { $ as ControlMeasureKind, $i as TextAmplifierDescriptor, $n as DEFAULT_AIRBORNE_ATTACK_OPTIONS, $r as DEFAULT_SECONDARY_DIRECTION_OF_FIRE_OPTIONS, $t as DEFAULT_DISENGAGE_OPTIONS, A as BaselineFrame, Ai as BoundaryOptions, An as BattleHandoverLineOptions, Ar as DEFAULT_PICKUP_ZONE_OPTIONS, At as FortifiedLineOptions, B as toSimpleStyle, Bi as DEFAULT_STROKE_WIDTH_CSS_PIXELS, Bn as DEFAULT_FORWARD_EDGE_OF_BATTLE_AREA_OPTIONS, Br as MobileDefenseOptions, Bt as SeizeOptions, C as area27DrawRule, Ci as LightLineOptions, Cn as ProbableLineOfDeploymentOptions, Cr as SupportingAttackOptions, Ct as DEFAULT_TURNING_MOVEMENT_OPTIONS, D as getMidpointPerpendicularSignedDistance, Di as project, Dn as LineOfDepartureOptions, Dr as computeInitialWidthPoint, Dt as DEFAULT_FORTIFIED_AREA_OPTIONS, E as createMidpointPerpendicularDrawRule, Ei as haversineDistance, En as DEFAULT_LINE_OF_DEPARTURE_OPTIONS, Er as calculateMetrics, Et as FrontalAttackOptions, F as EPSILON, Fi as DEFAULT_LABEL_SIZE_CLAMP_CSS_PIXELS, Fn as ReleaseLineOptions, Fr as DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, Ft as DEFAULT_WITHDRAW_UNDER_PRESSURE_OPTIONS, G as RenderOptions, Gi as ControlMeasureGeometry, Gn as FLOTOptions, Gr as DEFAULT_ENCIRCLEMENT_OPTIONS, Gt as DEFAULT_REARWARD_PASSAGE_OF_LINES_OPTIONS, H as applyBoxTransformOptions, Hi as MeasureTextRequest, Hn as DEFAULT_PHASE_LINE_OPTIONS, Hr as EngagementAreaOptions, Ht as ScreenOptions, I as getMetersPerPixel, Ii as DEFAULT_LINE_CAP, In as DEFAULT_HOLDING_LINE_OPTIONS, Ir as JointTacticalActionAreaOptions, It as WithdrawUnderPressureOptions, J as cloneControlMeasure, Ji as ControlMeasurePaintCapability, Jn as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, Jr as FinalProtectiveFireOptions, Jt as PenetrateOptions, K as renderControlMeasure, Ki as ControlMeasureGeometryType, Kn as AttackByFireOptions, Kr as EncirclementOptions, Kt as RearwardPassageOfLinesOptions, L as roundToFixed, Li as DEFAULT_LINE_JOIN, Ln as HoldingLineOptions, Lr as AssemblyAreaOptions, Lt as DEFAULT_WITHDRAW_OPTIONS, M as BaselineFrameOptions, Mi as BoxTransformDelta, Mn as DEFAULT_HANDOVER_LINE_OPTIONS, Mr as MineType, Mt as DEFAULT_ANTITANK_WALL_OPTIONS, N as BaselineFrameOrigin, Ni as ControlMeasureRenderContext, Nn as HandoverLineOptions, Nr as DEFAULT_LANDING_ZONE_OPTIONS, Nt as AntitankDitchOptions, O as pointOnMidpointPerpendicularAxis, Oi as sphericalBearing, On as DEFAULT_LIMIT_OF_ADVANCE_OPTIONS, Or as AreaOfOperationsOptions, Ot as FortifiedAreaOptions, P as createBaselineFrame, Pi as DEFAULT_LABEL_HEIGHT_CSS_PIXELS, Pn as DEFAULT_RELEASE_LINE_OPTIONS, Pr as LandingZoneOptions, Pt as DEFAULT_ANTITANK_DITCH_OPTIONS, Q as ControlMeasureId, Qi as ParameterSemanticRole, Qn as AirborneAttackOptions, Qr as controlMeasureIdFromFeature, Qt as DisruptMissionTaskOptions, R as SimpleStyleProps, Ri as DEFAULT_PORTRAYAL, Rn as BridgeheadLineOptions, Rr as DEFAULT_ASSEMBLY_AREA_OPTIONS, Rt as WithdrawOptions, S as containDrawRule, Si as DEFAULT_LIGHT_LINE_OPTIONS, Sn as PROBABLE_LINE_OF_DEPLOYMENT_DASH, Sr as DEFAULT_SUPPORTING_ATTACK_OPTIONS, St as DEFAULT_BLOCK_OPTIONS, T as computeDefaultMidpointPerpendicularPoint, Ti as Point2D, Tn as LineOfDepartureContactOptions, Tr as MainAttackOptions, Tt as DEFAULT_FRONTAL_ATTACK_OPTIONS, U as foldsBoxTransformOptions, Ui as MeasuredText, Un as PhaseLineOptions, Ur as AreaDefenseOptions, Ut as DEFAULT_RETIRE_OPTIONS, V as resolveStyleHints, Vi as LogicalTextStyle, Vn as ForwardEdgeOfBattleAreaOptions, Vr as DEFAULT_ENGAGEMENT_AREA_OPTIONS, Vt as DEFAULT_SCREEN_OPTIONS, W as freezeOrientationOptions, Wi as ControlMeasureFillCapability, Wn as DEFAULT_FLOT_OPTIONS, Wr as DEFAULT_AREA_DEFENSE_OPTIONS, Wt as RetireOptions, X as CONTROL_MEASURE_IDS, Xi as ParamDescriptor, Xn as AttackHelicopterOptions, Xr as FeaturePartProps, Xt as GuardOptions, Y as isKind, Yi as PARAMETER_PRESENTATION_TIERS, Yn as SupportByFireOptions, Yr as ControlMeasureRender, Yt as DEFAULT_GUARD_OPTIONS, Z as CONTROL_MEASURE_METADATA, Zi as ParameterPresentationTier, Zn as DEFAULT_ATTACK_HELICOPTER_OPTIONS, Zr as StyleHints, Zt as DEFAULT_DISRUPT_MISSION_TASK_OPTIONS, _ as point12DrawRule, _i as DEFAULT_BATTLE_POSITION_OPTIONS, _n as BreachOptions, _r as BlockArrowOptions, _t as DEFAULT_FIX_OPTIONS, a as axis1DrawRule, aa as CanonicalTextAmplifiers, ai as DirectionOfSupportingAttackOptions, an as DEFAULT_TACTICAL_ARROW_OPTIONS, ar as GenericTextOptions, at as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, b as disruptDrawRule, bi as DEFAULT_ENGINEER_WORK_LINE_OPTIONS, bn as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, br as ClassicArrowOptions, bt as DisruptOptions, c as line26DrawRule, ca as TEXT_AMPLIFIER_FIELDS, ci as DEFAULT_DIRECTION_OF_ATTACK_AVIATION_OPTIONS, cn as DEFAULT_COUNTERATTACK_BY_FIRE_OPTIONS, cr as DEFAULT_GENERIC_CIRCLE_OPTIONS, ct as ObstacleBypassDifficultOptions, d as turnDrawRule, da as TextAmplifiers, di as RetainOptions, dn as ClearOptions, dr as GenericRectangleOptions, dt as DEFAULT_MINEFIELD_OPTIONS, ea as parameterPresentationTierRank, ei as SECONDARY_DIRECTION_OF_FIRE_DASH, en as DisengageOptions, er as DEFAULT_RADAR_SEARCH_DOCTRINE_OPTIONS, et as OptionsByKind, f as line1DrawRule, fa as canonicalTextAmplifierKey, fi as DEFAULT_STRONG_POINT_OPTIONS, fn as DEFAULT_CLEAR_OPTIONS, fr as DEFAULT_GENERIC_POLYGON_OPTIONS, ft as MinefieldOptions, g as staticPointDrawRule, ga as ControlMeasureDrawRule, gi as BattlePositionOptions, gn as DEFAULT_BYPASS_OPTIONS, gr as BlockArrowHeadStyle, gt as FixMissionTaskOptions, h as dynamicPointDrawRule, ha as AnchorTransformEvent, hi as DEFAULT_CONTAIN_OPTIONS, hn as BypassOptions, hr as GenericLineOptions, ht as DEFAULT_FIX_MISSION_TASK_OPTIONS, i as rectangleDrawRule, ia as AmplifierPlacements, ii as DEFAULT_DIRECTION_OF_SUPPORTING_ATTACK_OPTIONS, in as DEFAULT_COVER_OPTIONS, ir as DEFAULT_GENERIC_TEXT_OPTIONS, it as listControlMeasureMetadata, j as BaselineFrameNormal, ji as DEFAULT_BOUNDARY_OPTIONS, jn as DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, jr as PickupZoneOptions, jt as AntitankWallOptions, k as snapToMidpointPerpendicular, ki as unproject, kn as LimitOfAdvanceOptions, kr as DEFAULT_AREA_OF_OPERATIONS_OPTIONS, kt as DEFAULT_FORTIFIED_LINE_OPTIONS, l as line24DrawRule, la as TextAmplifierField, li as DirectionOfAttackAviationOptions, ln as CounterattackOptions, lr as GenericCircleOptions, lt as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, m as attackByFireDrawRule, ma as resolveAmplifierPlacement, mi as ContainOptions, mn as DEFAULT_CANALIZE_OPTIONS, mr as DEFAULT_GENERIC_LINE_OPTIONS, mt as TurnOptions, n as DEFAULT_AMBUSH_OPTIONS, na as resolveParameterSemanticRole, ni as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, nn as DelayOptions, nr as RADAR_SEARCH_DOCTRINE_STROKE_COLOR, nt as getControlMeasureMetadataByValue, o as supportByFireDrawRule, oa as GeneratedLabelKey, oi as DEFAULT_DIRECTION_OF_MAIN_ATTACK_OPTIONS, on as TacticalArrowOptions, or as DEFAULT_GENERIC_SECTOR_OPTIONS, ot as ObstacleBypassImpossibleOptions, p as ambushDrawRule, pa as normalizeTextAmplifiers, pi as StrongPointOptions, pn as CanalizeOptions, pr as GenericPolygonOptions, pt as DEFAULT_TURN_OPTIONS, q as ControlMeasure, qi as ControlMeasureMetadata, qn as DEFAULT_ATTACK_BY_FIRE_OPTIONS, qr as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, qt as DEFAULT_PENETRATE_OPTIONS, r as sectorDrawRule, ra as AmplifierPlacement, ri as PrincipalDirectionOfFireOptions, rn as CoverOptions, rr as RadarSearchDoctrineOptions, rt as getDefaultOptions, s as line27DrawRule, sa as LabelPlacementOverride, si as DirectionOfMainAttackOptions, sn as CounterattackByFireOptions, sr as GenericSectorOptions, st as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, t as AmbushOptions, ta as resolveParameterPresentationTier, ti as SecondaryDirectionOfFireOptions, tn as DEFAULT_DELAY_OPTIONS, tr as RADAR_SEARCH_DOCTRINE_FILL_COLOR, tt as getControlMeasureMetadata, u as line23DrawRule, ua as TextAmplifierKey, ui as DEFAULT_RETAIN_OPTIONS, un as DEFAULT_COUNTERATTACK_OPTIONS, ur as DEFAULT_GENERIC_RECTANGLE_OPTIONS, ut as ObstacleBypassEasyOptions, v as penetrateDrawRule, vi as DEFAULT_GENERIC_C2_LINE_OPTIONS, vn as DEFAULT_BREACH_OPTIONS, vr as DEFAULT_BLOCK_ARROW_OPTIONS, vt as FixOptions, w as MidpointPerpendicularDrawRuleOptions, wi as LabelSizeOptions, wn as DEFAULT_LINE_OF_DEPARTURE_CONTACT_OPTIONS, wr as DEFAULT_MAIN_ATTACK_OPTIONS, wt as TurningMovementOptions, x as blockDrawRule, xi as EngineerWorkLineOptions, xn as DEFAULT_PROBABLE_LINE_OF_DEPLOYMENT_OPTIONS, xr as DEFAULT_CLASSIC_ARROW_OPTIONS, xt as BlockOptions, y as centerRadiusDrawRule, yi as GenericC2LineOptions, yn as BlockMissionTaskOptions, yr as ClassicArrowHeadStyle, yt as DEFAULT_DISRUPT_OPTIONS, z as SimpleStyleRender, zi as DEFAULT_STROKE_DASH_CSS_PIXELS, zn as DEFAULT_BRIDGEHEAD_LINE_OPTIONS, zr as DEFAULT_MOBILE_DEFENSE_OPTIONS, zt as DEFAULT_SEIZE_OPTIONS } from "./index-CYa8ELZp.mjs";
1
+ import { $ as ControlMeasureKind, $i as TextAmplifierDescriptor, $n as DEFAULT_AIRBORNE_ATTACK_OPTIONS, $r as DEFAULT_SECONDARY_DIRECTION_OF_FIRE_OPTIONS, $t as DEFAULT_DISENGAGE_OPTIONS, A as BaselineFrame, Ai as BoundaryOptions, An as BattleHandoverLineOptions, Ar as DEFAULT_PICKUP_ZONE_OPTIONS, At as FortifiedLineOptions, B as toSimpleStyle, Bi as DEFAULT_STROKE_WIDTH_CSS_PIXELS, Bn as DEFAULT_FORWARD_EDGE_OF_BATTLE_AREA_OPTIONS, Br as MobileDefenseOptions, Bt as SeizeOptions, C as area27DrawRule, Ci as LightLineOptions, Cn as ProbableLineOfDeploymentOptions, Cr as SupportingAttackOptions, Ct as DEFAULT_TURNING_MOVEMENT_OPTIONS, D as getMidpointPerpendicularSignedDistance, Di as project, Dn as LineOfDepartureOptions, Dr as computeInitialWidthPoint, Dt as DEFAULT_FORTIFIED_AREA_OPTIONS, E as createMidpointPerpendicularDrawRule, Ei as haversineDistance, En as DEFAULT_LINE_OF_DEPARTURE_OPTIONS, Er as calculateMetrics, Et as FrontalAttackOptions, F as EPSILON, Fi as DEFAULT_LABEL_SIZE_CLAMP_CSS_PIXELS, Fn as ReleaseLineOptions, Fr as DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, Ft as DEFAULT_WITHDRAW_UNDER_PRESSURE_OPTIONS, G as RenderOptions, Gi as ControlMeasureGeometry, Gn as FLOTOptions, Gr as DEFAULT_ENCIRCLEMENT_OPTIONS, Gt as DEFAULT_REARWARD_PASSAGE_OF_LINES_OPTIONS, H as applyBoxTransformOptions, Hi as MeasureTextRequest, Hn as DEFAULT_PHASE_LINE_OPTIONS, Hr as EngagementAreaOptions, Ht as ScreenOptions, I as getMetersPerPixel, Ii as DEFAULT_LINE_CAP, In as DEFAULT_HOLDING_LINE_OPTIONS, Ir as JointTacticalActionAreaOptions, It as WithdrawUnderPressureOptions, J as cloneControlMeasure, Ji as ControlMeasurePaintCapability, Jn as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, Jr as FinalProtectiveFireOptions, Jt as PenetrateOptions, K as renderControlMeasure, Ki as ControlMeasureGeometryType, Kn as AttackByFireOptions, Kr as EncirclementOptions, Kt as RearwardPassageOfLinesOptions, L as roundToFixed, Li as DEFAULT_LINE_JOIN, Ln as HoldingLineOptions, Lr as AssemblyAreaOptions, Lt as DEFAULT_WITHDRAW_OPTIONS, M as BaselineFrameOptions, Mi as BoxTransformDelta, Mn as DEFAULT_HANDOVER_LINE_OPTIONS, Mr as MineType, Mt as DEFAULT_ANTITANK_WALL_OPTIONS, N as BaselineFrameOrigin, Ni as ControlMeasureRenderContext, Nn as HandoverLineOptions, Nr as DEFAULT_LANDING_ZONE_OPTIONS, Nt as AntitankDitchOptions, O as pointOnMidpointPerpendicularAxis, Oi as sphericalBearing, On as DEFAULT_LIMIT_OF_ADVANCE_OPTIONS, Or as AreaOfOperationsOptions, Ot as FortifiedAreaOptions, P as createBaselineFrame, Pi as DEFAULT_LABEL_HEIGHT_CSS_PIXELS, Pn as DEFAULT_RELEASE_LINE_OPTIONS, Pr as LandingZoneOptions, Pt as DEFAULT_ANTITANK_DITCH_OPTIONS, Q as ControlMeasureId, Qi as ParameterSemanticRole, Qn as AirborneAttackOptions, Qr as controlMeasureIdFromFeature, Qt as DisruptMissionTaskOptions, R as SimpleStyleProps, Ri as DEFAULT_PORTRAYAL, Rn as BridgeheadLineOptions, Rr as DEFAULT_ASSEMBLY_AREA_OPTIONS, Rt as WithdrawOptions, S as containDrawRule, Si as DEFAULT_LIGHT_LINE_OPTIONS, Sn as PROBABLE_LINE_OF_DEPLOYMENT_DASH, Sr as DEFAULT_SUPPORTING_ATTACK_OPTIONS, St as DEFAULT_BLOCK_OPTIONS, T as computeDefaultMidpointPerpendicularPoint, Ti as Point2D, Tn as LineOfDepartureContactOptions, Tr as MainAttackOptions, Tt as DEFAULT_FRONTAL_ATTACK_OPTIONS, U as foldsBoxTransformOptions, Ui as MeasuredText, Un as PhaseLineOptions, Ur as AreaDefenseOptions, Ut as DEFAULT_RETIRE_OPTIONS, V as resolveStyleHints, Vi as LogicalTextStyle, Vn as ForwardEdgeOfBattleAreaOptions, Vr as DEFAULT_ENGAGEMENT_AREA_OPTIONS, Vt as DEFAULT_SCREEN_OPTIONS, W as freezeOrientationOptions, Wi as ControlMeasureFillCapability, Wn as DEFAULT_FLOT_OPTIONS, Wr as DEFAULT_AREA_DEFENSE_OPTIONS, Wt as RetireOptions, X as CONTROL_MEASURE_IDS, Xi as ParamDescriptor, Xn as AttackHelicopterOptions, Xr as FeaturePartProps, Xt as GuardOptions, Y as isKind, Yi as PARAMETER_PRESENTATION_TIERS, Yn as SupportByFireOptions, Yr as ControlMeasureRender, Yt as DEFAULT_GUARD_OPTIONS, Z as CONTROL_MEASURE_METADATA, Zi as ParameterPresentationTier, Zn as DEFAULT_ATTACK_HELICOPTER_OPTIONS, Zr as StyleHints, Zt as DEFAULT_DISRUPT_MISSION_TASK_OPTIONS, _ as point12DrawRule, _i as DEFAULT_BATTLE_POSITION_OPTIONS, _n as BreachOptions, _r as BlockArrowOptions, _t as DEFAULT_FIX_OPTIONS, a as axis1DrawRule, aa as CanonicalTextAmplifiers, ai as DirectionOfSupportingAttackOptions, an as DEFAULT_TACTICAL_ARROW_OPTIONS, ar as GenericTextOptions, at as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, b as disruptDrawRule, bi as DEFAULT_ENGINEER_WORK_LINE_OPTIONS, bn as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, br as ClassicArrowOptions, bt as DisruptOptions, c as line26DrawRule, ca as TEXT_AMPLIFIER_FIELDS, ci as DEFAULT_DIRECTION_OF_ATTACK_AVIATION_OPTIONS, cn as DEFAULT_COUNTERATTACK_BY_FIRE_OPTIONS, cr as DEFAULT_GENERIC_CIRCLE_OPTIONS, ct as ObstacleBypassDifficultOptions, d as turnDrawRule, da as TextAmplifiers, di as RetainOptions, dn as ClearOptions, dr as GenericRectangleOptions, dt as DEFAULT_MINEFIELD_OPTIONS, ea as parameterPresentationTierRank, ei as SECONDARY_DIRECTION_OF_FIRE_DASH, en as DisengageOptions, er as DEFAULT_RADAR_SEARCH_DOCTRINE_OPTIONS, et as OptionsByKind, f as line1DrawRule, fa as canonicalTextAmplifierKey, fi as DEFAULT_STRONG_POINT_OPTIONS, fn as DEFAULT_CLEAR_OPTIONS, fr as DEFAULT_GENERIC_POLYGON_OPTIONS, ft as MinefieldOptions, g as staticPointDrawRule, ga as ControlMeasureDrawRule, gi as BattlePositionOptions, gn as DEFAULT_BYPASS_OPTIONS, gr as BlockArrowHeadStyle, gt as FixMissionTaskOptions, h as dynamicPointDrawRule, ha as AnchorTransformEvent, hi as DEFAULT_CONTAIN_OPTIONS, hn as BypassOptions, hr as GenericLineOptions, ht as DEFAULT_FIX_MISSION_TASK_OPTIONS, i as rectangleDrawRule, ia as AmplifierPlacements, ii as DEFAULT_DIRECTION_OF_SUPPORTING_ATTACK_OPTIONS, in as DEFAULT_COVER_OPTIONS, ir as DEFAULT_GENERIC_TEXT_OPTIONS, it as listControlMeasureMetadata, j as BaselineFrameNormal, ji as DEFAULT_BOUNDARY_OPTIONS, jn as DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, jr as PickupZoneOptions, jt as AntitankWallOptions, k as snapToMidpointPerpendicular, ki as unproject, kn as LimitOfAdvanceOptions, kr as DEFAULT_AREA_OF_OPERATIONS_OPTIONS, kt as DEFAULT_FORTIFIED_LINE_OPTIONS, l as line24DrawRule, la as TextAmplifierField, li as DirectionOfAttackAviationOptions, ln as CounterattackOptions, lr as GenericCircleOptions, lt as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, m as attackByFireDrawRule, ma as resolveAmplifierPlacement, mi as ContainOptions, mn as DEFAULT_CANALIZE_OPTIONS, mr as DEFAULT_GENERIC_LINE_OPTIONS, mt as TurnOptions, n as DEFAULT_AMBUSH_OPTIONS, na as resolveParameterSemanticRole, ni as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, nn as DelayOptions, nr as RADAR_SEARCH_DOCTRINE_STROKE_COLOR, nt as getControlMeasureMetadataByValue, o as supportByFireDrawRule, oa as GeneratedLabelKey, oi as DEFAULT_DIRECTION_OF_MAIN_ATTACK_OPTIONS, on as TacticalArrowOptions, or as DEFAULT_GENERIC_SECTOR_OPTIONS, ot as ObstacleBypassImpossibleOptions, p as ambushDrawRule, pa as normalizeTextAmplifiers, pi as StrongPointOptions, pn as CanalizeOptions, pr as GenericPolygonOptions, pt as DEFAULT_TURN_OPTIONS, q as ControlMeasure, qi as ControlMeasureMetadata, qn as DEFAULT_ATTACK_BY_FIRE_OPTIONS, qr as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, qt as DEFAULT_PENETRATE_OPTIONS, r as sectorDrawRule, ra as AmplifierPlacement, ri as PrincipalDirectionOfFireOptions, rn as CoverOptions, rr as RadarSearchDoctrineOptions, rt as getDefaultOptions, s as line27DrawRule, sa as LabelPlacementOverride, si as DirectionOfMainAttackOptions, sn as CounterattackByFireOptions, sr as GenericSectorOptions, st as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, t as AmbushOptions, ta as resolveParameterPresentationTier, ti as SecondaryDirectionOfFireOptions, tn as DEFAULT_DELAY_OPTIONS, tr as RADAR_SEARCH_DOCTRINE_FILL_COLOR, tt as getControlMeasureMetadata, u as line23DrawRule, ua as TextAmplifierKey, ui as DEFAULT_RETAIN_OPTIONS, un as DEFAULT_COUNTERATTACK_OPTIONS, ur as DEFAULT_GENERIC_RECTANGLE_OPTIONS, ut as ObstacleBypassEasyOptions, v as penetrateDrawRule, vi as DEFAULT_GENERIC_C2_LINE_OPTIONS, vn as DEFAULT_BREACH_OPTIONS, vr as DEFAULT_BLOCK_ARROW_OPTIONS, vt as FixOptions, w as MidpointPerpendicularDrawRuleOptions, wi as LabelSizeOptions, wn as DEFAULT_LINE_OF_DEPARTURE_CONTACT_OPTIONS, wr as DEFAULT_MAIN_ATTACK_OPTIONS, wt as TurningMovementOptions, x as blockDrawRule, xi as EngineerWorkLineOptions, xn as DEFAULT_PROBABLE_LINE_OF_DEPLOYMENT_OPTIONS, xr as DEFAULT_CLASSIC_ARROW_OPTIONS, xt as BlockOptions, y as centerRadiusDrawRule, yi as GenericC2LineOptions, yn as BlockMissionTaskOptions, yr as ClassicArrowHeadStyle, yt as DEFAULT_DISRUPT_OPTIONS, z as SimpleStyleRender, zi as DEFAULT_STROKE_DASH_CSS_PIXELS, zn as DEFAULT_BRIDGEHEAD_LINE_OPTIONS, zr as DEFAULT_MOBILE_DEFENSE_OPTIONS, zt as DEFAULT_SEIZE_OPTIONS } from "./index-CwSQl5SE.mjs";
2
2
  import { a as PatternId, c as PatternPoint, d as ControlMeasureStyle, f as FillPattern, i as NON_SOLID_FILL_PATTERNS, l as PatternStroke, n as FillPatternCommand, o as PatternPaint, r as FillPatternDefinition, s as PatternPathOperation, t as FILL_PATTERN_DEFINITIONS, u as getFillPatternDefinition } from "./patterns-CcQmmOuJ.mjs";
3
3
  export { type AirborneAttackOptions, type AmbushOptions, type AmplifierPlacement, type AmplifierPlacements, type AnchorTransformEvent, type AntitankDitchOptions, type AntitankWallOptions, type AreaDefenseOptions, type AreaOfOperationsOptions, type AssemblyAreaOptions, type AttackByFireOptions, type AttackHelicopterOptions, type BaselineFrame, type BaselineFrameNormal, type BaselineFrameOptions, type BaselineFrameOrigin, type BattleHandoverLineOptions, type BattlePositionOptions, type BlockArrowHeadStyle, type BlockArrowOptions, type BlockMissionTaskOptions, type BlockOptions, type BoundaryOptions, type BoxTransformDelta, type BreachOptions, type BridgeheadLineOptions, type BypassOptions, CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, type CanalizeOptions, type CanonicalTextAmplifiers, type ClassicArrowHeadStyle, type ClassicArrowOptions, type ClearOptions, type ContainOptions, type ControlMeasure, type ControlMeasureDrawRule, type ControlMeasureFillCapability, type ControlMeasureGeometry, type ControlMeasureGeometryType, type ControlMeasureId, type ControlMeasureKind, type ControlMeasureMetadata, type ControlMeasurePaintCapability, type ControlMeasureRender, type ControlMeasureRenderContext, type ControlMeasureStyle, type CounterattackByFireOptions, type CounterattackOptions, type CoverOptions, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_AREA_DEFENSE_OPTIONS, DEFAULT_AREA_OF_OPERATIONS_OPTIONS, DEFAULT_ASSEMBLY_AREA_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_OPTIONS, DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, DEFAULT_BATTLE_POSITION_OPTIONS, DEFAULT_BLOCK_ARROW_OPTIONS, DEFAULT_BLOCK_MISSION_TASK_OPTIONS, DEFAULT_BLOCK_OPTIONS, DEFAULT_BOUNDARY_OPTIONS, DEFAULT_BREACH_OPTIONS, DEFAULT_BRIDGEHEAD_LINE_OPTIONS, DEFAULT_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLASSIC_ARROW_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_CONTAIN_OPTIONS, DEFAULT_COUNTERATTACK_BY_FIRE_OPTIONS, DEFAULT_COUNTERATTACK_OPTIONS, DEFAULT_COVER_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DIRECTION_OF_ATTACK_AVIATION_OPTIONS, DEFAULT_DIRECTION_OF_MAIN_ATTACK_OPTIONS, DEFAULT_DIRECTION_OF_SUPPORTING_ATTACK_OPTIONS, DEFAULT_DISENGAGE_OPTIONS, DEFAULT_DISRUPT_MISSION_TASK_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_ENGAGEMENT_AREA_OPTIONS, DEFAULT_ENGINEER_WORK_LINE_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_MISSION_TASK_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_FORWARD_EDGE_OF_BATTLE_AREA_OPTIONS, DEFAULT_FRONTAL_ATTACK_OPTIONS, DEFAULT_GENERIC_C2_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_GENERIC_SECTOR_OPTIONS, DEFAULT_GENERIC_TEXT_OPTIONS, DEFAULT_GUARD_OPTIONS, DEFAULT_HANDOVER_LINE_OPTIONS, DEFAULT_HOLDING_LINE_OPTIONS, DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, DEFAULT_LABEL_HEIGHT_CSS_PIXELS, DEFAULT_LABEL_SIZE_CLAMP_CSS_PIXELS, DEFAULT_LANDING_ZONE_OPTIONS, DEFAULT_LIGHT_LINE_OPTIONS, DEFAULT_LIMIT_OF_ADVANCE_OPTIONS, DEFAULT_LINE_CAP, DEFAULT_LINE_JOIN, DEFAULT_LINE_OF_DEPARTURE_CONTACT_OPTIONS, DEFAULT_LINE_OF_DEPARTURE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_MINEFIELD_OPTIONS, DEFAULT_MOBILE_DEFENSE_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PENETRATE_OPTIONS, DEFAULT_PHASE_LINE_OPTIONS, DEFAULT_PICKUP_ZONE_OPTIONS, DEFAULT_PORTRAYAL, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_PROBABLE_LINE_OF_DEPLOYMENT_OPTIONS, DEFAULT_RADAR_SEARCH_DOCTRINE_OPTIONS, DEFAULT_REARWARD_PASSAGE_OF_LINES_OPTIONS, DEFAULT_RELEASE_LINE_OPTIONS, DEFAULT_RETAIN_OPTIONS, DEFAULT_RETIRE_OPTIONS, DEFAULT_SCREEN_OPTIONS, DEFAULT_SECONDARY_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_SEIZE_OPTIONS, DEFAULT_STROKE_DASH_CSS_PIXELS, DEFAULT_STROKE_WIDTH_CSS_PIXELS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURNING_MOVEMENT_OPTIONS, DEFAULT_TURN_OPTIONS, DEFAULT_WITHDRAW_OPTIONS, DEFAULT_WITHDRAW_UNDER_PRESSURE_OPTIONS, type DelayOptions, type DirectionOfAttackAviationOptions, type DirectionOfMainAttackOptions, type DirectionOfSupportingAttackOptions, type DisengageOptions, type DisruptMissionTaskOptions, type DisruptOptions, EPSILON, type EncirclementOptions, type EngagementAreaOptions, type EngineerWorkLineOptions, FILL_PATTERN_DEFINITIONS, type FLOTOptions, type FeaturePartProps, type FillPattern, type FillPatternCommand, type FillPatternDefinition, type FinalProtectiveFireOptions, type FixMissionTaskOptions, type FixOptions, type FortifiedAreaOptions, type FortifiedLineOptions, type ForwardEdgeOfBattleAreaOptions, type FrontalAttackOptions, type GeneratedLabelKey, type GenericC2LineOptions, type GenericCircleOptions, type GenericLineOptions, type GenericPolygonOptions, type GenericRectangleOptions, type GenericSectorOptions, type GenericTextOptions, type GuardOptions, type HandoverLineOptions, type HoldingLineOptions, type JointTacticalActionAreaOptions, type LabelPlacementOverride, type LabelSizeOptions, type LandingZoneOptions, type LightLineOptions, type LimitOfAdvanceOptions, type LineOfDepartureContactOptions, type LineOfDepartureOptions, type LogicalTextStyle, type MainAttackOptions, type MeasureTextRequest, type MeasuredText, type MidpointPerpendicularDrawRuleOptions, type MineType, type MinefieldOptions, type MobileDefenseOptions, NON_SOLID_FILL_PATTERNS, type ObstacleBypassDifficultOptions, type ObstacleBypassEasyOptions, type ObstacleBypassImpossibleOptions, type OptionsByKind, PARAMETER_PRESENTATION_TIERS, PROBABLE_LINE_OF_DEPLOYMENT_DASH, type ParamDescriptor, type ParameterPresentationTier, type ParameterSemanticRole, type PatternId, type PatternPaint, type PatternPathOperation, type PatternPoint, type PatternStroke, type PenetrateOptions, type PhaseLineOptions, type PickupZoneOptions, type Point2D, type PrincipalDirectionOfFireOptions, type ProbableLineOfDeploymentOptions, RADAR_SEARCH_DOCTRINE_FILL_COLOR, RADAR_SEARCH_DOCTRINE_STROKE_COLOR, type RadarSearchDoctrineOptions, type RearwardPassageOfLinesOptions, type ReleaseLineOptions, type RenderOptions, type RetainOptions, type RetireOptions, SECONDARY_DIRECTION_OF_FIRE_DASH, type ScreenOptions, type SecondaryDirectionOfFireOptions, type SeizeOptions, type SimpleStyleProps, type SimpleStyleRender, type StrongPointOptions, type StyleHints, type SupportByFireOptions, type SupportingAttackOptions, TEXT_AMPLIFIER_FIELDS, type TacticalArrowOptions, type TextAmplifierDescriptor, type TextAmplifierField, type TextAmplifierKey, type TextAmplifiers, type TurnOptions, type TurningMovementOptions, type WithdrawOptions, type WithdrawUnderPressureOptions, ambushDrawRule, applyBoxTransformOptions, area27DrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, canonicalTextAmplifierKey, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, containDrawRule, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, dynamicPointDrawRule, foldsBoxTransformOptions, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getFillPatternDefinition, getMetersPerPixel, getMidpointPerpendicularSignedDistance, haversineDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, line26DrawRule, line27DrawRule, listControlMeasureMetadata, normalizeTextAmplifiers, parameterPresentationTierRank, penetrateDrawRule, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveAmplifierPlacement, resolveParameterPresentationTier, resolveParameterSemanticRole, resolveStyleHints, roundToFixed, sectorDrawRule, snapToMidpointPerpendicular, sphericalBearing, staticPointDrawRule, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as DEFAULT_DISRUPT_OPTIONS, $t as DEFAULT_STROKE_DASH_CSS_PIXELS, A as DEFAULT_RETIRE_OPTIONS, An as createBaselineFrame, At as DEFAULT_CONTAIN_OPTIONS, B as DEFAULT_LIMIT_OF_ADVANCE_OPTIONS, Bt as DEFAULT_AREA_DEFENSE_OPTIONS, C as DEFAULT_MAIN_ATTACK_OPTIONS, Cn as containDrawRule, Ct as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, D as DEFAULT_WITHDRAW_OPTIONS, Dn as getMidpointPerpendicularSignedDistance, Dt as DEFAULT_BOUNDARY_OPTIONS, E as DEFAULT_WITHDRAW_UNDER_PRESSURE_OPTIONS, En as createMidpointPerpendicularDrawRule, Et as DEFAULT_LIGHT_LINE_OPTIONS, F as DEFAULT_FORTIFIED_LINE_OPTIONS, Fn as sphericalBearing, Ft as DEFAULT_ANTITANK_DITCH_OPTIONS, G as DEFAULT_HOLDING_LINE_OPTIONS, Gt as canonicalTextAmplifierKey, H as DEFAULT_HANDOVER_LINE_OPTIONS, Ht as DEFAULT_DIRECTION_OF_MAIN_ATTACK_OPTIONS, I as DEFAULT_PROBABLE_LINE_OF_DEPLOYMENT_OPTIONS, In as unproject, It as DEFAULT_ASSEMBLY_AREA_OPTIONS, J as DEFAULT_FLOT_OPTIONS, Jt as DEFAULT_LABEL_HEIGHT_CSS_PIXELS, K as DEFAULT_BRIDGEHEAD_LINE_OPTIONS, Kt as normalizeTextAmplifiers, L as PROBABLE_LINE_OF_DEPLOYMENT_DASH, Ln as EPSILON, Lt as DEFAULT_AREA_OF_OPERATIONS_OPTIONS, M as DEFAULT_PENETRATE_OPTIONS, Mn as computeInitialWidthPoint, Mt as DEFAULT_ATTACK_HELICOPTER_OPTIONS, N as DEFAULT_FRONTAL_ATTACK_OPTIONS, Nn as haversineDistance, Nt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, O as DEFAULT_SEIZE_OPTIONS, On as pointOnMidpointPerpendicularAxis, Ot as DEFAULT_BLOCK_ARROW_OPTIONS, P as DEFAULT_FORTIFIED_AREA_OPTIONS, Pn as project, Pt as DEFAULT_ANTITANK_WALL_OPTIONS, Q as DEFAULT_ENCIRCLEMENT_OPTIONS, Qt as DEFAULT_PORTRAYAL, R as DEFAULT_LINE_OF_DEPARTURE_CONTACT_OPTIONS, Rn as getMetersPerPixel, Rt as DEFAULT_MOBILE_DEFENSE_OPTIONS, S as DEFAULT_MINEFIELD_OPTIONS, Sn as centerRadiusDrawRule, St as DEFAULT_BREACH_OPTIONS, T as DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, Tn as computeDefaultMidpointPerpendicularPoint, Tt as DEFAULT_ENGINEER_WORK_LINE_OPTIONS, U as DEFAULT_FORWARD_EDGE_OF_BATTLE_AREA_OPTIONS, Ut as DEFAULT_DIRECTION_OF_ATTACK_AVIATION_OPTIONS, V as DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, Vt as DEFAULT_DIRECTION_OF_SUPPORTING_ATTACK_OPTIONS, W as DEFAULT_RELEASE_LINE_OPTIONS, Wt as TEXT_AMPLIFIER_FIELDS, X as DEFAULT_FIX_OPTIONS, Xt as DEFAULT_LINE_CAP, Y as DEFAULT_FIX_MISSION_TASK_OPTIONS, Yt as DEFAULT_LABEL_SIZE_CLAMP_CSS_PIXELS, Z as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, Zt as DEFAULT_LINE_JOIN, _ as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, _n as staticPointDrawRule, _t as DEFAULT_GENERIC_LINE_OPTIONS, a as DEFINITIONS, an as axis1DrawRule, at as DEFAULT_TACTICAL_ARROW_OPTIONS, b as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, bn as disruptDrawRule, bt as DEFAULT_CANALIZE_OPTIONS, c as getDefaultOptions, cn as line26DrawRule, ct as DEFAULT_SUPPORTING_ATTACK_OPTIONS, d as DEFAULT_TURN_OPTIONS, dn as turnDrawRule, dt as RADAR_SEARCH_DOCTRINE_FILL_COLOR, en as DEFAULT_STROKE_WIDTH_CSS_PIXELS, et as DEFAULT_GUARD_OPTIONS, f as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, fn as line1DrawRule, ft as RADAR_SEARCH_DOCTRINE_STROKE_COLOR, g as SECONDARY_DIRECTION_OF_FIRE_DASH, gn as sectorDrawRule, gt as DEFAULT_GENERIC_POLYGON_OPTIONS, h as DEFAULT_SECONDARY_DIRECTION_OF_FIRE_OPTIONS, hn as dynamicPointDrawRule, ht as DEFAULT_GENERIC_RECTANGLE_OPTIONS, i as CONTROL_MEASURE_METADATA, in as rectangleDrawRule, it as DEFAULT_COVER_OPTIONS, j as DEFAULT_REARWARD_PASSAGE_OF_LINES_OPTIONS, jn as calculateMetrics, jt as DEFAULT_BATTLE_POSITION_OPTIONS, k as DEFAULT_SCREEN_OPTIONS, kn as snapToMidpointPerpendicular, kt as DEFAULT_BLOCK_OPTIONS, l as listControlMeasureMetadata, ln as line24DrawRule, lt as DEFAULT_CLEAR_OPTIONS, m as DEFAULT_STRONG_POINT_OPTIONS, mn as attackByFireDrawRule, mt as DEFAULT_GENERIC_SECTOR_OPTIONS, n as resolveStyleHints, nn as DEFAULT_AMBUSH_OPTIONS, nt as DEFAULT_DISENGAGE_OPTIONS, o as getControlMeasureMetadata, on as supportByFireDrawRule, ot as DEFAULT_COUNTERATTACK_BY_FIRE_OPTIONS, p as DEFAULT_RETAIN_OPTIONS, pn as ambushDrawRule, pt as DEFAULT_GENERIC_TEXT_OPTIONS, q as DEFAULT_PHASE_LINE_OPTIONS, qt as resolveAmplifierPlacement, r as CONTROL_MEASURE_IDS, rn as DEFAULT_AIRBORNE_ATTACK_OPTIONS, rt as DEFAULT_DELAY_OPTIONS, s as getControlMeasureMetadataByValue, sn as line27DrawRule, st as DEFAULT_COUNTERATTACK_OPTIONS, t as renderControlMeasure, tt as DEFAULT_DISRUPT_MISSION_TASK_OPTIONS, u as DEFAULT_TURNING_MOVEMENT_OPTIONS, un as line23DrawRule, ut as DEFAULT_RADAR_SEARCH_DOCTRINE_OPTIONS, v as DEFAULT_PICKUP_ZONE_OPTIONS, vn as point12DrawRule, vt as DEFAULT_GENERIC_CIRCLE_OPTIONS, w as DEFAULT_LANDING_ZONE_OPTIONS, wn as area27DrawRule, wt as DEFAULT_GENERIC_C2_LINE_OPTIONS, x as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, xn as blockDrawRule, xt as DEFAULT_BYPASS_OPTIONS, y as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, yn as penetrateDrawRule, yt as DEFAULT_CLASSIC_ARROW_OPTIONS, z as DEFAULT_LINE_OF_DEPARTURE_OPTIONS, zn as roundToFixed, zt as DEFAULT_ENGAGEMENT_AREA_OPTIONS } from "./renderControlMeasure-BcJiY40G.mjs";
1
+ import { $ as DEFAULT_DISRUPT_OPTIONS, $t as DEFAULT_STROKE_DASH_CSS_PIXELS, A as DEFAULT_RETIRE_OPTIONS, An as createBaselineFrame, At as DEFAULT_CONTAIN_OPTIONS, B as DEFAULT_LIMIT_OF_ADVANCE_OPTIONS, Bt as DEFAULT_AREA_DEFENSE_OPTIONS, C as DEFAULT_MAIN_ATTACK_OPTIONS, Cn as containDrawRule, Ct as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, D as DEFAULT_WITHDRAW_OPTIONS, Dn as getMidpointPerpendicularSignedDistance, Dt as DEFAULT_BOUNDARY_OPTIONS, E as DEFAULT_WITHDRAW_UNDER_PRESSURE_OPTIONS, En as createMidpointPerpendicularDrawRule, Et as DEFAULT_LIGHT_LINE_OPTIONS, F as DEFAULT_FORTIFIED_LINE_OPTIONS, Fn as sphericalBearing, Ft as DEFAULT_ANTITANK_DITCH_OPTIONS, G as DEFAULT_HOLDING_LINE_OPTIONS, Gt as canonicalTextAmplifierKey, H as DEFAULT_HANDOVER_LINE_OPTIONS, Ht as DEFAULT_DIRECTION_OF_MAIN_ATTACK_OPTIONS, I as DEFAULT_PROBABLE_LINE_OF_DEPLOYMENT_OPTIONS, In as unproject, It as DEFAULT_ASSEMBLY_AREA_OPTIONS, J as DEFAULT_FLOT_OPTIONS, Jt as DEFAULT_LABEL_HEIGHT_CSS_PIXELS, K as DEFAULT_BRIDGEHEAD_LINE_OPTIONS, Kt as normalizeTextAmplifiers, L as PROBABLE_LINE_OF_DEPLOYMENT_DASH, Ln as EPSILON, Lt as DEFAULT_AREA_OF_OPERATIONS_OPTIONS, M as DEFAULT_PENETRATE_OPTIONS, Mn as computeInitialWidthPoint, Mt as DEFAULT_ATTACK_HELICOPTER_OPTIONS, N as DEFAULT_FRONTAL_ATTACK_OPTIONS, Nn as haversineDistance, Nt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, O as DEFAULT_SEIZE_OPTIONS, On as pointOnMidpointPerpendicularAxis, Ot as DEFAULT_BLOCK_ARROW_OPTIONS, P as DEFAULT_FORTIFIED_AREA_OPTIONS, Pn as project, Pt as DEFAULT_ANTITANK_WALL_OPTIONS, Q as DEFAULT_ENCIRCLEMENT_OPTIONS, Qt as DEFAULT_PORTRAYAL, R as DEFAULT_LINE_OF_DEPARTURE_CONTACT_OPTIONS, Rn as getMetersPerPixel, Rt as DEFAULT_MOBILE_DEFENSE_OPTIONS, S as DEFAULT_MINEFIELD_OPTIONS, Sn as centerRadiusDrawRule, St as DEFAULT_BREACH_OPTIONS, T as DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, Tn as computeDefaultMidpointPerpendicularPoint, Tt as DEFAULT_ENGINEER_WORK_LINE_OPTIONS, U as DEFAULT_FORWARD_EDGE_OF_BATTLE_AREA_OPTIONS, Ut as DEFAULT_DIRECTION_OF_ATTACK_AVIATION_OPTIONS, V as DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, Vt as DEFAULT_DIRECTION_OF_SUPPORTING_ATTACK_OPTIONS, W as DEFAULT_RELEASE_LINE_OPTIONS, Wt as TEXT_AMPLIFIER_FIELDS, X as DEFAULT_FIX_OPTIONS, Xt as DEFAULT_LINE_CAP, Y as DEFAULT_FIX_MISSION_TASK_OPTIONS, Yt as DEFAULT_LABEL_SIZE_CLAMP_CSS_PIXELS, Z as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, Zt as DEFAULT_LINE_JOIN, _ as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, _n as staticPointDrawRule, _t as DEFAULT_GENERIC_LINE_OPTIONS, a as DEFINITIONS, an as axis1DrawRule, at as DEFAULT_TACTICAL_ARROW_OPTIONS, b as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, bn as disruptDrawRule, bt as DEFAULT_CANALIZE_OPTIONS, c as getDefaultOptions, cn as line26DrawRule, ct as DEFAULT_SUPPORTING_ATTACK_OPTIONS, d as DEFAULT_TURN_OPTIONS, dn as turnDrawRule, dt as RADAR_SEARCH_DOCTRINE_FILL_COLOR, en as DEFAULT_STROKE_WIDTH_CSS_PIXELS, et as DEFAULT_GUARD_OPTIONS, f as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, fn as line1DrawRule, ft as RADAR_SEARCH_DOCTRINE_STROKE_COLOR, g as SECONDARY_DIRECTION_OF_FIRE_DASH, gn as sectorDrawRule, gt as DEFAULT_GENERIC_POLYGON_OPTIONS, h as DEFAULT_SECONDARY_DIRECTION_OF_FIRE_OPTIONS, hn as dynamicPointDrawRule, ht as DEFAULT_GENERIC_RECTANGLE_OPTIONS, i as CONTROL_MEASURE_METADATA, in as rectangleDrawRule, it as DEFAULT_COVER_OPTIONS, j as DEFAULT_REARWARD_PASSAGE_OF_LINES_OPTIONS, jn as calculateMetrics, jt as DEFAULT_BATTLE_POSITION_OPTIONS, k as DEFAULT_SCREEN_OPTIONS, kn as snapToMidpointPerpendicular, kt as DEFAULT_BLOCK_OPTIONS, l as listControlMeasureMetadata, ln as line24DrawRule, lt as DEFAULT_CLEAR_OPTIONS, m as DEFAULT_STRONG_POINT_OPTIONS, mn as attackByFireDrawRule, mt as DEFAULT_GENERIC_SECTOR_OPTIONS, n as resolveStyleHints, nn as DEFAULT_AMBUSH_OPTIONS, nt as DEFAULT_DISENGAGE_OPTIONS, o as getControlMeasureMetadata, on as supportByFireDrawRule, ot as DEFAULT_COUNTERATTACK_BY_FIRE_OPTIONS, p as DEFAULT_RETAIN_OPTIONS, pn as ambushDrawRule, pt as DEFAULT_GENERIC_TEXT_OPTIONS, q as DEFAULT_PHASE_LINE_OPTIONS, qt as resolveAmplifierPlacement, r as CONTROL_MEASURE_IDS, rn as DEFAULT_AIRBORNE_ATTACK_OPTIONS, rt as DEFAULT_DELAY_OPTIONS, s as getControlMeasureMetadataByValue, sn as line27DrawRule, st as DEFAULT_COUNTERATTACK_OPTIONS, t as renderControlMeasure, tt as DEFAULT_DISRUPT_MISSION_TASK_OPTIONS, u as DEFAULT_TURNING_MOVEMENT_OPTIONS, un as line23DrawRule, ut as DEFAULT_RADAR_SEARCH_DOCTRINE_OPTIONS, v as DEFAULT_PICKUP_ZONE_OPTIONS, vn as point12DrawRule, vt as DEFAULT_GENERIC_CIRCLE_OPTIONS, w as DEFAULT_LANDING_ZONE_OPTIONS, wn as area27DrawRule, wt as DEFAULT_GENERIC_C2_LINE_OPTIONS, x as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, xn as blockDrawRule, xt as DEFAULT_BYPASS_OPTIONS, y as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, yn as penetrateDrawRule, yt as DEFAULT_CLASSIC_ARROW_OPTIONS, z as DEFAULT_LINE_OF_DEPARTURE_OPTIONS, zn as roundToFixed, zt as DEFAULT_ENGAGEMENT_AREA_OPTIONS } from "./renderControlMeasure-DJo_s-lN.mjs";
2
2
  import { FILL_PATTERN_DEFINITIONS, NON_SOLID_FILL_PATTERNS, getFillPatternDefinition } from "./patterns.mjs";
3
3
  //#region src/metadata.ts
4
4
  const PARAMETER_PRESENTATION_TIERS = [
@@ -1,4 +1,4 @@
1
- import { Q as ControlMeasureId, da as TextAmplifiers } from "../index-CYa8ELZp.mjs";
1
+ import { Q as ControlMeasureId, da as TextAmplifiers } from "../index-CwSQl5SE.mjs";
2
2
  import { f as FillPattern } from "../patterns-CcQmmOuJ.mjs";
3
3
  import { FeatureCollection, Geometry } from "geojson";
4
4
 
@@ -1,4 +1,4 @@
1
- import { a as DEFINITIONS, t as renderControlMeasure } from "../renderControlMeasure-BcJiY40G.mjs";
1
+ import { a as DEFINITIONS, t as renderControlMeasure } from "../renderControlMeasure-DJo_s-lN.mjs";
2
2
  import { FILL_PATTERN_DEFINITIONS, NON_SOLID_FILL_PATTERNS } from "../patterns.mjs";
3
3
  //#region src/preview/index.ts
4
4
  /** Side length (SVG units) of the repeating non-mine tile in {@link PREVIEW_FILL_PATTERNS}. */
@@ -563,7 +563,7 @@ function samePosition(a, b) {
563
563
  }
564
564
  //#endregion
565
565
  //#region src/draw-rules/area1.ts
566
- function derive$12(points) {
566
+ function derive$14(points) {
567
567
  return clonePositions(points);
568
568
  }
569
569
  /**
@@ -583,9 +583,9 @@ const area1DrawRule = {
583
583
  id: "area1",
584
584
  minimumUserPoints: 3,
585
585
  closedRing: true,
586
- derive: derive$12,
586
+ derive: derive$14,
587
587
  transform(event) {
588
- return derive$12(event.next);
588
+ return derive$14(event.next);
589
589
  }
590
590
  };
591
591
  //#endregion
@@ -625,14 +625,14 @@ const containDrawRule = createMidpointPerpendicularDrawRule({
625
625
  * that fixes both the radius and the bearing of the symbol's opening. Both
626
626
  * points are user-clicked, so the canonical array is just the (clamped) input.
627
627
  */
628
- function derive$11(points) {
628
+ function derive$13(points) {
629
629
  return clonePositions(points.slice(0, 2));
630
630
  }
631
631
  const centerRadiusDrawRule = {
632
632
  id: "area15:center-radius",
633
633
  minimumUserPoints: 2,
634
634
  canonicalPointCount: 2,
635
- derive: derive$11,
635
+ derive: derive$13,
636
636
  transform(event) {
637
637
  const { previous, next, activePointIndex } = event;
638
638
  if (activePointIndex === 0 && previous.length >= 2 && next.length >= 2) {
@@ -641,7 +641,7 @@ const centerRadiusDrawRule = {
641
641
  const origin = previous[1];
642
642
  return [clonePosition(next[0]), [origin[0] + dx, origin[1] + dy]];
643
643
  }
644
- return derive$11(next);
644
+ return derive$13(next);
645
645
  }
646
646
  };
647
647
  /** Backward-compatible doctrinal name for Area15's shared center-radius rule. */
@@ -705,16 +705,16 @@ const point12DrawRule = createMidpointPerpendicularDrawRule({ id: "point12:obsta
705
705
  * Point1 — a single anchor point (e.g. Text's center). One user click commits
706
706
  * the measure; dragging the point simply translates it.
707
707
  */
708
- function derive$10(points) {
708
+ function derive$12(points) {
709
709
  return clonePositions(points.slice(0, 1));
710
710
  }
711
711
  const pointDrawRule = {
712
712
  id: "point1:anchor",
713
713
  minimumUserPoints: 1,
714
714
  canonicalPointCount: 1,
715
- derive: derive$10,
715
+ derive: derive$12,
716
716
  transform(event) {
717
- return derive$10(event.next);
717
+ return derive$12(event.next);
718
718
  }
719
719
  };
720
720
  //#endregion
@@ -741,7 +741,7 @@ const SECTOR_ANGLE_SNAP_RADIANS = Math.PI / 36;
741
741
  * independently control a radius and a true-north azimuth. Dragging the anchor
742
742
  * translates both edge points so the sector retains its size and orientation.
743
743
  */
744
- function derive$9(points) {
744
+ function derive$11(points) {
745
745
  return clonePositions(points.slice(0, 3));
746
746
  }
747
747
  function guidePoints$2(points) {
@@ -769,7 +769,7 @@ const sectorDrawRule = {
769
769
  showGuide: true,
770
770
  guidePoints: guidePoints$2,
771
771
  constrainAngles,
772
- derive: derive$9,
772
+ derive: derive$11,
773
773
  transform(event) {
774
774
  const { previous, next, activePointIndex } = event;
775
775
  if (activePointIndex === 0 && previous.length >= 3 && next.length >= 3) {
@@ -781,7 +781,7 @@ const sectorDrawRule = {
781
781
  [previous[2][0] + dx, previous[2][1] + dy]
782
782
  ];
783
783
  }
784
- return derive$9(next);
784
+ return derive$11(next);
785
785
  }
786
786
  };
787
787
  //#endregion
@@ -836,20 +836,20 @@ const ambushDrawRule = createMidpointPerpendicularDrawRule({
836
836
  });
837
837
  //#endregion
838
838
  //#region src/draw-rules/line1.ts
839
- function derive$8(points) {
839
+ function derive$10(points) {
840
840
  return clonePositions(points);
841
841
  }
842
842
  const line1DrawRule = {
843
843
  id: "line1",
844
844
  minimumUserPoints: 2,
845
- derive: derive$8,
845
+ derive: derive$10,
846
846
  transform(event) {
847
- return derive$8(event.next);
847
+ return derive$10(event.next);
848
848
  }
849
849
  };
850
850
  //#endregion
851
851
  //#region src/draw-rules/line3.ts
852
- function derive$7(points) {
852
+ function derive$9(points) {
853
853
  return clonePositions(points);
854
854
  }
855
855
  /**
@@ -864,23 +864,23 @@ const line3DrawRule = {
864
864
  id: "line3",
865
865
  minimumUserPoints: 3,
866
866
  canonicalPointCount: 3,
867
- derive: derive$7,
867
+ derive: derive$9,
868
868
  transform(event) {
869
- return derive$7(event.next);
869
+ return derive$9(event.next);
870
870
  }
871
871
  };
872
872
  //#endregion
873
873
  //#region src/draw-rules/line9.ts
874
- function derive$6(points) {
874
+ function derive$8(points) {
875
875
  return clonePositions(points);
876
876
  }
877
877
  const line9DrawRule = {
878
878
  id: "line9",
879
879
  minimumUserPoints: 2,
880
880
  canonicalPointCount: 2,
881
- derive: derive$6,
881
+ derive: derive$8,
882
882
  transform(event) {
883
- return derive$6(event.next);
883
+ return derive$8(event.next);
884
884
  }
885
885
  };
886
886
  //#endregion
@@ -1009,7 +1009,7 @@ const line24DrawRule = createMidpointPerpendicularDrawRule({
1009
1009
  });
1010
1010
  //#endregion
1011
1011
  //#region src/draw-rules/line26.ts
1012
- function derive$5(points) {
1012
+ function derive$7(points) {
1013
1013
  if (points.length === 2) {
1014
1014
  const [p1, p2] = points;
1015
1015
  const dx = p2[0] - p1[0];
@@ -1048,9 +1048,9 @@ const line26DrawRule = {
1048
1048
  minimumUserPoints: 4,
1049
1049
  minimumPreviewPoints: 2,
1050
1050
  canonicalPointCount: 4,
1051
- derive: derive$5,
1051
+ derive: derive$7,
1052
1052
  transform(event) {
1053
- return derive$5(event.next);
1053
+ return derive$7(event.next);
1054
1054
  }
1055
1055
  };
1056
1056
  //#endregion
@@ -1063,7 +1063,7 @@ function deriveArcPoint(p1, p2, p4) {
1063
1063
  if (!arc) return [(p2[0] + p4[0]) / 2, (p2[1] + p4[1]) / 2];
1064
1064
  return unproject(arc.midpoint[0], arc.midpoint[1]);
1065
1065
  }
1066
- function derive$4(points) {
1066
+ function derive$6(points) {
1067
1067
  if (points.length < 2) return clonePositions(points);
1068
1068
  const [p1, p2] = points;
1069
1069
  if (points.length === 2) {
@@ -1102,7 +1102,7 @@ const line27DrawRule = {
1102
1102
  minimumUserPoints: 3,
1103
1103
  minimumPreviewPoints: 2,
1104
1104
  canonicalPointCount: 4,
1105
- derive: derive$4,
1105
+ derive: derive$6,
1106
1106
  transform(event) {
1107
1107
  const { previous, next, activePointIndex } = event;
1108
1108
  if (activePointIndex === 0 && previous.length >= 4 && next.length >= 4) {
@@ -1134,6 +1134,124 @@ const line27DrawRule = {
1134
1134
  }
1135
1135
  };
1136
1136
  //#endregion
1137
+ //#region src/draw-rules/line31.ts
1138
+ function derive$5(points) {
1139
+ if (points.length === 2) {
1140
+ const [c1, c3] = points;
1141
+ const start = project(c1[0], c1[1]);
1142
+ const span = vecSub(project(c3[0], c3[1]), start);
1143
+ const p2 = vecAdd(start, vecScale(span, .5));
1144
+ const p4 = vecAdd(vecAdd(start, vecScale(span, .75)), vecScale([-span[1], span[0]], .25));
1145
+ return clonePositions([
1146
+ c1,
1147
+ unproject(p2[0], p2[1]),
1148
+ c3,
1149
+ unproject(p4[0], p4[1])
1150
+ ]);
1151
+ }
1152
+ const derived = clonePositions(points.slice(0, 4));
1153
+ if (derived.length < 3) return derived;
1154
+ const [c1, c2, c3] = derived;
1155
+ const p1 = project(c1[0], c1[1]);
1156
+ const p2 = project(c2[0], c2[1]);
1157
+ const straight = vecSub(p2, p1);
1158
+ if (vecMag(straight) === 0) return derived;
1159
+ const diameter = vecMag(vecSub(project(c3[0], c3[1]), p2));
1160
+ const anchor = vecAdd(p2, vecScale(vecNorm(straight), diameter));
1161
+ derived[2] = unproject(anchor[0], anchor[1]);
1162
+ return derived;
1163
+ }
1164
+ /**
1165
+ * The snapped PT. 4 for a semicircle spanning PT. 2 → PT. 3, in projected
1166
+ * meters. PT. 4 is the top of the selected semicircle, not a free point on its
1167
+ * circumference, so crossing the diameter flips which side holds the arc.
1168
+ * Returns `null` for a degenerate (zero-length) diameter.
1169
+ */
1170
+ function orientationPoint(p2, p3, p4) {
1171
+ const diameter = vecSub(p3, p2);
1172
+ if (diameter[0] === 0 && diameter[1] === 0) return null;
1173
+ const apex = vecAdd(midpoint(p2, p3), vecScale([-diameter[1], diameter[0]], quarterArcSide(p2, p3, p4) / 2));
1174
+ return unproject(apex[0], apex[1]);
1175
+ }
1176
+ function snapOrientationToArc(points) {
1177
+ if (points.length < 4) return points;
1178
+ const snapped = orientationPoint(project(points[1][0], points[1][1]), project(points[2][0], points[2][1]), project(points[3][0], points[3][1]));
1179
+ if (snapped) points[3] = snapped;
1180
+ return points;
1181
+ }
1182
+ /** Line31 anchors for Envelopment; PT. 3 is constrained parallel to PT. 1 → PT. 2. */
1183
+ const line31DrawRule = {
1184
+ id: "line31:envelopment",
1185
+ minimumUserPoints: 2,
1186
+ minimumPreviewPoints: 2,
1187
+ canonicalPointCount: 4,
1188
+ derive: derive$5,
1189
+ transform(event) {
1190
+ const { activePointIndex, next, previous } = event;
1191
+ if (next.length < 4) return derive$5(next);
1192
+ if (activePointIndex === 1) {
1193
+ const points = clonePositions(next.slice(0, 4));
1194
+ const p1 = project(points[0][0], points[0][1]);
1195
+ const p2 = project(points[1][0], points[1][1]);
1196
+ const p3 = project(points[2][0], points[2][1]);
1197
+ const p4 = project(points[3][0], points[3][1]);
1198
+ const span = vecSub(p3, p1);
1199
+ const lengthSquared = vecDot(span, span);
1200
+ if (lengthSquared === 0) return points;
1201
+ const slid = vecAdd(p1, vecScale(span, Math.min(1, Math.max(0, vecDot(vecSub(p2, p1), span) / lengthSquared))));
1202
+ points[1] = unproject(slid[0], slid[1]);
1203
+ const snapped = orientationPoint(slid, p3, p4);
1204
+ if (snapped) points[3] = snapped;
1205
+ return points;
1206
+ }
1207
+ if (activePointIndex === 3) return snapOrientationToArc(clonePositions(next.slice(0, 4)));
1208
+ if ((activePointIndex === 0 || activePointIndex === 2) && previous.length >= 4) {
1209
+ const oldP1 = project(previous[0][0], previous[0][1]);
1210
+ const oldP2 = project(previous[1][0], previous[1][1]);
1211
+ const oldSpan = vecMag(vecSub(project(previous[2][0], previous[2][1]), oldP1));
1212
+ const straightRatio = oldSpan === 0 ? .5 : vecMag(vecSub(oldP2, oldP1)) / oldSpan;
1213
+ const points = clonePositions(next.slice(0, 4));
1214
+ const p1 = project(points[0][0], points[0][1]);
1215
+ const p3 = project(points[2][0], points[2][1]);
1216
+ const p4 = project(points[3][0], points[3][1]);
1217
+ const slid = vecAdd(p1, vecScale(vecSub(p3, p1), straightRatio));
1218
+ points[1] = unproject(slid[0], slid[1]);
1219
+ const snapped = orientationPoint(slid, p3, p4);
1220
+ if (snapped) points[3] = snapped;
1221
+ return points;
1222
+ }
1223
+ return snapOrientationToArc(derive$5(next));
1224
+ }
1225
+ };
1226
+ //#endregion
1227
+ //#region src/draw-rules/line32.ts
1228
+ function derive$4(points) {
1229
+ if (points.length === 2) {
1230
+ const [c1, c3] = points;
1231
+ const p2 = midpoint(project(c1[0], c1[1]), project(c3[0], c3[1]));
1232
+ return clonePositions([
1233
+ c1,
1234
+ unproject(p2[0], p2[1]),
1235
+ c3
1236
+ ]);
1237
+ }
1238
+ return clonePositions(points.slice(0, 3));
1239
+ }
1240
+ /** Line32 anchors for the two-click Infiltration mission task. */
1241
+ const line32DrawRule = {
1242
+ id: "line32:infiltration",
1243
+ minimumUserPoints: 2,
1244
+ minimumPreviewPoints: 2,
1245
+ canonicalPointCount: 3,
1246
+ hiddenControlPointIndices: [1],
1247
+ derive: derive$4,
1248
+ transform(event) {
1249
+ const { activePointIndex, next } = event;
1250
+ if (next.length >= 3 && (activePointIndex === 0 || activePointIndex === 2)) return derive$4([next[0], next[2]]);
1251
+ return derive$4(next);
1252
+ }
1253
+ };
1254
+ //#endregion
1137
1255
  //#region src/draw-rules/area8.ts
1138
1256
  function derive$3(points) {
1139
1257
  if (points.length < 2) return clonePositions(points);
@@ -10381,6 +10499,299 @@ const DISRUPT_MISSION_TASK = defineControlMeasure({
10381
10499
  previewSample: { controlPoints: [[0, .4], [0, -.4]] }
10382
10500
  });
10383
10501
  //#endregion
10502
+ //#region src/generators/cm34-mission-tasks/envelopment.ts
10503
+ const DEFAULT_ENVELOPMENT_OPTIONS = {
10504
+ arrowheadLengthRatio: .1,
10505
+ arrowheadWidthRatio: .12,
10506
+ labelPosition: .6,
10507
+ labelGapRatio: .18,
10508
+ resolution: 64
10509
+ };
10510
+ const ENVELOPMENT_METADATA = {
10511
+ id: "envelopment",
10512
+ name: "Envelopment",
10513
+ description: "A form of maneuver in which an attacking force avoids an enemy’s principal defense by attacking along an assailable flank.",
10514
+ entity: "Mission Tasks",
10515
+ entityType: "Envelopment",
10516
+ value: "343500",
10517
+ minCoordinates: 4,
10518
+ maxCoordinates: 4,
10519
+ geometry: "line",
10520
+ geometryTypes: ["MultiLineString", "Point"],
10521
+ paints: {
10522
+ stroke: true,
10523
+ fill: "none",
10524
+ text: true
10525
+ },
10526
+ drawRule: "Line31",
10527
+ capturesLabelSize: true,
10528
+ params: [
10529
+ {
10530
+ key: "arrowheadLengthRatio",
10531
+ presentationTier: "advanced",
10532
+ label: "Arrowhead length",
10533
+ description: "Arrowhead length as a ratio of the arc diameter",
10534
+ type: "number",
10535
+ min: .01,
10536
+ max: .5,
10537
+ step: .01
10538
+ },
10539
+ {
10540
+ key: "arrowheadWidthRatio",
10541
+ presentationTier: "advanced",
10542
+ label: "Arrowhead width",
10543
+ description: "Arrowhead width as a ratio of the arc diameter",
10544
+ type: "number",
10545
+ min: .01,
10546
+ max: .5,
10547
+ step: .01
10548
+ },
10549
+ {
10550
+ key: "labelPosition",
10551
+ presentationTier: "advanced",
10552
+ label: "Label position",
10553
+ description: "Position of the E label along the straight portion",
10554
+ type: "number",
10555
+ min: 0,
10556
+ max: 1,
10557
+ step: .01
10558
+ },
10559
+ {
10560
+ key: "labelGapRatio",
10561
+ presentationTier: "advanced",
10562
+ label: "Label gap",
10563
+ description: "Size of the straight-line cutout holding the E label",
10564
+ type: "number",
10565
+ min: 0,
10566
+ max: 1,
10567
+ step: .01
10568
+ },
10569
+ ...ARC_RESOLUTION_PARAMS
10570
+ ]
10571
+ };
10572
+ /** Generates the Envelopment mission task symbol (343500). */
10573
+ function createEnvelopment(coordinates, options = {}) {
10574
+ const [c1, c2, c3, c4] = coordinates;
10575
+ const p1 = project(c1[0], c1[1]);
10576
+ const p2 = project(c2[0], c2[1]);
10577
+ const diameterAnchor = project(c3[0], c3[1]);
10578
+ const p4 = project(c4[0], c4[1]);
10579
+ const straight = vecSub(p2, p1);
10580
+ const straightLength = vecMag(straight);
10581
+ const diameter = vecMag(vecSub(diameterAnchor, p2));
10582
+ if (straightLength < 1e-6 || diameter < 1e-6) return {
10583
+ type: "FeatureCollection",
10584
+ features: []
10585
+ };
10586
+ const straightDirection = vecNorm(straight);
10587
+ const p3 = vecAdd(p2, vecScale(straightDirection, diameter));
10588
+ const labelPoint = vecAdd(p1, vecScale(straight, clamp01(options.labelPosition ?? DEFAULT_ENVELOPMENT_OPTIONS.labelPosition)));
10589
+ const gapHalf = straightLength * clamp01(options.labelGapRatio ?? DEFAULT_ENVELOPMENT_OPTIONS.labelGapRatio) / 2;
10590
+ const gapStart = vecAdd(labelPoint, vecScale(straightDirection, -gapHalf));
10591
+ const gapEnd = vecAdd(labelPoint, vecScale(straightDirection, gapHalf));
10592
+ const center = midpoint(p2, p3);
10593
+ const startRadius = vecSub(p2, center);
10594
+ let bulgeRadius = [-startRadius[1], startRadius[0]];
10595
+ if (vecDot(vecSub(p4, center), bulgeRadius) < 0) bulgeRadius = vecScale(bulgeRadius, -1);
10596
+ const arc = sampleProjectedArc(center, startRadius, bulgeRadius, 0, Math.PI, normalizeArcResolution(options.resolution) / 2);
10597
+ const arrowhead = createArrowHead$1(p3, vecNorm(vecScale(bulgeRadius, -1)), diameter * Math.max(0, options.arrowheadLengthRatio ?? DEFAULT_ENVELOPMENT_OPTIONS.arrowheadLengthRatio), diameter * Math.max(0, options.arrowheadWidthRatio ?? DEFAULT_ENVELOPMENT_OPTIONS.arrowheadWidthRatio));
10598
+ return {
10599
+ type: "FeatureCollection",
10600
+ features: [{
10601
+ type: "Feature",
10602
+ properties: { part: "envelopment" },
10603
+ geometry: {
10604
+ type: "MultiLineString",
10605
+ coordinates: [
10606
+ [c1, unproject(gapStart[0], gapStart[1])],
10607
+ [unproject(gapEnd[0], gapEnd[1]), c2],
10608
+ arc,
10609
+ arrowhead
10610
+ ]
10611
+ }
10612
+ }, createLabelFeature(labelPoint, "E", labelRotationAlong(straightDirection), options)]
10613
+ };
10614
+ }
10615
+ const ENVELOPMENT = defineControlMeasure({
10616
+ metadata: ENVELOPMENT_METADATA,
10617
+ generator: createEnvelopment,
10618
+ defaultOptions: DEFAULT_ENVELOPMENT_OPTIONS,
10619
+ rule: line31DrawRule,
10620
+ previewSample: {
10621
+ controlPoints: [
10622
+ [-.9, -.25],
10623
+ [-.15, -.25],
10624
+ [.85, -.25],
10625
+ [.35, .45]
10626
+ ],
10627
+ options: { labelSize: 100 }
10628
+ }
10629
+ });
10630
+ //#endregion
10631
+ //#region src/generators/cm34-mission-tasks/infiltration.ts
10632
+ const DEFAULT_INFILTRATION_OPTIONS = {
10633
+ arrowheadLengthRatio: .1,
10634
+ arrowheadWidthRatio: .1,
10635
+ labelPosition: .6,
10636
+ labelGapRatio: .24,
10637
+ resolution: 64
10638
+ };
10639
+ const INFILTRATION_METADATA = {
10640
+ id: "infiltration",
10641
+ name: "Infiltration",
10642
+ description: "Moves forces through or into an area occupied by enemy forces without detection.",
10643
+ entity: "Mission Tasks",
10644
+ entityType: "Infiltration",
10645
+ value: "343800",
10646
+ minCoordinates: 3,
10647
+ maxCoordinates: 3,
10648
+ geometry: "line",
10649
+ geometryTypes: ["MultiLineString", "Point"],
10650
+ paints: {
10651
+ stroke: true,
10652
+ fill: "none",
10653
+ text: true
10654
+ },
10655
+ drawRule: "Line32",
10656
+ capturesLabelSize: true,
10657
+ params: [
10658
+ {
10659
+ key: "arrowheadLengthRatio",
10660
+ presentationTier: "advanced",
10661
+ label: "Arrowhead length",
10662
+ description: "Arrowhead length as a ratio of the Point 1–Point 3 span",
10663
+ type: "number",
10664
+ min: .01,
10665
+ max: .5,
10666
+ step: .01
10667
+ },
10668
+ {
10669
+ key: "arrowheadWidthRatio",
10670
+ presentationTier: "advanced",
10671
+ label: "Arrowhead width",
10672
+ description: "Arrowhead width as a ratio of the Point 1–Point 3 span",
10673
+ type: "number",
10674
+ min: .01,
10675
+ max: .5,
10676
+ step: .01
10677
+ },
10678
+ {
10679
+ key: "labelPosition",
10680
+ presentationTier: "advanced",
10681
+ label: "Label position",
10682
+ description: "Position of the IN label along the initial straight portion",
10683
+ type: "number",
10684
+ min: 0,
10685
+ max: 1,
10686
+ step: .01
10687
+ },
10688
+ {
10689
+ key: "labelGapRatio",
10690
+ presentationTier: "advanced",
10691
+ label: "Label gap",
10692
+ description: "Size of the initial-line cutout holding the IN label",
10693
+ type: "number",
10694
+ min: 0,
10695
+ max: 1,
10696
+ step: .01
10697
+ },
10698
+ ...ARC_RESOLUTION_PARAMS
10699
+ ]
10700
+ };
10701
+ const CENTERED_BEND_SINE = 2 * .1;
10702
+ const CENTERED_BEND_COSINE = Math.sqrt(1 - CENTERED_BEND_SINE * CENTERED_BEND_SINE);
10703
+ /**
10704
+ * Resolves the common tangent direction of the two Line32 quarter-circles.
10705
+ * For the doctrinal construction, PT. 1 and PT. 3 lie on parallel tangents on
10706
+ * opposite sides of PT. 2. Their midpoint offset from PT. 2 therefore lies on
10707
+ * that tangent axis. For a derived, centered PT. 2 the axis is mathematically
10708
+ * underdetermined, so a proportional doctrinal bend resolves it.
10709
+ */
10710
+ function tangentDirection(p1, p2, p3) {
10711
+ const axis = vecSub(vecScale(p2, 2), vecAdd(p1, p3));
10712
+ const span = vecSub(p3, p1);
10713
+ const spanLength = vecMag(span);
10714
+ let direction;
10715
+ if (vecMag(axis) < spanLength * .02) {
10716
+ const chord = vecNorm(span);
10717
+ direction = [chord[0] * CENTERED_BEND_COSINE - chord[1] * CENTERED_BEND_SINE, chord[0] * CENTERED_BEND_SINE + chord[1] * CENTERED_BEND_COSINE];
10718
+ } else direction = vecNorm(axis);
10719
+ if (vecDot(direction, span) < 0) direction = vecScale(direction, -1);
10720
+ return direction;
10721
+ }
10722
+ /** Generates the Infiltration mission task symbol (343800). */
10723
+ function createInfiltration(coordinates, options = {}) {
10724
+ const [c1, c2, c3] = coordinates;
10725
+ const p1 = project(c1[0], c1[1]);
10726
+ const p2 = project(c2[0], c2[1]);
10727
+ const p3 = project(c3[0], c3[1]);
10728
+ const spanLength = vecMag(vecSub(p3, p1));
10729
+ if (spanLength < 1e-6) return {
10730
+ type: "FeatureCollection",
10731
+ features: []
10732
+ };
10733
+ const along = tangentDirection(p1, p2, p3);
10734
+ const normal = [-along[1], along[0]];
10735
+ const signedRadius = vecDot(vecSub(p1, p2), normal);
10736
+ const radius = Math.abs(signedRadius);
10737
+ if (radius < 1e-6) return {
10738
+ type: "FeatureCollection",
10739
+ features: []
10740
+ };
10741
+ const sideRadius = vecScale(normal, (signedRadius < 0 ? -1 : 1) * radius);
10742
+ const alongRadius = vecScale(along, radius);
10743
+ const firstCenter = vecSub(p2, alongRadius);
10744
+ const arcStart = vecAdd(firstCenter, sideRadius);
10745
+ const secondCenter = vecAdd(p2, alongRadius);
10746
+ const arcEnd = vecSub(secondCenter, sideRadius);
10747
+ const straight = vecSub(arcStart, p1);
10748
+ const straightLength = vecMag(straight);
10749
+ if (straightLength < 1e-6) return {
10750
+ type: "FeatureCollection",
10751
+ features: []
10752
+ };
10753
+ const arcResolution = normalizeArcResolution(options.resolution) / 2;
10754
+ const firstArc = sampleProjectedArc(firstCenter, sideRadius, alongRadius, 0, Math.PI / 2, arcResolution);
10755
+ const secondArc = sampleProjectedArc(secondCenter, vecScale(alongRadius, -1), vecScale(sideRadius, -1), 0, Math.PI / 2, arcResolution);
10756
+ const labelPoint = vecAdd(p1, vecScale(straight, clamp01(options.labelPosition ?? DEFAULT_INFILTRATION_OPTIONS.labelPosition)));
10757
+ const gapHalf = straightLength * clamp01(options.labelGapRatio ?? DEFAULT_INFILTRATION_OPTIONS.labelGapRatio) / 2;
10758
+ const gapStart = vecAdd(labelPoint, vecScale(along, -gapHalf));
10759
+ const gapEnd = vecAdd(labelPoint, vecScale(along, gapHalf));
10760
+ const arrowhead = createArrowHead$1(p3, along, spanLength * Math.max(0, options.arrowheadLengthRatio ?? DEFAULT_INFILTRATION_OPTIONS.arrowheadLengthRatio), spanLength * Math.max(0, options.arrowheadWidthRatio ?? DEFAULT_INFILTRATION_OPTIONS.arrowheadWidthRatio));
10761
+ return {
10762
+ type: "FeatureCollection",
10763
+ features: [{
10764
+ type: "Feature",
10765
+ properties: { part: "infiltration" },
10766
+ geometry: {
10767
+ type: "MultiLineString",
10768
+ coordinates: [
10769
+ [c1, unproject(gapStart[0], gapStart[1])],
10770
+ [unproject(gapEnd[0], gapEnd[1]), unproject(arcStart[0], arcStart[1])],
10771
+ firstArc,
10772
+ secondArc,
10773
+ [unproject(arcEnd[0], arcEnd[1]), c3],
10774
+ arrowhead
10775
+ ]
10776
+ }
10777
+ }, createLabelFeature(labelPoint, "IN", labelRotationAlong(along), options)]
10778
+ };
10779
+ }
10780
+ const INFILTRATION = defineControlMeasure({
10781
+ metadata: INFILTRATION_METADATA,
10782
+ generator: createInfiltration,
10783
+ defaultOptions: DEFAULT_INFILTRATION_OPTIONS,
10784
+ rule: line32DrawRule,
10785
+ previewSample: {
10786
+ controlPoints: [
10787
+ [-.9, .25],
10788
+ [-.05, 0],
10789
+ [.9, -.25]
10790
+ ],
10791
+ options: { labelSize: 100 }
10792
+ }
10793
+ });
10794
+ //#endregion
10384
10795
  //#region src/generators/cm34-mission-tasks/guard.ts
10385
10796
  const DEFAULT_GUARD_OPTIONS = DEFAULT_SECURITY_TASK_OPTIONS;
10386
10797
  const GUARD_METADATA = {
@@ -16226,6 +16637,8 @@ const DEFINITIONS = {
16226
16637
  delay: DELAY,
16227
16638
  disengage: DISENGAGE,
16228
16639
  "disrupt-mission-task": DISRUPT_MISSION_TASK,
16640
+ envelopment: ENVELOPMENT,
16641
+ infiltration: INFILTRATION,
16229
16642
  guard: GUARD,
16230
16643
  isolate: ISOLATE,
16231
16644
  penetrate: PENETRATE,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orbat-mapper/control-measures",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
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",