@kerusiweb/core 2.3.0 → 3.1.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.
Files changed (77) hide show
  1. package/LICENSE +22 -22
  2. package/README.md +74 -68
  3. package/dist/kerusi/index.d.ts +4 -3
  4. package/dist/kerusi/index.d.ts.map +1 -1
  5. package/dist/kerusi/index.js +4 -3
  6. package/dist/kerusi/index.js.map +1 -1
  7. package/dist/kerusi/kerusi-geometry.d.ts +47 -0
  8. package/dist/kerusi/kerusi-geometry.d.ts.map +1 -0
  9. package/dist/kerusi/kerusi-geometry.js +111 -0
  10. package/dist/kerusi/kerusi-geometry.js.map +1 -0
  11. package/dist/kerusi/kerusi-map.model.d.ts +121 -68
  12. package/dist/kerusi/kerusi-map.model.d.ts.map +1 -1
  13. package/dist/kerusi/kerusi-map.model.js +6 -2
  14. package/dist/kerusi/kerusi-map.model.js.map +1 -1
  15. package/dist/kerusi/kerusi-rows.d.ts +2 -2
  16. package/dist/kerusi/kerusi-rows.js +2 -2
  17. package/dist/kerusi/kerusi-validator.d.ts +18 -9
  18. package/dist/kerusi/kerusi-validator.d.ts.map +1 -1
  19. package/dist/kerusi/kerusi-validator.js +301 -122
  20. package/dist/kerusi/kerusi-validator.js.map +1 -1
  21. package/dist/render/build-render-model.d.ts +8 -4
  22. package/dist/render/build-render-model.d.ts.map +1 -1
  23. package/dist/render/build-render-model.js +147 -45
  24. package/dist/render/build-render-model.js.map +1 -1
  25. package/dist/render/index.d.ts +1 -1
  26. package/dist/render/index.d.ts.map +1 -1
  27. package/dist/render/index.js +1 -1
  28. package/dist/render/index.js.map +1 -1
  29. package/dist/render/map-layout.d.ts +92 -0
  30. package/dist/render/map-layout.d.ts.map +1 -0
  31. package/dist/render/map-layout.js +93 -0
  32. package/dist/render/map-layout.js.map +1 -0
  33. package/dist/render/navigation-order.d.ts +20 -10
  34. package/dist/render/navigation-order.d.ts.map +1 -1
  35. package/dist/render/navigation-order.js +72 -57
  36. package/dist/render/navigation-order.js.map +1 -1
  37. package/dist/render/render-model.d.ts +48 -26
  38. package/dist/render/render-model.d.ts.map +1 -1
  39. package/dist/render/seat-shapes.d.ts +3 -3
  40. package/dist/render/seat-shapes.js +3 -3
  41. package/dist/view/index.d.ts +6 -2
  42. package/dist/view/index.d.ts.map +1 -1
  43. package/dist/view/index.js +6 -2
  44. package/dist/view/index.js.map +1 -1
  45. package/dist/view/rtl.d.ts +1 -1
  46. package/dist/view/rtl.js +1 -1
  47. package/dist/view/seat-aria.d.ts +6 -0
  48. package/dist/view/seat-aria.d.ts.map +1 -1
  49. package/dist/view/seat-aria.js +8 -0
  50. package/dist/view/seat-aria.js.map +1 -1
  51. package/dist/view/seat-card-placement.d.ts +60 -0
  52. package/dist/view/seat-card-placement.d.ts.map +1 -0
  53. package/dist/view/seat-card-placement.js +94 -0
  54. package/dist/view/seat-card-placement.js.map +1 -0
  55. package/dist/view/seat-card.d.ts +83 -0
  56. package/dist/view/seat-card.d.ts.map +1 -0
  57. package/dist/view/seat-card.js +68 -0
  58. package/dist/view/seat-card.js.map +1 -0
  59. package/dist/view/seat-glyph.d.ts +1 -1
  60. package/dist/view/seat-glyph.d.ts.map +1 -1
  61. package/dist/view/seat-hover.d.ts +90 -0
  62. package/dist/view/seat-hover.d.ts.map +1 -0
  63. package/dist/view/seat-hover.js +205 -0
  64. package/dist/view/seat-hover.js.map +1 -0
  65. package/dist/view/viewport.d.ts +35 -7
  66. package/dist/view/viewport.d.ts.map +1 -1
  67. package/dist/view/viewport.js +56 -7
  68. package/dist/view/viewport.js.map +1 -1
  69. package/package.json +42 -42
  70. package/dist/kerusi/kerusi-layout-mode.d.ts +0 -58
  71. package/dist/kerusi/kerusi-layout-mode.d.ts.map +0 -1
  72. package/dist/kerusi/kerusi-layout-mode.js +0 -117
  73. package/dist/kerusi/kerusi-layout-mode.js.map +0 -1
  74. package/dist/render/section-layout.d.ts +0 -66
  75. package/dist/render/section-layout.d.ts.map +0 -1
  76. package/dist/render/section-layout.js +0 -186
  77. package/dist/render/section-layout.js.map +0 -1
