@orbat-mapper/control-measures 0.2.0-alpha.21 → 0.2.0-alpha.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +46 -0
  2. package/dist/{index-COV2WtCq.d.mts → index-CuLg1vvg.d.mts} +73 -37
  3. package/dist/index.d.mts +2 -2
  4. package/dist/index.mjs +2 -2
  5. package/dist/preview/index.d.mts +29 -2
  6. package/dist/preview/index.mjs +44 -5
  7. package/dist/{renderControlMeasure-BG9DzU2W.mjs → renderControlMeasure-CsrLHwjB.mjs} +331 -9
  8. package/media/airfield-zone.svg +1 -0
  9. package/media/area-defense.svg +1 -0
  10. package/media/area-of-operations.svg +1 -1
  11. package/media/area.svg +1 -0
  12. package/media/assault-position.svg +1 -0
  13. package/media/assembly-area.svg +1 -1
  14. package/media/attack-position.svg +1 -0
  15. package/media/base-camp.svg +1 -0
  16. package/media/battle-handover-line.svg +1 -1
  17. package/media/battle-position.svg +1 -1
  18. package/media/block-arrow.svg +1 -1
  19. package/media/block-mission-task.svg +1 -1
  20. package/media/boundary.svg +1 -1
  21. package/media/breach.svg +1 -1
  22. package/media/bypass.svg +1 -1
  23. package/media/canalize.svg +1 -1
  24. package/media/clear.svg +1 -1
  25. package/media/cover.svg +1 -0
  26. package/media/delay.svg +1 -1
  27. package/media/direction-of-attack-aviation.svg +1 -0
  28. package/media/direction-of-main-attack.svg +1 -0
  29. package/media/direction-of-supporting-attack.svg +1 -0
  30. package/media/drop-zone.svg +1 -0
  31. package/media/encirclement.svg +1 -1
  32. package/media/engineer-work-line.svg +1 -1
  33. package/media/extraction-zone.svg +1 -0
  34. package/media/fortified-area.svg +1 -1
  35. package/media/frontal-attack.svg +1 -0
  36. package/media/generic-c2-area.svg +1 -0
  37. package/media/generic-c2-line.svg +1 -1
  38. package/media/guard.svg +1 -0
  39. package/media/guerrilla-base.svg +1 -0
  40. package/media/handover-line.svg +1 -1
  41. package/media/joint-tactical-action-area.svg +1 -1
  42. package/media/landing-zone.svg +1 -1
  43. package/media/light-line.svg +1 -1
  44. package/media/limited-access-area.svg +1 -0
  45. package/media/named-area-of-interest.svg +1 -0
  46. package/media/no-fire-area-irregular.svg +1 -0
  47. package/media/objective-area.svg +1 -0
  48. package/media/phase-line.svg +1 -1
  49. package/media/pickup-zone.svg +1 -1
  50. package/media/screen.svg +1 -0
  51. package/media/strong-point.svg +1 -1
  52. package/media/submarine-action-area.svg +1 -0
  53. package/media/submarine-generated-action-area.svg +1 -0
  54. package/media/target-area-of-interest.svg +1 -0
  55. package/media/turning-movement.svg +1 -0
  56. package/package.json +1 -1
@@ -61,6 +61,7 @@ const getMetersPerPixel = (latitude, zoomLevel) => {
61
61
  };
62
62
  //#endregion
63
63
  //#region src/projection.ts
64
+ const EARTH_RADIUS = 6371008.8;
64
65
  /**
65
66
  * Project WGS84 (Lon/Lat) to Web Mercator (Meters).
66
67
  */
@@ -79,6 +80,51 @@ const unproject = (x, y) => {
79
80
  lat = 180 / Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);
80
81
  return [roundToFixed(lon), roundToFixed(lat)];
81
82
  };
83
+ /**
84
+ * Great-circle distance in meters between two lon/lat positions (haversine on
85
+ * the WGS84 mean-radius sphere). Accurate at all scales — use this for
86
+ * measurement readouts (segment lengths, radii). Most generators still build
87
+ * geometry in projected Web Mercator meters, so at high latitudes a graphic's
88
+ * Mercator dimensions can exceed the true ground distance this returns; the
89
+ * generic circle is the exception — it samples at constant geodesic radius,
90
+ * so its ring and this readout agree exactly.
91
+ */
92
+ const haversineDistance = (a, b) => {
93
+ const [lon1, lat1] = a;
94
+ const [lon2, lat2] = b;
95
+ const φ1 = lat1 * Math.PI / 180;
96
+ const φ2 = lat2 * Math.PI / 180;
97
+ const Δφ = (lat2 - lat1) * Math.PI / 180;
98
+ const Δλ = (lon2 - lon1) * Math.PI / 180;
99
+ const h = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
100
+ return 2 * EARTH_RADIUS * Math.asin(Math.min(1, Math.sqrt(h)));
101
+ };
102
+ /**
103
+ * Initial great-circle bearing from `a` to `b`, in radians clockwise from
104
+ * north (0 = north, π/2 = east).
105
+ */
106
+ const sphericalBearing = (a, b) => {
107
+ const [lon1, lat1] = a;
108
+ const [lon2, lat2] = b;
109
+ const φ1 = lat1 * Math.PI / 180;
110
+ const φ2 = lat2 * Math.PI / 180;
111
+ const Δλ = (lon2 - lon1) * Math.PI / 180;
112
+ return Math.atan2(Math.sin(Δλ) * Math.cos(φ2), Math.cos(φ1) * Math.sin(φ2) - Math.sin(φ1) * Math.cos(φ2) * Math.cos(Δλ));
113
+ };
114
+ /**
115
+ * Spherical forward (direct) solution: the position reached by travelling
116
+ * `distance` meters from `origin` along an initial `bearing` (radians
117
+ * clockwise from north), on the WGS84 mean-radius sphere.
118
+ */
119
+ const destinationPoint = (origin, distance, bearing) => {
120
+ const [lon1, lat1] = origin;
121
+ const φ1 = lat1 * Math.PI / 180;
122
+ const λ1 = lon1 * Math.PI / 180;
123
+ const δ = distance / EARTH_RADIUS;
124
+ const θ = bearing;
125
+ const φ2 = Math.asin(Math.sin(φ1) * Math.cos(δ) + Math.cos(φ1) * Math.sin(δ) * Math.cos(θ));
126
+ return [roundToFixed((λ1 + Math.atan2(Math.sin(θ) * Math.sin(δ) * Math.cos(φ1), Math.cos(δ) - Math.sin(φ1) * Math.sin(φ2))) * 180 / Math.PI), roundToFixed(φ2 * 180 / Math.PI)];
127
+ };
82
128
  //#endregion
83
129
  //#region src/internal/vector-utils.ts
