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

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.
@@ -145,6 +145,18 @@ type FriendlyKey = `${FriendlyName}${Suffix}`;
145
145
  * this is resolved to canonical form.
146
146
  */
147
147
  type TextAmplifiers = Partial<Record<TextAmplifierKey | FriendlyKey, string>>;
148
+ /**
149
+ * Stable key for a non-amplifier generated label. The renderer assigns these
150
+ * from the label's part and per-part label ordinal when a generator has not
151
+ * supplied a doctrinal field key. Generators that can change a label's order
152
+ * should supply an explicit `labelPlacementKey` instead.
153
+ */
154
+ type GeneratedLabelKey = `label:${string}`;
155
+ /**
156
+ * User-adjusted anchor positions for doctrinal and generated text labels,
157
+ * keyed by a canonical `TextAmplifierKey` or a synthesized `GeneratedLabelKey`.
158
+ */
159
+ type AmplifierPlacements = Record<string, Position | undefined>;
148
160
  /** Amplifier values resolved to canonical doctrinal keys, as generators receive them. */
149
161
  type CanonicalTextAmplifiers = Readonly<Partial<Record<TextAmplifierKey, string>>>;
150
162
  /**
@@ -2158,6 +2170,8 @@ interface ControlMeasure<K extends ControlMeasureKind = ControlMeasureKind> {
2158
2170
  properties?: Record<string, unknown>;
2159
2171
  /** Free-text amplifier fields (MIL-STD-2525E Appendix L Table L-II); see `./text-amplifiers`. */
2160
2172
  textAmplifiers?: TextAmplifiers;
2173
+ /** Optional user-adjusted anchors for independently rendered text amplifiers. */
2174
+ amplifierPlacements?: AmplifierPlacements;
2161
2175
  schemaVersion?: 1;
2162
2176
  }
2163
2177
  declare function isKind<K extends ControlMeasureKind>(cm: ControlMeasure, kind: K): cm is ControlMeasure<K>;
