All examples

Map block

Places and a delivery route on the fictional Port Meridian basemap, keyboard pan and zoom, and a hostile block the guard rejects. No tiles or network.

Map block

blocks-map · blocks/MapBlockView

blocks map
Props
  • block
  • headingLevel
  • labels
  • locale
  • oninvalid
  • onselect

Live example loads in an isolated same-origin preview frame.

Source (blocks-map/BlocksMapDemo.svelte)
<script lang="ts">
import type { FieldIssue } from '@texuli/blocks';
import { MapBlockView } from '@texuli/blocks/map/renderers';
import { DELIVERY_MAP, HOSTILE_MAP } from './samples.ts';

/** A map block from validated data, and a hostile one the guard rejects. */
let rejected = $state('');
const report = (issues: FieldIssue[]) => {
  rejected = issues.map((issue) => `${issue.path.join('.')}: ${issue.message}`).join('; ');
};
</script>

<article class="demo" data-example="blocks-map" aria-labelledby="blocks-map-title">
  <h2 id="blocks-map-title">Map block</h2>
  <MapBlockView block={DELIVERY_MAP} locale="en" />
  <section class="case" aria-labelledby="blocks-map-hostile">
    <h3 id="blocks-map-hostile">Hostile input is rejected</h3>
    <MapBlockView block={HOSTILE_MAP} oninvalid={report} />
    {#if rejected}<p class="issue" data-rejected>Rejected: {rejected}</p>{/if}
  </section>
</article>

<style>
  .demo {
    display: grid;
    gap: 1.5rem;
    max-inline-size: 52rem;
    padding: 1.5rem;
  }
  .demo h2,
  .case h3,
  .issue {
    margin: 0;
  }
  .case {
    display: grid;
    gap: 0.5rem;
  }
  .issue {
    font-size: 0.875rem;
  }
</style>