@kerusiweb/react 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -121,6 +121,16 @@ usually a mistake.
121
121
  `validate="throw"` throws a `KerusiValidationError` **during render**, so an
122
122
  error boundary catches it. `collect` never throws.
123
123
 
124
+ **Zoom, pan and maximize** (both off by default; see [Zoom, pan and maximize](#zoom-pan-and-maximize))
125
+
126
+ | Prop | Type | Default | |
127
+ | ------------------ | ------------------------------- | ------- | -------------------------------------------------------------------------------------- |
128
+ | `zoomable` | `boolean` | `false` | Pinch, Ctrl/Cmd + wheel and drag to zoom and pan; `+` `-` `0` keys; on-screen buttons. |
129
+ | `maxZoom` | `number` | `4` | The zoom ceiling, relative to fit. The floor is always fit. |
130
+ | `showZoomControls` | `boolean` | `true` | The built-in zoom buttons. Turn off to supply your own. |
131
+ | `maximizable` | `boolean` | `false` | A button that fills the screen with the map. |
132
+ | `controlStrings` | `Partial<KerusiControlStrings>` | English | The names of the zoom and maximize buttons, for translation. |
133
+
124
134
  ### Callbacks
125
135
 
126
136
  | Prop | Payload | |
@@ -130,6 +140,8 @@ error boundary catches it. `collect` never throws.
130
140
  | `onSeatDisallowed` | `SeatDisallowed` | `reason` is `booked`, `held`, `blocked`, `not-selectable`, `max-selection` or `companion-unavailable`. |
131
141
  | `onSeatFocus` | `RenderSeat` | |
132
142
  | `onValidationIssues` | `readonly KerusiViolation[]` | Called whenever the documents change. |
143
+ | `onViewportChange` | `KerusiViewport` | `{ zoom, x, y }`, whenever the zoom or pan changes. Only with `zoomable`. |
144
+ | `onMaximizedChange` | `boolean` | When the map is maximized or restored. Only with `maximizable`. |
133
145
 
134
146
  ### The `ref`
135
147
 
@@ -137,6 +149,8 @@ error boundary catches it. `collect` never throws.
137
149
  const map = useRef<KerusiSeatmapHandle>(null);
138
150
  // map.current.summary -> { seats, total, unpriced }
139
151
  // map.current.focusSeat('A12')
152
+ // map.current.viewport -> { zoom, x, y }
153
+ // map.current.zoomIn() / zoomOut() / resetZoom() / toggleMaximized()
140
154
  ```
141
155
 
142
156
  ### Memoizing props
@@ -207,6 +221,78 @@ Every key of `KerusiSeatmapColors` has a property, kebab-cased:
207
221
  | `focusRing` | `--kerusi-focus-ring` |
208
222
  | `backdrop` | `--kerusi-backdrop` |
209
223
 
224
+ ### Zoom, pan and maximize
225
+
226
+ Two features, both **off by default**: with them off the markup and behaviour are
227
+ exactly what they were. They are independent; turn on either or both.
228
+
229
+ On a phone a map of several hundred seats is drawn at fit-to-width, so a seat is
230
+ too small to tap. `zoomable` lets the reader zoom in and pan; `maximizable` adds a button
231
+ that fills the screen.
232
+
233
+ **Zoom and pan.**
234
+
235
+ - **Pinch** with two fingers on a touch screen. **Ctrl/Cmd + wheel**, or a
236
+ trackpad pinch (Safari's included), on desktop. A plain wheel is left alone, so
237
+ the page still scrolls.
238
+ - **Drag** with one finger or the primary mouse button to pan.
239
+ - **A tap still selects**, at any zoom level. A touch or click that moves less
240
+ than 8 CSS pixels is a tap, and reaches the seat exactly as it does without
241
+ `zoomable`. Anything that moves further is a drag, and a drag never selects the
242
+ seat under it.
243
+ - **Limits.** The floor is fit-to-container, the ceiling is `maxZoom` (default
244
+ `4`), and panning stays inside the map. A map smaller than its container, which
245
+ happens when it is maximized on a large screen, is centred.
246
+ - **Gestures and the page.** `touch-action` is `pan-y` at fit, so a one-finger
247
+ vertical swipe still scrolls the page while a pinch is the map's; once zoomed in
248
+ or maximized it is `none`. With `zoomable` off, no `touch-action` is set.
249
+ - **Reduced motion.** The short transition on the zoom buttons, the keys and
250
+ reset is dropped under `prefers-reduced-motion: reduce`. A finger or wheel moves
251
+ the map directly and never eases.
252
+
253
+ | Key | |
254
+ | --------------- | ------------------------------------------------------------ |
255
+ | `+` / `=`, `-` | Zoom in / out, from anywhere inside the map |
256
+ | `0` | Reset to fit |
257
+ | `←` `→` `↑` `↓` | Pan, when the zoomable viewport itself has focus (Tab to it) |
258
+
259
+ On a seat, the arrow keys keep their usual job of moving seat focus, and a seat
260
+ that takes keyboard focus is scrolled into view. Ctrl, Cmd and Alt combinations
261
+ are left to the browser, and keys typed into a field you put inside the map are
262
+ ignored.
263
+
264
+ **Controls.** The zoom buttons (zoom in, zoom out, reset to fit) are real
265
+ `<button>`s with accessible names. At a limit they set `aria-disabled` rather than
266
+ `disabled`, so keyboard focus is not thrown away mid-press. Their names come from
267
+ `controlStrings`, for translation. They use the theme's existing tokens
268
+ (`--kerusi-element-bg`, `--kerusi-element-fg`, `--kerusi-element-muted-fg`,
269
+ `--kerusi-focus-ring`), so there is nothing new to theme.
270
+
271
+ To put the controls somewhere else, turn the built-in ones off
272
+ (`showZoomControls={false}`) and drive the map yourself:
273
+
274
+ ```tsx
275
+ const map = useRef<KerusiSeatmapHandle>(null);
276
+ // map.current.zoomIn(); map.current.zoomOut(); map.current.resetZoom(); map.current.toggleMaximized();
277
+ // map.current.viewport -> { zoom, x, y }
278
+ // map.current.maximized -> boolean
279
+ ```
280
+
281
+ `onViewportChange` reports `{ zoom, x, y }` whenever the view changes, for a host that wants
282
+ to display or persist it. (Restoring a saved view is not supported.)
283
+
284
+ **Maximize.** The button fills the screen with the map and its legend, freezes the
285
+ page behind it, and swaps to an "Exit full screen" button. The layout is a fixed
286
+ overlay, which is all iPhone Safari offers; where the browser has the Fullscreen
287
+ API it is requested on top, and leaving it with the browser's own Esc leaves the
288
+ map's maximized state too. `Escape` from the map also leaves, except that on a
289
+ seat with a non-empty selection the first `Escape` still clears the selection, as
290
+ it always has. The backdrop is `--kerusi-backdrop`, or the page's own canvas colour
291
+ while that is transparent; `--kerusi-maximized-z-index` (default `1000`) sets the
292
+ stacking. It is not a modal dialog: focus is not trapped, and an ancestor with a
293
+ `transform` or `filter` would anchor the fixed layout to itself instead of the
294
+ screen.
295
+
210
296
  ### Keyboard
211
297
 
212
298
  Tab moves between sections; each section keeps its own tab stop. Within a
@@ -227,6 +313,8 @@ Each seat is a `role="button"` announcing its position, type, price, status,
227
313
  every `Seat.accessibility` property and its attributes. A polite live region
228
314
  reports the running selection and any disallowed reason.
229
315
 
316
+ With `zoomable` on there are a few more keys: see [Zoom, pan and maximize](#zoom-pan-and-maximize).
317
+
230
318
  ---
231
319
 
232
320
  ## `<KerusiLegend>`
@@ -15,6 +15,11 @@ import type { KerusiSeatmapHandle, KerusiSeatmapProps } from './types.js';
15
15
  *
16
16
  * Import the stylesheet once, anywhere in the app:
17
17
  * `import '@kerusiweb/react/styles.css'`.
18
+ *
19
+ * Two opt-in features sit on top, both off by default so an existing map is
20
+ * unchanged: `zoomable` (pinch, wheel and drag, keys `+` `-` `0`, buttons) and
21
+ * `maximizable` (a full-screen button). Their arithmetic is in
22
+ * `@kerusiweb/core`; this file supplies the listeners and the state.
18
23
  */
19
24
  export declare const KerusiSeatmap: import("react").ForwardRefExoticComponent<KerusiSeatmapProps & import("react").RefAttributes<KerusiSeatmapHandle>>;
20
25
  //# sourceMappingURL=kerusi-seatmap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"kerusi-seatmap.d.ts","sourceRoot":"","sources":["../src/kerusi-seatmap.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAGnB,MAAM,YAAY,CAAC;AAOpB;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,oHAmazB,CAAC"}
1
+ {"version":3,"file":"kerusi-seatmap.d.ts","sourceRoot":"","sources":["../src/kerusi-seatmap.tsx"],"names":[],"mappings":"AA6CA,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAGnB,MAAM,YAAY,CAAC;AASpB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,aAAa,oHAkmBzB,CAAC"}
@@ -1,9 +1,11 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { buildNavigationGraph, buildRenderModel, DEFAULT_SEAT_ARIA_STRINGS, disallowedAnnouncement, computeSectionLayout, errorsOf, expireHolds as expireHoldsIn, formatMoney, isRtlLocale, KerusiValidationError, resolveColors, resolveMapLocale, seatAriaLabel, summarizeSelection, toggleSeatSelection, validateDocumentSet, } from '@kerusiweb/core';
3
- import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useState } from 'react';
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { buildNavigationGraph, buildRenderModel, controlStyle, DEFAULT_MAX_ZOOM, DEFAULT_SEAT_ARIA_STRINGS, disallowedAnnouncement, computeSectionLayout, errorsOf, expireHolds as expireHoldsIn, formatMoney, isRtlLocale, isTextEntryTarget, KerusiValidationError, resolveColors, resolveControlStrings, resolveMapLocale, seatAriaLabel, summarizeSelection, toggleSeatSelection, validateDocumentSet, viewportTouchAction, viewportTransform, } from '@kerusiweb/core';
3
+ import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, } from 'react';
4
4
  import { KerusiLegend } from './kerusi-legend.js';
5
5
  import { KerusiSection } from './kerusi-section.js';
6
+ import { useMaximized } from './use-maximized.js';
6
7
  import { useRovingFocus } from './use-roving-focus.js';
8
+ import { useViewport } from './use-viewport.js';
7
9
  const NO_SELECTION = [];
8
10
  const DEFAULT_SELECTABLE_STATUSES = ['available'];
9
11
  const NO_OVERRIDES = {};
@@ -23,9 +25,14 @@ const NO_OVERRIDES = {};
23
25
  *
24
26
  * Import the stylesheet once, anywhere in the app:
25
27
  * `import '@kerusiweb/react/styles.css'`.
28
+ *
29
+ * Two opt-in features sit on top, both off by default so an existing map is
30
+ * unchanged: `zoomable` (pinch, wheel and drag, keys `+` `-` `0`, buttons) and
31
+ * `maximizable` (a full-screen button). Their arithmetic is in
32
+ * `@kerusiweb/core`; this file supplies the listeners and the state.
26
33
  */
27
34
  export const KerusiSeatmap = forwardRef(function KerusiSeatmap(props, ref) {
28
- const { map, state, session, selection: controlledSelection, defaultSelection = NO_SELECTION, onSelectionChange, locale, rtl = 'auto', ariaStrings = DEFAULT_SEAT_ARIA_STRINGS, colors, typeColors = true, seatSize = 28, seatGap = 6, freeformBasis = 1000, unitScale = 1, showSectionLabels = true, showLegend = false, showLegendPrices = true, sectionIds, sectionOverrides = NO_OVERRIDES, selectableStatuses = DEFAULT_SELECTABLE_STATUSES, companionMode = 'auto', maxSelection, seatSelectable, interactive = true, expireHolds = false, expiryIntervalMs = 1000, validate = 'collect', onSeatSelect, onSeatDeselect, onSeatDisallowed, onSeatFocus, onValidationIssues, className, style, children, } = props;
35
+ const { map, state, session, selection: controlledSelection, defaultSelection = NO_SELECTION, onSelectionChange, locale, rtl = 'auto', ariaStrings = DEFAULT_SEAT_ARIA_STRINGS, colors, typeColors = true, seatSize = 28, seatGap = 6, freeformBasis = 1000, unitScale = 1, showSectionLabels = true, showLegend = false, showLegendPrices = true, sectionIds, sectionOverrides = NO_OVERRIDES, selectableStatuses = DEFAULT_SELECTABLE_STATUSES, companionMode = 'auto', maxSelection, seatSelectable, interactive = true, expireHolds = false, expiryIntervalMs = 1000, zoomable = false, maxZoom = DEFAULT_MAX_ZOOM, showZoomControls = true, maximizable = false, controlStrings, validate = 'collect', onSeatSelect, onSeatDeselect, onSeatDisallowed, onSeatFocus, onValidationIssues, onViewportChange, onMaximizedChange, className, style, children, } = props;
29
36
  // --- selection: controlled or not ---------------------------------------
30
37
  const [uncontrolledSelection, setUncontrolledSelection] = useState(defaultSelection);
31
38
  const isControlled = controlledSelection !== undefined;
@@ -120,7 +127,20 @@ export const KerusiSeatmap = forwardRef(function KerusiSeatmap(props, ref) {
120
127
  seatAriaLabel(seat, resolvedLocale, ariaStrings),
121
128
  ])), [renderMap, resolvedLocale, ariaStrings]);
122
129
  // --- focus and announcements --------------------------------------------
123
- const { focusedSeatIds, setFocusedSeat, moveFocusTo, focusSeat, registerSeat } = useRovingFocus(renderMap);
130
+ const { focusedSeatIds, setFocusedSeat, moveFocusTo, focusSeat, getSeatNode, registerSeat } = useRovingFocus(renderMap, zoomable);
131
+ // --- zoom, pan and maximize -----------------------------------------------
132
+ const rootRef = useRef(null);
133
+ const zoom = useViewport({ enabled: zoomable, maxZoom, onViewportChange });
134
+ const { maximized, toggleMaximized, setMaximized } = useMaximized({
135
+ enabled: maximizable,
136
+ rootRef,
137
+ onChange: onMaximizedChange,
138
+ });
139
+ const strings = useMemo(() => resolveControlStrings(controlStrings), [controlStrings]);
140
+ const controlColors = useMemo(() => controlStyle(colors), [colors]);
141
+ const showToolbar = (zoomable && showZoomControls) || maximizable;
142
+ const atFit = zoom.viewport.zoom <= 1 + 1e-4;
143
+ const atMaxZoom = zoom.viewport.zoom >= zoom.limits.maxZoom - 1e-4;
124
144
  /**
125
145
  * The live-region text, plus a counter that makes a repeat of the same
126
146
  * message textually distinct.
@@ -190,7 +210,10 @@ export const KerusiSeatmap = forwardRef(function KerusiSeatmap(props, ref) {
190
210
  }
191
211
  setFocusedSeat(seat.sectionId, seatId);
192
212
  onSeatFocus?.(seat);
193
- }, [renderMap, setFocusedSeat, onSeatFocus]);
213
+ if (zoomable) {
214
+ zoom.revealSeat(getSeatNode(seatId));
215
+ }
216
+ }, [renderMap, setFocusedSeat, onSeatFocus, zoomable, zoom.revealSeat, getSeatNode]);
194
217
  /**
195
218
  * Arrow keys walk the navigation graph, which orders seats by `col` in grid
196
219
  * and mixed sections — §4.3.1's logical adjacency — so the aisle that is a
@@ -254,14 +277,71 @@ export const KerusiSeatmap = forwardRef(function KerusiSeatmap(props, ref) {
254
277
  }, [graphs, onSeatActivate, selection, commitSelection, announceSelection, moveFocusTo]);
255
278
  // --- public handle ------------------------------------------------------
256
279
  const summary = useMemo(() => summarizeSelection(renderMap, selection), [renderMap, selection]);
257
- useImperativeHandle(ref, () => ({ summary, focusSeat }), [summary, focusSeat]);
280
+ useImperativeHandle(ref, () => ({
281
+ summary,
282
+ focusSeat,
283
+ viewport: zoom.viewport,
284
+ zoomIn: zoom.zoomIn,
285
+ zoomOut: zoom.zoomOut,
286
+ resetZoom: zoom.resetZoom,
287
+ maximized,
288
+ toggleMaximized,
289
+ }), [
290
+ summary,
291
+ focusSeat,
292
+ zoom.viewport,
293
+ zoom.zoomIn,
294
+ zoom.zoomOut,
295
+ zoom.resetZoom,
296
+ maximized,
297
+ toggleMaximized,
298
+ ]);
299
+ /**
300
+ * `+` `-` `0` zoom, and arrows pan when the viewport itself has focus; Esc
301
+ * leaves a maximized map. A seat's own handler runs first, so an Esc that
302
+ * cleared the selection is already `defaultPrevented` and stays at that.
303
+ */
304
+ const onRootKeyDown = (event) => {
305
+ if (event.defaultPrevented || isTextEntryTarget(event.target)) {
306
+ return;
307
+ }
308
+ if (zoomable && zoom.handleKeyDown(event)) {
309
+ event.preventDefault();
310
+ return;
311
+ }
312
+ if (event.key === 'Escape' && maximized) {
313
+ event.preventDefault();
314
+ setMaximized(false);
315
+ }
316
+ };
258
317
  // --- render -------------------------------------------------------------
259
318
  const labelFor = (section) => sectionOverrides[section.id]?.label ?? section.label;
260
319
  const labelId = (section) => `kerusi-section-${renderMap.id}-${section.id}`;
261
- return (_jsxs("div", { className: className ? `kerusi-seatmap ${className}` : 'kerusi-seatmap', role: "group", "aria-label": renderMap.name ?? `Seat map ${renderMap.id}`, dir: isRtl ? 'rtl' : undefined, lang: resolvedLocale, style: style, children: [renderMap.sections.map((section) => {
262
- const label = labelFor(section);
263
- return (_jsxs("section", { className: `kerusi-seatmap__section kerusi-seatmap__section--${section.layoutMode}`, role: "group", "aria-labelledby": label ? labelId(section) : undefined, "aria-label": label ? undefined : section.id, children: [showSectionLabels && label && (_jsx("h3", { className: "kerusi-section-label", id: labelId(section), children: label })), _jsx(KerusiSection, { section: section, layout: layouts.get(section.id), selection: selectionSet, focusedSeatId: focusedSeatIds[section.id] ?? null, ariaLabels: ariaLabels, colors: resolvedColors, typeColors: typeColors, unitScale: unitScale, interactive: interactive, onSeatActivate: onSeatActivate, onSeatFocused: onSeatFocused, onSeatKeyDown: (event) => onKeyDown(section.id, event), registerSeat: registerSeat })] }, section.id));
264
- }), showLegend && (_jsx(KerusiLegend, { legend: renderMap.legend, locale: resolvedLocale, colors: resolvedColors, typeColors: typeColors, showPrices: showLegendPrices })), _jsx("p", { className: "kerusi-sr-only", "aria-live": "polite", "aria-atomic": "true", children: liveMessage }), children] }));
320
+ const sections = renderMap.sections.map((section) => {
321
+ const label = labelFor(section);
322
+ return (_jsxs("section", { className: `kerusi-seatmap__section kerusi-seatmap__section--${section.layoutMode}`, role: "group", "aria-labelledby": label ? labelId(section) : undefined, "aria-label": label ? undefined : section.id, children: [showSectionLabels && label && (_jsx("h3", { className: "kerusi-section-label", id: labelId(section), children: label })), _jsx(KerusiSection, { section: section, layout: layouts.get(section.id), selection: selectionSet, focusedSeatId: focusedSeatIds[section.id] ?? null, ariaLabels: ariaLabels, colors: resolvedColors, typeColors: typeColors, unitScale: unitScale, interactive: interactive, onSeatActivate: onSeatActivate, onSeatFocused: onSeatFocused, onSeatKeyDown: (event) => onKeyDown(section.id, event), registerSeat: registerSeat })] }, section.id));
323
+ });
324
+ const focusRing = { '--kerusi-focus-ring-input': resolvedColors.focusRing };
325
+ const buttonStyle = {
326
+ background: controlColors.buttonBackground,
327
+ color: controlColors.buttonColor,
328
+ borderColor: controlColors.buttonBorder,
329
+ };
330
+ const classes = ['kerusi-seatmap', className, maximized && 'kerusi-seatmap--maximized']
331
+ .filter(Boolean)
332
+ .join(' ');
333
+ return (_jsxs("div", { ref: rootRef, className: classes, role: "group", "aria-label": renderMap.name ?? `Seat map ${renderMap.id}`, dir: isRtl ? 'rtl' : undefined, lang: resolvedLocale, style: maximized
334
+ ? {
335
+ ...style,
336
+ background: controlColors.maximizedBackground,
337
+ color: controlColors.maximizedColor,
338
+ }
339
+ : style, onKeyDown: onRootKeyDown, children: [zoomable || maximizable ? (_jsxs("div", { className: "kerusi-seatmap__stage", children: [showToolbar && (_jsxs("div", { className: "kerusi-toolbar", role: "toolbar", "aria-label": strings.toolbar, style: focusRing, children: [zoomable && showZoomControls && (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "kerusi-control kerusi-control--zoom-in", "aria-label": strings.zoomIn, "aria-disabled": atMaxZoom, style: buttonStyle, onClick: zoom.zoomIn, children: _jsx("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "M12 5v14M5 12h14" }) }) }), _jsx("button", { type: "button", className: "kerusi-control kerusi-control--zoom-out", "aria-label": strings.zoomOut, "aria-disabled": atFit, style: buttonStyle, onClick: zoom.zoomOut, children: _jsx("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "M5 12h14" }) }) }), _jsx("button", { type: "button", className: "kerusi-control kerusi-control--zoom-reset", "aria-label": strings.zoomReset, "aria-disabled": atFit, style: buttonStyle, onClick: zoom.resetZoom, children: _jsx("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "M3 12a9 9 0 1 0 3-6.7M3 4v5h5" }) }) })] })), maximizable && (_jsx("button", { type: "button", className: "kerusi-control kerusi-control--maximize", "aria-label": maximized ? strings.restore : strings.maximize, style: buttonStyle, onClick: toggleMaximized, children: _jsx("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", focusable: "false", children: maximized ? (_jsx("path", { d: "M9 4v5H4M15 4v5h5M15 20v-5h5M9 20v-5H4" })) : (_jsx("path", { d: "M4 9V4h5M15 4h5v5M20 15v5h-5M9 20H4v-5" })) }) }))] })), zoomable ? (_jsx("div", { ref: zoom.viewRef, className: "kerusi-viewport", role: "group", tabIndex: 0, "aria-label": strings.viewport, style: {
340
+ ...focusRing,
341
+ touchAction: viewportTouchAction(zoom.viewport, maximized),
342
+ }, children: _jsx("div", { ref: zoom.contentRef, className: zoom.animated
343
+ ? 'kerusi-viewport__content kerusi-viewport__content--animated'
344
+ : 'kerusi-viewport__content', style: { transform: viewportTransform(zoom.viewport) }, children: sections }) })) : (sections)] })) : (sections), showLegend && (_jsx(KerusiLegend, { legend: renderMap.legend, locale: resolvedLocale, colors: resolvedColors, typeColors: typeColors, showPrices: showLegendPrices })), _jsx("p", { className: "kerusi-sr-only", "aria-live": "polite", "aria-atomic": "true", children: liveMessage }), children] }));
265
345
  });
266
346
  function formatTotal(total, locale) {
267
347
  return total ? formatMoney(total, locale) : '';
@@ -1 +1 @@
1
- {"version":3,"file":"kerusi-seatmap.js","sourceRoot":"","sources":["../src/kerusi-seatmap.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,sBAAsB,EACtB,oBAAoB,EACpB,QAAQ,EACR,WAAW,IAAI,aAAa,EAC5B,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAUzB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEnG,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,YAAY,GAAsB,EAAE,CAAC;AAC3C,MAAM,2BAA2B,GAAG,CAAC,WAAW,CAAU,CAAC;AAC3D,MAAM,YAAY,GAAmD,EAAE,CAAC;AAExE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CACrC,SAAS,aAAa,CAAC,KAAK,EAAE,GAAG;IAC/B,MAAM,EACJ,GAAG,EACH,KAAK,EACL,OAAO,EACP,SAAS,EAAE,mBAAmB,EAC9B,gBAAgB,GAAG,YAAY,EAC/B,iBAAiB,EACjB,MAAM,EACN,GAAG,GAAG,MAAM,EACZ,WAAW,GAAG,yBAAyB,EACvC,MAAM,EACN,UAAU,GAAG,IAAI,EACjB,QAAQ,GAAG,EAAE,EACb,OAAO,GAAG,CAAC,EACX,aAAa,GAAG,IAAI,EACpB,SAAS,GAAG,CAAC,EACb,iBAAiB,GAAG,IAAI,EACxB,UAAU,GAAG,KAAK,EAClB,gBAAgB,GAAG,IAAI,EACvB,UAAU,EACV,gBAAgB,GAAG,YAAY,EAC/B,kBAAkB,GAAG,2BAA2B,EAChD,aAAa,GAAG,MAAM,EACtB,YAAY,EACZ,cAAc,EACd,WAAW,GAAG,IAAI,EAClB,WAAW,GAAG,KAAK,EACnB,gBAAgB,GAAG,IAAI,EACvB,QAAQ,GAAG,SAAS,EACpB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,KAAK,EACL,QAAQ,GACT,GAAG,KAAK,CAAC;IAEV,2EAA2E;IAE3E,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GACrD,QAAQ,CAAoB,gBAAgB,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,mBAAmB,KAAK,SAAS,CAAC;IACvD,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,qBAAqB,CAAC;IAE7E,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,IAAuB,EAAE,EAAE;QAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QACD,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,EACD,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAClC,CAAC;IAEF,2EAA2E;IAE3E,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,EAC9E,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAChC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACvB,kBAAkB,EAAE,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,wEAAwE;QACxE,+CAA+C;QAC/C,uDAAuD;IACzD,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,sEAAsE;QACtE,wEAAwE;QACxE,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,qBAAqB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,2EAA2E;IAE3E,qEAAqE;IACrE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAChF,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEpC,2EAA2E;IAC3E,MAAM,cAAc,GAAG,OAAO,CAA0B,GAAG,EAAE;QAC3D,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,oEAAoE;QACpE,gEAAgE;QAChE,KAAK,UAAU,CAAC;QAChB,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IAErC,MAAM,iBAAiB,GAAG,OAAO,CAAgC,GAAG,EAAE;QACpE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;aAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAErB,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACpF,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAExC,MAAM,SAAS,GAAG,OAAO,CACvB,GAAG,EAAE,CACH,gBAAgB,CAAC,GAAG,EAAE,cAAc,EAAE;QACpC,MAAM;QACN,UAAU,EAAE,iBAAiB;QAC7B,kBAAkB;QAClB,cAAc;KACf,CAAC,EACJ,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,CAAC,CACrF,CAAC;IAEF,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC;IAC1E,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEpE,wDAAwD;IACxD,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CACH,IAAI,GAAG,CACL,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACjC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACpD,OAAO;YACL,OAAO,CAAC,EAAE;YACV,oBAAoB,CAAC,OAAO,EAAE;gBAC5B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,QAAQ;gBACvC,OAAO;gBACP,aAAa;gBACb,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,GAAG,EAAE,KAAK;aACX,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CACH,EACH,CAAC,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CACvE,CAAC;IAEF,6EAA6E;IAC7E,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CACH,IAAI,GAAG,CACL,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE;QACV,oBAAoB,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;KAC9C,CAAC,CACH,EACH,CAAC,SAAS,EAAE,KAAK,CAAC,CACnB,CAAC;IAEF,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE,CACH,IAAI,GAAG,CACL,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAC,EAAE;QACP,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,WAAW,CAAC;KACjD,CAAC,CACH,EACH,CAAC,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,CACzC,CAAC;IAEF,2EAA2E;IAE3E,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,GAC5E,cAAc,CAAC,SAAS,CAAC,CAAC;IAE5B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAE5E,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,OAAe,EAAE,EAAE;QAC/C,eAAe,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GACf,YAAY,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,OAAO,QAAQ,CAAC;IAExF,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,IAAuB,EAAE,EAAE;QAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACtD,QAAQ,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC,EACD,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC,CACnD,CAAC;IAEF,2EAA2E;IAE3E,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,MAAc,EAAE,EAAE;QACjB,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE;YACrD,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,aAAa;YACb,YAAY;SACb,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAClC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,MAAO,EAAE,WAAW,CAAC,CAAC,CAAC;YACrE,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAO,EAAE,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,KAAK,GAAoB;YAC7B,IAAI;YACJ,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;QACF,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACrE,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,EACD;QACE,SAAS;QACT,SAAS;QACT,aAAa;QACb,YAAY;QACZ,QAAQ;QACR,WAAW;QACX,gBAAgB;QAChB,eAAe;QACf,YAAY;QACZ,cAAc;QACd,iBAAiB;KAClB,CACF,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,MAAc,EAAE,EAAE;QACjB,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACvC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,EACD,CAAC,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,CACzC,CAAC;IAEF;;;;OAIG;IACH,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,SAAiB,EAAE,KAAsC,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAI,KAAK,CAAC,MAA6B,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEhD,IAAI,MAA0B,CAAC;QAC/B,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;YAClB,KAAK,WAAW;gBACd,MAAM,GAAG,UAAU,EAAE,IAAI,CAAC;gBAC1B,MAAM;YACR,KAAK,YAAY;gBACf,MAAM,GAAG,UAAU,EAAE,KAAK,CAAC;gBAC3B,MAAM;YACR,KAAK,SAAS;gBACZ,MAAM,GAAG,UAAU,EAAE,EAAE,CAAC;gBACxB,MAAM;YACR,KAAK,WAAW;gBACd,MAAM,GAAG,UAAU,EAAE,IAAI,CAAC;gBAC1B,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC;gBAC5D,MAAM;YACR,KAAK,KAAK;gBACR,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC;gBACzD,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;gBACrB,MAAM;YACR,KAAK,UAAU;gBACb,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;gBACpB,MAAM;YACR,KAAK,OAAO,CAAC;YACb,KAAK,GAAG;gBACN,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,cAAc,CAAC,MAAM,CAAC,CAAC;gBACvB,OAAO;YACT,KAAK,QAAQ;gBACX,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,eAAe,CAAC,EAAE,CAAC,CAAC;oBACpB,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBACxB,CAAC;gBACD,OAAO;YACT;gBACE,OAAO;QACX,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,CAAC,CACrF,CAAC;IAEF,2EAA2E;IAE3E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAEhG,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAE/E,2EAA2E;IAE3E,MAAM,QAAQ,GAAG,CAAC,OAAsB,EAAsB,EAAE,CAC9D,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IACvD,MAAM,OAAO,GAAG,CAAC,OAAsB,EAAU,EAAE,CACjD,kBAAkB,SAAS,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;IAEjD,OAAO,CACL,eACE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC,CAAC,gBAAgB,EACvE,IAAI,EAAC,OAAO,gBACA,SAAS,CAAC,IAAI,IAAI,YAAY,SAAS,CAAC,EAAE,EAAE,EACxD,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAC9B,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,KAAK,aAEX,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAChC,OAAO,CACL,mBAEE,SAAS,EAAE,oDAAoD,OAAO,CAAC,UAAU,EAAE,EACnF,IAAI,EAAC,OAAO,qBACK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,gBACzC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,aAEzC,iBAAiB,IAAI,KAAK,IAAI,CAC7B,aAAI,SAAS,EAAC,sBAAsB,EAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,YACtD,KAAK,GACH,CACN,EAED,KAAC,aAAa,IACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAE,EAChC,SAAS,EAAE,YAAY,EACvB,aAAa,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,IAAI,EACjD,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,EACtD,YAAY,EAAE,YAAY,GAC1B,KA1BG,OAAO,CAAC,EAAE,CA2BP,CACX,CAAC;YACJ,CAAC,CAAC,EAED,UAAU,IAAI,CACb,KAAC,YAAY,IACX,MAAM,EAAE,SAAS,CAAC,MAAM,EACxB,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,gBAAgB,GAC5B,CACH,EAED,YAAG,SAAS,EAAC,gBAAgB,eAAW,QAAQ,iBAAa,MAAM,YAChE,WAAW,GACV,EAEH,QAAQ,IACL,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,SAAS,WAAW,CAAC,KAAwB,EAAE,MAAc;IAC3D,OAAO,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"kerusi-seatmap.js","sourceRoot":"","sources":["../src/kerusi-seatmap.tsx"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { DisallowedReason, KerusiMap, KerusiSeatmapColors, KerusiSession, KerusiState, KerusiViolation, RenderSeat, SeatAriaStrings, SeatRenderStatus, SelectionSummary } from '@kerusiweb/core';
1
+ import type { DisallowedReason, KerusiControlStrings, KerusiMap, KerusiSeatmapColors, KerusiSession, KerusiState, KerusiViewport, KerusiViolation, RenderSeat, SeatAriaStrings, SeatRenderStatus, SelectionSummary } from '@kerusiweb/core';
2
2
  import type { CSSProperties, ReactNode } from 'react';
3
3
  /** How a document with validation errors is handled. */
4
4
  export type ValidationMode =
@@ -36,6 +36,18 @@ export interface KerusiSeatmapHandle {
36
36
  readonly summary: SelectionSummary;
37
37
  /** Moves DOM focus to a seat, if it is rendered. */
38
38
  focusSeat(seatId: string): void;
39
+ /** The current zoom and pan. Fit (`{ zoom: 1, x: 0, y: 0 }`) unless `zoomable`. */
40
+ readonly viewport: KerusiViewport;
41
+ /** Zooms in one step about the centre. No-op unless `zoomable`. */
42
+ zoomIn(): void;
43
+ /** Zooms out one step about the centre. No-op unless `zoomable`. */
44
+ zoomOut(): void;
45
+ /** Back to fit-to-container: the map's original view. No-op unless `zoomable`. */
46
+ resetZoom(): void;
47
+ /** Whether the map is currently maximized. */
48
+ readonly maximized: boolean;
49
+ /** Maximizes or restores the map. Maximizing needs `maximizable`. */
50
+ toggleMaximized(): void;
39
51
  }
40
52
  export interface KerusiSeatmapProps {
41
53
  map: KerusiMap;
@@ -96,6 +108,26 @@ export interface KerusiSeatmapProps {
96
108
  */
97
109
  expireHolds?: boolean;
98
110
  expiryIntervalMs?: number;
111
+ /**
112
+ * Pinch, Ctrl/Cmd + wheel and drag to zoom and pan, `+` `-` `0` on the keyboard,
113
+ * and on-screen buttons. A tap still selects at every zoom level. Default `false`.
114
+ */
115
+ zoomable?: boolean;
116
+ /** The zoom ceiling, relative to fit-to-container. The floor is always fit. Default `4`. */
117
+ maxZoom?: number;
118
+ /**
119
+ * The built-in zoom buttons. Turn this off to supply your own, anywhere on the
120
+ * page, and call `zoomIn()`, `zoomOut()` and `resetZoom()` on a `ref`.
121
+ */
122
+ showZoomControls?: boolean;
123
+ /** A button that maximizes the map to fill the screen. Default `false`. */
124
+ maximizable?: boolean;
125
+ /**
126
+ * Overrides the built-in English names of the zoom and maximize controls.
127
+ *
128
+ * Memoize it — a new object each render rebuilds the controls' strings.
129
+ */
130
+ controlStrings?: Partial<KerusiControlStrings>;
99
131
  validate?: ValidationMode;
100
132
  onSeatSelect?: (event: SeatInteraction) => void;
101
133
  onSeatDeselect?: (event: SeatInteraction) => void;
@@ -103,6 +135,9 @@ export interface KerusiSeatmapProps {
103
135
  onSeatFocus?: (seat: RenderSeat) => void;
104
136
  /** Called whenever the documents change, unless `validate` is `off`. */
105
137
  onValidationIssues?: (issues: readonly KerusiViolation[]) => void;
138
+ /** The zoom and pan, whenever they change. For a host that persists or shows them. */
139
+ onViewportChange?: (viewport: KerusiViewport) => void;
140
+ onMaximizedChange?: (maximized: boolean) => void;
106
141
  className?: string;
107
142
  style?: CSSProperties;
108
143
  /** Rendered inside the map's root element, after the sections and legend. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { RefObject } from 'react';
2
+ export interface UseMaximizedOptions {
3
+ /** The map's `maximizable` prop. Maximizing is refused, and undone, without it. */
4
+ enabled: boolean;
5
+ /** The map's root element: what goes full screen. */
6
+ rootRef: RefObject<HTMLElement | null>;
7
+ onChange?: (maximized: boolean) => void;
8
+ }
9
+ export interface Maximized {
10
+ maximized: boolean;
11
+ setMaximized(next: boolean): void;
12
+ toggleMaximized(): void;
13
+ }
14
+ /**
15
+ * Maximizing the map to fill the screen.
16
+ *
17
+ * The fixed-position layout is the whole feature on iPhone, which has no
18
+ * element full screen. Where the browser offers one it is requested on top,
19
+ * and followed: leaving it with the browser's own Esc un-maximizes the map, so
20
+ * the two never disagree.
21
+ */
22
+ export declare function useMaximized({ enabled, rootRef, onChange }: UseMaximizedOptions): Maximized;
23
+ //# sourceMappingURL=use-maximized.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-maximized.d.ts","sourceRoot":"","sources":["../src/use-maximized.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,mBAAmB;IAClC,mFAAmF;IACnF,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,OAAO,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,eAAe,IAAI,IAAI,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,mBAAmB,GAAG,SAAS,CAwE3F"}
@@ -0,0 +1,74 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ /**
3
+ * Maximizing the map to fill the screen.
4
+ *
5
+ * The fixed-position layout is the whole feature on iPhone, which has no
6
+ * element full screen. Where the browser offers one it is requested on top,
7
+ * and followed: leaving it with the browser's own Esc un-maximizes the map, so
8
+ * the two never disagree.
9
+ */
10
+ export function useMaximized({ enabled, rootRef, onChange }) {
11
+ const [maximized, setMaximizedState] = useState(false);
12
+ const maximizedRef = useRef(false);
13
+ const nativeFullscreen = useRef(false);
14
+ const settings = useRef({ enabled, onChange });
15
+ settings.current = { enabled, onChange };
16
+ const setMaximized = useCallback((next) => {
17
+ if (next === maximizedRef.current || (next && !settings.current.enabled)) {
18
+ return;
19
+ }
20
+ maximizedRef.current = next;
21
+ setMaximizedState(next);
22
+ settings.current.onChange?.(next);
23
+ // Native full screen is requested here, inside the click that got us
24
+ // here, because browsers only grant it to a user gesture.
25
+ const root = rootRef.current;
26
+ const doc = root?.ownerDocument;
27
+ if (root && doc) {
28
+ if (next && !doc.fullscreenElement) {
29
+ root.requestFullscreen?.()?.catch(() => undefined);
30
+ }
31
+ else if (!next && doc.fullscreenElement === root) {
32
+ doc.exitFullscreen?.()?.catch(() => undefined);
33
+ }
34
+ }
35
+ }, [rootRef]);
36
+ const toggleMaximized = useCallback(() => setMaximized(!maximizedRef.current), [setMaximized]);
37
+ // `maximizable` switched off underneath a maximized map.
38
+ useEffect(() => {
39
+ if (!enabled && maximizedRef.current) {
40
+ setMaximized(false);
41
+ }
42
+ }, [enabled, setMaximized]);
43
+ // While maximized: freeze the page behind, and follow the browser leaving
44
+ // native full screen.
45
+ useEffect(() => {
46
+ const root = rootRef.current;
47
+ if (!maximized || !root) {
48
+ return;
49
+ }
50
+ const doc = root.ownerDocument;
51
+ const previousOverflow = doc.body.style.overflow;
52
+ doc.body.style.overflow = 'hidden';
53
+ const onFullscreenChange = () => {
54
+ if (doc.fullscreenElement === root) {
55
+ nativeFullscreen.current = true;
56
+ }
57
+ else if (nativeFullscreen.current) {
58
+ nativeFullscreen.current = false;
59
+ setMaximized(false);
60
+ }
61
+ };
62
+ doc.addEventListener('fullscreenchange', onFullscreenChange);
63
+ return () => {
64
+ doc.body.style.overflow = previousOverflow;
65
+ doc.removeEventListener('fullscreenchange', onFullscreenChange);
66
+ nativeFullscreen.current = false;
67
+ if (doc.fullscreenElement === root) {
68
+ doc.exitFullscreen?.()?.catch(() => undefined);
69
+ }
70
+ };
71
+ }, [maximized, rootRef, setMaximized]);
72
+ return { maximized, setMaximized, toggleMaximized };
73
+ }
74
+ //# sourceMappingURL=use-maximized.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-maximized.js","sourceRoot":"","sources":["../src/use-maximized.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@ export interface RovingFocus {
8
8
  moveFocusTo(sectionId: string, seatId: string): void;
9
9
  /** Focuses a seat wherever it is, if it is currently rendered. */
10
10
  focusSeat(seatId: string): void;
11
+ /** A seat's `<g>`, if it is currently rendered. */
12
+ getSeatNode(seatId: string): SVGGElement | null;
11
13
  /** Ref callback each seat `<g>` registers itself through. */
12
14
  registerSeat(seatId: string, node: SVGGElement | null): void;
13
15
  }
@@ -23,5 +25,10 @@ export interface RovingFocus {
23
25
  * so they cannot be interpolated into a selector unescaped, and `CSS.escape` is
24
26
  * absent in jsdom and under SSR. A ref map has neither problem.
25
27
  */
26
- export declare function useRovingFocus(renderMap: RenderMap): RovingFocus;
28
+ export declare function useRovingFocus(renderMap: RenderMap,
29
+ /**
30
+ * Stop the browser scrolling a focused seat into view. A zoomable map moves
31
+ * by transform, and a browser scroll on top would fight it.
32
+ */
33
+ preventScroll?: boolean): RovingFocus;
27
34
  //# sourceMappingURL=use-roving-focus.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-roving-focus.d.ts","sourceRoot":"","sources":["../src/use-roving-focus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,yFAAyF;IACzF,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACxD,4DAA4D;IAC5D,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACrD,kEAAkE;IAClE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,6DAA6D;IAC7D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;CAC9D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW,CA8DhE"}
1
+ {"version":3,"file":"use-roving-focus.d.ts","sourceRoot":"","sources":["../src/use-roving-focus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,yFAAyF;IACzF,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACxD,4DAA4D;IAC5D,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACrD,kEAAkE;IAClE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,mDAAmD;IACnD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC;IAChD,6DAA6D;IAC7D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;CAC9D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,SAAS;AACpB;;;GAGG;AACH,aAAa,UAAQ,GACpB,WAAW,CA2Eb"}
@@ -11,9 +11,16 @@ import { useCallback, useEffect, useRef, useState } from 'react';
11
11
  * so they cannot be interpolated into a selector unescaped, and `CSS.escape` is
12
12
  * absent in jsdom and under SSR. A ref map has neither problem.
13
13
  */
14
- export function useRovingFocus(renderMap) {
14
+ export function useRovingFocus(renderMap,
15
+ /**
16
+ * Stop the browser scrolling a focused seat into view. A zoomable map moves
17
+ * by transform, and a browser scroll on top would fight it.
18
+ */
19
+ preventScroll = false) {
15
20
  const [focusedSeatIds, setFocusedSeatIds] = useState({});
16
21
  const nodes = useRef(new Map());
22
+ const preventScrollRef = useRef(preventScroll);
23
+ preventScrollRef.current = preventScroll;
17
24
  /** Set when a keyboard move asks for focus, consumed after the commit. */
18
25
  const pendingFocus = useRef(null);
19
26
  // Keep every section's tab stop pointing at a seat that still exists.
@@ -41,9 +48,16 @@ export function useRovingFocus(renderMap) {
41
48
  nodes.current.delete(seatId);
42
49
  }
43
50
  }, []);
44
- const focusSeat = useCallback((seatId) => {
45
- nodes.current.get(seatId)?.focus?.();
51
+ const focusNode = useCallback((node) => {
52
+ if (preventScrollRef.current) {
53
+ node?.focus?.({ preventScroll: true });
54
+ }
55
+ else {
56
+ node?.focus?.();
57
+ }
46
58
  }, []);
59
+ const focusSeat = useCallback((seatId) => focusNode(nodes.current.get(seatId)), [focusNode]);
60
+ const getSeatNode = useCallback((seatId) => nodes.current.get(seatId) ?? null, []);
47
61
  const setFocusedSeat = useCallback((sectionId, seatId) => {
48
62
  setFocusedSeatIds((all) => (all[sectionId] === seatId ? all : { ...all, [sectionId]: seatId }));
49
63
  }, []);
@@ -58,9 +72,9 @@ export function useRovingFocus(renderMap) {
58
72
  const target = pendingFocus.current;
59
73
  if (target !== null) {
60
74
  pendingFocus.current = null;
61
- nodes.current.get(target)?.focus?.();
75
+ focusNode(nodes.current.get(target));
62
76
  }
63
- }, [focusedSeatIds]);
64
- return { focusedSeatIds, setFocusedSeat, moveFocusTo, focusSeat, registerSeat };
77
+ }, [focusedSeatIds, focusNode]);
78
+ return { focusedSeatIds, setFocusedSeat, moveFocusTo, focusSeat, getSeatNode, registerSeat };
65
79
  }
66
80
  //# sourceMappingURL=use-roving-focus.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-roving-focus.js","sourceRoot":"","sources":["../src/use-roving-focus.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-roving-focus.js","sourceRoot":"","sources":["../src/use-roving-focus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { KerusiViewport, ViewportLimits } from '@kerusiweb/core';
2
+ import type { RefObject } from 'react';
3
+ export interface UseViewportOptions {
4
+ /** The map's `zoomable` prop. When false nothing is attached and the viewport is fit. */
5
+ enabled: boolean;
6
+ maxZoom: number;
7
+ onViewportChange?: (viewport: KerusiViewport) => void;
8
+ }
9
+ /** The slice of a key event {@link ViewportControls.handleKeyDown} reads. */
10
+ export interface ViewportKeyEvent {
11
+ key: string;
12
+ ctrlKey: boolean;
13
+ metaKey: boolean;
14
+ altKey: boolean;
15
+ target: EventTarget | null;
16
+ }
17
+ export interface ViewportControls {
18
+ viewport: KerusiViewport;
19
+ /** True for a discrete change (button, key, reveal), false while a finger or wheel drives. */
20
+ animated: boolean;
21
+ limits: ViewportLimits;
22
+ /** Attach to the clipping window. */
23
+ viewRef: RefObject<HTMLDivElement | null>;
24
+ /** Attach to the element the transform is applied to. */
25
+ contentRef: RefObject<HTMLDivElement | null>;
26
+ zoomIn(): void;
27
+ zoomOut(): void;
28
+ resetZoom(): void;
29
+ /** Pans a keyboard-focused seat into view. */
30
+ revealSeat(node: Element | null): void;
31
+ /** Applies `+` `-` `0` and, when the viewport has focus, the arrows. True if it acted. */
32
+ handleKeyDown(event: ViewportKeyEvent): boolean;
33
+ }
34
+ /**
35
+ * The zoom and pan of a `zoomable` map.
36
+ *
37
+ * What a wheel tick, a pinch or a key means is `@kerusiweb/core`'s; this hook
38
+ * supplies the React half: state to render from, a ref for the value the
39
+ * native listeners read between renders, and the listeners themselves. They
40
+ * are native, not `onWheel` / `onClick` props, for two reasons React's
41
+ * synthetic events cannot meet: wheel must be non-passive to `preventDefault`
42
+ * a page zoom, and the click that ends a drag must be stopped in the capture
43
+ * phase, before it reaches the seat.
44
+ */
45
+ export declare function useViewport({ enabled, maxZoom, onViewportChange, }: UseViewportOptions): ViewportControls;
46
+ //# sourceMappingURL=use-viewport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-viewport.d.ts","sourceRoot":"","sources":["../src/use-viewport.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAGV,cAAc,EACd,cAAc,EAGf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IACjC,yFAAyF;IACzF,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;CACvD;AAED,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,8FAA8F;IAC9F,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,qCAAqC;IACrC,OAAO,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC1C,yDAAyD;IACzD,UAAU,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC7C,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,IAAI,CAAC;IAChB,SAAS,IAAI,IAAI,CAAC;IAClB,8CAA8C;IAC9C,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;IACvC,0FAA0F;IAC1F,aAAa,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC;CACjD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,OAAO,EACP,gBAAgB,GACjB,EAAE,kBAAkB,GAAG,gBAAgB,CA8UvC"}
@@ -0,0 +1,269 @@
1
+ import { clampViewport, FIT_VIEWPORT, fitViewport, IDLE_GESTURE, keyboardViewport, reduceGesture, revealRect, stepViewport, viewportsEqual, wheelZoomFactor, zoomLimits, zoomViewportBy, zoomViewportTo, } from '@kerusiweb/core';
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ /**
4
+ * The zoom and pan of a `zoomable` map.
5
+ *
6
+ * What a wheel tick, a pinch or a key means is `@kerusiweb/core`'s; this hook
7
+ * supplies the React half: state to render from, a ref for the value the
8
+ * native listeners read between renders, and the listeners themselves. They
9
+ * are native, not `onWheel` / `onClick` props, for two reasons React's
10
+ * synthetic events cannot meet: wheel must be non-passive to `preventDefault`
11
+ * a page zoom, and the click that ends a drag must be stopped in the capture
12
+ * phase, before it reaches the seat.
13
+ */
14
+ export function useViewport({ enabled, maxZoom, onViewportChange, }) {
15
+ const limits = useMemo(() => zoomLimits(maxZoom), [maxZoom]);
16
+ const [viewport, setViewport] = useState(FIT_VIEWPORT);
17
+ const [animated, setAnimated] = useState(false);
18
+ const viewRef = useRef(null);
19
+ const contentRef = useRef(null);
20
+ /**
21
+ * The truth between renders. Several wheel events can land before React
22
+ * re-renders, and each must start from the one before.
23
+ */
24
+ const viewportRef = useRef(FIT_VIEWPORT);
25
+ const settings = useRef({ enabled, limits, onViewportChange });
26
+ settings.current = { enabled, limits, onViewportChange };
27
+ const commit = useCallback((next, animate) => {
28
+ if (viewportsEqual(next, viewportRef.current)) {
29
+ return;
30
+ }
31
+ viewportRef.current = next;
32
+ setAnimated(animate);
33
+ setViewport(next);
34
+ settings.current.onViewportChange?.(next);
35
+ }, []);
36
+ /** Sizes in CSS pixels, read when needed: `offset*` ignores the zoom transform. */
37
+ const measure = useCallback(() => {
38
+ const view = viewRef.current;
39
+ const content = contentRef.current;
40
+ if (!view || !content) {
41
+ return null;
42
+ }
43
+ return {
44
+ container: { width: view.clientWidth, height: view.clientHeight },
45
+ content: { width: content.offsetWidth, height: content.offsetHeight },
46
+ };
47
+ }, []);
48
+ const stepZoom = useCallback((direction) => {
49
+ const measured = measure();
50
+ if (measured && settings.current.enabled) {
51
+ commit(stepViewport(viewportRef.current, direction, measured.content, measured.container, settings.current.limits), true);
52
+ }
53
+ }, [commit, measure]);
54
+ const zoomIn = useCallback(() => stepZoom(1), [stepZoom]);
55
+ const zoomOut = useCallback(() => stepZoom(-1), [stepZoom]);
56
+ const resetZoom = useCallback(() => {
57
+ const measured = measure();
58
+ if (measured && settings.current.enabled) {
59
+ commit(fitViewport(measured.content, measured.container, settings.current.limits), true);
60
+ }
61
+ }, [commit, measure]);
62
+ const reclamp = useCallback(() => {
63
+ const measured = measure();
64
+ if (measured && settings.current.enabled) {
65
+ commit(clampViewport(viewportRef.current, measured.content, measured.container, settings.current.limits), false);
66
+ }
67
+ }, [commit, measure]);
68
+ // Re-clamp when the box or the ceiling changes: a rotated phone, a maximized
69
+ // map, a lowered `maxZoom`.
70
+ useEffect(() => {
71
+ if (!enabled) {
72
+ return;
73
+ }
74
+ reclamp();
75
+ const view = viewRef.current;
76
+ if (!view || typeof ResizeObserver === 'undefined') {
77
+ return;
78
+ }
79
+ const observer = new ResizeObserver(() => reclamp());
80
+ observer.observe(view);
81
+ if (contentRef.current) {
82
+ observer.observe(contentRef.current);
83
+ }
84
+ return () => observer.disconnect();
85
+ }, [enabled, limits, reclamp]);
86
+ // Switching `zoomable` off puts the map back as it was.
87
+ useEffect(() => {
88
+ if (!enabled && !viewportsEqual(viewportRef.current, FIT_VIEWPORT)) {
89
+ viewportRef.current = FIT_VIEWPORT;
90
+ setViewport(FIT_VIEWPORT);
91
+ }
92
+ }, [enabled]);
93
+ // --- pointer, wheel and trackpad listeners --------------------------------
94
+ useEffect(() => {
95
+ const view = viewRef.current;
96
+ if (!enabled || !view) {
97
+ return;
98
+ }
99
+ let gesture = IDLE_GESTURE;
100
+ let suppressClick = false;
101
+ let gestureBase = null;
102
+ const containerPoint = (event) => {
103
+ const box = view.getBoundingClientRect();
104
+ return { x: event.clientX - box.left, y: event.clientY - box.top };
105
+ };
106
+ const feed = (event) => {
107
+ const measured = measure();
108
+ if (!measured) {
109
+ return;
110
+ }
111
+ const result = reduceGesture(gesture, event, {
112
+ viewport: viewportRef.current,
113
+ content: measured.content,
114
+ container: measured.container,
115
+ limits: settings.current.limits,
116
+ });
117
+ gesture = result.state;
118
+ // Capture only once a tap has become a gesture: capturing on `down` would
119
+ // retarget the tap's click away from the seat.
120
+ if (result.capture) {
121
+ for (const id of result.state.ids) {
122
+ try {
123
+ view.setPointerCapture(id);
124
+ }
125
+ catch {
126
+ // The pointer already ended, or there is no capture here.
127
+ }
128
+ }
129
+ }
130
+ if (result.viewport !== viewportRef.current) {
131
+ commit(result.viewport, false);
132
+ }
133
+ if (result.suppressClick) {
134
+ // The click a drag ends with arrives right after `pointerup`, before this timer.
135
+ suppressClick = true;
136
+ setTimeout(() => {
137
+ suppressClick = false;
138
+ });
139
+ }
140
+ };
141
+ const onPointerDown = (e) => {
142
+ if (e.pointerType === 'mouse' && e.button !== 0) {
143
+ return;
144
+ }
145
+ suppressClick = false;
146
+ feed({ type: 'down', id: e.pointerId, point: containerPoint(e) });
147
+ };
148
+ const onPointerMove = (e) => {
149
+ if (gesture.ids.length > 0) {
150
+ feed({ type: 'move', id: e.pointerId, point: containerPoint(e) });
151
+ }
152
+ };
153
+ const onPointerUp = (e) => feed({ type: 'up', id: e.pointerId });
154
+ const onPointerCancel = (e) => feed({ type: 'cancel', id: e.pointerId });
155
+ const onClick = (e) => {
156
+ if (suppressClick) {
157
+ suppressClick = false;
158
+ e.stopPropagation();
159
+ e.preventDefault();
160
+ }
161
+ };
162
+ const onWheel = (e) => {
163
+ const factor = wheelZoomFactor(e);
164
+ const measured = measure();
165
+ if (factor === null || !measured) {
166
+ return; // A plain wheel is the page's to scroll.
167
+ }
168
+ e.preventDefault();
169
+ commit(zoomViewportBy(viewportRef.current, factor, containerPoint(e), measured.content, measured.container, settings.current.limits), false);
170
+ };
171
+ // Safari reports a trackpad pinch as gesture events, not Ctrl + wheel.
172
+ const onGestureStart = (e) => {
173
+ e.preventDefault();
174
+ gestureBase = viewportRef.current;
175
+ };
176
+ const onGestureChange = (e) => {
177
+ e.preventDefault();
178
+ const measured = measure();
179
+ const { scale, clientX, clientY } = e;
180
+ if (!gestureBase || !measured) {
181
+ return;
182
+ }
183
+ commit(zoomViewportTo(gestureBase, gestureBase.zoom * scale, containerPoint({ clientX, clientY }), measured.content, measured.container, settings.current.limits), false);
184
+ };
185
+ const onGestureEnd = (e) => {
186
+ e.preventDefault();
187
+ gestureBase = null;
188
+ };
189
+ const listeners = [
190
+ ['pointerdown', onPointerDown, false],
191
+ ['pointermove', onPointerMove, false],
192
+ ['pointerup', onPointerUp, false],
193
+ ['pointercancel', onPointerCancel, false],
194
+ ['wheel', onWheel, { passive: false }],
195
+ ['click', onClick, true],
196
+ ['gesturestart', onGestureStart, { passive: false }],
197
+ ['gesturechange', onGestureChange, { passive: false }],
198
+ ['gestureend', onGestureEnd, { passive: false }],
199
+ ];
200
+ for (const [type, listener, options] of listeners) {
201
+ view.addEventListener(type, listener, options);
202
+ }
203
+ return () => {
204
+ for (const [type, listener, options] of listeners) {
205
+ view.removeEventListener(type, listener, options);
206
+ }
207
+ };
208
+ }, [enabled, commit, measure]);
209
+ // --- keyboard and focus ---------------------------------------------------
210
+ const handleKeyDown = useCallback((event) => {
211
+ const measured = measure();
212
+ if (!settings.current.enabled || !measured) {
213
+ return false;
214
+ }
215
+ const next = keyboardViewport(viewportRef.current, {
216
+ key: event.key,
217
+ ctrlKey: event.ctrlKey,
218
+ metaKey: event.metaKey,
219
+ altKey: event.altKey,
220
+ viewportFocused: event.target === viewRef.current,
221
+ }, measured.content, measured.container, settings.current.limits);
222
+ if (!next) {
223
+ return false;
224
+ }
225
+ commit(next, true);
226
+ return true;
227
+ }, [commit, measure]);
228
+ /**
229
+ * A click or tap also focuses a seat, but should not move the map under the
230
+ * finger, so only a `:focus-visible` focus counts.
231
+ */
232
+ const revealSeat = useCallback((node) => {
233
+ const view = viewRef.current;
234
+ const measured = measure();
235
+ if (!settings.current.enabled || !view || !node || !measured || !focusIsVisible(node)) {
236
+ return;
237
+ }
238
+ const seat = node.getBoundingClientRect();
239
+ const frame = view.getBoundingClientRect();
240
+ commit(revealRect(viewportRef.current, {
241
+ x: seat.left - frame.left,
242
+ y: seat.top - frame.top,
243
+ width: seat.width,
244
+ height: seat.height,
245
+ }, measured.content, measured.container, undefined, settings.current.limits), true);
246
+ }, [commit, measure]);
247
+ return {
248
+ viewport,
249
+ animated,
250
+ limits,
251
+ viewRef,
252
+ contentRef,
253
+ zoomIn,
254
+ zoomOut,
255
+ resetZoom,
256
+ revealSeat,
257
+ handleKeyDown,
258
+ };
259
+ }
260
+ /** `:focus-visible` where the engine knows it; otherwise assume the focus is the keyboard's. */
261
+ function focusIsVisible(node) {
262
+ try {
263
+ return node.matches(':focus-visible');
264
+ }
265
+ catch {
266
+ return true;
267
+ }
268
+ }
269
+ //# sourceMappingURL=use-viewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-viewport.js","sourceRoot":"","sources":["../src/use-viewport.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kerusiweb/react",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "A React seat-map component that renders Kerusi Seat Map & Availability Format documents as interactive, accessible inline SVG.",
5
5
  "keywords": [
6
6
  "react",
@@ -43,7 +43,7 @@
43
43
  "styles.css"
44
44
  ],
45
45
  "peerDependencies": {
46
- "@kerusiweb/core": "^2.1.0",
46
+ "@kerusiweb/core": "^2.2.0",
47
47
  "react": "^18.3.0 || ^19.0.0"
48
48
  },
49
49
  "publishConfig": {
package/styles.css CHANGED
@@ -228,3 +228,122 @@
228
228
  opacity: 0.7;
229
229
  font-variant-numeric: tabular-nums;
230
230
  }
231
+
232
+ /* --- zoom, pan and maximize -------------------------------------------------
233
+ Everything below applies only when `zoomable` or `maximizable` is on; a plain
234
+ map renders none of these elements. Colours are bound inline from the
235
+ `--kerusi-*` tokens, so this file owns layout, motion and the focus ring.
236
+ The same rules as the Angular component's stylesheet. */
237
+
238
+ /* Same column the sections sit in without the wrapper, so turning a feature on
239
+ does not move anything. */
240
+ .kerusi-seatmap__stage {
241
+ display: flex;
242
+ flex-direction: column;
243
+ gap: 1.25rem;
244
+ }
245
+
246
+ .kerusi-toolbar {
247
+ display: flex;
248
+ gap: 0.35rem;
249
+ align-self: flex-end;
250
+ /* Stays put under a maximized map's scrolling stage. */
251
+ flex: none;
252
+ }
253
+
254
+ .kerusi-control {
255
+ display: inline-flex;
256
+ align-items: center;
257
+ justify-content: center;
258
+ box-sizing: border-box;
259
+ /* 44px: a comfortable touch target on the phones this exists for. */
260
+ width: 2.75rem;
261
+ height: 2.75rem;
262
+ padding: 0;
263
+ border: 1px solid;
264
+ border-radius: 0.4rem;
265
+ font: inherit;
266
+ cursor: pointer;
267
+ }
268
+
269
+ /* `aria-disabled`, not `disabled`: a disabled button drops out of the tab order,
270
+ and pressing "zoom in" until the ceiling would throw focus away mid-press. */
271
+ .kerusi-control[aria-disabled='true'] {
272
+ opacity: 0.45;
273
+ cursor: default;
274
+ }
275
+
276
+ .kerusi-control svg {
277
+ width: 1.4rem;
278
+ height: 1.4rem;
279
+ fill: none;
280
+ stroke: currentColor;
281
+ stroke-width: 2;
282
+ stroke-linecap: round;
283
+ stroke-linejoin: round;
284
+ pointer-events: none;
285
+ }
286
+
287
+ .kerusi-control:focus-visible,
288
+ .kerusi-viewport:focus-visible {
289
+ outline: 2px solid var(--kerusi-focus-ring, var(--kerusi-focus-ring-input, currentColor));
290
+ outline-offset: 2px;
291
+ }
292
+
293
+ /* A window onto the map. `clip` rather than `hidden`: a hidden box can still be
294
+ scrolled by the browser when a seat inside takes focus, which would fight the
295
+ transform; a clipped one cannot be scrolled at all. */
296
+ .kerusi-viewport {
297
+ position: relative;
298
+ overflow: hidden;
299
+ overflow: clip;
300
+ user-select: none;
301
+ -webkit-user-select: none;
302
+ }
303
+
304
+ /* The same column the sections sit in outside a viewport. */
305
+ .kerusi-viewport__content {
306
+ display: flex;
307
+ flex-direction: column;
308
+ gap: 1.25rem;
309
+ transform-origin: 0 0;
310
+ }
311
+
312
+ /* Only for a button, key or reveal. A finger or wheel moves the map directly, and
313
+ easing behind it would feel like lag. */
314
+ .kerusi-viewport__content--animated {
315
+ transition: transform 160ms ease-out;
316
+ }
317
+
318
+ @media (prefers-reduced-motion: reduce) {
319
+ .kerusi-viewport__content--animated {
320
+ transition: none;
321
+ }
322
+ }
323
+
324
+ /* Maximized: the map fills the screen. This is the whole feature on iPhone,
325
+ which has no element full screen; elsewhere native full screen is requested
326
+ on top. `Canvas` / `CanvasText` and the backdrop come from inline styles. */
327
+ .kerusi-seatmap--maximized {
328
+ position: fixed;
329
+ inset: 0;
330
+ z-index: var(--kerusi-maximized-z-index, 1000);
331
+ box-sizing: border-box;
332
+ padding: 0.75rem;
333
+ gap: 0.5rem;
334
+ overflow: hidden;
335
+ overscroll-behavior: contain;
336
+ }
337
+
338
+ .kerusi-seatmap--maximized .kerusi-seatmap__stage {
339
+ flex: 1 1 auto;
340
+ min-height: 0;
341
+ gap: 0.5rem;
342
+ /* A map that is not zoomable has no viewport to pan, so it scrolls instead. */
343
+ overflow: auto;
344
+ }
345
+
346
+ .kerusi-seatmap--maximized .kerusi-viewport {
347
+ flex: 1 1 auto;
348
+ min-height: 0;
349
+ }