@@ -2216,6 +2230,10 @@ interface FeaturePartProps {
2216
2230
  * text begins at the point, `"end"` = it ends there. Absent = centered.
2217
2231
  */
2218
2232
  textAnchor?: "start" | "end";
2233
+ /** Canonical field key for a text-amplifier label that may be repositioned. */
2234
+ amplifierField?: TextAmplifierKey;
2235
+ /** Stable key used to persist a user-adjusted anchor for any rendered label. */
2236
+ labelPlacementKey?: string;
2219
2237
  /**
2220
2238
  * Screen-anchored label size in CSS pixels — held constant on screen
2221
2239
  * (ADR-0028). Mutually exclusive with `textSizeMeters`; absent both,
@@ -2549,4 +2567,4 @@ interface TacticalArrowOptions {
2549
2567
  */
2550
2568
  declare const DEFAULT_TACTICAL_ARROW_OPTIONS: Required<TacticalArrowOptions>;
2551
2569
  //#endregion
2552
- export { getControlMeasureMetadata as $, ControlMeasureMetadata as $n, DEFAULT_GENERIC_CIRCLE_OPTIONS as $t, getMetersPerPixel as A, EncirclementOptions as An, DEFAULT_CANALIZE_OPTIONS as At, ControlMeasureSnapshot as B, GenericC2LineOptions as Bn, HandoverLineOptions as Bt, snapToMidpointPerpendicular as C, DEFAULT_LANDING_ZONE_OPTIONS as Cn, AntitankDitchOptions as Ct, BaselineFrameOrigin as D, AssemblyAreaOptions as Dn, ClearOptions as Dt, BaselineFrameOptions as E, JointTacticalActionAreaOptions as En, DelayOptions as Et, resolveStyleHints as F, DEFAULT_STRONG_POINT_OPTIONS as Fn, BlockMissionTaskOptions as Ft, cloneControlMeasure as G, LabelSizeOptions as Gn, AttackByFireOptions as Gt, StyleHints as H, EngineerWorkLineOptions as Hn, PhaseLineOptions as Ht, freezeOrientationOptions as I, StrongPointOptions as In, DEFAULT_BLOCK_MISSION_TASK_OPTIONS as It, CONTROL_MEASURE_IDS as J, unproject as Jn, SupportByFireOptions as Jt, isKind as K, Point2D as Kn, DEFAULT_ATTACK_BY_FIRE_OPTIONS as Kt, RenderOptions as L, BattlePositionOptions as Ln, BattleHandoverLineOptions as Lt, SimpleStyleProps as M, FinalProtectiveFireOptions as Mn, DEFAULT_BYPASS_OPTIONS as Mt, SimpleStyleRender as N, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS as Nn, BreachOptions as Nt, createBaselineFrame as O, DEFAULT_ASSEMBLY_AREA_OPTIONS as On, DEFAULT_CLEAR_OPTIONS as Ot, toSimpleStyle as P, PrincipalDirectionOfFireOptions as Pn, DEFAULT_BREACH_OPTIONS as Pt, OptionsByKind as Q, ControlMeasureGeometryType as Qn, DEFAULT_AIRBORNE_ATTACK_OPTIONS as Qt, renderControlMeasure as R, DEFAULT_BATTLE_POSITION_OPTIONS as Rn, DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS as Rt, pointOnMidpointPerpendicularAxis as S, PickupZoneOptions as Sn, DEFAULT_ANTITANK_WALL_OPTIONS as St, BaselineFrameNormal as T, DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS as Tn, DEFAULT_DELAY_OPTIONS as Tt, controlMeasureIdFromFeature as U, DEFAULT_LIGHT_LINE_OPTIONS as Un, DEFAULT_FLOT_OPTIONS as Ut, FeaturePartProps as V, DEFAULT_ENGINEER_WORK_LINE_OPTIONS as Vn, DEFAULT_PHASE_LINE_OPTIONS as Vt, ControlMeasure as W, LightLineOptions as Wn, FLOTOptions as Wt, ControlMeasureId as X, DEFAULT_BOUNDARY_OPTIONS as Xn, DEFAULT_ATTACK_HELICOPTER_OPTIONS as Xt, CONTROL_MEASURE_METADATA as Y, BoundaryOptions as Yn, AttackHelicopterOptions as Yt, ControlMeasureKind as Z, ControlMeasureGeometry as Zn, AirborneAttackOptions as Zt, blockDrawRule as _, calculateMetrics as _n, DEFAULT_FORTIFIED_AREA_OPTIONS as _t, rectangleDrawRule as a, DEFAULT_GENERIC_LINE_OPTIONS as an, TextAmplifierKey as ar, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS as at, createMidpointPerpendicularDrawRule as b, DEFAULT_AREA_OF_OPERATIONS_OPTIONS as bn, FortifiedLineOptions as bt, line24DrawRule as c, BlockArrowOptions as cn, normalizeTextAmplifiers as cr, ObstacleBypassEasyOptions as ct, line1DrawRule as d, ClassicArrowOptions as dn, DEFAULT_FIX_OPTIONS as dt, GenericCircleOptions as en, ParamDescriptor as er, getControlMeasureMetadataByValue as et, ambushDrawRule as f, DEFAULT_CLASSIC_ARROW_OPTIONS as fn, FixOptions as ft, disruptDrawRule as g, MainAttackOptions as gn, DEFAULT_BLOCK_OPTIONS as gt, centerRadiusDrawRule as h, DEFAULT_MAIN_ATTACK_OPTIONS as hn, BlockOptions as ht, DEFAULT_AMBUSH_OPTIONS as i, GenericPolygonOptions as in, TextAmplifierField as ir, ObstacleBypassImpossibleOptions as it, roundToFixed as j, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS as jn, BypassOptions as jt, EPSILON as k, DEFAULT_ENCIRCLEMENT_OPTIONS as kn, CanalizeOptions as kt, line23DrawRule as l, DEFAULT_BLOCK_ARROW_OPTIONS as ln, AnchorTransformEvent as lr, DEFAULT_TURN_OPTIONS as lt, point12DrawRule as m, SupportingAttackOptions as mn, DisruptOptions as mt, TacticalArrowOptions as n, GenericRectangleOptions as nn, CanonicalTextAmplifiers as nr, listControlMeasureMetadata as nt, axis1DrawRule as o, GenericLineOptions as on, TextAmplifiers as or, ObstacleBypassDifficultOptions as ot, attackByFireDrawRule as p, DEFAULT_SUPPORTING_ATTACK_OPTIONS as pn, DEFAULT_DISRUPT_OPTIONS as pt, ControlMeasureStyle as q, project as qn, DEFAULT_SUPPORT_BY_FIRE_OPTIONS as qt, AmbushOptions as r, DEFAULT_GENERIC_POLYGON_OPTIONS as rn, TEXT_AMPLIFIER_FIELDS as rr, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS as rt, supportByFireDrawRule as s, BlockArrowHeadStyle as sn, canonicalTextAmplifierKey as sr, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS as st, DEFAULT_TACTICAL_ARROW_OPTIONS as t, DEFAULT_GENERIC_RECTANGLE_OPTIONS as tn, TextAmplifierDescriptor as tr, getDefaultOptions as tt, turnDrawRule as u, ClassicArrowHeadStyle as un, ControlMeasureDrawRule as ur, TurnOptions as ut, MidpointPerpendicularDrawRuleOptions as v, computeInitialWidthPoint as vn, FortifiedAreaOptions as vt, BaselineFrame as w, LandingZoneOptions as wn, DEFAULT_ANTITANK_DITCH_OPTIONS as wt, getMidpointPerpendicularSignedDistance as x, DEFAULT_PICKUP_ZONE_OPTIONS as xn, AntitankWallOptions as xt, computeDefaultMidpointPerpendicularPoint as y, AreaOfOperationsOptions as yn, DEFAULT_FORTIFIED_LINE_OPTIONS as yt, ControlMeasureRender as z, DEFAULT_GENERIC_C2_LINE_OPTIONS as zn, DEFAULT_HANDOVER_LINE_OPTIONS as zt };
2570
+ export { getControlMeasureMetadata as $, ControlMeasureMetadata as $n, DEFAULT_GENERIC_CIRCLE_OPTIONS as $t, getMetersPerPixel as A, EncirclementOptions as An, DEFAULT_CANALIZE_OPTIONS as At, ControlMeasureSnapshot as B, GenericC2LineOptions as Bn, HandoverLineOptions as Bt, snapToMidpointPerpendicular as C, DEFAULT_LANDING_ZONE_OPTIONS as Cn, AntitankDitchOptions as Ct, BaselineFrameOrigin as D, AssemblyAreaOptions as Dn, ClearOptions as Dt, BaselineFrameOptions as E, JointTacticalActionAreaOptions as En, DelayOptions as Et, resolveStyleHints as F, DEFAULT_STRONG_POINT_OPTIONS as Fn, BlockMissionTaskOptions as Ft, cloneControlMeasure as G, LabelSizeOptions as Gn, AttackByFireOptions as Gt, StyleHints as H, EngineerWorkLineOptions as Hn, PhaseLineOptions as Ht, freezeOrientationOptions as I, StrongPointOptions as In, DEFAULT_BLOCK_MISSION_TASK_OPTIONS as It, CONTROL_MEASURE_IDS as J, unproject as Jn, SupportByFireOptions as Jt, isKind as K, Point2D as Kn, DEFAULT_ATTACK_BY_FIRE_OPTIONS as Kt, RenderOptions as L, BattlePositionOptions as Ln, BattleHandoverLineOptions as Lt, SimpleStyleProps as M, FinalProtectiveFireOptions as Mn, DEFAULT_BYPASS_OPTIONS as Mt, SimpleStyleRender as N, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS as Nn, BreachOptions as Nt, createBaselineFrame as O, DEFAULT_ASSEMBLY_AREA_OPTIONS as On, DEFAULT_CLEAR_OPTIONS as Ot, toSimpleStyle as P, PrincipalDirectionOfFireOptions as Pn, DEFAULT_BREACH_OPTIONS as Pt, OptionsByKind as Q, ControlMeasureGeometryType as Qn, DEFAULT_AIRBORNE_ATTACK_OPTIONS as Qt, renderControlMeasure as R, DEFAULT_BATTLE_POSITION_OPTIONS as Rn, DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS as Rt, pointOnMidpointPerpendicularAxis as S, PickupZoneOptions as Sn, DEFAULT_ANTITANK_WALL_OPTIONS as St, BaselineFrameNormal as T, DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS as Tn, DEFAULT_DELAY_OPTIONS as Tt, controlMeasureIdFromFeature as U, DEFAULT_LIGHT_LINE_OPTIONS as Un, DEFAULT_FLOT_OPTIONS as Ut, FeaturePartProps as V, DEFAULT_ENGINEER_WORK_LINE_OPTIONS as Vn, DEFAULT_PHASE_LINE_OPTIONS as Vt, ControlMeasure as W, LightLineOptions as Wn, FLOTOptions as Wt, ControlMeasureId as X, DEFAULT_BOUNDARY_OPTIONS as Xn, DEFAULT_ATTACK_HELICOPTER_OPTIONS as Xt, CONTROL_MEASURE_METADATA as Y, BoundaryOptions as Yn, AttackHelicopterOptions as Yt, ControlMeasureKind as Z, ControlMeasureGeometry as Zn, AirborneAttackOptions as Zt, blockDrawRule as _, calculateMetrics as _n, DEFAULT_FORTIFIED_AREA_OPTIONS as _t, rectangleDrawRule as a, DEFAULT_GENERIC_LINE_OPTIONS as an, TEXT_AMPLIFIER_FIELDS as ar, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS as at, createMidpointPerpendicularDrawRule as b, DEFAULT_AREA_OF_OPERATIONS_OPTIONS as bn, FortifiedLineOptions as bt, line24DrawRule as c, BlockArrowOptions as cn, TextAmplifiers as cr, ObstacleBypassEasyOptions as ct, line1DrawRule as d, ClassicArrowOptions as dn, AnchorTransformEvent as dr, DEFAULT_FIX_OPTIONS as dt, GenericCircleOptions as en, ParamDescriptor as er, getControlMeasureMetadataByValue as et, ambushDrawRule as f, DEFAULT_CLASSIC_ARROW_OPTIONS as fn, ControlMeasureDrawRule as fr, FixOptions as ft, disruptDrawRule as g, MainAttackOptions as gn, DEFAULT_BLOCK_OPTIONS as gt, centerRadiusDrawRule as h, DEFAULT_MAIN_ATTACK_OPTIONS as hn, BlockOptions as ht, DEFAULT_AMBUSH_OPTIONS as i, GenericPolygonOptions as in, GeneratedLabelKey as ir, ObstacleBypassImpossibleOptions as it, roundToFixed as j, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS as jn, BypassOptions as jt, EPSILON as k, DEFAULT_ENCIRCLEMENT_OPTIONS as kn, CanalizeOptions as kt, line23DrawRule as l, DEFAULT_BLOCK_ARROW_OPTIONS as ln, canonicalTextAmplifierKey as lr, DEFAULT_TURN_OPTIONS as lt, point12DrawRule as m, SupportingAttackOptions as mn, DisruptOptions as mt, TacticalArrowOptions as n, GenericRectangleOptions as nn, AmplifierPlacements as nr, listControlMeasureMetadata as nt, axis1DrawRule as o, GenericLineOptions as on, TextAmplifierField as or, ObstacleBypassDifficultOptions as ot, attackByFireDrawRule as p, DEFAULT_SUPPORTING_ATTACK_OPTIONS as pn, DEFAULT_DISRUPT_OPTIONS as pt, ControlMeasureStyle as q, project as qn, DEFAULT_SUPPORT_BY_FIRE_OPTIONS as qt, AmbushOptions as r, DEFAULT_GENERIC_POLYGON_OPTIONS as rn, CanonicalTextAmplifiers as rr, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS as rt, supportByFireDrawRule as s, BlockArrowHeadStyle as sn, TextAmplifierKey as sr, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS as st, DEFAULT_TACTICAL_ARROW_OPTIONS as t, DEFAULT_GENERIC_RECTANGLE_OPTIONS as tn, TextAmplifierDescriptor as tr, getDefaultOptions as tt, turnDrawRule as u, ClassicArrowHeadStyle as un, normalizeTextAmplifiers as ur, TurnOptions as ut, MidpointPerpendicularDrawRuleOptions as v, computeInitialWidthPoint as vn, FortifiedAreaOptions as vt, BaselineFrame as w, LandingZoneOptions as wn, DEFAULT_ANTITANK_DITCH_OPTIONS as wt, getMidpointPerpendicularSignedDistance as x, DEFAULT_PICKUP_ZONE_OPTIONS as xn, AntitankWallOptions as xt, computeDefaultMidpointPerpendicularPoint as y, AreaOfOperationsOptions as yn, DEFAULT_FORTIFIED_LINE_OPTIONS as yt, ControlMeasureRender as z, DEFAULT_GENERIC_C2_LINE_OPTIONS as zn, DEFAULT_HANDOVER_LINE_OPTIONS as zt };
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as getControlMeasureMetadata, $n as ControlMeasureMetadata, $t as DEFAULT_GENERIC_CIRCLE_OPTIONS, A as getMetersPerPixel, An as EncirclementOptions, At as DEFAULT_CANALIZE_OPTIONS, B as ControlMeasureSnapshot, Bn as GenericC2LineOptions, Bt as HandoverLineOptions, C as snapToMidpointPerpendicular, Cn as DEFAULT_LANDING_ZONE_OPTIONS, Ct as AntitankDitchOptions, D as BaselineFrameOrigin, Dn as AssemblyAreaOptions, Dt as ClearOptions, E as BaselineFrameOptions, En as JointTacticalActionAreaOptions, Et as DelayOptions, F as resolveStyleHints, Fn as DEFAULT_STRONG_POINT_OPTIONS, Ft as BlockMissionTaskOptions, G as cloneControlMeasure, Gn as LabelSizeOptions, Gt as AttackByFireOptions, H as StyleHints, Hn as EngineerWorkLineOptions, Ht as PhaseLineOptions, I as freezeOrientationOptions, In as StrongPointOptions, It as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, J as CONTROL_MEASURE_IDS, Jn as unproject, Jt as SupportByFireOptions, K as isKind, Kn as Point2D, Kt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, L as RenderOptions, Ln as BattlePositionOptions, Lt as BattleHandoverLineOptions, M as SimpleStyleProps, Mn as FinalProtectiveFireOptions, Mt as DEFAULT_BYPASS_OPTIONS, N as SimpleStyleRender, Nn as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, Nt as BreachOptions, O as createBaselineFrame, On as DEFAULT_ASSEMBLY_AREA_OPTIONS, Ot as DEFAULT_CLEAR_OPTIONS, P as toSimpleStyle, Pn as PrincipalDirectionOfFireOptions, Pt as DEFAULT_BREACH_OPTIONS, Q as OptionsByKind, Qn as ControlMeasureGeometryType, Qt as DEFAULT_AIRBORNE_ATTACK_OPTIONS, R as renderControlMeasure, Rn as DEFAULT_BATTLE_POSITION_OPTIONS, Rt as DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, S as pointOnMidpointPerpendicularAxis, Sn as PickupZoneOptions, St as DEFAULT_ANTITANK_WALL_OPTIONS, T as BaselineFrameNormal, Tn as DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, Tt as DEFAULT_DELAY_OPTIONS, U as controlMeasureIdFromFeature, Un as DEFAULT_LIGHT_LINE_OPTIONS, Ut as DEFAULT_FLOT_OPTIONS, V as FeaturePartProps, Vn as DEFAULT_ENGINEER_WORK_LINE_OPTIONS, Vt as DEFAULT_PHASE_LINE_OPTIONS, W as ControlMeasure, Wn as LightLineOptions, Wt as FLOTOptions, X as ControlMeasureId, Xn as DEFAULT_BOUNDARY_OPTIONS, Xt as DEFAULT_ATTACK_HELICOPTER_OPTIONS, Y as CONTROL_MEASURE_METADATA, Yn as BoundaryOptions, Yt as AttackHelicopterOptions, Z as ControlMeasureKind, Zn as ControlMeasureGeometry, Zt as AirborneAttackOptions, _ as blockDrawRule, _n as calculateMetrics, _t as DEFAULT_FORTIFIED_AREA_OPTIONS, a as rectangleDrawRule, an as DEFAULT_GENERIC_LINE_OPTIONS, ar as TextAmplifierKey, at as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, b as createMidpointPerpendicularDrawRule, bn as DEFAULT_AREA_OF_OPERATIONS_OPTIONS, bt as FortifiedLineOptions, c as line24DrawRule, cn as BlockArrowOptions, cr as normalizeTextAmplifiers, ct as ObstacleBypassEasyOptions, d as line1DrawRule, dn as ClassicArrowOptions, dt as DEFAULT_FIX_OPTIONS, en as GenericCircleOptions, er as ParamDescriptor, et as getControlMeasureMetadataByValue, f as ambushDrawRule, fn as DEFAULT_CLASSIC_ARROW_OPTIONS, ft as FixOptions, g as disruptDrawRule, gn as MainAttackOptions, gt as DEFAULT_BLOCK_OPTIONS, h as centerRadiusDrawRule, hn as DEFAULT_MAIN_ATTACK_OPTIONS, ht as BlockOptions, i as DEFAULT_AMBUSH_OPTIONS, in as GenericPolygonOptions, ir as TextAmplifierField, it as ObstacleBypassImpossibleOptions, j as roundToFixed, jn as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, jt as BypassOptions, k as EPSILON, kn as DEFAULT_ENCIRCLEMENT_OPTIONS, kt as CanalizeOptions, l as line23DrawRule, ln as DEFAULT_BLOCK_ARROW_OPTIONS, lr as AnchorTransformEvent, lt as DEFAULT_TURN_OPTIONS, m as point12DrawRule, mn as SupportingAttackOptions, mt as DisruptOptions, n as TacticalArrowOptions, nn as GenericRectangleOptions, nr as CanonicalTextAmplifiers, nt as listControlMeasureMetadata, o as axis1DrawRule, on as GenericLineOptions, or as TextAmplifiers, ot as ObstacleBypassDifficultOptions, p as attackByFireDrawRule, pn as DEFAULT_SUPPORTING_ATTACK_OPTIONS, pt as DEFAULT_DISRUPT_OPTIONS, q as ControlMeasureStyle, qn as project, qt as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, r as AmbushOptions, rn as DEFAULT_GENERIC_POLYGON_OPTIONS, rr as TEXT_AMPLIFIER_FIELDS, rt as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, s as supportByFireDrawRule, sn as BlockArrowHeadStyle, sr as canonicalTextAmplifierKey, st as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, t as DEFAULT_TACTICAL_ARROW_OPTIONS, tn as DEFAULT_GENERIC_RECTANGLE_OPTIONS, tr as TextAmplifierDescriptor, tt as getDefaultOptions, u as turnDrawRule, un as ClassicArrowHeadStyle, ur as ControlMeasureDrawRule, ut as TurnOptions, v as MidpointPerpendicularDrawRuleOptions, vn as computeInitialWidthPoint, vt as FortifiedAreaOptions, w as BaselineFrame, wn as LandingZoneOptions, wt as DEFAULT_ANTITANK_DITCH_OPTIONS, x as getMidpointPerpendicularSignedDistance, xn as DEFAULT_PICKUP_ZONE_OPTIONS, xt as AntitankWallOptions, y as computeDefaultMidpointPerpendicularPoint, yn as AreaOfOperationsOptions, yt as DEFAULT_FORTIFIED_LINE_OPTIONS, z as ControlMeasureRender, zn as DEFAULT_GENERIC_C2_LINE_OPTIONS, zt as DEFAULT_HANDOVER_LINE_OPTIONS } from "./index-C6nqkw1A.mjs";
2
- export { type AirborneAttackOptions, type AmbushOptions, type AnchorTransformEvent, type AntitankDitchOptions, type AntitankWallOptions, 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 BreachOptions, type BypassOptions, CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, type CanalizeOptions, type CanonicalTextAmplifiers, type ClassicArrowHeadStyle, type ClassicArrowOptions, type ClearOptions, type ControlMeasure, type ControlMeasureDrawRule, type ControlMeasureGeometry, type ControlMeasureGeometryType, type ControlMeasureId, type ControlMeasureKind, type ControlMeasureMetadata, type ControlMeasureRender, type ControlMeasureSnapshot, type ControlMeasureStyle, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_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_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLASSIC_ARROW_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_ENGINEER_WORK_LINE_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_C2_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_HANDOVER_LINE_OPTIONS, DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, DEFAULT_LANDING_ZONE_OPTIONS, DEFAULT_LIGHT_LINE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PHASE_LINE_OPTIONS, DEFAULT_PICKUP_ZONE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, type DelayOptions, type DisruptOptions, EPSILON, type EncirclementOptions, type EngineerWorkLineOptions, type FLOTOptions, type FeaturePartProps, type FinalProtectiveFireOptions, type FixOptions, type FortifiedAreaOptions, type FortifiedLineOptions, type GenericC2LineOptions, type GenericCircleOptions, type GenericLineOptions, type GenericPolygonOptions, type GenericRectangleOptions, type HandoverLineOptions, type JointTacticalActionAreaOptions, type LabelSizeOptions, type LandingZoneOptions, type LightLineOptions, type MainAttackOptions, type MidpointPerpendicularDrawRuleOptions, type ObstacleBypassDifficultOptions, type ObstacleBypassEasyOptions, type ObstacleBypassImpossibleOptions, type OptionsByKind, type ParamDescriptor, type PhaseLineOptions, type PickupZoneOptions, type Point2D, type PrincipalDirectionOfFireOptions, type RenderOptions, 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, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, canonicalTextAmplifierKey, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, normalizeTextAmplifiers, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
1
+ import { $ as getControlMeasureMetadata, $n as ControlMeasureMetadata, $t as DEFAULT_GENERIC_CIRCLE_OPTIONS, A as getMetersPerPixel, An as EncirclementOptions, At as DEFAULT_CANALIZE_OPTIONS, B as ControlMeasureSnapshot, Bn as GenericC2LineOptions, Bt as HandoverLineOptions, C as snapToMidpointPerpendicular, Cn as DEFAULT_LANDING_ZONE_OPTIONS, Ct as AntitankDitchOptions, D as BaselineFrameOrigin, Dn as AssemblyAreaOptions, Dt as ClearOptions, E as BaselineFrameOptions, En as JointTacticalActionAreaOptions, Et as DelayOptions, F as resolveStyleHints, Fn as DEFAULT_STRONG_POINT_OPTIONS, Ft as BlockMissionTaskOptions, G as cloneControlMeasure, Gn as LabelSizeOptions, Gt as AttackByFireOptions, H as StyleHints, Hn as EngineerWorkLineOptions, Ht as PhaseLineOptions, I as freezeOrientationOptions, In as StrongPointOptions, It as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, J as CONTROL_MEASURE_IDS, Jn as unproject, Jt as SupportByFireOptions, K as isKind, Kn as Point2D, Kt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, L as RenderOptions, Ln as BattlePositionOptions, Lt as BattleHandoverLineOptions, M as SimpleStyleProps, Mn as FinalProtectiveFireOptions, Mt as DEFAULT_BYPASS_OPTIONS, N as SimpleStyleRender, Nn as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, Nt as BreachOptions, O as createBaselineFrame, On as DEFAULT_ASSEMBLY_AREA_OPTIONS, Ot as DEFAULT_CLEAR_OPTIONS, P as toSimpleStyle, Pn as PrincipalDirectionOfFireOptions, Pt as DEFAULT_BREACH_OPTIONS, Q as OptionsByKind, Qn as ControlMeasureGeometryType, Qt as DEFAULT_AIRBORNE_ATTACK_OPTIONS, R as renderControlMeasure, Rn as DEFAULT_BATTLE_POSITION_OPTIONS, Rt as DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, S as pointOnMidpointPerpendicularAxis, Sn as PickupZoneOptions, St as DEFAULT_ANTITANK_WALL_OPTIONS, T as BaselineFrameNormal, Tn as DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, Tt as DEFAULT_DELAY_OPTIONS, U as controlMeasureIdFromFeature, Un as DEFAULT_LIGHT_LINE_OPTIONS, Ut as DEFAULT_FLOT_OPTIONS, V as FeaturePartProps, Vn as DEFAULT_ENGINEER_WORK_LINE_OPTIONS, Vt as DEFAULT_PHASE_LINE_OPTIONS, W as ControlMeasure, Wn as LightLineOptions, Wt as FLOTOptions, X as ControlMeasureId, Xn as DEFAULT_BOUNDARY_OPTIONS, Xt as DEFAULT_ATTACK_HELICOPTER_OPTIONS, Y as CONTROL_MEASURE_METADATA, Yn as BoundaryOptions, Yt as AttackHelicopterOptions, Z as ControlMeasureKind, Zn as ControlMeasureGeometry, Zt as AirborneAttackOptions, _ as blockDrawRule, _n as calculateMetrics, _t as DEFAULT_FORTIFIED_AREA_OPTIONS, a as rectangleDrawRule, an as DEFAULT_GENERIC_LINE_OPTIONS, ar as TEXT_AMPLIFIER_FIELDS, at as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, b as createMidpointPerpendicularDrawRule, bn as DEFAULT_AREA_OF_OPERATIONS_OPTIONS, bt as FortifiedLineOptions, c as line24DrawRule, cn as BlockArrowOptions, cr as TextAmplifiers, ct as ObstacleBypassEasyOptions, d as line1DrawRule, dn as ClassicArrowOptions, dr as AnchorTransformEvent, dt as DEFAULT_FIX_OPTIONS, en as GenericCircleOptions, er as ParamDescriptor, et as getControlMeasureMetadataByValue, f as ambushDrawRule, fn as DEFAULT_CLASSIC_ARROW_OPTIONS, fr as ControlMeasureDrawRule, ft as FixOptions, g as disruptDrawRule, gn as MainAttackOptions, gt as DEFAULT_BLOCK_OPTIONS, h as centerRadiusDrawRule, hn as DEFAULT_MAIN_ATTACK_OPTIONS, ht as BlockOptions, i as DEFAULT_AMBUSH_OPTIONS, in as GenericPolygonOptions, ir as GeneratedLabelKey, it as ObstacleBypassImpossibleOptions, j as roundToFixed, jn as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, jt as BypassOptions, k as EPSILON, kn as DEFAULT_ENCIRCLEMENT_OPTIONS, kt as CanalizeOptions, l as line23DrawRule, ln as DEFAULT_BLOCK_ARROW_OPTIONS, lr as canonicalTextAmplifierKey, lt as DEFAULT_TURN_OPTIONS, m as point12DrawRule, mn as SupportingAttackOptions, mt as DisruptOptions, n as TacticalArrowOptions, nn as GenericRectangleOptions, nr as AmplifierPlacements, nt as listControlMeasureMetadata, o as axis1DrawRule, on as GenericLineOptions, or as TextAmplifierField, ot as ObstacleBypassDifficultOptions, p as attackByFireDrawRule, pn as DEFAULT_SUPPORTING_ATTACK_OPTIONS, pt as DEFAULT_DISRUPT_OPTIONS, q as ControlMeasureStyle, qn as project, qt as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, r as AmbushOptions, rn as DEFAULT_GENERIC_POLYGON_OPTIONS, rr as CanonicalTextAmplifiers, rt as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, s as supportByFireDrawRule, sn as BlockArrowHeadStyle, sr as TextAmplifierKey, st as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, t as DEFAULT_TACTICAL_ARROW_OPTIONS, tn as DEFAULT_GENERIC_RECTANGLE_OPTIONS, tr as TextAmplifierDescriptor, tt as getDefaultOptions, u as turnDrawRule, un as ClassicArrowHeadStyle, ur as normalizeTextAmplifiers, ut as TurnOptions, v as MidpointPerpendicularDrawRuleOptions, vn as computeInitialWidthPoint, vt as FortifiedAreaOptions, w as BaselineFrame, wn as LandingZoneOptions, wt as DEFAULT_ANTITANK_DITCH_OPTIONS, x as getMidpointPerpendicularSignedDistance, xn as DEFAULT_PICKUP_ZONE_OPTIONS, xt as AntitankWallOptions, y as computeDefaultMidpointPerpendicularPoint, yn as AreaOfOperationsOptions, yt as DEFAULT_FORTIFIED_LINE_OPTIONS, z as ControlMeasureRender, zn as DEFAULT_GENERIC_C2_LINE_OPTIONS, zt as DEFAULT_HANDOVER_LINE_OPTIONS } from "./index-CsJcNxFQ.mjs";
2
+ export { type AirborneAttackOptions, type AmbushOptions, type AmplifierPlacements, type AnchorTransformEvent, type AntitankDitchOptions, type AntitankWallOptions, 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 BreachOptions, type BypassOptions, CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, type CanalizeOptions, type CanonicalTextAmplifiers, type ClassicArrowHeadStyle, type ClassicArrowOptions, type ClearOptions, type ControlMeasure, type ControlMeasureDrawRule, type ControlMeasureGeometry, type ControlMeasureGeometryType, type ControlMeasureId, type ControlMeasureKind, type ControlMeasureMetadata, type ControlMeasureRender, type ControlMeasureSnapshot, type ControlMeasureStyle, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_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_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLASSIC_ARROW_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_ENGINEER_WORK_LINE_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_C2_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_HANDOVER_LINE_OPTIONS, DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, DEFAULT_LANDING_ZONE_OPTIONS, DEFAULT_LIGHT_LINE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PHASE_LINE_OPTIONS, DEFAULT_PICKUP_ZONE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, type DelayOptions, type DisruptOptions, EPSILON, type EncirclementOptions, type EngineerWorkLineOptions, type FLOTOptions, type FeaturePartProps, type FinalProtectiveFireOptions, type FixOptions, type FortifiedAreaOptions, type FortifiedLineOptions, type GeneratedLabelKey, type GenericC2LineOptions, type GenericCircleOptions, type GenericLineOptions, type GenericPolygonOptions, type GenericRectangleOptions, type HandoverLineOptions, type JointTacticalActionAreaOptions, type LabelSizeOptions, type LandingZoneOptions, type LightLineOptions, type MainAttackOptions, type MidpointPerpendicularDrawRuleOptions, type ObstacleBypassDifficultOptions, type ObstacleBypassEasyOptions, type ObstacleBypassImpossibleOptions, type OptionsByKind, type ParamDescriptor, type PhaseLineOptions, type PickupZoneOptions, type Point2D, type PrincipalDirectionOfFireOptions, type RenderOptions, 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, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, canonicalTextAmplifierKey, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, normalizeTextAmplifiers, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as DEFAULT_BATTLE_POSITION_OPTIONS, A as DEFAULT_PHASE_LINE_OPTIONS, At as unproject, B as DEFAULT_GENERIC_LINE_OPTIONS, C as DEFAULT_MAIN_ATTACK_OPTIONS, Ct as getMidpointPerpendicularSignedDistance, D as DEFAULT_FORTIFIED_LINE_OPTIONS, Dt as calculateMetrics, E as DEFAULT_FORTIFIED_AREA_OPTIONS, Et as createBaselineFrame, F as DEFAULT_DISRUPT_OPTIONS, G as DEFAULT_BREACH_OPTIONS, H as DEFAULT_CLASSIC_ARROW_OPTIONS, I as DEFAULT_DELAY_OPTIONS, J as DEFAULT_ENGINEER_WORK_LINE_OPTIONS, K as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, L as DEFAULT_CLEAR_OPTIONS, M as DEFAULT_FIX_OPTIONS, Mt as getMetersPerPixel, N as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, Nt as roundToFixed, O as DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, Ot as computeInitialWidthPoint, P as DEFAULT_ENCIRCLEMENT_OPTIONS, Q as DEFAULT_BLOCK_OPTIONS, R as DEFAULT_GENERIC_RECTANGLE_OPTIONS, S as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, St as createMidpointPerpendicularDrawRule, T as DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, Tt as snapToMidpointPerpendicular, U as DEFAULT_CANALIZE_OPTIONS, V as DEFAULT_GENERIC_CIRCLE_OPTIONS, W as DEFAULT_BYPASS_OPTIONS, X as DEFAULT_BOUNDARY_OPTIONS, Y as DEFAULT_LIGHT_LINE_OPTIONS, Z as DEFAULT_BLOCK_ARROW_OPTIONS, _ as DEFAULT_TACTICAL_ARROW_OPTIONS, _t as point12DrawRule, a as resolveStyleHints, at as DEFAULT_AREA_OF_OPERATIONS_OPTIONS, b as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, bt as blockDrawRule, c as DEFINITIONS, ct as rectangleDrawRule, d as getDefaultOptions, dt as line24DrawRule, et as DEFAULT_ATTACK_HELICOPTER_OPTIONS, f as listControlMeasureMetadata, ft as line23DrawRule, g as DEFAULT_STRONG_POINT_OPTIONS, gt as attackByFireDrawRule, h as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, ht as ambushDrawRule, i as normalizeTextAmplifiers, it as DEFAULT_ASSEMBLY_AREA_OPTIONS, j as DEFAULT_FLOT_OPTIONS, jt as EPSILON, k as DEFAULT_HANDOVER_LINE_OPTIONS, kt as project, l as getControlMeasureMetadata, lt as axis1DrawRule, m as DEFAULT_SUPPORTING_ATTACK_OPTIONS, mt as line1DrawRule, n as TEXT_AMPLIFIER_FIELDS, nt as DEFAULT_ANTITANK_WALL_OPTIONS, o as CONTROL_MEASURE_IDS, ot as DEFAULT_AMBUSH_OPTIONS, p as DEFAULT_TURN_OPTIONS, pt as turnDrawRule, q as DEFAULT_GENERIC_C2_LINE_OPTIONS, r as canonicalTextAmplifierKey, rt as DEFAULT_ANTITANK_DITCH_OPTIONS, s as CONTROL_MEASURE_METADATA, st as DEFAULT_AIRBORNE_ATTACK_OPTIONS, t as renderControlMeasure, tt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, u as getControlMeasureMetadataByValue, ut as supportByFireDrawRule, v as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, vt as centerRadiusDrawRule, w as DEFAULT_LANDING_ZONE_OPTIONS, wt as pointOnMidpointPerpendicularAxis, x as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, xt as computeDefaultMidpointPerpendicularPoint, y as DEFAULT_PICKUP_ZONE_OPTIONS, yt as disruptDrawRule, z as DEFAULT_GENERIC_POLYGON_OPTIONS } from "./renderControlMeasure-NKEYq3Fg.mjs";
1
+ import { $ as DEFAULT_BATTLE_POSITION_OPTIONS, A as DEFAULT_PHASE_LINE_OPTIONS, At as unproject, B as DEFAULT_GENERIC_LINE_OPTIONS, C as DEFAULT_MAIN_ATTACK_OPTIONS, Ct as getMidpointPerpendicularSignedDistance, D as DEFAULT_FORTIFIED_LINE_OPTIONS, Dt as calculateMetrics, E as DEFAULT_FORTIFIED_AREA_OPTIONS, Et as createBaselineFrame, F as DEFAULT_DISRUPT_OPTIONS, G as DEFAULT_BREACH_OPTIONS, H as DEFAULT_CLASSIC_ARROW_OPTIONS, I as DEFAULT_DELAY_OPTIONS, J as DEFAULT_ENGINEER_WORK_LINE_OPTIONS, K as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, L as DEFAULT_CLEAR_OPTIONS, M as DEFAULT_FIX_OPTIONS, Mt as getMetersPerPixel, N as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, Nt as roundToFixed, O as DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, Ot as computeInitialWidthPoint, P as DEFAULT_ENCIRCLEMENT_OPTIONS, Q as DEFAULT_BLOCK_OPTIONS, R as DEFAULT_GENERIC_RECTANGLE_OPTIONS, S as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, St as createMidpointPerpendicularDrawRule, T as DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, Tt as snapToMidpointPerpendicular, U as DEFAULT_CANALIZE_OPTIONS, V as DEFAULT_GENERIC_CIRCLE_OPTIONS, W as DEFAULT_BYPASS_OPTIONS, X as DEFAULT_BOUNDARY_OPTIONS, Y as DEFAULT_LIGHT_LINE_OPTIONS, Z as DEFAULT_BLOCK_ARROW_OPTIONS, _ as DEFAULT_TACTICAL_ARROW_OPTIONS, _t as point12DrawRule, a as resolveStyleHints, at as DEFAULT_AREA_OF_OPERATIONS_OPTIONS, b as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, bt as blockDrawRule, c as DEFINITIONS, ct as rectangleDrawRule, d as getDefaultOptions, dt as line24DrawRule, et as DEFAULT_ATTACK_HELICOPTER_OPTIONS, f as listControlMeasureMetadata, ft as line23DrawRule, g as DEFAULT_STRONG_POINT_OPTIONS, gt as attackByFireDrawRule, h as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, ht as ambushDrawRule, i as normalizeTextAmplifiers, it as DEFAULT_ASSEMBLY_AREA_OPTIONS, j as DEFAULT_FLOT_OPTIONS, jt as EPSILON, k as DEFAULT_HANDOVER_LINE_OPTIONS, kt as project, l as getControlMeasureMetadata, lt as axis1DrawRule, m as DEFAULT_SUPPORTING_ATTACK_OPTIONS, mt as line1DrawRule, n as TEXT_AMPLIFIER_FIELDS, nt as DEFAULT_ANTITANK_WALL_OPTIONS, o as CONTROL_MEASURE_IDS, ot as DEFAULT_AMBUSH_OPTIONS, p as DEFAULT_TURN_OPTIONS, pt as turnDrawRule, q as DEFAULT_GENERIC_C2_LINE_OPTIONS, r as canonicalTextAmplifierKey, rt as DEFAULT_ANTITANK_DITCH_OPTIONS, s as CONTROL_MEASURE_METADATA, st as DEFAULT_AIRBORNE_ATTACK_OPTIONS, t as renderControlMeasure, tt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, u as getControlMeasureMetadataByValue, ut as supportByFireDrawRule, v as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, vt as centerRadiusDrawRule, w as DEFAULT_LANDING_ZONE_OPTIONS, wt as pointOnMidpointPerpendicularAxis, x as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, xt as computeDefaultMidpointPerpendicularPoint, y as DEFAULT_PICKUP_ZONE_OPTIONS, yt as disruptDrawRule, z as DEFAULT_GENERIC_POLYGON_OPTIONS } from "./renderControlMeasure-DHQO01PA.mjs";
2
2
  //#region src/freeze-orientation.ts
3
3
  /**
4
4
  * Dispatches to a measure kind's `freezeOrientation` hook (see
@@ -1,4 +1,4 @@
1
- import { X as ControlMeasureId, or as TextAmplifiers } from "../index-C6nqkw1A.mjs";
1
+ import { X as ControlMeasureId, cr as TextAmplifiers } from "../index-CsJcNxFQ.mjs";
2
2
  import { FeatureCollection, Geometry } from "geojson";
3
3
 
4
4
  //#region src/preview/index.d.ts
@@ -1,4 +1,4 @@
1
- import { c as DEFINITIONS, t as renderControlMeasure } from "../renderControlMeasure-NKEYq3Fg.mjs";
1
+ import { c as DEFINITIONS, t as renderControlMeasure } from "../renderControlMeasure-DHQO01PA.mjs";
2
2
  //#region src/preview/index.ts
3
3
  /**
4
4
  * Unitless `previewSample` points (~`[-1, 1]`) are scaled by this degree offset
@@ -1826,6 +1826,46 @@ const SMOOTH_LINE_PARAMS = [{
1826
1826
  function smoothLineVerts(verts, options, defaultResolution) {
1827
1827
  return options.smooth ? catmullRom(verts, normalizeSmoothResolution$2(options.smoothResolution ?? defaultResolution, defaultResolution)) : verts;
1828
1828
  }
1829
+ /**
1830
+ * Resamples a path into equal arc-length segments.
1831
+ *
1832
+ * This is useful for a repeated motif (such as a fortified tooth or FLOT
1833
+ * scallop) after smoothing. Catmull-Rom samples are evenly spaced in spline
1834
+ * parameter, not distance, so using them directly as motif boundaries causes
1835
+ * the motifs to bunch up where the curve's samples are closer together.
1836
+ */
1837
+ function evenlySpacePath(points, targetSegmentLength) {
1838
+ if (points.length < 2) return points;
1839
+ const segmentLengths = [];
1840
+ let totalLength = 0;
1841
+ for (let i = 0; i < points.length - 1; i++) {
1842
+ const length = vecMag(vecSub(points[i + 1], points[i]));
1843
+ segmentLengths.push(length);
1844
+ totalLength += length;
1845
+ }
1846
+ if (totalLength < 1e-6) return [points[0]];
1847
+ const segmentCount = Math.max(1, Math.round(totalLength / targetSegmentLength));
1848
+ const segmentLength = totalLength / segmentCount;
1849
+ const out = [points[0]];
1850
+ let sourceIndex = 0;
1851
+ let sourceStart = points[0];
1852
+ let consumed = 0;
1853
+ for (let segment = 1; segment < segmentCount; segment++) {
1854
+ const target = segment * segmentLength;
1855
+ while (sourceIndex < segmentLengths.length - 1 && consumed + segmentLengths[sourceIndex] < target) {
1856
+ consumed += segmentLengths[sourceIndex];
1857
+ sourceIndex++;
1858
+ sourceStart = points[sourceIndex];
1859
+ }
1860
+ const length = segmentLengths[sourceIndex];
1861
+ if (length < 1e-6) continue;
1862
+ const t = (target - consumed) / length;
1863
+ const sourceEnd = points[sourceIndex + 1];
1864
+ out.push([sourceStart[0] + (sourceEnd[0] - sourceStart[0]) * t, sourceStart[1] + (sourceEnd[1] - sourceStart[1]) * t]);
1865
+ }
1866
+ out.push(points[points.length - 1]);
1867
+ return out;
1868
+ }
1829
1869
  /** One centripetal Catmull-Rom sample at parameter `t` over control points `p0..p3`. */
1830
1870
  function catmullRomAt(p0, p1, p2, p3, t) {
1831
1871
  const t2 = t * t;
@@ -2067,13 +2107,13 @@ function labelRotationAlong(dir) {
2067
2107
  */
2068
2108
  function pushUnitLabels(out, frame, units) {
2069
2109
  const { center, perp, offset, rotation, labelSize } = frame;
2070
- for (const { side, designator, country, textAnchor } of units) {
2110
+ for (const { side, designator, country, textAnchor, amplifierField } of units) {
2071
2111
  let text;
2072
2112
  if (designator.length > 0 && country.length > 0) text = `${designator} (${country})`;
2073
2113
  else if (designator.length > 0) text = designator;
2074
2114
  else if (country.length > 0) text = `(${country})`;
2075
2115
  else continue;
2076
- pushLabel(out, vecAdd(center, vecScale(perp, side * offset)), text, rotation, labelSize, textAnchor);
2116
+ pushLabel(out, vecAdd(center, vecScale(perp, side * offset)), text, rotation, labelSize, textAnchor, amplifierField);
2077
2117
  }
2078
2118
  }
2079
2119
  /**
@@ -2199,7 +2239,7 @@ function labelSizeProps(options) {
2199
2239
  return {};
2200
2240
  }
2201
2241
  /** Pushes a `part: "label"` Point feature at projected `point`. */
2202
- function pushLabel(out, point, text, rotation, sizeProps, textAnchor) {
2242
+ function pushLabel(out, point, text, rotation, sizeProps, textAnchor, amplifierField) {
2203
2243
  out.push({
2204
2244
  type: "Feature",
2205
2245
  properties: {
@@ -2207,6 +2247,7 @@ function pushLabel(out, point, text, rotation, sizeProps, textAnchor) {
2207
2247
  text,
2208
2248
  rotation,
2209
2249
  ...textAnchor ? { textAnchor } : {},
2250
+ ...amplifierField ? { amplifierField } : {},
2210
2251
  ...sizeProps
2211
2252
  },
2212
2253
  geometry: {
@@ -2431,12 +2472,6 @@ function ringCentroid(verts) {
2431
2472
  const factor = 1 / (3 * area2);
2432
2473
  return [cx * factor, cy * factor];
2433
2474
  }
2434
- /** Joins the W/W1 date-time-group pair as `"W - W1"`; a single supplied value
2435
- * passes through unchanged; neither set yields `""`. */
2436
- function joinDtg(start, end) {
2437
- if (start && end) return `${start} - ${end}`;
2438
- return start ?? end ?? "";
2439
- }
2440
2475
  /**
2441
2476
  * Points where the closed ring `verts` crosses the horizontal line
2442
2477
  * `y = target`, one per crossing edge, plus the ring's total arc length —
@@ -2480,7 +2515,7 @@ function ringCrossingsAtY(verts, target) {
2480
2515
  * {@link buildGappedLine} uses) an "ENY" marker knocks out of the boundary —
2481
2516
  * empty unless `texts.hostile` was placed.
2482
2517
  *
2483
- * Rows are `[name, additionalInformation, joinDtg(dtgStart, dtgEnd)]`,
2518
+ * Rows are `[name (T), additionalInformation (H), dtgStart (W), dtgEnd (W1)]`,
2484
2519
  * filtered to non-empty text, stacked around the ring's {@link ringCentroid}
2485
2520
  * at `pitch = resolveLabelOffsetMeters(options, 1.2 + labelPadding)` (the 50m
2486
2521
  * no-size fallback applies until a live label size is captured — see
@@ -2514,14 +2549,18 @@ function pushAreaLabels(out, ringVerts, texts, options = {}) {
2514
2549
  const padding = Math.max(0, options.labelPadding ?? 0);
2515
2550
  const [cx, cy] = ringCentroid(ringVerts);
2516
2551
  const rows = [
2517
- texts.name,
2518
- texts.additionalInformation,
2519
- joinDtg(texts.dtgStart, texts.dtgEnd)
2520
- ].filter((s) => Boolean(s && s.length > 0));
2552
+ [texts.name, "T"],
2553
+ [texts.additionalInformation, "H"],
2554
+ [texts.dtgStart, "W"],
2555
+ [texts.dtgEnd, "W1"]
2556
+ ].flatMap(([text, field]) => text ? [{
2557
+ text,
2558
+ field
2559
+ }] : []);
2521
2560
  if (rows.length > 0) {
2522
2561
  const pitch = resolveLabelOffsetMeters(options, ROW_PITCH_RATIO + padding);
2523
- rows.forEach((text, i) => {
2524
- pushLabel(out, [cx, cy + ((rows.length - 1) / 2 - i) * pitch], text, HORIZONTAL_LABEL_ROTATION, sizeProps);
2562
+ rows.forEach(({ text, field }, i) => {
2563
+ pushLabel(out, [cx, cy + ((rows.length - 1) / 2 - i) * pitch], text, HORIZONTAL_LABEL_ROTATION, sizeProps, void 0, field);
2525
2564
  });
2526
2565
  }
2527
2566
  const gaps = [];
@@ -2535,7 +2574,7 @@ function pushAreaLabels(out, ringVerts, texts, options = {}) {
2535
2574
  const textWidth = texts.hostile.length * ENY_CHAR_ASPECT_RATIO * textHeight;
2536
2575
  const clearance = (ENY_CLEARANCE_RATIO + padding) * textHeight;
2537
2576
  for (const crossing of [west, east]) {
2538
- pushLabel(out, [crossing.x, cy], texts.hostile, HORIZONTAL_LABEL_ROTATION, sizeProps);
2577
+ pushLabel(out, [crossing.x, cy], texts.hostile, HORIZONTAL_LABEL_ROTATION, sizeProps, void 0, "N");
2539
2578
  const halfExtent = .5 * (textWidth * Math.abs(crossing.along[0]) + textHeight * Math.abs(crossing.along[1])) + clearance;
2540
2579
  pushWrappedGap(gaps, crossing.arc - halfExtent, crossing.arc + halfExtent, totalArc);
2541
2580
  }
@@ -2893,7 +2932,7 @@ function createAirfieldZone(positions, options = {}, textAmplifiers = {}) {
2893
2932
  }
2894
2933
  if (textAmplifiers.H) {
2895
2934
  const labelFeatures = [];
2896
- pushLabel(labelFeatures, [maxX + H_LABEL_OFFSET_RATIO * resolveLabelOffsetMeters(labelOptions, 1), cy], textAmplifiers.H, HORIZONTAL_LABEL_ROTATION, labelSizeProps(labelOptions), "start");
2935
+ pushLabel(labelFeatures, [maxX + H_LABEL_OFFSET_RATIO * resolveLabelOffsetMeters(labelOptions, 1), cy], textAmplifiers.H, HORIZONTAL_LABEL_ROTATION, labelSizeProps(labelOptions), "start", "H");
2897
2936
  features.push(...labelFeatures);
2898
2937
  }
2899
2938
  return {
@@ -3339,7 +3378,11 @@ function generateAntitankDitchTriangles(projectedPoints, toothHeight, toothWidth
3339
3378
  * unchanged (no project/unproject round trip) when smoothing is off.
3340
3379
  */
3341
3380
  function smoothedDitchBasePath(positions, options) {
3342
- return smoothLineVerts(positions.map((position) => project(position[0], position[1])), options, 16);
3381
+ const projectedPoints = positions.map((position) => project(position[0], position[1]));
3382
+ const smoothedPath = smoothLineVerts(projectedPoints, options, 16);
3383
+ const toothHeight = calculateAntitankDitchHeight(options);
3384
+ const toothWidthRatio = Math.max(EPSILON, options.toothWidthRatio ?? DEFAULT_TOOTH_WIDTH_RATIO$1);
3385
+ return options.smooth && projectedPoints.length >= 3 ? evenlySpacePath(smoothedPath, toothWidthRatio * toothHeight) : smoothedPath;
3343
3386
  }
3344
3387
  function buildAntitankDitchTriangles(basePath, options) {
3345
3388
  return generateAntitankDitchTriangles(basePath, calculateAntitankDitchHeight(options), options.toothWidthRatio ?? DEFAULT_TOOTH_WIDTH_RATIO$1);
@@ -3447,6 +3490,8 @@ function createAntitankWall(positions, options = {}) {
3447
3490
  const toothHeight = calculateAntitankDitchHeight(options);
3448
3491
  const toothWidthRatio = options.toothWidthRatio ?? DEFAULT_TOOTH_WIDTH_RATIO;
3449
3492
  const toothSpacingRatio = options.toothSpacingRatio ?? DEFAULT_TOOTH_SPACING_RATIO;
3493
+ const projectedPoints = positions.map((position) => project(position[0], position[1]));
3494
+ const smoothedPath = smoothLineVerts(projectedPoints, options, 16);
3450
3495
  return {
3451
3496
  type: "FeatureCollection",
3452
3497
  features: [{
@@ -3454,7 +3499,7 @@ function createAntitankWall(positions, options = {}) {
3454
3499
  properties: { part: "wall" },
3455
3500
  geometry: {
3456
3501
  type: "MultiLineString",
3457
- coordinates: [generateAntitankWallPoints(smoothLineVerts(positions.map((position) => project(position[0], position[1])), options, 16), toothHeight, toothWidthRatio, toothSpacingRatio).map((point) => unproject(point[0], point[1]))]
3502
+ coordinates: [generateAntitankWallPoints(options.smooth && projectedPoints.length >= 3 ? evenlySpacePath(smoothedPath, Math.max(EPSILON, toothWidthRatio) * toothHeight) : smoothedPath, toothHeight, toothWidthRatio, toothSpacingRatio).map((point) => unproject(point[0], point[1]))]
3458
3503
  }
3459
3504
  }]
3460
3505
  };
@@ -4716,11 +4761,13 @@ function createEngineerWorkLine(positions, options = {}, textAmplifiers = {}) {
4716
4761
  const units = [{
4717
4762
  side: 1,
4718
4763
  designator: textAmplifiers.T ?? "",
4719
- country: textAmplifiers.AS ?? ""
4764
+ country: textAmplifiers.AS ?? "",
4765
+ amplifierField: "T"
4720
4766
  }, {
4721
4767
  side: -1,
4722
4768
  designator: textAmplifiers.T1 ?? "",
4723
- country: textAmplifiers.AS1 ?? ""
4769
+ country: textAmplifiers.AS1 ?? "",
4770
+ amplifierField: "T1"
4724
4771
  }];
4725
4772
  const labelFeatures = [];
4726
4773
  pushUnitLabels(labelFeatures, {
@@ -4920,6 +4967,7 @@ function createLabelFeature(point, text, rotation, labelSize = {}) {
4920
4967
  type: "Feature",
4921
4968
  properties: {
4922
4969
  part: "label",
4970
+ labelPlacement: false,
4923
4971
  text,
4924
4972
  rotation,
4925
4973
  ...labelSizeProps(labelSize)
@@ -7177,10 +7225,12 @@ function createFLOT(positions, options = {}) {
7177
7225
  if (radiusPixels !== void 0 && metersPerPixel !== void 0 && metersPerPixel > 0) effectiveRadius = radiusPixels * metersPerPixel;
7178
7226
  const safeRadius = Math.max(EPSILON, effectiveRadius);
7179
7227
  const safeArcSegments = Math.max(3, Math.round(arcSegments));
7180
- const basePath = smoothLineVerts(positions.map((p) => project(p[0], p[1])), {
7228
+ const projectedPoints = positions.map((p) => project(p[0], p[1]));
7229
+ const smoothedPath = smoothLineVerts(projectedPoints, {
7181
7230
  smooth,
7182
7231
  smoothResolution
7183
7232
  }, 16);
7233
+ const basePath = smooth && projectedPoints.length >= 3 ? evenlySpacePath(smoothedPath, 2 * safeRadius) : smoothedPath;
7184
7234
  const allPoints = [];
7185
7235
  for (let i = 0; i < basePath.length - 1; i++) {
7186
7236
  const p1 = basePath[i];
@@ -7571,7 +7621,7 @@ function createFortifiedLine(positions, options = {}) {
7571
7621
  properties: {},
7572
7622
  geometry: {
7573
7623
  type: "LineString",
7574
- coordinates: generateFortifiedPoints(smooth ? catmullRom(projectedPoints, normalizeSmoothResolution$2(smoothResolution, DEFAULT_SMOOTH_RESOLUTION$1)) : projectedPoints, safeSize).map((p) => unproject(p[0], p[1]))
7624
+ coordinates: generateFortifiedPoints(smooth ? evenlySpacePath(catmullRom(projectedPoints, normalizeSmoothResolution$2(smoothResolution, DEFAULT_SMOOTH_RESOLUTION$1)), 2 * safeSize) : projectedPoints, safeSize).map((p) => unproject(p[0], p[1]))
7575
7625
  }
7576
7626
  }]
7577
7627
  };
@@ -7623,7 +7673,7 @@ function createFortifiedArea(positions, options = {}, textAmplifiers = {}) {
7623
7673
  const safeSize = calculateEffectiveSize(options);
7624
7674
  const projected = positions.map((p) => project(p[0], p[1]));
7625
7675
  const ringPts = projected.length > 1 && vecMag(vecSub(projected[0], projected[projected.length - 1])) < 1e-6 ? projected.slice(0, -1) : projected;
7626
- const boundaryInput = smooth ? closedCatmullRom(ringPts, normalizeSmoothResolution$2(smoothResolution, DEFAULT_FORTIFIED_AREA_OPTIONS.smoothResolution)) : [...ringPts, ringPts[0]];
7676
+ const boundaryInput = smooth ? evenlySpacePath(closedCatmullRom(ringPts, normalizeSmoothResolution$2(smoothResolution, DEFAULT_FORTIFIED_AREA_OPTIONS.smoothResolution)), 2 * safeSize) : [...ringPts, ringPts[0]];
7627
7677
  const boundaryPoints = generateFortifiedPoints(boundaryInput, safeSize);
7628
7678
  if (boundaryPoints.length > 0) {
7629
7679
  const firstPt = boundaryPoints[0];
@@ -9691,7 +9741,16 @@ function normalizeTextAmplifiers(input) {
9691
9741
  * `properties.style` when non-empty.
9692
9742
  */
9693
9743
  function renderControlMeasure(cm, opts) {
9694
- const features = dispatchControlMeasure(cm, opts).features.map((feature, index) => normalizeFeature(cm.id, feature, index, cm.style, opts?.graphicsStyle));
9744
+ const raw = dispatchControlMeasure(cm, opts);
9745
+ const generatedLabelOrdinals = /* @__PURE__ */ new Map();
9746
+ const features = raw.features.map((feature, index) => {
9747
+ const sourceProps = feature.properties ?? {};
9748
+ const part = typeof sourceProps.part === "string" && sourceProps.part.length > 0 ? sourceProps.part : "main";
9749
+ const isGeneratedLabel = sourceProps.labelPlacement !== false && !(typeof sourceProps.amplifierField === "string" && canonicalTextAmplifierKey(sourceProps.amplifierField)) && !(typeof sourceProps.labelPlacementKey === "string" && sourceProps.labelPlacementKey.length > 0) && typeof sourceProps.text === "string" && feature.geometry.type === "Point";
9750
+ const generatedLabelOrdinal = isGeneratedLabel ? generatedLabelOrdinals.get(part) ?? 0 : index;
9751
+ if (isGeneratedLabel) generatedLabelOrdinals.set(part, generatedLabelOrdinal + 1);
9752
+ return normalizeFeature(cm.id, feature, index, generatedLabelOrdinal, cm.style, opts?.graphicsStyle, cm.amplifierPlacements);
9753
+ });
9695
9754
  const bbox = computeBBox(features);
9696
9755
  return {
9697
9756
  type: "FeatureCollection",
@@ -9723,7 +9782,20 @@ function validateInputContract(points, metadata, mode) {
9723
9782
  if (points.some((point) => !isValidPosition(point))) return reportValidationIssue(mode, `"${metadata.id}" control points must contain finite [lon, lat] values.`);
9724
9783
  return true;
9725
9784
  }
9726
- function normalizeFeature(id, feature, index, measureStyle, graphicsStyle) {
9785
+ /**
9786
+ * The `amplifierPlacements` key that repositions this feature, if any: the
9787
+ * canonical amplifier field when the generator declared one, an explicit
9788
+ * `labelPlacementKey`, or a synthesized `label:<part>:<ordinal>` key for any
9789
+ * other point label — unless the generator opted out via
9790
+ * `labelPlacement: false`.
9791
+ */
9792
+ function resolveLabelPlacementKey(sourceProps, amplifierField, text, geometryType, part, generatedLabelOrdinal) {
9793
+ if (sourceProps.labelPlacement === false) return void 0;
9794
+ if (amplifierField) return amplifierField;
9795
+ if (typeof sourceProps.labelPlacementKey === "string" && sourceProps.labelPlacementKey.length > 0) return sourceProps.labelPlacementKey;
9796
+ if (text !== void 0 && geometryType === "Point") return `label:${part}:${generatedLabelOrdinal}`;
9797
+ }
9798
+ function normalizeFeature(id, feature, index, generatedLabelOrdinal, measureStyle, graphicsStyle, amplifierPlacements) {
9727
9799
  const sourceProps = feature.properties ?? {};
9728
9800
  const part = typeof sourceProps.part === "string" && sourceProps.part.length > 0 ? sourceProps.part : "main";
9729
9801
  const generatorStyle = typeof sourceProps.style === "object" && sourceProps.style !== null ? sourceProps.style : void 0;
@@ -9734,6 +9806,13 @@ function normalizeFeature(id, feature, index, measureStyle, graphicsStyle) {
9734
9806
  const textSizePixels = typeof sourceProps.textSizePixels === "number" ? sourceProps.textSizePixels : void 0;
9735
9807
  const textSizeMeters = typeof sourceProps.textSizeMeters === "number" ? sourceProps.textSizeMeters : void 0;
9736
9808
  const textAnchor = sourceProps.textAnchor === "start" || sourceProps.textAnchor === "end" ? sourceProps.textAnchor : void 0;
9809
+ const amplifierField = typeof sourceProps.amplifierField === "string" ? canonicalTextAmplifierKey(sourceProps.amplifierField) : void 0;
9810
+ const labelPlacementKey = resolveLabelPlacementKey(sourceProps, amplifierField, text, feature.geometry.type, part, generatedLabelOrdinal);
9811
+ const placement = labelPlacementKey ? amplifierPlacements?.[labelPlacementKey] : void 0;
9812
+ const geometry = placement && isValidPosition(placement) && feature.geometry.type === "Point" ? {
9813
+ ...feature.geometry,
9814
+ coordinates: [...placement]
9815
+ } : feature.geometry;
9737
9816
  return {
9738
9817
  type: "Feature",
9739
9818
  id: `${id}:${part}:${index}`,
@@ -9744,10 +9823,12 @@ function normalizeFeature(id, feature, index, measureStyle, graphicsStyle) {
9744
9823
  ...text !== void 0 ? { text } : {},
9745
9824
  ...rotation !== void 0 ? { rotation } : {},
9746
9825
  ...textAnchor !== void 0 ? { textAnchor } : {},
9826
+ ...amplifierField !== void 0 ? { amplifierField } : {},
9827
+ ...labelPlacementKey !== void 0 ? { labelPlacementKey } : {},
9747
9828
  ...textSizePixels !== void 0 ? { textSizePixels } : {},
9748
9829
  ...textSizeMeters !== void 0 ? { textSizeMeters } : {}
9749
9830
  },
9750
- geometry: feature.geometry
9831
+ geometry
9751
9832
  };
9752
9833
  }
9753
9834
  function computeBBox(features) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orbat-mapper/control-measures",
3
- "version": "0.2.0-alpha.11",
3
+ "version": "0.2.0-alpha.12",
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",