Skip to content
UI Brok

Loading…

No results

Browse catalog

Map

An interactive MapLibre GL map with free CARTO light/dark basemaps (no API key) that flip with the theme, plus a declarative-children contract for markers, popups, routes, arcs, clusters and a heatmap.

Preview

This map requires MapLibre GL. Run `npm install maplibre-gl`; until the bundle loads, a labelled placeholder is shown. Free CARTO basemaps flip with the theme — no API key.

Controls

Theme
Surface
Direction
Viewport

Device view renders in an isolated frame so real responsive breakpoints apply. Switch to Full for overflowing popovers.

Installation

terminal
php artisan ui:add map

Behavior layer (Alpine)

This component installs a self-registering Alpine module to resources/js/ui/map.js. Import the behavior layer once from your bundle so it loads (it hooks alpine:init):

resources/js/ui/index.js JS
import './map.js';

Registry contract

Install confidence

php artisan ui:add map writes only the generated targets below. The CLI validates each file hash before writing and prompts before replacing local changes unless --force is used.

Version
1.0.0
License
open
Stability
stable
Contract
v2
Foundation
≥ 1.0.0
Type Generated target
blade resources/views/components/ui/map.blade.php
js resources/js/ui/map.js

Registry dependencies

None.

Package dependencies

composer: jml/brok:^1.0

npm: alpinejs

npm: maplibre-gl

Guidance

Geospatial view

Support a decision that depends on geography or distance.

Use when

  • Use when geography, route, clustering, or distance meaningfully affects decisions. Do not use a map as decoration when location is not central to the task.

Avoid when

  • Only use when location changes the decision, not as decorative scenery.
Task length
medium
Interaction cost
high
Interruptiveness
none
Input precision
none
Mobile / touch risk
high
Accessibility risk
high
Needs background context
No
Comparison needed
Yes

Preferred alternatives

  • Location list or distance table

Anti-patterns

  • Using a map as decorative scenery

API

manifest knowledge + registry-derived coverage

Props

Prop Type / values Default Description
center array [0, 20] Declared by @props in the registry Blade source.
zoom float 1.5 Declared by @props in the registry Blade source.
minZoom mixed|null null Declared by @props in the registry Blade source.
maxZoom mixed|null null Declared by @props in the registry Blade source.
pitch int 0 Declared by @props in the registry Blade source.
bearing int 0 Declared by @props in the registry Blade source.
interactive bool true Declared by @props in the registry Blade source.
projection mixed|null null Declared by @props in the registry Blade source.
styleLight mixed|null null Declared by @props in the registry Blade source.
styleDark mixed|null null Declared by @props in the registry Blade source.
heatmap mixed|null null Declared by @props in the registry Blade source.
height string 420px Declared by @props in the registry Blade source.
label string Map Declared by @props in the registry Blade source.

Slots

  • default — Primary Blade slot rendered by the component.

Data slots

map

Capabilities

wcag-2.2-aa-target interactive responsive rtl darkMode localized reducedMotion

Behavior

  • Uses server-rendered Blade and semantic HTML.
  • Installs a JavaScript behavior module when the registry item includes resources/js/ui files.
  • Declares registry capability flags: a11y, interactive, responsive, rtl, darkMode, localized, reducedMotion.

Usage

previews.components.map.default.blade.php Blade
<div class="space-y-4">
    <x-ui.map :center="[2.3522, 48.8566]" :zoom="11" height="420px" label="{{ __('Paris') }}">
        <x-ui.map-controls position="top-right" show-zoom show-compass show-fullscreen />
        <x-ui.map-marker :lng="2.3522" :lat="48.8566" color="primary" :label="__('Paris')">
            <x-slot:popup>
                <p class="font-medium text-foreground">{{ __('Paris') }}</p>
                <p class="text-muted-foreground">{{ __('City of Light') }}</p>
            </x-slot:popup>
        </x-ui.map-marker>
    </x-ui.map>

    <p class="text-sm text-muted-foreground">
        {{ __('This map requires MapLibre GL. Run `npm install maplibre-gl`; until the bundle loads, a labelled placeholder is shown. Free CARTO basemaps flip with the theme — no API key.') }}
    </p>
</div>

Accessibility & localization

WCAG 2.2 AA RTL-ready data-slot Keyboard focus-visible Localized labels
  • Accessibility target: wcag-2.2-aa-target.
  • Uses semantic HTML and a stable data-slot attribute for styling/scripting hooks.
  • Focus-visible rings use the ring token so keyboard focus is always visible.
  • Disabled and invalid states are conveyed to assistive tech, not by color alone.
  • Targets WCAG 2.2 AA; verify contrast in light, dark, admin and customer surfaces above.
  • Labels go through __() and the component uses logical properties (ms-*, text-start, start-*) so it mirrors correctly — flip the preview to RTL to confirm.

Source

The exact, editable file ui:add writes into your app — copy it or own the whole thing. Previews render this same code; there are no preview-only components.

Changelog

Current version: v1.0.0. See the site changelog for the full release history.