@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 +88 -0
- package/dist/kerusi-seatmap.d.ts +5 -0
- package/dist/kerusi-seatmap.d.ts.map +1 -1
- package/dist/kerusi-seatmap.js +91 -11
- package/dist/kerusi-seatmap.js.map +1 -1
- package/dist/types.d.ts +36 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/use-maximized.d.ts +23 -0
- package/dist/use-maximized.d.ts.map +1 -0
- package/dist/use-maximized.js +74 -0
- package/dist/use-maximized.js.map +1 -0
- package/dist/use-roving-focus.d.ts +8 -1
- package/dist/use-roving-focus.d.ts.map +1 -1
- package/dist/use-roving-focus.js +20 -6
- package/dist/use-roving-focus.js.map +1 -1
- package/dist/use-viewport.d.ts +46 -0
- package/dist/use-viewport.d.ts.map +1 -0
- package/dist/use-viewport.js +269 -0
- package/dist/use-viewport.js.map +1 -0
- package/package.json +2 -2
- package/styles.css +119 -0
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>`
|
package/dist/kerusi-seatmap.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/kerusi-seatmap.js
CHANGED
|
@@ -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
|
-
|
|
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, () => ({
|
|
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
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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":"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"}
|
|
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. */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,SAAS,EACT,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,eAAe,EACf,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,wDAAwD;AACxD,MAAM,MAAM,cAAc;AACxB,0EAA0E;AACxE,SAAS;AACX,4EAA4E;GAC1E,OAAO;AACT,mEAAmE;GACjE,KAAK,CAAC;AAEV,8DAA8D;AAC9D,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,sCAAsC;IACtC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,mEAAmE;IACnE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,iDAAiD;AACjD,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,oDAAoD;IACpD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
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
|
|
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,
|
|
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"}
|
package/dist/use-roving-focus.js
CHANGED
|
@@ -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
|
|
45
|
-
|
|
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)
|
|
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":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
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":"AAAA,OAAO,EACL,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,YAAY,EACZ,cAAc,EACd,eAAe,EACf,UAAU,EACV,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AASzB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAqC1E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,OAAO,EACP,OAAO,EACP,gBAAgB,GACG;IACnB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAiB,YAAY,CAAC,CAAC;IACvE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAEvD;;;OAGG;IACH,MAAM,WAAW,GAAG,MAAM,CAAiB,YAAY,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC/D,QAAQ,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAEzD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,IAAoB,EAAE,OAAgB,EAAE,EAAE;QACpE,IAAI,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QACD,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,mFAAmF;IACnF,MAAM,OAAO,GAAG,WAAW,CAAC,GAA8D,EAAE;QAC1F,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QACnC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE;YACjE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE;SACtE,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,SAAiB,EAAE,EAAE;QACpB,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;QAC3B,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,CACJ,YAAY,CACV,WAAW,CAAC,OAAO,EACnB,SAAS,EACT,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,OAAO,CAAC,MAAM,CACxB,EACD,IAAI,CACL,CAAC;QACJ,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,OAAO,CAAC,CAClB,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE5D,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;QAC3B,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;QAC3B,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,CACJ,aAAa,CACX,WAAW,CAAC,OAAO,EACnB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,OAAO,CAAC,MAAM,CACxB,EACD,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtB,6EAA6E;IAC7E,4BAA4B;IAC5B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,OAAO,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,IAAI,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE,CAAC;YACnD,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/B,wDAAwD;IACxD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC;YACnE,WAAW,CAAC,OAAO,GAAG,YAAY,CAAC;YACnC,WAAW,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,6EAA6E;IAE7E,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,OAAO,GAAiB,YAAY,CAAC;QACzC,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,WAAW,GAA0B,IAAI,CAAC;QAE9C,MAAM,cAAc,GAAG,CAAC,KAA2C,EAAiB,EAAE;YACpF,MAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACzC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;QACrE,CAAC,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,KAAmB,EAAE,EAAE;YACnC,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE;gBAC3C,QAAQ,EAAE,WAAW,CAAC,OAAO;gBAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;aAChC,CAAC,CAAC;YACH,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;YAEvB,0EAA0E;YAC1E,+CAA+C;YAC/C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;oBAClC,IAAI,CAAC;wBACH,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;oBAC7B,CAAC;oBAAC,MAAM,CAAC;wBACP,0DAA0D;oBAC5D,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC5C,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACjC,CAAC;YACD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACzB,iFAAiF;gBACjF,aAAa,GAAG,IAAI,CAAC;gBACrB,UAAU,CAAC,GAAG,EAAE;oBACd,aAAa,GAAG,KAAK,CAAC;gBACxB,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,CAAC,CAAe,EAAE,EAAE;YACxC,IAAI,CAAC,CAAC,WAAW,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChD,OAAO;YACT,CAAC;YACD,aAAa,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC,CAAC;QACF,MAAM,aAAa,GAAG,CAAC,CAAe,EAAE,EAAE;YACxC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,CAAC,CAAe,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC/E,MAAM,eAAe,GAAG,CAAC,CAAe,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAEvF,MAAM,OAAO,GAAG,CAAC,CAAQ,EAAE,EAAE;YAC3B,IAAI,aAAa,EAAE,CAAC;gBAClB,aAAa,GAAG,KAAK,CAAC;gBACtB,CAAC,CAAC,eAAe,EAAE,CAAC;gBACpB,CAAC,CAAC,cAAc,EAAE,CAAC;YACrB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,CAAC,CAAa,EAAE,EAAE;YAChC,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;YAC3B,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACjC,OAAO,CAAC,yCAAyC;YACnD,CAAC;YACD,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,MAAM,CACJ,cAAc,CACZ,WAAW,CAAC,OAAO,EACnB,MAAM,EACN,cAAc,CAAC,CAAC,CAAC,EACjB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,OAAO,CAAC,MAAM,CACxB,EACD,KAAK,CACN,CAAC;QACJ,CAAC,CAAC;QAEF,uEAAuE;QACvE,MAAM,cAAc,GAAG,CAAC,CAAQ,EAAE,EAAE;YAClC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC;QACpC,CAAC,CAAC;QACF,MAAM,eAAe,GAAG,CAAC,CAAQ,EAAE,EAAE;YACnC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;YAC3B,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAInC,CAAC;YACF,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,MAAM,CACJ,cAAc,CACZ,WAAW,EACX,WAAW,CAAC,IAAI,GAAG,KAAK,EACxB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EACpC,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,OAAO,CAAC,MAAM,CACxB,EACD,KAAK,CACN,CAAC;QACJ,CAAC,CAAC;QACF,MAAM,YAAY,GAAG,CAAC,CAAQ,EAAE,EAAE;YAChC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC,CAAC;QAEF,MAAM,SAAS,GAAiE;YAC9E,CAAC,aAAa,EAAE,aAA8B,EAAE,KAAK,CAAC;YACtD,CAAC,aAAa,EAAE,aAA8B,EAAE,KAAK,CAAC;YACtD,CAAC,WAAW,EAAE,WAA4B,EAAE,KAAK,CAAC;YAClD,CAAC,eAAe,EAAE,eAAgC,EAAE,KAAK,CAAC;YAC1D,CAAC,OAAO,EAAE,OAAwB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACvD,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;YACxB,CAAC,cAAc,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACpD,CAAC,eAAe,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACtD,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;SACjD,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC;YAClD,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,GAAG,EAAE;YACV,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC;gBAClD,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpD,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/B,6EAA6E;IAE7E,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,KAAuB,EAAW,EAAE;QACnC,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,gBAAgB,CAC3B,WAAW,CAAC,OAAO,EACnB;YACE,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,eAAe,EAAE,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO;SAClD,EACD,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,OAAO,CAAC,MAAM,CACxB,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC,EACD,CAAC,MAAM,EAAE,OAAO,CAAC,CAClB,CAAC;IAEF;;;OAGG;IACH,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,IAAoB,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7B,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACtF,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3C,MAAM,CACJ,UAAU,CACR,WAAW,CAAC,OAAO,EACnB;YACE,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;YACzB,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,EACD,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,SAAS,EAClB,SAAS,EACT,QAAQ,CAAC,OAAO,CAAC,MAAM,CACxB,EACD,IAAI,CACL,CAAC;IACJ,CAAC,EACD,CAAC,MAAM,EAAE,OAAO,CAAC,CAClB,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,OAAO;QACP,UAAU;QACV,MAAM;QACN,OAAO;QACP,SAAS;QACT,UAAU;QACV,aAAa;KACd,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,SAAS,cAAc,CAAC,IAAa;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kerusiweb/react",
|
|
3
|
-
"version": "2.
|
|
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.
|
|
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
|
+
}
|