package/dist/view/rtl.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Which locales are written right-to-left.
3
3
  *
4
- * A binding needs this to decide whether to mirror a grid section and swap the
4
+ * A binding needs this to decide whether to mirror the whole canvas and swap the
5
5
  * left/right arrow keys, and it would be written identically in every one —
6
6
  * so it belongs here rather than in any of them.
7
7
  */
@@ -15,6 +15,8 @@ import { DisallowedReason } from './selection.js';
15
15
  export interface SeatAriaStrings {
16
16
  rowSeat: (row: string, seat: string) => string;
17
17
  seatOnly: (seat: string) => string;
18
+ /** Said when an aisle runs beside the seat (§4.3.5: a skipped `col`). */
19
+ besideAisle: string;
18
20
  noPrice: string;
19
21
  available: string;
20
22
  booked: string;
@@ -35,6 +37,10 @@ export declare const DEFAULT_SEAT_ARIA_STRINGS: SeatAriaStrings;
35
37
  * Builds a seat's accessible name, in the order a listener needs it: where the
36
38
  * seat is, what kind it is, what it costs, whether it can be had, what
37
39
  * accessibility it offers, and finally its descriptive tags.
40
+ *
41
+ * "Where" comes from the document's row and adjacency, never from `x`/`y`: an
42
+ * aisle is mentioned when the next seat along the row skips a `col` (§4.3.5),
43
+ * which is also where the arrow keys jump across it.
38
44
  */
39
45
  export declare function seatAriaLabel(seat: RenderSeat, locale: string, strings?: SeatAriaStrings): string;
40
46
  /** A hold expiry as a local clock time; falls back to the raw value. */
@@ -1 +1 @@
1
- {"version":3,"file":"seat-aria.d.ts","sourceRoot":"","sources":["../../src/view/seat-aria.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD;;;;;;;;;;GAUG;AAEH,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;CAC9C;AAED,eAAO,MAAM,yBAAyB,EAAE,eAwBvC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,eAA2C,GACnD,MAAM,CAsBR;AAwCD,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAU9D;AAED,mEAAmE;AACnE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,eAA2C,GACnD,MAAM,CAKR"}
1
+ {"version":3,"file":"seat-aria.d.ts","sourceRoot":"","sources":["../../src/view/seat-aria.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD;;;;;;;;;;GAUG;AAEH,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;CAC9C;AAED,eAAO,MAAM,yBAAyB,EAAE,eAyBvC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,eAA2C,GACnD,MAAM,CAyBR;AAwCD,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAU9D;AAED,mEAAmE;AACnE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,eAA2C,GACnD,MAAM,CAKR"}
@@ -2,6 +2,7 @@ import { formatMoney } from '../kerusi/kerusi-locale.js';
2
2
  export const DEFAULT_SEAT_ARIA_STRINGS = {
3
3
  rowSeat: (row, seat) => `Row ${row}, seat ${seat}`,
4
4
  seatOnly: (seat) => `Seat ${seat}`,
5
+ besideAisle: 'next to an aisle',
5
6
  noPrice: 'no price',
6
7
  available: 'available',
7
8
  booked: 'booked, unavailable',
@@ -27,10 +28,17 @@ export const DEFAULT_SEAT_ARIA_STRINGS = {
27
28
  * Builds a seat's accessible name, in the order a listener needs it: where the
28
29
  * seat is, what kind it is, what it costs, whether it can be had, what
29
30
  * accessibility it offers, and finally its descriptive tags.
31
+ *
32
+ * "Where" comes from the document's row and adjacency, never from `x`/`y`: an
33
+ * aisle is mentioned when the next seat along the row skips a `col` (§4.3.5),
34
+ * which is also where the arrow keys jump across it.
30
35
  */
31
36
  export function seatAriaLabel(seat, locale, strings = DEFAULT_SEAT_ARIA_STRINGS) {
32
37
  const parts = [];
33
38
  parts.push(seat.rowLabel ? strings.rowSeat(seat.rowLabel, seat.label) : strings.seatOnly(seat.label));
39
+ if (seat.besideAisle) {
40
+ parts.push(strings.besideAisle);
41
+ }
34
42
  if (seat.typeLabel && seat.typeLabel !== seat.type.id) {
35
43
  parts.push(seat.typeLabel);
36
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"seat-aria.js","sourceRoot":"","sources":["../../src/view/seat-aria.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seat-aria.js","sourceRoot":"","sources":["../../src/view/seat-aria.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { SeatCardPlacement, SeatCardSide } from './seat-card.js';
2
+ /**
3
+ * Where a seat card goes: the arithmetic only.
4
+ *
5
+ * A binding measures three boxes in CSS pixels, all in the same coordinate
6
+ * space (the map root's, in practice), and hands them in. Because the seat's box
7
+ * is its on-screen one, zoom, pan and rotation are already in it: a rotated
8
+ * seat is its bounding box, a zoomed one is as large as it is drawn.
9
+ */
10
+ export interface CardRect {
11
+ x: number;
12
+ y: number;
13
+ width: number;
14
+ height: number;
15
+ }
16
+ export interface CardSize {
17
+ width: number;
18
+ height: number;
19
+ }
20
+ export interface SeatCardPlacementInput {
21
+ /** The seat's on-screen box. */
22
+ seat: CardRect;
23
+ /** The card's own size, borders included. */
24
+ card: CardSize;
25
+ /** The box the card must stay inside: the map's root. */
26
+ container: CardRect;
27
+ /** The side to try first. Default `top`. */
28
+ placement?: SeatCardPlacement;
29
+ /** Space left between the seat and the card, for the arrow. Default `8`. */
30
+ offset?: number;
31
+ /**
32
+ * How far in from a card's corner the arrow keeps, so it never sits on the
33
+ * rounded part. Default `12`.
34
+ */
35
+ arrowInset?: number;
36
+ }
37
+ export interface SeatCardPosition {
38
+ /** The side of the seat the card ended up on, after any flip. */
39
+ side: SeatCardSide;
40
+ /** The card's top-left corner, in the same space as the inputs. */
41
+ x: number;
42
+ y: number;
43
+ /**
44
+ * Where the arrow sits along the card's edge that faces the seat: measured
45
+ * from the card's left edge for `top` and `bottom`, from its top edge for
46
+ * `left` and `right`. Points at the seat's centre, kept off the corners.
47
+ */
48
+ arrowOffset: number;
49
+ }
50
+ /**
51
+ * Places a card against a seat.
52
+ *
53
+ * The card sits on the preferred side. If it would not fit there but would fit
54
+ * on the opposite side, it flips. `auto` takes the side with the most room.
55
+ * Either way the card is then clamped inside the container along the other
56
+ * axis, and, when no side fits at all, along both. A card larger than the
57
+ * container is pinned to its top-left.
58
+ */
59
+ export declare function placeSeatCard(input: SeatCardPlacementInput): SeatCardPosition;
60
+ //# sourceMappingURL=seat-card-placement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seat-card-placement.d.ts","sourceRoot":"","sources":["../../src/view/seat-card-placement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEtE;;;;;;;GAOG;AAEH,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,gCAAgC;IAChC,IAAI,EAAE,QAAQ,CAAC;IACf,6CAA6C;IAC7C,IAAI,EAAE,QAAQ,CAAC;IACf,yDAAyD;IACzD,SAAS,EAAE,QAAQ,CAAC;IACpB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,IAAI,EAAE,YAAY,CAAC;IACnB,mEAAmE;IACnE,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAYD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,sBAAsB,GAAG,gBAAgB,CAuC7E"}
@@ -0,0 +1,94 @@
1
+ const OPPOSITE = {
2
+ top: 'bottom',
3
+ bottom: 'top',
4
+ left: 'right',
5
+ right: 'left',
6
+ };
7
+ /** What `auto` tries, in order, when sides tie. */
8
+ const AUTO_ORDER = ['top', 'bottom', 'right', 'left'];
9
+ /**
10
+ * Places a card against a seat.
11
+ *
12
+ * The card sits on the preferred side. If it would not fit there but would fit
13
+ * on the opposite side, it flips. `auto` takes the side with the most room.
14
+ * Either way the card is then clamped inside the container along the other
15
+ * axis, and, when no side fits at all, along both. A card larger than the
16
+ * container is pinned to its top-left.
17
+ */
18
+ export function placeSeatCard(input) {
19
+ const { seat, card, container } = input;
20
+ const offset = input.offset ?? 8;
21
+ const inset = input.arrowInset ?? 12;
22
+ const preferred = input.placement ?? 'top';
23
+ const side = chooseSide(preferred, input, offset);
24
+ const cx = seat.x + seat.width / 2;
25
+ const cy = seat.y + seat.height / 2;
26
+ let x;
27
+ let y;
28
+ switch (side) {
29
+ case 'top':
30
+ x = cx - card.width / 2;
31
+ y = seat.y - offset - card.height;
32
+ break;
33
+ case 'bottom':
34
+ x = cx - card.width / 2;
35
+ y = seat.y + seat.height + offset;
36
+ break;
37
+ case 'left':
38
+ x = seat.x - offset - card.width;
39
+ y = cy - card.height / 2;
40
+ break;
41
+ case 'right':
42
+ x = seat.x + seat.width + offset;
43
+ y = cy - card.height / 2;
44
+ break;
45
+ }
46
+ x = clamp(x, container.x, container.x + container.width - card.width);
47
+ y = clamp(y, container.y, container.y + container.height - card.height);
48
+ const vertical = side === 'top' || side === 'bottom';
49
+ const along = vertical ? cx - x : cy - y;
50
+ const extent = vertical ? card.width : card.height;
51
+ return { side, x, y, arrowOffset: clamp(along, Math.min(inset, extent / 2), extent - inset) };
52
+ }
53
+ /** Room on one side of the seat, inside the container. */
54
+ function room(side, input) {
55
+ const { seat, container } = input;
56
+ switch (side) {
57
+ case 'top':
58
+ return seat.y - container.y;
59
+ case 'bottom':
60
+ return container.y + container.height - (seat.y + seat.height);
61
+ case 'left':
62
+ return seat.x - container.x;
63
+ case 'right':
64
+ return container.x + container.width - (seat.x + seat.width);
65
+ }
66
+ }
67
+ function fits(side, input, offset) {
68
+ const needed = side === 'top' || side === 'bottom' ? input.card.height + offset : input.card.width + offset;
69
+ return room(side, input) >= needed;
70
+ }
71
+ function chooseSide(preferred, input, offset) {
72
+ if (preferred === 'auto') {
73
+ const fitting = AUTO_ORDER.find((side) => fits(side, input, offset));
74
+ if (fitting) {
75
+ return fitting;
76
+ }
77
+ // Nothing fits whole: take the side with the most room.
78
+ return AUTO_ORDER.reduce((best, side) => (room(side, input) > room(best, input) ? side : best));
79
+ }
80
+ if (fits(preferred, input, offset)) {
81
+ return preferred;
82
+ }
83
+ const opposite = OPPOSITE[preferred];
84
+ if (fits(opposite, input, offset)) {
85
+ return opposite;
86
+ }
87
+ // Neither side fits: stay with whichever has more room, preferring the asked-for one.
88
+ return room(opposite, input) > room(preferred, input) ? opposite : preferred;
89
+ }
90
+ /** `min` wins when the range is inverted, which pins an oversized card to the top-left. */
91
+ function clamp(value, min, max) {
92
+ return Math.max(min, Math.min(value, max));
93
+ }
94
+ //# sourceMappingURL=seat-card-placement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seat-card-placement.js","sourceRoot":"","sources":["../../src/view/seat-card-placement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import type { RenderSeat } from '../render/render-model.js';
2
+ /**
3
+ * The vocabulary of seat hover and click, shared by both bindings.
4
+ *
5
+ * Hover and click are independent and optional (D10): a binding reports them as
6
+ * events, and can also show a card anchored to the seat on either one. What a
7
+ * card says is the consumer's; this module only names the pieces.
8
+ */
9
+ /** Which side of the seat a card sits on. */
10
+ export type SeatCardSide = 'top' | 'bottom' | 'left' | 'right';
11
+ /** The side a card prefers. `auto` takes whichever side has the most room. */
12
+ export type SeatCardPlacement = SeatCardSide | 'auto';
13
+ /**
14
+ * What opened a card. `focus` only occurs with `hoverCardOnFocus` (D12).
15
+ */
16
+ export type SeatCardTrigger = 'hover' | 'focus' | 'click';
17
+ /**
18
+ * `default` draws the library's plain look; `none` drops the background, border,
19
+ * padding, shadow and arrow, leaving only positioning (D11).
20
+ */
21
+ export type SeatCardAppearance = 'default' | 'none';
22
+ /** What activated a seat. */
23
+ export type SeatClickSource = 'pointer' | 'keyboard';
24
+ /**
25
+ * What `onSeatClick` / `seatClick` reports (D13). A read-only notification: it
26
+ * cannot cancel or change what the click does.
27
+ */
28
+ export interface SeatClick {
29
+ seat: RenderSeat;
30
+ /** Whether the seat was selected before this click. */
31
+ selected: boolean;
32
+ /** What activated it: a pointer click or tap, or Enter/Space on a focused seat. */
33
+ source: SeatClickSource;
34
+ }
35
+ /** What a card's content is handed. */
36
+ export interface KerusiSeatCardContext {
37
+ /** Everything the document knows about the seat, already resolved. */
38
+ seat: RenderSeat;
39
+ /** Whether the seat is in the current selection. */
40
+ selected: boolean;
41
+ /** What opened the card. */
42
+ trigger: SeatCardTrigger;
43
+ /** Closes the card. Most useful for a click card's own buttons. */
44
+ close: () => void;
45
+ }
46
+ /** Milliseconds before a hover card opens and, after the pointer leaves, closes. */
47
+ export interface HoverCardDelay {
48
+ open: number;
49
+ close: number;
50
+ }
51
+ export declare const DEFAULT_HOVER_CARD_DELAY: Readonly<HoverCardDelay>;
52
+ /** Fills in whichever half of the delay the caller left out; negatives become 0. */
53
+ export declare function resolveHoverCardDelay(delay?: Partial<HoverCardDelay>): HoverCardDelay;
54
+ /** The pointer types that can hover. Touch has no hover (D10). */
55
+ export declare function canHover(pointerType: string | undefined): boolean;
56
+ /**
57
+ * The id a card element carries, from a per-map-instance prefix. A seat points
58
+ * at its hover card with `aria-describedby`; a click card is labelled by the seat
59
+ * through its own `aria-label`, so the id there is only a stable hook.
60
+ */
61
+ export declare function seatCardId(prefix: string, kind: 'hover' | 'click'): string;
62
+ /** The `data-*` attributes a card mirrors from its seat, so CSS can pick cards out by seat. */
63
+ export interface SeatCardDataAttributes {
64
+ 'data-seat-id': string;
65
+ 'data-seat-status': string;
66
+ 'data-seat-type': string;
67
+ 'data-section-id': string;
68
+ }
69
+ export declare function seatCardDataAttributes(seat: RenderSeat): SeatCardDataAttributes;
70
+ /** The class list for a card element: the hooks, then the consumer's own. */
71
+ export declare function seatCardClassName(trigger: 'hover' | 'click', appearance: SeatCardAppearance, extra?: string): string;
72
+ /**
73
+ * A CSS length as pixels, for the two tokens placement needs as numbers
74
+ * (`--kerusi-seat-card-offset`, `--kerusi-seat-card-arrow-size`).
75
+ *
76
+ * Reads `px`, `rem`, `em` and unitless numbers; anything else (a `calc()`, a
77
+ * percentage, an unset property) yields `fallback`.
78
+ */
79
+ export declare function cssLengthToPx(value: string | null | undefined, fallback: number, fontSizes?: {
80
+ root?: number;
81
+ element?: number;
82
+ }): number;
83
+ //# sourceMappingURL=seat-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seat-card.d.ts","sourceRoot":"","sources":["../../src/view/seat-card.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAG5D;;;;;;GAMG;AAEH,6CAA6C;AAC7C,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAE/D,8EAA8E;AAC9E,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,MAAM,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpD,6BAA6B;AAC7B,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,UAAU,CAAC;AAErD;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,uDAAuD;IACvD,QAAQ,EAAE,OAAO,CAAC;IAClB,mFAAmF;IACnF,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,uCAAuC;AACvC,MAAM,WAAW,qBAAqB;IACpC,sEAAsE;IACtE,IAAI,EAAE,UAAU,CAAC;IACjB,oDAAoD;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB,4BAA4B;IAC5B,OAAO,EAAE,eAAe,CAAC;IACzB,mEAAmE;IACnE,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,cAAc,CAG5D,CAAC;AAEH,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAOrF;AAED,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAE1E;AAED,+FAA+F;AAC/F,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,sBAAsB,CAQ/E;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,GAAG,OAAO,EAC1B,UAAU,EAAE,kBAAkB,EAC9B,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CASR;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAClD,MAAM,CAcR"}
@@ -0,0 +1,68 @@
1
+ import { seatDataAttributes } from './seat-glyph.js';
2
+ export const DEFAULT_HOVER_CARD_DELAY = Object.freeze({
3
+ open: 150,
4
+ close: 100,
5
+ });
6
+ /** Fills in whichever half of the delay the caller left out; negatives become 0. */
7
+ export function resolveHoverCardDelay(delay) {
8
+ const pick = (value, fallback) => typeof value === 'number' && Number.isFinite(value) ? Math.max(0, value) : fallback;
9
+ return {
10
+ open: pick(delay?.open, DEFAULT_HOVER_CARD_DELAY.open),
11
+ close: pick(delay?.close, DEFAULT_HOVER_CARD_DELAY.close),
12
+ };
13
+ }
14
+ /** The pointer types that can hover. Touch has no hover (D10). */
15
+ export function canHover(pointerType) {
16
+ return pointerType === 'mouse' || pointerType === 'pen';
17
+ }
18
+ /**
19
+ * The id a card element carries, from a per-map-instance prefix. A seat points
20
+ * at its hover card with `aria-describedby`; a click card is labelled by the seat
21
+ * through its own `aria-label`, so the id there is only a stable hook.
22
+ */
23
+ export function seatCardId(prefix, kind) {
24
+ return `${prefix}-seat-card-${kind}`;
25
+ }
26
+ export function seatCardDataAttributes(seat) {
27
+ const data = seatDataAttributes(seat);
28
+ return {
29
+ 'data-seat-id': seat.id,
30
+ 'data-seat-status': data.status,
31
+ 'data-seat-type': data.type,
32
+ 'data-section-id': data.section,
33
+ };
34
+ }
35
+ /** The class list for a card element: the hooks, then the consumer's own. */
36
+ export function seatCardClassName(trigger, appearance, extra) {
37
+ return [
38
+ 'kerusi-seat-card',
39
+ `kerusi-seat-card--${trigger}`,
40
+ appearance === 'none' ? 'kerusi-seat-card--bare' : '',
41
+ extra ?? '',
42
+ ]
43
+ .filter(Boolean)
44
+ .join(' ');
45
+ }
46
+ /**
47
+ * A CSS length as pixels, for the two tokens placement needs as numbers
48
+ * (`--kerusi-seat-card-offset`, `--kerusi-seat-card-arrow-size`).
49
+ *
50
+ * Reads `px`, `rem`, `em` and unitless numbers; anything else (a `calc()`, a
51
+ * percentage, an unset property) yields `fallback`.
52
+ */
53
+ export function cssLengthToPx(value, fallback, fontSizes = {}) {
54
+ const match = /^\s*(-?\d*\.?\d+)\s*(px|rem|em)?\s*$/i.exec(value ?? '');
55
+ if (!match) {
56
+ return fallback;
57
+ }
58
+ const amount = Number(match[1]);
59
+ switch ((match[2] ?? 'px').toLowerCase()) {
60
+ case 'rem':
61
+ return amount * (fontSizes.root ?? 16);
62
+ case 'em':
63
+ return amount * (fontSizes.element ?? fontSizes.root ?? 16);
64
+ default:
65
+ return amount;
66
+ }
67
+ }
68
+ //# sourceMappingURL=seat-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seat-card.js","sourceRoot":"","sources":["../../src/view/seat-card.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AA4DrD,MAAM,CAAC,MAAM,wBAAwB,GAA6B,MAAM,CAAC,MAAM,CAAC;IAC9E,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,GAAG;CACX,CAAC,CAAC;AAEH,oFAAoF;AACpF,MAAM,UAAU,qBAAqB,CAAC,KAA+B;IACnE,MAAM,IAAI,GAAG,CAAC,KAAyB,EAAE,QAAgB,EAAE,EAAE,CAC3D,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACtF,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,wBAAwB,CAAC,IAAI,CAAC;QACtD,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,wBAAwB,CAAC,KAAK,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,QAAQ,CAAC,WAA+B;IACtD,OAAO,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,KAAK,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,IAAuB;IAChE,OAAO,GAAG,MAAM,cAAc,IAAI,EAAE,CAAC;AACvC,CAAC;AAUD,MAAM,UAAU,sBAAsB,CAAC,IAAgB;IACrD,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,EAAE;QACvB,kBAAkB,EAAE,IAAI,CAAC,MAAM;QAC/B,gBAAgB,EAAE,IAAI,CAAC,IAAI;QAC3B,iBAAiB,EAAE,IAAI,CAAC,OAAO;KAChC,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAC/B,OAA0B,EAC1B,UAA8B,EAC9B,KAAc;IAEd,OAAO;QACL,kBAAkB;QAClB,qBAAqB,OAAO,EAAE;QAC9B,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;QACrD,KAAK,IAAI,EAAE;KACZ;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAgC,EAChC,QAAgB,EAChB,YAAiD,EAAE;IAEnD,MAAM,KAAK,GAAG,uCAAuC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACzC,KAAK,KAAK;YACR,OAAO,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACzC,KAAK,IAAI;YACP,OAAO,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC9D;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { RenderSeat } from '../render/render-model.js';
2
2
  import { SeatBox } from '../render/seat-shapes.js';
3
- import { PlacedSeat } from '../render/section-layout.js';
3
+ import { PlacedSeat } from '../render/map-layout.js';
4
4
  import { KerusiSeatStyle } from './kerusi-seat-style.js';
5
5
  import { KerusiSeatmapColors, SeatOccupantVariant } from './kerusi-seatmap-colors.js';
6
6
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"seat-glyph.d.ts","sourceRoot":"","sources":["../../src/view/seat-glyph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EACL,OAAO,EAMR,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAa,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EACL,mBAAmB,EAGnB,mBAAmB,EAMpB,MAAM,4BAA4B,CAAC;AAEpC;;;;;;;;;;GAUG;AAEH,qBAAqB;AACrB,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,CAAC,EAAE,MAAM,CAAC;IACV,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,gEAAgE;IAChE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACpC,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,IAAI,EAAE,kBAAkB,CAAC;IACzB,iCAAiC;IACjC,GAAG,EAAE,OAAO,CAAC;IACb;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,IAAI,EAAE,cAAc,CAAC;IACrB,qEAAqE;IACrE,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,yEAAyE;IACzE,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,cAAc,GAAG;QAC1B,OAAO,EAAE,mBAAmB,CAAC;QAC7B,gDAAgD;QAChD,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,6DAA6D;IAC7D,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,8EAA8E;QAC9E,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,yEAAyE;QACzE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC;IACF,oFAAoF;IACpF,UAAU,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE;AAED,wFAAwF;AACxF,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,MAAM,EAAE,UAAU,CAAC;IACnB,gFAAgF;IAChF,IAAI,EAAE,UAAU,CAAC;IACjB,oDAAoD;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,KAAK,EAAE,SAAS,CAAC;CAClB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EACrC,UAAU,EAAE,OAAO,EACnB,KAAK,CAAC,EAAE,eAAe,GACtB,SAAS,CAmEX;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,eAAe,GAAG,SAAS,EACtC,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAGpB;AAaD,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,kBAAkB,CAQvE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,OAAO,EACjB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GACjC,MAAM,CAYR"}
1
+ {"version":3,"file":"seat-glyph.d.ts","sourceRoot":"","sources":["../../src/view/seat-glyph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { type HoverCardDelay } from './seat-card.js';
2
+ /**
3
+ * Seat hover as a reducer, the way `reduceGesture()` does pan and pinch.
4
+ *
5
+ * A binding feeds in what the pointer, the keyboard and its timers did, and
6
+ * applies what comes back: the seat to report to `onSeatHover` / `seatHover`,
7
+ * which hover card should be showing, and the one timer it should be running.
8
+ * The rules live here, once, so the two bindings cannot drift apart (D10):
9
+ *
10
+ * - Only a mouse or a pen hovers. Touch has no hover, and a tap stays a tap.
11
+ * - The seat is reported once on entry and once, as `null`, on leave. Moving
12
+ * within a seat reports nothing.
13
+ * - While the map is panned or zoomed the hover is cleared once. It resumes on
14
+ * the first pointer move after the gesture ends, not before.
15
+ * - A hover card opens after `delay.open`, stays while the pointer is on the
16
+ * seat or on the card (WCAG 1.4.13 "hoverable"), and closes `delay.close`
17
+ * after the pointer leaves both. `Escape` dismisses it, and it stays dismissed
18
+ * until the pointer or focus has left that seat (WCAG 1.4.13 "dismissible").
19
+ * - Keyboard focus shows the card only when the binding feeds `focus` events,
20
+ * which it does only with `hoverCardOnFocus` (D12).
21
+ */
22
+ export interface SeatHoverState {
23
+ /** The seat the pointer is over, as last reported. */
24
+ readonly hoveredId: string | null;
25
+ /** True from the start of a pan or zoom until the next pointer move. */
26
+ readonly suppressed: boolean;
27
+ /** The seat whose hover card is showing. */
28
+ readonly cardId: string | null;
29
+ /** Why the card is showing. */
30
+ readonly cardTrigger: 'hover' | 'focus' | null;
31
+ /** The seat a running open timer will show a card for. */
32
+ readonly pendingId: string | null;
33
+ /** True while a close timer is running. */
34
+ readonly closing: boolean;
35
+ /** True while the pointer is on the card itself. */
36
+ readonly overCard: boolean;
37
+ /** The seat the focus is on, when focus is being followed. */
38
+ readonly focusedId: string | null;
39
+ /** A seat whose card `Escape` dismissed, until the pointer and focus leave it. */
40
+ readonly dismissedId: string | null;
41
+ }
42
+ export declare const IDLE_SEAT_HOVER: SeatHoverState;
43
+ export type SeatHoverEvent = {
44
+ type: 'enter' | 'move';
45
+ seatId: string;
46
+ pointerType: string;
47
+ } | {
48
+ type: 'leave';
49
+ seatId: string;
50
+ pointerType: string;
51
+ }
52
+ /** A pan, pinch or wheel zoom began. */
53
+ | {
54
+ type: 'gesture';
55
+ } | {
56
+ type: 'card-enter' | 'card-leave';
57
+ } | {
58
+ type: 'focus' | 'blur';
59
+ seatId: string;
60
+ } | {
61
+ type: 'escape';
62
+ }
63
+ /** The open or close timer the reducer asked for has run out. */
64
+ | {
65
+ type: 'timer';
66
+ kind: 'open' | 'close';
67
+ }
68
+ /** The seat the card is for no longer exists, or the feature was turned off. */
69
+ | {
70
+ type: 'reset';
71
+ };
72
+ /** The one timer the binding should be running, if any. */
73
+ export type SeatHoverTimer = {
74
+ action: 'start';
75
+ kind: 'open' | 'close';
76
+ ms: number;
77
+ } | {
78
+ action: 'clear';
79
+ };
80
+ export interface SeatHoverResult {
81
+ state: SeatHoverState;
82
+ /** Present when `onSeatHover` should be called: with this seat, or `null`. */
83
+ report?: {
84
+ seatId: string | null;
85
+ };
86
+ /** Absent when the timer is to be left as it is. */
87
+ timer?: SeatHoverTimer;
88
+ }
89
+ export declare function reduceSeatHover(state: SeatHoverState, event: SeatHoverEvent, delay: HoverCardDelay): SeatHoverResult;
90
+ //# sourceMappingURL=seat-hover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seat-hover.d.ts","sourceRoot":"","sources":["../../src/view/seat-hover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,+BAA+B;IAC/B,QAAQ,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;IAC/C,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,kFAAkF;IAClF,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,eAAO,MAAM,eAAe,EAAE,cAU5B,CAAC;AAEH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE;AACxD,wCAAwC;GACtC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,YAAY,GAAG,YAAY,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE;AACpB,iEAAiE;GAC/D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE;AAC3C,gFAAgF;GAC9E;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtB,2DAA2D;AAC3D,MAAM,MAAM,cAAc,GACxB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,cAAc,CAAC;IACtB,8EAA8E;IAC9E,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACnC,oDAAoD;IACpD,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,cAAc,GACpB,eAAe,CAgCjB"}