@orbat-mapper/control-measures 0.9.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", "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">>;
@@ -2754,6 +2788,10 @@ declare const DEFAULT_BLOCK_OPTIONS: BlockOptions;
2754
2788
  */
2755
2789
  declare function createBlock(coordinates: Position[], _options?: BlockOptions): FeatureCollection<LineString>;
2756
2790
  //#endregion
2791
+ //#region src/generators/cm27-protection-areas/bridge-or-gap.d.ts
2792
+ type BridgeOrGapOptions = LabelSizeOptions;
2793
+ declare function createBridgeOrGap(coordinates: Position[], options?: BridgeOrGapOptions, textAmplifiers?: CanonicalTextAmplifiers): FeatureCollection<LineString | Point>;
2794
+ //#endregion
2757
2795
  //#region src/generators/cm27-protection-areas/disrupt.d.ts
2758
2796
  interface DisruptOptions {
2759
2797
  middleArrowLengthRatio?: number;
@@ -3017,6 +3055,8 @@ declare const DEFINITIONS: {
3017
3055
  delay: ControlMeasureDefinition<"delay", typeof createDelaySymbol>;
3018
3056
  disengage: ControlMeasureDefinition<"disengage", typeof createDisengageSymbol>;
3019
3057
  "disrupt-mission-task": ControlMeasureDefinition<"disrupt-mission-task", typeof createDisruptMissionTaskSymbol>;
3058
+ envelopment: ControlMeasureDefinition<"envelopment", typeof createEnvelopment>;
3059
+ infiltration: ControlMeasureDefinition<"infiltration", typeof createInfiltration>;
3020
3060
  guard: ControlMeasureDefinition<"guard", typeof createGuardSymbol>;
3021
3061
  isolate: ControlMeasureDefinition<"isolate", typeof createIsolateSymbol>;
3022
3062
  penetrate: ControlMeasureDefinition<"penetrate", typeof createPenetrateSymbol>;
@@ -3034,6 +3074,7 @@ declare const DEFINITIONS: {
3034
3074
  "frontal-attack": ControlMeasureDefinition<"frontal-attack", typeof createFrontalAttack>;
3035
3075
  "turning-movement": ControlMeasureDefinition<"turning-movement", typeof createTurningMovement>;
3036
3076
  block: ControlMeasureDefinition<"block", typeof createBlock>;
3077
+ "bridge-or-gap": ControlMeasureDefinition<"bridge-or-gap", typeof createBridgeOrGap>;
3037
3078
  disrupt: ControlMeasureDefinition<"disrupt", typeof createDisrupt>;
3038
3079
  fix: ControlMeasureDefinition<"fix", typeof createFix>;
3039
3080
  "fix-mission-task": ControlMeasureDefinition<"fix-mission-task", typeof createFixMissionTaskSymbol>;
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-nz-U5HlG.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-D9mfP_gv.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-nz-U5HlG.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-D9mfP_gv.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}. */
@@ -214,6 +214,9 @@ function vecNorm(v) {
214
214
  const m = vecMag(v);
215
215
  return m === 0 ? [0, 0] : [v[0] / m, v[1] / m];
216
216
  }
217
+ function midpoint(a, b) {
218
+ return vecScale(vecAdd(a, b), .5);
219
+ }
217
220
  function pointToPointDistance(p1, p2) {
218
221
  const dx = p2[0] - p1[0];
219
222
  const dy = p2[1] - p1[1];
@@ -560,7 +563,7 @@ function samePosition(a, b) {
560
563
  }
561
564
  //#endregion
562
565
  //#region src/draw-rules/area1.ts
563
- function derive$12(points) {
566
+ function derive$14(points) {
564
567
  return clonePositions(points);
565
568
  }
566
569
  /**
@@ -580,9 +583,9 @@ const area1DrawRule = {
580
583
  id: "area1",
581
584
  minimumUserPoints: 3,
582
585
  closedRing: true,
583
- derive: derive$12,
586
+ derive: derive$14,
584
587
  transform(event) {
585
- return derive$12(event.next);
588
+ return derive$14(event.next);
586
589
  }
587
590
  };
588
591
  //#endregion
@@ -622,14 +625,14 @@ const containDrawRule = createMidpointPerpendicularDrawRule({
622
625
  * that fixes both the radius and the bearing of the symbol's opening. Both
623
626
  * points are user-clicked, so the canonical array is just the (clamped) input.
624
627
  */
625
- function derive$11(points) {
628
+ function derive$13(points) {
626
629
  return clonePositions(points.slice(0, 2));
627
630
  }
628
631
  const centerRadiusDrawRule = {
629
632
  id: "area15:center-radius",
630
633
  minimumUserPoints: 2,
631
634
  canonicalPointCount: 2,
632
- derive: derive$11,
635
+ derive: derive$13,
633
636
  transform(event) {
634
637
  const { previous, next, activePointIndex } = event;
635
638
  if (activePointIndex === 0 && previous.length >= 2 && next.length >= 2) {
@@ -638,7 +641,7 @@ const centerRadiusDrawRule = {
638
641
  const origin = previous[1];
639
642
  return [clonePosition(next[0]), [origin[0] + dx, origin[1] + dy]];
640
643
  }
641
- return derive$11(next);
644
+ return derive$13(next);
642
645
  }
643
646
  };
644
647
  /** Backward-compatible doctrinal name for Area15's shared center-radius rule. */
@@ -702,16 +705,16 @@ const point12DrawRule = createMidpointPerpendicularDrawRule({ id: "point12:obsta
702
705
  * Point1 — a single anchor point (e.g. Text's center). One user click commits
703
706
  * the measure; dragging the point simply translates it.
704
707
  */
705
- function derive$10(points) {
708
+ function derive$12(points) {
706
709
  return clonePositions(points.slice(0, 1));
707
710
  }
708
711
  const pointDrawRule = {
709
712
  id: "point1:anchor",
710
713
  minimumUserPoints: 1,
711
714
  canonicalPointCount: 1,
712
- derive: derive$10,
715
+ derive: derive$12,
713
716
  transform(event) {
714
- return derive$10(event.next);
717
+ return derive$12(event.next);
715
718
  }
716
719
  };
717
720
  //#endregion
@@ -738,10 +741,10 @@ const SECTOR_ANGLE_SNAP_RADIANS = Math.PI / 36;
738
741
  * independently control a radius and a true-north azimuth. Dragging the anchor
739
742
  * translates both edge points so the sector retains its size and orientation.
740
743
  */
741
- function derive$9(points) {
744
+ function derive$11(points) {
742
745
  return clonePositions(points.slice(0, 3));
743
746
  }
744
- function guidePoints$1(points) {
747
+ function guidePoints$2(points) {
745
748
  return points.length < 3 ? clonePositions(points) : [];
746
749
  }
747
750
  /** Snap one radial Sector handle to a true-north angular increment. */
@@ -764,9 +767,9 @@ const sectorDrawRule = {
764
767
  minimumUserPoints: 3,
765
768
  canonicalPointCount: 3,
766
769
  showGuide: true,
767
- guidePoints: guidePoints$1,
770
+ guidePoints: guidePoints$2,
768
771
  constrainAngles,
769
- derive: derive$9,
772
+ derive: derive$11,
770
773
  transform(event) {
771
774
  const { previous, next, activePointIndex } = event;
772
775
  if (activePointIndex === 0 && previous.length >= 3 && next.length >= 3) {
@@ -778,7 +781,7 @@ const sectorDrawRule = {
778
781
  [previous[2][0] + dx, previous[2][1] + dy]
779
782
  ];
780
783
  }
781
- return derive$9(next);
784
+ return derive$11(next);
782
785
  }
783
786
  };
784
787
  //#endregion
@@ -833,20 +836,20 @@ const ambushDrawRule = createMidpointPerpendicularDrawRule({
833
836
  });
834
837
  //#endregion
835
838
  //#region src/draw-rules/line1.ts
836
- function derive$8(points) {
839
+ function derive$10(points) {
837
840
  return clonePositions(points);
838
841
  }
839
842
  const line1DrawRule = {
840
843
  id: "line1",
841
844
  minimumUserPoints: 2,
842
- derive: derive$8,
845
+ derive: derive$10,
843
846
  transform(event) {
844
- return derive$8(event.next);
847
+ return derive$10(event.next);
845
848
  }
846
849
  };
847
850
  //#endregion
848
851
  //#region src/draw-rules/line3.ts
849
- function derive$7(points) {
852
+ function derive$9(points) {
850
853
  return clonePositions(points);
851
854
  }
852
855
  /**
@@ -861,23 +864,23 @@ const line3DrawRule = {
861
864
  id: "line3",
862
865
  minimumUserPoints: 3,
863
866
  canonicalPointCount: 3,
864
- derive: derive$7,
867
+ derive: derive$9,
865
868
  transform(event) {
866
- return derive$7(event.next);
869
+ return derive$9(event.next);
867
870
  }
868
871
  };
869
872
  //#endregion
870
873
  //#region src/draw-rules/line9.ts
871
- function derive$6(points) {
874
+ function derive$8(points) {
872
875
  return clonePositions(points);
873
876
  }
874
877
  const line9DrawRule = {
875
878
  id: "line9",
876
879
  minimumUserPoints: 2,
877
880
  canonicalPointCount: 2,
878
- derive: derive$6,
881
+ derive: derive$8,
879
882
  transform(event) {
880
- return derive$6(event.next);
883
+ return derive$8(event.next);
881
884
  }
882
885
  };
883
886
  //#endregion
@@ -952,6 +955,28 @@ const turnDrawRule = {
952
955
  }
953
956
  };
954
957
  //#endregion
958
+ //#region src/draw-rules/line11.ts
959
+ function firstFour(points) {
960
+ return clonePositions(points.slice(0, 4));
961
+ }
962
+ function guidePoints$1(points) {
963
+ if (points.length <= 2) return clonePositions(points);
964
+ if (points.length === 3) return [];
965
+ return clonePositions(points.slice(2, 4));
966
+ }
967
+ /** Line11 — four independent anchors defining the two sides of a bridge or gap. */
968
+ const bridgeOrGapDrawRule = {
969
+ id: "line11:bridge-or-gap",
970
+ minimumUserPoints: 4,
971
+ canonicalPointCount: 4,
972
+ showGuide: true,
973
+ guidePoints: guidePoints$1,
974
+ derive: firstFour,
975
+ transform(event) {
976
+ return firstFour(event.next);
977
+ }
978
+ };
979
+ //#endregion
955
980
  //#region src/draw-rules/line23.ts
956
981
  /**
957
982
  * Line23 anchor draw rule for the Clear mission task.
@@ -984,7 +1009,7 @@ const line24DrawRule = createMidpointPerpendicularDrawRule({
984
1009
  });
985
1010
  //#endregion
986
1011
  //#region src/draw-rules/line26.ts
987
- function derive$5(points) {
1012
+ function derive$7(points) {
988
1013
  if (points.length === 2) {
989
1014
  const [p1, p2] = points;
990
1015
  const dx = p2[0] - p1[0];
@@ -1023,9 +1048,9 @@ const line26DrawRule = {
1023
1048
  minimumUserPoints: 4,
1024
1049
  minimumPreviewPoints: 2,
1025
1050
  canonicalPointCount: 4,
1026
- derive: derive$5,
1051
+ derive: derive$7,
1027
1052
  transform(event) {
1028
- return derive$5(event.next);
1053
+ return derive$7(event.next);
1029
1054
  }
1030
1055
  };
1031
1056
  //#endregion
@@ -1038,7 +1063,7 @@ function deriveArcPoint(p1, p2, p4) {
1038
1063
  if (!arc) return [(p2[0] + p4[0]) / 2, (p2[1] + p4[1]) / 2];
1039
1064
  return unproject(arc.midpoint[0], arc.midpoint[1]);
1040
1065
  }
1041
- function derive$4(points) {
1066
+ function derive$6(points) {
1042
1067
  if (points.length < 2) return clonePositions(points);
1043
1068
  const [p1, p2] = points;
1044
1069
  if (points.length === 2) {
@@ -1077,7 +1102,7 @@ const line27DrawRule = {
1077
1102
  minimumUserPoints: 3,
1078
1103
  minimumPreviewPoints: 2,
1079
1104
  canonicalPointCount: 4,
1080
- derive: derive$4,
1105
+ derive: derive$6,
1081
1106
  transform(event) {
1082
1107
  const { previous, next, activePointIndex } = event;
1083
1108
  if (activePointIndex === 0 && previous.length >= 4 && next.length >= 4) {
@@ -1109,6 +1134,124 @@ const line27DrawRule = {
1109
1134
  }
1110
1135
  };
1111
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
1112
1255
  //#region src/draw-rules/area8.ts
1113
1256
  function derive$3(points) {
1114
1257
  if (points.length < 2) return clonePositions(points);
@@ -6402,6 +6545,167 @@ const BLOCK = defineControlMeasure({
6402
6545
  previewSample: { controlPoints: [[0, .4], [0, -.4]] }
6403
6546
  });
6404
6547
  //#endregion
6548
+ //#region src/generators/cm27-protection-areas/bridge-or-gap.ts
6549
+ const FLARE_COMPONENT_RATIO = .25;
6550
+ const DEFAULT_BRIDGE_OR_GAP_OPTIONS = {};
6551
+ const BRIDGE_OR_GAP_METADATA = {
6552
+ id: "bridge-or-gap",
6553
+ name: "Bridge or Gap",
6554
+ description: "An area within a minefield or obstacle belt, free of live mines or obstacles, whose width and direction allow a friendly force to pass through in tactical formation.",
6555
+ entity: "Protection Areas",
6556
+ entityType: "Bridge or Gap",
6557
+ value: "271100",
6558
+ minCoordinates: 4,
6559
+ maxCoordinates: 4,
6560
+ geometry: "line",
6561
+ geometryTypes: ["LineString", "Point"],
6562
+ paints: {
6563
+ stroke: true,
6564
+ fill: "none",
6565
+ text: true
6566
+ },
6567
+ drawRule: "Line11",
6568
+ capturesLabelSize: true,
6569
+ textAmplifiers: [
6570
+ {
6571
+ key: "T",
6572
+ label: "Unique designation",
6573
+ description: "Field T — the bridge or gap's unique designation.",
6574
+ maxLength: 21
6575
+ },
6576
+ {
6577
+ key: "W",
6578
+ label: "Effective from (DTG)",
6579
+ description: "Field W — date-time group the bridge or gap becomes effective.",
6580
+ placeholder: "051030Z",
6581
+ maxLength: 16
6582
+ },
6583
+ {
6584
+ key: "W1",
6585
+ label: "Effective to (DTG)",
6586
+ description: "Field W1 — date-time group the bridge or gap ceases to be effective.",
6587
+ placeholder: "051600Z",
6588
+ maxLength: 16
6589
+ }
6590
+ ]
6591
+ };
6592
+ /**
6593
+ * One side: its two anchors, plus a 45-degree flare at each end splaying away
6594
+ * from the gap. `outward` only picks which way the side's own perpendicular
6595
+ * points -- the flare stays square to this side, so both ends flare by the
6596
+ * same quarter-length in each axis.
6597
+ */
6598
+ function sideCoordinates(start, end, outward) {
6599
+ const side = vecSub(end, start);
6600
+ const length = vecMag(side);
6601
+ if (length < 1e-6) return void 0;
6602
+ const along = vecScale(side, 1 / length);
6603
+ const normal = [-along[1], along[0]];
6604
+ const component = length * FLARE_COMPONENT_RATIO;
6605
+ const flareOut = vecScale(normal, vecDot(normal, outward) >= 0 ? component : -component);
6606
+ return {
6607
+ coordinates: [
6608
+ vecAdd(vecAdd(start, vecScale(along, -component)), flareOut),
6609
+ start,
6610
+ end,
6611
+ vecAdd(vecAdd(end, vecScale(along, component)), flareOut)
6612
+ ].map((point) => unproject(point[0], point[1])),
6613
+ along,
6614
+ length
6615
+ };
6616
+ }
6617
+ function addLabels(features, frame, options, textAmplifiers) {
6618
+ const { points, side1, side2, across, center } = frame;
6619
+ const averageDirection = vecAdd(side1.along, side2.along);
6620
+ const along = vecMag(averageDirection) >= 1e-6 ? vecNorm(averageDirection) : side1.along;
6621
+ const sizeProps = labelSizeProps(options);
6622
+ const labels = [];
6623
+ if (textAmplifiers.T) pushLabel(labels, center, textAmplifiers.T, labelRotationAlong(along), sizeProps, void 0, "T");
6624
+ const row = [];
6625
+ if (textAmplifiers.W) row.push([
6626
+ "W",
6627
+ textAmplifiers.W,
6628
+ -1,
6629
+ "end"
6630
+ ]);
6631
+ if (textAmplifiers.W1) row.push([
6632
+ "W1",
6633
+ textAmplifiers.W1,
6634
+ 1,
6635
+ "start"
6636
+ ]);
6637
+ if (row.length > 0) {
6638
+ const averageLength = (side1.length + side2.length) / 2;
6639
+ const windowRotation = labelRotationAlong(across);
6640
+ const rowCenter = vecAdd(midpoint(points[1], points[3]), vecScale(along, averageLength * FLARE_COMPONENT_RATIO + resolveLabelOffsetMeters(options, 1)));
6641
+ const separatorOffset = resolveLabelOffsetMeters(options, .15);
6642
+ const paired = row.length === 2;
6643
+ for (const [field, text, sign, anchor] of row) pushLabel(labels, paired ? vecAdd(rowCenter, vecScale(across, sign * separatorOffset)) : rowCenter, text, windowRotation, sizeProps, paired ? anchor : void 0, field);
6644
+ }
6645
+ features.push(...labels);
6646
+ }
6647
+ function createBridgeOrGap(coordinates, options = {}, textAmplifiers = {}) {
6648
+ const points = coordinates.slice(0, 4).map((position) => project(position[0], position[1]));
6649
+ const [p1, p2, p3, p4] = points;
6650
+ const mid12 = midpoint(p1, p2);
6651
+ const mid34 = midpoint(p3, p4);
6652
+ const betweenMidpoints = vecSub(mid12, mid34);
6653
+ const outward1 = vecMag(betweenMidpoints) >= 1e-6 ? vecNorm(betweenMidpoints) : vecNorm([p1[1] - p2[1], p2[0] - p1[0]]);
6654
+ const outward2 = vecScale(outward1, -1);
6655
+ const side1 = sideCoordinates(p1, p2, outward1);
6656
+ const side2 = sideCoordinates(p3, p4, outward2);
6657
+ if (!side1 || !side2) return {
6658
+ type: "FeatureCollection",
6659
+ features: []
6660
+ };
6661
+ const features = [{
6662
+ type: "Feature",
6663
+ properties: { part: "side-1" },
6664
+ geometry: {
6665
+ type: "LineString",
6666
+ coordinates: side1.coordinates
6667
+ }
6668
+ }, {
6669
+ type: "Feature",
6670
+ properties: { part: "side-2" },
6671
+ geometry: {
6672
+ type: "LineString",
6673
+ coordinates: side2.coordinates
6674
+ }
6675
+ }];
6676
+ addLabels(features, {
6677
+ points,
6678
+ side1,
6679
+ side2,
6680
+ across: outward2,
6681
+ center: midpoint(mid12, mid34)
6682
+ }, options, textAmplifiers);
6683
+ return {
6684
+ type: "FeatureCollection",
6685
+ features
6686
+ };
6687
+ }
6688
+ const BRIDGE_OR_GAP = defineControlMeasure({
6689
+ metadata: BRIDGE_OR_GAP_METADATA,
6690
+ generator: createBridgeOrGap,
6691
+ defaultOptions: DEFAULT_BRIDGE_OR_GAP_OPTIONS,
6692
+ rule: bridgeOrGapDrawRule,
6693
+ previewSample: {
6694
+ controlPoints: [
6695
+ [-.35, -.7],
6696
+ [-.35, .45],
6697
+ [.35, -.7],
6698
+ [.35, .45]
6699
+ ],
6700
+ textAmplifiers: {
6701
+ T: "T",
6702
+ W: "W",
6703
+ W1: "W1"
6704
+ },
6705
+ options: { labelSize: 55 }
6706
+ }
6707
+ });
6708
+ //#endregion
6405
6709
  //#region src/generators/cm99-generic-arrows/blockArrow.ts
6406
6710
  const DEFAULT_SMOOTH_RESOLUTION$5 = 12;
6407
6711
  const MIN_SMOOTH_RESOLUTION$1 = 2;
@@ -10195,6 +10499,299 @@ const DISRUPT_MISSION_TASK = defineControlMeasure({
10195
10499
  previewSample: { controlPoints: [[0, .4], [0, -.4]] }
10196
10500
  });
10197
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
10198
10795
  //#region src/generators/cm34-mission-tasks/guard.ts
10199
10796
  const DEFAULT_GUARD_OPTIONS = DEFAULT_SECURITY_TASK_OPTIONS;
10200
10797
  const GUARD_METADATA = {
@@ -16040,6 +16637,8 @@ const DEFINITIONS = {
16040
16637
  delay: DELAY,
16041
16638
  disengage: DISENGAGE,
16042
16639
  "disrupt-mission-task": DISRUPT_MISSION_TASK,
16640
+ envelopment: ENVELOPMENT,
16641
+ infiltration: INFILTRATION,
16043
16642
  guard: GUARD,
16044
16643
  isolate: ISOLATE,
16045
16644
  penetrate: PENETRATE,
@@ -16076,6 +16675,7 @@ const DEFINITIONS = {
16076
16675
  }
16077
16676
  }),
16078
16677
  block: BLOCK,
16678
+ "bridge-or-gap": BRIDGE_OR_GAP,
16079
16679
  disrupt: DISRUPT,
16080
16680
  fix: FIX,
16081
16681
  "fix-mission-task": FIX_MISSION_TASK,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orbat-mapper/control-measures",
3
- "version": "0.9.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",