@trackunit/react-map 0.0.4-alpha-9d327375fc1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +296 -0
  2. package/index.cjs.js +9851 -0
  3. package/index.d.ts +1 -0
  4. package/index.esm.js +9752 -0
  5. package/package.json +34 -0
  6. package/src/annotations/getDescriptorContentKey.d.ts +14 -0
  7. package/src/annotations/mapAnnotations.d.ts +76 -0
  8. package/src/annotations/useMapAnnotation.d.ts +16 -0
  9. package/src/annotations/useMapAnnotations.d.ts +17 -0
  10. package/src/appearance/AppearancePreview.d.ts +27 -0
  11. package/src/appearance/AppearancePreviewGrid.d.ts +29 -0
  12. package/src/appearance/appearanceTypes.d.ts +84 -0
  13. package/src/appearance/useMapAppearanceControls.d.ts +29 -0
  14. package/src/clusters/ClusterMarker.d.ts +41 -0
  15. package/src/clusters/ClusterStick.d.ts +97 -0
  16. package/src/clusters/formatClusterCount.d.ts +11 -0
  17. package/src/clusters/stories/ClusterMarkerCompactFormatsDemo.d.ts +7 -0
  18. package/src/clusters/stories/ClusterMarkerCountOnlyDemo.d.ts +7 -0
  19. package/src/clusters/stories/ClusterMarkerDefaultDemo.d.ts +12 -0
  20. package/src/clusters/stories/ClusterMarkerPlaygroundDemo.d.ts +10 -0
  21. package/src/clusters/stories/ClusterMarkerStateDemo.d.ts +9 -0
  22. package/src/clusters/stories/ClusterMarkerWithSegmentsDemo.d.ts +7 -0
  23. package/src/clusters/stories/ClusterMarkerWithSticksDemo.d.ts +10 -0
  24. package/src/clusters/useClusterCountFormat.d.ts +19 -0
  25. package/src/controls/AnnotationRenderer.d.ts +17 -0
  26. package/src/controls/AnnotationStack.d.ts +21 -0
  27. package/src/controls/ControlRenderer.d.ts +20 -0
  28. package/src/controls/Controls.d.ts +15 -0
  29. package/src/controls/annotationButtonClasses.d.ts +13 -0
  30. package/src/controls/collapseControls.d.ts +37 -0
  31. package/src/controls/defineControlStack.d.ts +10 -0
  32. package/src/controls/deriveResponsiveMode.d.ts +19 -0
  33. package/src/controls/longitudeToGlobeIcon.d.ts +3 -0
  34. package/src/controls/renderers/boolean/BooleanButton.d.ts +16 -0
  35. package/src/controls/renderers/boolean/MenuBooleanItem.d.ts +20 -0
  36. package/src/controls/renderers/boolean/MenuCheckbox.d.ts +14 -0
  37. package/src/controls/renderers/boolean/MenuToggle.d.ts +14 -0
  38. package/src/controls/renderers/button/Button.d.ts +14 -0
  39. package/src/controls/renderers/button/MenuButton.d.ts +16 -0
  40. package/src/controls/renderers/custom/Custom.d.ts +22 -0
  41. package/src/controls/renderers/menu/Menu.d.ts +23 -0
  42. package/src/controls/renderers/menu/Modal.d.ts +21 -0
  43. package/src/controls/renderers/menu/SectionHeader.d.ts +14 -0
  44. package/src/controls/renderers/menu/Separator.d.ts +11 -0
  45. package/src/controls/renderers/radio-group/MenuRadioGroup.d.ts +15 -0
  46. package/src/controls/renderers/radio-group/RadioGroup.d.ts +19 -0
  47. package/src/controls/renderers/radio-group/RadioGroupField.d.ts +17 -0
  48. package/src/controls/renderers/search/MenuSearch.d.ts +15 -0
  49. package/src/controls/renderers/search/Search.d.ts +14 -0
  50. package/src/controls/renderers/select/MenuSelect.d.ts +15 -0
  51. package/src/controls/renderers/select/Select.d.ts +14 -0
  52. package/src/controls/renderers/stepper/MenuStepper.d.ts +17 -0
  53. package/src/controls/renderers/stepper/Stepper.d.ts +18 -0
  54. package/src/controls/renderers/toggle-group/MenuToggleGroup.d.ts +17 -0
  55. package/src/controls/renderers/toggle-group/ToggleGroup.d.ts +15 -0
  56. package/src/controls/renderers/toggle-group/ToggleGroupField.d.ts +19 -0
  57. package/src/controls/renderingRules.d.ts +26 -0
  58. package/src/controls/types.d.ts +395 -0
  59. package/src/controls/useAnimatedPresence.d.ts +15 -0
  60. package/src/controls/useAnnotationPresence.d.ts +16 -0
  61. package/src/controls/useControlStack.d.ts +21 -0
  62. package/src/controls/useControlsConfig.d.ts +27 -0
  63. package/src/controls/usePopoverPlacement.d.ts +33 -0
  64. package/src/core/LoadingIndicatorPill.d.ts +9 -0
  65. package/src/core/MapLoadingState.d.ts +17 -0
  66. package/src/core/SafeAreaLayoutContext.d.ts +5 -0
  67. package/src/core/__testHelpers.d.ts +23 -0
  68. package/src/core/createMapComponent.d.ts +32 -0
  69. package/src/core/loadingIndicator.d.ts +21 -0
  70. package/src/core/padWithInsets.d.ts +5 -0
  71. package/src/core/types.d.ts +208 -0
  72. package/src/core/useCameraIdle.d.ts +2 -0
  73. package/src/core/useCameraState.d.ts +3 -0
  74. package/src/core/useMap.d.ts +57 -0
  75. package/src/core/useMapAdapterState.d.ts +14 -0
  76. package/src/core/useMapKeyboardNavigation.d.ts +38 -0
  77. package/src/core/usePreviewMap.d.ts +43 -0
  78. package/src/index.d.ts +69 -0
  79. package/src/interactions/interactionReducer.d.ts +31 -0
  80. package/src/layers/Layers.d.ts +32 -0
  81. package/src/layers/__testHelpers.d.ts +24 -0
  82. package/src/layers/buildExpandedIds.d.ts +17 -0
  83. package/src/layers/image-overlay/useImageOverlay.d.ts +39 -0
  84. package/src/layers/internal/MapLayerContext.d.ts +24 -0
  85. package/src/layers/internal/adaptiveMarkerResolution.d.ts +33 -0
  86. package/src/layers/internal/computeBounds.d.ts +34 -0
  87. package/src/layers/internal/countFeaturesInViewport.d.ts +14 -0
  88. package/src/layers/internal/createLazyGetter.d.ts +16 -0
  89. package/src/layers/internal/layerHelpers.d.ts +18 -0
  90. package/src/layers/internal/markerPortalZIndex.d.ts +17 -0
  91. package/src/layers/internal/useDblClickFit.d.ts +13 -0
  92. package/src/layers/internal/useEntityInteraction.d.ts +21 -0
  93. package/src/layers/internal/useFitFeatureBounds.d.ts +19 -0
  94. package/src/layers/internal/useLayerHandleSync.d.ts +18 -0
  95. package/src/layers/internal/useLayerReady.d.ts +25 -0
  96. package/src/layers/internal/useMarkerMountBridge.d.ts +41 -0
  97. package/src/layers/internal/useViewportContext.d.ts +34 -0
  98. package/src/layers/mapFocus.d.ts +29 -0
  99. package/src/layers/routes/useRoute.d.ts +39 -0
  100. package/src/layers/shared/measureLabelWidth.d.ts +11 -0
  101. package/src/layers/types.d.ts +131 -0
  102. package/src/layers/useExpandedIds.d.ts +20 -0
  103. package/src/layers/useFitToContent.d.ts +57 -0
  104. package/src/layers/useLayers.d.ts +58 -0
  105. package/src/layers/useMarkers/adaptiveHelpers.d.ts +156 -0
  106. package/src/layers/useMarkers/resolveServerClusters.d.ts +26 -0
  107. package/src/layers/useMarkers/useAdaptiveMarkerHelpers.d.ts +38 -0
  108. package/src/layers/useMarkers/useMarkers.d.ts +127 -0
  109. package/src/layers/useShapes/InteractiveDecoration.d.ts +23 -0
  110. package/src/layers/useShapes/MultiGeometryPlusBadge.d.ts +17 -0
  111. package/src/layers/useShapes/MultiPartBadge.d.ts +11 -0
  112. package/src/layers/useShapes/ShapeAnnotationLabel.d.ts +30 -0
  113. package/src/layers/useShapes/ShapeIcon.d.ts +21 -0
  114. package/src/layers/useShapes/ShapeLabelPill.d.ts +25 -0
  115. package/src/layers/useShapes/buildShapeLabelResolutionContext.d.ts +23 -0
  116. package/src/layers/useShapes/decorationFactories.d.ts +47 -0
  117. package/src/layers/useShapes/edge/ShapeEdgeLabel.d.ts +13 -0
  118. package/src/layers/useShapes/edge/computeEdgeAutoPlacement.d.ts +69 -0
  119. package/src/layers/useShapes/edge/computeEdgeProperties.d.ts +21 -0
  120. package/src/layers/useShapes/edge/edgeInsetsForFeature.d.ts +27 -0
  121. package/src/layers/useShapes/edge/edgeReservations.d.ts +36 -0
  122. package/src/layers/useShapes/edge/findBestEdgePosition.d.ts +247 -0
  123. package/src/layers/useShapes/extractMultiParts.d.ts +25 -0
  124. package/src/layers/useShapes/findBestVisibleVertex.d.ts +18 -0
  125. package/src/layers/useShapes/multiPartDecorations.d.ts +19 -0
  126. package/src/layers/useShapes/shapeDecorations.d.ts +154 -0
  127. package/src/layers/useShapes/shapeFeatureBuilders.d.ts +25 -0
  128. package/src/layers/useShapes/shapeLabelPolicy.d.ts +42 -0
  129. package/src/layers/useShapes/shapeLabelResolution.d.ts +45 -0
  130. package/src/layers/useShapes/shapeSyntheticMarkerRender.d.ts +16 -0
  131. package/src/layers/useShapes/useShapeDecorations.d.ts +56 -0
  132. package/src/layers/useShapes/useShapeLabelHelpers.d.ts +29 -0
  133. package/src/layers/useShapes/useShapes.d.ts +50 -0
  134. package/src/markers/MapMarker.d.ts +115 -0
  135. package/src/markers/MapMarkerIcon.d.ts +21 -0
  136. package/src/markers/animation/applyStickFrame.d.ts +15 -0
  137. package/src/markers/animation/spring.d.ts +45 -0
  138. package/src/markers/animation/stickFrame.d.ts +82 -0
  139. package/src/markers/animation/usePillBackgroundPaint.d.ts +15 -0
  140. package/src/markers/animation/useStickAnimation.d.ts +21 -0
  141. package/src/markers/animation/useStickTween.d.ts +28 -0
  142. package/src/markers/geometry/stickPositioning.d.ts +69 -0
  143. package/src/markers/geometry/useDirectionIndicator.d.ts +8 -0
  144. package/src/markers/internal/MapMarkerStickSurface.d.ts +47 -0
  145. package/src/markers/model/mapMarkerDomPortalStacking.d.ts +22 -0
  146. package/src/markers/model/markerDomTypes.d.ts +68 -0
  147. package/src/markers/model/markerResolvers.d.ts +34 -0
  148. package/src/markers/model/markerSizeMap.d.ts +82 -0
  149. package/src/markers/model/markerTuningParams.d.ts +60 -0
  150. package/src/markers/model/useMarkerStateResolvers.d.ts +25 -0
  151. package/src/markers/shared/MarkerAnimatedSurface.d.ts +20 -0
  152. package/src/markers/shared/MarkerDiscContent.d.ts +11 -0
  153. package/src/markers/shared/mapMarkerVariants.d.ts +35 -0
  154. package/src/markers/shared/markerColors.d.ts +55 -0
  155. package/src/markers/shared/useMarkerColors.d.ts +23 -0
  156. package/src/markers/stories/demoes/AnimationCircleVsPillDemo.d.ts +7 -0
  157. package/src/markers/stories/demoes/CircleIconGuidanceDemo.d.ts +2 -0
  158. package/src/markers/stories/demoes/DefaultDemo.d.ts +14 -0
  159. package/src/markers/stories/demoes/DirectionBehaviorDemo.d.ts +2 -0
  160. package/src/markers/stories/demoes/PillLabelLengthsDemo.d.ts +2 -0
  161. package/src/markers/stories/demoes/StatesDemo.d.ts +7 -0
  162. package/src/markers/stories/demoes/StickModeDemo.d.ts +2 -0
  163. package/src/markers/stories/demoes/StickModePlaygroundDemo.d.ts +10 -0
  164. package/src/markers/stories/helpers/AbsoluteGridPicker.d.ts +17 -0
  165. package/src/markers/stories/helpers/InlineLabel.d.ts +4 -0
  166. package/src/markers/stories/helpers/InlineSlider.d.ts +11 -0
  167. package/src/markers/stories/helpers/LabeledMarker.d.ts +7 -0
  168. package/src/markers/stories/helpers/MarkerRow.d.ts +4 -0
  169. package/src/markers/stories/helpers/SectionHeader.d.ts +4 -0
  170. package/src/markers/stories/helpers/StatesMarkerCell.d.ts +15 -0
  171. package/src/markers/stories/helpers/ThemedPreview.d.ts +10 -0
  172. package/src/markers/stories/helpers/mapMarkerStoryConstants.d.ts +4 -0
  173. package/src/panel/Panel.d.ts +60 -0
  174. package/src/panel/PanelOrchestrator.d.ts +24 -0
  175. package/src/panel/preload/preloadInitiators.d.ts +44 -0
  176. package/src/panel/preload/useHoverPreloadInitiator.d.ts +8 -0
  177. package/src/panel/preload/usePanelPreload.d.ts +46 -0
  178. package/src/panel/preload/useProximityPreloadInitiator.d.ts +13 -0
  179. package/src/panel/store/panels.d.ts +76 -0
  180. package/src/panel/storyHelpers.d.ts +9 -0
  181. package/src/panel/usePanel.d.ts +81 -0
  182. package/src/panel/utils/autoPan.d.ts +78 -0
  183. package/src/panel/utils/panelShellConstants.d.ts +8 -0
  184. package/src/panel/utils/useAutoPanResolver.d.ts +23 -0
  185. package/src/panel/utils/useWheelForwarding.d.ts +18 -0
  186. package/src/stories/InteractionDisplay.d.ts +9 -0
  187. package/src/stories/PositionDisplay.d.ts +9 -0
  188. package/src/stories/_storyCoordUtils.d.ts +8 -0
  189. package/src/testing/mockMapApi.d.ts +29 -0
  190. package/src/translation.d.ts +30 -0
  191. package/translation.cjs.js +30 -0
  192. package/translation.cjs10.js +30 -0
  193. package/translation.cjs11.js +30 -0
  194. package/translation.cjs12.js +30 -0
  195. package/translation.cjs13.js +30 -0
  196. package/translation.cjs14.js +30 -0
  197. package/translation.cjs15.js +30 -0
  198. package/translation.cjs16.js +30 -0
  199. package/translation.cjs17.js +30 -0
  200. package/translation.cjs2.js +30 -0
  201. package/translation.cjs3.js +30 -0
  202. package/translation.cjs4.js +30 -0
  203. package/translation.cjs5.js +30 -0
  204. package/translation.cjs6.js +30 -0
  205. package/translation.cjs7.js +30 -0
  206. package/translation.cjs8.js +30 -0
  207. package/translation.cjs9.js +30 -0
  208. package/translation.esm.js +28 -0
  209. package/translation.esm10.js +28 -0
  210. package/translation.esm11.js +28 -0
  211. package/translation.esm12.js +28 -0
  212. package/translation.esm13.js +28 -0
  213. package/translation.esm14.js +28 -0
  214. package/translation.esm15.js +28 -0
  215. package/translation.esm16.js +28 -0
  216. package/translation.esm17.js +28 -0
  217. package/translation.esm2.js +28 -0
  218. package/translation.esm3.js +28 -0
  219. package/translation.esm4.js +28 -0
  220. package/translation.esm5.js +28 -0
  221. package/translation.esm6.js +28 -0
  222. package/translation.esm7.js +28 -0
  223. package/translation.esm8.js +28 -0
  224. package/translation.esm9.js +28 -0
