{"_id":"@affino/world-map-vue","_rev":"3-d2839df0cf9bc4bc2d99d0de650c8e80","name":"@affino/world-map-vue","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@affino/world-map-vue","version":"0.1.0","keywords":["affino","world-map","vue","svg"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/world-map-vue@0.1.0","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://github.com/affinio/affinio/tree/main/packages/world-map-vue#readme","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"15a9a4da149311a49a353e4234a1dc334e561a1f","tarball":"https://registry.npmjs.org/@affino/world-map-vue/-/world-map-vue-0.1.0.tgz","fileCount":8,"integrity":"sha512-ctQSG3E2zp/RRxDhpSpkBUzyYm9aHagfvCIMBU2gfTXsOPSVZh5B+F55NZpeRPvU+B0J34dvKtk0f4+fv9pq/Q==","signatures":[{"sig":"MEQCIFZZwfHNUE6YTClGkUgC0MVYKwdvxUzetMT6vyMI7yk1AiBioHYF2LQ+9zHbxYO5IehrxkII3jgWOLJ/8HPr7HCCrg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40360},"main":"dist/index.js","type":"module","_from":"file:affino-world-map-vue-0.1.0.tgz","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run --config ./vitest.config.ts","build":"pnpm --filter @affino/world-map-core build && vite build && vue-tsc -p tsconfig.json --declaration --emitDeclarationOnly --outDir dist","type-check":"pnpm --filter @affino/world-map-core build && vue-tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/0e2008b127378a7f26fce2eb37dbc1e7/affino-world-map-vue-0.1.0.tgz","_integrity":"sha512-ctQSG3E2zp/RRxDhpSpkBUzyYm9aHagfvCIMBU2gfTXsOPSVZh5B+F55NZpeRPvU+B0J34dvKtk0f4+fv9pq/Q==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git","directory":"packages/world-map-vue"},"_npmVersion":"10.8.2","description":"Reusable Vue SVG world map component for Affino","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"20.20.2","dependencies":{"@affino/world-map-core":"0.1.0"},"_hasShrinkwrap":false,"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/world-map-vue_0.1.0_1779187141556_0.5969179754045555","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@affino/world-map-vue","version":"0.1.1","keywords":["affino","world-map","vue","svg"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/world-map-vue@0.1.1","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://github.com/affinio/datagrid/tree/main/packages/world-map-vue#readme","bugs":{"url":"https://github.com/affinio/datagrid/issues"},"dist":{"shasum":"43516025176a0d81e174a0754fe5cfba8f859564","tarball":"https://registry.npmjs.org/@affino/world-map-vue/-/world-map-vue-0.1.1.tgz","fileCount":8,"integrity":"sha512-vV3AHwWvQZcVZ0wkhcLOWKc24Tv1Dqajfe6Ke2mhApEqEQQtn+xymzmd1QQxYcDEfZXsDWs7MmxZruRvPPYupQ==","signatures":[{"sig":"MEUCIAMX8RJoem95i1f2Q3jLT3u6dSh69Irw6eZ38SP+gOemAiEAtMpCQMPta4/5VKkDddfFCrMALs2slID4cMn7+GIeYq0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43705},"main":"dist/index.js","type":"module","_from":"file:affino-world-map-vue-0.1.1.tgz","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run --config ./vitest.config.ts","build":"pnpm --filter @affino/world-map-core build && vite build && vue-tsc -p tsconfig.json --declaration --emitDeclarationOnly --outDir dist","type-check":"pnpm --filter @affino/world-map-core build && vue-tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/f79af5c6249e6074455e282b08cc3ade/affino-world-map-vue-0.1.1.tgz","_integrity":"sha512-vV3AHwWvQZcVZ0wkhcLOWKc24Tv1Dqajfe6Ke2mhApEqEQQtn+xymzmd1QQxYcDEfZXsDWs7MmxZruRvPPYupQ==","repository":{"url":"git+https://github.com/affinio/datagrid.git","type":"git","directory":"packages/world-map-vue"},"_npmVersion":"10.8.2","description":"Reusable Vue SVG world map component for Affino","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"20.20.2","dependencies":{"@affino/world-map-core":"0.1.0"},"_hasShrinkwrap":false,"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/world-map-vue_0.1.1_1779365433029_0.24771956771316583","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@affino/world-map-vue","version":"0.1.2","author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"type":"module","description":"Reusable Vue SVG world map component for Affino","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"main":"dist/index.js","module":"dist/index.js","types":"dist/index.d.ts","sideEffects":["**/*.css"],"dependencies":{"@affino/world-map-core":"0.1.0"},"peerDependencies":{"vue":"^3.3.0"},"repository":{"type":"git","url":"git+https://github.com/affinio/datagrid.git","directory":"packages/world-map-vue"},"homepage":"https://github.com/affinio/datagrid/tree/main/packages/world-map-vue#readme","license":"MIT","keywords":["affino","world-map","vue","svg"],"bugs":{"url":"https://github.com/affinio/datagrid/issues"},"scripts":{"build":"pnpm --filter @affino/world-map-core build && vite build && vue-tsc -p tsconfig.json --declaration --emitDeclarationOnly --outDir dist","type-check":"pnpm --filter @affino/world-map-core build && vue-tsc -p tsconfig.json --noEmit","test":"vitest run --config ./vitest.config.ts"},"_id":"@affino/world-map-vue@0.1.2","_integrity":"sha512-1GWduJd92bjw/CqSP1knfRFCaZJmXs4P+TGWuiLnLi+6Qslg5KimFKt0E2I+Y33VSSmf9kSKxvYvSpCwAvOH9w==","_resolved":"/tmp/aae8acf8b19282f1c89abfab64770bab/affino-world-map-vue-0.1.2.tgz","_from":"file:affino-world-map-vue-0.1.2.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-1GWduJd92bjw/CqSP1knfRFCaZJmXs4P+TGWuiLnLi+6Qslg5KimFKt0E2I+Y33VSSmf9kSKxvYvSpCwAvOH9w==","shasum":"e8ce1868b52d460c7f8873f39c01f4bf2a98e7dd","tarball":"https://registry.npmjs.org/@affino/world-map-vue/-/world-map-vue-0.1.2.tgz","fileCount":9,"unpackedSize":48250,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBi0XtcXH5OEGakwcFe9f9SOWJ4VldH9tR/QC9+vSvO0AiEAvULKnmjSeZRjtBT80e5VhBQZ59DBiwFApIdCK/WgaCw="}]},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"directories":{},"maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/world-map-vue_0.1.2_1779375609357_0.7061437223269271"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-19T10:39:01.474Z","modified":"2026-05-21T15:00:09.614Z","0.1.0":"2026-05-19T10:39:01.734Z","0.1.1":"2026-05-21T12:10:33.301Z","0.1.2":"2026-05-21T15:00:09.507Z"},"bugs":{"url":"https://github.com/affinio/datagrid/issues"},"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","homepage":"https://github.com/affinio/datagrid/tree/main/packages/world-map-vue#readme","keywords":["affino","world-map","vue","svg"],"repository":{"type":"git","url":"git+https://github.com/affinio/datagrid.git","directory":"packages/world-map-vue"},"description":"Reusable Vue SVG world map component for Affino","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"readme":"# @affino/world-map-vue\n\nReusable Vue SVG world map components for Affino.\n\n`@affino/world-map-vue` is the Vue rendering layer for world map path data and simple lon/lat marker overlays. It does not load map data or convert country geometry by itself. Use `@affino/world-map-core` to convert `WorldMapCountryFeature[]` into `WorldMapPathFeature[]`, then pass those paths to `WorldMapSvg`.\n\n## Public API\n\n```ts\nimport { WorldMapSvg } from \"@affino/world-map-vue\"\nimport type {\n  WorldMapMarker,\n  WorldMapMarkerInteraction,\n  WorldMapMarkerRenderContext,\n} from \"@affino/world-map-vue\"\n```\n\n`WorldMapSvg` renders `WorldMapPathFeature[]` as SVG country paths and provides local hover, selection, keyboard, zoom, and pan interactions.\n\n## Basic Usage\n\n```vue\n<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\"\nimport { createWorldMapPaths } from \"@affino/world-map-core\"\nimport type { WorldMapCountryFeature, WorldMapCountryId } from \"@affino/world-map-core\"\nimport { WorldMapSvg } from \"@affino/world-map-vue\"\n\nconst countries = ref<WorldMapCountryFeature[]>([])\nconst selectedCountryId = ref<WorldMapCountryId | null>(null)\nconst selectedMarkerId = ref<string | null>(null)\nconst countryValues = {\n  \"250\": 63,\n  \"826\": 72,\n  \"840\": 95,\n}\nconst markers: WorldMapMarker[] = [\n  { id: \"london\", lon: -0.1276, lat: 51.5072, label: \"London\", variant: \"success\" },\n  { id: \"paris\", lon: 2.3522, lat: 48.8566, label: \"Paris\", variant: \"warning\" },\n  { id: \"new-york\", lon: -74.006, lat: 40.7128, label: \"New York\", variant: \"muted\" },\n]\n\nconst pathFeatures = computed(() => createWorldMapPaths(countries.value, {\n  viewport: { width: 960, height: 480 },\n  projection: \"equirectangular\",\n  precision: 2,\n}))\n</script>\n\n<template>\n  <WorldMapSvg\n    v-model:selected-country-id=\"selectedCountryId\"\n    v-model:selected-marker-id=\"selectedMarkerId\"\n    :paths=\"pathFeatures\"\n    :markers=\"markers\"\n    :country-values=\"countryValues\"\n    enable-choropleth\n    :width=\"960\"\n    :height=\"480\"\n    @country-click=\"feature => console.log(feature.name)\"\n    @marker-click=\"interaction => console.log(interaction.marker.label, interaction.anchorRect)\"\n  />\n</template>\n```\n\n## Input Data\n\n`paths` must be an array of `WorldMapPathFeature` objects from `@affino/world-map-core`:\n\n```ts\ninterface WorldMapPathFeature {\n  id: string\n  name: string\n  iso2?: string\n  iso3?: string\n  path: string\n  properties?: Record<string, unknown>\n}\n```\n\nThe `path` field is SVG path data. The component renders one `<path>` per feature and uses `id` for selection and event identity.\n\nMarkers are optional lon/lat point overlays:\n\n```ts\ninterface WorldMapMarker {\n  id: string\n  lon: number\n  lat: number\n  label?: string\n  value?: number\n  variant?: \"default\" | \"success\" | \"warning\" | \"danger\" | \"muted\"\n  class?: string | string[] | Record<string, boolean | undefined> | null | undefined\n  style?: string | Record<string, string | number | undefined> | null | undefined\n  properties?: Record<string, unknown>\n}\n```\n\nMarker click, hover, and leave events emit an interaction payload:\n\n```ts\ninterface WorldMapMarkerInteraction {\n  marker: WorldMapMarker\n  svgPoint: { x: number; y: number }\n  clientPoint: { x: number; y: number }\n  anchorRect: { x: number; y: number; width: number; height: number }\n}\n```\n\n`svgPoint` is the rendered SVG coordinate after the current zoom/pan transform. `clientPoint` is the center of the marker element in viewport coordinates. `anchorRect` is a plain object copied from the marker element bounding rect and can be used as a virtual anchor for application-owned popovers.\n\nMarkers are projected with the same fixed equirectangular viewport as the country paths and render above countries inside the zoom/pan layer. The optional `variant` field provides generic visual states for dashboards, GPS tracking, analytics, auctions, and similar overlays without imposing a domain-specific schema.\n\n\n## Marker Slots And Custom Styling\n\nMarkers accept per-item `class` and `style` overrides. Those values are applied to the default marker shape, and the component also exposes a typed `marker` slot so consumers can render custom SVG content for each point without DOM geometry workarounds.\n\n```vue\n<WorldMapSvg :paths=\"pathFeatures\" :markers=\"markers\">\n  <template #marker=\"{ radius, selected, hovered, variant, markerClass, markerStyle }\">\n    <g>\n      <circle\n        :r=\"radius\"\n        :class=\"[markerClass, `marker-${variant}`, { 'marker--selected': selected, 'marker--hovered': hovered }]\"\n        :style=\"markerStyle\"\n      />\n      <circle v-if=\"selected\" :r=\"radius + 8\" class=\"marker-pulse\" />\n    </g>\n  </template>\n</WorldMapSvg>\n```\n\nThe slot context is typed as `WorldMapMarkerRenderContext` and includes the current marker, projected `x`/`y`, rendered `radius`, `selected` and `hovered` state, current `variant`, and the marker's base `class`/`style` values. When no slot is provided, `WorldMapSvg` falls back to the default `<circle>` rendering.\n\n## SVG Render Layers\n\n`WorldMapSvg` renders a stable internal SVG layer structure:\n\n- `world-map-svg__ocean-layer` for the ocean/background rectangle.\n- `world-map-svg__viewport-layer` for the transformed zoom/pan viewport. The legacy `world-map-svg__map-layer` class remains on this group for compatibility.\n- `world-map-svg__country-layer` / `world-map-svg__country-fill-layer` for country paths and country interactions.\n- `world-map-svg__country-border-layer` as an empty non-interactive placeholder for future separate border rendering.\n- `world-map-svg__track-layer` as an empty non-interactive placeholder for future route/GPS track rendering.\n- `world-map-svg__marker-layer` for lon/lat markers, above countries.\n- `world-map-svg__overlay-layer` and `world-map-svg__label-layer` as empty non-interactive placeholders for future overlays and labels.\n\nTracks, labels, custom overlay slots, and alternate map datasets are not implemented yet. The current layer structure is intentionally internal and preserves the existing props, events, and marker/country behavior.\n\n## Marker Selection And Scale\n\nMarkers support semi-controlled selection through `v-model:selected-marker-id`:\n\n```vue\n<WorldMapSvg\n  v-model:selected-marker-id=\"selectedMarkerId\"\n  :paths=\"pathFeatures\"\n  :markers=\"markers\"\n/>\n```\n\nClicking a marker selects it, clicking the selected marker clears it, and map background clicks or `Escape` clear marker selection together with country selection. Marker clicks do not clear country selection.\n\nUse `markerScaleMode` to choose how marker size behaves during zoom:\n\n- `\"screen\"` keeps marker visual radius stable while zooming by reducing SVG radius as zoom increases.\n- `\"map\"` keeps marker radius in map coordinates, so markers scale with the map.\n\n## State Persistence\n\n`WorldMapSvg` exposes a small imperative state API on the component instance so applications can persist and restore map view state symmetrically with `datagrid`.\n\n```ts\nconst state = worldMapRef.value?.getState()\nconst migrated = worldMapRef.value?.migrateState(rawState)\nconst restored = worldMapRef.value?.applyState(migrated)\n```\n\nThe exported state currently includes:\n\n- selected country id\n- selected marker id\n- zoom level\n- pan offsets\n\nThe state shape is versioned and validated before restore. Invalid payloads return `null` from `migrateState` unless `strict: true` is passed.\n\nGeneric GPS tracking overlays can keep their domain data in `properties`:\n\n```ts\nconst markers: WorldMapMarker[] = [\n  {\n    id: \"vehicle-17\",\n    lon: -122.4194,\n    lat: 37.7749,\n    label: \"Vehicle 17\",\n    variant: \"success\",\n    properties: {\n      speedKph: 48,\n      lastSeenAt: \"2026-05-18T20:00:00Z\",\n    },\n  },\n]\n```\n\n## External Popovers\n\n`WorldMapSvg` does not render popovers and does not own popover positioning. Use the marker interaction payload to connect to an application-level popover:\n\n```ts\nconst activeMarker = ref<WorldMapMarkerInteraction | null>(null)\n\nfunction handleMarkerClick(interaction: WorldMapMarkerInteraction): void {\n  activeMarker.value = interaction\n}\n```\n\n```vue\n<WorldMapSvg\n  :paths=\"pathFeatures\"\n  :markers=\"markers\"\n  @marker-click=\"handleMarkerClick\"\n/>\n\n<AppPopover\n  v-if=\"activeMarker\"\n  :virtual-anchor=\"activeMarker.anchorRect\"\n>\n  {{ activeMarker.marker.label }}\n</AppPopover>\n```\n\nThe popover component is intentionally external. `@affino/world-map-vue` only reports the marker, rendered SVG point, viewport client point, and anchor rectangle.\n\n## Choropleth Values\n\nCountries can be colored by numeric value using `countryValues` and `enableChoropleth`:\n\n```vue\n<WorldMapSvg\n  :paths=\"pathFeatures\"\n  :country-values=\"{ '250': 63, '826': 72, '840': 95 }\"\n  enable-choropleth\n/>\n```\n\nThe keys are `WorldMapPathFeature.id` values. Countries without a finite value use normal country styling. `NaN`, `Infinity`, and `-Infinity` values are ignored.\n\nBy default the component computes the value domain from finite values in `countryValues`. Pass `countryValueMin` and `countryValueMax` to pin the scale. When the domain minimum and maximum are equal, the component uses a stable middle intensity.\n\nThe v0.1 choropleth scale is a small dependency-free `color-mix()` interpolation between `--affino-world-map-country-value-low-fill` and `--affino-world-map-country-value-high-fill`. Selected country styling takes precedence over value coloring.\n\n## Props\n\n| Prop | Type | Default | Description |\n| --- | --- | --- | --- |\n| `paths` | `WorldMapPathFeature[]` | required | SVG path features to render. |\n| `markers` | `WorldMapMarker[]` | `[]` | Optional lon/lat point markers to render above countries. |\n| `countryValues` | `Record<string, number>` | `{}` | Numeric values keyed by `WorldMapPathFeature.id`. |\n| `width` | `number` | `960` | SVG viewBox width. |\n| `height` | `number` | `480` | SVG viewBox height. |\n| `selectedCountryId` | `string \\| null \\| undefined` | `undefined` | Semi-controlled selection. Use `v-model:selected-country-id` to control it in Vue templates. |\n| `selectedMarkerId` | `string \\| null \\| undefined` | `undefined` | Semi-controlled marker selection. Use `v-model:selected-marker-id` to control it in Vue templates. |\n| `enableChoropleth` | `boolean` | `false` | Enables value-based country coloring. |\n| `enableZoom` | `boolean` | `true` | Shows zoom controls and enables wheel zoom. |\n| `enableMarkers` | `boolean` | `true` | Enables marker rendering. |\n| `enablePan` | `boolean` | `true` | Enables drag-to-pan and grab cursor state. |\n| `countryValueMin` | `number \\| undefined` | `undefined` | Optional lower bound for choropleth value normalization. |\n| `countryValueMax` | `number \\| undefined` | `undefined` | Optional upper bound for choropleth value normalization. |\n| `markerRadius` | `number` | `4` | Marker circle radius in SVG units. |\n| `markerScaleMode` | `\"screen\" \\| \"map\"` | `\"screen\"` | Marker radius behavior during zoom. |\n| `minZoom` | `number` | `1` | Minimum zoom level. Values below `0.1` are clamped. |\n| `maxZoom` | `number` | `8` | Maximum zoom level. Clamped to at least `minZoom`. |\n\n## Events\n\n| Event | Payload | Description |\n| --- | --- | --- |\n| `update:selectedCountryId` | `string \\| null` | Emitted when country selection changes or clears. |\n| `update:selectedMarkerId` | `string \\| null` | Emitted when marker selection changes or clears. |\n| `country-click` | `WorldMapPathFeature` | Emitted after country click or keyboard activation. |\n| `country-hover` | `WorldMapPathFeature` | Emitted on country mouse enter. |\n| `country-leave` | `WorldMapPathFeature` | Emitted on country mouse leave. |\n| `marker-click` | `WorldMapMarkerInteraction` | Emitted after marker click or keyboard activation. |\n| `marker-hover` | `WorldMapMarkerInteraction` | Emitted on marker mouse enter. |\n| `marker-leave` | `WorldMapMarkerInteraction` | Emitted on marker mouse leave. |\n| `view-change` | `{ zoom: number; panX: number; panY: number }` | Emitted when zoom or pan state changes. |\n\n## Interaction Behavior\n\n- Clicking a country selects it.\n- Clicking the selected country clears selection.\n- Clicking the map background clears selection.\n- Pressing `Escape` clears selection.\n- Focused countries can be activated with `Enter` or `Space`.\n- Clicking a marker selects or toggles that marker and emits `marker-click` without changing country selection.\n- Focused markers can be activated with `Enter` or `Space`.\n- Zoom controls and wheel zoom update the SVG transform.\n- Dragging pans the map when `enablePan` is `true`.\n\n## Theming\n\n`WorldMapSvg` exposes visual styling through CSS custom properties on the component root. Override them from an application stylesheet or wrapper class:\n\n```css\n.my-map-theme {\n  --affino-world-map-ocean-fill: #dbeafe;\n  --affino-world-map-country-fill: #d1d5db;\n  --affino-world-map-country-selected-fill: #2563eb;\n  --affino-world-map-country-selected-stroke: #1e3a8a;\n  --affino-world-map-marker-fill: #dc2626;\n  --affino-world-map-marker-selected-fill: #2563eb;\n}\n```\n\nAvailable variables:\n\n- `--affino-world-map-ocean-fill`\n- `--affino-world-map-stage-background`\n- `--affino-world-map-stage-border`\n- `--affino-world-map-control-background`\n- `--affino-world-map-control-border`\n- `--affino-world-map-control-color`\n- `--affino-world-map-control-hover-background`\n- `--affino-world-map-control-disabled-opacity`\n- `--affino-world-map-control-disabled-cursor`\n- `--affino-world-map-country-fill`\n- `--affino-world-map-country-stroke`\n- `--affino-world-map-country-hover-fill`\n- `--affino-world-map-country-value-empty-fill`\n- `--affino-world-map-country-value-low-fill`\n- `--affino-world-map-country-value-high-fill`\n- `--affino-world-map-country-selected-fill`\n- `--affino-world-map-country-selected-stroke`\n- `--affino-world-map-country-selected-hover-fill`\n- `--affino-world-map-country-selected-hover-stroke`\n- `--affino-world-map-country-focus-fill`\n- `--affino-world-map-country-focus-stroke`\n- `--affino-world-map-marker-fill`\n- `--affino-world-map-marker-stroke`\n- `--affino-world-map-marker-hover-fill`\n- `--affino-world-map-marker-selected-fill`\n- `--affino-world-map-marker-selected-stroke`\n- `--affino-world-map-marker-success-fill`\n- `--affino-world-map-marker-warning-fill`\n- `--affino-world-map-marker-danger-fill`\n- `--affino-world-map-marker-muted-fill`\n- `--affino-world-map-marker-focus-stroke`\n\n## Non-Goals\n\nThis package intentionally does not include:\n\n- built-in map data\n- TopoJSON conversion\n- marker labels, popover rendering/positioning, clustering, heatmaps, or live transport protocols\n- choropleth legends, tooltips, or advanced color scales\n- MapLibre, D3, Canvas, or WebGL dependencies\n","readmeFilename":"README.md"}