@kerusiweb/core 2.1.0 → 2.3.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.
@@ -0,0 +1,218 @@
1
+ /**
2
+ * The zoom-and-pan model behind a `zoomable` seat map.
3
+ *
4
+ * A viewport is a CSS transform applied to the whole map: `translate(x, y)
5
+ * scale(zoom)` about the map's top-left corner. Everything here is arithmetic on
6
+ * numbers the caller measured, so it holds no DOM and every function is pure.
7
+ * The bindings own the measuring and the event listeners; this owns what a
8
+ * wheel tick, a key press or a pinch *means*.
9
+ *
10
+ * Zoom 1 is "fit": the map exactly as it lays out without zooming. It is also
11
+ * the minimum, so the map can never be shrunk below the container.
12
+ */
13
+ /** The map exactly as laid out: no zoom, no pan. */
14
+ export const FIT_VIEWPORT = Object.freeze({ zoom: 1, x: 0, y: 0 });
15
+ /** Zoom is relative to fit, so the floor is always 1. */
16
+ export const MIN_ZOOM = 1;
17
+ /** The default ceiling: enough to make a seat on a 375px phone comfortably tappable. */
18
+ export const DEFAULT_MAX_ZOOM = 4;
19
+ /** What one press of a zoom button or the `+` / `-` key multiplies the zoom by. */
20
+ export const ZOOM_STEP = 1.5;
21
+ /** How far an arrow key pans, in CSS pixels. */
22
+ export const KEYBOARD_PAN_STEP = 48;
23
+ /** The gap kept between a revealed seat and the container's edge, in CSS pixels. */
24
+ export const REVEAL_MARGIN = 16;
25
+ /** Wheel zoom: the exponent per pixel of `deltaY`, so a pinch's small deltas stay smooth. */
26
+ export const WHEEL_ZOOM_SENSITIVITY = 0.01;
27
+ /** A single wheel event never moves further than this, so a mouse notch is one step. */
28
+ export const WHEEL_MAX_DELTA = 50;
29
+ /** The limits for a given ceiling. A ceiling below fit still leaves fit reachable. */
30
+ export function zoomLimits(maxZoom = DEFAULT_MAX_ZOOM) {
31
+ return { minZoom: MIN_ZOOM, maxZoom: Math.max(MIN_ZOOM, finiteOr(maxZoom, DEFAULT_MAX_ZOOM)) };
32
+ }
33
+ /**
34
+ * Brings a viewport back inside its limits.
35
+ *
36
+ * Zoom is clamped to the limits. Pan is clamped so the scaled map never leaves
37
+ * the container, and on an axis where the scaled map is *smaller* than the
38
+ * container (a maximized map on a large screen) it is centred instead.
39
+ */
40
+ export function clampViewport(viewport, content, container, limits = zoomLimits()) {
41
+ const zoom = clamp(finiteOr(viewport.zoom, 1), limits.minZoom, limits.maxZoom);
42
+ return {
43
+ zoom,
44
+ x: clampAxis(finiteOr(viewport.x, 0), content.width * zoom, container.width),
45
+ y: clampAxis(finiteOr(viewport.y, 0), content.height * zoom, container.height),
46
+ };
47
+ }
48
+ /** Fit, centred where the map is smaller than its container. */
49
+ export function fitViewport(content, container, limits = zoomLimits()) {
50
+ return clampViewport(FIT_VIEWPORT, content, container, limits);
51
+ }
52
+ /**
53
+ * Zooms to an absolute level, keeping the map point under `anchor` where it is.
54
+ * `anchor` is in container coordinates — the pointer, the midpoint of a pinch,
55
+ * or the container's centre for a button.
56
+ */
57
+ export function zoomViewportTo(viewport, zoom, anchor, content, container, limits = zoomLimits()) {
58
+ const current = finiteOr(viewport.zoom, 1) || 1;
59
+ const next = clamp(finiteOr(zoom, current), limits.minZoom, limits.maxZoom);
60
+ const ratio = next / current;
61
+ return clampViewport({
62
+ zoom: next,
63
+ x: anchor.x - (anchor.x - viewport.x) * ratio,
64
+ y: anchor.y - (anchor.y - viewport.y) * ratio,
65
+ }, content, container, limits);
66
+ }
67
+ /** Zooms by a factor about `anchor`. See {@link zoomViewportTo}. */
68
+ export function zoomViewportBy(viewport, factor, anchor, content, container, limits = zoomLimits()) {
69
+ return zoomViewportTo(viewport, viewport.zoom * factor, anchor, content, container, limits);
70
+ }
71
+ /** One zoom-button step about the container's centre: `1` in, `-1` out. */
72
+ export function stepViewport(viewport, direction, content, container, limits = zoomLimits()) {
73
+ const centre = { x: container.width / 2, y: container.height / 2 };
74
+ const factor = direction === 1 ? ZOOM_STEP : 1 / ZOOM_STEP;
75
+ return zoomViewportBy(viewport, factor, centre, content, container, limits);
76
+ }
77
+ /** Pans by a delta in CSS pixels, held inside the map's bounds. */
78
+ export function panViewportBy(viewport, dx, dy, content, container, limits = zoomLimits()) {
79
+ return clampViewport({ zoom: viewport.zoom, x: viewport.x + dx, y: viewport.y + dy }, content, container, limits);
80
+ }
81
+ /**
82
+ * Pans just far enough to bring `rect` inside the container, with a margin.
83
+ *
84
+ * `rect` is where the thing is on screen *now*, in container coordinates — a
85
+ * seat's bounding box minus the container's. Measuring the result of the
86
+ * current transform, rather than computing a position from the layout, is what
87
+ * keeps this correct whatever the section widths and unit scale are. A rect
88
+ * bigger than the container is aligned by its leading edge.
89
+ */
90
+ export function revealRect(viewport, rect, content, container, margin = REVEAL_MARGIN, limits = zoomLimits()) {
91
+ const dx = revealAxis(rect.x, rect.width, container.width, margin);
92
+ const dy = revealAxis(rect.y, rect.height, container.height, margin);
93
+ return panViewportBy(viewport, dx, dy, content, container, limits);
94
+ }
95
+ /**
96
+ * The zoom factor a wheel event asks for, or `null` if it is not a zoom
97
+ * gesture.
98
+ *
99
+ * Only Ctrl/Cmd + wheel zooms. Browsers report a trackpad pinch as a wheel
100
+ * event with `ctrlKey` set, so one rule covers both. A plain wheel returns
101
+ * `null`, which is the cue for a binding to leave it alone so the page still
102
+ * scrolls — and only a non-null result should be `preventDefault`ed.
103
+ */
104
+ export function wheelZoomFactor(event) {
105
+ if (!event.ctrlKey && !event.metaKey) {
106
+ return null;
107
+ }
108
+ // deltaMode: 0 pixels, 1 lines, 2 pages.
109
+ const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? 100 : 1;
110
+ const delta = clamp(finiteOr(event.deltaY, 0) * unit, -WHEEL_MAX_DELTA, WHEEL_MAX_DELTA);
111
+ return Math.exp(-delta * WHEEL_ZOOM_SENSITIVITY);
112
+ }
113
+ /**
114
+ * What a key press does to the viewport, or `null` if it does nothing.
115
+ *
116
+ * `+` / `=` zoom in, `-` zoom out, `0` resets to fit, and — only when the
117
+ * viewport itself has focus — the arrow keys pan. Ctrl, Cmd and Alt
118
+ * combinations are the browser's own zoom shortcuts and are left alone.
119
+ */
120
+ export function keyboardViewport(viewport, input, content, container, limits = zoomLimits()) {
121
+ if (input.ctrlKey || input.metaKey || input.altKey) {
122
+ return null;
123
+ }
124
+ switch (input.key) {
125
+ case '+':
126
+ case '=':
127
+ return stepViewport(viewport, 1, content, container, limits);
128
+ case '-':
129
+ case '_':
130
+ return stepViewport(viewport, -1, content, container, limits);
131
+ case '0':
132
+ return fitViewport(content, container, limits);
133
+ }
134
+ if (!input.viewportFocused) {
135
+ return null;
136
+ }
137
+ // The arrow names the direction the *view* moves, so the map moves the other way.
138
+ switch (input.key) {
139
+ case 'ArrowLeft':
140
+ return panViewportBy(viewport, KEYBOARD_PAN_STEP, 0, content, container, limits);
141
+ case 'ArrowRight':
142
+ return panViewportBy(viewport, -KEYBOARD_PAN_STEP, 0, content, container, limits);
143
+ case 'ArrowUp':
144
+ return panViewportBy(viewport, 0, KEYBOARD_PAN_STEP, content, container, limits);
145
+ case 'ArrowDown':
146
+ return panViewportBy(viewport, 0, -KEYBOARD_PAN_STEP, content, container, limits);
147
+ default:
148
+ return null;
149
+ }
150
+ }
151
+ /**
152
+ * Whether a key event came from somewhere text is typed.
153
+ *
154
+ * A host can put its own controls inside the map, and `+`, `-` and `0` are
155
+ * characters before they are shortcuts. Takes the target structurally so core
156
+ * never has to name a DOM type.
157
+ */
158
+ export function isTextEntryTarget(target) {
159
+ if (!target) {
160
+ return false;
161
+ }
162
+ const tag = target.tagName?.toUpperCase();
163
+ return (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || target.isContentEditable === true);
164
+ }
165
+ /** Whether two viewports are the same view, ignoring sub-pixel noise. */
166
+ export function viewportsEqual(a, b) {
167
+ return (Math.abs(a.zoom - b.zoom) < 1e-4 && Math.abs(a.x - b.x) < 1e-2 && Math.abs(a.y - b.y) < 1e-2);
168
+ }
169
+ /** The CSS `transform` for a viewport. Apply with `transform-origin: 0 0`. */
170
+ export function viewportTransform(viewport) {
171
+ return `translate(${round(viewport.x)}px, ${round(viewport.y)}px) scale(${round(viewport.zoom)})`;
172
+ }
173
+ /**
174
+ * The `touch-action` a zoomable map sets on its viewport.
175
+ *
176
+ * At fit there is nothing to pan, so a one-finger vertical swipe stays the
177
+ * page's: `pan-y` leaves vertical scrolling to the browser while still handing
178
+ * us pinch. Once zoomed in, one finger means pan, and a maximized map covers
179
+ * the page, so both take every gesture with `none`.
180
+ */
181
+ export function viewportTouchAction(viewport, maximized) {
182
+ return maximized || viewport.zoom > 1 + 1e-4 ? 'none' : 'pan-y';
183
+ }
184
+ // --- internals ------------------------------------------------------------
185
+ function clamp(value, min, max) {
186
+ return Math.min(max, Math.max(min, value));
187
+ }
188
+ function finiteOr(value, fallback) {
189
+ return Number.isFinite(value) ? value : fallback;
190
+ }
191
+ /** Holds a translation so a scaled span covers the container, or centres it if smaller. */
192
+ function clampAxis(offset, scaled, container) {
193
+ if (scaled <= container) {
194
+ return (container - scaled) / 2;
195
+ }
196
+ return clamp(offset, container - scaled, 0);
197
+ }
198
+ /** How far to shift a span of `size` at `start` to sit inside `[margin, container - margin]`. */
199
+ function revealAxis(start, size, container, margin) {
200
+ const edge = Math.min(Math.max(0, margin), container / 2);
201
+ const low = edge;
202
+ const high = container - edge;
203
+ if (size >= high - low) {
204
+ return low - start;
205
+ }
206
+ if (start < low) {
207
+ return low - start;
208
+ }
209
+ if (start + size > high) {
210
+ return high - (start + size);
211
+ }
212
+ return 0;
213
+ }
214
+ /** Trims float noise out of a CSS number, and `-0` out of a translation. */
215
+ function round(value) {
216
+ return Math.round(value * 1000) / 1000 + 0;
217
+ }
218
+ //# sourceMappingURL=viewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport.js","sourceRoot":"","sources":["../../src/view/viewport.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kerusiweb/core",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "description": "Framework-agnostic core for the Kerusi Seat Map & Availability Format: document types, a conformance validator, and the render model and geometry a seat-map renderer consumes.",
5
5
  "keywords": [
6
6
  "kerusi",