84
130
  /**
@@ -3364,6 +3410,48 @@ function pushAreaLabels(out, ringVerts, texts, options = {}, amplifierPlacements
3364
3410
  return gaps;
3365
3411
  }
3366
3412
  /**
3413
+ * Boundary + fill features for a pattern-filled area (e.g. Limited Access Area,
3414
+ * No Fire Area). With no ENY cutout the single patterned polygon carries both
3415
+ * the {@link FillPattern} fill and the visible outline. Once an ENY marker has
3416
+ * carved masking `gaps`, a `MultiLineString` outline can't hold a fill, so the
3417
+ * full ring stays as a strokeless pattern-only fill layer beneath a separate
3418
+ * gapped boundary line (via {@link boundaryFeature}). The strokeless "fill"
3419
+ * part convention lives here so each patterned area measure doesn't re-spell it.
3420
+ */
3421
+ function patternedAreaFeatures(verts, gaps, fillPattern) {
3422
+ if (gaps.length === 0) {
3423
+ const boundary = verts.map((p) => unproject(p[0], p[1]));
3424
+ return [{
3425
+ type: "Feature",
3426
+ properties: {
3427
+ part: "boundary",
3428
+ fill: true,
3429
+ style: { fillPattern }
3430
+ },
3431
+ geometry: {
3432
+ type: "Polygon",
3433
+ coordinates: [boundary]
3434
+ }
3435
+ }];
3436
+ }
3437
+ return [{
3438
+ type: "Feature",
3439
+ properties: {
3440
+ part: "fill",
3441
+ fill: true,
3442
+ style: {
3443
+ fillPattern,
3444
+ strokeColor: "transparent",
3445
+ strokeWidth: 0
3446
+ }
3447
+ },
3448
+ geometry: {
3449
+ type: "Polygon",
3450
+ coordinates: [verts.map((p) => unproject(p[0], p[1]))]
3451
+ }
3452
+ }, boundaryFeature(verts, gaps)];
3453
+ }
3454
+ /**
3367
3455
  * The area's boundary feature: a gapped `MultiLineString` when a Field N (ENY)
3368
3456
  * marker has carved masking `gaps` from the ring (via {@link buildGappedLine},
3369
3457
  * ADR-0023), or a closed `Polygon` otherwise. Shared by every area measure that
@@ -6801,6 +6889,31 @@ const FILLED_AREA_PARAMS = [{
6801
6889
  //#endregion
6802
6890
  //#region src/generators/cm99-generic-graphics/circle.ts
6803
6891
  const CIRCLE_SEGMENTS = 64;
6892
+ const MAX_SEGMENT_ANGLE = 6;
6893
+ const MAX_SUBDIVISION_DEPTH = 5;
6894
+ /**
6895
+ * Lon/lat gap between two positions, wrapping the longitude difference to
6896
+ * (-180, 180] so it stays meaningful across the antimeridian.
6897
+ */
6898
+ const angularGap = (a, b) => {
6899
+ const wrappedLonDiff = Math.abs(((b[0] - a[0]) % 360 + 540) % 360 - 180);
6900
+ const latDiff = Math.abs(b[1] - a[1]);
6901
+ return Math.max(wrappedLonDiff, latDiff);
6902
+ };
6903
+ /**
6904
+ * Recursively bisects a bearing interval so consecutive ring vertices stay
6905
+ * within MAX_SEGMENT_ANGLE of each other, keeping straight polygon chords
6906
+ * close to the true geodesic circle near the poles. Only pushes the start of
6907
+ * each leaf segment; the caller supplies the final closing vertex.
6908
+ */
6909
+ const densifySegment = (center, radius, bearingA, posA, bearingB, posB, depth, out) => {
6910
+ if (depth < MAX_SUBDIVISION_DEPTH && angularGap(posA, posB) > MAX_SEGMENT_ANGLE) {
6911
+ const midBearing = (bearingA + bearingB) / 2;
6912
+ const midPos = destinationPoint(center, radius, midBearing);
6913
+ densifySegment(center, radius, bearingA, posA, midBearing, midPos, depth + 1, out);
6914
+ densifySegment(center, radius, midBearing, midPos, bearingB, posB, depth + 1, out);
6915
+ } else out.push(posA);
6916
+ };
6804
6917
  const DEFAULT_GENERIC_CIRCLE_OPTIONS = { filled: false };
