david.nguyen ef665f7bf1 Refactor Zone interface to use separate shipping schedule fields
Replace single deliverySchedule field with shippingScheduleStart and shippingScheduleEnd for more granular control over delivery time windows. Update both Leaflet and Libre adapters to display the new fields.

Co-Authored-By: David Nguyen <david.nguyen@goutezplanb.com>

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 17:13:13 -04:00
2025-10-27 13:39:29 -04:00
2025-10-27 13:39:29 -04:00
2025-10-27 13:39:29 -04:00
2025-10-27 13:39:29 -04:00
2025-10-27 13:39:29 -04:00
2025-10-27 13:39:29 -04:00
2025-10-27 13:39:29 -04:00

ngx-open-map-wrapper

An Angular 16+ library that provides a unified map component with automatic fallback between MapLibre GL (WebGL vector maps) and Leaflet (raster maps).

It automatically chooses the best renderer for the users device:

  • MapLibre GL if WebGL is supported
  • Leaflet if WebGL is not available or raster rendering is forced

Features

  • 🗺️ Always shows a map — automatically picks the right engine for the device
  • Uses MapLibre GL for modern devices with WebGL support
  • 🪶 Falls back to Leaflet for older or lowend devices
  • 🎯 Unified API for markers, zoom, and center — no need to learn two libraries
  • 📱 Works seamlessly across desktop and mobile
  • 🧩 Angularnative: standalone components, signals, and modern syntax

📦 Installation

Install the library and its peer dependencies:

yarn add ngx-open-open-map-wrapper leaflet maplibre-gl

Then import the required CSS styles in your global styles.css (or styles.scss):

@import "leaflet/dist/leaflet.css";
@import "maplibre-gl/dist/maplibre-gl.css";

🚀 Usage

Import the component

Since the library is standaloneready, you can import the component directly:

import { Component } from '@angular/core';
import { MapComponent, MapFacade } from 'ngx-open-open-map-wrapper';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [MapComponent],
  template: `
    <open-map
      [center]="[46.3385, -72.6106]"
      [zoom]="14"
      (mapReady)="onMapReady($event)"
    ></open-map>
  `,
})
export class AppComponent {
  private map?: MapFacade;

  onMapReady(facade: MapFacade) {
    this.map = facade;
    this.map.addMarker([46.3385, -72.6106], { color: 'blue' });
  }
}

⚙️ API

MapComponent Inputs

  • center: [lat, lng] → Initial map center
  • zoom: number → Initial zoom level
  • forceRaster: boolean → Force Leaflet raster mode even if WebGL is available
  • styleUrl: string → MapLibre style URL (default: MapLibre basic style)

MapComponent Outputs

  • (mapReady: MapFacade) → Emits the MapFacade instance once the map is initialized

MapFacade Methods

  • setCenter([lat, lng]) → Move the map center
  • setZoom(zoom: number) → Set zoom level
  • addMarker([lat, lng], { color?: string }) → Add a marker
  • destroy() → Clean up map instance

🧩 WebGL Detection Directive

You can also use the directive directly if you want to check WebGL support:

<div webglDetection (webglSupport)="onWebGLCheck($event)">
  @if (webglOk) {
    <my-component-using-webgl></my-component-using-webgl>
  } @else {
    <p>WebGL not supported → fallback</p>
  }
</div>
webglOk = false;

onWebGLCheck(supported: boolean) {
  this.webglOk = supported;
}

📜 License

MIT

S
Description
No description provided
Readme 27 MiB
Languages
TypeScript 97.4%
HTML 1.7%
SCSS 0.7%
CSS 0.2%