iticket-seatingplan-dev 1.5.2 → 1.5.4

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,233 @@
1
+ /* Popup to select prices */
2
+
3
+ .pricing-popup-backdrop {
4
+ position: absolute;
5
+ width: 100%;
6
+ height: 100%;
7
+ top: 0;
8
+ left: 0;
9
+ background-color: rgba(0, 0, 0, 0.4);
10
+ z-index: 1001;
11
+ animation: fade-in 400ms;
12
+ }
13
+
14
+ .pricing-popup {
15
+ position: absolute;
16
+ z-index: 1002;
17
+ top: 50%;
18
+ left: 50%;
19
+ transform: translate(-50%, -50%);
20
+ animation: fade-in 400ms;
21
+ background-color: #fff;
22
+ /* font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; */
23
+ font-family: inherit;
24
+ padding: 1rem;
25
+ color: #333;
26
+ box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4);
27
+ border-radius: 12px;
28
+ min-width: 20rem;
29
+ }
30
+
31
+ .pricing-popup .popup-header {
32
+ margin-top: 0;
33
+ }
34
+
35
+ .pricing-popup .popup-header .close-button {
36
+ margin: -2px -2px 0px 0px;
37
+ }
38
+
39
+ .pricing-popup h3,
40
+ .pricing-popup h4 {
41
+ font-weight: bold;
42
+ margin: 0;
43
+ }
44
+
45
+ .pricing-popup p {
46
+ margin: 0;
47
+ max-width: 30rem;
48
+ }
49
+
50
+ .pricing-popup .seat-names {
51
+ font-size: 0.9rem;
52
+ }
53
+
54
+ .pricing-popup .seat-list {
55
+ text-align: left;
56
+ display: flex;
57
+ flex-direction: column;
58
+ gap: 1rem;
59
+ margin-top: 1rem;
60
+ }
61
+
62
+ .pricing-popup .seat-group {
63
+ display: flex;
64
+ flex-direction: column;
65
+ gap: 0.5rem;
66
+ }
67
+
68
+ .pricing-popup .seat-group-header {
69
+ display: flex;
70
+ justify-content: space-between;
71
+ align-items: flex-end;
72
+ gap: 1rem;
73
+ font-size: 0.9rem;
74
+ }
75
+
76
+ .pricing-popup select {
77
+ flex: 1;
78
+ padding: 0.3rem 0.2rem;
79
+ }
80
+
81
+ .pricing-popup .buttons {
82
+ display: flex;
83
+ width: 100%;
84
+ justify-content: space-between;
85
+ gap: 1rem;
86
+ margin-top: 1.2rem;
87
+ }
88
+
89
+ .pricing-popup .buttons button {
90
+ display: block;
91
+ background: transparent;
92
+ min-width: 12rem;
93
+ border-radius: 0.25rem;
94
+ padding: 0.5rem;
95
+ border: 1px solid #333;
96
+ margin-bottom: 0.2rem;
97
+ cursor: pointer;
98
+ margin-bottom: 0;
99
+ }
100
+
101
+ .pricing-popup .buttons button:disabled {
102
+ cursor: default;
103
+ color: #bdc3c7;
104
+ border-color: #bdc3c7;
105
+ }
106
+
107
+ .pricing-popup .buttons button:hover:not(:disabled) {
108
+ background: #ecf0f1;
109
+ transition: 0.2s;
110
+ }
111
+
112
+ .pricing-popup .no-prices-available {
113
+ font-size: 0.8rem;
114
+ color: red;
115
+ }
116
+
117
+ .pricing-popup button.cancel {
118
+ background: #ecf0f1;
119
+ border: none;
120
+ }
121
+
122
+ .pricing-popup .price-select {
123
+ display: flex;
124
+ gap: 8px;
125
+ }
126
+
127
+ .pricing-popup .flexi-button {
128
+ width: max-content;
129
+ display: flex;
130
+ align-items: center;
131
+ gap: 4px;
132
+ border-radius: 0.25rem;
133
+ padding: 0.5rem;
134
+ border: none;
135
+ text-decoration: underline;
136
+ background: transparent;
137
+ cursor: pointer;
138
+ animation: fade-in 200ms;
139
+ font-weight: 600;
140
+ transition: 0.2s;
141
+ }
142
+
143
+ .flexi-button:hover {
144
+ background: #ecf0f1;
145
+ }
146
+
147
+ /* Button controls */
148
+
149
+ .leaflet-draw.leaflet-control {
150
+ margin-bottom: 0;
151
+ }
152
+
153
+ .leaflet-draw.leaflet-control .leaflet-draw-toolbar {
154
+ border-bottom: none;
155
+ border-bottom-left-radius: 0;
156
+ border-bottom-right-radius: 0;
157
+ }
158
+
159
+ .extra-controls.multi-select-control {
160
+ border-top-left-radius: 0;
161
+ border-top-right-radius: 0;
162
+ border-top: 0;
163
+ }
164
+
165
+ .extra-controls.multi-select-control button {
166
+ border-top-left-radius: 0;
167
+ border-top-right-radius: 0;
168
+ border-top: 1px solid #ccc;
169
+ }
170
+
171
+ .cancel-button {
172
+ margin-top: 1px;
173
+ }
174
+
175
+ .cancel-button a {
176
+ display: block;
177
+ }
178
+
179
+ .remove-seats .cancel-button {
180
+ margin-top: 31px;
181
+ }
182
+
183
+ .leaflet-draw-toolbar.leaflet-bar a.leaflet-draw-draw-rectangle,
184
+ .drag-button span,
185
+ .single-button span,
186
+ .remove-button span {
187
+ background-image: none;
188
+ background-color: black;
189
+ mask-position: center center;
190
+ mask-repeat: no-repeat;
191
+ transition: background-color 100ms ease-in-out;
192
+ }
193
+
194
+ .drag-button span,
195
+ .single-button span,
196
+ .remove-button span {
197
+ display: block;
198
+ height: 100%;
199
+ width: 100%;
200
+ }
201
+
202
+ .leaflet-draw-toolbar.leaflet-bar a.leaflet-draw-draw-rectangle {
203
+ mask-size: 22px;
204
+ mask-image: url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNjAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3QgeD0iNSIgeT0iNSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjMwIiByeD0iMyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWRhc2hhcnJheT0iOCA0IiAvPjxwb2x5Z29uIHBvaW50cz0iMzcsMjcgNjAsMzUgNDUsNTAiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz48bGluZSB4MT0iNTIiIHkxPSI0MiIgeDI9IjYwIiB5Mj0iNTAiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjUiIC8+PC9zdmc+");
205
+ -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNjAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3QgeD0iNSIgeT0iNSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjMwIiByeD0iMyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWRhc2hhcnJheT0iOCA0IiAvPjxwb2x5Z29uIHBvaW50cz0iMzcsMjcgNjAsMzUgNDUsNTAiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz48bGluZSB4MT0iNTIiIHkxPSI0MiIgeDI9IjYwIiB5Mj0iNTAiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjUiIC8+PC9zdmc+");
206
+ }
207
+
208
+ .drag-button span {
209
+ mask-size: 15px;
210
+ mask-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik00NDggMjQwdjk2YzAgMy4xLS40IDYuMi0xLjEgOS4ybC0zMiAxMzZDNDEwLjcgNDk5LjIgMzk0LjYgNTEyIDM3NiA1MTJIMTY4YTQwIDQwIDAgMCAxIC0zMi40LTE2LjVsLTEyOC0xNzZjLTEzLTE3LjktOS00Mi45IDguOC01NS45IDE3LjktMTMgNDIuOS05IDU1LjkgOC44TDEwNCAzMTZWNDBjMC0yMi4xIDE3LjktNDAgNDAtNDBzNDAgMTcuOSA0MCA0MHYyMDBoOHYtNDBjMC0yMi4xIDE3LjktNDAgNDAtNDBzNDAgMTcuOSA0MCA0MHY0MGg4di0yNGMwLTIyLjEgMTcuOS00MCA0MC00MHM0MCAxNy45IDQwIDQwdjI0aDhjMC0yMi4xIDE3LjktNDAgNDAtNDBzNDAgMTcuOSA0MCA0MHptLTI1NiA4MGgtOHY5Nmg4di05NnptODggMGgtOHY5Nmg4di05NnptODggMGgtOHY5Nmg4di05NnoiLz48L3N2Zz4=");
211
+ -webkit-mask-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik00NDggMjQwdjk2YzAgMy4xLS40IDYuMi0xLjEgOS4ybC0zMiAxMzZDNDEwLjcgNDk5LjIgMzk0LjYgNTEyIDM3NiA1MTJIMTY4YTQwIDQwIDAgMCAxIC0zMi40LTE2LjVsLTEyOC0xNzZjLTEzLTE3LjktOS00Mi45IDguOC01NS45IDE3LjktMTMgNDIuOS05IDU1LjkgOC44TDEwNCAzMTZWNDBjMC0yMi4xIDE3LjktNDAgNDAtNDBzNDAgMTcuOSA0MCA0MHYyMDBoOHYtNDBjMC0yMi4xIDE3LjktNDAgNDAtNDBzNDAgMTcuOSA0MCA0MHY0MGg4di0yNGMwLTIyLjEgMTcuOS00MCA0MC00MHM0MCAxNy45IDQwIDQwdjI0aDhjMC0yMi4xIDE3LjktNDAgNDAtNDBzNDAgMTcuOSA0MCA0MHptLTI1NiA4MGgtOHY5Nmg4di05NnptODggMGgtOHY5Nmg4di05NnptODggMGgtOHY5Nmg4di05NnoiLz48L3N2Zz4=");
212
+ }
213
+
214
+ .single-button span {
215
+ mask-size: 12px;
216
+ mask-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMyMCA1MTIiPjwhLS0hRm9udCBBd2Vzb21lIEZyZWUgNi43LjEgYnkgQGZvbnRhd2Vzb21lIC0gaHR0cHM6Ly9mb250YXdlc29tZS5jb20gTGljZW5zZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tL2xpY2Vuc2UvZnJlZSBDb3B5cmlnaHQgMjAyNCBGb250aWNvbnMsIEluYy4tLT48cGF0aCBkPSJNMCA1NS4yTDAgNDI2YzAgMTIuMiA5LjkgMjIgMjIgMjJjNi4zIDAgMTIuNC0yLjcgMTYuNi03LjVMMTIxLjIgMzQ2bDU4LjEgMTE2LjNjNy45IDE1LjggMjcuMSAyMi4yIDQyLjkgMTQuM3MyMi4yLTI3LjEgMTQuMy00Mi45TDE3OS44IDMyMGwxMTguMSAwYzEyLjIgMCAyMi4xLTkuOSAyMi4xLTIyLjFjMC02LjMtMi43LTEyLjMtNy40LTE2LjVMMzguNiAzNy45QzM0LjMgMzQuMSAyOC45IDMyIDIzLjIgMzJDMTAuNCAzMiAwIDQyLjQgMCA1NS4yeiIvPjwvc3ZnPg==");
217
+ -webkit-mask-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMyMCA1MTIiPjwhLS0hRm9udCBBd2Vzb21lIEZyZWUgNi43LjEgYnkgQGZvbnRhd2Vzb21lIC0gaHR0cHM6Ly9mb250YXdlc29tZS5jb20gTGljZW5zZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tL2xpY2Vuc2UvZnJlZSBDb3B5cmlnaHQgMjAyNCBGb250aWNvbnMsIEluYy4tLT48cGF0aCBkPSJNMCA1NS4yTDAgNDI2YzAgMTIuMiA5LjkgMjIgMjIgMjJjNi4zIDAgMTIuNC0yLjcgMTYuNi03LjVMMTIxLjIgMzQ2bDU4LjEgMTE2LjNjNy45IDE1LjggMjcuMSAyMi4yIDQyLjkgMTQuM3MyMi4yLTI3LjEgMTQuMy00Mi45TDE3OS44IDMyMGwxMTguMSAwYzEyLjIgMCAyMi4xLTkuOSAyMi4xLTIyLjFjMC02LjMtMi43LTEyLjMtNy40LTE2LjVMMzguNiAzNy45QzM0LjMgMzQuMSAyOC45IDMyIDIzLjIgMzJDMTAuNCAzMiAwIDQyLjQgMCA1NS4yeiIvPjwvc3ZnPg==");
218
+ }
219
+
220
+ .remove-button span {
221
+ mask-size: 12px;
222
+ mask-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDM4NCA1MTIiPjxwYXRoIGQ9Ik0zNzYuNiA4NC41YzExLjMtMTMuNiA5LjUtMzMuOC00LjEtNDUuMXMtMzMuOC05LjUtNDUuMSA0LjFMMTkyIDIwNiA1Ni42IDQzLjVDNDUuMyAyOS45IDI1LjEgMjguMSAxMS41IDM5LjRTLTMuOSA3MC45IDcuNCA4NC41TDE1MC4zIDI1NiA3LjQgNDI3LjVjLTExLjMgMTMuNi05LjUgMzMuOCA0LjEgNDUuMXMzMy44IDkuNSA0NS4xLTQuMUwxOTIgMzA2IDMyNy40IDQ2OC41YzExLjMgMTMuNiAzMS41IDE1LjQgNDUuMSA0LjFzMTUuNC0zMS41IDQuMS00NS4xTDIzMy43IDI1NiAzNzYuNiA4NC41eiIvPjwvc3ZnPg==");
223
+ -webkit-mask-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDM4NCA1MTIiPjxwYXRoIGQ9Ik0zNzYuNiA4NC41YzExLjMtMTMuNiA5LjUtMzMuOC00LjEtNDUuMXMtMzMuOC05LjUtNDUuMSA0LjFMMTkyIDIwNiA1Ni42IDQzLjVDNDUuMyAyOS45IDI1LjEgMjguMSAxMS41IDM5LjRTLTMuOSA3MC45IDcuNCA4NC41TDE1MC4zIDI1NiA3LjQgNDI3LjVjLTExLjMgMTMuNi05LjUgMzMuOCA0LjEgNDUuMXMzMy44IDkuNSA0NS4xLTQuMUwxOTIgMzA2IDMyNy40IDQ2OC41YzExLjMgMTMuNiAzMS41IDE1LjQgNDUuMSA0LjFzMTUuNC0zMS41IDQuMS00NS4xTDIzMy43IDI1NiAzNzYuNiA4NC41eiIvPjwvc3ZnPg==");
224
+ }
225
+
226
+ [data-mode="draw"]
227
+ .leaflet-draw-toolbar.leaflet-bar
228
+ a.leaflet-draw-draw-rectangle,
229
+ [data-mode="drag"] .drag-button span,
230
+ [data-mode="single"] .single-button span,
231
+ [data-mode="remove"] .remove-button span {
232
+ background-color: #00cc00;
233
+ }
package/dist/index.js CHANGED
@@ -1,27 +1,5 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "Badge", {
7
- enumerable: true,
8
- get: function get() {
9
- return _Badge.default;
10
- }
11
- });
12
- Object.defineProperty(exports, "Button", {
13
- enumerable: true,
14
- get: function get() {
15
- return _Button.default;
16
- }
17
- });
18
- Object.defineProperty(exports, "SeatingPlan", {
19
- enumerable: true,
20
- get: function get() {
21
- return _SeatingPlan.default;
22
- }
23
- });
24
- var _Badge = _interopRequireDefault(require("./components/Badge"));
25
- var _Button = _interopRequireDefault(require("./components/Button"));
26
- var _SeatingPlan = _interopRequireDefault(require("./components/SeatingPlan"));
27
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
1
+ import Badge from './components/Badge'
2
+ import Button from './components/Button'
3
+ import SeatingPlan from './components/SeatingPlan'
4
+
5
+ export { Badge, Button, SeatingPlan }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.statuses = exports.statusColors = void 0;
6
+ exports.statuses = exports.statusColors = exports.modes = exports.bookingModes = void 0;
7
7
  const statusColors = exports.statusColors = {
8
8
  unknown: "#95a5a6",
9
9
  available: "#00E640",
@@ -11,7 +11,9 @@ const statusColors = exports.statusColors = {
11
11
  reserved: "#95a5a6",
12
12
  pending: "#e74c3c",
13
13
  booked: "#e74c3c",
14
- bookedWithDifferentPrice: "#fab1a0"
14
+ bookedWithDifferentPrice: "#fab1a0",
15
+ // TODO temporary selected state
16
+ selected: "#049CDB"
15
17
  };
16
18
  const statuses = exports.statuses = {
17
19
  UNSOLD: 1,
@@ -24,4 +26,14 @@ const statuses = exports.statuses = {
24
26
  ON_HOLD: 8,
25
27
  REAL_TIME_DOOR_SALES: 9,
26
28
  CANCELLED: 10
29
+ };
30
+ const modes = exports.modes = {
31
+ DRAW: "draw",
32
+ DRAG: "drag",
33
+ SINGLE: "single",
34
+ REMOVE: "remove"
35
+ };
36
+ const bookingModes = exports.bookingModes = {
37
+ POS: "pos",
38
+ SHOPSITE: "shopsite"
27
39
  };
@@ -5,7 +5,16 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.getInitialColor = exports.calculateCenterOfMap = exports.NZDollar = void 0;
7
7
  var _enums = require("./enums");
8
- const getInitialColor = (s, price) => {
8
+ const getInitialColor = (s, price, selected) => {
9
+ // TEST selected state for multiselect
10
+ // if (selected) {
11
+ // return {
12
+ // fillColor: statusColors.selected,
13
+ // color: "none",
14
+ // fillOpacity: s.loading ? 0 : 1,
15
+ // };
16
+ // }
17
+
9
18
  return {
10
19
  fillColor: s.s === _enums.statuses.UNSOLD ? _enums.statusColors.available : s.s === _enums.statuses.USER_PENDING ? s.bookedPrice === price ? _enums.statusColors.booked : _enums.statusColors.bookedWithDifferentPrice : _enums.statusColors.sold,
11
20
  color: "none",
@@ -1,27 +1,2 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- var _enums = require("./enums");
7
- Object.keys(_enums).forEach(function (key) {
8
- if (key === "default" || key === "__esModule") return;
9
- if (key in exports && exports[key] === _enums[key]) return;
10
- Object.defineProperty(exports, key, {
11
- enumerable: true,
12
- get: function get() {
13
- return _enums[key];
14
- }
15
- });
16
- });
17
- var _helpers = require("./helpers");
18
- Object.keys(_helpers).forEach(function (key) {
19
- if (key === "default" || key === "__esModule") return;
20
- if (key in exports && exports[key] === _helpers[key]) return;
21
- Object.defineProperty(exports, key, {
22
- enumerable: true,
23
- get: function get() {
24
- return _helpers[key];
25
- }
26
- });
27
- });
1
+ export * from "./enums";
2
+ export * from "./helpers";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "iticket-seatingplan-dev",
3
3
  "description": "Seating plan with FLEXi pricing",
4
4
  "author": "gedwyne",
5
- "version": "1.5.2",
5
+ "version": "1.5.4",
6
6
  "private": false,
7
7
  "keywords": [
8
8
  "iticket",
@@ -16,12 +16,16 @@
16
16
  ],
17
17
  "dependencies": {
18
18
  "@babel/polyfill": "^7.12.1",
19
+ "@types/leaflet": "^1.9.14",
20
+ "@types/leaflet-draw": "^1.0.11",
19
21
  "leaflet": "^1.9.3",
22
+ "leaflet-draw": "^1.0.4",
20
23
  "leaflet-gesture-handling": "^1.2.2",
21
24
  "react": "^18.3.1",
22
25
  "react-dom": "^18.3.1",
23
26
  "react-leaflet": "^4.2.1",
24
27
  "react-leaflet-custom-control": "^1.3.5",
28
+ "react-leaflet-draw": "^0.20.4",
25
29
  "react-scripts": "^5.0.1"
26
30
  },
27
31
  "codependencies": {
@@ -30,7 +34,7 @@
30
34
  "react-leaflet": "^4.2.1"
31
35
  },
32
36
  "scripts": {
33
- "build": "babel src/lib --out-dir dist --copy-files",
37
+ "build": "babel src/lib --out-dir dist --extensions '.tsx,.ts,.js' --copy-files",
34
38
  "start": "react-scripts start"
35
39
  },
36
40
  "browserslist": {
@@ -48,7 +52,12 @@
48
52
  "devDependencies": {
49
53
  "@babel/cli": "^7.22.5",
50
54
  "@babel/core": "^7.22.5",
55
+ "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
51
56
  "@babel/preset-env": "^7.22.5",
52
- "@babel/preset-react": "^7.22.5"
57
+ "@babel/preset-react": "^7.22.5",
58
+ "@babel/preset-typescript": "^7.26.0",
59
+ "@types/react": "^18.3.12",
60
+ "@types/react-dom": "^18.3.1",
61
+ "typescript": "^5.7.2"
53
62
  }
54
63
  }