6805
6918
  const GENERIC_CIRCLE_METADATA = {
6806
6919
  id: "circle",
@@ -6818,19 +6931,42 @@ const GENERIC_CIRCLE_METADATA = {
6818
6931
  params: FILLED_AREA_PARAMS
6819
6932
  };
6820
6933
  function createGenericCircle(coordinates, options = {}) {
6821
- const center = project(coordinates[0][0], coordinates[0][1]);
6822
- const radiusVector = vecSub(project(coordinates[1][0], coordinates[1][1]), center);
6823
- const radius = vecMag(radiusVector);
6934
+ const center = coordinates[0];
6935
+ const radiusPoint = coordinates[1];
6936
+ const radius = haversineDistance(center, radiusPoint);
6824
6937
  if (radius < 1e-6) return {
6825
6938
  type: "FeatureCollection",
6826
6939
  features: []
6827
6940
  };
6828
- const startAngle = Math.atan2(radiusVector[1], radiusVector[0]);
6941
+ const startBearing = sphericalBearing(center, radiusPoint);
6829
6942
  const ring = [];
6830
- for (let index = 0; index <= CIRCLE_SEGMENTS; index++) {
6831
- const angle = startAngle + index / CIRCLE_SEGMENTS * Math.PI * 2;
6832
- ring.push(unproject(center[0] + Math.cos(angle) * radius, center[1] + Math.sin(angle) * radius));
6833
- }
6943
+ let previousBearing = startBearing;
6944
+ let previousPoint = destinationPoint(center, radius, previousBearing);
6945
+ for (let index = 1; index <= CIRCLE_SEGMENTS; index++) {
6946
+ const bearing = startBearing - index / CIRCLE_SEGMENTS * 2 * Math.PI;
6947
+ const point = destinationPoint(center, radius, bearing);
6948
+ densifySegment(center, radius, previousBearing, previousPoint, bearing, point, 0, ring);
6949
+ previousBearing = bearing;
6950
+ previousPoint = point;
6951
+ }
6952
+ ring.push(previousPoint);
6953
+ const vertex0 = [ring[0][0], ring[0][1]];
6954
+ let poleLat = null;
6955
+ if (haversineDistance(center, [center[0], 90]) < radius) poleLat = 90;
6956
+ else if (haversineDistance(center, [center[0], -90]) < radius) poleLat = -90;
6957
+ if (poleLat !== null) {
6958
+ for (let index = 1; index < ring.length - 1; index++) {
6959
+ const previousLon = ring[index - 1][0];
6960
+ const lon = ring[index][0];
6961
+ ring[index] = [lon + 360 * Math.round((previousLon - lon) / 360), ring[index][1]];
6962
+ }
6963
+ const penultimateLon = ring[ring.length - 2][0];
6964
+ const unwrappedClosingLon = vertex0[0] + 360 * Math.round((penultimateLon - vertex0[0]) / 360);
6965
+ ring[ring.length - 1] = [unwrappedClosingLon, vertex0[1]];
6966
+ ring.push([unwrappedClosingLon, poleLat]);
6967
+ ring.push([vertex0[0], poleLat]);
6968
+ ring.push([vertex0[0], vertex0[1]]);
6969
+ } else ring[ring.length - 1] = [vertex0[0], vertex0[1]];
6834
6970
  return {
6835
6971
  type: "FeatureCollection",
6836
6972
  features: [{
@@ -9657,6 +9793,188 @@ const LANDING_ZONE = defineControlMeasure({
9657
9793
  }
9658
9794
  });
9659
9795
  //#endregion
9796
+ //#region src/generators/cm15-maneuver-areas/limitedAccessArea.ts
9797
+ /** Default options for the Limited Access Area control measure. */
9798
+ const DEFAULT_LIMITED_ACCESS_AREA_OPTIONS = {
9799
+ smooth: false,
9800
+ smoothResolution: 16
9801
+ };
9802
+ const LIMITED_ACCESS_AREA_METADATA = {
9803
+ id: "limited-access-area",
9804
+ name: "Limited Access Area",
9805
+ description: "An area with restricted access, identified by a back-hachure fill.",
9806
+ entity: "Maneuver Areas",
9807
+ entityType: "Limited Access Area",
9808
+ value: "151100",
9809
+ minCoordinates: 3,
9810
+ geometry: "area",
9811
+ geometryTypes: [
9812
+ "Polygon",
9813
+ "MultiLineString",
9814
+ "Point"
9815
+ ],
9816
+ drawRule: "Area1",
9817
+ capturesLabelSize: true,
9818
+ params: [...AREA_SMOOTH_PARAMS, AREA_LABEL_PADDING_PARAM],
9819
+ textAmplifiers: [AREA_HOSTILE_AMPLIFIER]
9820
+ };
9821
+ /** Creates a back-hatched free area with a movable "LAA" label, centered by default. */
9822
+ function createLimitedAccessArea(positions, options = {}, textAmplifiers = {}, context = {}) {
9823
+ const { smooth = false, smoothResolution = 16 } = options;
9824
+ const verts = buildClosedRing(positions, smooth, smoothResolution, 16);
9825
+ const center = ringCentroid(verts);
9826
+ const labelFeatures = [{
9827
+ type: "Feature",
9828
+ properties: {
9829
+ part: "label",
9830
+ labelPlacementKey: "label:laa",
9831
+ textBackground: true,
9832
+ text: "LAA",
9833
+ rotation: HORIZONTAL_LABEL_ROTATION,
9834
+ ...labelSizeProps(options)
9835
+ },
9836
+ geometry: {
9837
+ type: "Point",
9838
+ coordinates: unproject(center[0], center[1])
9839
+ }
9840
+ }];
9841
+ return {
9842
+ type: "FeatureCollection",
9843
+ features: [...patternedAreaFeatures(verts, pushAreaLabels(labelFeatures, verts, { hostile: textAmplifiers.N }, options, context.amplifierPlacements), "backhachure"), ...labelFeatures]
9844
+ };
9845
+ }
9846
+ const LIMITED_ACCESS_AREA = defineControlMeasure({
9847
+ metadata: LIMITED_ACCESS_AREA_METADATA,
9848
+ generator: createLimitedAccessArea,
9849
+ defaultOptions: DEFAULT_LIMITED_ACCESS_AREA_OPTIONS,
9850
+ rule: area1DrawRule,
9851
+ previewSample: {
9852
+ controlPoints: [
9853
+ [-1, -.5],
9854
+ [1, -.5],
9855
+ [1, .5],
9856
+ [-1, .5]
9857
+ ],
9858
+ options: { labelSize: 96 }
9859
+ }
9860
+ });
9861
+ //#endregion
9862
+ //#region src/generators/cm24-fire-areas/noFireAreaIrregular.ts
9863
+ /** Default options for the irregular No Fire Area control measure. */
9864
+ const DEFAULT_NO_FIRE_AREA_IRREGULAR_OPTIONS = {
9865
+ smooth: false,
9866
+ smoothResolution: 16,
9867
+ labelPadding: .7
9868
+ };
9869
+ const NO_FIRE_AREA_TEXT_AMPLIFIERS = [
9870
+ {
9871
+ key: "T",
9872
+ label: "Unique designation",
9873
+ description: "Field T — the no-fire area's unique designation.",
9874
+ maxLength: 21
9875
+ },
9876
+ {
9877
+ key: "W",
9878
+ label: "Effective from (DTG)",
9879
+ description: "Field W — date-time group the no-fire area becomes effective.",
9880
+ placeholder: "051030Z",
9881
+ maxLength: 16
9882
+ },
9883
+ {
9884
+ key: "W1",
9885
+ label: "Effective to (DTG)",
9886
+ description: "Field W1 — date-time group the no-fire area ceases to be effective.",
9887
+ placeholder: "051600Z",
9888
+ maxLength: 16
9889
+ }
9890
+ ];
9891
+ const NO_FIRE_AREA_IRREGULAR_METADATA = {
9892
+ id: "no-fire-area-irregular",
9893
+ name: "No Fire Area (NFA) – Irregular",
9894
+ description: "An irregular area into which fires or their effects are prohibited.",
9895
+ entity: "Fire Areas",
9896
+ entityType: "No Fire Area",
9897
+ entitySubtype: "Irregular",
9898
+ value: "240301",
9899
+ minCoordinates: 3,
9900
+ geometry: "area",
9901
+ geometryTypes: [
9902
+ "Polygon",
9903
+ "MultiLineString",
9904
+ "Point"
9905
+ ],
9906
+ drawRule: "Area1",
9907
+ capturesLabelSize: true,
9908
+ params: [...AREA_SMOOTH_PARAMS, AREA_LABEL_PADDING_PARAM],
9909
+ textAmplifiers: [...NO_FIRE_AREA_TEXT_AMPLIFIERS, AREA_HOSTILE_AMPLIFIER]
9910
+ };
9911
+ function makeLabel(out, point, text, options, properties = {}) {
9912
+ pushLabel(out, point, text, HORIZONTAL_LABEL_ROTATION, labelSizeProps(options), properties.textAnchor, properties.amplifierField, properties.labelPlacementKey);
9913
+ Object.assign(out[out.length - 1].properties, {
9914
+ textBackground: true,
9915
+ ...properties.labelPlacement === false ? { labelPlacement: false } : {}
9916
+ });
9917
+ }
9918
+ /** Creates a back-hatched irregular NFA with its centered movable label fields. */
9919
+ function createNoFireAreaIrregular(positions, options = {}, textAmplifiers = {}, context = {}) {
9920
+ const { smooth = false, smoothResolution = 16 } = options;
9921
+ const verts = buildClosedRing(positions, smooth, smoothResolution, 16);
9922
+ const [cx, cy] = ringCentroid(verts);
9923
+ const hasWindow = Boolean(textAmplifiers.W || textAmplifiers.W1);
9924
+ const rowCount = 1 + (textAmplifiers.T ? 1 : 0) + (hasWindow ? 1 : 0);
9925
+ const pitch = resolveLabelOffsetMeters(options, 1.2 + Math.max(0, options.labelPadding ?? .7));
9926
+ let rowIndex = 0;
9927
+ const rowY = () => cy + ((rowCount - 1) / 2 - rowIndex++) * pitch;
9928
+ const labels = [];
9929
+ makeLabel(labels, [cx, rowY()], "NFA", options, { labelPlacementKey: "label:nfa" });
9930
+ if (textAmplifiers.T) makeLabel(labels, [cx, rowY()], textAmplifiers.T, options, { amplifierField: "T" });
9931
+ if (hasWindow) {
9932
+ const y = rowY();
9933
+ if (textAmplifiers.W && textAmplifiers.W1) {
9934
+ const separatorGap = resolveLabelOffsetMeters(options, 1.8);
9935
+ makeLabel(labels, [cx - separatorGap, y], textAmplifiers.W, options, {
9936
+ amplifierField: "W",
9937
+ textAnchor: "end"
9938
+ });
9939
+ makeLabel(labels, [cx, y], "–", options, { labelPlacement: false });
9940
+ makeLabel(labels, [cx + separatorGap, y], textAmplifiers.W1, options, {
9941
+ amplifierField: "W1",
9942
+ textAnchor: "start"
9943
+ });
9944
+ } else if (textAmplifiers.W) makeLabel(labels, [cx, y], textAmplifiers.W, options, { amplifierField: "W" });
9945
+ else if (textAmplifiers.W1) makeLabel(labels, [cx, y], textAmplifiers.W1, options, { amplifierField: "W1" });
9946
+ }
9947
+ return {
9948
+ type: "FeatureCollection",
9949
+ features: [...patternedAreaFeatures(verts, pushAreaLabels(labels, verts, { hostile: textAmplifiers.N }, options, context.amplifierPlacements), "backhachure"), ...labels]
9950
+ };
9951
+ }
9952
+ const NO_FIRE_AREA_IRREGULAR = defineControlMeasure({
9953
+ metadata: NO_FIRE_AREA_IRREGULAR_METADATA,
9954
+ generator: createNoFireAreaIrregular,
9955
+ defaultOptions: DEFAULT_NO_FIRE_AREA_IRREGULAR_OPTIONS,
9956
+ rule: area1DrawRule,
9957
+ previewSample: {
9958
+ controlPoints: [
9959
+ [-1, -.15],
9960
+ [-.55, -.55],
9961
+ [.65, -.5],
9962
+ [1, .15],
9963
+ [.45, .6],
9964
+ [-.5, .5]
9965
+ ],
9966
+ textAmplifiers: {
9967
+ T: "T",
9968
+ W: "W",
9969
+ W1: "W1"
9970
+ },
9971
+ options: {
9972
+ labelSize: 72,
9973
+ labelPadding: .7
9974
+ }
9975
+ }
9976
+ });
9977
+ //#endregion
9660
9978
  //#region src/generators/cm15-maneuver-areas/mainAttack.ts
9661
9979
  const DEFAULT_MAIN_ATTACK_OPTIONS = {
9662
9980
  shaftWidthRatio: DEFAULT_SHAFT_WIDTH_RATIO,
@@ -11050,6 +11368,8 @@ const DEFINITIONS = {
11050
11368
  "drop-zone": DROP_ZONE,
11051
11369
  "extraction-zone": EXTRACTION_ZONE,
11052
11370
  "landing-zone": LANDING_ZONE,
11371
+ "limited-access-area": LIMITED_ACCESS_AREA,
11372
+ "no-fire-area-irregular": NO_FIRE_AREA_IRREGULAR,
11053
11373
  "pickup-zone": PICKUP_ZONE,
11054
11374
  "assault-position": ASSAULT_POSITION,
11055
11375
  "attack-position": ATTACK_POSITION,
@@ -11297,6 +11617,7 @@ function normalizeFeature(id, feature, index, generatedLabelOrdinal, measureStyl
11297
11617
  const textSizePixels = typeof sourceProps.textSizePixels === "number" ? sourceProps.textSizePixels : void 0;
11298
11618
  const textSizeMeters = typeof sourceProps.textSizeMeters === "number" ? sourceProps.textSizeMeters : void 0;
11299
11619
  const textAnchor = sourceProps.textAnchor === "start" || sourceProps.textAnchor === "end" ? sourceProps.textAnchor : void 0;
11620
+ const textBackground = sourceProps.textBackground === true ? true : void 0;
11300
11621
  const amplifierField = typeof sourceProps.amplifierField === "string" ? canonicalTextAmplifierKey(sourceProps.amplifierField) : void 0;
11301
11622
  const labelPlacementKey = resolveLabelPlacementKey(sourceProps, amplifierField, text, feature.geometry.type, part, generatedLabelOrdinal);
11302
11623
  const resolvedPlacement = labelPlacementKey ? resolveAmplifierPlacement(amplifierPlacements?.[labelPlacementKey]) : void 0;
@@ -11315,6 +11636,7 @@ function normalizeFeature(id, feature, index, generatedLabelOrdinal, measureStyl
11315
11636
  ...text !== void 0 ? { text } : {},
11316
11637
  ...resolvedRotation !== void 0 ? { rotation: resolvedRotation } : {},
11317
11638
  ...textAnchor !== void 0 ? { textAnchor } : {},
11639
+ ...textBackground !== void 0 ? { textBackground } : {},
11318
11640
  ...amplifierField !== void 0 ? { amplifierField } : {},
11319
11641
  ...labelPlacementKey !== void 0 ? { labelPlacementKey } : {},
11320
11642
  ...textSizePixels !== void 0 ? { textSizePixels } : {},
@@ -11369,4 +11691,4 @@ function assertNever(value) {
11369
11691
  throw new Error(`Unhandled control measure kind: ${String(value)}`);
11370
11692
  }
11371
11693
  //#endregion
11372
- export { DEFAULT_BLOCK_ARROW_OPTIONS as $, DEFAULT_FLOT_OPTIONS as A, disruptDrawRule as At, DEFAULT_GENERIC_RECTANGLE_OPTIONS as B, project as Bt, DEFAULT_SCREEN_OPTIONS as C, line23DrawRule as Ct, DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS as D, attackByFireDrawRule as Dt, DEFAULT_FORTIFIED_LINE_OPTIONS as E, ambushDrawRule as Et, DEFAULT_GUARD_OPTIONS as F, pointOnMidpointPerpendicularAxis as Ft, DEFAULT_CANALIZE_OPTIONS as G, DEFAULT_GENERIC_LINE_OPTIONS as H, EPSILON as Ht, DEFAULT_DELAY_OPTIONS as I, snapToMidpointPerpendicular as It, DEFAULT_BLOCK_MISSION_TASK_OPTIONS as J, DEFAULT_BYPASS_OPTIONS as K, DEFAULT_COVER_OPTIONS as L, createBaselineFrame as Lt, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS as M, computeDefaultMidpointPerpendicularPoint as Mt, DEFAULT_ENCIRCLEMENT_OPTIONS as N, createMidpointPerpendicularDrawRule as Nt, DEFAULT_HANDOVER_LINE_OPTIONS as O, point12DrawRule as Ot, DEFAULT_DISRUPT_OPTIONS as P, getMidpointPerpendicularSignedDistance as Pt, DEFAULT_BOUNDARY_OPTIONS as Q, DEFAULT_TACTICAL_ARROW_OPTIONS as R, calculateMetrics as Rt, DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS as S, line24DrawRule as St, DEFAULT_FORTIFIED_AREA_OPTIONS as T, line1DrawRule as Tt, DEFAULT_GENERIC_CIRCLE_OPTIONS as U, getMetersPerPixel as Ut, DEFAULT_GENERIC_POLYGON_OPTIONS as V, unproject as Vt, DEFAULT_CLASSIC_ARROW_OPTIONS as W, roundToFixed as Wt, DEFAULT_ENGINEER_WORK_LINE_OPTIONS as X, DEFAULT_GENERIC_C2_LINE_OPTIONS as Y, DEFAULT_LIGHT_LINE_OPTIONS as Z, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS as _, DEFAULT_AIRBORNE_ATTACK_OPTIONS as _t, DEFINITIONS as a, DEFAULT_ANTITANK_DITCH_OPTIONS as at, DEFAULT_MAIN_ATTACK_OPTIONS as b, supportByFireDrawRule as bt, getDefaultOptions as c, DEFAULT_AREA_DEFENSE_OPTIONS as ct, DEFAULT_TURN_OPTIONS as d, normalizeTextAmplifiers as dt, DEFAULT_BLOCK_OPTIONS as et, DEFAULT_SUPPORTING_ATTACK_OPTIONS as f, resolveAmplifierPlacement as ft, DEFAULT_PICKUP_ZONE_OPTIONS as g, DEFAULT_AMBUSH_OPTIONS as gt, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS as h, DEFAULT_DIRECTION_OF_ATTACK_AVIATION_OPTIONS as ht, CONTROL_MEASURE_METADATA as i, DEFAULT_ANTITANK_WALL_OPTIONS as it, DEFAULT_FIX_OPTIONS as j, blockDrawRule as jt, DEFAULT_PHASE_LINE_OPTIONS as k, centerRadiusDrawRule as kt, listControlMeasureMetadata as l, TEXT_AMPLIFIER_FIELDS as lt, DEFAULT_STRONG_POINT_OPTIONS as m, DEFAULT_DIRECTION_OF_MAIN_ATTACK_OPTIONS as mt, resolveStyleHints as n, DEFAULT_ATTACK_HELICOPTER_OPTIONS as nt, getControlMeasureMetadata as o, DEFAULT_ASSEMBLY_AREA_OPTIONS as ot, DEFAULT_SUPPORT_BY_FIRE_OPTIONS as p, DEFAULT_DIRECTION_OF_SUPPORTING_ATTACK_OPTIONS as pt, DEFAULT_BREACH_OPTIONS as q, CONTROL_MEASURE_IDS as r, DEFAULT_ATTACK_BY_FIRE_OPTIONS as rt, getControlMeasureMetadataByValue as s, DEFAULT_AREA_OF_OPERATIONS_OPTIONS as st, renderControlMeasure as t, DEFAULT_BATTLE_POSITION_OPTIONS as tt, DEFAULT_TURNING_MOVEMENT_OPTIONS as u, canonicalTextAmplifierKey as ut, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS as v, rectangleDrawRule as vt, DEFAULT_FRONTAL_ATTACK_OPTIONS as w, turnDrawRule as wt, DEFAULT_LANDING_ZONE_OPTIONS as x, line26DrawRule as xt, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS as y, axis1DrawRule as yt, DEFAULT_CLEAR_OPTIONS as z, computeInitialWidthPoint as zt };
11694
+ export { DEFAULT_BLOCK_ARROW_OPTIONS as $, DEFAULT_FLOT_OPTIONS as A, disruptDrawRule as At, DEFAULT_GENERIC_RECTANGLE_OPTIONS as B, haversineDistance as Bt, DEFAULT_SCREEN_OPTIONS as C, line23DrawRule as Ct, DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS as D, attackByFireDrawRule as Dt, DEFAULT_FORTIFIED_LINE_OPTIONS as E, ambushDrawRule as Et, DEFAULT_GUARD_OPTIONS as F, pointOnMidpointPerpendicularAxis as Ft, DEFAULT_CANALIZE_OPTIONS as G, roundToFixed as Gt, DEFAULT_GENERIC_LINE_OPTIONS as H, unproject as Ht, DEFAULT_DELAY_OPTIONS as I, snapToMidpointPerpendicular as It, DEFAULT_BLOCK_MISSION_TASK_OPTIONS as J, DEFAULT_BYPASS_OPTIONS as K, DEFAULT_COVER_OPTIONS as L, createBaselineFrame as Lt, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS as M, computeDefaultMidpointPerpendicularPoint as Mt, DEFAULT_ENCIRCLEMENT_OPTIONS as N, createMidpointPerpendicularDrawRule as Nt, DEFAULT_HANDOVER_LINE_OPTIONS as O, point12DrawRule as Ot, DEFAULT_DISRUPT_OPTIONS as P, getMidpointPerpendicularSignedDistance as Pt, DEFAULT_BOUNDARY_OPTIONS as Q, DEFAULT_TACTICAL_ARROW_OPTIONS as R, calculateMetrics as Rt, DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS as S, line24DrawRule as St, DEFAULT_FORTIFIED_AREA_OPTIONS as T, line1DrawRule as Tt, DEFAULT_GENERIC_CIRCLE_OPTIONS as U, EPSILON as Ut, DEFAULT_GENERIC_POLYGON_OPTIONS as V, project as Vt, DEFAULT_CLASSIC_ARROW_OPTIONS as W, getMetersPerPixel as Wt, DEFAULT_ENGINEER_WORK_LINE_OPTIONS as X, DEFAULT_GENERIC_C2_LINE_OPTIONS as Y, DEFAULT_LIGHT_LINE_OPTIONS as Z, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS as _, DEFAULT_AIRBORNE_ATTACK_OPTIONS as _t, DEFINITIONS as a, DEFAULT_ANTITANK_DITCH_OPTIONS as at, DEFAULT_MAIN_ATTACK_OPTIONS as b, supportByFireDrawRule as bt, getDefaultOptions as c, DEFAULT_AREA_DEFENSE_OPTIONS as ct, DEFAULT_TURN_OPTIONS as d, normalizeTextAmplifiers as dt, DEFAULT_BLOCK_OPTIONS as et, DEFAULT_SUPPORTING_ATTACK_OPTIONS as f, resolveAmplifierPlacement as ft, DEFAULT_PICKUP_ZONE_OPTIONS as g, DEFAULT_AMBUSH_OPTIONS as gt, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS as h, DEFAULT_DIRECTION_OF_ATTACK_AVIATION_OPTIONS as ht, CONTROL_MEASURE_METADATA as i, DEFAULT_ANTITANK_WALL_OPTIONS as it, DEFAULT_FIX_OPTIONS as j, blockDrawRule as jt, DEFAULT_PHASE_LINE_OPTIONS as k, centerRadiusDrawRule as kt, listControlMeasureMetadata as l, TEXT_AMPLIFIER_FIELDS as lt, DEFAULT_STRONG_POINT_OPTIONS as m, DEFAULT_DIRECTION_OF_MAIN_ATTACK_OPTIONS as mt, resolveStyleHints as n, DEFAULT_ATTACK_HELICOPTER_OPTIONS as nt, getControlMeasureMetadata as o, DEFAULT_ASSEMBLY_AREA_OPTIONS as ot, DEFAULT_SUPPORT_BY_FIRE_OPTIONS as p, DEFAULT_DIRECTION_OF_SUPPORTING_ATTACK_OPTIONS as pt, DEFAULT_BREACH_OPTIONS as q, CONTROL_MEASURE_IDS as r, DEFAULT_ATTACK_BY_FIRE_OPTIONS as rt, getControlMeasureMetadataByValue as s, DEFAULT_AREA_OF_OPERATIONS_OPTIONS as st, renderControlMeasure as t, DEFAULT_BATTLE_POSITION_OPTIONS as tt, DEFAULT_TURNING_MOVEMENT_OPTIONS as u, canonicalTextAmplifierKey as ut, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS as v, rectangleDrawRule as vt, DEFAULT_FRONTAL_ATTACK_OPTIONS as w, turnDrawRule as wt, DEFAULT_LANDING_ZONE_OPTIONS as x, line26DrawRule as xt, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS as y, axis1DrawRule as yt, DEFAULT_CLEAR_OPTIONS as z, computeInitialWidthPoint as zt };
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 103.6966679985627 48" width="96" height="48" role="img" aria-label="Airfield zone"><rect x="0" y="0" width="103.6966679985627" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M15.63 39.20 L17.88 40.09 L20.74 40.86 L24.14 41.52 L27.98 42.05 L32.18 42.46 L36.65 42.76 L41.30 42.94 L46.03 43.00 L50.77 42.94 L55.41 42.76 L59.88 42.46 L64.08 42.05 L67.93 41.52 L71.33 40.86 L74.19 40.09 L76.43 39.20 L78.21 38.08 L79.76 36.65 L81.07 34.95 L82.14 33.02 L82.96 30.93 L83.56 28.69 L83.91 26.37 L84.03 24.00 L83.91 21.63 L83.56 19.31 L82.96 17.07 L82.13 14.98 L81.07 13.05 L79.76 11.35 L78.21 9.92 L76.43 8.80 L74.19 7.91 L71.33 7.14 L67.93 6.48 L64.08 5.95 L59.88 5.54 L55.41 5.24 L50.77 5.06 L46.03 5.00 L41.30 5.06 L36.65 5.24 L32.18 5.54 L27.98 5.95 L24.14 6.48 L20.74 7.14 L17.88 7.91 L15.63 8.80 L13.85 9.92 L12.31 11.35 L11.00 13.05 L9.94 14.98 L9.10 17.07 L8.51 19.31 L8.15 21.63 L8.03 24.00 L8.15 26.37 L8.51 28.69 L9.10 30.93 L9.94 33.02 L11.00 34.95 L12.31 36.65 L13.85 38.08 L15.63 39.20 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><path d="M25.85 29.41 L66.22 18.59" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M38.65 32.80 L53.42 15.20" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(0.000 87.967 24.000)"><text x="87.96688" y="24" fill="#1e293b" font-family="sans-serif" font-size="5.243262666187567" font-weight="600" text-anchor="start" dominant-baseline="central">570M</text></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Area Defense"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M64.29 21.22 L64.08 20.16 L63.79 19.12 L63.43 18.10 L63.01 17.10 L62.52 16.14 L61.97 15.20 L61.37 14.31 L60.70 13.46 L59.98 12.65 L59.20 11.90 L58.38 11.20 L57.52 10.55 L56.61 9.96 L55.66 9.43 L54.69 8.97 L53.68 8.57 L52.65 8.24 L51.60 7.97 L50.54 7.78 L49.46 7.65 L48.38 7.60 L47.30 7.63 L46.23 7.72 L45.16 7.88 L44.10 8.11 L43.06 8.41 L42.05 8.78 L41.06 9.21 L40.09 9.71 L39.17 10.27 L38.29 10.89 L37.44 11.57 L36.65 12.30 L35.90 13.08 L35.21 13.92 L34.57 14.79 L33.99 15.71 L33.48 16.65 L33.03 17.64 L32.64 18.65 L32.32 19.68" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M64.27 26.91 L64.04 27.97 L63.74 29.01 L63.38 30.03 L62.95 31.02 L62.45 31.98 L61.90 32.91 L61.28 33.80 L60.61 34.64 L59.87 35.44 L59.09 36.19 L58.27 36.89 L57.39 37.53 L56.48 38.11 L55.53 38.62 L54.55 39.08 L53.54 39.47 L52.51 39.80 L51.46 40.05 L50.40 40.24 L49.32 40.35 L48.24 40.39 L47.16 40.36 L46.08 40.26 L45.01 40.09 L43.96 39.85 L42.92 39.54 L41.91 39.16 L40.92 38.72 L39.97 38.21 L39.05 37.64 L38.17 37.01 L37.33 36.32 L36.54 35.58 L35.81 34.80 L35.12 33.96 L34.49 33.08 L33.92 32.16 L33.41 31.21 L32.97 30.22 L32.59 29.20 L32.28 28.17" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M34.66 17.26 L32.32 19.68 L31.53 16.41" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M31.47 31.44 L32.28 28.17 L34.61 30.61" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M59.95 12.63 L60.74 9.75 L57.98 10.89 L59.95 12.63 Z" fill="#1e293b" fill-opacity="1" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><path d="M50.23 7.74 L49.05 5.00 L47.61 7.61 L50.23 7.74 Z" fill="#1e293b" fill-opacity="1" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><path d="M39.59 10.00 L36.96 8.61 L37.47 11.54 L39.59 10.00 Z" fill="#1e293b" fill-opacity="1" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><path d="M57.87 37.19 L60.61 38.35 L59.85 35.47 L57.87 37.19 Z" fill="#1e293b" fill-opacity="1" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><path d="M47.47 40.37 L48.88 43.00 L50.09 40.27 L47.47 40.37 Z" fill="#1e293b" fill-opacity="1" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><path d="M37.36 36.35 L36.82 39.28 L39.47 37.91 L37.36 36.35 Z" fill="#1e293b" fill-opacity="1" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><g transform="rotate(0.000 64.533 24.070)"><text x="64.53308108108108" y="24.069837837837838" fill="#1e293b" font-family="sans-serif" font-size="3.3213234794262467" font-weight="600" text-anchor="middle" dominant-baseline="central">AD</text></g></svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Area of operations"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M10.00 43.00 L86.00 43.00 L86.00 5.00 L10.00 5.00 L10.00 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><text x="48" y="24" fill="#1e293b" font-size="6.554078332734459" font-weight="600" text-anchor="middle" dominant-baseline="central" transform="rotate(0.000 48.000 24.000)">AO GREEN</text></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Area of operations"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M10.00 43.00 L86.00 43.00 L86.00 5.00 L10.00 5.00 L10.00 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><g transform="rotate(0.000 48.000 24.000)"><text x="48" y="24" fill="#1e293b" font-family="sans-serif" font-size="6.554078332734459" font-weight="600" text-anchor="middle" dominant-baseline="central">AO GREEN</text></g></svg>
package/media/area.svg ADDED
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Area"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M10.00 43.00 L86.00 43.00 L86.00 5.00 L10.00 5.00 L10.00 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Assault position"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M10.00 43.00 L86.00 43.00 L86.00 5.00 L10.00 5.00 L10.00 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><g transform="rotate(0.000 48.000 24.000)"><text x="48" y="24" fill="#1e293b" font-family="sans-serif" font-size="5.6304985337243405" font-weight="600" text-anchor="middle" dominant-baseline="central">ASLT DANUBE</text></g></svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Assembly area"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M10.00 43.00 L86.00 43.00 L86.00 5.00 L10.00 5.00 L10.00 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><text x="48" y="24" fill="#1e293b" font-size="6.554078332734459" font-weight="600" text-anchor="middle" dominant-baseline="central" transform="rotate(0.000 48.000 24.000)">AA BLUE</text></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Assembly area"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M10.00 43.00 L86.00 43.00 L86.00 5.00 L10.00 5.00 L10.00 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><g transform="rotate(0.000 48.000 24.000)"><text x="48" y="24" fill="#1e293b" font-family="sans-serif" font-size="6.554078332734459" font-weight="600" text-anchor="middle" dominant-baseline="central">AA BLUE</text></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Attack position"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M10.00 43.00 L86.00 43.00 L86.00 5.00 L10.00 5.00 L10.00 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><g transform="rotate(0.000 48.000 24.000)"><text x="48" y="24" fill="#1e293b" font-family="sans-serif" font-size="6.554078332734459" font-weight="600" text-anchor="middle" dominant-baseline="central">ATK NILE</text></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Base camp"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M17.60 39.20 L19.84 40.09 L22.71 40.86 L26.11 41.52 L29.95 42.05 L34.15 42.46 L38.62 42.76 L43.26 42.94 L48.00 43.00 L52.74 42.94 L57.38 42.76 L61.85 42.46 L66.05 42.05 L69.89 41.52 L73.29 40.86 L76.16 40.09 L78.40 39.20 L80.18 38.08 L81.73 36.65 L83.03 34.95 L84.10 33.02 L84.93 30.93 L85.53 28.69 L85.88 26.37 L86.00 24.00 L85.88 21.63 L85.53 19.31 L84.93 17.07 L84.10 14.98 L83.03 13.05 L81.73 11.35 L80.18 9.92 L78.40 8.80 L76.16 7.91 L73.29 7.14 L69.89 6.48 L66.05 5.95 L61.85 5.54 L57.38 5.24 L52.74 5.06 L48.00 5.00 L43.26 5.06 L38.62 5.24 L34.15 5.54 L29.95 5.95 L26.11 6.48 L22.71 7.14 L19.84 7.91 L17.60 8.80 L15.82 9.92 L14.27 11.35 L12.97 13.05 L11.90 14.98 L11.07 17.07 L10.47 19.31 L10.12 21.63 L10.00 24.00 L10.12 26.37 L10.47 28.69 L11.07 30.93 L11.90 33.02 L12.97 34.95 L14.27 36.65 L15.82 38.08 L17.60 39.20 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><g transform="rotate(0.000 48.000 24.000)"><text x="48" y="24" fill="#1e293b" font-family="sans-serif" font-size="4.423963133640553" font-weight="600" text-anchor="middle" dominant-baseline="central">BC LEATHERNECK</text></g></svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Battle handover line"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.00 26.22 L91.00 26.22" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><text x="7.227399999999998" y="21.7769" fill="#1e293b" font-size="7.416457060725835" font-weight="600" text-anchor="start" dominant-baseline="central" transform="rotate(0.000 7.227 21.777)">BHL</text><text x="88.7726" y="21.7769" fill="#1e293b" font-size="7.416457060725835" font-weight="600" text-anchor="end" dominant-baseline="central" transform="rotate(0.000 88.773 21.777)">BHL</text></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Battle handover line"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.00 26.22 L91.00 26.22" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(0.000 7.227 21.777)"><text x="7.227399999999998" y="21.7769" fill="#1e293b" font-family="sans-serif" font-size="7.416457060725835" font-weight="600" text-anchor="start" dominant-baseline="central">BHL</text></g><g transform="rotate(0.000 88.773 21.777)"><text x="88.7726" y="21.7769" fill="#1e293b" font-family="sans-serif" font-size="7.416457060725835" font-weight="600" text-anchor="end" dominant-baseline="central">BHL</text></g></svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Battle Position"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M21.43 34.89 L23.39 35.66 L25.90 36.34 L28.87 36.91 L32.23 37.38 L35.90 37.74 L39.25 37.96" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M52.61 38.14 L56.20 38.00 L60.10 37.74 L63.77 37.38 L67.13 36.91 L70.10 36.34 L72.61 35.66 L74.57 34.89 L76.12 33.91 L77.47 32.66 L78.61 31.17 L79.55 29.49 L80.27 27.66 L80.79 25.70 L81.10 23.67 L81.21 21.60 L81.10 19.54 L80.79 17.51 L80.27 15.55 L79.54 13.72 L78.61 12.03 L77.47 10.55 L76.12 9.30 L74.57 8.32 L72.61 7.55 L70.10 6.87 L67.13 6.30 L63.77 5.83 L60.10 5.47 L56.20 5.21 L52.14 5.05 L48.00 5.00 L43.86 5.05 L39.80 5.21 L35.90 5.47 L32.23 5.83 L28.87 6.30 L25.90 6.87 L23.39 7.55 L21.43 8.32 L19.88 9.30 L18.53 10.55 L17.39 12.03 L16.46 13.72 L15.73 15.55 L15.21 17.51 L14.90 19.54 L14.79 21.60 L14.90 23.67 L15.21 25.70 L15.73 27.66 L16.46 29.49 L17.39 31.17 L18.53 32.66 L19.88 33.91 L21.43 34.89" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M42.17 33.36 L42.05 42.90" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M49.81 33.46 L49.69 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><text x="48" y="21.603747203579417" fill="#1e293b" font-size="4.58198988586022" font-weight="600" text-anchor="middle" dominant-baseline="central" transform="rotate(0.000 48.000 21.604)">ALFA</text></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Battle Position"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M21.43 34.89 L23.39 35.66 L25.90 36.34 L28.87 36.91 L32.23 37.38 L35.90 37.74 L39.25 37.96" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M52.61 38.14 L56.20 38.00 L60.10 37.74 L63.77 37.38 L67.13 36.91 L70.10 36.34 L72.61 35.66 L74.57 34.89 L76.12 33.91 L77.47 32.66 L78.61 31.17 L79.55 29.49 L80.27 27.66 L80.79 25.70 L81.10 23.67 L81.21 21.60 L81.10 19.54 L80.79 17.51 L80.27 15.55 L79.54 13.72 L78.61 12.03 L77.47 10.55 L76.12 9.30 L74.57 8.32 L72.61 7.55 L70.10 6.87 L67.13 6.30 L63.77 5.83 L60.10 5.47 L56.20 5.21 L52.14 5.05 L48.00 5.00 L43.86 5.05 L39.80 5.21 L35.90 5.47 L32.23 5.83 L28.87 6.30 L25.90 6.87 L23.39 7.55 L21.43 8.32 L19.88 9.30 L18.53 10.55 L17.39 12.03 L16.46 13.72 L15.73 15.55 L15.21 17.51 L14.90 19.54 L14.79 21.60 L14.90 23.67 L15.21 25.70 L15.73 27.66 L16.46 29.49 L17.39 31.17 L18.53 32.66 L19.88 33.91 L21.43 34.89" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M42.17 33.36 L42.05 42.90" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M49.81 33.46 L49.69 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(0.000 48.000 21.604)"><text x="48" y="21.603747203579417" fill="#1e293b" font-family="sans-serif" font-size="4.58198988586022" font-weight="600" text-anchor="middle" dominant-baseline="central">ALFA</text></g></svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Block Arrow"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.00 15.40 L62.83 15.40 L77.66 15.40 L77.66 12.14 L91.00 24.00 L77.66 35.86 L77.66 32.60 L62.83 32.60 L5.00 32.60 L5.00 15.40 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Block Arrow"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.00 15.40 L62.83 15.40 L77.66 15.40 L77.66 12.14 L91.00 24.00 L77.66 35.86 L77.66 32.60 L62.83 32.60 L5.00 32.60 L5.00 15.40 Z" fill="#1e293b" fill-opacity="1" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/></svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Block"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M76.50 5.00 L76.50 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M76.50 24.00 L51.80 24.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M44.20 24.00 L19.50 24.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><text x="48" y="24" fill="#1e293b" font-size="11" font-weight="600" text-anchor="middle" dominant-baseline="central" transform="rotate(0.000 48.000 24.000)">B</text></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Block"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M76.50 5.00 L76.50 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M76.50 24.00 L51.80 24.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M44.20 24.00 L19.50 24.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(0.000 48.000 24.000)"><text x="48" y="24" fill="#1e293b" font-family="sans-serif" font-size="11" font-weight="600" text-anchor="middle" dominant-baseline="central">B</text></g></svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Boundary"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.00 24.00 L39.89 24.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M56.11 24.00 L91.00 24.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M43.37 29.79 L43.37 18.21" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M52.63 29.79 L52.63 18.21" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Boundary"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.00 24.00 L39.89 24.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M56.11 24.00 L91.00 24.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M43.37 29.79 L43.37 18.21" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M52.63 29.79 L52.63 18.21" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(0.000 48.000 12.992)"><text x="48" y="12.991999999999999" fill="#1e293b" font-family="sans-serif" font-size="7.68" font-weight="600" text-anchor="middle" dominant-baseline="central">2INF</text></g><g transform="rotate(0.000 48.000 35.008)"><text x="48" y="35.008" fill="#1e293b" font-family="sans-serif" font-size="7.68" font-weight="600" text-anchor="middle" dominant-baseline="central">3INF</text></g></svg>
package/media/breach.svg CHANGED
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Breach"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M17.28 35.72 L10.00 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M13.64 39.36 L13.64 5.00 L41.13 5.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M54.87 5.00 L82.36 5.00 L82.36 39.36" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M78.72 35.72 L86.00 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><text x="48" y="5" fill="#1e293b" font-size="11" font-weight="600" text-anchor="middle" dominant-baseline="central" transform="rotate(-270.000 48.000 5.000)">B</text></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Breach"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M17.28 35.72 L10.00 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M13.64 39.36 L13.64 5.00 L41.13 5.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M54.87 5.00 L82.36 5.00 L82.36 39.36" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M78.72 35.72 L86.00 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(-270.000 48.000 5.000)"><text x="48" y="5" fill="#1e293b" font-family="sans-serif" font-size="11" font-weight="600" text-anchor="middle" dominant-baseline="central">B</text></g></svg>
package/media/bypass.svg CHANGED
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Bypass"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M14.56 33.88 L10.00 43.00 L5.44 33.88" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M10.00 43.00 L10.00 5.00 L40.40 5.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M55.60 5.00 L86.00 5.00 L86.00 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M90.56 33.88 L86.00 43.00 L81.44 33.88" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><text x="48" y="5" fill="#1e293b" font-size="11" font-weight="600" text-anchor="middle" dominant-baseline="central" transform="rotate(-270.000 48.000 5.000)">B</text></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Bypass"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M14.56 33.88 L10.00 43.00 L5.44 33.88" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M10.00 43.00 L10.00 5.00 L40.40 5.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M55.60 5.00 L86.00 5.00 L86.00 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M90.56 33.88 L86.00 43.00 L81.44 33.88" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(-270.000 48.000 5.000)"><text x="48" y="5" fill="#1e293b" font-family="sans-serif" font-size="11" font-weight="600" text-anchor="middle" dominant-baseline="central">B</text></g></svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Canalize"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M17.28 43.00 L10.00 35.72" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M13.64 39.36 L13.64 5.00 L41.13 5.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M54.87 5.00 L82.36 5.00 L82.36 39.36" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M78.72 43.00 L86.00 35.72" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><text x="48" y="5" fill="#1e293b" font-size="11" font-weight="600" text-anchor="middle" dominant-baseline="central" transform="rotate(-270.000 48.000 5.000)">C</text></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Canalize"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M17.28 43.00 L10.00 35.72" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M13.64 39.36 L13.64 5.00 L41.13 5.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M54.87 5.00 L82.36 5.00 L82.36 39.36" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M78.72 43.00 L86.00 35.72" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(-270.000 48.000 5.000)"><text x="48" y="5" fill="#1e293b" font-family="sans-serif" font-size="11" font-weight="600" text-anchor="middle" dominant-baseline="central">C</text></g></svg>
package/media/clear.svg CHANGED
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Clear"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M10.00 43.00 L86.00 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M21.40 5.00 L21.40 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M29.00 31.60 L21.40 43.00 L13.80 31.60" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M48.00 5.00 L48.00 20.20" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M48.00 27.80 L48.00 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M55.60 31.60 L48.00 43.00 L40.40 31.60" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M74.60 5.00 L74.60 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M82.20 31.60 L74.60 43.00 L67.00 31.60" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><text x="48" y="24" fill="#1e293b" font-size="11" font-weight="600" text-anchor="middle" dominant-baseline="central" transform="rotate(-270.000 48.000 24.000)">C</text></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Clear"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M10.00 43.00 L86.00 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M21.40 5.00 L21.40 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M29.00 31.60 L21.40 43.00 L13.80 31.60" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M48.00 5.00 L48.00 20.20" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M48.00 27.80 L48.00 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M55.60 31.60 L48.00 43.00 L40.40 31.60" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M74.60 5.00 L74.60 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M82.20 31.60 L74.60 43.00 L67.00 31.60" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(-270.000 48.000 24.000)"><text x="48" y="24" fill="#1e293b" font-family="sans-serif" font-size="11" font-weight="600" text-anchor="middle" dominant-baseline="central">C</text></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Cover"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M35.10 24.00 L18.55 26.11 L21.55 21.89 L5.00 24.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M8.61 25.81 L5.00 24.00 L8.61 22.19" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M60.90 24.00 L77.45 21.89 L74.45 26.11 L91.00 24.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M87.39 22.19 L91.00 24.00 L87.39 25.81" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(0.000 40.260 24.000)"><text x="40.260000000000005" y="24" fill="#1e293b" font-family="sans-serif" font-size="6.952928494430471" font-weight="600" text-anchor="middle" dominant-baseline="central">C</text></g><g transform="rotate(0.000 55.740 24.000)"><text x="55.74" y="24" fill="#1e293b" font-family="sans-serif" font-size="6.952928494430471" font-weight="600" text-anchor="middle" dominant-baseline="central">C</text></g></svg>
package/media/delay.svg CHANGED
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Delay"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.59 38.93 L33.41 38.93" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M45.62 38.93 L73.45 38.93" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M13.73 43.00 L5.59 38.93 L13.73 34.86" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M73.45 38.93 L75.11 38.85 L76.76 38.60 L78.37 38.20 L79.94 37.64 L81.44 36.93 L82.87 36.07 L84.21 35.08 L85.44 33.96 L86.56 32.73 L87.55 31.39 L88.41 29.96 L89.12 28.46 L89.68 26.89 L90.09 25.28 L90.33 23.63 L90.41 21.96 L90.33 20.30 L90.09 18.65 L89.68 17.04 L89.12 15.47 L88.41 13.97 L87.55 12.54 L86.56 11.20 L85.44 9.97 L84.21 8.85 L82.87 7.86 L81.44 7.00 L79.94 6.29 L78.37 5.73 L76.76 5.33 L75.11 5.08 L73.45 5.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><text x="39.51785714285714" y="38.92857142857143" fill="#1e293b" font-size="11" font-weight="600" text-anchor="middle" dominant-baseline="central" transform="rotate(0.000 39.518 38.929)">D</text></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Delay"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.59 38.93 L33.41 38.93" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M45.62 38.93 L73.45 38.93" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M13.73 43.00 L5.59 38.93 L13.73 34.86" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M73.45 38.93 L75.11 38.85 L76.76 38.60 L78.37 38.20 L79.94 37.64 L81.44 36.93 L82.87 36.07 L84.21 35.08 L85.44 33.96 L86.56 32.73 L87.55 31.39 L88.41 29.96 L89.12 28.46 L89.68 26.89 L90.09 25.28 L90.33 23.63 L90.41 21.96 L90.33 20.30 L90.09 18.65 L89.68 17.04 L89.12 15.47 L88.41 13.97 L87.55 12.54 L86.56 11.20 L85.44 9.97 L84.21 8.85 L82.87 7.86 L81.44 7.00 L79.94 6.29 L78.37 5.73 L76.76 5.33 L75.11 5.08 L73.45 5.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(0.000 39.518 38.929)"><text x="39.51785714285714" y="38.92857142857143" fill="#1e293b" font-family="sans-serif" font-size="11" font-weight="600" text-anchor="middle" dominant-baseline="central">D</text></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Direction of Attack — Airborne/Aviation"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.00 20.79 L29.36 20.79" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M37.96 20.79 L53.07 20.79" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M71.61 20.79 L91.00 20.79" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M80.68 14.85 L91.00 20.79 L80.68 26.72" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M29.36 18.64 L29.36 22.94 L37.96 18.64 L37.96 22.94 L29.36 18.64" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(0.000 62.336 20.788)"><text x="62.3362" y="20.7879" fill="#1e293b" font-family="sans-serif" font-size="6.180380883938196" font-weight="600" text-anchor="middle" dominant-baseline="central">AVON</text></g><g transform="rotate(0.000 62.336 26.971)"><text x="62.3362" y="26.9713" fill="#1e293b" font-family="sans-serif" font-size="4.423963133640553" font-weight="600" text-anchor="middle" dominant-baseline="central">080400ZOCT2008</text></g><g transform="rotate(0.000 62.336 33.146)"><text x="62.3362" y="33.146100000000004" fill="#1e293b" font-family="sans-serif" font-size="4.423963133640553" font-weight="600" text-anchor="middle" dominant-baseline="central">120300ZOCT2008</text></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Direction of Main Attack"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.00 21.68 L38.73 21.68" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M57.27 21.68 L87.90 21.68" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M77.58 15.74 L87.90 21.68 L77.58 27.61 L77.58 29.39 L91.00 21.68 L77.58 13.96 L77.58 15.74" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(0.000 48.000 21.678)"><text x="48" y="21.677999999999997" fill="#1e293b" font-family="sans-serif" font-size="6.180380883938196" font-weight="600" text-anchor="middle" dominant-baseline="central">MAIN</text></g><g transform="rotate(0.000 48.000 27.861)"><text x="48" y="27.8614" fill="#1e293b" font-family="sans-serif" font-size="4.423963133640553" font-weight="600" text-anchor="middle" dominant-baseline="central">080400ZOCT2008</text></g><g transform="rotate(0.000 48.000 34.036)"><text x="48" y="34.0362" fill="#1e293b" font-family="sans-serif" font-size="4.423963133640553" font-weight="600" text-anchor="middle" dominant-baseline="central">120300ZOCT2008</text></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Direction of Supporting Attack"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.00 20.79 L38.73 20.79" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M57.27 20.79 L91.00 20.79" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M80.68 14.85 L91.00 20.79 L80.68 26.72" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><g transform="rotate(0.000 48.000 20.788)"><text x="48" y="20.7879" fill="#1e293b" font-family="sans-serif" font-size="6.180380883938196" font-weight="600" text-anchor="middle" dominant-baseline="central">YALU</text></g><g transform="rotate(0.000 48.000 26.971)"><text x="48" y="26.9713" fill="#1e293b" font-family="sans-serif" font-size="4.423963133640553" font-weight="600" text-anchor="middle" dominant-baseline="central">080400ZOCT2008</text></g><g transform="rotate(0.000 48.000 33.146)"><text x="48" y="33.146100000000004" fill="#1e293b" font-family="sans-serif" font-size="4.423963133640553" font-weight="600" text-anchor="middle" dominant-baseline="central">120300ZOCT2008</text></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Drop zone"><rect x="0" y="0" width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M10.00 43.00 L86.00 43.00 L86.00 5.00 L10.00 5.00 L10.00 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><g transform="rotate(0.000 48.000 24.000)"><text x="48" y="24" fill="#1e293b" font-family="sans-serif" font-size="6.554078332734459" font-weight="600" text-anchor="middle" dominant-baseline="central">DZ HAWK</text></g></svg>