{"id":51200314,"url":"https://github.com/softwarity/sigwx-draw","last_synced_at":"2026-06-28T00:01:31.386Z","repository":{"id":363141018,"uuid":"1259660385","full_name":"softwarity/sigwx-draw","owner":"softwarity","description":"Draw ICAO SIGWX / WAFS significant-weather charts on a map (MapLibre / OpenLayers / Leaflet).","archived":false,"fork":false,"pushed_at":"2026-06-17T11:27:23.000Z","size":1341,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-17T13:22:15.705Z","etag":null,"topics":["aviation","draw-adapter","fir","icao","leaflet","map","maplibre","openlayers","opmet","sigwx","typescript","wafs","weather","wmo"],"latest_commit_sha":null,"homepage":"https://softwarity.github.io/sigwx-draw/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/softwarity.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-04T18:21:46.000Z","updated_at":"2026-06-17T11:27:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/softwarity/sigwx-draw","commit_stats":null,"previous_names":["softwarity/sigwx-draw"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/softwarity/sigwx-draw","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/softwarity%2Fsigwx-draw","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/softwarity%2Fsigwx-draw/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/softwarity%2Fsigwx-draw/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/softwarity%2Fsigwx-draw/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/softwarity","download_url":"https://codeload.github.com/softwarity/sigwx-draw/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/softwarity%2Fsigwx-draw/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34872279,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aviation","draw-adapter","fir","icao","leaflet","map","maplibre","openlayers","opmet","sigwx","typescript","wafs","weather","wmo"],"created_at":"2026-06-28T00:01:30.613Z","updated_at":"2026-06-28T00:01:31.375Z","avatar_url":"https://github.com/softwarity.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# @softwarity/sigwx-draw\n\n**Works with** \u0026nbsp;\u003csub\u003e(via \u003ccode\u003e@softwarity/draw-adapter\u003c/code\u003e)\u003c/sub\u003e\n\n\u003cp align=\"left\"\u003e\n  \u003ca href=\"https://maplibre.org/\" title=\"MapLibre\"\u003e\u003cimg src=\"demo/src/assets/logos/maplibre.svg\" alt=\"MapLibre\" height=\"24\"\u003e\u003c/a\u003e\n  \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"https://openlayers.org/\" title=\"OpenLayers\"\u003e\u003cimg src=\"demo/src/assets/logos/openlayers.svg\" alt=\"\" height=\"22\"\u003e\u0026nbsp;\u003cb\u003eOpenLayers\u003c/b\u003e\u003c/a\u003e\n  \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"https://leafletjs.com/\" title=\"Leaflet\"\u003e\u003cimg src=\"demo/src/assets/logos/leaflet.png\" alt=\"Leaflet\" height=\"26\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nHeadless **SIGWX** (significant weather) chart editor that grafts onto an existing\n**MapLibre GL**, **OpenLayers** or **Leaflet** map — the sibling of\n[`@softwarity/sigmet-draw`](../sigmet-draw). The host owns the map; this library\nadds the drawing overlays, edit handles and a phenomenon-driven metadata model.\nThe three engines render identically: the map layer is the shared, data-driven\n[`@softwarity/draw-adapter`](../draw-adapter), so styling lives in the data and no\ndomain type ever reaches the engine.\n\nThe defining idea: **a phenomenon's metadata drives its rendering.** A jet\nstream's wind barbs are computed from its `maxWindSpeed`; a CB gets a scalloped\nedge and an `ISOL/OCNL/FRQ` label; turbulence gets a dashed outline and a MOD/SEV\nglyph. Each phenomenon is a self-contained, data-driven `PhenomenonDef` in a\nregistry, so adding one never touches the controller.\n\n\u003e Status: phenomena are pure-JSON **descriptors** compiled into a registry and bundled into\n\u003e self-contained **profiles** — **WAFS SWH** (the inline default) and **TEMSI** (`temsi-france`\n\u003e ground→FL150, `temsi-euroc` ground→FL450). Shipped phenomena: jet stream, CB, turbulence (CAT),\n\u003e icing, tropopause, zero-isotherm, fronts, WMO point symbols, point markers (volcano / TC /\n\u003e radioactive), and convective / non-convective cloud areas (the latter with zone-level\n\u003e icing + turbulence composites). All metadata editing is **inline on the map** — there is no form.\n\n## Install\n\n```sh\nnpm i @softwarity/sigwx-draw\n# peer deps (only the engine you use):\nnpm i maplibre-gl   # and/or  ol   and/or  leaflet\n```\n\n## Quick start (MapLibre)\n\n```ts\nimport { SigwxDraw, type SigwxProfile } from \"@softwarity/sigwx-draw\";\nimport { MapLibreAdapter, createMapLibreMap } from \"@softwarity/sigwx-draw/maplibre\";\nimport temsiEuroc from \"@softwarity/sigwx-draw/profiles/temsi-euroc.json\";\n\nconst map = createMapLibreMap({ container: \"map\", center: [10, 48], zoom: 4 });\nconst sigwx = new SigwxDraw({\n  adapter: new MapLibreAdapter({ map }),\n  toolbar: true,\n  profile: temsiEuroc as unknown as SigwxProfile, // omit ⇒ WAFS SWH (the inline default)\n});\nawait sigwx.ready();\n\n// All metadata editing is INLINE on the map (cards / pickers / FL gauges) — there is no form.\nsigwx.on(\"change\", (geojson) =\u003e console.log(geojson)); // FeatureCollection output\n```\n\nOpenLayers is identical via `@softwarity/sigwx-draw/openlayers`\n(`OpenLayersAdapter` / `createOpenLayersMap`), and Leaflet via\n`@softwarity/sigwx-draw/leaflet` (`LeafletAdapter` / `createLeafletMap`, an `L.Map`).\nThe consumer loads the engine's stylesheet (`maplibre-gl/dist/maplibre-gl.css`,\n`ol/ol.css`, or `leaflet/dist/leaflet.css`). Each engine is an **optional**\n`peerDependency` — install only the one(s) you use. Capabilities differ: the globe\nprojection is MapLibre-only (OpenLayers \u0026 Leaflet are 2D).\n\n## API\n\n- `new SigwxDraw({ adapter, profile?, registry?, style?, toolbar?, symbolSprite?, phenomena?, turbulenceTypes? })`\n  — `profile` defaults to WAFS SWH (inline); pass a `SigwxProfile` (e.g. a TEMSI JSON) to swap the set.\n- `draw(type) → id` (enter draw mode), `select(id|null)`, `updateMetadata(id, patch)`,\n  `updateListItem(id, list, i, patch)`, `removeListItem(id, list, i)`,\n  `delete(id)`, `clear()`, `bringToFront(id)`, `sendToBack(id)`\n- `save(): FeatureCollection`, `load(fc)` — metadata lives in feature `properties`\n- `on(\"change\" | \"select\" | \"metadata\", cb)`, `off(...)`, `ready()`, `destroy()`\n- `setProfile(profile)` (live re-ingest, document preserved), `setArea(id|null)` (frame a chart area),\n  `setStyle(partial)`, `setPhenomenonStyle(type, style)`,\n  `setPhenomenonFlightLevel(type, { min, max })`, `addTurbulenceTypes(types)`\n\n## Profiles \u0026 phenomena\n\nPhenomena are pure-JSON **descriptors** bundled into self-contained **profiles** (descriptors + glyph\natlas + grouped toolbar), each npm/CDN-servable on its own and loaded via `new SigwxDraw({ profile })`\nor live `setProfile()`. Bundled under the `./profiles` entry point:\n\n- **`wafs`** — WAFS SWH, the **inline default**: jet stream, CB, turbulence (CAT), icing, …\n- **`temsi-france`** (ground→FL150) and **`temsi-euroc`** (ground→FL450): cloud areas, fronts,\n  tropopause, zero-isotherm, WMO point-symbol pickers, point markers, …\n\n**Cloud areas** follow ICAO/WAFC doctrine and split in two: **`cloudConvective`** (CU / CB — a CB\nalready *implies* turbulence + icing via the chart legend) and **`cloudNonConvective`** (CI / CC / CS /\nAC / AS / NS / SC / ST). A non-convective cloud zone can carry **zone-level icing and turbulence\ncomposites** — each one its own card glued above / below the zone (severity picker + its own FL gauge,\ndelete ✕), declared with a `composites: [{ key, ref, place }]` token that reuses the stock\n`icing` / `turbulence` descriptors (no data duplication). Editing is fully inline.\n\n## Headless core (no map)\n\n`@softwarity/sigwx-draw/core` exposes the pure pieces — the `PhenomenonRegistry`,\nthe metadata schema/validation, the decoration generators (`barbCounts`,\n`windBarbFeatures`, `scallopRing`, …) and the GeoJSON (de)serialization. All\nunit-testable without a map.\n\n## Develop\n\n```sh\nnpm run build        # tsc → dist (ESM + d.ts)\nnpm test             # vitest (pure core + controller via a mock adapter)\ncd demo \u0026\u0026 npm start # Angular demo at http://localhost:4211 (MapLibre + OpenLayers + Leaflet)\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoftwarity%2Fsigwx-draw","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsoftwarity%2Fsigwx-draw","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoftwarity%2Fsigwx-draw/lists"}