@alphakits/ui 2.4.3 → 2.4.5
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/dist/calendar/component.js +32 -31
- package/dist/calendar/components/months-table/component.js +22 -23
- package/dist/calendar/components/months-table/index.css +1 -1
- package/dist/calendar/components/months-table/index.module.css.js +4 -6
- package/dist/calendar/components/select-button/index.css +1 -1
- package/dist/calendar/index.css +1 -1
- package/dist/calendar-input/component.js +124 -121
- package/dist/checkbox-lists/mock.data.d.ts +81 -0
- package/dist/checkbox-lists/mock.data.js +207 -0
- package/dist/collapsable-row/fixtures.data.d.ts +99 -0
- package/dist/collapsable-row/fixtures.data.js +196 -0
- package/dist/confirm-popup/component.d.ts +21 -0
- package/dist/confirm-popup/component.js +138 -0
- package/dist/confirm-popup/index.css +1 -0
- package/dist/confirm-popup/index.d.ts +1 -0
- package/dist/confirm-popup/index.js +6 -0
- package/dist/confirm-popup/index.module.css.js +23 -0
- package/dist/form/component.js +16 -16
- package/dist/form/templates/filters-form/index.js +17 -17
- package/dist/form/templates/rest-form/form.d.ts +1 -1
- package/dist/form/templates/rest-form/form.js +72 -67
- package/dist/form/templates/rest-form/index.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +298 -293
- package/dist/modal/components/modals/modal.js +50 -40
- package/dist/modal/hooks/use-modal.js +11 -11
- package/dist/modal/types.d.ts +2 -1
- package/dist/popover/component.js +72 -55
- package/dist/radio-groups/mock.data.d.ts +9 -0
- package/dist/radio-groups/mock.data.js +82 -0
- package/dist/select/components/base-select/component.js +73 -73
- package/dist/select/utils.js +23 -23
- package/dist/theme-provider/default-themes.d.ts +4 -0
- package/dist/theme-provider/default-themes.js +4 -0
- package/dist/toast-plate/component.js +47 -46
- package/dist/toast-plate/index.css +1 -1
- package/dist/toast-plate/index.module.css.js +26 -24
- package/dist/utils/index.js +26 -25
- package/dist/utils/show-toast/index.d.ts +1 -0
- package/dist/utils/show-toast/index.js +17 -9
- package/package.json +9 -27
|
@@ -1,67 +1,77 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import { useState as
|
|
4
|
-
import { ButtonArrow as
|
|
5
|
-
import
|
|
1
|
+
import { jsxs as w, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import b from "classnames";
|
|
3
|
+
import { useState as v, useLayoutEffect as x, useCallback as k, useEffect as E } from "react";
|
|
4
|
+
import { ButtonArrow as d } from "../../../button-arrow/component.js";
|
|
5
|
+
import { showConfirm as g } from "../../../confirm-popup/component.js";
|
|
6
|
+
import s from "./index.module.css.js";
|
|
6
7
|
const C = {
|
|
7
8
|
s: 488,
|
|
8
9
|
m: 888,
|
|
9
10
|
full: "96%"
|
|
10
|
-
},
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
return () => cancelAnimationFrame(
|
|
11
|
+
}, h = 102, F = (e) => e === "full" ? `calc(-96vw - ${h}px)` : -C[e] - h, R = ({ modal: e, t: r, index: a, dirtyModals: m, closeModal: l, currentModalId: c }) => {
|
|
12
|
+
const f = F(e.props.size), [y, p] = v(f);
|
|
13
|
+
x(() => {
|
|
14
|
+
const o = requestAnimationFrame(() => p(0));
|
|
15
|
+
return () => cancelAnimationFrame(o);
|
|
15
16
|
}, [e.id]);
|
|
16
17
|
const u = k(
|
|
17
|
-
(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
(o) => m[o] ? g({
|
|
19
|
+
title: r("common:exitConfirm"),
|
|
20
|
+
confirmText: r("common:Да"),
|
|
21
|
+
cancelText: r("common:Нет"),
|
|
22
|
+
confirmView: "negative"
|
|
23
|
+
}) : Promise.resolve(!0),
|
|
21
24
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
22
|
-
[
|
|
23
|
-
),
|
|
24
|
-
(
|
|
25
|
-
const { id:
|
|
26
|
-
u(
|
|
27
|
-
e.props.closeCallback && e.props.closeCallback(),
|
|
25
|
+
[m, r]
|
|
26
|
+
), t = k(
|
|
27
|
+
async (o) => {
|
|
28
|
+
const { id: n } = e;
|
|
29
|
+
await u(o || n) && (p(f), setTimeout(() => {
|
|
30
|
+
e.props.closeCallback && e.props.closeCallback(), l(o || n);
|
|
28
31
|
}, 250));
|
|
29
32
|
},
|
|
30
|
-
[
|
|
33
|
+
[l, u, e, f]
|
|
31
34
|
);
|
|
32
|
-
return
|
|
33
|
-
const
|
|
34
|
-
(
|
|
35
|
+
return E(() => {
|
|
36
|
+
const o = (n) => {
|
|
37
|
+
(n.key === "27" || n.key === "Escape") && t(c);
|
|
35
38
|
};
|
|
36
|
-
return e.id ===
|
|
37
|
-
window?.removeEventListener("keydown",
|
|
39
|
+
return e.id === c && window?.addEventListener("keydown", o), () => {
|
|
40
|
+
window?.removeEventListener("keydown", o);
|
|
38
41
|
};
|
|
39
|
-
}, [
|
|
42
|
+
}, [t, c, e.id]), /* @__PURE__ */ w(
|
|
40
43
|
"div",
|
|
41
44
|
{
|
|
42
|
-
className:
|
|
45
|
+
className: s.container,
|
|
43
46
|
style: {
|
|
44
|
-
zIndex: 9999998 +
|
|
47
|
+
zIndex: 9999998 + a
|
|
45
48
|
},
|
|
46
49
|
children: [
|
|
47
50
|
/* @__PURE__ */ i(
|
|
48
51
|
"div",
|
|
49
52
|
{
|
|
50
|
-
className:
|
|
53
|
+
className: b(s.right, s.content),
|
|
51
54
|
style: {
|
|
52
|
-
zIndex: 9999999 +
|
|
55
|
+
zIndex: 9999999 + a,
|
|
53
56
|
width: C[e.props.size],
|
|
54
|
-
right:
|
|
57
|
+
right: y
|
|
55
58
|
},
|
|
56
|
-
children: /* @__PURE__ */
|
|
57
|
-
/* @__PURE__ */ i(
|
|
59
|
+
children: /* @__PURE__ */ w("div", { className: s.inner, children: [
|
|
60
|
+
/* @__PURE__ */ i(
|
|
61
|
+
e.modal,
|
|
62
|
+
{
|
|
63
|
+
...e.props,
|
|
64
|
+
modalId: e.id,
|
|
65
|
+
close: () => t()
|
|
66
|
+
}
|
|
67
|
+
),
|
|
58
68
|
e.props.showCloser !== !1 && /* @__PURE__ */ i(
|
|
59
|
-
|
|
69
|
+
d,
|
|
60
70
|
{
|
|
61
|
-
className:
|
|
71
|
+
className: s.button,
|
|
62
72
|
size: "s",
|
|
63
73
|
type: "close",
|
|
64
|
-
onClick: () =>
|
|
74
|
+
onClick: () => t()
|
|
65
75
|
}
|
|
66
76
|
)
|
|
67
77
|
] })
|
|
@@ -70,10 +80,10 @@ const C = {
|
|
|
70
80
|
/* @__PURE__ */ i(
|
|
71
81
|
"button",
|
|
72
82
|
{
|
|
73
|
-
className:
|
|
83
|
+
className: s.bg,
|
|
74
84
|
"aria-label": "close_backdrop",
|
|
75
85
|
type: "button",
|
|
76
|
-
onClick: () =>
|
|
86
|
+
onClick: () => t()
|
|
77
87
|
}
|
|
78
88
|
)
|
|
79
89
|
]
|
|
@@ -81,5 +91,5 @@ const C = {
|
|
|
81
91
|
);
|
|
82
92
|
};
|
|
83
93
|
export {
|
|
84
|
-
|
|
94
|
+
R as Modal
|
|
85
95
|
};
|
|
@@ -2,42 +2,42 @@ import d, { useRef as S, useCallback as s, useEffect as b } from "react";
|
|
|
2
2
|
import { v4 as h } from "uuid";
|
|
3
3
|
import { deletePropertyById as v } from "../utils/delete-property-by-id.js";
|
|
4
4
|
const x = (n) => {
|
|
5
|
-
const [r, l] = d.useState([]), [
|
|
6
|
-
|
|
5
|
+
const [r, l] = d.useState([]), [f, a] = d.useState(""), [p, c] = d.useState({}), u = S(n);
|
|
6
|
+
u.current = n;
|
|
7
7
|
const i = s((t) => {
|
|
8
|
-
|
|
9
|
-
}, []),
|
|
10
|
-
l((e) => [...e, t]);
|
|
8
|
+
c((e) => v(e, t)), l((e) => e.filter((o) => o.id !== t));
|
|
9
|
+
}, []), M = s((t) => {
|
|
10
|
+
l((e) => [...e, t]), a(t.id);
|
|
11
11
|
}, []), m = s((t, e) => {
|
|
12
|
-
t &&
|
|
12
|
+
t && c((o) => o[t] === e ? o : {
|
|
13
13
|
...o,
|
|
14
14
|
[t]: e
|
|
15
15
|
});
|
|
16
16
|
}, []);
|
|
17
17
|
return b(() => {
|
|
18
18
|
const t = [...r].pop()?.id;
|
|
19
|
-
|
|
19
|
+
a(t || ""), document.body.style.overflow = r.length ? "hidden" : "unset";
|
|
20
20
|
}, [r]), {
|
|
21
21
|
openModal: s(
|
|
22
22
|
(t, e = "s", o = !0) => (y, I) => {
|
|
23
23
|
const R = h();
|
|
24
|
-
|
|
24
|
+
M({
|
|
25
25
|
id: R,
|
|
26
26
|
modal: t,
|
|
27
27
|
props: {
|
|
28
28
|
size: e,
|
|
29
29
|
showCloser: o,
|
|
30
30
|
closeCallback: I,
|
|
31
|
-
t:
|
|
31
|
+
t: u.current,
|
|
32
32
|
...y
|
|
33
33
|
}
|
|
34
34
|
});
|
|
35
35
|
},
|
|
36
|
-
[
|
|
36
|
+
[M]
|
|
37
37
|
),
|
|
38
38
|
modals: r,
|
|
39
39
|
setModalDirty: m,
|
|
40
|
-
currentModalId:
|
|
40
|
+
currentModalId: f,
|
|
41
41
|
dirtyModals: p,
|
|
42
42
|
closeModal: i
|
|
43
43
|
};
|
package/dist/modal/types.d.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
type ModalProps = {
|
|
3
3
|
closeCallback: () => void;
|
|
4
4
|
close: () => void;
|
|
5
|
+
modalId?: string;
|
|
5
6
|
size: ModalSize;
|
|
6
7
|
showCloser?: boolean;
|
|
7
8
|
t: TFunction;
|
|
@@ -12,7 +13,7 @@ export type TFunction = (field: string, options?: {
|
|
|
12
13
|
[optionName: string]: any;
|
|
13
14
|
}) => string;
|
|
14
15
|
export type ModalSize = 's' | 'm' | 'full';
|
|
15
|
-
export type OwnModalProps<T> = Omit<T, 'close' | 't'>;
|
|
16
|
+
export type OwnModalProps<T> = Omit<T, 'close' | 't' | 'modalId'>;
|
|
16
17
|
export type ModalObject = {
|
|
17
18
|
modal: React.FC<ModalProps>;
|
|
18
19
|
id: string;
|
|
@@ -1,109 +1,126 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { offset as L, flip as
|
|
1
|
+
import { jsx as i, jsxs as D } from "react/jsx-runtime";
|
|
2
|
+
import { offset as L, flip as U, shift as z, arrow as V, useFloating as q, autoUpdate as B } from "@floating-ui/react-dom";
|
|
3
3
|
import c from "classnames";
|
|
4
|
-
import { useRef as g, useMemo as N, useEffect as
|
|
5
|
-
import { CSSTransition as
|
|
6
|
-
import { Portal as
|
|
7
|
-
import { Stack as
|
|
8
|
-
import { stackingOrder as
|
|
4
|
+
import { useRef as g, useMemo as N, useEffect as G, useCallback as H } from "react";
|
|
5
|
+
import { CSSTransition as J } from "react-transition-group";
|
|
6
|
+
import { Portal as K } from "../portal/component.js";
|
|
7
|
+
import { Stack as Q } from "../stack/component.js";
|
|
8
|
+
import { stackingOrder as W } from "../stack/context.js";
|
|
9
9
|
import e from "./index.module.css.js";
|
|
10
|
-
const
|
|
10
|
+
const X = {
|
|
11
11
|
timeout: 150
|
|
12
|
-
},
|
|
12
|
+
}, Y = {
|
|
13
13
|
enter: e.enter,
|
|
14
14
|
enterActive: e.enterActive,
|
|
15
15
|
exit: e.exit,
|
|
16
16
|
exitActive: e.exitActive
|
|
17
|
-
},
|
|
17
|
+
}, Z = J, tt = {
|
|
18
18
|
top: "bottom",
|
|
19
19
|
right: "left",
|
|
20
20
|
bottom: "top",
|
|
21
21
|
left: "right"
|
|
22
|
-
},
|
|
23
|
-
children:
|
|
24
|
-
getPortalContainer:
|
|
25
|
-
transition: m =
|
|
26
|
-
anchorElement:
|
|
22
|
+
}, mt = ({
|
|
23
|
+
children: b,
|
|
24
|
+
getPortalContainer: R,
|
|
25
|
+
transition: m = X,
|
|
26
|
+
anchorElement: h,
|
|
27
27
|
offset: n = [0, 0],
|
|
28
28
|
withArrow: o = !1,
|
|
29
|
-
withTransition:
|
|
30
|
-
position:
|
|
31
|
-
preventFlip:
|
|
32
|
-
popperClassName:
|
|
29
|
+
withTransition: y = !0,
|
|
30
|
+
position: A = "left",
|
|
31
|
+
preventFlip: d,
|
|
32
|
+
popperClassName: T,
|
|
33
33
|
arrowClassName: E,
|
|
34
34
|
className: O,
|
|
35
|
-
open:
|
|
35
|
+
open: s,
|
|
36
36
|
dataTestId: C,
|
|
37
37
|
update: l,
|
|
38
38
|
transitionDuration: F = `${m.timeout}ms`,
|
|
39
|
-
zIndex: I =
|
|
39
|
+
zIndex: I = W.POPOVER
|
|
40
40
|
}) => {
|
|
41
|
-
const
|
|
41
|
+
const f = g(null), u = g(null), M = N(
|
|
42
42
|
() => [
|
|
43
43
|
L({
|
|
44
44
|
crossAxis: n[0],
|
|
45
45
|
mainAxis: n[1]
|
|
46
46
|
}),
|
|
47
|
-
...
|
|
48
|
-
|
|
49
|
-
...o ? [
|
|
47
|
+
...d ? [] : [U()],
|
|
48
|
+
z({ padding: 4 }),
|
|
49
|
+
...o ? [V({ element: f })] : []
|
|
50
50
|
],
|
|
51
|
-
[n[0], n[1],
|
|
51
|
+
[n[0], n[1], d, o]
|
|
52
52
|
), {
|
|
53
53
|
refs: { setFloating: p },
|
|
54
54
|
floatingStyles: _,
|
|
55
55
|
middlewareData: a,
|
|
56
|
-
placement:
|
|
57
|
-
update:
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
56
|
+
placement: v,
|
|
57
|
+
update: x,
|
|
58
|
+
isPositioned: k
|
|
59
|
+
} = q({
|
|
60
|
+
placement: A,
|
|
61
|
+
open: s,
|
|
62
|
+
elements: { reference: h },
|
|
63
|
+
whileElementsMounted: s ? B : void 0,
|
|
63
64
|
middleware: M
|
|
64
65
|
});
|
|
65
|
-
|
|
66
|
-
l && (l.current =
|
|
67
|
-
}, [
|
|
68
|
-
const
|
|
66
|
+
G(() => {
|
|
67
|
+
l && (l.current = x);
|
|
68
|
+
}, [x, l]);
|
|
69
|
+
const P = N(() => {
|
|
69
70
|
if (!o || !a.arrow)
|
|
70
71
|
return {};
|
|
71
|
-
const { x: t, y:
|
|
72
|
+
const { x: t, y: r } = a.arrow, j = v.split("-")[0], w = tt[j] ?? "bottom";
|
|
72
73
|
return {
|
|
73
74
|
position: "absolute",
|
|
74
75
|
left: t != null ? `${t}px` : void 0,
|
|
75
|
-
top:
|
|
76
|
+
top: r != null ? `${r}px` : void 0,
|
|
76
77
|
right: "",
|
|
77
78
|
bottom: "",
|
|
78
79
|
[w]: "-4px"
|
|
79
80
|
};
|
|
80
|
-
}, [o, a.arrow,
|
|
81
|
+
}, [o, a.arrow, v]), $ = H(
|
|
81
82
|
(t) => {
|
|
82
83
|
u.current = t, p(t);
|
|
83
84
|
},
|
|
84
85
|
[p]
|
|
85
|
-
),
|
|
86
|
+
), S = (t, r) => /* @__PURE__ */ i(
|
|
86
87
|
"div",
|
|
87
88
|
{
|
|
88
89
|
ref: $,
|
|
89
90
|
style: {
|
|
90
91
|
zIndex: t,
|
|
91
|
-
..._
|
|
92
|
+
..._,
|
|
93
|
+
/**
|
|
94
|
+
* Скрываем поповер до первого замера floating-ui: иначе
|
|
95
|
+
* на первом рендере `floatingStyles` ещё содержат дефолт
|
|
96
|
+
* `top: 0, left: 0, transform: translate(0, 0)`, а CSSTransition
|
|
97
|
+
* уже стартует fade-in. Получается визуальный "прыжок" из
|
|
98
|
+
* угла портала в правильную позицию. `isPositioned` становится
|
|
99
|
+
* `true` после первого измерения — к этому моменту координаты
|
|
100
|
+
* корректные и можно показывать.
|
|
101
|
+
*
|
|
102
|
+
* Не используем `display: none` или `opacity`, потому что:
|
|
103
|
+
* — `display: none` ломает измерения floating-ui (нулевые
|
|
104
|
+
* размеры) и блокирует CSSTransition;
|
|
105
|
+
* — `opacity` уже используется CSSTransition'ом для fade-in,
|
|
106
|
+
* переписывать его здесь — испортить анимацию.
|
|
107
|
+
*/
|
|
108
|
+
visibility: k ? "visible" : "hidden"
|
|
92
109
|
},
|
|
93
110
|
className: c(e.component, O),
|
|
94
111
|
children: /* @__PURE__ */ D(
|
|
95
112
|
"div",
|
|
96
113
|
{
|
|
97
114
|
"data-test-id": C,
|
|
98
|
-
className: c(e.inner,
|
|
99
|
-
style:
|
|
115
|
+
className: c(e.inner, T),
|
|
116
|
+
style: r,
|
|
100
117
|
children: [
|
|
101
|
-
|
|
102
|
-
o && /* @__PURE__ */
|
|
118
|
+
b,
|
|
119
|
+
o && /* @__PURE__ */ i(
|
|
103
120
|
"div",
|
|
104
121
|
{
|
|
105
|
-
ref:
|
|
106
|
-
style:
|
|
122
|
+
ref: f,
|
|
123
|
+
style: P,
|
|
107
124
|
className: c(e.arrow, E)
|
|
108
125
|
}
|
|
109
126
|
)
|
|
@@ -112,18 +129,18 @@ const W = {
|
|
|
112
129
|
)
|
|
113
130
|
}
|
|
114
131
|
);
|
|
115
|
-
return /* @__PURE__ */
|
|
116
|
-
|
|
132
|
+
return /* @__PURE__ */ i(Q, { value: I, children: (t) => /* @__PURE__ */ i(K, { getPortalContainer: R, children: y ? /* @__PURE__ */ i(
|
|
133
|
+
Z,
|
|
117
134
|
{
|
|
118
135
|
unmountOnExit: !0,
|
|
119
|
-
classNames:
|
|
136
|
+
classNames: Y,
|
|
120
137
|
...m,
|
|
121
|
-
in:
|
|
138
|
+
in: s,
|
|
122
139
|
nodeRef: u,
|
|
123
|
-
children:
|
|
140
|
+
children: S(t, { transitionDuration: F })
|
|
124
141
|
}
|
|
125
|
-
) :
|
|
142
|
+
) : s && S(t) }) });
|
|
126
143
|
};
|
|
127
144
|
export {
|
|
128
|
-
|
|
145
|
+
mt as Popover
|
|
129
146
|
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const t = [
|
|
2
|
+
{
|
|
3
|
+
id: 1,
|
|
4
|
+
title: "Tambov"
|
|
5
|
+
},
|
|
6
|
+
{
|
|
7
|
+
id: 2,
|
|
8
|
+
title: "Moscow"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
id: 3,
|
|
12
|
+
title: "Voronezh"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
id: 4,
|
|
16
|
+
title: "Lipetsk"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
id: 5,
|
|
20
|
+
title: "SPB"
|
|
21
|
+
}
|
|
22
|
+
], o = [
|
|
23
|
+
{
|
|
24
|
+
id: 1,
|
|
25
|
+
title: "Questroom 1",
|
|
26
|
+
locationId: 1
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: 4,
|
|
30
|
+
title: "Questroom 4",
|
|
31
|
+
locationId: 2
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: 5,
|
|
35
|
+
title: "Questroom 5",
|
|
36
|
+
locationId: 2
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: 6,
|
|
40
|
+
title: "Questroom 6",
|
|
41
|
+
locationId: 2
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: 7,
|
|
45
|
+
title: "Questroom 7",
|
|
46
|
+
locationId: 3
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: 10,
|
|
50
|
+
title: "Questroom 10",
|
|
51
|
+
locationId: 4
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: 11,
|
|
55
|
+
title: "Questroom 11",
|
|
56
|
+
locationId: 4
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 12,
|
|
60
|
+
title: "Questroom 12",
|
|
61
|
+
locationId: 4
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: 13,
|
|
65
|
+
title: "Questroom 13",
|
|
66
|
+
locationId: 5
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
id: 14,
|
|
70
|
+
title: "Questroom 14",
|
|
71
|
+
locationId: 5
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 15,
|
|
75
|
+
title: "Questroom 15",
|
|
76
|
+
locationId: 5
|
|
77
|
+
}
|
|
78
|
+
];
|
|
79
|
+
export {
|
|
80
|
+
t as locations,
|
|
81
|
+
o as questrooms
|
|
82
|
+
};
|