@@ -0,0 +1,68 @@
1
+ /**
2
+ * DOM marker size tiers for Map Marker v2 (see map marker design plan §3).
3
+ */
4
+ export type MarkerDomSize = "xs" | "sm" | "md" | "lg" | "xl";
5
+ /**
6
+ * Pixel dimensions for a single marker size tier.
7
+ * - circle: outer circle diameter
8
+ * - icon: inner icon slot and GpsArrow size (0 = not rendered)
9
+ * - text: pill label font size (0 = no text tier)
10
+ * - dot: white inner circle diameter when no icon is set (0 = not rendered, e.g. xs)
11
+ * - pillPaddingY: vertical padding per side (px) for pill form; pl = pillPaddingY (concentric-cap invariant).
12
+ * `xs` has no pill tier — value is 0.
13
+ */
14
+ export type MarkerSizeDimensions = Readonly<{
15
+ circle: number;
16
+ icon: number;
17
+ text: number;
18
+ dot: number;
19
+ pillPaddingY: number;
20
+ }>;
21
+ /**
22
+ * Visual/interaction state for DOM markers (plan §4). Drives circle vs pill when combined with
23
+ * `labelVisible` via `resolveMarkerForm`.
24
+ */
25
+ export type MarkerState = "default" | "hovered" | "expanded" | "selected";
26
+ /**
27
+ * State for `ClusterStick` — all `MarkerState` values except `"default"`. A stick always shows
28
+ * its label, so the resting circle form has no useful meaning here.
29
+ */
30
+ export type ClusterStickState = Exclude<MarkerState, "default">;
31
+ /** Resolved marker silhouette for indicator mode (plan §14). */
32
+ export type MarkerForm = "circle" | "pill";
33
+ /**
34
+ * How a stick's user-facing distance is interpreted relative to the pill silhouette.
35
+ * Default (when omitted) is `"rounded-edge"`.
36
+ *
37
+ * - `"centerline"` — distance measured to the stick line's endpoint (center of pill cap)
38
+ * - `"rounded-edge"` — distance measured to the tangent point on the rounded cap surface
39
+ * - `"bbox-edge"` — distance measured to the nearest axis-aligned edge of the pill bounding box
40
+ */
41
+ export type StickDistanceMode = "rounded-edge" | "bbox-edge" | "centerline";
42
+ /**
43
+ * How a stick marker's pill is positioned relative to the map anchor.
44
+ *
45
+ * - `"polar"` — angle (math radians, +x = right, −π/2 = up on screen) + distance (px)
46
+ * - `"offset"` — Cartesian offset (dx, dy) from anchor; magnitude used as the user distance
47
+ * - `"absolute"` — target pixel coordinate in the map container's coordinate space, plus the
48
+ * anchor's pixel coordinate (e.g. from `map.project(lngLat)`). The component derives
49
+ * `dx = targetX − anchorX`, `dy = targetY − anchorY` and delegates to the offset path.
50
+ */
51
+ export type StickPositioning = {
52
+ type: "polar";
53
+ angleRad: number;
54
+ distance: number;
55
+ distanceMode?: StickDistanceMode;
56
+ } | {
57
+ type: "offset";
58
+ dx: number;
59
+ dy: number;
60
+ distanceMode?: StickDistanceMode;
61
+ } | {
62
+ type: "absolute";
63
+ targetX: number;
64
+ targetY: number;
65
+ anchorX: number;
66
+ anchorY: number;
67
+ distanceMode?: StickDistanceMode;
68
+ };
@@ -0,0 +1,34 @@
1
+ import type { MarkerDomSize, MarkerForm, MarkerState } from "./markerDomTypes";
2
+ /**
3
+ * Raw inputs from the map/entity layer before priority resolution (plan §4, §14).
4
+ */
5
+ export type MarkerRenderStateInput = {
6
+ selected: boolean;
7
+ hovered: boolean;
8
+ expandedRank: number | null;
9
+ };
10
+ type AdaptiveMarkerStateInput = Readonly<{
11
+ isMounting?: boolean | null;
12
+ selected: boolean;
13
+ hovered: boolean;
14
+ }>;
15
+ /**
16
+ * Priority: selected → expanded → hovered → default (plan §4).
17
+ */
18
+ export declare const resolveMarkerState: (renderState: MarkerRenderStateInput) => MarkerState;
19
+ export declare const resolveAdaptiveMarkerState: (input: AdaptiveMarkerStateInput, isPromoted?: boolean) => MarkerState;
20
+ /**
21
+ * Pill when state would show a label and `labelVisible` is not false (plan §4, §14).
22
+ * `labelVisible` defaults to true when omitted.
23
+ */
24
+ export declare const resolveMarkerForm: (state: MarkerState, labelVisible: boolean | undefined) => MarkerForm;
25
+ /**
26
+ * Direction needs an icon slot; xs has none — bump to `sm` (plan §5).
27
+ */
28
+ export declare const resolveEffectiveSize: (size: MarkerDomSize, direction: number | undefined) => MarkerDomSize;
29
+ /**
30
+ * Final tier for DOM layout: direction bump (xs→sm), then xs→sm when pill needs label/icon
31
+ * tiers (`xs` has no pill text/icon — plan §3).
32
+ */
33
+ export declare const resolveMarkerDomSize: (size: MarkerDomSize, direction: number | undefined, form: MarkerForm) => MarkerDomSize;
34
+ export {};
@@ -0,0 +1,82 @@
1
+ import type { MarkerDomSize } from "./markerDomTypes";
2
+ /**
3
+ * Pill (hovered / expanded / selected) layout uses this tier for the indicator
4
+ * disc, icon slot, label text size, direction arrow, and pill padding — independent
5
+ * of the `size` prop so the pill stays visually consistent while the default circle
6
+ * still follows the five-tier ladder.
7
+ */
8
+ export declare const MARKER_PILL_CONTENT_LAYOUT_SIZE: "md";
9
+ /**
10
+ * Canonical pixel dimensions for DOM markers. Single source of truth for
11
+ * circle diameter, icon slot, pill text size, direction arrow size, and pill
12
+ * vertical padding.
13
+ *
14
+ * Concentricity invariant: `pl === pillPaddingY` per size tier (both in
15
+ * `cvaMapMarker` pill compound variants), ensuring the indicator disc is always
16
+ * concentric with the pill's rounded left cap.
17
+ *
18
+ * `xs` has no pill tier — `pillPaddingY` is 0 (circle-only footprint).
19
+ */
20
+ export declare const MARKER_SIZE_MAP: {
21
+ readonly xs: {
22
+ readonly circle: 8;
23
+ readonly icon: 0;
24
+ readonly text: 0;
25
+ readonly dot: 0;
26
+ readonly pillPaddingY: 0;
27
+ };
28
+ readonly sm: {
29
+ readonly circle: 12;
30
+ readonly icon: 8;
31
+ readonly text: 10;
32
+ readonly dot: 4;
33
+ readonly pillPaddingY: 4;
34
+ };
35
+ readonly md: {
36
+ readonly circle: 16;
37
+ readonly icon: 12;
38
+ readonly text: 12;
39
+ readonly dot: 6;
40
+ readonly pillPaddingY: 6;
41
+ };
42
+ readonly lg: {
43
+ readonly circle: 20;
44
+ readonly icon: 14;
45
+ readonly text: 14;
46
+ readonly dot: 8;
47
+ readonly pillPaddingY: 6;
48
+ };
49
+ readonly xl: {
50
+ readonly circle: 28;
51
+ readonly icon: 16;
52
+ readonly text: 14;
53
+ readonly dot: 12;
54
+ readonly pillPaddingY: 4;
55
+ };
56
+ };
57
+ /**
58
+ * Derived pill outer height: `circle + 2 × pillPaddingY`.
59
+ * Use this anywhere a concrete pixel height is needed for collision geometry
60
+ * or bounding-box calculations. For `xs` this equals the circle diameter.
61
+ */
62
+ export declare const markerPillOuterHeightPx: (size: MarkerDomSize) => number;
63
+ /**
64
+ * Derives the maximum full pill envelope width for geometry and viewport budgeting in stick mode.
65
+ *
66
+ * This is wider than `maxLabelWidthPx` when optional visual slots (icon disc, direction indicator)
67
+ * are present. Do NOT use this value to set a fixed rendered pill width — the pill remains
68
+ * intrinsically sized.
69
+ *
70
+ * Layout accounted for (left-to-right):
71
+ * left padding + disc slot (if icon) + gap + label budget + gap + direction slot (if direction) + right padding
72
+ */
73
+ export declare const computeFullPillEnvelopeWidth: (size: MarkerDomSize, maxLabelWidthPx: number, hasIcon: boolean, hasDirection: boolean) => number;
74
+ /**
75
+ * Density ladder step for adaptive rendering: `xs` maps to `"symbol"` (skip 8px DOM dot; plan §3 / §8).
76
+ */
77
+ export declare const downgradeMarkerDomSize: (size: MarkerDomSize) => MarkerDomSize | "symbol";
78
+ /**
79
+ * One step up the five-tier ladder (inverse of {@link downgradeMarkerDomSize} for DOM tiers only).
80
+ * `xl` stays `xl`. Stick-mode **anchor pin** uses a fixed `xs` base and `upgradeMarkerDomSize` when `selected` (`sm`).
81
+ */
82
+ export declare const upgradeMarkerDomSize: (size: MarkerDomSize) => MarkerDomSize;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * System-level tuning for stick geometry, pill layout, animation, and
3
+ * adaptive hover (see map marker design plan §3).
4
+ *
5
+ * `animation.spring` is the single source of truth for marker motion easing.
6
+ * The stick endpoint animation drives a JS spring directly; the morph (label
7
+ * track and direction icon collapse) uses CSS transitions whose duration is
8
+ * derived from the spring's settle time and whose timing function is
9
+ * `animation.morphEasing` so both motions feel like one.
10
+ */
11
+ export declare const MARKER_TUNING: {
12
+ readonly stick: {
13
+ readonly defaultPositioning: {
14
+ readonly type: "polar";
15
+ readonly angleRad: number;
16
+ readonly distance: 40;
17
+ };
18
+ readonly dotSizePx: 8;
19
+ readonly lineWidthPx: 1.5;
20
+ };
21
+ readonly pill: {
22
+ /** Maximum width of the label text area. Not the full rendered pill width. */
23
+ readonly maxLabelWidthPx: 180;
24
+ readonly paddingRightPx: 12;
25
+ /** Matches `gap-1` (4 px) used between pill flex items in stick and indicator modes. */
26
+ readonly gapPx: 4;
27
+ /** Matches `pr-1.5` (6 px) applied to the pill outer div in stick mode. */
28
+ readonly stickPaddingRightPx: 6;
29
+ };
30
+ readonly animation: {
31
+ /**
32
+ * Source-of-truth easing for marker motion. Used directly by the stick
33
+ * endpoint loop, and as the timing reference for CSS-based morph parts.
34
+ */
35
+ readonly spring: Readonly<{
36
+ stiffness: number;
37
+ damping: number;
38
+ mass: number;
39
+ restVelocity: number;
40
+ restDelta: number;
41
+ }>;
42
+ /**
43
+ * CSS transition duration used by the morph (label grid track, direction
44
+ * icon collapse). Derived from the spring's settle time so the morph reads
45
+ * as a single coordinated motion with the stick endpoint.
46
+ */
47
+ readonly morphDurationMs: number;
48
+ /**
49
+ * CSS `transition-timing-function` used by every morph property. Matches
50
+ * the spring's decelerating attack so JS-driven and CSS-driven parts of
51
+ * the marker read as one motion. See `MARKER_MORPH_EASING` above.
52
+ */
53
+ readonly morphEasing: "cubic-bezier(0.22, 1, 0.36, 1)";
54
+ };
55
+ readonly hoverDebouncMs: 150;
56
+ /** Marker panel layout: bottom sheet when map container width is below this (plan §7). */
57
+ readonly panelLayout: {
58
+ readonly bottomCardBreakpointWidthPx: 400;
59
+ };
60
+ };
@@ -0,0 +1,25 @@
1
+ import { resolveAdaptiveMarkerState, resolveEffectiveSize, resolveMarkerDomSize, resolveMarkerForm, resolveMarkerState } from "./markerResolvers";
2
+ import { MARKER_SIZE_MAP } from "./markerSizeMap";
3
+ export type MarkerStateResolvers = Readonly<{
4
+ resolveMarkerState: typeof resolveMarkerState;
5
+ resolveMarkerForm: typeof resolveMarkerForm;
6
+ resolveEffectiveSize: typeof resolveEffectiveSize;
7
+ resolveMarkerDomSize: typeof resolveMarkerDomSize;
8
+ resolveAdaptiveMarkerState: typeof resolveAdaptiveMarkerState;
9
+ MARKER_SIZE_MAP: typeof MARKER_SIZE_MAP;
10
+ }>;
11
+ /**
12
+ * Build-your-own hook: stable references to marker state resolution primitives.
13
+ *
14
+ * Returns a memoized object of the pure resolver functions for consumers that
15
+ * want to hand-roll their own MapMarker replacement while staying consistent
16
+ * with the library's state priority rules (selected → expanded → hovered → default).
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * const { resolveMarkerState, resolveMarkerForm } = useMarkerStateResolvers();
21
+ * const state = resolveMarkerState({ selected, hovered, expandedRank });
22
+ * const form = resolveMarkerForm(state, labelVisible);
23
+ * ```
24
+ */
25
+ export declare const useMarkerStateResolvers: () => MarkerStateResolvers;
@@ -0,0 +1,20 @@
1
+ import type { ReactElement } from "react";
2
+ import type { MapTheme } from "../../core/types";
3
+ import type { DirectionIndicatorDisplay } from "../geometry/useDirectionIndicator";
4
+ import type { MarkerDomSize } from "../model/markerDomTypes";
5
+ import type { ResolvedMarkerColors } from "./markerColors";
6
+ export type MarkerAnimatedSurfaceProps = {
7
+ readonly colors: ResolvedMarkerColors;
8
+ readonly directionDisplay: DirectionIndicatorDisplay;
9
+ readonly duration: number;
10
+ /** Pill chrome + indicator disc: padding, label `fontSize`, disc tier, icon slot budget. */
11
+ readonly effectiveSize: MarkerDomSize;
12
+ readonly icon: ReactElement | null;
13
+ readonly iconPx: number;
14
+ readonly isPill: boolean;
15
+ readonly labelText: string | undefined;
16
+ readonly showDisc: boolean;
17
+ readonly textPx: number;
18
+ readonly theme: MapTheme;
19
+ };
20
+ export declare const MarkerAnimatedSurface: ({ colors, directionDisplay, duration, effectiveSize, icon, iconPx, isPill, labelText, showDisc, textPx, theme, }: MarkerAnimatedSurfaceProps) => ReactElement;
@@ -0,0 +1,11 @@
1
+ import type { ReactElement } from "react";
2
+ import type { DirectionIndicatorDisplay } from "../geometry/useDirectionIndicator";
3
+ type MarkerDiscContentProps = {
4
+ readonly icon: ReactElement | null;
5
+ readonly iconPx: number;
6
+ readonly isPill: boolean;
7
+ readonly dotPx: number;
8
+ readonly directionDisplay: DirectionIndicatorDisplay;
9
+ };
10
+ export declare const MarkerDiscContent: ({ icon, iconPx, isPill, dotPx, directionDisplay, }: MarkerDiscContentProps) => ReactElement | null;
11
+ export {};
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Outer MapMarker shell. Only the form-agnostic, state-agnostic base classes
3
+ * live here — every property that varies per `form`/`size`/`state` is applied
4
+ * inline in [MapMarker.tsx](../MapMarker.tsx) so the circle↔pill morph can
5
+ * interpolate it. CVA class toggles never interpolate, so anything that needs
6
+ * to animate (padding, gap, border-width, border-color, background, height
7
+ * via padding) is set as an inline number with concrete from/to values in
8
+ * both states. The inner indicator disc (`cvaMarkerIndicator` below) carries
9
+ * its own per-size `h-* w-*`; the outer surface sizes intrinsically around it.
10
+ *
11
+ * `transition-all` enables the morph; the duration and timing-function are
12
+ * applied inline from `MARKER_TUNING.animation` so the spring config remains
13
+ * the single source of truth (no stale `duration-200 ease-in-out` here).
14
+ */
15
+ export declare const cvaMapMarker: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
16
+ /**
17
+ * Label span inside pill markers.
18
+ *
19
+ * Deliberately NO `text-box-trim`. With `leading-none` the line box is exactly
20
+ * one em, which already contains ascenders and descenders (g, y, p) and centres
21
+ * the glyphs symmetrically inside the pill. Adding `text-box-trim` shrinks the
22
+ * box to the cap/baseline band, so the wrapper's `overflow: hidden` (one level
23
+ * up in {@link MarkerAnimatedSurface}, required so the grid track collapses to
24
+ * `0fr` during the circle↔pill morph) clips the descenders, and `trim-start`
25
+ * alone biases the text upward (extra space below). `overflow-x: clip` gives the
26
+ * horizontal ellipsis without a vertical clip on the span itself.
27
+ */
28
+ export declare const cvaPillLabel: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
29
+ /**
30
+ * Inner indicator disc: marker fill via `--marker-color`, border via CSS `color-mix` on that token (plan §5).
31
+ */
32
+ export declare const cvaMarkerIndicator: (props?: ({
33
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | null | undefined;
34
+ theme?: "light" | "dark" | null | undefined;
35
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
@@ -0,0 +1,55 @@
1
+ import type { MapTheme } from "../../core/types";
2
+ import type { MarkerState } from "../model/markerDomTypes";
3
+ /**
4
+ * Optional layer-level overrides for pill chrome. Indicator fill always comes from the
5
+ * per-marker `color` prop (`fillColor` argument to `resolveMarkerColors`).
6
+ */
7
+ export type MarkerColorConfig = {
8
+ selectedBackground?: string;
9
+ hoveredBackground?: string;
10
+ expandedBackground?: string;
11
+ pillBorderColor?: string;
12
+ };
13
+ /**
14
+ * CSS custom properties for spreading onto the marker root. Indicator stroke uses CSS
15
+ * `color-mix()` on `--marker-color` in stylesheets — not resolved here.
16
+ */
17
+ export type MarkerColorCssVars = Readonly<{
18
+ "--marker-color": string;
19
+ "--marker-pill-bg": string;
20
+ "--marker-text-color": string;
21
+ "--marker-pill-border": string;
22
+ }>;
23
+ export type ResolvedMarkerColors = Readonly<{
24
+ /** Per-marker indicator fill (same as `fillColor`). */
25
+ indicatorFill: string;
26
+ /** Background for the pill when shown; `transparent` when `state` is `default`. */
27
+ pillBackground: string;
28
+ /** Pill label text color. */
29
+ textColor: string;
30
+ /** Pill outline color. */
31
+ pillBorderColor: string;
32
+ cssVars: MarkerColorCssVars;
33
+ }>;
34
+ /** Light basemap pill surfaces — neutral-100 / white / neutral-800. */
35
+ export declare const MARKER_LIGHT_PILL: {
36
+ readonly hovered: string;
37
+ readonly expanded: "#ffffff";
38
+ readonly selected: string;
39
+ };
40
+ /** Dark basemap pill surfaces — neutral-700 / neutral-800 / white (inverted brightness from light). */
41
+ export declare const MARKER_DARK_PILL: {
42
+ readonly hovered: string;
43
+ readonly expanded: string;
44
+ readonly selected: "#ffffff";
45
+ };
46
+ /**
47
+ * Default pill color config for a given theme. Pass as `colorConfig` on `MapMarker` to
48
+ * override individual values while keeping the rest as theme defaults.
49
+ */
50
+ export declare const defaultMarkerColorConfig: (theme: MapTheme) => Required<MarkerColorConfig>;
51
+ /**
52
+ * Single source of truth for JS-resolved marker colors. Pill colors default to the theme
53
+ * palette via `defaultMarkerColorConfig`; pass `config` to override any subset.
54
+ */
55
+ export declare const resolveMarkerColors: (fillColor: string, state: MarkerState, theme: MapTheme, config?: MarkerColorConfig) => ResolvedMarkerColors;
@@ -0,0 +1,23 @@
1
+ import { MARKER_DARK_PILL, MARKER_LIGHT_PILL, defaultMarkerColorConfig, resolveMarkerColors } from "./markerColors";
2
+ export type MarkerColorHelpers = Readonly<{
3
+ defaultMarkerColorConfig: typeof defaultMarkerColorConfig;
4
+ resolveMarkerColors: typeof resolveMarkerColors;
5
+ MARKER_DARK_PILL: typeof MARKER_DARK_PILL;
6
+ MARKER_LIGHT_PILL: typeof MARKER_LIGHT_PILL;
7
+ }>;
8
+ /**
9
+ * Build-your-own hook: stable references to theme-aware marker color primitives.
10
+ *
11
+ * Returns the `defaultMarkerColorConfig` factory and `resolveMarkerColors` resolver
12
+ * for consumers building custom marker components that need to stay visually
13
+ * consistent with `MapMarker`'s pill/indicator color system.
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * const { defaultMarkerColorConfig, resolveMarkerColors } = useMarkerColors();
18
+ * const config = defaultMarkerColorConfig(theme);
19
+ * const colors = resolveMarkerColors(fillColor, state, theme, config);
20
+ * // Spread colors.cssVars onto the marker root element.
21
+ * ```
22
+ */
23
+ export declare const useMarkerColors: () => MarkerColorHelpers;
@@ -0,0 +1,7 @@
1
+ import { type ReactElement } from "react";
2
+ type AnimationCircleVsPillDemoProps = {
3
+ readonly markerColor: string;
4
+ readonly longLabel: string;
5
+ };
6
+ export declare const AnimationCircleVsPillDemo: ({ markerColor, longLabel }: AnimationCircleVsPillDemoProps) => ReactElement;
7
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { ReactElement } from "react";
2
+ export declare const CircleIconGuidanceDemo: () => ReactElement;
@@ -0,0 +1,14 @@
1
+ import type { ReactElement } from "react";
2
+ import type { MapTheme } from "../../../core/types";
3
+ import type { MarkerDomSize, MarkerState } from "../../model/markerDomTypes";
4
+ type DefaultDemoProps = {
5
+ readonly size: MarkerDomSize;
6
+ readonly state: MarkerState;
7
+ readonly theme: MapTheme;
8
+ readonly direction: number | undefined;
9
+ readonly stickMode: boolean;
10
+ readonly showIcon: boolean;
11
+ readonly label: string;
12
+ };
13
+ export declare const DefaultDemo: ({ size, state, theme, direction, stickMode, showIcon, label, }: DefaultDemoProps) => ReactElement;
14
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { ReactElement } from "react";
2
+ export declare const DirectionBehaviorDemo: () => ReactElement;
@@ -0,0 +1,2 @@
1
+ import type { ReactElement } from "react";
2
+ export declare const PillLabelLengthsDemo: () => ReactElement;
@@ -0,0 +1,7 @@
1
+ import type { ReactElement } from "react";
2
+ import type { MapTheme } from "../../../core/types";
3
+ type StatesDemoProps = {
4
+ readonly theme: MapTheme;
5
+ };
6
+ export declare const StatesDemo: ({ theme }: StatesDemoProps) => ReactElement;
7
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { ReactElement } from "react";
2
+ export declare const StickModeDemo: () => ReactElement;
@@ -0,0 +1,10 @@
1
+ import { type ReactElement } from "react";
2
+ import type { MapTheme } from "../../../core/types";
3
+ import type { MarkerDomSize, MarkerState } from "../../model/markerDomTypes";
4
+ type StickModePlaygroundDemoProps = {
5
+ readonly size: MarkerDomSize;
6
+ readonly state: MarkerState;
7
+ readonly theme: MapTheme;
8
+ };
9
+ export declare const StickModePlaygroundDemo: ({ size, state, theme }: StickModePlaygroundDemoProps) => ReactElement;
10
+ export {};
@@ -0,0 +1,17 @@
1
+ import { type ReactElement } from "react";
2
+ type LineMode = "to-origin" | "to-anchor" | "polar";
3
+ type AbsoluteGridPickerProps = {
4
+ readonly width: number;
5
+ readonly height: number;
6
+ readonly anchorX: number;
7
+ readonly anchorY: number;
8
+ readonly targetX: number;
9
+ readonly targetY: number;
10
+ readonly onChange: (x: number, y: number) => void;
11
+ readonly lineMode?: LineMode;
12
+ readonly title?: string;
13
+ readonly anchorLabel?: string;
14
+ readonly targetLabel?: string;
15
+ };
16
+ export declare const AbsoluteGridPicker: ({ width, height, anchorX, anchorY, targetX, targetY, onChange, lineMode, title, anchorLabel, targetLabel, }: AbsoluteGridPickerProps) => ReactElement;
17
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { ReactElement, ReactNode } from "react";
2
+ export declare const InlineLabel: ({ children }: {
3
+ children: ReactNode;
4
+ }) => ReactElement;
@@ -0,0 +1,11 @@
1
+ import type { ReactElement } from "react";
2
+ type InlineSliderProps = {
3
+ readonly label: string;
4
+ readonly value: number;
5
+ readonly min: number;
6
+ readonly max: number;
7
+ readonly onChange: (value: number) => void;
8
+ readonly readout?: string;
9
+ };
10
+ export declare const InlineSlider: ({ label, value, min, max, onChange, readout }: InlineSliderProps) => ReactElement;
11
+ export {};
@@ -0,0 +1,7 @@
1
+ import type { ReactElement, ReactNode } from "react";
2
+ type LabeledMarkerProps = {
3
+ readonly caption: ReactNode;
4
+ readonly children: ReactElement;
5
+ };
6
+ export declare const LabeledMarker: ({ caption, children }: LabeledMarkerProps) => ReactElement;
7
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { ReactElement, ReactNode } from "react";
2
+ export declare const MarkerRow: ({ children }: {
3
+ children: ReactNode;
4
+ }) => ReactElement;
@@ -0,0 +1,4 @@
1
+ import type { ReactElement, ReactNode } from "react";
2
+ export declare const SectionHeader: ({ children }: {
3
+ children: ReactNode;
4
+ }) => ReactElement;
@@ -0,0 +1,15 @@
1
+ import { type ReactElement } from "react";
2
+ import type { MapTheme } from "../../../core/types";
3
+ import type { MarkerState } from "../../model/markerDomTypes";
4
+ type StatesMarkerCellHandlers = {
5
+ readonly onClick: () => void;
6
+ readonly onMouseEnter: () => void;
7
+ readonly onMouseLeave: () => void;
8
+ };
9
+ type StatesMarkerCellProps = {
10
+ readonly label: string;
11
+ readonly theme: MapTheme;
12
+ readonly children: (state: MarkerState, handlers: StatesMarkerCellHandlers) => ReactElement;
13
+ };
14
+ export declare const StatesMarkerCell: ({ label, theme, children }: StatesMarkerCellProps) => ReactElement;
15
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { CSSProperties, ReactNode } from "react";
2
+ import type { MapTheme } from "../../../core/types";
3
+ type ThemedPreviewProps = {
4
+ readonly theme: MapTheme;
5
+ readonly className?: string;
6
+ readonly style?: CSSProperties;
7
+ readonly children: ReactNode;
8
+ };
9
+ export declare const ThemedPreview: ({ theme, className, style, children }: ThemedPreviewProps) => import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,4 @@
1
+ export declare const MARKER_COLOR = "#2563eb";
2
+ export declare const MAP_MARKER_SIZES: ("xs" | "sm" | "md" | "lg" | "xl")[];
3
+ export declare const MAP_MARKER_STATES: ("default" | "expanded" | "selected" | "hovered")[];
4
+ export declare const MAP_MARKER_LONG_LABEL = "Very long fleet asset identifier that should truncate with ellipsis when it exceeds the pill max width";
@@ -0,0 +1,60 @@
1
+ import { type Placement } from "@floating-ui/react";
2
+ import { ReactNode } from "react";
3
+ import "./Panel.css";
4
+ export type PanelContentScroll = "shell" | "internal";
5
+ export type PanelProps = Readonly<{
6
+ /** Anchor element. The panel positions itself next to this element. */
7
+ anchor: HTMLElement | null;
8
+ /** Placement preference. Default: "bottom". */
9
+ placement?: Placement;
10
+ /** Called when the panel is dismissed (Escape key or pointer-down outside). */
11
+ onDismiss?: () => void;
12
+ /**
13
+ * Accessible label for the close button. Consumers should pass a translated
14
+ * string (e.g. `t("panel.close")`). Defaults to `"Close"`.
15
+ */
16
+ closeLabel?: string;
17
+ /**
18
+ * Called exactly once when the panel first becomes visible (isCommitted
19
+ * transitions from false to true). Does not re-fire on subsequent Floating
20
+ * UI recomputes. Fires again on the next open-cycle (anchor null → non-null).
21
+ *
22
+ * @param panelRect Bounding rect of the floating panel element.
23
+ * @param anchorRect Bounding rect of the anchor element.
24
+ * @param placement Resolved Floating UI placement (after flip).
25
+ * @param panelScrollHeight Natural content height of the inner scroll div —
26
+ * greater than `panelRect.height` when content is scroll-constrained.
27
+ */
28
+ onCommit?: (panelRect: DOMRect, anchorRect: DOMRect, placement: Placement, panelScrollHeight: number) => void;
29
+ /**
30
+ * Map container element. Used as the shift boundary so panels cannot bleed
31
+ * outside the map viewport. Falls back to clipping ancestors when null.
32
+ */
33
+ containerEl?: HTMLElement | null;
34
+ /** Accessible label for the panel dialog, announced by screen readers on open. */
35
+ "aria-label"?: string;
36
+ /**
37
+ * Where vertical overflow scrolls. Default `shell` keeps `overflow-auto` on the
38
+ * scroll slot; `internal` uses `overflow-hidden` so panel content owns scroll.
39
+ */
40
+ contentScroll?: PanelContentScroll;
41
+ children: ReactNode;
42
+ }>;
43
+ /**
44
+ * Renders a marker info panel positioned next to its anchor with Floating UI.
45
+ *
46
+ * Middleware chain: `offset(8) → flip() → shift(8) → hide`
47
+ *
48
+ * Animation state is driven by the `data-panel` attribute:
49
+ * "" — element is in DOM (for Floating UI to measure) but hidden via
50
+ * CSS `visibility: hidden` so the pre-commit translate(0,0)
51
+ * position is never visible.
52
+ * "open" — fades in via CSS opacity transition once placement is committed.
53
+ * "closing" — fades out during the EXIT_DURATION_MS window before unmount.
54
+ *
55
+ * @internal
56
+ */
57
+ export declare const Panel: {
58
+ ({ anchor, placement, onDismiss, closeLabel, onCommit, containerEl, "aria-label": ariaLabel, contentScroll, children, }: PanelProps): import("react/jsx-runtime").JSX.Element | null;
59
+ displayName: string;
60
+ };