utopia-ui 3.0.0-alpha.2 → 3.0.0-alpha.20

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 (64) hide show
  1. package/dist/Components/AppShell/AppShell.d.ts +2 -3
  2. package/dist/Components/AppShell/DialogModal.d.ts +9 -0
  3. package/dist/Components/AppShell/NavBar.d.ts +2 -3
  4. package/dist/Components/Auth/LoginPage.d.ts +2 -0
  5. package/dist/Components/Auth/SignupPage.d.ts +2 -0
  6. package/dist/Components/Auth/authDirectus.d.ts +7 -13
  7. package/dist/Components/Auth/index.d.ts +3 -1
  8. package/dist/Components/Auth/useAuth.d.ts +24 -0
  9. package/dist/Components/Input/FancyTextAreaInput.d.ts +13 -0
  10. package/dist/Components/Input/InputText.d.ts +4 -3
  11. package/dist/Components/Input/TextAreaInput.d.ts +6 -4
  12. package/dist/Components/Input/TextInput.d.ts +14 -0
  13. package/dist/Components/Input/TributeTextAreaInput copy.d.ts +13 -0
  14. package/dist/Components/Input/TributeTextAreaInput.d.ts +13 -0
  15. package/dist/Components/Input/index.d.ts +2 -0
  16. package/dist/Components/Map/ItemForm.d.ts +16 -0
  17. package/dist/Components/Map/ItemFormPopup.d.ts +12 -0
  18. package/dist/Components/Map/ItemView.d.ts +16 -0
  19. package/dist/Components/Map/ItemViewPopup.d.ts +8 -0
  20. package/dist/Components/Map/Permissions.d.ts +7 -0
  21. package/dist/Components/Map/Subcomponents/AddButton.d.ts +2 -2
  22. package/dist/Components/Map/Subcomponents/FilterControl.d.ts +2 -0
  23. package/dist/Components/Map/Subcomponents/HeaderView.d.ts +7 -0
  24. package/dist/Components/Map/Subcomponents/ItemFormPopup.d.ts +3 -3
  25. package/dist/Components/Map/Subcomponents/ItemPopupComponents/HeaderView.d.ts +7 -0
  26. package/dist/Components/Map/Subcomponents/ItemPopupComponents/PopupStartEndInput.d.ts +5 -0
  27. package/dist/Components/Map/Subcomponents/ItemPopupComponents/PopupTextAreaInput.d.ts +8 -0
  28. package/dist/Components/Map/Subcomponents/ItemPopupComponents/PopupTextInput.d.ts +2 -0
  29. package/dist/Components/Map/Subcomponents/ItemPopupComponents/StartEndView.d.ts +5 -0
  30. package/dist/Components/Map/Subcomponents/ItemPopupComponents/TextView.d.ts +5 -0
  31. package/dist/Components/Map/Subcomponents/ItemViewPopup.d.ts +3 -4
  32. package/dist/Components/Map/Subcomponents/LayerControl.d.ts +2 -0
  33. package/dist/Components/Map/Subcomponents/LocateControl.d.ts +1 -0
  34. package/dist/Components/Map/Subcomponents/SearchBar.d.ts +2 -0
  35. package/dist/Components/Map/Subcomponents/StartEndView.d.ts +6 -0
  36. package/dist/Components/Map/Subcomponents/TagFilterControl.d.ts +2 -0
  37. package/dist/Components/Map/Subcomponents/TextView.d.ts +5 -0
  38. package/dist/Components/Map/Tags.d.ts +4 -3
  39. package/dist/Components/Map/UtopiaMap.d.ts +4 -5
  40. package/dist/Components/Map/hooks/useFilter.d.ts +32 -0
  41. package/dist/Components/Map/hooks/useItems.d.ts +4 -0
  42. package/dist/Components/Map/hooks/useLeafletRefs.d.ts +22 -0
  43. package/dist/Components/Map/hooks/usePermissions.d.ts +20 -0
  44. package/dist/Components/Map/hooks/useTags.d.ts +7 -1
  45. package/dist/Components/Map/hooks/useWindowDimension.d.ts +4 -0
  46. package/dist/Components/Map/index.d.ts +8 -1
  47. package/dist/Components/Profile/Settings.d.ts +1 -3
  48. package/dist/Components/Templates/CardPage.d.ts +5 -0
  49. package/dist/Components/Templates/TitleCard.d.ts +9 -0
  50. package/dist/Components/Templates/index.d.ts +2 -0
  51. package/dist/Components/TitleCard.d.ts +2 -2
  52. package/dist/Components/Typography/ErrorText.d.ts +6 -0
  53. package/dist/Components/Typography/Subtitle.d.ts +3 -3
  54. package/dist/Utils/DynamicHeroIcon.d.ts +2 -0
  55. package/dist/Utils/HashTagRegex.d.ts +1 -0
  56. package/dist/Utils/HeighlightTags.d.ts +1 -2
  57. package/dist/Utils/RandomColor.d.ts +1 -0
  58. package/dist/Utils/ReplaceURLs.d.ts +3 -1
  59. package/dist/Utils/TaggedText.d.ts +3 -0
  60. package/dist/index.d.ts +4 -2
  61. package/dist/index.js +1458 -443
  62. package/dist/index.js.map +1 -1
  63. package/dist/types.d.ts +33 -7
  64. package/package.json +7 -3
package/dist/index.js CHANGED
@@ -1,38 +1,21 @@
1
- import { MapContainer, TileLayer, useMapEvents, useMap, Popup, Marker } from 'react-leaflet';
1
+ import { MapContainer, TileLayer, useMapEvents, useMap, Popup, Marker, Tooltip } from 'react-leaflet';
2
2
  import 'leaflet/dist/leaflet.css';
3
3
  import * as React from 'react';
4
4
  import { createContext, useContext, useReducer, useCallback, useState, useEffect, useRef } from 'react';
5
5
  import * as L from 'leaflet';
6
6
  import { LatLng } from 'leaflet';
7
7
  import MarkerClusterGroup from 'react-leaflet-cluster';
8
- import * as HIcons from '@heroicons/react/20/solid';
9
- import { Link, BrowserRouter, useLocation, NavLink, useNavigate } from 'react-router-dom';
8
+ import { Link, useLocation, useNavigate, BrowserRouter, NavLink } from 'react-router-dom';
10
9
  import { toast, ToastContainer } from 'react-toastify';
10
+ import reactStringReplace from 'react-string-replace';
11
+ import Tribute from 'tributejs';
12
+ import * as PropTypes from 'prop-types';
11
13
  import QuestionMarkIcon from '@heroicons/react/24/outline/QuestionMarkCircleIcon';
12
14
  import { initTE, Sidenav } from 'tw-elements';
13
15
  import ChevronDownIcon from '@heroicons/react/24/outline/ChevronDownIcon';
14
16
  import ChevronRightIcon from '@heroicons/react/24/outline/ChevronRightIcon';
15
17
  import 'react-toastify/dist/ReactToastify.css';
16
18
 
17
- var Item = /** @class */ (function () {
18
- function Item(id, name, text, position, layer, api) {
19
- this.id = id;
20
- this.name = name;
21
- this.text = text;
22
- this.position = position;
23
- this.layer = layer;
24
- this.api = api;
25
- }
26
- return Item;
27
- }());
28
- var Geometry = /** @class */ (function () {
29
- function Geometry(lng, lat) {
30
- this.coordinates = [lng, lat];
31
- this.type = "Point";
32
- }
33
- return Geometry;
34
- }());
35
-
36
19
  function styleInject(css, ref) {
37
20
  if ( ref === void 0 ) ref = {};
38
21
  var insertAt = ref.insertAt;
@@ -60,7 +43,7 @@ function styleInject(css, ref) {
60
43
  }
61
44
  }
62
45
 
63
- var css_248z$1 = ".leaflet-container {\n text-align: left;\n }\n \n \n \n input {\n box-sizing: border-box;\n }\n \n textarea {\n box-sizing: border-box;\n }\n \n .leaflet-control-attribution {\n display: none;\n }\n \n .leaflet-data-marker {\n \n background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAQCAYAAACcN8ZaAAAB3klEQVR42s3U4UdDURzG8czMXJnJ1Vwzc6VJZjaZJdlMlpQsKdmUFNOUspRSSqUolfQfr+fF98Vx5mwv9qbDx7LdznnO7/7Omej3+/+Ga0QMUYkhbvBgmhzCQxwxibIGrGEF8CQhU+LLtKQkQNqScUgjxRxTBIxbgfgD/BgnhM8kM5KTeclLQYqGkkMRBckzR8ic/mAgd5BAZplsUaqyIg2sDtHg2brUZJk5SmwopErJUWE8SpmTMhNvya60Zd/SNrR4bkeaskG4uiwRZk6yrJEYFibGAxn+scECHTmTnuVCzvmty3PHciB7bGKN6lQkzysPqIrHmpFhYbKUtckC1/Ioz4ZHuZdbuSLYiRxRpSZVWXZVxAzC0R4Ik5SQsu6w8yd5l2/5kg95I9SdXMoZQfYIUjeqEUrgOkXGPeN4TYRhxy8E+ZUf+eS7B7miIoeybVSjKDnm8u3+gH3pDTYwu1igATvs/pXqvBKiR4i2bNJfi1ZfUAnjgrOG8wY2quNzBKuU/ZS+uSFEl5O0xRGuUIlZCcw7xG5QPkeHYUSNV5WXGou2sC3rBC0LjenqCXGO0WEiTJa0Lr4KixdHBrDGuGGiRqCUpFk8pGIpQtCU7p4YPwxYxEMCk1aAMQZh8Ac8PfbIzYPJOwAAAABJRU5ErkJggg==') no-repeat;\n background-position: 6px 32px;\n }\n \n .crosshair-cursor-enabled {\n cursor: crosshair;\n }\n \n .leaflet-container {\n cursor: inherit;\n }\n \n .calendar-icon {\n position: relative;\n top: -35px;\n left: 10px;\n width: 13px;\n }\n \n \n .circle-icon {\n position: relative;\n top: -33px;\n left: 10px;\n width: 13px;\n }\n \n .leaflet-popup-scrolled {\n overflow-x: hidden;\n }";
46
+ var css_248z$1 = ".leaflet-container {\n text-align: left;\n }\n \n \n \n input {\n box-sizing: border-box;\n }\n \n textarea {\n box-sizing: border-box;\n }\n \n .leaflet-control-attribution {\n display: none;\n }\n \n .leaflet-data-marker {\n \n background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAQCAYAAACcN8ZaAAAB3klEQVR42s3U4UdDURzG8czMXJnJ1Vwzc6VJZjaZJdlMlpQsKdmUFNOUspRSSqUolfQfr+fF98Vx5mwv9qbDx7LdznnO7/7Omej3+/+Ga0QMUYkhbvBgmhzCQxwxibIGrGEF8CQhU+LLtKQkQNqScUgjxRxTBIxbgfgD/BgnhM8kM5KTeclLQYqGkkMRBckzR8ic/mAgd5BAZplsUaqyIg2sDtHg2brUZJk5SmwopErJUWE8SpmTMhNvya60Zd/SNrR4bkeaskG4uiwRZk6yrJEYFibGAxn+scECHTmTnuVCzvmty3PHciB7bGKN6lQkzysPqIrHmpFhYbKUtckC1/Ioz4ZHuZdbuSLYiRxRpSZVWXZVxAzC0R4Ik5SQsu6w8yd5l2/5kg95I9SdXMoZQfYIUjeqEUrgOkXGPeN4TYRhxy8E+ZUf+eS7B7miIoeybVSjKDnm8u3+gH3pDTYwu1igATvs/pXqvBKiR4i2bNJfi1ZfUAnjgrOG8wY2quNzBKuU/ZS+uSFEl5O0xRGuUIlZCcw7xG5QPkeHYUSNV5WXGou2sC3rBC0LjenqCXGO0WEiTJa0Lr4KixdHBrDGuGGiRqCUpFk8pGIpQtCU7p4YPwxYxEMCk1aAMQZh8Ac8PfbIzYPJOwAAAABJRU5ErkJggg==') no-repeat;\n background-position: 6px 32px;\n }\n \n .crosshair-cursor-enabled {\n cursor: crosshair;\n }\n \n .leaflet-container {\n cursor: inherit;\n }\n \n .calendar-icon {\n position: relative;\n top: -35px;\n left: 10px;\n width: 13px;\n }\n \n \n .circle-icon {\n position: relative;\n top: -33px;\n left: 10px;\n width: 13px;\n }\n \n .leaflet-popup-scrolled {\n overflow-x: hidden;\n }\n\n .leaflet-popup-content-wrapper, .leaflet-popup-tip{\n background-color: hsl(var(--b1) / 1);\n color: hsl(var(--bc) / 1);\n\n }\n\n .leaflet-tooltip {\n border-radius: 1em;\n transition: opacity 500ms;\n transition-delay: 50ms;\n\n }";
64
47
  styleInject(css_248z$1);
65
48
 
66
49
  /******************************************************************************
@@ -151,13 +134,19 @@ function __spreadArray(to, from, pack) {
151
134
 
152
135
  // DynamicHeroIcon.tsx
153
136
  var DynamicHeroIcon = function (props) {
154
- var icons = __rest(HIcons, []);
155
- var TheIcon = icons[props.icon];
156
- if (!TheIcon) {
157
- console.log("Icon ".concat(props.icon, " doesn't exist"));
158
- }
159
- return (React.createElement(React.Fragment, null,
160
- React.createElement(TheIcon, { className: "tw-h-6 tw-w-6 tw-text-white", "aria-hidden": "true" })));
137
+ var _a = React.useState(), TheIcon = _a[0], setTheIcon = _a[1];
138
+ import('@heroicons/react/24/solid').then(function (i) {
139
+ var icons = __rest(i, []);
140
+ setTheIcon(icons[props.icon]);
141
+ if (!TheIcon) {
142
+ console.log("Icon ".concat(props.icon, " doesn't exist"));
143
+ }
144
+ });
145
+ if (TheIcon)
146
+ return (React.createElement(React.Fragment, null,
147
+ React.createElement(TheIcon, { className: props.className ? props.className : "tw-h-6 tw-w-6 tw-text-white", "aria-hidden": "true" })));
148
+ else
149
+ return (React.createElement(React.Fragment, null));
161
150
  };
162
151
 
163
152
  var LayerContext = createContext({
@@ -202,20 +191,358 @@ var useAddLayer = function () {
202
191
  return addLayer;
203
192
  };
204
193
 
194
+ var AuthContext = createContext({
195
+ isAuthenticated: false,
196
+ user: null,
197
+ login: function () { return Promise.reject(); },
198
+ register: function () { return Promise.reject(); },
199
+ loading: false,
200
+ logout: function () { return Promise.reject(); },
201
+ updateUser: function () { return Promise.reject(); },
202
+ token: ""
203
+ });
204
+ var AuthProvider = function (_a) {
205
+ var userApi = _a.userApi, children = _a.children;
206
+ var _b = useState(null), user = _b[0], setUser = _b[1];
207
+ var _c = useState(null), token = _c[0], setToken = _c[1];
208
+ var _d = useState(false), loading = _d[0], setLoading = _d[1];
209
+ var isAuthenticated = !!user;
210
+ useEffect(function () {
211
+ setLoading(true);
212
+ loadUser();
213
+ setLoading(false);
214
+ }, []);
215
+ function loadUser() {
216
+ return __awaiter(this, void 0, void 0, function () {
217
+ var token_1, me;
218
+ return __generator(this, function (_a) {
219
+ switch (_a.label) {
220
+ case 0:
221
+ _a.trys.push([0, 5, , 6]);
222
+ return [4 /*yield*/, userApi.getToken()];
223
+ case 1:
224
+ token_1 = _a.sent();
225
+ setToken(token_1);
226
+ if (!token_1) return [3 /*break*/, 3];
227
+ return [4 /*yield*/, userApi.getUser()];
228
+ case 2:
229
+ me = _a.sent();
230
+ setUser(me);
231
+ setLoading(false);
232
+ return [2 /*return*/, me];
233
+ case 3: return [2 /*return*/, undefined];
234
+ case 4: return [3 /*break*/, 6];
235
+ case 5:
236
+ _a.sent();
237
+ setLoading(false);
238
+ return [2 /*return*/, undefined];
239
+ case 6: return [2 /*return*/];
240
+ }
241
+ });
242
+ });
243
+ }
244
+ var login = function (credentials) { return __awaiter(void 0, void 0, void 0, function () {
245
+ var res, error_2;
246
+ return __generator(this, function (_a) {
247
+ switch (_a.label) {
248
+ case 0:
249
+ setLoading(true);
250
+ _a.label = 1;
251
+ case 1:
252
+ _a.trys.push([1, 4, , 5]);
253
+ return [4 /*yield*/, userApi.login(credentials.email, credentials.password)];
254
+ case 2:
255
+ res = _a.sent();
256
+ setToken(res.access_token);
257
+ return [4 /*yield*/, loadUser()];
258
+ case 3: return [2 /*return*/, (_a.sent())];
259
+ case 4:
260
+ error_2 = _a.sent();
261
+ setLoading(false);
262
+ throw error_2;
263
+ case 5:
264
+ return [2 /*return*/];
265
+ }
266
+ });
267
+ }); };
268
+ var register = function (credentials, userName) { return __awaiter(void 0, void 0, void 0, function () {
269
+ var error_3;
270
+ return __generator(this, function (_a) {
271
+ switch (_a.label) {
272
+ case 0:
273
+ setLoading(true);
274
+ _a.label = 1;
275
+ case 1:
276
+ _a.trys.push([1, 4, , 5]);
277
+ return [4 /*yield*/, userApi.register(credentials.email, credentials.password, userName)];
278
+ case 2:
279
+ _a.sent();
280
+ return [4 /*yield*/, login(credentials)];
281
+ case 3: return [2 /*return*/, (_a.sent())];
282
+ case 4:
283
+ error_3 = _a.sent();
284
+ setLoading(false);
285
+ throw error_3;
286
+ case 5:
287
+ return [2 /*return*/];
288
+ }
289
+ });
290
+ }); };
291
+ var logout = function () { return __awaiter(void 0, void 0, void 0, function () {
292
+ var error_4;
293
+ return __generator(this, function (_a) {
294
+ switch (_a.label) {
295
+ case 0:
296
+ _a.trys.push([0, 2, , 3]);
297
+ return [4 /*yield*/, userApi.logout()];
298
+ case 1:
299
+ _a.sent();
300
+ setUser(null);
301
+ return [3 /*break*/, 3];
302
+ case 2:
303
+ error_4 = _a.sent();
304
+ setLoading(false);
305
+ throw error_4;
306
+ case 3:
307
+ return [2 /*return*/];
308
+ }
309
+ });
310
+ }); };
311
+ var updateUser = function (user) { return __awaiter(void 0, void 0, void 0, function () {
312
+ var userRest, res, error_5;
313
+ return __generator(this, function (_a) {
314
+ switch (_a.label) {
315
+ case 0:
316
+ setLoading(true);
317
+ user.id, userRest = __rest(user, ["id"]);
318
+ _a.label = 1;
319
+ case 1:
320
+ _a.trys.push([1, 3, , 4]);
321
+ return [4 /*yield*/, userApi.updateUser(userRest)];
322
+ case 2:
323
+ res = _a.sent();
324
+ setUser(res);
325
+ setLoading(false);
326
+ return [2 /*return*/, res];
327
+ case 3:
328
+ error_5 = _a.sent();
329
+ setLoading(false);
330
+ throw error_5;
331
+ case 4:
332
+ return [2 /*return*/];
333
+ }
334
+ });
335
+ }); };
336
+ return (React.createElement(AuthContext.Provider, { value: { isAuthenticated: isAuthenticated, user: user, login: login, register: register, loading: loading, logout: logout, updateUser: updateUser, token: token } }, children));
337
+ };
338
+ var useAuth = function () { return useContext(AuthContext); };
339
+
340
+ function ErrorText(_a) {
341
+ var styleClass = _a.styleClass, children = _a.children;
342
+ return (React.createElement("p", { className: "tw-text-center tw-text-error ".concat(styleClass) }, children));
343
+ }
344
+
345
+ function TextInput(_a) {
346
+ var labelTitle = _a.labelTitle, labelStyle = _a.labelStyle, type = _a.type, dataField = _a.dataField, containerStyle = _a.containerStyle, inputStyle = _a.inputStyle, defaultValue = _a.defaultValue, placeholder = _a.placeholder, updateFormValue = _a.updateFormValue;
347
+ return (React.createElement("div", { className: "tw-form-control tw-w-full ".concat(containerStyle) },
348
+ labelTitle ? React.createElement("label", { className: "tw-label" },
349
+ React.createElement("span", { className: "tw-label-text tw-text-base-content " + labelStyle }, labelTitle))
350
+ : " ",
351
+ React.createElement("input", { required: true, type: type || "text", name: dataField, defaultValue: defaultValue, placeholder: placeholder || "", onChange: function (e) { return updateFormValue && updateFormValue(e.target.value); }, className: "tw-input tw-input-bordered tw-w-full ".concat(inputStyle ? inputStyle : "") })));
352
+ }
353
+
354
+ function LoginPage() {
355
+ var INITIAL_LOGIN_OBJ = {
356
+ password: "",
357
+ emailId: ""
358
+ };
359
+ var _a = useState(false), loading = _a[0], setLoading = _a[1];
360
+ var _b = useState(""), errorMessage = _b[0], setErrorMessage = _b[1];
361
+ var _c = useState(INITIAL_LOGIN_OBJ), loginObj = _c[0]; _c[1];
362
+ var submitForm = function (e) {
363
+ e.preventDefault();
364
+ setErrorMessage("");
365
+ if (loginObj.emailId.trim() === "")
366
+ return setErrorMessage("Email Id is required! (use any value)");
367
+ if (loginObj.password.trim() === "")
368
+ return setErrorMessage("Password is required! (use any value)");
369
+ else {
370
+ setLoading(true);
371
+ // Call API to check user credentials and save token in localstorage
372
+ localStorage.setItem("token", "DumyTokenHere");
373
+ setLoading(false);
374
+ window.location.href = '/app/welcome';
375
+ }
376
+ };
377
+ var updateFormValue = function (val) {
378
+ console.log(val);
379
+ };
380
+ return (React.createElement("div", { className: "tw-flex-1 tw-bg-base-200 tw-flex tw-items-center" },
381
+ React.createElement("div", { className: "tw-card tw-mx-auto tw-w-full tw-max-w-md tw-shadow-xl" },
382
+ React.createElement("div", { className: "tw-grid md:tw-grid-cols-1 tw-grid-cols-1 tw-bg-base-100 tw-rounded-xl" },
383
+ React.createElement("div", { className: 'tw-py-10 tw-px-10' },
384
+ React.createElement("h2", { className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, "Login"),
385
+ React.createElement("form", { onSubmit: function (e) { return submitForm(e); } },
386
+ React.createElement("div", { className: "tw-mb-4" },
387
+ React.createElement(TextInput, { type: "email", defaultValue: loginObj.emailId, containerStyle: "tw-mt-4", labelTitle: "E-Mail", updateFormValue: function (v) { return updateFormValue(v); } }),
388
+ React.createElement(TextInput, { defaultValue: loginObj.password, type: "password", containerStyle: "tw-mt-4", labelTitle: "Password", updateFormValue: function (v) { return updateFormValue(v); } })),
389
+ React.createElement("div", { className: 'tw-text-right tw-text-primary' },
390
+ React.createElement(Link, { to: "/forgot-password" },
391
+ React.createElement("span", { className: "tw-text-sm tw-inline-block hover:tw-text-primary hover:tw-underline hover:tw-cursor-pointer tw-transition tw-duration-200" }, "Forgot Password?"))),
392
+ React.createElement(ErrorText, { styleClass: "mt-8" }, errorMessage),
393
+ React.createElement("button", { type: "submit", className: "tw-btn tw-mt-2 tw-w-full tw-btn-primary" + (loading ? " tw-loading" : "") }, "Login"),
394
+ React.createElement("div", { className: 'tw-text-center tw-mt-4' },
395
+ "Don't have an account yet? ",
396
+ React.createElement(Link, { to: "/signup" },
397
+ React.createElement("span", { className: " tw-inline-block hover:tw-text-primary hover:tw-underline hover:tw-cursor-pointer tw-transition tw-duration-200" }, "Sign Up")))))))));
398
+ }
399
+
400
+ function SignupPage() {
401
+ var INITIAL_REGISTER_OBJ = {
402
+ name: "",
403
+ password: "",
404
+ emailId: ""
405
+ };
406
+ var _a = useState(false), loading = _a[0], setLoading = _a[1];
407
+ var _b = useState(""), errorMessage = _b[0], setErrorMessage = _b[1];
408
+ var _c = useState(INITIAL_REGISTER_OBJ), registerObj = _c[0]; _c[1];
409
+ var submitForm = function (e) {
410
+ e.preventDefault();
411
+ setErrorMessage("");
412
+ if (registerObj.name.trim() === "")
413
+ return setErrorMessage("Name is required! (use any value)");
414
+ if (registerObj.emailId.trim() === "")
415
+ return setErrorMessage("Email Id is required! (use any value)");
416
+ if (registerObj.password.trim() === "")
417
+ return setErrorMessage("Password is required! (use any value)");
418
+ else {
419
+ setLoading(true);
420
+ // Call API to check user credentials and save token in localstorage
421
+ localStorage.setItem("token", "DumyTokenHere");
422
+ setLoading(false);
423
+ window.location.href = '/app/welcome';
424
+ }
425
+ };
426
+ var updateFormValue = function (val) {
427
+ console.log(val);
428
+ };
429
+ return (React.createElement("div", { className: "tw-flex-1 tw-bg-base-200 tw-flex tw-items-center" },
430
+ React.createElement("div", { className: "tw-card tw-mx-auto tw-w-full tw-max-w-md tw-shadow-xl" },
431
+ React.createElement("div", { className: "tw-grid md:tw-grid-cols-1 tw-grid-cols-1 tw-bg-base-100 tw-rounded-xl" },
432
+ React.createElement("div", { className: 'tw-py-10 tw-px-10' },
433
+ React.createElement("h2", { className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, "Sign Up"),
434
+ React.createElement("form", { onSubmit: function (e) { return submitForm(e); } },
435
+ React.createElement("div", { className: "mb-4" },
436
+ React.createElement(TextInput, { defaultValue: registerObj.name, containerStyle: "tw-mt-4", labelTitle: "Name", updateFormValue: updateFormValue }),
437
+ React.createElement(TextInput, { defaultValue: registerObj.emailId, containerStyle: "tw-mt-4", labelTitle: "E-Mail", updateFormValue: updateFormValue }),
438
+ React.createElement(TextInput, { defaultValue: registerObj.password, type: "password", containerStyle: "tw-mt-4", labelTitle: "Password", updateFormValue: updateFormValue })),
439
+ React.createElement(ErrorText, { styleClass: "tw-mt-8" }, errorMessage),
440
+ React.createElement("button", { type: "submit", className: "tw-btn tw-mt-2 tw-w-full tw-btn-primary" + (loading ? " tw-loading" : "") }, "Register"),
441
+ React.createElement("div", { className: 'tw-text-center tw-mt-4' },
442
+ "Already have an account? ",
443
+ React.createElement(Link, { to: "/login" },
444
+ React.createElement("span", { className: " tw-inline-block hover:tw-text-primary hover:tw-underline hover:tw-cursor-pointer tw-transition tw-duration-200" }, "Login")))))))));
445
+ }
446
+
447
+ var PermissionContext = createContext({
448
+ permissions: [],
449
+ setPermissionApi: function () { },
450
+ setPermissionData: function () { },
451
+ setAdminRole: function () { },
452
+ hasUserPermission: function () { return true; }
453
+ });
454
+ function usePermissionsManager(initialPermissions) {
455
+ var _this = this;
456
+ var _a = useReducer(function (state, action) {
457
+ switch (action.type) {
458
+ case "ADD":
459
+ var exist = state.find(function (permission) {
460
+ return permission.id === action.permission.id ? true : false;
461
+ });
462
+ if (!exist)
463
+ return __spreadArray(__spreadArray([], state, true), [
464
+ action.permission,
465
+ ], false);
466
+ else
467
+ return state;
468
+ case "REMOVE":
469
+ return state.filter(function (_a) {
470
+ var id = _a.id;
471
+ return id !== action.id;
472
+ });
473
+ default:
474
+ throw new Error();
475
+ }
476
+ }, initialPermissions), permissions = _a[0], dispatch = _a[1];
477
+ var _b = React.useState(null), adminRole = _b[0], setAdminRole = _b[1];
478
+ var user = useAuth().user;
479
+ var setPermissionApi = useCallback(function (api) { return __awaiter(_this, void 0, void 0, function () {
480
+ var result;
481
+ return __generator(this, function (_a) {
482
+ switch (_a.label) {
483
+ case 0: return [4 /*yield*/, api.getItems()];
484
+ case 1:
485
+ result = _a.sent();
486
+ if (result) {
487
+ result.map(function (permission) {
488
+ dispatch({ type: "ADD", permission: permission });
489
+ });
490
+ }
491
+ return [2 /*return*/];
492
+ }
493
+ });
494
+ }); }, []);
495
+ var setPermissionData = useCallback(function (data) {
496
+ data.map(function (permission) {
497
+ dispatch({ type: "ADD", permission: permission });
498
+ });
499
+ }, []);
500
+ var hasUserPermission = useCallback(function (collectionName, action) {
501
+ if (permissions.length == 0)
502
+ return true;
503
+ else if (user && user.role == adminRole)
504
+ return true;
505
+ else
506
+ return permissions.some(function (p) { return p.action === action && p.collection === collectionName && p.role == (user === null || user === void 0 ? void 0 : user.role); });
507
+ }, [permissions, user]);
508
+ return { permissions: permissions, setPermissionApi: setPermissionApi, setPermissionData: setPermissionData, setAdminRole: setAdminRole, hasUserPermission: hasUserPermission };
509
+ }
510
+ var PermissionsProvider = function (_a) {
511
+ var initialPermissions = _a.initialPermissions, children = _a.children;
512
+ return (React.createElement(PermissionContext.Provider, { value: usePermissionsManager(initialPermissions) }, children));
513
+ };
514
+ var useSetPermissionApi = function () {
515
+ var setPermissionApi = useContext(PermissionContext).setPermissionApi;
516
+ return setPermissionApi;
517
+ };
518
+ var useSetPermissionData = function () {
519
+ var setPermissionData = useContext(PermissionContext).setPermissionData;
520
+ return setPermissionData;
521
+ };
522
+ var useHasUserPermission = function () {
523
+ var hasUserPermission = useContext(PermissionContext).hasUserPermission;
524
+ return hasUserPermission;
525
+ };
526
+ var useSetAdminRole = function () {
527
+ var setAdminRole = useContext(PermissionContext).setAdminRole;
528
+ return setAdminRole;
529
+ };
530
+
205
531
  function AddButton(_a) {
206
- var setSelectMode = _a.setSelectMode;
532
+ var setSelectNewItemPosition = _a.setSelectNewItemPosition;
207
533
  var layers = useLayers();
208
- return (React.createElement("div", { className: "tw-dropdown tw-dropdown-top tw-dropdown-end tw-dropdown-hover tw-z-500 tw-absolute tw-right-5 tw-bottom-5" },
209
- React.createElement("button", { tabIndex: 0, className: "tw-z-500 tw-border-0 tw-m-0 tw-mt-2 tw-p-0 tw-w-14 tw-h-14 tw-cursor-pointer tw-bg-white tw-rounded-full hover:tw-bg-gray-100 tw-mouse tw-drop-shadow-md tw-transition tw-ease-in tw-duration-200 focus:tw-outline-none" },
210
- React.createElement("svg", { viewBox: "0 0 20 20", enableBackground: "new 0 0 20 20", className: "tw-w-6 tw-h-6 tw-inline-block" },
211
- React.createElement("path", { fill: "#2e8555", d: "M16,10c0,0.553-0.048,1-0.601,1H11v4.399C11,15.951,10.553,16,10,16c-0.553,0-1-0.049-1-0.601V11H4.601\n C4.049,11,4,10.553,4,10c0-0.553,0.049-1,0.601-1H9V4.601C9,4.048,9.447,4,10,4c0.553,0,1,0.048,1,0.601V9h4.399\n C15.952,9,16,9.447,16,10z" }))),
212
- React.createElement("ul", { tabIndex: 0, className: "tw-dropdown-content tw-pr-2 tw-mb-0 tw-list-none" }, layers.map(function (layer) {
534
+ var hasUserPermission = useHasUserPermission();
535
+ return (React.createElement("div", { className: "tw-dropdown tw-dropdown-top tw-dropdown-end tw-dropdown-hover tw-z-500 tw-absolute tw-right-4 tw-bottom-4" },
536
+ React.createElement("label", { tabIndex: 0, className: "tw-z-500 tw-btn tw-btn-circle tw-shadow tw-bg-base-100" },
537
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: "2", stroke: "currentColor", className: "tw-w-5 tw-h-5" },
538
+ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4.5v15m7.5-7.5h-15" }))),
539
+ React.createElement("ul", { tabIndex: 0, className: "tw-dropdown-content tw-pr-1 tw-list-none" }, layers.map(function (layer) {
213
540
  var _a;
214
- return (((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && (React.createElement("li", { key: layer.name },
541
+ return (((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && hasUserPermission(layer.api.collectionName, "create") && (React.createElement("li", { key: layer.name },
215
542
  React.createElement("a", null,
216
543
  React.createElement("div", { className: "tw-tooltip tw-tooltip-left", "data-tip": layer.menuText },
217
- React.createElement("button", { tabIndex: 0, className: "tw-z-500 tw-border-0 tw-pl-2 tw-p-0 tw-mb-2 tw-mt-2 tw-w-10 tw-h-10 tw-cursor-pointer tw-rounded-full tw-mouse tw-drop-shadow-md tw-transition tw-ease-in tw-duration-200 focus:tw-outline-none", style: { backgroundColor: layer.menuColor }, onClick: function () { setSelectMode(layer); } },
218
- React.createElement(DynamicHeroIcon, { icon: layer.menuIcon })))))));
544
+ React.createElement("button", { tabIndex: 0, className: "tw-z-500 tw-border-0 tw-pl-2 tw-p-0 tw-mb-3 tw-w-10 tw-h-10 tw-cursor-pointer tw-rounded-full tw-mouse tw-drop-shadow-md tw-transition tw-ease-in tw-duration-200 focus:tw-outline-none", style: { backgroundColor: layer.menuColor }, onClick: function () { setSelectNewItemPosition(layer); } },
545
+ React.createElement(DynamicHeroIcon, { type: 'solid', icon: layer.menuIcon })))))));
219
546
  }))));
220
547
  }
221
548
 
@@ -224,9 +551,13 @@ var ItemContext = createContext({
224
551
  addItem: function () { },
225
552
  updateItem: function () { },
226
553
  removeItem: function () { },
227
- resetItems: function () { }
554
+ resetItems: function () { },
555
+ setItemsApi: function () { },
556
+ setItemsData: function () { },
228
557
  });
229
558
  function useItemsManager(initialItems) {
559
+ var _this = this;
560
+ var addLayer = useAddLayer();
230
561
  var _a = useReducer(function (state, action) {
231
562
  switch (action.type) {
232
563
  case "ADD":
@@ -249,23 +580,63 @@ function useItemsManager(initialItems) {
249
580
  case "REMOVE":
250
581
  return state.filter(function (item) { return item !== action.item; });
251
582
  case "RESET":
252
- return state.filter(function (item) { return item.layer.name !== action.layer.name; });
583
+ return state.filter(function (item) { var _a; return ((_a = item.layer) === null || _a === void 0 ? void 0 : _a.name) !== action.layer.name; });
253
584
  default:
254
585
  throw new Error();
255
586
  }
256
587
  }, initialItems), items = _a[0], dispatch = _a[1];
257
- var addItem = useCallback(function (item) {
258
- dispatch({
259
- type: "ADD",
260
- item: item,
588
+ var setItemsApi = useCallback(function (layer) { return __awaiter(_this, void 0, void 0, function () {
589
+ var result;
590
+ var _a;
591
+ return __generator(this, function (_b) {
592
+ switch (_b.label) {
593
+ case 0:
594
+ ((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && addLayer(layer);
595
+ return [4 /*yield*/, toast.promise(layer.api.getItems(), {
596
+ pending: "loading ".concat(layer.name, " ..."),
597
+ success: "".concat(layer.name, " loaded"),
598
+ error: {
599
+ render: function (_a) {
600
+ var data = _a.data;
601
+ return "".concat(data);
602
+ },
603
+ },
604
+ })];
605
+ case 1:
606
+ result = _b.sent();
607
+ if (result) {
608
+ result.map(function (item) {
609
+ dispatch({ type: "ADD", item: __assign(__assign({}, item), { layer: layer }) });
610
+ });
611
+ }
612
+ return [2 /*return*/];
613
+ }
261
614
  });
262
- }, []);
263
- var updateItem = useCallback(function (item) {
264
- dispatch({
265
- type: "UPDATE",
266
- item: item,
615
+ }); }, []);
616
+ var setItemsData = useCallback(function (layer) {
617
+ var _a;
618
+ (_a = layer.data) === null || _a === void 0 ? void 0 : _a.map(function (item) {
619
+ dispatch({ type: "ADD", item: __assign(__assign({}, item), { layer: layer }) });
267
620
  });
268
621
  }, []);
622
+ var addItem = useCallback(function (item) { return __awaiter(_this, void 0, void 0, function () {
623
+ return __generator(this, function (_a) {
624
+ dispatch({
625
+ type: "ADD",
626
+ item: item,
627
+ });
628
+ return [2 /*return*/];
629
+ });
630
+ }); }, []);
631
+ var updateItem = useCallback(function (item) { return __awaiter(_this, void 0, void 0, function () {
632
+ return __generator(this, function (_a) {
633
+ dispatch({
634
+ type: "UPDATE",
635
+ item: item,
636
+ });
637
+ return [2 /*return*/];
638
+ });
639
+ }); }, []);
269
640
  var removeItem = useCallback(function (item) {
270
641
  dispatch({
271
642
  type: "REMOVE",
@@ -278,7 +649,7 @@ function useItemsManager(initialItems) {
278
649
  layer: layer
279
650
  });
280
651
  }, []);
281
- return { items: items, updateItem: updateItem, addItem: addItem, removeItem: removeItem, resetItems: resetItems };
652
+ return { items: items, updateItem: updateItem, addItem: addItem, removeItem: removeItem, resetItems: resetItems, setItemsApi: setItemsApi, setItemsData: setItemsData };
282
653
  }
283
654
  var ItemsProvider = function (_a) {
284
655
  var initialItems = _a.initialItems, children = _a.children;
@@ -300,51 +671,101 @@ var useRemoveItem = function () {
300
671
  var removeItem = useContext(ItemContext).removeItem;
301
672
  return removeItem;
302
673
  };
303
- var useResetItems = function () {
304
- var resetItems = useContext(ItemContext).resetItems;
305
- return resetItems;
674
+ var useSetItemsApi = function () {
675
+ var setItemsApi = useContext(ItemContext).setItemsApi;
676
+ return setItemsApi;
677
+ };
678
+ var useSetItemsData = function () {
679
+ var setItemsData = useContext(ItemContext).setItemsData;
680
+ return setItemsData;
306
681
  };
307
682
 
683
+ var hashTagRegex = /(#+[a-zA-Z0-9A-Za-zÀ-ÖØ-öø-ʸ(_)]{1,})/g;
684
+
308
685
  var TagContext = createContext({
309
686
  tags: [],
310
687
  addTag: function () { },
311
- removeTag: function () { }
688
+ removeTag: function () { },
689
+ setTagApi: function () { },
690
+ setTagData: function () { },
691
+ getItemTags: function () { return []; }
312
692
  });
313
693
  function useTagsManager(initialTags) {
694
+ var _this = this;
314
695
  var _a = useReducer(function (state, action) {
315
696
  switch (action.type) {
316
697
  case "ADD":
317
698
  var exist = state.find(function (tag) {
318
- return tag.id === action.tag.id ? true : false;
699
+ return tag.id.toLocaleLowerCase() === action.tag.id.toLocaleLowerCase() ? true : false;
319
700
  });
320
701
  if (!exist)
321
702
  return __spreadArray(__spreadArray([], state, true), [
322
- action.tag,
703
+ __assign(__assign({}, action.tag), { id: action.tag.id.toLocaleLowerCase() })
323
704
  ], false);
324
705
  else
325
706
  return state;
326
707
  case "REMOVE":
327
708
  return state.filter(function (_a) {
328
709
  var id = _a.id;
329
- return id !== action.id;
710
+ return id !== action.id.toLocaleLowerCase();
330
711
  });
331
712
  default:
332
713
  throw new Error();
333
714
  }
334
715
  }, initialTags), tags = _a[0], dispatch = _a[1];
335
- var addTag = useCallback(function (tag) {
716
+ var _b = React.useState({}), api = _b[0], setApi = _b[1];
717
+ var setTagApi = useCallback(function (api) { return __awaiter(_this, void 0, void 0, function () {
718
+ var result;
719
+ return __generator(this, function (_a) {
720
+ switch (_a.label) {
721
+ case 0:
722
+ setApi(api);
723
+ return [4 /*yield*/, api.getItems()];
724
+ case 1:
725
+ result = _a.sent();
726
+ if (result) {
727
+ result.map(function (tag) {
728
+ tag.id = tag.id.toLocaleLowerCase();
729
+ dispatch({ type: "ADD", tag: tag });
730
+ });
731
+ }
732
+ return [2 /*return*/];
733
+ }
734
+ });
735
+ }); }, []);
736
+ var setTagData = useCallback(function (data) {
737
+ data.map(function (tag) {
738
+ tag.id = tag.id.toLocaleLowerCase();
739
+ dispatch({ type: "ADD", tag: tag });
740
+ });
741
+ }, []);
742
+ var addTag = function (tag) {
336
743
  dispatch({
337
744
  type: "ADD",
338
745
  tag: tag,
339
746
  });
340
- }, []);
747
+ if (!tags.some(function (t) { return t.id.toLocaleLowerCase() === tag.id.toLocaleLowerCase(); })) {
748
+ (api === null || api === void 0 ? void 0 : api.createItem) && api.createItem(tag);
749
+ }
750
+ };
341
751
  var removeTag = useCallback(function (id) {
342
752
  dispatch({
343
753
  type: "REMOVE",
344
754
  id: id,
345
755
  });
756
+ (api === null || api === void 0 ? void 0 : api.deleteItem) && api.deleteItem(id);
346
757
  }, []);
347
- return { tags: tags, addTag: addTag, removeTag: removeTag };
758
+ var getItemTags = useCallback(function (item) {
759
+ var itemTagStrings = item.text.toLocaleLowerCase().match(hashTagRegex);
760
+ var itemTags = [];
761
+ itemTagStrings === null || itemTagStrings === void 0 ? void 0 : itemTagStrings.map(function (tag) {
762
+ if (tags.find(function (t) { return t.id === tag.slice(1); })) {
763
+ itemTags.push(tags.find(function (t) { return t.id === tag.slice(1); }));
764
+ }
765
+ });
766
+ return itemTags;
767
+ }, [tags]);
768
+ return { tags: tags, addTag: addTag, removeTag: removeTag, setTagApi: setTagApi, setTagData: setTagData, getItemTags: getItemTags };
348
769
  }
349
770
  var TagsProvider = function (_a) {
350
771
  var initialTags = _a.initialTags, children = _a.children;
@@ -357,49 +778,359 @@ var useTags = function () {
357
778
  var useAddTag = function () {
358
779
  var addTag = useContext(TagContext).addTag;
359
780
  return addTag;
781
+ };
782
+ var useSetTagApi = function () {
783
+ var setTagApi = useContext(TagContext).setTagApi;
784
+ return setTagApi;
785
+ };
786
+ var useSetTagData = function () {
787
+ var setTagData = useContext(TagContext).setTagData;
788
+ return setTagData;
789
+ };
790
+ var useGetItemTags = function () {
791
+ var getItemTags = useContext(TagContext).getItemTags;
792
+ return getItemTags;
360
793
  };
361
794
 
362
- function MapEventListener(props) {
363
- useMapEvents({
364
- click: function (e) {
365
- console.log(e.latlng.lat + ',' + e.latlng.lng);
366
- if (props.selectMode != null) {
367
- props.setItemFormPopup({ layer: props.selectMode, position: e.latlng });
368
- props.setSelectMode(null);
795
+ var FilterContext = createContext({
796
+ filterTags: [],
797
+ searchPhrase: "",
798
+ visibleLayers: [],
799
+ addFilterTag: function () { },
800
+ removeFilterTag: function () { },
801
+ resetFilterTags: function () { },
802
+ setSearchPhrase: function () { },
803
+ addVisibleLayer: function () { },
804
+ toggleVisibleLayer: function () { },
805
+ resetVisibleLayers: function () { },
806
+ isLayerVisible: function () { return true; }
807
+ });
808
+ function useFilterManager(initialTags) {
809
+ var _a = useReducer(function (state, action) {
810
+ switch (action.type) {
811
+ case "ADD_TAG":
812
+ var exist = state.find(function (tag) {
813
+ return tag.id === action.tag.id ? true : false;
814
+ });
815
+ if (!exist)
816
+ return __spreadArray(__spreadArray([], state, true), [
817
+ action.tag,
818
+ ], false);
819
+ else
820
+ return state;
821
+ case "REMOVE_TAG":
822
+ return state.filter(function (_a) {
823
+ var id = _a.id;
824
+ return id !== action.id;
825
+ });
826
+ case "RESET_TAGS":
827
+ return initialTags;
828
+ default:
829
+ throw new Error();
830
+ }
831
+ }, initialTags), filterTags = _a[0], dispatchTags = _a[1];
832
+ var initialLayers = useLayers();
833
+ var _b = useReducer(function (state, action) {
834
+ switch (action.type) {
835
+ case "ADD_LAYER":
836
+ var exist1 = state.find(function (layer) {
837
+ return layer.name === action.layer.name ? true : false;
838
+ });
839
+ if (!exist1)
840
+ return __spreadArray(__spreadArray([], state, true), [
841
+ action.layer,
842
+ ], false);
843
+ else
844
+ return state;
845
+ case "TOGGLE_LAYER":
846
+ var exist2 = state.some(function (layer) {
847
+ return layer.name === action.layer.name;
848
+ });
849
+ if (exist2)
850
+ return state.filter(function (_a) {
851
+ var name = _a.name;
852
+ return name != action.layer.name;
853
+ });
854
+ else
855
+ return __spreadArray(__spreadArray([], state, true), [action.layer], false);
856
+ case "RESET_LAYERS":
857
+ return initialLayers;
858
+ default:
859
+ throw new Error();
860
+ }
861
+ }, initialLayers), visibleLayers = _b[0], dispatchLayers = _b[1];
862
+ var _c = React.useState(""), searchPhrase = _c[0], searchPhraseSet = _c[1];
863
+ var addFilterTag = function (tag) {
864
+ dispatchTags({
865
+ type: "ADD_TAG",
866
+ tag: tag,
867
+ });
868
+ };
869
+ var removeFilterTag = useCallback(function (id) {
870
+ dispatchTags({
871
+ type: "REMOVE_TAG",
872
+ id: id,
873
+ });
874
+ }, []);
875
+ var resetFilterTags = useCallback(function () {
876
+ dispatchTags({
877
+ type: "RESET_TAGS",
878
+ });
879
+ }, []);
880
+ var addVisibleLayer = function (layer) {
881
+ dispatchLayers({
882
+ type: "ADD_LAYER",
883
+ layer: layer,
884
+ });
885
+ };
886
+ var toggleVisibleLayer = function (layer) {
887
+ dispatchLayers({
888
+ type: "TOGGLE_LAYER",
889
+ layer: layer,
890
+ });
891
+ };
892
+ var resetVisibleLayers = useCallback(function () {
893
+ dispatchLayers({
894
+ type: "RESET_LAYERS",
895
+ });
896
+ }, []);
897
+ var isLayerVisible = useCallback(function (layer) {
898
+ return visibleLayers.some(function (l) { return l.name === layer.name; });
899
+ }, [visibleLayers]);
900
+ var setSearchPhrase = useCallback(function (phrase) {
901
+ searchPhraseSet(phrase);
902
+ }, []);
903
+ return { filterTags: filterTags, addFilterTag: addFilterTag, removeFilterTag: removeFilterTag, resetFilterTags: resetFilterTags, setSearchPhrase: setSearchPhrase, searchPhrase: searchPhrase, visibleLayers: visibleLayers, toggleVisibleLayer: toggleVisibleLayer, resetVisibleLayers: resetVisibleLayers, isLayerVisible: isLayerVisible, addVisibleLayer: addVisibleLayer };
904
+ }
905
+ var FilterProvider = function (_a) {
906
+ var initialTags = _a.initialTags, children = _a.children;
907
+ return (React.createElement(FilterContext.Provider, { value: useFilterManager(initialTags) }, children));
908
+ };
909
+ var useFilterTags = function () {
910
+ var filterTags = useContext(FilterContext).filterTags;
911
+ return filterTags;
912
+ };
913
+ var useAddFilterTag = function () {
914
+ var addFilterTag = useContext(FilterContext).addFilterTag;
915
+ return addFilterTag;
916
+ };
917
+ var useRemoveFilterTag = function () {
918
+ var removeFilterTag = useContext(FilterContext).removeFilterTag;
919
+ return removeFilterTag;
920
+ };
921
+ var useResetFilterTags = function () {
922
+ var resetFilterTags = useContext(FilterContext).resetFilterTags;
923
+ return resetFilterTags;
924
+ };
925
+ var useSearchPhrase = function () {
926
+ var searchPhrase = useContext(FilterContext).searchPhrase;
927
+ return searchPhrase;
928
+ };
929
+ var useSetSearchPhrase = function () {
930
+ var setSearchPhrase = useContext(FilterContext).setSearchPhrase;
931
+ return setSearchPhrase;
932
+ };
933
+ var useAddVisibleLayer = function () {
934
+ var addVisibleLayer = useContext(FilterContext).addVisibleLayer;
935
+ return addVisibleLayer;
936
+ };
937
+ var useToggleVisibleLayer = function () {
938
+ var toggleVisibleLayer = useContext(FilterContext).toggleVisibleLayer;
939
+ return toggleVisibleLayer;
940
+ };
941
+ var useIsLayerVisible = function () {
942
+ var isLayerVisible = useContext(FilterContext).isLayerVisible;
943
+ return isLayerVisible;
944
+ };
945
+
946
+ function getWindowDimensions() {
947
+ var width = window.innerWidth, height = window.innerHeight;
948
+ return {
949
+ width: width,
950
+ height: height
951
+ };
952
+ }
953
+ function useWindowDimensions() {
954
+ var _a = useState(getWindowDimensions()), windowDimensions = _a[0], setWindowDimensions = _a[1];
955
+ useEffect(function () {
956
+ function handleResize() {
957
+ setWindowDimensions(getWindowDimensions());
958
+ }
959
+ window.addEventListener('resize', handleResize);
960
+ return function () { return window.removeEventListener('resize', handleResize); };
961
+ }, []);
962
+ return windowDimensions;
963
+ }
964
+
965
+ function capitalizeFirstLetter(string) {
966
+ return string.charAt(0).toUpperCase() + string.slice(1);
967
+ }
968
+ var FilterControl = function () {
969
+ var windowDimensions = useWindowDimensions();
970
+ /**
971
+ const [popupOpen, setPopupOpen] = useState<boolean>(false);
972
+
973
+ useMapEvents({
974
+ popupopen: (e) => {
975
+ console.log(e);
976
+
977
+ setPopupOpen(true);
978
+ },
979
+ popupclose: () => {
980
+ setPopupOpen(false);
369
981
  }
370
- },
371
- resize: function () {
372
- console.log("resize");
982
+ })
983
+ */
984
+ var filterTags = useFilterTags();
985
+ var removeFilterTag = useRemoveFilterTag();
986
+ var setSearchPhrase = useSetSearchPhrase();
987
+ return (React.createElement(React.Fragment, null, !(
988
+ //popupOpen &&
989
+ windowDimensions.height < 500) &&
990
+ React.createElement("div", { className: 'tw-flex tw-flex-col tw-absolute tw-top-4 tw-left-4 tw-z-[699] tw-w-[calc(100vw-2rem)] tw-max-w-sm' },
991
+ React.createElement("input", { type: "text", placeholder: "search ...", className: "tw-input tw-input-bordered tw-w-full tw-shadow-xl tw-rounded-2xl", onChange: function (e) { return setSearchPhrase(e.target.value); } }),
992
+ React.createElement("div", { className: 'tw-flex tw-flex-wrap tw-mt-4' }, filterTags.map(function (tag) {
993
+ return React.createElement("div", { key: tag.id, className: 'tw-rounded-2xl tw-text-white tw-p-2 tw-px-4 tw-shadow-xl tw-card tw-mr-2 tw-mb-2', style: { backgroundColor: tag.color } },
994
+ React.createElement("div", { className: "tw-card-actions tw-justify-end" },
995
+ React.createElement("label", { className: "tw-btn tw-btn-xs tw-btn-circle tw-absolute tw--right-2 tw--top-2 tw-bg-white tw-text-gray-600", onClick: function () { return (removeFilterTag(tag.id)); } }, "\u2715")),
996
+ React.createElement("b", null,
997
+ "#",
998
+ capitalizeFirstLetter(tag.id)));
999
+ })))));
1000
+ };
1001
+
1002
+ var LeafletRefsContext = createContext({
1003
+ leafletRefs: {},
1004
+ addMarker: function () { },
1005
+ addPopup: function () { },
1006
+ });
1007
+ function useLeafletRefsManager(initialLeafletRefs) {
1008
+ var _a = useReducer(function (state, action) {
1009
+ var _a, _b;
1010
+ switch (action.type) {
1011
+ case "ADD_MARKER":
1012
+ return __assign(__assign({}, state), (_a = {}, _a[action.item.id] = __assign(__assign({}, state[action.item.id]), { marker: action.marker, item: action.item }), _a));
1013
+ case "ADD_POPUP":
1014
+ return __assign(__assign({}, state), (_b = {}, _b[action.item.id] = __assign(__assign({}, state[action.item.id]), { popup: action.popup, item: action.item }), _b));
1015
+ default:
1016
+ throw new Error();
373
1017
  }
374
- });
375
- return null;
1018
+ }, initialLeafletRefs), leafletRefs = _a[0], dispatch = _a[1];
1019
+ var addMarker = useCallback(function (item, marker) {
1020
+ dispatch({
1021
+ type: "ADD_MARKER",
1022
+ item: item,
1023
+ marker: marker
1024
+ });
1025
+ }, []);
1026
+ var addPopup = useCallback(function (item, popup) {
1027
+ dispatch({
1028
+ type: "ADD_POPUP",
1029
+ item: item,
1030
+ popup: popup
1031
+ });
1032
+ }, []);
1033
+ return { leafletRefs: leafletRefs, addMarker: addMarker, addPopup: addPopup };
376
1034
  }
1035
+ var LeafletRefsProvider = function (_a) {
1036
+ var initialLeafletRefs = _a.initialLeafletRefs, children = _a.children;
1037
+ return (React.createElement(LeafletRefsContext.Provider, { value: useLeafletRefsManager(initialLeafletRefs) }, children));
1038
+ };
1039
+ var useLeafletRefs = function () {
1040
+ var leafletRefs = useContext(LeafletRefsContext).leafletRefs;
1041
+ return leafletRefs;
1042
+ };
1043
+ var useAddMarker = function () {
1044
+ var addMarker = useContext(LeafletRefsContext).addMarker;
1045
+ return addMarker;
1046
+ };
1047
+ var useAddPopup = function () {
1048
+ var addPopup = useContext(LeafletRefsContext).addPopup;
1049
+ return addPopup;
1050
+ };
1051
+
1052
+ function LayerControl() {
1053
+ var _a = React.useState(false), open = _a[0], setOpen = _a[1];
1054
+ var layers = useLayers();
1055
+ useEffect(function () {
1056
+ layers.map(function (layer) {
1057
+ return addVisibleLayer(layer);
1058
+ });
1059
+ }, [layers]);
1060
+ var isLayerVisible = useIsLayerVisible();
1061
+ var toggleVisibleLayer = useToggleVisibleLayer();
1062
+ var addVisibleLayer = useAddVisibleLayer();
1063
+ return (React.createElement("div", { className: "tw-card tw-bg-base-100 tw-shadow-xl tw-absolute tw-bottom-4 tw-left-4 tw-z-1000 ", onClick: function (e) { return e.stopPropagation(); } }, open ?
1064
+ React.createElement("div", { className: "tw-card-body tw-p-2 tw-w-32 tw-transition-all tw-duration-300", onClick: function (e) { return e.stopPropagation(); } },
1065
+ React.createElement("label", { className: "tw-btn tw-btn-sm tw-rounded-2xl tw-btn-circle tw-btn-ghost hover:tw-bg-transparent tw-absolute tw-right-0 tw-top-0 tw-bg-white tw-text-gray-600", onClick: function () { return setOpen(false); } },
1066
+ React.createElement("p", { className: 'tw-text-center ' }, "\u2715")),
1067
+ React.createElement("ul", { className: 'tw-flex-row' }, layers.map(function (layer) {
1068
+ return React.createElement("li", { key: layer.name },
1069
+ React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-1" },
1070
+ React.createElement("input", { type: "checkbox", className: "tw-checkbox tw-checkbox-xs tw-checkbox-success", checked: isLayerVisible(layer), onChange: function () { return toggleVisibleLayer(layer); } }),
1071
+ React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, layer.name)));
1072
+ })))
1073
+ :
1074
+ React.createElement("div", { className: "tw-card-body tw-p-2 tw-h-10 tw-w-10 tw-transition-all tw-duration-300 hover:tw-cursor-pointer", onClick: function () { return setOpen(true); } },
1075
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 2, stroke: "currentColor", className: "w-6 h-6" },
1076
+ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" })))));
1077
+ }
1078
+
377
1079
  // for refreshing map on resize (needs to be implemented)
378
1080
  var mapDivRef = React.createRef();
379
- /** This is a description of the foo function. */
380
1081
  function UtopiaMap(_a) {
381
1082
  var _b = _a.height, height = _b === void 0 ? "500px" : _b, _c = _a.width, width = _c === void 0 ? "100%" : _c, _d = _a.center, center = _d === void 0 ? new LatLng(50.6, 9.5) : _d, _e = _a.zoom, zoom = _e === void 0 ? 10 : _e, children = _a.children;
382
- var _f = useState(null), selectMode = _f[0], setSelectMode = _f[1];
383
- var _g = useState(null), itemFormPopup = _g[0], setItemFormPopup = _g[1];
1083
+ var meta = document.getElementsByTagName('meta');
1084
+ var _f = useState(meta), metaTags = _f[0]; _f[1];
1085
+ function MapEventListener(props) {
1086
+ useMapEvents({
1087
+ click: function (e) {
1088
+ var _a, _b, _c;
1089
+ window.history.pushState({}, "", "/");
1090
+ document.title = document.title.split("-")[0];
1091
+ (_a = document.querySelector('meta[property="og:title"]')) === null || _a === void 0 ? void 0 : _a.setAttribute("content", document.title);
1092
+ (_b = document.querySelector('meta[property="og:description"]')) === null || _b === void 0 ? void 0 : _b.setAttribute("content", "".concat((_c = document.querySelector('meta[name="description"]')) === null || _c === void 0 ? void 0 : _c.getAttribute("content")));
1093
+ meta = metaTags;
1094
+ console.log(e.latlng.lat + ',' + e.latlng.lng);
1095
+ if (props.selectNewItemPosition != null) {
1096
+ props.setItemFormPopup({ layer: props.selectNewItemPosition, position: e.latlng });
1097
+ props.setSelectNewItemPosition(null);
1098
+ }
1099
+ },
1100
+ resize: function () {
1101
+ console.log("resize");
1102
+ },
1103
+ });
1104
+ return null;
1105
+ }
1106
+ var _g = useState(null), selectNewItemPosition = _g[0], setSelectNewItemPosition = _g[1];
1107
+ var _h = useState(null), itemFormPopup = _h[0], setItemFormPopup = _h[1];
1108
+ var clusterRef = React.useRef();
384
1109
  return (React.createElement(LayersProvider, { initialLayers: [] },
385
1110
  React.createElement(TagsProvider, { initialTags: [] },
386
- React.createElement(ItemsProvider, { initialItems: [] },
387
- React.createElement("div", { className: (selectMode != null ? "crosshair-cursor-enabled" : undefined) },
388
- React.createElement(MapContainer, { ref: mapDivRef, style: { height: height, width: width }, center: center, zoom: zoom },
389
- React.createElement(TileLayer, { attribution: '\u00A9 <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors', url: "https://tile.osmand.net/hd/{z}/{x}/{y}.png" }),
390
- React.createElement(MarkerClusterGroup, { showCoverageOnHover: true, chunkedLoading: true, maxClusterRadius: 50 }, React.Children.toArray(children).map(function (child) {
391
- return React.isValidElement(child) ? React.cloneElement(child, { setItemFormPopup: setItemFormPopup, itemFormPopup: itemFormPopup }) : child;
392
- })),
393
- React.createElement(MapEventListener, { setSelectMode: setSelectMode, selectMode: selectMode, setItemFormPopup: setItemFormPopup }),
394
- React.createElement(AddButton, { setSelectMode: setSelectMode })),
395
- selectMode != null &&
396
- React.createElement("div", { className: "tw-button tw-z-500 tw-absolute tw-right-5 tw-top-20 tw-drop-shadow-md" },
397
- React.createElement("div", { className: "tw-alert tw-bg-white tw-text-green-900" },
398
- React.createElement("div", null,
399
- React.createElement("span", null,
400
- "Select ",
401
- selectMode.name,
402
- " position!")))))))));
1111
+ React.createElement(PermissionsProvider, { initialPermissions: [] },
1112
+ React.createElement(FilterProvider, { initialTags: [] },
1113
+ React.createElement(ItemsProvider, { initialItems: [] },
1114
+ React.createElement(LeafletRefsProvider, { initialLeafletRefs: {} },
1115
+ React.createElement("div", { className: (selectNewItemPosition != null ? "crosshair-cursor-enabled" : undefined) },
1116
+ React.createElement(MapContainer, { ref: mapDivRef, style: { height: height, width: width }, center: center, zoom: zoom, zoomControl: false },
1117
+ React.createElement(FilterControl, null),
1118
+ React.createElement(LayerControl, null),
1119
+ React.createElement(TileLayer, { attribution: '\u00A9 <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors', url: "https://tile.osmand.net/hd/{z}/{x}/{y}.png" }),
1120
+ React.createElement(MarkerClusterGroup, { ref: clusterRef, showCoverageOnHover: true, chunkedLoading: true, maxClusterRadius: 50, removeOutsideVisibleBounds: false }, React.Children.toArray(children).map(function (child) {
1121
+ return React.isValidElement(child) ?
1122
+ React.cloneElement(child, { setItemFormPopup: setItemFormPopup, itemFormPopup: itemFormPopup, clusterRef: clusterRef }) : child;
1123
+ })),
1124
+ React.createElement(MapEventListener, { setSelectNewItemPosition: setSelectNewItemPosition, selectNewItemPosition: selectNewItemPosition, setItemFormPopup: setItemFormPopup })),
1125
+ React.createElement(AddButton, { setSelectNewItemPosition: setSelectNewItemPosition }),
1126
+ selectNewItemPosition != null &&
1127
+ React.createElement("div", { className: "tw-button tw-z-1000 tw-absolute tw-right-5 tw-top-4 tw-drop-shadow-md" },
1128
+ React.createElement("div", { className: "tw-alert tw-bg-base-100 tw-text-base-content" },
1129
+ React.createElement("div", null,
1130
+ React.createElement("span", null,
1131
+ "Select ",
1132
+ selectNewItemPosition.name,
1133
+ " position!"))))))))))));
403
1134
  }
404
1135
 
405
1136
  var createSvg = function (shape, markerColor, borderColor) {
@@ -432,232 +1163,634 @@ var MarkerIconFactory = function (shape, color1, color2, icon) {
432
1163
  });
433
1164
  };
434
1165
 
435
- function replaceURLs(message) {
436
- if (!message)
437
- return "";
438
- var urlRegex = /(^| )(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,10}(:[0-9]{1,10})?(\/.*)?$/gm;
1166
+ function HeaderView(_a) {
1167
+ var _this = this;
1168
+ var _b, _c, _d;
1169
+ var item = _a.item, setItemFormPopup = _a.setItemFormPopup;
1170
+ var _e = React.useState(false), loading = _e[0], setLoading = _e[1];
1171
+ var removeItem = useRemoveItem();
1172
+ var map = useMap();
1173
+ var hasUserPermission = useHasUserPermission();
1174
+ var removeItemFromMap = function (event) { return __awaiter(_this, void 0, void 0, function () {
1175
+ var success, error_1;
1176
+ var _a, _b;
1177
+ return __generator(this, function (_c) {
1178
+ switch (_c.label) {
1179
+ case 0:
1180
+ setLoading(true);
1181
+ success = false;
1182
+ _c.label = 1;
1183
+ case 1:
1184
+ _c.trys.push([1, 3, , 4]);
1185
+ return [4 /*yield*/, ((_b = (_a = item.layer) === null || _a === void 0 ? void 0 : _a.api) === null || _b === void 0 ? void 0 : _b.deleteItem(item.id))];
1186
+ case 2:
1187
+ _c.sent();
1188
+ success = true;
1189
+ return [3 /*break*/, 4];
1190
+ case 3:
1191
+ error_1 = _c.sent();
1192
+ toast.error(error_1.toString());
1193
+ return [3 /*break*/, 4];
1194
+ case 4:
1195
+ if (success) {
1196
+ removeItem(item);
1197
+ toast.success("Item deleted");
1198
+ }
1199
+ setLoading(false);
1200
+ map.closePopup();
1201
+ event.stopPropagation();
1202
+ return [2 /*return*/];
1203
+ }
1204
+ });
1205
+ }); };
1206
+ var openEditPopup = function (event) {
1207
+ event.stopPropagation();
1208
+ map.closePopup();
1209
+ if (setItemFormPopup)
1210
+ setItemFormPopup({ position: new LatLng(item.position.coordinates[1], item.position.coordinates[0]), layer: item.layer, item: item, setItemFormPopup: setItemFormPopup });
1211
+ };
1212
+ return (React.createElement("div", { className: 'tw-grid tw-grid-cols-6 tw-pb-2' },
1213
+ React.createElement("div", { className: 'tw-col-span-5' },
1214
+ React.createElement("b", { className: "tw-text-xl tw-font-bold" }, item.name)),
1215
+ React.createElement("div", { className: 'tw-col-span-1' }, ((_b = item.layer) === null || _b === void 0 ? void 0 : _b.api) &&
1216
+ React.createElement("div", { className: "tw-dropdown tw-dropdown-bottom" },
1217
+ React.createElement("label", { tabIndex: 0, className: "tw-bg-base-100 tw-btn tw-m-1 tw-leading-3 tw-border-none tw-min-h-0 tw-h-6" },
1218
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
1219
+ React.createElement("path", { d: "M10 6a2 2 0 110-4 2 2 0 010 4zM10 12a2 2 0 110-4 2 2 0 010 4zM10 18a2 2 0 110-4 2 2 0 010 4z" }))),
1220
+ React.createElement("ul", { tabIndex: 0, className: "tw-dropdown-content tw-menu tw-p-2 tw-shadow tw-bg-base-100 tw-rounded-box" },
1221
+ item.layer.api.updateItem && hasUserPermission((_c = item.layer.api) === null || _c === void 0 ? void 0 : _c.collectionName, "update") && React.createElement("li", null,
1222
+ React.createElement("a", { className: "!tw-text-base-content", onClick: openEditPopup },
1223
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
1224
+ React.createElement("path", { d: "M13.586 3.586a2 2 0 112.828 2.828l-.793.793-2.828-2.828.793-.793zM11.379 5.793L3 14.172V17h2.828l8.38-8.379-2.83-2.828z" })))),
1225
+ item.layer.api.deleteItem && hasUserPermission((_d = item.layer.api) === null || _d === void 0 ? void 0 : _d.collectionName, "delete") && React.createElement("li", null,
1226
+ React.createElement("a", { className: ' !tw-text-error', onClick: removeItemFromMap }, loading ? React.createElement("span", { className: "tw-loading tw-loading-spinner tw-loading-sm" })
1227
+ :
1228
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
1229
+ React.createElement("path", { fillRule: "evenodd", d: "M9 2a1 1 0 00-.894.553L7.382 4H4a1 1 0 000 2v10a2 2 0 002 2h8a2 2 0 002-2V6a1 1 0 100-2h-3.382l-.724-1.447A1 1 0 0011 2H9zM7 8a1 1 0 012 0v6a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v6a1 1 0 102 0V8a1 1 0 00-1-1z", clipRule: "evenodd" })))))))));
1230
+ }
1231
+
1232
+ var urlRegex = /(^| )(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,10}(:[0-9]{1,10})?(\/.*)?$/gm;
1233
+ var mailRegex = /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi;
1234
+ function fixUrls(message) {
439
1235
  message = message.replace(urlRegex, function (url) {
440
1236
  var hyperlink = url.replace(' ', '');
441
1237
  if (!hyperlink.match('^https?:\/\/')) {
442
- hyperlink = 'http://' + hyperlink;
1238
+ hyperlink = 'https://' + hyperlink;
1239
+ }
1240
+ return hyperlink;
1241
+ });
1242
+ return message;
1243
+ }
1244
+
1245
+ var TextView = function (_a) {
1246
+ var item = _a.item;
1247
+ var tags = useTags();
1248
+ useAddTag();
1249
+ var addFilterTag = useAddFilterTag();
1250
+ var replacedText;
1251
+ if (item && item.text)
1252
+ replacedText = fixUrls(item.text);
1253
+ replacedText = reactStringReplace(replacedText, /(https?:\/\/\S+)/g, function (url, i) {
1254
+ var shortUrl = url;
1255
+ if (url.match('^https:\/\/')) {
1256
+ shortUrl = url.split('https://')[1];
443
1257
  }
444
- return '<a href="' + hyperlink + '" target="_blank" rel="noopener noreferrer">' + url + '</a>';
1258
+ if (url.match('^http:\/\/')) {
1259
+ shortUrl = url.split('http://')[1];
1260
+ }
1261
+ return (React.createElement("a", { key: i.toString + item.id + url, href: url, target: "_blank", rel: "noopener noreferrer" }, shortUrl));
445
1262
  });
446
- var mailRegex = /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi;
447
- message = message.replace(mailRegex, function (mail) {
448
- return '<a href="mailto:' + mail + '">' + mail + '</a>';
1263
+ replacedText = reactStringReplace(replacedText, mailRegex, function (url, i) {
1264
+ return (React.createElement("a", { key: i.toString + item.id + url, href: "mailto:".concat(url), target: "_blank", rel: "noopener noreferrer" }, url));
449
1265
  });
450
- return message;
451
- }
1266
+ replacedText = reactStringReplace(replacedText, hashTagRegex, function (match, i) {
1267
+ var tag = tags.find(function (t) { return t.id.toLowerCase() == match.slice(1).toLowerCase(); });
1268
+ return (React.createElement("a", { style: { color: tag ? tag.color : '#aaa', fontWeight: 'bold', cursor: 'pointer' }, key: tag ? tag.id + item.id + i : i, onClick: function () {
1269
+ addFilterTag(tag);
1270
+ // map.fitBounds(items)
1271
+ // map.closePopup();
1272
+ } }, match));
1273
+ });
1274
+ return (React.createElement("p", { style: { whiteSpace: "pre-wrap" }, className: "!tw-m-0 !tw-mb-2" }, replacedText));
1275
+ };
1276
+
1277
+ var ItemViewPopup = React.forwardRef(function (props, ref) {
1278
+ return (React.createElement(Popup, { ref: ref, maxHeight: 377, minWidth: 275, maxWidth: 275, autoPanPadding: [20, 80] },
1279
+ React.createElement("div", { className: 'tw-bg-base-100 tw-text-base-content' },
1280
+ React.createElement(HeaderView, { item: props.item, setItemFormPopup: props.setItemFormPopup }),
1281
+ React.createElement("div", { className: 'tw-overflow-y-auto tw-max-h-72' }, props.children ?
1282
+ React.Children.toArray(props.children).map(function (child) {
1283
+ return React.isValidElement(child) ?
1284
+ React.cloneElement(child, { item: props.item }) : "";
1285
+ })
1286
+ :
1287
+ React.createElement(TextView, { item: props.item })))));
1288
+ });
1289
+
1290
+ var Geometry = /** @class */ (function () {
1291
+ function Geometry(lng, lat) {
1292
+ this.coordinates = [lng, lat];
1293
+ this.type = "Point";
1294
+ }
1295
+ return Geometry;
1296
+ }());
452
1297
 
453
- function heighlightTags(message, tags) {
454
- if (!message)
455
- return "";
456
- var hashTagRegex = /(^|\B)#(?![0-9_]+\b)([a-zA-Z0-9_]{1,30})(\b|\r)/g;
457
- message = message.replace(hashTagRegex, function (string) {
458
- var tag = tags.find(function (t) { return t.id.toLowerCase() == string.slice(1).toLowerCase(); });
459
- return "<span style=\"background-color: ".concat(tag ? tag.color : '#aaa', ";padding: 0px 5px;border-radius: 7px;cursor: pointer;color:#fff\">") + string + '</span>';
1298
+ function TextAreaInput(_a) {
1299
+ var labelTitle = _a.labelTitle, dataField = _a.dataField, labelStyle = _a.labelStyle, containerStyle = _a.containerStyle, inputStyle = _a.inputStyle, defaultValue = _a.defaultValue, placeholder = _a.placeholder, updateFormValue = _a.updateFormValue;
1300
+ var ref = useRef(null);
1301
+ // prevent react18 from calling useEffect twice
1302
+ var init = useRef(false);
1303
+ var tags = useTags();
1304
+ var values = [];
1305
+ tags.map(function (tag) {
1306
+ values.push({ key: tag.id, value: tag.id, color: tag.color });
460
1307
  });
461
- return message;
1308
+ var tribute = new Tribute({
1309
+ containerClass: 'tw-z-500 tw-bg-white tw-p-2 tw-rounded-lg tw-shadow',
1310
+ selectClass: 'tw-font-bold',
1311
+ trigger: "#",
1312
+ values: values,
1313
+ noMatchTemplate: function () {
1314
+ return "";
1315
+ },
1316
+ menuItemTemplate: function (item) {
1317
+ return "<span style=\"color: ".concat(item.original.color, "; padding: 5px; boarder-radius: 3px;\">#").concat(item.string, "</span>");
1318
+ }
1319
+ });
1320
+ useEffect(function () {
1321
+ if (!init.current) {
1322
+ if (ref.current) {
1323
+ tribute.attach(ref.current);
1324
+ }
1325
+ init.current = true;
1326
+ }
1327
+ }, [ref]);
1328
+ return (React.createElement("div", { className: "tw-form-control tw-w-full ".concat(containerStyle ? containerStyle : "") },
1329
+ labelTitle ? React.createElement("label", { className: "tw-label" },
1330
+ React.createElement("span", { className: "tw-label-text tw-text-base-content " + labelStyle }, labelTitle)) : "",
1331
+ React.createElement("textarea", { required: true, ref: ref, defaultValue: defaultValue, name: dataField, className: "tw-textarea tw-textarea-bordered tw-w-full tw-leading-5 ".concat(inputStyle ? inputStyle : ""), placeholder: placeholder || "", onChange: function (e) { return updateFormValue && updateFormValue(e.target.value); } })));
462
1332
  }
463
1333
 
464
- var ItemViewPopup = function (props) {
465
- var item = props.item;
466
- var tags = props.tags;
467
- var removeItem = useRemoveItem();
468
- var map = useMap();
469
- var all_tags = useTags();
470
- var removeItemFromMap = function (event) {
471
- var _a;
472
- (_a = props.item.api) === null || _a === void 0 ? void 0 : _a.deleteItem(props.item.id).then(function () { return removeItem(item); }).then(function () { return map.closePopup(); }).catch(function (err) { return console.log(err); });
473
- event.stopPropagation();
474
- };
475
- var openEditPopup = function (event) {
476
- event.stopPropagation();
477
- map.closePopup();
478
- if (props.setItemFormPopup)
479
- props.setItemFormPopup({ position: new LatLng(item.position.coordinates[1], item.position.coordinates[0]), layer: item.layer, item: item, setItemFormPopup: props.setItemFormPopup });
480
- };
481
- return (React.createElement(Popup, { maxHeight: 377, minWidth: 275, maxWidth: 275, autoPanPadding: [20, 5] },
482
- React.createElement("div", null,
483
- React.createElement("div", { className: 'tw-grid tw-grid-cols-6' },
484
- React.createElement("div", { className: 'tw-col-span-5' },
485
- React.createElement("b", { className: "tw-text-xl tw-font-bold" }, item.name)),
486
- React.createElement("div", { className: 'tw-col-span-1' }, item.api &&
487
- React.createElement("div", { className: "tw-dropdown tw-dropdown-right" },
488
- React.createElement("label", { tabIndex: 0, className: "tw-btn tw-m-1 tw-bg-white hover:tw-bg-white tw-text-gray-500 hover:tw-text-gray-700 tw-leading-3 tw-border-none tw-min-h-0 tw-h-4" },
489
- React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
490
- React.createElement("path", { d: "M10 6a2 2 0 110-4 2 2 0 010 4zM10 12a2 2 0 110-4 2 2 0 010 4zM10 18a2 2 0 110-4 2 2 0 010 4z" }))),
491
- React.createElement("ul", { tabIndex: 0, className: "tw-dropdown-content tw-menu tw-p-2 tw-shadow tw-bg-base-100 tw-rounded-box" },
492
- item.api.updateItem && React.createElement("li", null,
493
- React.createElement("a", { className: 'tw-bg-white hover:tw-bg-gray-300 !tw-text-blue-800 hover:tw-text-gray-700', onClick: openEditPopup },
494
- React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
495
- React.createElement("path", { d: "M13.586 3.586a2 2 0 112.828 2.828l-.793.793-2.828-2.828.793-.793zM11.379 5.793L3 14.172V17h2.828l8.38-8.379-2.83-2.828z" })))),
496
- item.api.deleteItem && React.createElement("li", null,
497
- React.createElement("a", { className: 'tw-bg-white hover:tw-bg-gray-300 !tw-text-red-800 hover:tw-text-red-950', onClick: removeItemFromMap },
498
- React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
499
- React.createElement("path", { fillRule: "evenodd", d: "M9 2a1 1 0 00-.894.553L7.382 4H4a1 1 0 000 2v10a2 2 0 002 2h8a2 2 0 002-2V6a1 1 0 100-2h-3.382l-.724-1.447A1 1 0 0011 2H9zM7 8a1 1 0 012 0v6a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v6a1 1 0 102 0V8a1 1 0 00-1-1z", clipRule: "evenodd" })))))))),
500
- React.createElement("div", { className: 'tw-overflow-y-auto tw-max-h-72' },
501
- item.start && item.end &&
502
- React.createElement("div", { className: "tw-flex tw-flex-row" },
503
- React.createElement("div", { className: "basis-2/5" },
504
- React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-6 tw-w-6 tw-mr-2", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2 },
505
- React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" })),
506
- React.createElement("span", { className: 'tw-align-middle' }, new Date(item.start).toISOString().substring(0, 10) || "")),
507
- React.createElement("div", { className: "tw-basis-1/5 tw-place-content-center" },
508
- React.createElement("span", null, "-")),
509
- React.createElement("div", { className: "tw-basis-2/5" },
510
- React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-6 tw-w-6 tw-mr-2", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2 },
511
- React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" })),
512
- React.createElement("span", { className: 'tw-align-middle tw-leading-6' }, new Date(item.end).toISOString().substring(0, 10) || ""))),
513
- React.createElement("p", { style: { whiteSpace: "pre-wrap" }, dangerouslySetInnerHTML: { __html: replaceURLs(heighlightTags(item.text, all_tags)) } }),
514
- React.createElement("p", null, item.tags &&
515
- tags.map(function (tag) { return (React.createElement("span", { className: "", style: { fontWeight: "bold", display: "inline-block", color: "#fff", padding: ".3rem", borderRadius: ".5rem", backgroundColor: tag.color, margin: '.2rem', fontSize: "100%" }, key: tag.id },
516
- "#",
517
- tag.id)); }))))));
518
- };
1334
+ var randomColor = function () {
1335
+ return hsvToHex((Math.random() + golden_ratio_conjugate) % 1, 0.8, 0.7);
1336
+ };
1337
+ var golden_ratio_conjugate = 0.618033988749895;
1338
+ function hsvToHex(h, s, v) {
1339
+ var r, g, b;
1340
+ var i = (Math.floor(h * 6));
1341
+ var f = h * 6 - i;
1342
+ var p = v * (1 - s);
1343
+ var q = v * (1 - f * s);
1344
+ var t = v * (1 - (1 - f) * s);
1345
+ switch (i % 6) {
1346
+ case 0:
1347
+ r = v, g = t, b = p;
1348
+ break;
1349
+ case 1:
1350
+ r = q, g = v, b = p;
1351
+ break;
1352
+ case 2:
1353
+ r = p, g = v, b = t;
1354
+ break;
1355
+ case 3:
1356
+ r = p, g = q, b = v;
1357
+ break;
1358
+ case 4:
1359
+ r = t, g = p, b = v;
1360
+ break;
1361
+ case 5:
1362
+ r = v, g = p, b = q;
1363
+ break;
1364
+ }
1365
+ return rgbToHex(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255));
1366
+ }
1367
+ var rgbToHex = function (r, g, b) { return '#' + [r, g, b].map(function (x) {
1368
+ var hex = x.toString(16);
1369
+ return hex.length === 1 ? '0' + hex : hex;
1370
+ }).join(''); };
519
1371
 
520
1372
  function ItemFormPopup(props) {
521
- var _a = useState(''), name = _a[0], setName = _a[1];
522
- var _b = useState(''), text = _b[0], setText = _b[1];
523
- var _c = useState(false), spinner = _c[0], setSpinner = _c[1];
1373
+ var _this = this;
1374
+ var _a = useState(false), spinner = _a[0], setSpinner = _a[1];
1375
+ var formRef = useRef(null);
524
1376
  var map = useMap();
525
1377
  var addItem = useAddItem();
526
1378
  var updateItem = useUpdateItem();
527
- var handleSubmit = function (evt) {
528
- var _a, _b;
529
- evt.preventDefault();
530
- console.log("New Item Popup is adding Item ...");
531
- if (props.item) {
532
- setSpinner(true);
533
- (_a = props.api) === null || _a === void 0 ? void 0 : _a.updateItem(new Item(props.item.id, name, text, new Geometry(props.position.lng, props.position.lat))).then(function () { return updateItem(new Item(props.item.id, name, text, new Geometry(props.position.lng, props.position.lat), props.layer, props.item.api)); }).then(function () { return setSpinner(false); }).then(function () { return map.closePopup(); }).catch(function (err) { return console.log(err); });
534
- }
535
- else {
536
- setSpinner(true);
537
- (_b = props.api) === null || _b === void 0 ? void 0 : _b.createItem(new Item(crypto.randomUUID(), name, text, new Geometry(props.position.lng, props.position.lat))).then(function () { return addItem(new Item(crypto.randomUUID(), name, text, new Geometry(props.position.lng, props.position.lat), props.layer, props.api)); }).then(function () { return setSpinner(false); }).then(function () { return map.closePopup(); }).catch(function (err) { return console.log(err); });
538
- }
539
- props.setItemFormPopup(null);
540
- };
1379
+ var tags = useTags();
1380
+ var addTag = useAddTag();
1381
+ var resetFilterTags = useResetFilterTags();
1382
+ var handleSubmit = function (evt) { return __awaiter(_this, void 0, void 0, function () {
1383
+ var formItem, success, error_1, success, error_2;
1384
+ var _a, _b, _c;
1385
+ return __generator(this, function (_d) {
1386
+ switch (_d.label) {
1387
+ case 0:
1388
+ formItem = {};
1389
+ Array.from(evt.target).forEach(function (input) {
1390
+ if (input.name) {
1391
+ formItem[input.name] = input.value;
1392
+ }
1393
+ });
1394
+ formItem['position'] = new Geometry(props.position.lng, props.position.lat);
1395
+ evt.preventDefault();
1396
+ setSpinner(true);
1397
+ (_a = formItem.text.toLocaleLowerCase().match(hashTagRegex)) === null || _a === void 0 ? void 0 : _a.map(function (tag) {
1398
+ if (!tags.find(function (t) { return t.id.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase(); })) {
1399
+ addTag({ id: tag.slice(1).toLocaleLowerCase(), color: randomColor() });
1400
+ }
1401
+ });
1402
+ if (!props.item) return [3 /*break*/, 5];
1403
+ success = false;
1404
+ _d.label = 1;
1405
+ case 1:
1406
+ _d.trys.push([1, 3, , 4]);
1407
+ return [4 /*yield*/, ((_b = props.layer.api) === null || _b === void 0 ? void 0 : _b.updateItem(__assign(__assign({}, formItem), { id: props.item.id })))];
1408
+ case 2:
1409
+ _d.sent();
1410
+ success = true;
1411
+ return [3 /*break*/, 4];
1412
+ case 3:
1413
+ error_1 = _d.sent();
1414
+ toast.error(error_1.toString());
1415
+ return [3 /*break*/, 4];
1416
+ case 4:
1417
+ if (success) {
1418
+ updateItem(__assign(__assign({}, props.item), formItem));
1419
+ toast.success("Item updated");
1420
+ }
1421
+ setSpinner(false);
1422
+ map.closePopup();
1423
+ return [3 /*break*/, 10];
1424
+ case 5:
1425
+ success = false;
1426
+ _d.label = 6;
1427
+ case 6:
1428
+ _d.trys.push([6, 8, , 9]);
1429
+ return [4 /*yield*/, ((_c = props.layer.api) === null || _c === void 0 ? void 0 : _c.createItem(__assign(__assign({}, formItem), { id: crypto.randomUUID() })))];
1430
+ case 7:
1431
+ _d.sent();
1432
+ success = true;
1433
+ return [3 /*break*/, 9];
1434
+ case 8:
1435
+ error_2 = _d.sent();
1436
+ toast.error(error_2.toString());
1437
+ return [3 /*break*/, 9];
1438
+ case 9:
1439
+ if (success) {
1440
+ addItem(__assign(__assign({}, formItem), { id: crypto.randomUUID(), layer: props.layer }));
1441
+ toast.success("New item created");
1442
+ resetFilterTags();
1443
+ }
1444
+ setSpinner(false);
1445
+ map.closePopup();
1446
+ _d.label = 10;
1447
+ case 10:
1448
+ props.setItemFormPopup(null);
1449
+ return [2 /*return*/];
1450
+ }
1451
+ });
1452
+ }); };
541
1453
  var resetPopup = function () {
542
- setName('');
543
- setText('');
544
- };
545
- var setItemValues = function () {
546
- var _a, _b;
547
- if (props.item) {
548
- setName((_a = props.item) === null || _a === void 0 ? void 0 : _a.name);
549
- setText((_b = props.item) === null || _b === void 0 ? void 0 : _b.text);
1454
+ if (formRef.current) {
1455
+ formRef.current.reset();
550
1456
  }
551
1457
  };
552
1458
  useEffect(function () {
553
- setItemValues();
554
- }, [props.item]);
555
- return (React.createElement(Popup, { minWidth: 275, maxWidth: 275, autoPanPadding: [20, 5], eventHandlers: {
556
- remove: resetPopup
1459
+ resetPopup();
1460
+ }, [props.position]);
1461
+ return (React.createElement(Popup, { minWidth: 275, maxWidth: 275, autoPanPadding: [20, 80], eventHandlers: {
1462
+ remove: function () {
1463
+ setTimeout(function () {
1464
+ resetPopup();
1465
+ }, 100);
1466
+ }
557
1467
  }, position: props.position },
558
- React.createElement("form", { onSubmit: handleSubmit },
559
- React.createElement("div", { className: 'tw-flex tw-justify-center' },
560
- React.createElement("b", { className: "tw-text-xl tw-font-bold" },
561
- "New ",
562
- props.layer.name)),
563
- React.createElement("input", { type: "text", placeholder: "Name", className: "tw-input tw-input-bordered tw-w-full tw-max-w-xs tw-mt-5", value: name, onChange: function (e) { return setName(e.target.value); } }),
564
- React.createElement("textarea", { className: "tw-textarea tw-textarea-bordered tw-w-full tw-mt-5 tw-leading-5 tw-h-40", placeholder: "Text", value: text, onChange: function (e) { return setText(e.target.value); } }),
1468
+ React.createElement("form", { ref: formRef, onReset: resetPopup, onSubmit: function (e) { return handleSubmit(e); } },
1469
+ props.item ? React.createElement("div", { className: 'tw-h-3' })
1470
+ :
1471
+ React.createElement("div", { className: 'tw-flex tw-justify-center' },
1472
+ React.createElement("b", { className: "tw-text-xl tw-font-bold" },
1473
+ "New ",
1474
+ props.layer.name)),
1475
+ React.createElement(TextInput, { type: "text", placeholder: "Name", dataField: "name", defaultValue: props.item ? props.item.name : "", inputStyle: '' }),
1476
+ props.children ?
1477
+ React.Children.toArray(props.children).map(function (child) {
1478
+ return React.isValidElement(child) ?
1479
+ React.cloneElement(child, { item: props.item, key: props.position.toString() }) : "";
1480
+ })
1481
+ :
1482
+ React.createElement(React.Fragment, null,
1483
+ React.createElement(TextAreaInput, { key: props.position.toString(), placeholder: "Text", dataField: "text", defaultValue: props.item ? props.item.text : "", inputStyle: 'tw-h-40 tw-mt-5' })),
565
1484
  React.createElement("div", { className: 'tw-flex tw-justify-center' },
566
- React.createElement("button", { className: spinner ? 'tw-btn tw-loading tw-mt-5 tw-place-self-center' : 'tw-btn tw-mt-5 tw-place-self-center' }, "Save")))));
1485
+ React.createElement("button", { className: spinner ? 'tw-btn tw-btn-disabled tw-mt-5 tw-place-self-center' : 'tw-btn tw-mt-5 tw-place-self-center', type: 'submit' }, spinner ? React.createElement("span", { className: "tw-loading tw-loading-spinner" }) : 'Save')))));
567
1486
  }
568
1487
 
569
1488
  var Layer = function (props) {
570
- var _a;
571
- var _b = useState(null); _b[0]; var setItemFormPopup = _b[1];
572
- var tags = useTags();
573
- // create a JS-Map with all Tags
574
- var tagMap = new Map(tags === null || tags === void 0 ? void 0 : tags.map(function (key) { return [key.id, key]; }));
575
- // returns all tags for passed item
576
- var getTags = function (item) {
577
- var regex = /(^|\B)#(?![0-9_]+\b)([a-zA-Z0-9_]{1,30})(\b|\r)/g;
578
- var strings = item.text.toLocaleLowerCase().match(regex);
579
- var tags = [];
580
- strings === null || strings === void 0 ? void 0 : strings.map(function (tag) {
581
- if (tagMap.has(tag.slice(1))) {
582
- tags.push(tagMap.get(tag.slice(1)));
583
- }
584
- });
585
- return tags;
586
- };
1489
+ var _a, _b;
1490
+ var _c = useState(null); _c[0]; var setItemFormPopup = _c[1];
1491
+ var filterTags = useFilterTags();
587
1492
  var items = useItems();
588
- var addItem = useAddItem();
589
- var addLayer = useAddLayer();
590
- var resetItems = useResetItems();
1493
+ var setItemsApi = useSetItemsApi();
1494
+ var setItemsData = useSetItemsData();
1495
+ var getItemTags = useGetItemTags();
1496
+ var addMarker = useAddMarker();
1497
+ var addPopup = useAddPopup();
1498
+ var leafletRefs = useLeafletRefs();
1499
+ var location = useLocation();
1500
+ var searchPhrase = useSearchPhrase();
1501
+ var map = useMap();
1502
+ var isLayerVisible = useIsLayerVisible();
591
1503
  useEffect(function () {
592
- var _a, _b;
593
- resetItems(props);
594
- (_a = props.data) === null || _a === void 0 ? void 0 : _a.map(function (item) {
595
- if (item.position) {
596
- item.layer = props;
597
- addItem(item);
1504
+ props.data && setItemsData(props);
1505
+ props.api && setItemsApi(props);
1506
+ }, [props.data, props.api]);
1507
+ useMapEvents({
1508
+ popupopen: function (e) {
1509
+ var _a, _b;
1510
+ var item = (_a = Object.entries(leafletRefs).find(function (r) { return r[1].popup == e.popup; })) === null || _a === void 0 ? void 0 : _a[1].item;
1511
+ if (((_b = item === null || item === void 0 ? void 0 : item.layer) === null || _b === void 0 ? void 0 : _b.name) == props.name && window.location.pathname.split("/")[2] != item.id) {
1512
+ window.history.pushState({}, "", "/".concat(props.name, "/").concat(item.id));
1513
+ document.title = document.title.split("-")[0] + " - " + item.name;
598
1514
  }
599
- });
600
- (_b = props.api) === null || _b === void 0 ? void 0 : _b.getItems().then(function (result) {
601
- if (result.data) {
602
- result.data.map(function (item) {
603
- if (item.position) {
604
- addItem((__assign({ layer: props, api: props.api }, item)));
1515
+ },
1516
+ });
1517
+ var openPopup = function () {
1518
+ var _a, _b, _c, _d, _e, _f;
1519
+ if (window.location.pathname.split("/").length <= 2 || window.location.pathname.split("/")[2] === "") {
1520
+ map.closePopup();
1521
+ }
1522
+ else {
1523
+ if (window.location.pathname.split("/")[1] == props.name) {
1524
+ if (window.location.pathname.split("/")[2]) {
1525
+ var id = window.location.pathname.split("/")[2];
1526
+ var marker_1 = (_a = leafletRefs[id]) === null || _a === void 0 ? void 0 : _a.marker;
1527
+ if (marker_1 && marker_1 != null) {
1528
+ marker_1 !== null && ((_c = (_b = props.clusterRef) === null || _b === void 0 ? void 0 : _b.current) === null || _c === void 0 ? void 0 : _c.zoomToShowLayer(marker_1, function () {
1529
+ marker_1.openPopup();
1530
+ }));
1531
+ var item = (_d = leafletRefs[id]) === null || _d === void 0 ? void 0 : _d.item;
1532
+ document.title = document.title.split("-")[0] + " - " + item.name;
1533
+ (_e = document.querySelector('meta[property="og:title"]')) === null || _e === void 0 ? void 0 : _e.setAttribute("content", item.name);
1534
+ (_f = document.querySelector('meta[property="og:description"]')) === null || _f === void 0 ? void 0 : _f.setAttribute("content", item.text);
605
1535
  }
606
- });
1536
+ }
607
1537
  }
608
- });
609
- if (props.api || props.api) {
610
- addLayer(props);
611
1538
  }
612
- }, [props.data, props.api]);
1539
+ };
1540
+ useEffect(function () {
1541
+ openPopup();
1542
+ }, [leafletRefs, location]);
613
1543
  return (React.createElement(React.Fragment, null,
614
1544
  items &&
615
- ((_a = items.filter(function (item) { var _a; return ((_a = item.layer) === null || _a === void 0 ? void 0 : _a.name) === props.name; })) === null || _a === void 0 ? void 0 : _a.map(function (place) {
616
- var tags = getTags(place);
1545
+ ((_b = (_a = items.
1546
+ filter(function (item) { var _a; return ((_a = item.layer) === null || _a === void 0 ? void 0 : _a.name) === props.name; })) === null || _a === void 0 ? void 0 : _a.filter(function (item) {
1547
+ return filterTags.length == 0 ? item : filterTags.every(function (tag) { return getItemTags(item).some(function (filterTag) { return filterTag.id === tag.id; }); });
1548
+ })) === null || _b === void 0 ? void 0 : _b.filter(function (item) {
1549
+ return searchPhrase === ''
1550
+ ? item :
1551
+ item.name.toLowerCase().includes(searchPhrase.toLowerCase()) || item.text.toLowerCase().includes(searchPhrase.toLowerCase());
1552
+ }).filter(function (item) { return item.layer && isLayerVisible(item.layer); }).map(function (item) {
1553
+ var tags = getItemTags(item);
617
1554
  var color1 = "#666";
618
1555
  var color2 = "RGBA(35, 31, 32, 0.2)";
619
- if (tags[0]) {
1556
+ if (tags && tags[0]) {
620
1557
  color1 = tags[0].color;
621
1558
  }
622
- if (tags[1]) {
1559
+ if (tags && tags[1]) {
623
1560
  color2 = tags[1].color;
624
1561
  }
625
- return (React.createElement(Marker, { icon: MarkerIconFactory(props.markerShape, color1, color2, props.markerIcon), key: place.id, position: [place.position.coordinates[1], place.position.coordinates[0]] },
626
- React.createElement(ItemViewPopup, { item: place, tags: tags, setItemFormPopup: props.setItemFormPopup })));
1562
+ return (React.createElement(Marker, { ref: function (r) {
1563
+ if (!(item.id in leafletRefs))
1564
+ r && addMarker(item, r);
1565
+ }, icon: MarkerIconFactory(props.markerShape, color1, color2, props.markerIcon), key: item.id, position: [item.position.coordinates[1], item.position.coordinates[0]] },
1566
+ (props.children && React.Children.toArray(props.children).some(function (child) { return React.isValidElement(child) && child.props.__TYPE === "ItemView"; }) ?
1567
+ React.Children.toArray(props.children).map(function (child) {
1568
+ return React.isValidElement(child) && child.props.__TYPE === "ItemView" ?
1569
+ React.createElement(ItemViewPopup, { ref: function (r) {
1570
+ if (!(item.id in leafletRefs))
1571
+ r && addPopup(item, r);
1572
+ }, key: item.id + item.name, item: item, setItemFormPopup: props.setItemFormPopup }, child)
1573
+ : "";
1574
+ })
1575
+ :
1576
+ React.createElement(React.Fragment, null,
1577
+ React.createElement(ItemViewPopup, { key: item.id + item.name, ref: function (r) {
1578
+ if (!(item.id in leafletRefs))
1579
+ r && addPopup(item, r);
1580
+ }, item: item, setItemFormPopup: props.setItemFormPopup }))),
1581
+ React.createElement(Tooltip, { offset: [0, -38], direction: 'top' }, item.name)));
627
1582
  })),
628
- props.children,
629
1583
  props.itemFormPopup && props.itemFormPopup.layer.name == props.name &&
630
- React.createElement(ItemFormPopup, { position: props.itemFormPopup.position, layer: props.itemFormPopup.layer, setItemFormPopup: setItemFormPopup, item: props.itemFormPopup.item, api: props.api })));
1584
+ (props.children && React.Children.toArray(props.children).some(function (child) { return React.isValidElement(child) && child.props.__TYPE === "ItemForm"; }) ?
1585
+ React.Children.toArray(props.children).map(function (child) {
1586
+ var _a;
1587
+ return React.isValidElement(child) && child.props.__TYPE === "ItemForm" ?
1588
+ React.createElement(ItemFormPopup, { key: (_a = props.setItemFormPopup) === null || _a === void 0 ? void 0 : _a.name, position: props.itemFormPopup.position, layer: props.itemFormPopup.layer, setItemFormPopup: setItemFormPopup, item: props.itemFormPopup.item }, child)
1589
+ : "";
1590
+ })
1591
+ :
1592
+ React.createElement(React.Fragment, null,
1593
+ React.createElement(ItemFormPopup, { position: props.itemFormPopup.position, layer: props.itemFormPopup.layer, setItemFormPopup: setItemFormPopup, item: props.itemFormPopup.item })))));
631
1594
  };
632
1595
 
633
1596
  function Tags(_a) {
634
- var data = _a.data;
635
- var addTag = useAddTag();
1597
+ var data = _a.data, api = _a.api;
1598
+ var setTagData = useSetTagData();
1599
+ var setTagApi = useSetTagApi();
636
1600
  useEffect(function () {
637
- data.map(function (tag) {
638
- tag.id = tag.id.toLocaleLowerCase();
639
- addTag(tag);
640
- });
641
- }, [addTag, data]);
1601
+ data && setTagData(data);
1602
+ api && setTagApi(api);
1603
+ }, [api, data]);
1604
+ return (React.createElement(React.Fragment, null));
1605
+ }
1606
+
1607
+ function Permissions(_a) {
1608
+ var data = _a.data, api = _a.api, adminRole = _a.adminRole;
1609
+ var setPermissionData = useSetPermissionData();
1610
+ var setPermissionApi = useSetPermissionApi();
1611
+ var setAdminRole = useSetAdminRole();
1612
+ var user = useAuth().user;
1613
+ useEffect(function () {
1614
+ adminRole && setAdminRole(adminRole);
1615
+ data && setPermissionData(data);
1616
+ api && setPermissionApi(api);
1617
+ }, [api, data, adminRole, user]);
642
1618
  return (React.createElement(React.Fragment, null));
643
1619
  }
644
1620
 
1621
+ var ItemForm = function (_a) {
1622
+ var children = _a.children, item = _a.item;
1623
+ return (React.createElement("div", null, children ?
1624
+ React.Children.toArray(children).map(function (child) {
1625
+ return React.isValidElement(child) ?
1626
+ React.cloneElement(child, { item: item, test: "test" }) : "";
1627
+ }) : ""));
1628
+ };
1629
+ ItemForm.propTypes = {
1630
+ children: PropTypes.node,
1631
+ __TYPE: PropTypes.string,
1632
+ };
1633
+ ItemForm.defaultProps = {
1634
+ __TYPE: 'ItemForm',
1635
+ };
1636
+
1637
+ var ItemView = function (_a) {
1638
+ var children = _a.children, item = _a.item;
1639
+ return (React.createElement("div", null, children ?
1640
+ React.Children.toArray(children).map(function (child) {
1641
+ return React.isValidElement(child) ?
1642
+ React.cloneElement(child, { item: item, test: "test" }) : "";
1643
+ }) : ""));
1644
+ };
1645
+ ItemView.propTypes = {
1646
+ children: PropTypes.node,
1647
+ __TYPE: PropTypes.string,
1648
+ };
1649
+ ItemView.defaultProps = {
1650
+ __TYPE: 'ItemView',
1651
+ };
1652
+
1653
+ var PopupTextAreaInput = function (_a) {
1654
+ var dataField = _a.dataField, placeholder = _a.placeholder, style = _a.style, item = _a.item;
1655
+ return (React.createElement(TextAreaInput, { defaultValue: (item === null || item === void 0 ? void 0 : item.text) ? item.text : "", dataField: dataField, placeholder: placeholder, inputStyle: style }));
1656
+ };
1657
+
1658
+ var PopupStartEndInput = function (_a) {
1659
+ var item = _a.item;
1660
+ return (React.createElement("div", { className: 'tw-grid tw-grid-cols-2 tw-gap-2 tw-mb-5' },
1661
+ React.createElement(TextInput, { type: 'date', placeholder: 'start', dataField: 'start', inputStyle: 'tw-text-sm tw-px-2', labelTitle: 'start', defaultValue: item && item.start ? item.start.substring(0, 10) : "" }),
1662
+ React.createElement(TextInput, { type: 'date', placeholder: 'end', dataField: 'end', inputStyle: 'tw-text-sm tw-px-2', labelTitle: 'end', defaultValue: item && item.end ? item.end.substring(0, 10) : "" })));
1663
+ };
1664
+
1665
+ var StartEndView = function (_a) {
1666
+ var item = _a.item;
1667
+ return (React.createElement("div", { className: "tw-flex tw-flex-row tw-mb-4" },
1668
+ React.createElement("div", { className: "tw-basis-2/5 tw-flex tw-flex-row" },
1669
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-4 tw-w-4 tw-mr-2", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2 },
1670
+ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" })),
1671
+ React.createElement("time", { className: 'tw-align-middle', dateTime: item && item.start ? item.start.substring(0, 10) : "" }, item && item.start ? new Date(item.start).toLocaleDateString() : "")),
1672
+ React.createElement("div", { className: "tw-basis-1/5 tw-place-content-center" },
1673
+ React.createElement("span", null, "-")),
1674
+ React.createElement("div", { className: "tw-basis-2/5 tw-flex tw-flex-row" },
1675
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-4 tw-w-4 tw-mr-2", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2 },
1676
+ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" })),
1677
+ React.createElement("time", { className: 'tw-align-middle', dateTime: item && item.end ? item.end.substring(0, 10) : "" }, item && item.end ? new Date(item.end).toLocaleDateString() : ""))));
1678
+ };
1679
+
1680
+ var isClickInsideRectangle = function (e, element) {
1681
+ var r = element.getBoundingClientRect();
1682
+ return (e.clientX > r.left &&
1683
+ e.clientX < r.right &&
1684
+ e.clientY > r.top &&
1685
+ e.clientY < r.bottom);
1686
+ };
1687
+ var DialogModal = function (_a) {
1688
+ var title = _a.title, isOpened = _a.isOpened, onClose = _a.onClose, children = _a.children;
1689
+ var ref = useRef(null);
1690
+ useEffect(function () {
1691
+ var _a, _b, _c, _d;
1692
+ if (isOpened) {
1693
+ (_a = ref.current) === null || _a === void 0 ? void 0 : _a.showModal();
1694
+ (_b = ref.current) === null || _b === void 0 ? void 0 : _b.classList.remove("tw-hidden");
1695
+ document.body.classList.add("modal-open"); // prevent bg scroll
1696
+ }
1697
+ else {
1698
+ (_c = ref.current) === null || _c === void 0 ? void 0 : _c.close();
1699
+ (_d = ref.current) === null || _d === void 0 ? void 0 : _d.classList.add("tw-hidden");
1700
+ document.body.classList.remove("modal-open");
1701
+ }
1702
+ }, [isOpened]);
1703
+ return (React.createElement("dialog", { className: 'tw-card tw-shadow-xl tw-absolute tw-right-0 tw-top-0 tw-bottom-0 tw-left-0 tw-m-auto tw-transition-opacity tw-duration-300', ref: ref, onCancel: onClose, onClick: function (e) {
1704
+ return ref.current && !isClickInsideRectangle(e, ref.current) && onClose();
1705
+ } },
1706
+ React.createElement("div", { className: "tw-card-body tw-p-2" },
1707
+ React.createElement("h2", { className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, title),
1708
+ children,
1709
+ React.createElement("button", { className: "tw-btn tw-btn-sm tw-btn-circle tw-btn-ghost tw-absolute tw-right-2 tw-top-2", onClick: onClose }, "\u2715"))));
1710
+ };
1711
+
645
1712
  function NavBar(_a) {
646
- var name = _a.name, useAuth = _a.useAuth;
647
- var _b = useState(""), email = _b[0], setEmail = _b[1];
648
- var _c = useState(""), password = _c[0], setPassword = _c[1];
649
- var _d = useAuth(), isAuthenticated = _d.isAuthenticated, user = _d.user, login = _d.login, loading = _d.loading, logout = _d.logout, token = _d.token;
650
- var onLogin = function () {
651
- toast.promise(login({ email: email, password: password }), {
1713
+ var _this = this;
1714
+ var appName = _a.appName;
1715
+ var _b = useState(false), signupOpen = _b[0], setSignupOpen = _b[1];
1716
+ var _c = useState(false), loginOpen = _c[0], setLoginOpen = _c[1];
1717
+ var _d = useState(""), email = _d[0], setEmail = _d[1];
1718
+ var _e = useState(""), userName = _e[0], setUserName = _e[1];
1719
+ var _f = useState(""), password = _f[0], setPassword = _f[1];
1720
+ var _g = useAuth(), isAuthenticated = _g.isAuthenticated, user = _g.user, login = _g.login, register = _g.register, loading = _g.loading, logout = _g.logout, token = _g.token;
1721
+ var navigate = useNavigate();
1722
+ var onRegister = function () { return __awaiter(_this, void 0, void 0, function () {
1723
+ return __generator(this, function (_a) {
1724
+ switch (_a.label) {
1725
+ case 0: return [4 /*yield*/, toast.promise(register({ email: email, password: password }, userName), {
1726
+ success: {
1727
+ render: function (_a) {
1728
+ var data = _a.data;
1729
+ navigate("/");
1730
+ return "Hi ".concat(data === null || data === void 0 ? void 0 : data.first_name);
1731
+ },
1732
+ // other options
1733
+ icon: "✌️",
1734
+ },
1735
+ error: {
1736
+ render: function (_a) {
1737
+ var data = _a.data;
1738
+ return "".concat(data);
1739
+ },
1740
+ },
1741
+ pending: 'creating new user ...'
1742
+ })];
1743
+ case 1:
1744
+ _a.sent();
1745
+ setSignupOpen(false);
1746
+ return [2 /*return*/];
1747
+ }
1748
+ });
1749
+ }); };
1750
+ var onLogin = function () { return __awaiter(_this, void 0, void 0, function () {
1751
+ return __generator(this, function (_a) {
1752
+ switch (_a.label) {
1753
+ case 0: return [4 /*yield*/, toast.promise(login({ email: email, password: password }), {
1754
+ success: {
1755
+ render: function (_a) {
1756
+ var data = _a.data;
1757
+ navigate("/");
1758
+ return "Hi ".concat(data === null || data === void 0 ? void 0 : data.first_name);
1759
+ },
1760
+ // other options
1761
+ icon: "✌️",
1762
+ },
1763
+ error: {
1764
+ render: function (_a) {
1765
+ var data = _a.data;
1766
+ return "".concat(data);
1767
+ },
1768
+ },
1769
+ pending: 'logging in ...'
1770
+ })];
1771
+ case 1:
1772
+ _a.sent();
1773
+ setLoginOpen(false);
1774
+ return [2 /*return*/];
1775
+ }
1776
+ });
1777
+ }); };
1778
+ var onLogout = function () {
1779
+ toast.promise(logout(), {
652
1780
  success: {
1781
+ render: function () {
1782
+ return "Bye bye";
1783
+ },
1784
+ // other options
1785
+ icon: "👋",
1786
+ },
1787
+ error: {
653
1788
  render: function (_a) {
654
1789
  var data = _a.data;
655
- return "Hi ".concat(data === null || data === void 0 ? void 0 : data.first_name);
1790
+ return "".concat(data);
656
1791
  },
657
- // other options
658
- icon: "✌️",
659
1792
  },
660
- error: 'Error'
1793
+ pending: 'logging out ..'
661
1794
  });
662
1795
  };
663
1796
  return (React.createElement(React.Fragment, null,
@@ -668,40 +1801,56 @@ function NavBar(_a) {
668
1801
  React.createElement("div", { className: "tw-flex-1 tw-mr-2" },
669
1802
  React.createElement("div", { className: "tw-flex-1 tw-truncate tw-grid tw-grid-flow-col tw-max-w-52" },
670
1803
  React.createElement(Link, { className: "tw-btn tw-btn-ghost tw-px-2 tw-normal-case tw-text-xl tw-flex-1 tw-truncate", to: "/" },
671
- React.createElement("p", { className: "tw-truncate" }, name)),
1804
+ React.createElement("p", { className: "tw-truncate" }, appName)),
672
1805
  React.createElement("button", { className: "tw-btn tw-px-2 tw-btn-ghost", onClick: function () { return window.my_modal_3.showModal(); } },
673
1806
  React.createElement(QuestionMarkIcon, { className: "tw-h-5 tw-w-5" })))),
674
- isAuthenticated && token ?
1807
+ isAuthenticated ?
675
1808
  React.createElement("div", { className: "tw-flex-none" },
676
- React.createElement("div", { className: "tw-avatar" },
1809
+ (user === null || user === void 0 ? void 0 : user.avatar) ? React.createElement("div", { className: "tw-avatar" },
677
1810
  React.createElement("div", { className: "tw-w-10 tw-rounded-full" },
678
- React.createElement("img", { src: "https://map.api.free-planet-earth.org/assets/" + (user === null || user === void 0 ? void 0 : user.avatar) + "?access_token=" + token }))),
1811
+ React.createElement("img", { src: "https://api.utopia-lab.org/assets/" + (user === null || user === void 0 ? void 0 : user.avatar) + "?access_token=" + token }))) : React.createElement(React.Fragment, null),
679
1812
  React.createElement("div", { className: 'tw-ml-2 tw-mr-2' }, user === null || user === void 0 ? void 0 : user.first_name),
680
1813
  React.createElement("div", { className: "tw-dropdown tw-dropdown-end" },
681
1814
  React.createElement("label", { tabIndex: 0, className: "tw-btn tw-btn-ghost tw-btn-square" },
682
1815
  React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
683
1816
  React.createElement("path", { d: "M10 6a2 2 0 110-4 2 2 0 010 4zM10 12a2 2 0 110-4 2 2 0 010 4zM10 18a2 2 0 110-4 2 2 0 010 4z" }))),
684
- React.createElement("ul", { tabIndex: 0, className: "tw-menu tw-menu-compact tw-dropdown-content tw-mt-3 tw-p-2 tw-shadow tw-bg-base-100 tw-rounded-box tw-w-52 !tw-z-[1000]" },
1817
+ React.createElement("ul", { tabIndex: 0, className: "tw-menu tw-menu-compact tw-dropdown-content tw-mt-3 tw-p-2 tw-shadow tw-bg-base-100 tw-rounded-box tw-w-52 !tw-z-[10000]" },
685
1818
  React.createElement("li", null,
686
1819
  React.createElement(Link, { to: "/settings" }, "Settings")),
687
1820
  React.createElement("li", null,
688
- React.createElement("a", { onClick: function () { logout(); } }, "Logout")))))
1821
+ React.createElement("a", { onClick: function () { onLogout(); } }, "Logout")))))
689
1822
  :
690
- React.createElement("div", { className: "tw-dropdown tw-dropdown-end tw-mr-2" },
691
- React.createElement("label", { tabIndex: 0, className: "tw-btn tw-btn-ghost" }, "Login"),
692
- React.createElement("div", { tabIndex: 0, className: "tw-mt-3 tw-card tw-card-compact tw-dropdown-content tw-w-72 tw-bg-base-100 tw-shadow !tw-z-[1000]" },
693
- React.createElement("div", { className: "tw-card-body" },
694
- React.createElement("input", { type: "email", placeholder: "E-Mail", value: email, onChange: function (e) { return setEmail(e.target.value); }, className: "tw-input tw-input-bordered tw-w-full tw-max-w-xs" }),
695
- React.createElement("input", { type: "password", placeholder: "Password", onChange: function (e) { return setPassword(e.target.value); }, className: "tw-input tw-input-bordered tw-w-full tw-max-w-xs" }),
696
- React.createElement("div", { className: "tw-card-actions" },
697
- React.createElement("button", { className: loading ? 'tw-btn tw-loading tw-btn-disabled tw-btn-block tw-btn-primary' : 'tw-btn tw-btn-primary tw-btn-block', onClick: function () { return onLogin(); } }, "Login"))))))));
1823
+ React.createElement("div", null,
1824
+ React.createElement("div", { className: "tw-hidden md:tw-flex" },
1825
+ React.createElement("div", { onClick: function () { return setLoginOpen(true); }, className: "tw-btn tw-btn-ghost tw-mr-2" }, "Login"),
1826
+ React.createElement("div", { onClick: function () { return setSignupOpen(true); }, className: "tw-btn tw-btn-ghost tw-mr-2" }, "Sign Up")),
1827
+ React.createElement("div", { className: "tw-dropdown tw-dropdown-end" },
1828
+ React.createElement("label", { tabIndex: 1, className: "tw-btn tw-btn-ghost md:tw-hidden" },
1829
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
1830
+ React.createElement("path", { d: "M10 6a2 2 0 110-4 2 2 0 010 4zM10 12a2 2 0 110-4 2 2 0 010 4zM10 18a2 2 0 110-4 2 2 0 010 4z" }))),
1831
+ React.createElement("ul", { tabIndex: 1, className: "tw-menu tw-dropdown-content tw-mt-3 tw-p-2 tw-shadow tw-bg-base-100 tw-rounded-box tw-w-52 !tw-z-[10000]" },
1832
+ React.createElement("li", null,
1833
+ React.createElement("a", { onClick: function () { setLoginOpen(true); } }, "Login")),
1834
+ React.createElement("li", null,
1835
+ React.createElement("a", { onClick: function () { return setSignupOpen(true); } }, "Sign Up")))))),
1836
+ React.createElement(DialogModal, { title: "Login", isOpened: loginOpen, onClose: function () { return setLoginOpen(false); } },
1837
+ React.createElement("input", { type: "email", placeholder: "E-Mail", value: email, onChange: function (e) { return setEmail(e.target.value); }, className: "tw-input tw-input-bordered tw-w-full tw-max-w-xs" }),
1838
+ React.createElement("input", { type: "password", placeholder: "Password", onChange: function (e) { return setPassword(e.target.value); }, className: "tw-input tw-input-bordered tw-w-full tw-max-w-xs" }),
1839
+ React.createElement("div", { className: "tw-card-actions" },
1840
+ React.createElement("button", { className: loading ? 'tw-btn tw-btn-disabled tw-btn-block tw-btn-primary' : 'tw-btn tw-btn-primary tw-btn-block', onClick: function () { return onLogin(); } }, loading ? React.createElement("span", { className: "tw-loading tw-loading-spinner" }) : 'Login'))),
1841
+ React.createElement(DialogModal, { title: "Sign Up", isOpened: signupOpen, onClose: function () { return setSignupOpen(false); } },
1842
+ React.createElement("input", { type: "text", placeholder: "Name", value: userName, onChange: function (e) { return setUserName(e.target.value); }, className: "tw-input tw-input-bordered tw-w-full tw-max-w-xs" }),
1843
+ React.createElement("input", { type: "email", placeholder: "E-Mail", value: email, onChange: function (e) { return setEmail(e.target.value); }, className: "tw-input tw-input-bordered tw-w-full tw-max-w-xs" }),
1844
+ React.createElement("input", { type: "password", placeholder: "Password", onChange: function (e) { return setPassword(e.target.value); }, className: "tw-input tw-input-bordered tw-w-full tw-max-w-xs" }),
1845
+ React.createElement("div", { className: "tw-card-actions" },
1846
+ React.createElement("button", { className: loading ? 'tw-btn tw-btn-disabled tw-btn-block tw-btn-primary' : 'tw-btn tw-btn-primary tw-btn-block', onClick: function () { return onRegister(); } }, loading ? React.createElement("span", { className: "tw-loading tw-loading-spinner" }) : 'Sign Up')))));
698
1847
  }
699
1848
 
700
1849
  function AppShell(_a) {
701
- var name = _a.name, useAuth = _a.useAuth, children = _a.children;
1850
+ var appName = _a.appName, children = _a.children;
702
1851
  return (React.createElement(BrowserRouter, null,
703
1852
  React.createElement(ToastContainer, { position: "top-right", autoClose: 2000, hideProgressBar: true, newestOnTop: false, closeOnClick: true, rtl: false, pauseOnFocusLoss: true, draggable: true, pauseOnHover: true, theme: "light" }),
704
- React.createElement(NavBar, { name: name, useAuth: useAuth }),
1853
+ React.createElement(NavBar, { appName: appName }),
705
1854
  React.createElement("div", { id: "app-content", className: "tw-flex tw-!pl-[77px]" }, children)));
706
1855
  }
707
1856
 
@@ -752,7 +1901,7 @@ function SideBar(_a) {
752
1901
  init.current = true;
753
1902
  }
754
1903
  }, []);
755
- return (React.createElement("nav", { id: "sidenav", className: "group tw-fixed tw-left-0 tw-mt-16 tw-top-0 tw-z-[1035] tw-h-full tw--translate-x-full tw-overflow-hidden tw-bg-white tw-shadow-[0_4px_12px_0_rgba(0,0,0,0.07),_0_2px_4px_rgba(0,0,0,0.05)] data-[te-sidenav-slim='true']:tw-hidden data-[te-sidenav-slim-collapsed='true']:tw-w-[56px] data-[te-sidenav-slim='true']:tw-w-[56px] data-[te-sidenav-hidden='false']:tw-translate-x-0 dark:tw-bg-zinc-800 [&[data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='false']]:tw-hidden [&[data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='true']]:[display:unset]", "data-te-sidenav-init": true, "data-te-sidenav-hidden": "true", "data-te-sidenav-mode": "side", "data-te-sidenav-slim": "true", "data-te-sidenav-content": "#app-content", "data-te-sidenav-slim-collapsed": "true", "data-te-sidenav-slim-width": "56", "data-te-sidenav-width": "160" },
1904
+ return (React.createElement("nav", { id: "sidenav", className: "group tw-fixed tw-left-0 tw-mt-16 tw-top-0 tw-z-[1035] tw-h-full tw--translate-x-full tw-overflow-hidden tw-shadow-[0_4px_12px_0_rgba(0,0,0,0.07),_0_2px_4px_rgba(0,0,0,0.05)] data-[te-sidenav-slim='true']:tw-hidden data-[te-sidenav-slim-collapsed='true']:tw-w-[56px] data-[te-sidenav-slim='true']:tw-w-[56px] data-[te-sidenav-hidden='false']:tw-translate-x-0 dark:tw-bg-zinc-800 [&[data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='false']]:tw-hidden [&[data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='true']]:[display:unset]", "data-te-sidenav-init": true, "data-te-sidenav-hidden": "true", "data-te-sidenav-mode": "side", "data-te-sidenav-slim": "true", "data-te-sidenav-content": "#app-content", "data-te-sidenav-slim-collapsed": "true", "data-te-sidenav-slim-width": "56", "data-te-sidenav-width": "160" },
756
1905
  React.createElement("div", { className: 'tw-flex tw-flex-col tw-h-full', style: { height: "calc(100vh - 64px)" } },
757
1906
  React.createElement("ul", { className: "tw-menu tw-w-full tw-bg-base-100 tw-text-base-content tw-p-0", "data-te-sidenav-menu-ref": true }, routes.map(function (route, k) {
758
1907
  return (React.createElement("li", { className: "", key: k }, route.submenu ?
@@ -777,118 +1926,6 @@ function Content(_a) {
777
1926
  return (React.createElement("div", { className: 'tw-flex tw-flex-col tw-w-full tw-relative' }, children));
778
1927
  }
779
1928
 
780
- var AuthContext = createContext({
781
- isAuthenticated: false,
782
- user: null,
783
- login: function () { return Promise.reject(); },
784
- loading: false,
785
- logout: function () { },
786
- updateUser: function () { return Promise.reject(); },
787
- token: ""
788
- });
789
- var AuthProviderDirectus = function (_a) {
790
- var directus = _a.directus, children = _a.children;
791
- var _b = useState(null), user = _b[0], setUser = _b[1];
792
- var _c = useState(null), token = _c[0], setToken = _c[1];
793
- var _d = useState(false), loading = _d[0], setLoading = _d[1];
794
- var isAuthenticated = !!user;
795
- useEffect(function () {
796
- setLoading(true);
797
- loadUserFromDirectus();
798
- setLoading(false);
799
- }, []);
800
- function loadUserFromDirectus() {
801
- return __awaiter(this, void 0, void 0, function () {
802
- var token_1, me;
803
- return __generator(this, function (_a) {
804
- switch (_a.label) {
805
- case 0:
806
- _a.trys.push([0, 5, , 6]);
807
- return [4 /*yield*/, directus.auth.token];
808
- case 1:
809
- token_1 = _a.sent();
810
- if (!token_1) return [3 /*break*/, 3];
811
- return [4 /*yield*/, directus.users.me.read()];
812
- case 2:
813
- me = _a.sent();
814
- setUser(me);
815
- setToken(token_1);
816
- setLoading(false);
817
- return [2 /*return*/, me];
818
- case 3: return [2 /*return*/, undefined];
819
- case 4: return [3 /*break*/, 6];
820
- case 5:
821
- _a.sent();
822
- setLoading(false);
823
- return [2 /*return*/, undefined];
824
- case 6: return [2 /*return*/];
825
- }
826
- });
827
- });
828
- }
829
- var login = function (credentials) { return __awaiter(void 0, void 0, void 0, function () {
830
- var error_2;
831
- return __generator(this, function (_a) {
832
- switch (_a.label) {
833
- case 0:
834
- setLoading(true);
835
- _a.label = 1;
836
- case 1:
837
- _a.trys.push([1, 4, , 5]);
838
- return [4 /*yield*/, directus.auth.login(credentials)];
839
- case 2:
840
- _a.sent();
841
- return [4 /*yield*/, loadUserFromDirectus()];
842
- case 3: return [2 /*return*/, (_a.sent())];
843
- case 4:
844
- error_2 = _a.sent();
845
- setLoading(false);
846
- console.log(error_2.response.data.error[0]);
847
- return [2 /*return*/, error_2.response.data.error[0]];
848
- case 5:
849
- return [2 /*return*/];
850
- }
851
- });
852
- }); };
853
- var logout = function () { return __awaiter(void 0, void 0, void 0, function () {
854
- return __generator(this, function (_a) {
855
- switch (_a.label) {
856
- case 0: return [4 /*yield*/, directus.auth.logout()];
857
- case 1:
858
- _a.sent();
859
- setUser(null);
860
- return [2 /*return*/];
861
- }
862
- });
863
- }); };
864
- var updateUser = function (user) { return __awaiter(void 0, void 0, void 0, function () {
865
- var res, error_3;
866
- return __generator(this, function (_a) {
867
- switch (_a.label) {
868
- case 0:
869
- setLoading(true);
870
- _a.label = 1;
871
- case 1:
872
- _a.trys.push([1, 3, , 4]);
873
- return [4 /*yield*/, directus.users.updateOne(user.id, user)];
874
- case 2:
875
- res = _a.sent();
876
- setUser(res);
877
- setLoading(false);
878
- return [2 /*return*/, res];
879
- case 3:
880
- error_3 = _a.sent();
881
- setLoading(false);
882
- console.log(error_3.response.data.error[0]);
883
- return [2 /*return*/, error_3.response.data.error[0]];
884
- case 4: return [2 /*return*/];
885
- }
886
- });
887
- }); };
888
- return (React.createElement(AuthContext.Provider, { value: { isAuthenticated: isAuthenticated, user: user, login: login, loading: loading, logout: logout, updateUser: updateUser, token: token } }, children));
889
- };
890
- var useAuthDirectus = function () { return useContext(AuthContext); };
891
-
892
1929
  function Subtitle(_a) {
893
1930
  var styleClass = _a.styleClass, children = _a.children;
894
1931
  return (React.createElement("div", { className: "tw-text-xl tw-font-semibold ".concat(styleClass) }, children));
@@ -904,48 +1941,14 @@ function TitleCard(_a) {
904
1941
  React.createElement("div", { className: 'tw-h-full tw-w-full tw-pb-6 tw-bg-base-100' }, children)));
905
1942
  }
906
1943
 
907
- function InputText(_a) {
908
- var labelTitle = _a.labelTitle, labelStyle = _a.labelStyle, type = _a.type, containerStyle = _a.containerStyle, defaultValue = _a.defaultValue, placeholder = _a.placeholder, updateFormValue = _a.updateFormValue;
909
- var _b = useState(defaultValue), value = _b[0], setValue = _b[1];
910
- useEffect(function () {
911
- setValue(defaultValue);
912
- }, [defaultValue]);
913
- var updateInputValue = function (val) {
914
- setValue(val);
915
- updateFormValue(val);
916
- };
917
- return (React.createElement("div", { className: "tw-form-control tw-w-full ".concat(containerStyle) },
918
- labelTitle ? React.createElement("label", { className: "tw-label" },
919
- React.createElement("span", { className: "tw-label-text tw-text-base-content " + labelStyle }, labelTitle))
920
- : " ",
921
- React.createElement("input", { type: type || "text", value: value, placeholder: placeholder || "", onChange: function (e) { return updateInputValue(e.target.value); }, className: "tw-input tw-input-bordered tw-w-full " })));
922
- }
923
-
924
- function TextAreaInput(_a) {
925
- var labelTitle = _a.labelTitle, labelStyle = _a.labelStyle, containerStyle = _a.containerStyle, defaultValue = _a.defaultValue, placeholder = _a.placeholder, updateFormValue = _a.updateFormValue;
926
- var _b = useState(defaultValue), value = _b[0], setValue = _b[1];
927
- useEffect(function () {
928
- setValue(defaultValue);
929
- }, [defaultValue]);
930
- var updateInputValue = function (val) {
931
- setValue(val);
932
- updateFormValue(val);
933
- };
934
- return (React.createElement("div", { className: "tw-form-control tw-w-full ".concat(containerStyle) },
935
- React.createElement("label", { className: "tw-label" },
936
- React.createElement("span", { className: "tw-label-text tw-text-base-content " + labelStyle }, labelTitle)),
937
- React.createElement("textarea", { value: value, className: "tw-textarea tw-textarea-bordered tw-w-full tw-min-h-64", placeholder: placeholder || "", onChange: function (e) { return updateInputValue(e.target.value); } })));
938
- }
939
-
940
- function Settings(_a) {
941
- var useAuth = _a.useAuth;
942
- var _b = useAuth(), user = _b.user, updateUser = _b.updateUser, loading = _b.loading;
943
- var _c = useState(""), id = _c[0], setId = _c[1];
944
- var _d = useState(""), name = _d[0], setName = _d[1];
945
- var _e = useState(""), text = _e[0], setText = _e[1];
946
- var _f = useState(""), email = _f[0], setEmail = _f[1];
947
- var _g = useState(""), password = _g[0], setPassword = _g[1];
948
- var _h = useState(false), passwordChanged = _h[0], setPasswordChanged = _h[1];
1944
+ function Settings() {
1945
+ var _a = useAuth(), user = _a.user, updateUser = _a.updateUser, loading = _a.loading;
1946
+ var _b = useState(""), id = _b[0], setId = _b[1];
1947
+ var _c = useState(""), name = _c[0], setName = _c[1];
1948
+ var _d = useState(""), text = _d[0], setText = _d[1];
1949
+ var _e = useState(""), email = _e[0], setEmail = _e[1];
1950
+ var _f = useState(""), password = _f[0], setPassword = _f[1];
1951
+ var _g = useState(false), passwordChanged = _g[0], setPasswordChanged = _g[1];
949
1952
  useEffect(function () {
950
1953
  setId((user === null || user === void 0 ? void 0 : user.id) ? user.id : "");
951
1954
  setName((user === null || user === void 0 ? void 0 : user.first_name) ? user.first_name : "");
@@ -973,13 +1976,13 @@ function Settings(_a) {
973
1976
  React.createElement("div", { className: 'tw-w-full xl:tw-max-w-6xl' },
974
1977
  React.createElement(TitleCard, { title: "Profile Settings", topMargin: "tw-mt-2" },
975
1978
  React.createElement("div", { className: "tw-grid tw-grid-cols-1 tw-md:grid-cols-2 tw-gap-6" },
976
- React.createElement(InputText, { labelTitle: "Name", defaultValue: (user === null || user === void 0 ? void 0 : user.first_name) ? user.first_name : "", updateFormValue: function (v) { return setName(v); } })),
1979
+ React.createElement(TextInput, { placeholder: "Name", defaultValue: (user === null || user === void 0 ? void 0 : user.first_name) ? user.first_name : "", updateFormValue: function (v) { return setName(v); } })),
977
1980
  React.createElement("div", { className: "tw-grid tw-grid-cols-1 tw-md:grid-cols-1 tw-gap-6 tw-pt-6 tw-pb-6" },
978
- React.createElement(TextAreaInput, { labelTitle: "About", defaultValue: (user === null || user === void 0 ? void 0 : user.description) ? user.description : "", updateFormValue: function (v) { return setText(v); } })),
1981
+ React.createElement(TextAreaInput, { placeholder: "About me, Contact, #Tags, ...", defaultValue: (user === null || user === void 0 ? void 0 : user.description) ? user.description : "", updateFormValue: function (v) { return setText(v); }, inputStyle: 'tw-h-64' })),
979
1982
  React.createElement("div", { className: "tw-divider" }),
980
1983
  React.createElement("div", { className: "tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6" },
981
- React.createElement(InputText, { type: 'email', labelTitle: "E-Mail", defaultValue: (user === null || user === void 0 ? void 0 : user.email) ? user.email : "", updateFormValue: function (v) { return setEmail(v); } }),
982
- React.createElement(InputText, { type: 'password', labelTitle: "Password", defaultValue: (user === null || user === void 0 ? void 0 : user.password) ? user.password : "", updateFormValue: function (v) {
1984
+ React.createElement(TextInput, { type: 'email', placeholder: "E-Mail", defaultValue: (user === null || user === void 0 ? void 0 : user.email) ? user.email : "", updateFormValue: function (v) { return setEmail(v); } }),
1985
+ React.createElement(TextInput, { type: 'password', placeholder: "new Password", defaultValue: (user === null || user === void 0 ? void 0 : user.password) ? user.password : "", updateFormValue: function (v) {
983
1986
  setPassword(v);
984
1987
  setPasswordChanged(true);
985
1988
  } })),
@@ -1082,8 +2085,20 @@ function Quests() {
1082
2085
  return (React.createElement(React.Fragment, null));
1083
2086
  }
1084
2087
 
1085
- var css_248z = "/*\n! tailwindcss v3.3.1 | MIT License | https://tailwindcss.com\n*//*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n*/\n\nhtml {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: Roboto, sans-serif; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font family by default.\n2. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden] {\n display: none;\n}\n\n:root,\n[data-theme] {\n background-color: hsl(var(--b1) / var(--tw-bg-opacity, 1));\n color: hsl(var(--bc) / var(--tw-text-opacity, 1));\n}\n\nhtml {\n -webkit-tap-highlight-color: transparent;\n}\n\n:root {\n color-scheme: light;\n --pf: 259 94% 44%;\n --sf: 314 100% 40%;\n --af: 174 75% 39%;\n --nf: 214 20% 14%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 259 94% 51%;\n --pc: 259 96% 91%;\n --s: 314 100% 47%;\n --sc: 314 100% 91%;\n --a: 174 75% 46%;\n --ac: 174 75% 11%;\n --n: 214 20% 21%;\n --nc: 212 19% 87%;\n --b1: 0 0% 100%;\n --b2: 0 0% 95%;\n --b3: 180 2% 90%;\n --bc: 215 28% 17%;\n}\n\n@media (prefers-color-scheme: dark) {\n\n :root {\n color-scheme: dark;\n --pf: 262 80% 43%;\n --sf: 316 70% 43%;\n --af: 175 70% 34%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 262 80% 50%;\n --pc: 0 0% 100%;\n --s: 316 70% 50%;\n --sc: 0 0% 100%;\n --a: 175 70% 41%;\n --ac: 0 0% 100%;\n --n: 213 18% 20%;\n --nf: 212 17% 17%;\n --nc: 220 13% 69%;\n --b1: 212 18% 14%;\n --b2: 213 18% 12%;\n --b3: 213 18% 10%;\n --bc: 220 13% 69%;\n }\n}\n\n[data-theme=light] {\n color-scheme: light;\n --pf: 259 94% 44%;\n --sf: 314 100% 40%;\n --af: 174 75% 39%;\n --nf: 214 20% 14%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 259 94% 51%;\n --pc: 259 96% 91%;\n --s: 314 100% 47%;\n --sc: 314 100% 91%;\n --a: 174 75% 46%;\n --ac: 174 75% 11%;\n --n: 214 20% 21%;\n --nc: 212 19% 87%;\n --b1: 0 0% 100%;\n --b2: 0 0% 95%;\n --b3: 180 2% 90%;\n --bc: 215 28% 17%;\n}\n\n[data-theme=dark] {\n color-scheme: dark;\n --pf: 262 80% 43%;\n --sf: 316 70% 43%;\n --af: 175 70% 34%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 262 80% 50%;\n --pc: 0 0% 100%;\n --s: 316 70% 50%;\n --sc: 0 0% 100%;\n --a: 175 70% 41%;\n --ac: 0 0% 100%;\n --n: 213 18% 20%;\n --nf: 212 17% 17%;\n --nc: 220 13% 69%;\n --b1: 212 18% 14%;\n --b2: 213 18% 12%;\n --b3: 213 18% 10%;\n --bc: 220 13% 69%;\n}\n\n*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n.tw-alert {\n display: grid;\n width: 100%;\n grid-auto-flow: row;\n align-content: flex-start;\n align-items: center;\n justify-items: center;\n gap: 1rem;\n text-align: center;\n border-width: 1px;\n --tw-border-opacity: 1;\n border-color: hsl(var(--b2) / var(--tw-border-opacity));\n padding: 1rem;\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n border-radius: var(--rounded-box, 1rem);\n --alert-bg: hsl(var(--b2));\n --alert-bg-mix: hsl(var(--b1));\n background-color: var(--alert-bg);\n}\n@media (min-width: 640px) {\n\n .tw-alert {\n grid-auto-flow: column;\n grid-template-columns: auto minmax(auto,1fr);\n justify-items: start;\n text-align: left;\n }\n}\n.tw-avatar {\n position: relative;\n display: inline-flex;\n}\n.tw-avatar > div {\n display: block;\n aspect-ratio: 1 / 1;\n overflow: hidden;\n}\n.tw-avatar img {\n height: 100%;\n width: 100%;\n -o-object-fit: cover;\n object-fit: cover;\n}\n.tw-avatar.tw-placeholder > div {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n@media (hover:hover) {\n\n .tw-checkbox-success:hover {\n --tw-border-opacity: 1;\n border-color: hsl(var(--su) / var(--tw-border-opacity));\n }\n\n .tw-label a:hover {\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n }\n\n .tw-menu li > *:not(ul):not(details):active,\n.tw-menu li > *:not(ul):not(details).tw-active,\n.tw-menu li > details > summary:active {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--n) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--nc) / var(--tw-text-opacity));\n }\n}\n.tw-btn {\n display: inline-flex;\n flex-shrink: 0;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n border-color: transparent;\n border-color: hsl(var(--b2) / var(--tw-border-opacity));\n text-align: center;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: var(--rounded-btn, 0.5rem);\n height: 3rem;\n padding-left: 1rem;\n padding-right: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 1em;\n min-height: 3rem;\n gap: 0.5rem;\n font-weight: 600;\n text-decoration-line: none;\n border-width: var(--border-btn, 1px);\n animation: button-pop var(--animation-btn, 0.25s) ease-out;\n text-transform: var(--btn-text-case, uppercase);\n --tw-border-opacity: 1;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n outline-color: hsl(var(--bc) / 1);\n}\n.tw-btn-disabled,\n .tw-btn[disabled],\n .tw-btn:disabled {\n pointer-events: none;\n}\n.tw-btn-square {\n height: 3rem;\n width: 3rem;\n padding: 0px;\n}\n.tw-btn-circle {\n height: 3rem;\n width: 3rem;\n border-radius: 9999px;\n padding: 0px;\n}\n.tw-btn-group > input[type=\"radio\"].tw-btn {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.tw-btn-group > input[type=\"radio\"].tw-btn:before {\n content: attr(data-title);\n}\n.tw-btn:is(input[type=\"checkbox\"]),\n.tw-btn:is(input[type=\"radio\"]) {\n width: auto;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.tw-btn:is(input[type=\"checkbox\"]):after,\n.tw-btn:is(input[type=\"radio\"]):after {\n --tw-content: attr(aria-label);\n content: var(--tw-content);\n}\n.tw-card {\n position: relative;\n display: flex;\n flex-direction: column;\n border-radius: var(--rounded-box, 1rem);\n}\n.tw-card:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-card-body {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n padding: var(--padding-card, 2rem);\n gap: 0.5rem;\n}\n.tw-card-body :where(p) {\n flex-grow: 1;\n}\n.tw-card-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: 0.5rem;\n}\n.tw-card figure {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.tw-card.tw-image-full {\n display: grid;\n}\n.tw-card.tw-image-full:before {\n position: relative;\n content: \"\";\n z-index: 10;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--n) / var(--tw-bg-opacity));\n opacity: 0.75;\n border-radius: var(--rounded-box, 1rem);\n}\n.tw-card.tw-image-full:before,\n .tw-card.tw-image-full > * {\n grid-column-start: 1;\n grid-row-start: 1;\n}\n.tw-card.tw-image-full > figure img {\n height: 100%;\n -o-object-fit: cover;\n object-fit: cover;\n}\n.tw-card.tw-image-full > .tw-card-body {\n position: relative;\n z-index: 20;\n --tw-text-opacity: 1;\n color: hsl(var(--nc) / var(--tw-text-opacity));\n}\n.tw-checkbox {\n flex-shrink: 0;\n --chkbg: var(--bc);\n --chkfg: var(--b1);\n height: 1.5rem;\n width: 1.5rem;\n cursor: pointer;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n border-width: 1px;\n border-color: hsl(var(--bc) / var(--tw-border-opacity));\n --tw-border-opacity: 0.2;\n border-radius: var(--rounded-btn, 0.5rem);\n}\n.tw-divider {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n margin-top: 1rem;\n margin-bottom: 1rem;\n height: 1rem;\n white-space: nowrap;\n}\n.tw-divider:before,\n .tw-divider:after {\n content: \"\";\n flex-grow: 1;\n height: 0.125rem;\n width: 100%;\n}\n.tw-dropdown {\n position: relative;\n display: inline-block;\n}\n.tw-dropdown > *:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-dropdown .tw-dropdown-content {\n position: absolute;\n}\n.tw-dropdown:is(:not(details)) .tw-dropdown-content {\n visibility: hidden;\n opacity: 0;\n transform-origin: top;\n --tw-scale-x: .95;\n --tw-scale-y: .95;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n.tw-dropdown-end .tw-dropdown-content {\n right: 0px;\n}\n.tw-dropdown-left .tw-dropdown-content {\n top: 0px;\n right: 100%;\n bottom: auto;\n transform-origin: right;\n}\n.tw-dropdown-right .tw-dropdown-content {\n left: 100%;\n top: 0px;\n bottom: auto;\n transform-origin: left;\n}\n.tw-dropdown-bottom .tw-dropdown-content {\n bottom: auto;\n top: 100%;\n transform-origin: top;\n}\n.tw-dropdown-top .tw-dropdown-content {\n bottom: 100%;\n top: auto;\n transform-origin: bottom;\n}\n.tw-dropdown-end.tw-dropdown-right .tw-dropdown-content {\n bottom: 0px;\n top: auto;\n}\n.tw-dropdown-end.tw-dropdown-left .tw-dropdown-content {\n bottom: 0px;\n top: auto;\n}\n.tw-dropdown.tw-dropdown-open .tw-dropdown-content,\n.tw-dropdown:not(.tw-dropdown-hover):focus .tw-dropdown-content,\n.tw-dropdown:focus-within .tw-dropdown-content {\n visibility: visible;\n opacity: 1;\n}\n@media (hover: hover) {\n\n .tw-dropdown.tw-dropdown-hover:hover .tw-dropdown-content {\n visibility: visible;\n opacity: 1;\n }\n\n .tw-btn:hover {\n --tw-border-opacity: 1;\n border-color: hsl(var(--b3) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b3) / var(--tw-bg-opacity));\n }\n\n .tw-btn-primary:hover {\n --tw-border-opacity: 1;\n border-color: hsl(var(--pf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--pf) / var(--tw-bg-opacity));\n }\n\n .tw-btn-neutral:hover {\n --tw-border-opacity: 1;\n border-color: hsl(var(--nf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--nf) / var(--tw-bg-opacity));\n }\n\n .tw-btn.tw-glass:hover {\n --glass-opacity: 25%;\n --glass-border-opacity: 15%;\n }\n\n .tw-btn-ghost:hover {\n --tw-border-opacity: 0;\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n --tw-bg-opacity: 0.2;\n }\n\n .tw-btn-outline.tw-btn-primary:hover {\n --tw-border-opacity: 1;\n border-color: hsl(var(--pf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--pf) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--pc) / var(--tw-text-opacity));\n }\n\n .tw-btn-disabled:hover,\n .tw-btn[disabled]:hover,\n .tw-btn:disabled:hover {\n --tw-border-opacity: 0;\n background-color: hsl(var(--n) / var(--tw-bg-opacity));\n --tw-bg-opacity: 0.2;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n --tw-text-opacity: 0.2;\n }\n\n .tw-btn:is(input[type=\"checkbox\"]:checked):hover, .tw-btn:is(input[type=\"radio\"]:checked):hover {\n --tw-border-opacity: 1;\n border-color: hsl(var(--pf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--pf) / var(--tw-bg-opacity));\n }\n\n .tw-dropdown.tw-dropdown-hover:hover .tw-dropdown-content {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n }\n\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(.tw-active):hover, :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(.tw-active):hover {\n cursor: pointer;\n background-color: hsl(var(--bc) / 0.1);\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n}\n.tw-dropdown:is(details) summary::-webkit-details-marker {\n display: none;\n}\n.tw-form-control {\n display: flex;\n flex-direction: column;\n}\n.tw-label {\n display: flex;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n align-items: center;\n justify-content: space-between;\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.tw-input {\n flex-shrink: 1;\n height: 3rem;\n padding-left: 1rem;\n padding-right: 1rem;\n font-size: 1rem;\n line-height: 2;\n line-height: 1.5rem;\n border-width: 1px;\n border-color: hsl(var(--bc) / var(--tw-border-opacity));\n --tw-border-opacity: 0;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b1) / var(--tw-bg-opacity));\n border-radius: var(--rounded-btn, 0.5rem);\n}\n.tw-input-group > .tw-input {\n isolation: isolate;\n}\n.tw-input-group > *,\n .tw-input-group > .tw-input,\n .tw-input-group > .tw-textarea,\n .tw-input-group > .tw-select {\n border-radius: 0px;\n}\n.tw-menu {\n display: flex;\n flex-direction: column;\n flex-wrap: wrap;\n font-size: 0.875rem;\n line-height: 1.25rem;\n padding: 0.5rem;\n}\n.tw-menu :where(li ul) {\n position: relative;\n white-space: nowrap;\n margin-left: 1rem;\n padding-left: 0.5rem;\n}\n.tw-menu :where(li:not(.tw-menu-title) > *:not(ul):not(details):not(.tw-menu-title)),\n .tw-menu :where(li:not(.tw-menu-title) > details > summary:not(.tw-menu-title)) {\n display: grid;\n grid-auto-flow: column;\n align-content: flex-start;\n align-items: center;\n gap: 0.5rem;\n grid-auto-columns: max-content auto max-content;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.tw-menu li.tw-disabled {\n cursor: not-allowed;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n color: hsl(var(--bc) / 0.3);\n}\n.tw-menu :where(li > .tw-menu-dropdown:not(.tw-menu-dropdown-show)) {\n display: none;\n}\n:where(.tw-menu li) {\n position: relative;\n display: flex;\n flex-shrink: 0;\n flex-direction: column;\n flex-wrap: wrap;\n align-items: stretch;\n}\n:where(.tw-menu li) .tw-badge {\n justify-self: end;\n}\n.tw-modal {\n pointer-events: none;\n position: fixed;\n inset: 0px;\n margin: 0px;\n display: grid;\n height: 100%;\n max-height: none;\n width: 100%;\n max-width: none;\n justify-items: center;\n padding: 0px;\n opacity: 0;\n overscroll-behavior: contain;\n z-index: 999;\n background-color: transparent;\n color: inherit;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-property: transform, opacity, visibility;\n overflow-y: hidden;\n}\n:where(.tw-modal) {\n align-items: center;\n}\n.tw-modal-box {\n max-height: calc(100vh - 5em);\n grid-column-start: 1;\n grid-row-start: 1;\n width: 91.666667%;\n max-width: 32rem;\n --tw-scale-x: .9;\n --tw-scale-y: .9;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b1) / var(--tw-bg-opacity));\n padding: 1.5rem;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n border-top-left-radius: var(--rounded-box, 1rem);\n border-top-right-radius: var(--rounded-box, 1rem);\n border-bottom-left-radius: var(--rounded-box, 1rem);\n border-bottom-right-radius: var(--rounded-box, 1rem);\n box-shadow: rgba(0, 0, 0, 0.25) 0px 25px 50px -12px;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n.tw-modal-open,\n.tw-modal:target,\n.tw-modal-toggle:checked + .tw-modal,\n.tw-modal[open] {\n pointer-events: auto;\n visibility: visible;\n opacity: 1;\n}\n.tw-modal-action {\n display: flex;\n margin-top: 1.5rem;\n justify-content: flex-end;\n}\n.tw-modal-toggle {\n position: fixed;\n height: 0px;\n width: 0px;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n opacity: 0;\n}\n:root:has(:is(.tw-modal-open, .tw-modal:target, .tw-modal-toggle:checked + .tw-modal, .tw-modal[open])) {\n overflow: hidden;\n}\n.tw-navbar {\n display: flex;\n align-items: center;\n padding: var(--navbar-padding, 0.5rem);\n min-height: 4rem;\n width: 100%;\n}\n:where(.tw-navbar > *) {\n display: inline-flex;\n align-items: center;\n}\n.tw-textarea {\n flex-shrink: 1;\n min-height: 3rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n padding-right: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 2;\n border-width: 1px;\n border-color: hsl(var(--bc) / var(--tw-border-opacity));\n --tw-border-opacity: 0;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b1) / var(--tw-bg-opacity));\n border-radius: var(--rounded-btn, 0.5rem);\n}\n.tw-avatar-group :where(.tw-avatar) {\n overflow: hidden;\n border-radius: 9999px;\n border-width: 4px;\n --tw-border-opacity: 1;\n border-color: hsl(var(--b1) / var(--tw-border-opacity));\n}\n.tw-btm-nav > * .tw-label {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.tw-btn:active:hover,\n .tw-btn:active:focus {\n animation: button-pop 0s ease-out;\n transform: scale(var(--btn-focus-scale, 0.97));\n}\n.tw-btn:focus-visible {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n}\n.tw-btn-primary {\n --tw-border-opacity: 1;\n border-color: hsl(var(--p) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--p) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--pc) / var(--tw-text-opacity));\n outline-color: hsl(var(--p) / 1);\n}\n.tw-btn-primary.tw-btn-active {\n --tw-border-opacity: 1;\n border-color: hsl(var(--pf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--pf) / var(--tw-bg-opacity));\n}\n.tw-btn-neutral {\n --tw-border-opacity: 1;\n border-color: hsl(var(--n) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--n) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--nc) / var(--tw-text-opacity));\n outline-color: hsl(var(--n) / 1);\n}\n.tw-btn-neutral.tw-btn-active {\n --tw-border-opacity: 1;\n border-color: hsl(var(--nf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--nf) / var(--tw-bg-opacity));\n}\n.tw-btn.tw-glass {\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n outline-color: currentColor;\n}\n.tw-btn.tw-glass.tw-btn-active {\n --glass-opacity: 25%;\n --glass-border-opacity: 15%;\n}\n.tw-btn-ghost {\n border-width: 1px;\n border-color: transparent;\n background-color: transparent;\n color: currentColor;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n outline-color: currentColor;\n}\n.tw-btn-ghost.tw-btn-active {\n --tw-border-opacity: 0;\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n --tw-bg-opacity: 0.2;\n}\n.tw-btn-outline.tw-btn-primary {\n --tw-text-opacity: 1;\n color: hsl(var(--p) / var(--tw-text-opacity));\n}\n.tw-btn-outline.tw-btn-primary.tw-btn-active {\n --tw-border-opacity: 1;\n border-color: hsl(var(--pf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--pf) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--pc) / var(--tw-text-opacity));\n}\n.tw-btn.tw-btn-disabled,\n .tw-btn[disabled],\n .tw-btn:disabled {\n --tw-border-opacity: 0;\n background-color: hsl(var(--n) / var(--tw-bg-opacity));\n --tw-bg-opacity: 0.2;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n --tw-text-opacity: 0.2;\n}\n.tw-btn-group > input[type=\"radio\"]:checked.tw-btn,\n .tw-btn-group > .tw-btn-active {\n --tw-border-opacity: 1;\n border-color: hsl(var(--p) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--p) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--pc) / var(--tw-text-opacity));\n}\n.tw-btn-group > input[type=\"radio\"]:checked.tw-btn:focus-visible, .tw-btn-group > .tw-btn-active:focus-visible {\n outline-style: solid;\n outline-width: 2px;\n outline-color: hsl(var(--p) / 1);\n}\n.tw-btn:is(input[type=\"checkbox\"]:checked),\n.tw-btn:is(input[type=\"radio\"]:checked) {\n --tw-border-opacity: 1;\n border-color: hsl(var(--p) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--p) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--pc) / var(--tw-text-opacity));\n}\n.tw-btn:is(input[type=\"checkbox\"]:checked):focus-visible, .tw-btn:is(input[type=\"radio\"]:checked):focus-visible {\n outline-color: hsl(var(--p) / 1);\n}\n@keyframes button-pop {\n\n 0% {\n transform: scale(var(--btn-focus-scale, 0.98));\n }\n\n 40% {\n transform: scale(1.02);\n }\n\n 100% {\n transform: scale(1);\n }\n}\n.tw-card :where(figure:first-child) {\n overflow: hidden;\n border-start-start-radius: inherit;\n border-start-end-radius: inherit;\n border-end-start-radius: unset;\n border-end-end-radius: unset;\n}\n.tw-card :where(figure:last-child) {\n overflow: hidden;\n border-start-start-radius: unset;\n border-start-end-radius: unset;\n border-end-start-radius: inherit;\n border-end-end-radius: inherit;\n}\n.tw-card:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n.tw-card.tw-bordered {\n border-width: 1px;\n --tw-border-opacity: 1;\n border-color: hsl(var(--b2) / var(--tw-border-opacity));\n}\n.tw-card.tw-compact .tw-card-body {\n padding: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.tw-card-title {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 1.25rem;\n line-height: 1.75rem;\n font-weight: 600;\n}\n.tw-card.tw-image-full :where(figure) {\n overflow: hidden;\n border-radius: inherit;\n}\n.tw-checkbox:focus-visible {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: hsl(var(--bc) / 1);\n}\n.tw-checkbox:checked,\n .tw-checkbox[checked=\"true\"],\n .tw-checkbox[aria-checked=\"true\"] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n background-repeat: no-repeat;\n animation: checkmark var(--animation-input, 0.2s) ease-in-out;\n background-image: linear-gradient(-45deg, transparent 65%, hsl(var(--chkbg)) 65.99%),\n linear-gradient(45deg, transparent 75%, hsl(var(--chkbg)) 75.99%),\n linear-gradient(-45deg, hsl(var(--chkbg)) 40%, transparent 40.99%),\n linear-gradient(\n 45deg,\n hsl(var(--chkbg)) 30%,\n hsl(var(--chkfg)) 30.99%,\n hsl(var(--chkfg)) 40%,\n transparent 40.99%\n ),\n linear-gradient(-45deg, hsl(var(--chkfg)) 50%, hsl(var(--chkbg)) 50.99%);\n}\n.tw-checkbox:indeterminate {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n background-repeat: no-repeat;\n animation: checkmark var(--animation-input, 0.2s) ease-in-out;\n background-image: linear-gradient(90deg, transparent 80%, hsl(var(--chkbg)) 80%),\n linear-gradient(-90deg, transparent 80%, hsl(var(--chkbg)) 80%),\n linear-gradient(\n 0deg,\n hsl(var(--chkbg)) 43%,\n hsl(var(--chkfg)) 43%,\n hsl(var(--chkfg)) 57%,\n hsl(var(--chkbg)) 57%\n );\n}\n.tw-checkbox-success {\n --chkbg: var(--su);\n --chkfg: var(--suc);\n --tw-border-opacity: 1;\n border-color: hsl(var(--su) / var(--tw-border-opacity));\n}\n.tw-checkbox-success:focus-visible {\n outline-color: hsl(var(--su) / 1);\n}\n.tw-checkbox-success:checked,\n .tw-checkbox-success[checked=\"true\"],\n .tw-checkbox-success[aria-checked=\"true\"] {\n --tw-border-opacity: 1;\n border-color: hsl(var(--su) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--su) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--suc) / var(--tw-text-opacity));\n}\n.tw-checkbox:disabled {\n cursor: not-allowed;\n border-color: transparent;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n opacity: 0.2;\n}\n@keyframes checkmark {\n\n 0% {\n background-position-y: 5px;\n }\n\n 50% {\n background-position-y: -2px;\n }\n\n 100% {\n background-position-y: 0;\n }\n}\n[dir=\"rtl\"] .tw-checkbox:checked,\n [dir=\"rtl\"] .tw-checkbox[checked=\"true\"],\n [dir=\"rtl\"] .tw-checkbox[aria-checked=\"true\"] {\n background-image: linear-gradient(45deg, transparent 65%, hsl(var(--chkbg)) 65.99%),\n linear-gradient(-45deg, transparent 75%, hsl(var(--chkbg)) 75.99%),\n linear-gradient(45deg, hsl(var(--chkbg)) 40%, transparent 40.99%),\n linear-gradient(\n -45deg,\n hsl(var(--chkbg)) 30%,\n hsl(var(--chkfg)) 30.99%,\n hsl(var(--chkfg)) 40%,\n transparent 40.99%\n ),\n linear-gradient(45deg, hsl(var(--chkfg)) 50%, hsl(var(--chkbg)) 50.99%);\n}\n.tw-divider:before {\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n --tw-bg-opacity: 0.1;\n}\n.tw-divider:after {\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n --tw-bg-opacity: 0.1;\n}\n.tw-divider:not(:empty) {\n gap: 1rem;\n}\n.tw-dropdown.tw-dropdown-open .tw-dropdown-content,\n.tw-dropdown:focus .tw-dropdown-content,\n.tw-dropdown:focus-within .tw-dropdown-content {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.tw-label-text {\n font-size: 0.875rem;\n line-height: 1.25rem;\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n}\n.tw-input[list]::-webkit-calendar-picker-indicator {\n line-height: 1em;\n}\n.tw-input-bordered {\n --tw-border-opacity: 0.2;\n}\n.tw-input:focus {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: hsl(var(--bc) / 0.2);\n}\n.tw-input-disabled,\n .tw-input:disabled,\n .tw-input[disabled] {\n cursor: not-allowed;\n --tw-border-opacity: 1;\n border-color: hsl(var(--b2) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n --tw-text-opacity: 0.2;\n}\n.tw-input-disabled::-moz-placeholder, .tw-input:disabled::-moz-placeholder, .tw-input[disabled]::-moz-placeholder {\n color: hsl(var(--bc) / var(--tw-placeholder-opacity));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-input-disabled::placeholder,\n .tw-input:disabled::placeholder,\n .tw-input[disabled]::placeholder {\n color: hsl(var(--bc) / var(--tw-placeholder-opacity));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-loading {\n pointer-events: none;\n display: inline-block;\n aspect-ratio: 1 / 1;\n width: 1.5rem;\n background-color: currentColor;\n -webkit-mask-size: 100%;\n mask-size: 100%;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-position: center;\n mask-position: center;\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-in-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-in-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n:where(.tw-menu li:empty) {\n background-color: hsl(var(--bc) / 0.1);\n margin: 0.5rem 1rem;\n height: 1px;\n}\n.tw-menu :where(li ul):before {\n position: absolute;\n left: 0px;\n top: 0.75rem;\n bottom: 0.75rem;\n width: 1px;\n background-color: hsl(var(--bc) / 0.1);\n content: \"\";\n}\n.tw-menu :where(li:not(.tw-menu-title) > *:not(ul):not(details):not(.tw-menu-title)),\n.tw-menu :where(li:not(.tw-menu-title) > details > summary:not(.tw-menu-title)) {\n padding-left: 1rem;\n padding-right: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n text-align: left;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: var(--rounded-btn, 0.5rem);\n}\n:where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(summary):not(.tw-active).tw-focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(summary):not(.tw-active):focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):is(summary):not(.tw-active):focus-visible,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(summary):not(.tw-active).tw-focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(summary):not(.tw-active):focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):is(summary):not(.tw-active):focus-visible {\n cursor: pointer;\n background-color: hsl(var(--bc) / 0.1);\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-menu li > *:not(ul):not(details):active,\n.tw-menu li > *:not(ul):not(details).tw-active,\n.tw-menu li > details > summary:active {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--n) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--nc) / var(--tw-text-opacity));\n}\n.tw-menu :where(li > details > summary)::-webkit-details-marker {\n display: none;\n}\n.tw-menu :where(li > details > summary):after,\n.tw-menu :where(li > .tw-menu-dropdown-toggle):after {\n justify-self: end;\n display: block;\n margin-top: -0.5rem;\n height: 0.5rem;\n width: 0.5rem;\n transform: rotate(45deg);\n transition-property: transform, margin-top;\n transition-duration: 0.3s;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n content: \"\";\n transform-origin: 75% 75%;\n box-shadow: 2px 2px;\n pointer-events: none;\n}\n.tw-menu :where(li > details[open] > summary):after,\n.tw-menu :where(li > .tw-menu-dropdown-toggle.tw-menu-dropdown-show):after {\n transform: rotate(225deg);\n margin-top: 0;\n}\n.tw-mockup-browser .tw-mockup-browser-toolbar .tw-input {\n position: relative;\n margin-left: auto;\n margin-right: auto;\n display: block;\n height: 1.75rem;\n width: 24rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n padding-left: 2rem;\n}\n.tw-mockup-browser .tw-mockup-browser-toolbar .tw-input:before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 0.5rem;\n aspect-ratio: 1 / 1;\n height: 0.75rem;\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-radius: 9999px;\n border-width: 2px;\n border-color: currentColor;\n opacity: 0.6;\n}\n.tw-mockup-browser .tw-mockup-browser-toolbar .tw-input:after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 1.25rem;\n height: 0.5rem;\n --tw-translate-y: 25%;\n --tw-rotate: -45deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-radius: 9999px;\n border-width: 1px;\n border-color: currentColor;\n opacity: 0.6;\n}\n.tw-modal:not(dialog:not(.tw-modal-open)),\n .tw-modal::backdrop {\n background-color: rgba(0, 0, 0, 0.3);\n animation: modal-pop 0.2s ease-out;\n}\n.tw-modal-backdrop {\n z-index: -1;\n grid-column-start: 1;\n grid-row-start: 1;\n display: grid;\n align-self: stretch;\n justify-self: stretch;\n color: transparent;\n}\n.tw-modal-open .tw-modal-box,\n.tw-modal-toggle:checked + .tw-modal .tw-modal-box,\n.tw-modal:target .tw-modal-box,\n.tw-modal[open] .tw-modal-box {\n --tw-translate-y: 0px;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.tw-modal-action > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n}\n@keyframes modal-pop {\n\n 0% {\n opacity: 0;\n }\n}\n@keyframes progress-loading {\n\n 50% {\n background-position-x: -115%;\n }\n}\n@keyframes radiomark {\n\n 0% {\n box-shadow: 0 0 0 12px hsl(var(--b1)) inset, 0 0 0 12px hsl(var(--b1)) inset;\n }\n\n 50% {\n box-shadow: 0 0 0 3px hsl(var(--b1)) inset, 0 0 0 3px hsl(var(--b1)) inset;\n }\n\n 100% {\n box-shadow: 0 0 0 4px hsl(var(--b1)) inset, 0 0 0 4px hsl(var(--b1)) inset;\n }\n}\n@keyframes rating-pop {\n\n 0% {\n transform: translateY(-0.125em);\n }\n\n 40% {\n transform: translateY(-0.125em);\n }\n\n 100% {\n transform: translateY(0);\n }\n}\n.tw-textarea-bordered {\n --tw-border-opacity: 0.2;\n}\n.tw-textarea:focus {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: hsl(var(--bc) / 0.2);\n}\n.tw-textarea-disabled,\n .tw-textarea:disabled,\n .tw-textarea[disabled] {\n cursor: not-allowed;\n --tw-border-opacity: 1;\n border-color: hsl(var(--b2) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n --tw-text-opacity: 0.2;\n}\n.tw-textarea-disabled::-moz-placeholder, .tw-textarea:disabled::-moz-placeholder, .tw-textarea[disabled]::-moz-placeholder {\n color: hsl(var(--bc) / var(--tw-placeholder-opacity));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-textarea-disabled::placeholder,\n .tw-textarea:disabled::placeholder,\n .tw-textarea[disabled]::placeholder {\n color: hsl(var(--bc) / var(--tw-placeholder-opacity));\n --tw-placeholder-opacity: 0.2;\n}\n@keyframes toast-pop {\n\n 0% {\n transform: scale(0.9);\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n.tw-tooltip.tw-tooltip-primary {\n --tooltip-color: hsl(var(--p));\n --tooltip-text-color: hsl(var(--pc));\n}\n.tw-tooltip.tw-tooltip-secondary {\n --tooltip-color: hsl(var(--s));\n --tooltip-text-color: hsl(var(--sc));\n}\n.tw-tooltip.tw-tooltip-accent {\n --tooltip-color: hsl(var(--a));\n --tooltip-text-color: hsl(var(--ac));\n}\n.tw-tooltip.tw-tooltip-info {\n --tooltip-color: hsl(var(--in));\n --tooltip-text-color: hsl(var(--inc));\n}\n.tw-tooltip.tw-tooltip-success {\n --tooltip-color: hsl(var(--su));\n --tooltip-text-color: hsl(var(--suc));\n}\n.tw-tooltip.tw-tooltip-warning {\n --tooltip-color: hsl(var(--wa));\n --tooltip-text-color: hsl(var(--wac));\n}\n.tw-tooltip.tw-tooltip-error {\n --tooltip-color: hsl(var(--er));\n --tooltip-text-color: hsl(var(--erc));\n}\n.tw-rounded-box {\n border-radius: var(--rounded-box, 1rem);\n}\n.tw-btn-sm {\n height: 2rem;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n min-height: 2rem;\n font-size: 0.875rem;\n}\n.tw-btn-block {\n width: 100%;\n}\n.tw-btn-square:where(.tw-btn-xs) {\n height: 1.5rem;\n width: 1.5rem;\n padding: 0px;\n}\n.tw-btn-square:where(.tw-btn-sm) {\n height: 2rem;\n width: 2rem;\n padding: 0px;\n}\n.tw-btn-square:where(.tw-btn-md) {\n height: 3rem;\n width: 3rem;\n padding: 0px;\n}\n.tw-btn-square:where(.tw-btn-lg) {\n height: 4rem;\n width: 4rem;\n padding: 0px;\n}\n.tw-btn-circle:where(.tw-btn-xs) {\n height: 1.5rem;\n width: 1.5rem;\n border-radius: 9999px;\n padding: 0px;\n}\n.tw-btn-circle:where(.tw-btn-sm) {\n height: 2rem;\n width: 2rem;\n border-radius: 9999px;\n padding: 0px;\n}\n.tw-btn-circle:where(.tw-btn-md) {\n height: 3rem;\n width: 3rem;\n border-radius: 9999px;\n padding: 0px;\n}\n.tw-btn-circle:where(.tw-btn-lg) {\n height: 4rem;\n width: 4rem;\n border-radius: 9999px;\n padding: 0px;\n}\n.tw-checkbox-xs {\n height: 1rem;\n width: 1rem;\n}\n.tw-tooltip {\n position: relative;\n display: inline-block;\n --tooltip-offset: calc(100% + 1px + var(--tooltip-tail, 0px));\n}\n.tw-tooltip:before {\n position: absolute;\n pointer-events: none;\n z-index: 1;\n content: var(--tw-content);\n --tw-content: attr(data-tip);\n}\n.tw-tooltip:before, .tw-tooltip-top:before {\n transform: translateX(-50%);\n top: auto;\n left: 50%;\n right: auto;\n bottom: var(--tooltip-offset);\n}\n.tw-tooltip-left:before {\n transform: translateY(-50%);\n top: 50%;\n left: auto;\n right: var(--tooltip-offset);\n bottom: auto;\n}\n.tw-avatar.tw-online:before {\n content: \"\";\n position: absolute;\n z-index: 10;\n display: block;\n border-radius: 9999px;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--su) / var(--tw-bg-opacity));\n outline-style: solid;\n outline-width: 2px;\n outline-color: hsl(var(--b1) / 1);\n width: 15%;\n height: 15%;\n top: 7%;\n right: 7%;\n}\n.tw-avatar.tw-offline:before {\n content: \"\";\n position: absolute;\n z-index: 10;\n display: block;\n border-radius: 9999px;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b3) / var(--tw-bg-opacity));\n outline-style: solid;\n outline-width: 2px;\n outline-color: hsl(var(--b1) / 1);\n width: 15%;\n height: 15%;\n top: 7%;\n right: 7%;\n}\n.tw-btn-group .tw-btn:not(:first-child):not(:last-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n.tw-btn-group .tw-btn:first-child:not(:last-child) {\n margin-top: -0px;\n margin-left: -1px;\n border-top-left-radius: var(--rounded-btn, 0.5rem);\n border-top-right-radius: 0;\n border-bottom-left-radius: var(--rounded-btn, 0.5rem);\n border-bottom-right-radius: 0;\n}\n.tw-btn-group .tw-btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: var(--rounded-btn, 0.5rem);\n border-bottom-left-radius: 0;\n border-bottom-right-radius: var(--rounded-btn, 0.5rem);\n}\n.tw-btn-group-horizontal .tw-btn:not(:first-child):not(:last-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n.tw-btn-group-horizontal .tw-btn:first-child:not(:last-child) {\n margin-top: -0px;\n margin-left: -1px;\n border-top-left-radius: var(--rounded-btn, 0.5rem);\n border-top-right-radius: 0;\n border-bottom-left-radius: var(--rounded-btn, 0.5rem);\n border-bottom-right-radius: 0;\n}\n.tw-btn-group-horizontal .tw-btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: var(--rounded-btn, 0.5rem);\n border-bottom-left-radius: 0;\n border-bottom-right-radius: var(--rounded-btn, 0.5rem);\n}\n.tw-btn-group-vertical .tw-btn:first-child:not(:last-child) {\n margin-top: -1px;\n margin-left: -0px;\n border-top-left-radius: var(--rounded-btn, 0.5rem);\n border-top-right-radius: var(--rounded-btn, 0.5rem);\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n.tw-btn-group-vertical .tw-btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-left-radius: var(--rounded-btn, 0.5rem);\n border-bottom-right-radius: var(--rounded-btn, 0.5rem);\n}\n.tw-card-compact .tw-card-body {\n padding: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.tw-card-compact .tw-card-title {\n margin-bottom: 0.25rem;\n}\n.tw-card-normal .tw-card-body {\n padding: var(--padding-card, 2rem);\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.tw-card-normal .tw-card-title {\n margin-bottom: 0.75rem;\n}\n.tw-modal-top :where(.tw-modal-box) {\n width: 100%;\n max-width: none;\n --tw-translate-y: -2.5rem;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-top-left-radius: 0px;\n border-top-right-radius: 0px;\n border-bottom-left-radius: var(--rounded-box, 1rem);\n border-bottom-right-radius: var(--rounded-box, 1rem);\n}\n.tw-modal-middle :where(.tw-modal-box) {\n width: 91.666667%;\n max-width: 32rem;\n --tw-translate-y: 0px;\n --tw-scale-x: .9;\n --tw-scale-y: .9;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-top-left-radius: var(--rounded-box, 1rem);\n border-top-right-radius: var(--rounded-box, 1rem);\n border-bottom-left-radius: var(--rounded-box, 1rem);\n border-bottom-right-radius: var(--rounded-box, 1rem);\n}\n.tw-modal-bottom :where(.tw-modal-box) {\n width: 100%;\n max-width: none;\n --tw-translate-y: 2.5rem;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-bottom-right-radius: 0px;\n border-bottom-left-radius: 0px;\n border-top-left-radius: var(--rounded-box, 1rem);\n border-top-right-radius: var(--rounded-box, 1rem);\n}\n.tw-tooltip {\n position: relative;\n display: inline-block;\n text-align: center;\n --tooltip-tail: 0.1875rem;\n --tooltip-color: hsl(var(--n));\n --tooltip-text-color: hsl(var(--nc));\n --tooltip-tail-offset: calc(100% + 0.0625rem - var(--tooltip-tail));\n}\n.tw-tooltip:before,\n.tw-tooltip:after {\n opacity: 0;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-delay: 100ms;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n.tw-tooltip:after {\n position: absolute;\n content: \"\";\n border-style: solid;\n border-width: var(--tooltip-tail, 0);\n width: 0;\n height: 0;\n display: block;\n}\n.tw-tooltip:before {\n max-width: 20rem;\n border-radius: 0.25rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n background-color: var(--tooltip-color);\n color: var(--tooltip-text-color);\n width: -moz-max-content;\n width: max-content;\n}\n.tw-tooltip.tw-tooltip-open:before,\n.tw-tooltip.tw-tooltip-open:after,\n.tw-tooltip:hover:before,\n.tw-tooltip:hover:after {\n opacity: 1;\n transition-delay: 75ms;\n}\n.tw-tooltip:has(:focus-visible):after,\n.tw-tooltip:has(:focus-visible):before {\n opacity: 1;\n transition-delay: 75ms;\n}\n.tw-tooltip:not([data-tip]):hover:before,\n.tw-tooltip:not([data-tip]):hover:after {\n visibility: hidden;\n opacity: 0;\n}\n.tw-tooltip:after, .tw-tooltip-top:after {\n transform: translateX(-50%);\n border-color: var(--tooltip-color) transparent transparent transparent;\n top: auto;\n left: 50%;\n right: auto;\n bottom: var(--tooltip-tail-offset);\n}\n.tw-tooltip-left:after {\n transform: translateY(-50%);\n border-color: transparent transparent transparent var(--tooltip-color);\n top: 50%;\n left: auto;\n right: calc(var(--tooltip-tail-offset) + 0.0625rem);\n bottom: auto;\n}\n.tw-fixed {\n position: fixed;\n}\n.tw-absolute {\n position: absolute;\n}\n.tw-relative {\n position: relative;\n}\n.tw-inset-y-0 {\n top: 0px;\n bottom: 0px;\n}\n.tw-bottom-4 {\n bottom: 1rem;\n}\n.tw-bottom-5 {\n bottom: 1.25rem;\n}\n.tw-left-0 {\n left: 0px;\n}\n.tw-left-4 {\n left: 1rem;\n}\n.tw-right-2 {\n right: 0.5rem;\n}\n.tw-right-5 {\n right: 1.25rem;\n}\n.tw-top-0 {\n top: 0px;\n}\n.tw-top-2 {\n top: 0.5rem;\n}\n.tw-top-20 {\n top: 5rem;\n}\n.\\!tw-z-\\[1000\\] {\n z-index: 1000 !important;\n}\n.tw-z-1000 {\n z-index: 1000;\n}\n.tw-z-500 {\n z-index: 500;\n}\n.tw-z-\\[1035\\] {\n z-index: 1035;\n}\n.tw-col-span-1 {\n grid-column: span 1 / span 1;\n}\n.tw-col-span-5 {\n grid-column: span 5 / span 5;\n}\n.tw-float-right {\n float: right;\n}\n.tw-m-0 {\n margin: 0px;\n}\n.tw-m-1 {\n margin: 0.25rem;\n}\n.tw-m-auto {\n margin: auto;\n}\n.tw-mx-2 {\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n}\n.tw-mb-0 {\n margin-bottom: 0px;\n}\n.tw-mb-16 {\n margin-bottom: 4rem;\n}\n.tw-mb-2 {\n margin-bottom: 0.5rem;\n}\n.tw-mb-4 {\n margin-bottom: 1rem;\n}\n.tw-ml-2 {\n margin-left: 0.5rem;\n}\n.tw-mr-2 {\n margin-right: 0.5rem;\n}\n.tw-mt-16 {\n margin-top: 4rem;\n}\n.tw-mt-2 {\n margin-top: 0.5rem;\n}\n.tw-mt-3 {\n margin-top: 0.75rem;\n}\n.tw-mt-4 {\n margin-top: 1rem;\n}\n.tw-mt-5 {\n margin-top: 1.25rem;\n}\n.tw-mt-6 {\n margin-top: 1.5rem;\n}\n.tw-mt-8 {\n margin-top: 2rem;\n}\n.tw-inline-block {\n display: inline-block;\n}\n.tw-flex {\n display: flex;\n}\n.tw-grid {\n display: grid;\n}\n.tw-hidden {\n display: none;\n}\n.tw-h-10 {\n height: 2.5rem;\n}\n.tw-h-14 {\n height: 3.5rem;\n}\n.tw-h-4 {\n height: 1rem;\n}\n.tw-h-40 {\n height: 10rem;\n}\n.tw-h-5 {\n height: 1.25rem;\n}\n.tw-h-6 {\n height: 1.5rem;\n}\n.tw-h-fit {\n height: -moz-fit-content;\n height: fit-content;\n}\n.tw-h-full {\n height: 100%;\n}\n.tw-max-h-72 {\n max-height: 18rem;\n}\n.tw-min-h-0 {\n min-height: 0px;\n}\n.tw-min-h-64 {\n min-height: 240px;\n}\n.tw-w-1 {\n width: 0.25rem;\n}\n.tw-w-10 {\n width: 2.5rem;\n}\n.tw-w-14 {\n width: 3.5rem;\n}\n.tw-w-48 {\n width: 12rem;\n}\n.tw-w-5 {\n width: 1.25rem;\n}\n.tw-w-52 {\n width: 13rem;\n}\n.tw-w-6 {\n width: 1.5rem;\n}\n.tw-w-72 {\n width: 18rem;\n}\n.tw-w-\\[56px\\] {\n width: 56px;\n}\n.tw-w-full {\n width: 100%;\n}\n.tw-min-w-80 {\n min-width: 320px;\n}\n.tw-max-w-72 {\n max-width: 288px;\n}\n.tw-max-w-xs {\n max-width: 20rem;\n}\n.tw-max-w-52 {\n max-width: 208px;\n}\n.tw-flex-1 {\n flex: 1 1 0%;\n}\n.tw-flex-none {\n flex: none;\n}\n.tw-basis-1\\/5 {\n flex-basis: 20%;\n}\n.tw-basis-2\\/5 {\n flex-basis: 40%;\n}\n.tw--translate-x-full {\n --tw-translate-x: -100%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.tw-translate-x-0 {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.tw-rotate-180 {\n --tw-rotate: 180deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.tw-cursor-pointer {\n cursor: pointer;\n}\n.tw-list-none {\n list-style-type: none;\n}\n.tw-grid-flow-col {\n grid-auto-flow: column;\n}\n.tw-grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n}\n.tw-grid-cols-6 {\n grid-template-columns: repeat(6, minmax(0, 1fr));\n}\n.tw-flex-row {\n flex-direction: row;\n}\n.tw-flex-col {\n flex-direction: column;\n}\n.tw-place-content-center {\n place-content: center;\n}\n.tw-place-items-end {\n place-items: end;\n}\n.tw-justify-normal {\n justify-content: normal;\n}\n.tw-justify-end {\n justify-content: flex-end;\n}\n.tw-justify-center {\n justify-content: center;\n}\n.tw-gap-6 {\n gap: 1.5rem;\n}\n.tw-place-self-center {\n place-self: center;\n}\n.tw-overflow-hidden {\n overflow: hidden;\n}\n.tw-overflow-y-auto {\n overflow-y: auto;\n}\n.tw-overflow-x-hidden {\n overflow-x: hidden;\n}\n.tw-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.tw-rounded-full {\n border-radius: 9999px;\n}\n.tw-rounded-none {\n border-radius: 0px;\n}\n.\\!tw-rounded-none {\n border-radius: 0px !important;\n}\n.tw-rounded-br-md {\n border-bottom-right-radius: 0.375rem;\n}\n.tw-rounded-tr-md {\n border-top-right-radius: 0.375rem;\n}\n.tw-border-0 {\n border-width: 0px;\n}\n.tw-border-none {\n border-style: none;\n}\n.tw-bg-base-100 {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b1) / var(--tw-bg-opacity));\n}\n.tw-bg-base-200 {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n}\n.tw-bg-primary {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--p) / var(--tw-bg-opacity));\n}\n.tw-bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity));\n}\n.tw-stroke-current {\n stroke: currentColor;\n}\n.tw-p-0 {\n padding: 0px;\n}\n.tw-p-2 {\n padding: 0.5rem;\n}\n.tw-p-4 {\n padding: 1rem;\n}\n.tw-p-6 {\n padding: 1.5rem;\n}\n.tw-px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.tw-px-6 {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n.tw-py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n.tw-pb-0 {\n padding-bottom: 0px;\n}\n.tw-pb-6 {\n padding-bottom: 1.5rem;\n}\n.tw-pl-2 {\n padding-left: 0.5rem;\n}\n.tw-pl-4 {\n padding-left: 1rem;\n}\n.tw-pr-2 {\n padding-right: 0.5rem;\n}\n.tw-pr-4 {\n padding-right: 1rem;\n}\n.tw-pt-0 {\n padding-top: 0px;\n}\n.tw-pt-1 {\n padding-top: 0.25rem;\n}\n.tw-pt-6 {\n padding-top: 1.5rem;\n}\n.tw-pt-8 {\n padding-top: 2rem;\n}\n.tw-align-middle {\n vertical-align: middle;\n}\n.tw-text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.tw-text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.tw-text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.tw-font-bold {\n font-weight: 700;\n}\n.tw-font-normal {\n font-weight: 400;\n}\n.tw-font-semibold {\n font-weight: 600;\n}\n.tw-normal-case {\n text-transform: none;\n}\n.tw-leading-3 {\n line-height: .75rem;\n}\n.tw-leading-5 {\n line-height: 1.25rem;\n}\n.tw-leading-6 {\n line-height: 1.5rem;\n}\n.\\!tw-text-blue-800 {\n --tw-text-opacity: 1 !important;\n color: rgb(30 64 175 / var(--tw-text-opacity)) !important;\n}\n.\\!tw-text-red-800 {\n --tw-text-opacity: 1 !important;\n color: rgb(153 27 27 / var(--tw-text-opacity)) !important;\n}\n.tw-text-base-content {\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n}\n.tw-text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity));\n}\n.tw-text-green-900 {\n --tw-text-opacity: 1;\n color: rgb(20 83 45 / var(--tw-text-opacity));\n}\n.tw-text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n.tw-shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tw-shadow-\\[0_4px_12px_0_rgba\\(0\\,0\\,0\\,0\\.07\\)\\,_0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.05\\)\\] {\n --tw-shadow: 0 4px 12px 0 rgba(0,0,0,0.07), 0 2px 4px rgba(0,0,0,0.05);\n --tw-shadow-colored: 0 4px 12px 0 var(--tw-shadow-color), 0 2px 4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tw-shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tw-drop-shadow-md {\n --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06));\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.tw-transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.tw-transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.tw-duration-200 {\n transition-duration: 200ms;\n}\n.tw-duration-500 {\n transition-duration: 500ms;\n}\n.tw-ease-in {\n transition-timing-function: cubic-bezier(0.4, 0, 1, 1);\n}\n\n.tw-modal {\n z-index: 1200 !important;\n}\n\n.tw-menu li a {\n border-radius: 10px;\n}\n\n.tw-modal {\n z-index: 1200 !important;\n}\n\n.tw-modal-box {\n max-height: calc(100vh - 2em);\n}\n\n.hover\\:tw-bg-gray-100:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity));\n}\n\n.hover\\:tw-bg-gray-300:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(209 213 219 / var(--tw-bg-opacity));\n}\n\n.hover\\:tw-bg-white:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity));\n}\n\n.hover\\:tw-text-gray-700:hover {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity));\n}\n\n.hover\\:tw-text-red-950:hover {\n --tw-text-opacity: 1;\n color: rgb(69 10 10 / var(--tw-text-opacity));\n}\n\n.focus\\:tw-outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.data-\\[te-sidenav-slim\\=\\'true\\'\\]\\:tw-hidden[data-te-sidenav-slim='true'] {\n display: none;\n}\n\n.data-\\[te-sidenav-slim-collapsed\\=\\'true\\'\\]\\:tw-w-\\[56px\\][data-te-sidenav-slim-collapsed='true'] {\n width: 56px;\n}\n\n.data-\\[te-sidenav-slim\\=\\'true\\'\\]\\:tw-w-\\[56px\\][data-te-sidenav-slim='true'] {\n width: 56px;\n}\n\n.data-\\[te-sidenav-hidden\\=\\'false\\'\\]\\:tw-translate-x-0[data-te-sidenav-hidden='false'] {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.tw-group[data-te-sidenav-slim-collapsed='true'] .group-\\[\\&\\[data-te-sidenav-slim-collapsed\\=\\'true\\'\\]\\]\\:data-\\[te-sidenav-slim\\=\\'false\\'\\]\\:tw-hidden[data-te-sidenav-slim='false'] {\n display: none;\n}\n\n:is(.tw-dark .dark\\:tw-bg-zinc-800) {\n --tw-bg-opacity: 1;\n background-color: rgb(39 39 42 / var(--tw-bg-opacity));\n}\n\n@media (min-width: 768px) {\n\n .md\\:tw-grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n}\n\n@media (min-width: 1280px) {\n\n .xl\\:tw-max-w-6xl {\n max-width: 72rem;\n }\n}\n\n.\\[\\&\\[data-te-sidenav-slim-collapsed\\=\\'true\\'\\]\\[data-te-sidenav-slim\\=\\'false\\'\\]\\]\\:tw-hidden[data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='false'] {\n display: none;\n}\n\n.\\[\\&\\[data-te-sidenav-slim-collapsed\\=\\'true\\'\\]\\[data-te-sidenav-slim\\=\\'true\\'\\]\\]\\:\\[display\\:unset\\][data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='true'] {\n display: unset;\n}";
2088
+ function CardPage(_a) {
2089
+ var title = _a.title, children = _a.children;
2090
+ return (React.createElement("main", { className: "tw-flex-1 tw-overflow-y-auto tw-overflow-x-hidden tw-pt-2 tw-px-6 tw-bg-base-200 tw-min-w-80 tw-flex tw-justify-center" },
2091
+ React.createElement("div", { className: 'tw-w-full xl:tw-max-w-6xl' },
2092
+ React.createElement("div", { className: "tw-text-sm tw-breadcrumbs" },
2093
+ React.createElement("ul", null,
2094
+ React.createElement("li", null,
2095
+ React.createElement(Link, { to: '/' }, "Home")),
2096
+ React.createElement("li", null, title))),
2097
+ React.createElement(TitleCard, { title: title, topMargin: "mt-2" }, children))));
2098
+ }
2099
+
2100
+ var css_248z = "/*\n! tailwindcss v3.3.1 | MIT License | https://tailwindcss.com\n*//*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n*/\n\nhtml {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: Roboto, sans-serif; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font family by default.\n2. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden] {\n display: none;\n}\n\n:root,\n[data-theme] {\n background-color: hsl(var(--b1) / var(--tw-bg-opacity, 1));\n color: hsl(var(--bc) / var(--tw-text-opacity, 1));\n}\n\nhtml {\n -webkit-tap-highlight-color: transparent;\n}\n\n:root {\n color-scheme: light;\n --pf: 259 94% 44%;\n --sf: 314 100% 40%;\n --af: 174 75% 39%;\n --nf: 214 20% 14%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 259 94% 51%;\n --pc: 259 96% 91%;\n --s: 314 100% 47%;\n --sc: 314 100% 91%;\n --a: 174 75% 46%;\n --ac: 174 75% 11%;\n --n: 214 20% 21%;\n --nc: 212 19% 87%;\n --b1: 0 0% 100%;\n --b2: 0 0% 95%;\n --b3: 180 2% 90%;\n --bc: 215 28% 17%;\n}\n\n@media (prefers-color-scheme: dark) {\n\n :root {\n color-scheme: dark;\n --pf: 262 80% 43%;\n --sf: 316 70% 43%;\n --af: 175 70% 34%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 262 80% 50%;\n --pc: 0 0% 100%;\n --s: 316 70% 50%;\n --sc: 0 0% 100%;\n --a: 175 70% 41%;\n --ac: 0 0% 100%;\n --n: 213 18% 20%;\n --nf: 212 17% 17%;\n --nc: 220 13% 69%;\n --b1: 212 18% 14%;\n --b2: 213 18% 12%;\n --b3: 213 18% 10%;\n --bc: 220 13% 69%;\n }\n}\n\n[data-theme=light] {\n color-scheme: light;\n --pf: 259 94% 44%;\n --sf: 314 100% 40%;\n --af: 174 75% 39%;\n --nf: 214 20% 14%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 259 94% 51%;\n --pc: 259 96% 91%;\n --s: 314 100% 47%;\n --sc: 314 100% 91%;\n --a: 174 75% 46%;\n --ac: 174 75% 11%;\n --n: 214 20% 21%;\n --nc: 212 19% 87%;\n --b1: 0 0% 100%;\n --b2: 0 0% 95%;\n --b3: 180 2% 90%;\n --bc: 215 28% 17%;\n}\n\n[data-theme=dark] {\n color-scheme: dark;\n --pf: 262 80% 43%;\n --sf: 316 70% 43%;\n --af: 175 70% 34%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 262 80% 50%;\n --pc: 0 0% 100%;\n --s: 316 70% 50%;\n --sc: 0 0% 100%;\n --a: 175 70% 41%;\n --ac: 0 0% 100%;\n --n: 213 18% 20%;\n --nf: 212 17% 17%;\n --nc: 220 13% 69%;\n --b1: 212 18% 14%;\n --b2: 213 18% 12%;\n --b3: 213 18% 10%;\n --bc: 220 13% 69%;\n}\n\n[data-theme=cupcake] {\n color-scheme: light;\n --pf: 183 47% 52%;\n --sf: 338 71% 71%;\n --af: 39 84% 51%;\n --nf: 280 46% 7%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --pc: 183 20% 13%;\n --sc: 340 15% 16%;\n --ac: 37 41% 13%;\n --nc: 283 9% 81%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --p: 183 47% 59%;\n --s: 338 71% 78%;\n --a: 39 84% 58%;\n --n: 280 46% 14%;\n --b1: 24 33% 97%;\n --b2: 27 22% 92%;\n --b3: 23 14% 89%;\n --bc: 280 46% 14%;\n --rounded-btn: 1.9rem;\n --tab-border: 2px;\n --tab-radius: .5rem;\n}\n\n[data-theme=forest] {\n color-scheme: dark;\n --pf: 141 72% 35%;\n --sf: 164 73% 35%;\n --af: 175 73% 35%;\n --nf: 161 37% 8%;\n --b2: 0 12% 1%;\n --b3: 0 0% 0%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --bc: 360 1% 79%;\n --sc: 158 32% 11%;\n --ac: 172 31% 11%;\n --nc: 157 7% 81%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 141 72% 42%;\n --pc: 0 0% 0%;\n --s: 164 73% 42%;\n --a: 175 73% 42%;\n --n: 161 37% 15%;\n --b1: 0 12% 8%;\n --rounded-btn: 1.9rem;\n}\n\n[data-theme=cyberpunk] {\n color-scheme: light;\n --pf: 345 100% 66%;\n --sf: 195 80% 63%;\n --af: 276 74% 64%;\n --nf: 57 100% 6%;\n --b2: 56 100% 43%;\n --b3: 56 100% 36%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --bc: 53 46% 13%;\n --pc: 348 27% 15%;\n --sc: 196 23% 15%;\n --ac: 277 22% 15%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n font-family: ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;\n --p: 345 100% 73%;\n --s: 195 80% 70%;\n --a: 276 74% 71%;\n --n: 57 100% 13%;\n --nc: 56 100% 50%;\n --b1: 56 100% 50%;\n --rounded-box: 0;\n --rounded-btn: 0;\n --rounded-badge: 0;\n --tab-radius: 0;\n}\n\n*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n.tw-alert {\n display: grid;\n width: 100%;\n grid-auto-flow: row;\n align-content: flex-start;\n align-items: center;\n justify-items: center;\n gap: 1rem;\n text-align: center;\n border-width: 1px;\n --tw-border-opacity: 1;\n border-color: hsl(var(--b2) / var(--tw-border-opacity));\n padding: 1rem;\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n border-radius: var(--rounded-box, 1rem);\n --alert-bg: hsl(var(--b2));\n --alert-bg-mix: hsl(var(--b1));\n background-color: var(--alert-bg);\n}\n@media (min-width: 640px) {\n\n .tw-alert {\n grid-auto-flow: column;\n grid-template-columns: auto minmax(auto,1fr);\n justify-items: start;\n text-align: left;\n }\n}\n.tw-avatar {\n position: relative;\n display: inline-flex;\n}\n.tw-avatar > div {\n display: block;\n aspect-ratio: 1 / 1;\n overflow: hidden;\n}\n.tw-avatar img {\n height: 100%;\n width: 100%;\n -o-object-fit: cover;\n object-fit: cover;\n}\n.tw-avatar.tw-placeholder > div {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.tw-breadcrumbs {\n max-width: 100%;\n overflow-x: auto;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.tw-breadcrumbs > ul,\n .tw-breadcrumbs > ol {\n display: flex;\n align-items: center;\n white-space: nowrap;\n min-height: -moz-min-content;\n min-height: min-content;\n}\n.tw-breadcrumbs > ul > li, .tw-breadcrumbs > ol > li {\n display: flex;\n align-items: center;\n}\n.tw-breadcrumbs > ul > li > a, .tw-breadcrumbs > ol > li > a {\n display: flex;\n cursor: pointer;\n align-items: center;\n}\n@media (hover:hover) {\n\n .tw-breadcrumbs > ul > li > a:hover, .tw-breadcrumbs > ol > li > a:hover {\n text-decoration-line: underline;\n }\n\n .tw-checkbox-success:hover {\n --tw-border-opacity: 1;\n border-color: hsl(var(--su) / var(--tw-border-opacity));\n }\n\n .tw-label a:hover {\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n }\n\n .tw-menu li > *:not(ul):not(details):active,\n.tw-menu li > *:not(ul):not(details).tw-active,\n.tw-menu li > details > summary:active {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--n) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--nc) / var(--tw-text-opacity));\n }\n}\n.tw-btn {\n display: inline-flex;\n flex-shrink: 0;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n border-color: transparent;\n border-color: hsl(var(--b2) / var(--tw-border-opacity));\n text-align: center;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: var(--rounded-btn, 0.5rem);\n height: 3rem;\n padding-left: 1rem;\n padding-right: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 1em;\n min-height: 3rem;\n gap: 0.5rem;\n font-weight: 600;\n text-decoration-line: none;\n border-width: var(--border-btn, 1px);\n animation: button-pop var(--animation-btn, 0.25s) ease-out;\n text-transform: var(--btn-text-case, uppercase);\n --tw-border-opacity: 1;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n outline-color: hsl(var(--bc) / 1);\n}\n.tw-btn-disabled,\n .tw-btn[disabled],\n .tw-btn:disabled {\n pointer-events: none;\n}\n.tw-btn-square {\n height: 3rem;\n width: 3rem;\n padding: 0px;\n}\n.tw-btn-circle {\n height: 3rem;\n width: 3rem;\n border-radius: 9999px;\n padding: 0px;\n}\n.tw-btn-group > input[type=\"radio\"].tw-btn {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.tw-btn-group > input[type=\"radio\"].tw-btn:before {\n content: attr(data-title);\n}\n.tw-btn:is(input[type=\"checkbox\"]),\n.tw-btn:is(input[type=\"radio\"]) {\n width: auto;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.tw-btn:is(input[type=\"checkbox\"]):after,\n.tw-btn:is(input[type=\"radio\"]):after {\n --tw-content: attr(aria-label);\n content: var(--tw-content);\n}\n.tw-card {\n position: relative;\n display: flex;\n flex-direction: column;\n border-radius: var(--rounded-box, 1rem);\n}\n.tw-card:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-card-body {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n padding: var(--padding-card, 2rem);\n gap: 0.5rem;\n}\n.tw-card-body :where(p) {\n flex-grow: 1;\n}\n.tw-card-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: 0.5rem;\n}\n.tw-card figure {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.tw-card.tw-image-full {\n display: grid;\n}\n.tw-card.tw-image-full:before {\n position: relative;\n content: \"\";\n z-index: 10;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--n) / var(--tw-bg-opacity));\n opacity: 0.75;\n border-radius: var(--rounded-box, 1rem);\n}\n.tw-card.tw-image-full:before,\n .tw-card.tw-image-full > * {\n grid-column-start: 1;\n grid-row-start: 1;\n}\n.tw-card.tw-image-full > figure img {\n height: 100%;\n -o-object-fit: cover;\n object-fit: cover;\n}\n.tw-card.tw-image-full > .tw-card-body {\n position: relative;\n z-index: 20;\n --tw-text-opacity: 1;\n color: hsl(var(--nc) / var(--tw-text-opacity));\n}\n.tw-checkbox {\n flex-shrink: 0;\n --chkbg: var(--bc);\n --chkfg: var(--b1);\n height: 1.5rem;\n width: 1.5rem;\n cursor: pointer;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n border-width: 1px;\n border-color: hsl(var(--bc) / var(--tw-border-opacity));\n --tw-border-opacity: 0.2;\n border-radius: var(--rounded-btn, 0.5rem);\n}\n.tw-divider {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n margin-top: 1rem;\n margin-bottom: 1rem;\n height: 1rem;\n white-space: nowrap;\n}\n.tw-divider:before,\n .tw-divider:after {\n content: \"\";\n flex-grow: 1;\n height: 0.125rem;\n width: 100%;\n}\n.tw-dropdown {\n position: relative;\n display: inline-block;\n}\n.tw-dropdown > *:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-dropdown .tw-dropdown-content {\n position: absolute;\n}\n.tw-dropdown:is(:not(details)) .tw-dropdown-content {\n visibility: hidden;\n opacity: 0;\n transform-origin: top;\n --tw-scale-x: .95;\n --tw-scale-y: .95;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n.tw-dropdown-end .tw-dropdown-content {\n right: 0px;\n}\n.tw-dropdown-left .tw-dropdown-content {\n top: 0px;\n right: 100%;\n bottom: auto;\n transform-origin: right;\n}\n.tw-dropdown-right .tw-dropdown-content {\n left: 100%;\n top: 0px;\n bottom: auto;\n transform-origin: left;\n}\n.tw-dropdown-bottom .tw-dropdown-content {\n bottom: auto;\n top: 100%;\n transform-origin: top;\n}\n.tw-dropdown-top .tw-dropdown-content {\n bottom: 100%;\n top: auto;\n transform-origin: bottom;\n}\n.tw-dropdown-end.tw-dropdown-right .tw-dropdown-content {\n bottom: 0px;\n top: auto;\n}\n.tw-dropdown-end.tw-dropdown-left .tw-dropdown-content {\n bottom: 0px;\n top: auto;\n}\n.tw-dropdown.tw-dropdown-open .tw-dropdown-content,\n.tw-dropdown:not(.tw-dropdown-hover):focus .tw-dropdown-content,\n.tw-dropdown:focus-within .tw-dropdown-content {\n visibility: visible;\n opacity: 1;\n}\n@media (hover: hover) {\n\n .tw-dropdown.tw-dropdown-hover:hover .tw-dropdown-content {\n visibility: visible;\n opacity: 1;\n }\n\n .tw-btn:hover {\n --tw-border-opacity: 1;\n border-color: hsl(var(--b3) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b3) / var(--tw-bg-opacity));\n }\n\n .tw-btn-primary:hover {\n --tw-border-opacity: 1;\n border-color: hsl(var(--pf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--pf) / var(--tw-bg-opacity));\n }\n\n .tw-btn-neutral:hover {\n --tw-border-opacity: 1;\n border-color: hsl(var(--nf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--nf) / var(--tw-bg-opacity));\n }\n\n .tw-btn.tw-glass:hover {\n --glass-opacity: 25%;\n --glass-border-opacity: 15%;\n }\n\n .tw-btn-ghost:hover {\n --tw-border-opacity: 0;\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n --tw-bg-opacity: 0.2;\n }\n\n .tw-btn-outline.tw-btn-primary:hover {\n --tw-border-opacity: 1;\n border-color: hsl(var(--pf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--pf) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--pc) / var(--tw-text-opacity));\n }\n\n .tw-btn-disabled:hover,\n .tw-btn[disabled]:hover,\n .tw-btn:disabled:hover {\n --tw-border-opacity: 0;\n background-color: hsl(var(--n) / var(--tw-bg-opacity));\n --tw-bg-opacity: 0.2;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n --tw-text-opacity: 0.2;\n }\n\n .tw-btn:is(input[type=\"checkbox\"]:checked):hover, .tw-btn:is(input[type=\"radio\"]:checked):hover {\n --tw-border-opacity: 1;\n border-color: hsl(var(--pf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--pf) / var(--tw-bg-opacity));\n }\n\n .tw-dropdown.tw-dropdown-hover:hover .tw-dropdown-content {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n }\n\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(.tw-active):hover, :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(.tw-active):hover {\n cursor: pointer;\n background-color: hsl(var(--bc) / 0.1);\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n}\n.tw-dropdown:is(details) summary::-webkit-details-marker {\n display: none;\n}\n.tw-form-control {\n display: flex;\n flex-direction: column;\n}\n.tw-label {\n display: flex;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n align-items: center;\n justify-content: space-between;\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.tw-input {\n flex-shrink: 1;\n height: 3rem;\n padding-left: 1rem;\n padding-right: 1rem;\n font-size: 1rem;\n line-height: 2;\n line-height: 1.5rem;\n border-width: 1px;\n border-color: hsl(var(--bc) / var(--tw-border-opacity));\n --tw-border-opacity: 0;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b1) / var(--tw-bg-opacity));\n border-radius: var(--rounded-btn, 0.5rem);\n}\n.tw-input-group > .tw-input {\n isolation: isolate;\n}\n.tw-input-group > *,\n .tw-input-group > .tw-input,\n .tw-input-group > .tw-textarea,\n .tw-input-group > .tw-select {\n border-radius: 0px;\n}\n.tw-menu {\n display: flex;\n flex-direction: column;\n flex-wrap: wrap;\n font-size: 0.875rem;\n line-height: 1.25rem;\n padding: 0.5rem;\n}\n.tw-menu :where(li ul) {\n position: relative;\n white-space: nowrap;\n margin-left: 1rem;\n padding-left: 0.5rem;\n}\n.tw-menu :where(li:not(.tw-menu-title) > *:not(ul):not(details):not(.tw-menu-title)),\n .tw-menu :where(li:not(.tw-menu-title) > details > summary:not(.tw-menu-title)) {\n display: grid;\n grid-auto-flow: column;\n align-content: flex-start;\n align-items: center;\n gap: 0.5rem;\n grid-auto-columns: max-content auto max-content;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.tw-menu li.tw-disabled {\n cursor: not-allowed;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n color: hsl(var(--bc) / 0.3);\n}\n.tw-menu :where(li > .tw-menu-dropdown:not(.tw-menu-dropdown-show)) {\n display: none;\n}\n:where(.tw-menu li) {\n position: relative;\n display: flex;\n flex-shrink: 0;\n flex-direction: column;\n flex-wrap: wrap;\n align-items: stretch;\n}\n:where(.tw-menu li) .tw-badge {\n justify-self: end;\n}\n.tw-modal {\n pointer-events: none;\n position: fixed;\n inset: 0px;\n margin: 0px;\n display: grid;\n height: 100%;\n max-height: none;\n width: 100%;\n max-width: none;\n justify-items: center;\n padding: 0px;\n opacity: 0;\n overscroll-behavior: contain;\n z-index: 999;\n background-color: transparent;\n color: inherit;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-property: transform, opacity, visibility;\n overflow-y: hidden;\n}\n:where(.tw-modal) {\n align-items: center;\n}\n.tw-modal-box {\n max-height: calc(100vh - 5em);\n grid-column-start: 1;\n grid-row-start: 1;\n width: 91.666667%;\n max-width: 32rem;\n --tw-scale-x: .9;\n --tw-scale-y: .9;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b1) / var(--tw-bg-opacity));\n padding: 1.5rem;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n border-top-left-radius: var(--rounded-box, 1rem);\n border-top-right-radius: var(--rounded-box, 1rem);\n border-bottom-left-radius: var(--rounded-box, 1rem);\n border-bottom-right-radius: var(--rounded-box, 1rem);\n box-shadow: rgba(0, 0, 0, 0.25) 0px 25px 50px -12px;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n.tw-modal-open,\n.tw-modal:target,\n.tw-modal-toggle:checked + .tw-modal,\n.tw-modal[open] {\n pointer-events: auto;\n visibility: visible;\n opacity: 1;\n}\n.tw-modal-action {\n display: flex;\n margin-top: 1.5rem;\n justify-content: flex-end;\n}\n:root:has(:is(.tw-modal-open, .tw-modal:target, .tw-modal-toggle:checked + .tw-modal, .tw-modal[open])) {\n overflow: hidden;\n}\n.tw-navbar {\n display: flex;\n align-items: center;\n padding: var(--navbar-padding, 0.5rem);\n min-height: 4rem;\n width: 100%;\n}\n:where(.tw-navbar > *) {\n display: inline-flex;\n align-items: center;\n}\n.tw-textarea {\n flex-shrink: 1;\n min-height: 3rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n padding-right: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 2;\n border-width: 1px;\n border-color: hsl(var(--bc) / var(--tw-border-opacity));\n --tw-border-opacity: 0;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b1) / var(--tw-bg-opacity));\n border-radius: var(--rounded-btn, 0.5rem);\n}\n.tw-avatar-group :where(.tw-avatar) {\n overflow: hidden;\n border-radius: 9999px;\n border-width: 4px;\n --tw-border-opacity: 1;\n border-color: hsl(var(--b1) / var(--tw-border-opacity));\n}\n.tw-btm-nav > * .tw-label {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.tw-breadcrumbs > ul > li > a:focus, .tw-breadcrumbs > ol > li > a:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-breadcrumbs > ul > li > a:focus-visible, .tw-breadcrumbs > ol > li > a:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n.tw-breadcrumbs > ul > li + *:before, .tw-breadcrumbs > ol > li + *:before {\n content: \"\";\n margin-left: 0.5rem;\n margin-right: 0.75rem;\n display: block;\n height: 0.375rem;\n width: 0.375rem;\n --tw-rotate: 45deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n opacity: 0.4;\n border-top: 1px solid;\n border-right: 1px solid;\n background-color: transparent;\n}\n[dir=\"rtl\"] .tw-breadcrumbs > ul > li + *:before,\n[dir=\"rtl\"] .tw-breadcrumbs > ol > li + *:before {\n --tw-rotate: -45deg;\n}\n.tw-btn:active:hover,\n .tw-btn:active:focus {\n animation: button-pop 0s ease-out;\n transform: scale(var(--btn-focus-scale, 0.97));\n}\n.tw-btn:focus-visible {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n}\n.tw-btn-primary {\n --tw-border-opacity: 1;\n border-color: hsl(var(--p) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--p) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--pc) / var(--tw-text-opacity));\n outline-color: hsl(var(--p) / 1);\n}\n.tw-btn-primary.tw-btn-active {\n --tw-border-opacity: 1;\n border-color: hsl(var(--pf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--pf) / var(--tw-bg-opacity));\n}\n.tw-btn-neutral {\n --tw-border-opacity: 1;\n border-color: hsl(var(--n) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--n) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--nc) / var(--tw-text-opacity));\n outline-color: hsl(var(--n) / 1);\n}\n.tw-btn-neutral.tw-btn-active {\n --tw-border-opacity: 1;\n border-color: hsl(var(--nf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--nf) / var(--tw-bg-opacity));\n}\n.tw-btn.tw-glass {\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n outline-color: currentColor;\n}\n.tw-btn.tw-glass.tw-btn-active {\n --glass-opacity: 25%;\n --glass-border-opacity: 15%;\n}\n.tw-btn-ghost {\n border-width: 1px;\n border-color: transparent;\n background-color: transparent;\n color: currentColor;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n outline-color: currentColor;\n}\n.tw-btn-ghost.tw-btn-active {\n --tw-border-opacity: 0;\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n --tw-bg-opacity: 0.2;\n}\n.tw-btn-outline.tw-btn-primary {\n --tw-text-opacity: 1;\n color: hsl(var(--p) / var(--tw-text-opacity));\n}\n.tw-btn-outline.tw-btn-primary.tw-btn-active {\n --tw-border-opacity: 1;\n border-color: hsl(var(--pf) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--pf) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--pc) / var(--tw-text-opacity));\n}\n.tw-btn.tw-btn-disabled,\n .tw-btn[disabled],\n .tw-btn:disabled {\n --tw-border-opacity: 0;\n background-color: hsl(var(--n) / var(--tw-bg-opacity));\n --tw-bg-opacity: 0.2;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n --tw-text-opacity: 0.2;\n}\n.tw-btn-group > input[type=\"radio\"]:checked.tw-btn,\n .tw-btn-group > .tw-btn-active {\n --tw-border-opacity: 1;\n border-color: hsl(var(--p) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--p) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--pc) / var(--tw-text-opacity));\n}\n.tw-btn-group > input[type=\"radio\"]:checked.tw-btn:focus-visible, .tw-btn-group > .tw-btn-active:focus-visible {\n outline-style: solid;\n outline-width: 2px;\n outline-color: hsl(var(--p) / 1);\n}\n.tw-btn:is(input[type=\"checkbox\"]:checked),\n.tw-btn:is(input[type=\"radio\"]:checked) {\n --tw-border-opacity: 1;\n border-color: hsl(var(--p) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--p) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--pc) / var(--tw-text-opacity));\n}\n.tw-btn:is(input[type=\"checkbox\"]:checked):focus-visible, .tw-btn:is(input[type=\"radio\"]:checked):focus-visible {\n outline-color: hsl(var(--p) / 1);\n}\n@keyframes button-pop {\n\n 0% {\n transform: scale(var(--btn-focus-scale, 0.98));\n }\n\n 40% {\n transform: scale(1.02);\n }\n\n 100% {\n transform: scale(1);\n }\n}\n.tw-card :where(figure:first-child) {\n overflow: hidden;\n border-start-start-radius: inherit;\n border-start-end-radius: inherit;\n border-end-start-radius: unset;\n border-end-end-radius: unset;\n}\n.tw-card :where(figure:last-child) {\n overflow: hidden;\n border-start-start-radius: unset;\n border-start-end-radius: unset;\n border-end-start-radius: inherit;\n border-end-end-radius: inherit;\n}\n.tw-card:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n.tw-card.tw-bordered {\n border-width: 1px;\n --tw-border-opacity: 1;\n border-color: hsl(var(--b2) / var(--tw-border-opacity));\n}\n.tw-card.tw-compact .tw-card-body {\n padding: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.tw-card-title {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 1.25rem;\n line-height: 1.75rem;\n font-weight: 600;\n}\n.tw-card.tw-image-full :where(figure) {\n overflow: hidden;\n border-radius: inherit;\n}\n.tw-checkbox:focus-visible {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: hsl(var(--bc) / 1);\n}\n.tw-checkbox:checked,\n .tw-checkbox[checked=\"true\"],\n .tw-checkbox[aria-checked=\"true\"] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n background-repeat: no-repeat;\n animation: checkmark var(--animation-input, 0.2s) ease-in-out;\n background-image: linear-gradient(-45deg, transparent 65%, hsl(var(--chkbg)) 65.99%),\n linear-gradient(45deg, transparent 75%, hsl(var(--chkbg)) 75.99%),\n linear-gradient(-45deg, hsl(var(--chkbg)) 40%, transparent 40.99%),\n linear-gradient(\n 45deg,\n hsl(var(--chkbg)) 30%,\n hsl(var(--chkfg)) 30.99%,\n hsl(var(--chkfg)) 40%,\n transparent 40.99%\n ),\n linear-gradient(-45deg, hsl(var(--chkfg)) 50%, hsl(var(--chkbg)) 50.99%);\n}\n.tw-checkbox:indeterminate {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n background-repeat: no-repeat;\n animation: checkmark var(--animation-input, 0.2s) ease-in-out;\n background-image: linear-gradient(90deg, transparent 80%, hsl(var(--chkbg)) 80%),\n linear-gradient(-90deg, transparent 80%, hsl(var(--chkbg)) 80%),\n linear-gradient(\n 0deg,\n hsl(var(--chkbg)) 43%,\n hsl(var(--chkfg)) 43%,\n hsl(var(--chkfg)) 57%,\n hsl(var(--chkbg)) 57%\n );\n}\n.tw-checkbox-success {\n --chkbg: var(--su);\n --chkfg: var(--suc);\n --tw-border-opacity: 1;\n border-color: hsl(var(--su) / var(--tw-border-opacity));\n}\n.tw-checkbox-success:focus-visible {\n outline-color: hsl(var(--su) / 1);\n}\n.tw-checkbox-success:checked,\n .tw-checkbox-success[checked=\"true\"],\n .tw-checkbox-success[aria-checked=\"true\"] {\n --tw-border-opacity: 1;\n border-color: hsl(var(--su) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--su) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--suc) / var(--tw-text-opacity));\n}\n.tw-checkbox:disabled {\n cursor: not-allowed;\n border-color: transparent;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n opacity: 0.2;\n}\n@keyframes checkmark {\n\n 0% {\n background-position-y: 5px;\n }\n\n 50% {\n background-position-y: -2px;\n }\n\n 100% {\n background-position-y: 0;\n }\n}\n[dir=\"rtl\"] .tw-checkbox:checked,\n [dir=\"rtl\"] .tw-checkbox[checked=\"true\"],\n [dir=\"rtl\"] .tw-checkbox[aria-checked=\"true\"] {\n background-image: linear-gradient(45deg, transparent 65%, hsl(var(--chkbg)) 65.99%),\n linear-gradient(-45deg, transparent 75%, hsl(var(--chkbg)) 75.99%),\n linear-gradient(45deg, hsl(var(--chkbg)) 40%, transparent 40.99%),\n linear-gradient(\n -45deg,\n hsl(var(--chkbg)) 30%,\n hsl(var(--chkfg)) 30.99%,\n hsl(var(--chkfg)) 40%,\n transparent 40.99%\n ),\n linear-gradient(45deg, hsl(var(--chkfg)) 50%, hsl(var(--chkbg)) 50.99%);\n}\n.tw-divider:before {\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n --tw-bg-opacity: 0.1;\n}\n.tw-divider:after {\n background-color: hsl(var(--bc) / var(--tw-bg-opacity));\n --tw-bg-opacity: 0.1;\n}\n.tw-divider:not(:empty) {\n gap: 1rem;\n}\n.tw-dropdown.tw-dropdown-open .tw-dropdown-content,\n.tw-dropdown:focus .tw-dropdown-content,\n.tw-dropdown:focus-within .tw-dropdown-content {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.tw-label-text {\n font-size: 0.875rem;\n line-height: 1.25rem;\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n}\n.tw-input[list]::-webkit-calendar-picker-indicator {\n line-height: 1em;\n}\n.tw-input-bordered {\n --tw-border-opacity: 0.2;\n}\n.tw-input:focus {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: hsl(var(--bc) / 0.2);\n}\n.tw-input-disabled,\n .tw-input:disabled,\n .tw-input[disabled] {\n cursor: not-allowed;\n --tw-border-opacity: 1;\n border-color: hsl(var(--b2) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n --tw-text-opacity: 0.2;\n}\n.tw-input-disabled::-moz-placeholder, .tw-input:disabled::-moz-placeholder, .tw-input[disabled]::-moz-placeholder {\n color: hsl(var(--bc) / var(--tw-placeholder-opacity));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-input-disabled::placeholder,\n .tw-input:disabled::placeholder,\n .tw-input[disabled]::placeholder {\n color: hsl(var(--bc) / var(--tw-placeholder-opacity));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-loading {\n pointer-events: none;\n display: inline-block;\n aspect-ratio: 1 / 1;\n width: 1.5rem;\n background-color: currentColor;\n -webkit-mask-size: 100%;\n mask-size: 100%;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-position: center;\n mask-position: center;\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-in-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-in-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.tw-loading-spinner {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-in-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-in-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.tw-loading-sm {\n width: 1.25rem;\n}\n:where(.tw-menu li:empty) {\n background-color: hsl(var(--bc) / 0.1);\n margin: 0.5rem 1rem;\n height: 1px;\n}\n.tw-menu :where(li ul):before {\n position: absolute;\n left: 0px;\n top: 0.75rem;\n bottom: 0.75rem;\n width: 1px;\n background-color: hsl(var(--bc) / 0.1);\n content: \"\";\n}\n.tw-menu :where(li:not(.tw-menu-title) > *:not(ul):not(details):not(.tw-menu-title)),\n.tw-menu :where(li:not(.tw-menu-title) > details > summary:not(.tw-menu-title)) {\n padding-left: 1rem;\n padding-right: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n text-align: left;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: var(--rounded-btn, 0.5rem);\n}\n:where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(summary):not(.tw-active).tw-focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(summary):not(.tw-active):focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):is(summary):not(.tw-active):focus-visible,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(summary):not(.tw-active).tw-focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(summary):not(.tw-active):focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):is(summary):not(.tw-active):focus-visible {\n cursor: pointer;\n background-color: hsl(var(--bc) / 0.1);\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-menu li > *:not(ul):not(details):active,\n.tw-menu li > *:not(ul):not(details).tw-active,\n.tw-menu li > details > summary:active {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--n) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--nc) / var(--tw-text-opacity));\n}\n.tw-menu :where(li > details > summary)::-webkit-details-marker {\n display: none;\n}\n.tw-menu :where(li > details > summary):after,\n.tw-menu :where(li > .tw-menu-dropdown-toggle):after {\n justify-self: end;\n display: block;\n margin-top: -0.5rem;\n height: 0.5rem;\n width: 0.5rem;\n transform: rotate(45deg);\n transition-property: transform, margin-top;\n transition-duration: 0.3s;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n content: \"\";\n transform-origin: 75% 75%;\n box-shadow: 2px 2px;\n pointer-events: none;\n}\n.tw-menu :where(li > details[open] > summary):after,\n.tw-menu :where(li > .tw-menu-dropdown-toggle.tw-menu-dropdown-show):after {\n transform: rotate(225deg);\n margin-top: 0;\n}\n.tw-mockup-browser .tw-mockup-browser-toolbar .tw-input {\n position: relative;\n margin-left: auto;\n margin-right: auto;\n display: block;\n height: 1.75rem;\n width: 24rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n padding-left: 2rem;\n}\n.tw-mockup-browser .tw-mockup-browser-toolbar .tw-input:before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 0.5rem;\n aspect-ratio: 1 / 1;\n height: 0.75rem;\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-radius: 9999px;\n border-width: 2px;\n border-color: currentColor;\n opacity: 0.6;\n}\n.tw-mockup-browser .tw-mockup-browser-toolbar .tw-input:after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 1.25rem;\n height: 0.5rem;\n --tw-translate-y: 25%;\n --tw-rotate: -45deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-radius: 9999px;\n border-width: 1px;\n border-color: currentColor;\n opacity: 0.6;\n}\n.tw-modal:not(dialog:not(.tw-modal-open)),\n .tw-modal::backdrop {\n background-color: rgba(0, 0, 0, 0.3);\n animation: modal-pop 0.2s ease-out;\n}\n.tw-modal-backdrop {\n z-index: -1;\n grid-column-start: 1;\n grid-row-start: 1;\n display: grid;\n align-self: stretch;\n justify-self: stretch;\n color: transparent;\n}\n.tw-modal-open .tw-modal-box,\n.tw-modal-toggle:checked + .tw-modal .tw-modal-box,\n.tw-modal:target .tw-modal-box,\n.tw-modal[open] .tw-modal-box {\n --tw-translate-y: 0px;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.tw-modal-action > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n}\n@keyframes modal-pop {\n\n 0% {\n opacity: 0;\n }\n}\n@keyframes progress-loading {\n\n 50% {\n background-position-x: -115%;\n }\n}\n@keyframes radiomark {\n\n 0% {\n box-shadow: 0 0 0 12px hsl(var(--b1)) inset, 0 0 0 12px hsl(var(--b1)) inset;\n }\n\n 50% {\n box-shadow: 0 0 0 3px hsl(var(--b1)) inset, 0 0 0 3px hsl(var(--b1)) inset;\n }\n\n 100% {\n box-shadow: 0 0 0 4px hsl(var(--b1)) inset, 0 0 0 4px hsl(var(--b1)) inset;\n }\n}\n@keyframes rating-pop {\n\n 0% {\n transform: translateY(-0.125em);\n }\n\n 40% {\n transform: translateY(-0.125em);\n }\n\n 100% {\n transform: translateY(0);\n }\n}\n.tw-textarea-bordered {\n --tw-border-opacity: 0.2;\n}\n.tw-textarea:focus {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: hsl(var(--bc) / 0.2);\n}\n.tw-textarea-disabled,\n .tw-textarea:disabled,\n .tw-textarea[disabled] {\n cursor: not-allowed;\n --tw-border-opacity: 1;\n border-color: hsl(var(--b2) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n --tw-text-opacity: 0.2;\n}\n.tw-textarea-disabled::-moz-placeholder, .tw-textarea:disabled::-moz-placeholder, .tw-textarea[disabled]::-moz-placeholder {\n color: hsl(var(--bc) / var(--tw-placeholder-opacity));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-textarea-disabled::placeholder,\n .tw-textarea:disabled::placeholder,\n .tw-textarea[disabled]::placeholder {\n color: hsl(var(--bc) / var(--tw-placeholder-opacity));\n --tw-placeholder-opacity: 0.2;\n}\n@keyframes toast-pop {\n\n 0% {\n transform: scale(0.9);\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n.tw-tooltip.tw-tooltip-primary {\n --tooltip-color: hsl(var(--p));\n --tooltip-text-color: hsl(var(--pc));\n}\n.tw-tooltip.tw-tooltip-secondary {\n --tooltip-color: hsl(var(--s));\n --tooltip-text-color: hsl(var(--sc));\n}\n.tw-tooltip.tw-tooltip-accent {\n --tooltip-color: hsl(var(--a));\n --tooltip-text-color: hsl(var(--ac));\n}\n.tw-tooltip.tw-tooltip-info {\n --tooltip-color: hsl(var(--in));\n --tooltip-text-color: hsl(var(--inc));\n}\n.tw-tooltip.tw-tooltip-success {\n --tooltip-color: hsl(var(--su));\n --tooltip-text-color: hsl(var(--suc));\n}\n.tw-tooltip.tw-tooltip-warning {\n --tooltip-color: hsl(var(--wa));\n --tooltip-text-color: hsl(var(--wac));\n}\n.tw-tooltip.tw-tooltip-error {\n --tooltip-color: hsl(var(--er));\n --tooltip-text-color: hsl(var(--erc));\n}\n.tw-rounded-box {\n border-radius: var(--rounded-box, 1rem);\n}\n.tw-btn-xs {\n height: 1.5rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n min-height: 1.5rem;\n font-size: 0.75rem;\n}\n.tw-btn-sm {\n height: 2rem;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n min-height: 2rem;\n font-size: 0.875rem;\n}\n.tw-btn-block {\n width: 100%;\n}\n.tw-btn-square:where(.tw-btn-xs) {\n height: 1.5rem;\n width: 1.5rem;\n padding: 0px;\n}\n.tw-btn-square:where(.tw-btn-sm) {\n height: 2rem;\n width: 2rem;\n padding: 0px;\n}\n.tw-btn-square:where(.tw-btn-md) {\n height: 3rem;\n width: 3rem;\n padding: 0px;\n}\n.tw-btn-square:where(.tw-btn-lg) {\n height: 4rem;\n width: 4rem;\n padding: 0px;\n}\n.tw-btn-circle:where(.tw-btn-xs) {\n height: 1.5rem;\n width: 1.5rem;\n border-radius: 9999px;\n padding: 0px;\n}\n.tw-btn-circle:where(.tw-btn-sm) {\n height: 2rem;\n width: 2rem;\n border-radius: 9999px;\n padding: 0px;\n}\n.tw-btn-circle:where(.tw-btn-md) {\n height: 3rem;\n width: 3rem;\n border-radius: 9999px;\n padding: 0px;\n}\n.tw-btn-circle:where(.tw-btn-lg) {\n height: 4rem;\n width: 4rem;\n border-radius: 9999px;\n padding: 0px;\n}\n.tw-checkbox-xs {\n height: 1rem;\n width: 1rem;\n}\n.tw-tooltip {\n position: relative;\n display: inline-block;\n --tooltip-offset: calc(100% + 1px + var(--tooltip-tail, 0px));\n}\n.tw-tooltip:before {\n position: absolute;\n pointer-events: none;\n z-index: 1;\n content: var(--tw-content);\n --tw-content: attr(data-tip);\n}\n.tw-tooltip:before, .tw-tooltip-top:before {\n transform: translateX(-50%);\n top: auto;\n left: 50%;\n right: auto;\n bottom: var(--tooltip-offset);\n}\n.tw-tooltip-left:before {\n transform: translateY(-50%);\n top: 50%;\n left: auto;\n right: var(--tooltip-offset);\n bottom: auto;\n}\n.tw-avatar.tw-online:before {\n content: \"\";\n position: absolute;\n z-index: 10;\n display: block;\n border-radius: 9999px;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--su) / var(--tw-bg-opacity));\n outline-style: solid;\n outline-width: 2px;\n outline-color: hsl(var(--b1) / 1);\n width: 15%;\n height: 15%;\n top: 7%;\n right: 7%;\n}\n.tw-avatar.tw-offline:before {\n content: \"\";\n position: absolute;\n z-index: 10;\n display: block;\n border-radius: 9999px;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b3) / var(--tw-bg-opacity));\n outline-style: solid;\n outline-width: 2px;\n outline-color: hsl(var(--b1) / 1);\n width: 15%;\n height: 15%;\n top: 7%;\n right: 7%;\n}\n.tw-btn-group .tw-btn:not(:first-child):not(:last-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n.tw-btn-group .tw-btn:first-child:not(:last-child) {\n margin-top: -0px;\n margin-left: -1px;\n border-top-left-radius: var(--rounded-btn, 0.5rem);\n border-top-right-radius: 0;\n border-bottom-left-radius: var(--rounded-btn, 0.5rem);\n border-bottom-right-radius: 0;\n}\n.tw-btn-group .tw-btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: var(--rounded-btn, 0.5rem);\n border-bottom-left-radius: 0;\n border-bottom-right-radius: var(--rounded-btn, 0.5rem);\n}\n.tw-btn-group-horizontal .tw-btn:not(:first-child):not(:last-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n.tw-btn-group-horizontal .tw-btn:first-child:not(:last-child) {\n margin-top: -0px;\n margin-left: -1px;\n border-top-left-radius: var(--rounded-btn, 0.5rem);\n border-top-right-radius: 0;\n border-bottom-left-radius: var(--rounded-btn, 0.5rem);\n border-bottom-right-radius: 0;\n}\n.tw-btn-group-horizontal .tw-btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: var(--rounded-btn, 0.5rem);\n border-bottom-left-radius: 0;\n border-bottom-right-radius: var(--rounded-btn, 0.5rem);\n}\n.tw-btn-group-vertical .tw-btn:first-child:not(:last-child) {\n margin-top: -1px;\n margin-left: -0px;\n border-top-left-radius: var(--rounded-btn, 0.5rem);\n border-top-right-radius: var(--rounded-btn, 0.5rem);\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n.tw-btn-group-vertical .tw-btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-left-radius: var(--rounded-btn, 0.5rem);\n border-bottom-right-radius: var(--rounded-btn, 0.5rem);\n}\n.tw-card-compact .tw-card-body {\n padding: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.tw-card-compact .tw-card-title {\n margin-bottom: 0.25rem;\n}\n.tw-card-normal .tw-card-body {\n padding: var(--padding-card, 2rem);\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.tw-card-normal .tw-card-title {\n margin-bottom: 0.75rem;\n}\n.tw-modal-top :where(.tw-modal-box) {\n width: 100%;\n max-width: none;\n --tw-translate-y: -2.5rem;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-top-left-radius: 0px;\n border-top-right-radius: 0px;\n border-bottom-left-radius: var(--rounded-box, 1rem);\n border-bottom-right-radius: var(--rounded-box, 1rem);\n}\n.tw-modal-middle :where(.tw-modal-box) {\n width: 91.666667%;\n max-width: 32rem;\n --tw-translate-y: 0px;\n --tw-scale-x: .9;\n --tw-scale-y: .9;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-top-left-radius: var(--rounded-box, 1rem);\n border-top-right-radius: var(--rounded-box, 1rem);\n border-bottom-left-radius: var(--rounded-box, 1rem);\n border-bottom-right-radius: var(--rounded-box, 1rem);\n}\n.tw-modal-bottom :where(.tw-modal-box) {\n width: 100%;\n max-width: none;\n --tw-translate-y: 2.5rem;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-bottom-right-radius: 0px;\n border-bottom-left-radius: 0px;\n border-top-left-radius: var(--rounded-box, 1rem);\n border-top-right-radius: var(--rounded-box, 1rem);\n}\n.tw-tooltip {\n position: relative;\n display: inline-block;\n text-align: center;\n --tooltip-tail: 0.1875rem;\n --tooltip-color: hsl(var(--n));\n --tooltip-text-color: hsl(var(--nc));\n --tooltip-tail-offset: calc(100% + 0.0625rem - var(--tooltip-tail));\n}\n.tw-tooltip:before,\n.tw-tooltip:after {\n opacity: 0;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-delay: 100ms;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n.tw-tooltip:after {\n position: absolute;\n content: \"\";\n border-style: solid;\n border-width: var(--tooltip-tail, 0);\n width: 0;\n height: 0;\n display: block;\n}\n.tw-tooltip:before {\n max-width: 20rem;\n border-radius: 0.25rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n background-color: var(--tooltip-color);\n color: var(--tooltip-text-color);\n width: -moz-max-content;\n width: max-content;\n}\n.tw-tooltip.tw-tooltip-open:before,\n.tw-tooltip.tw-tooltip-open:after,\n.tw-tooltip:hover:before,\n.tw-tooltip:hover:after {\n opacity: 1;\n transition-delay: 75ms;\n}\n.tw-tooltip:has(:focus-visible):after,\n.tw-tooltip:has(:focus-visible):before {\n opacity: 1;\n transition-delay: 75ms;\n}\n.tw-tooltip:not([data-tip]):hover:before,\n.tw-tooltip:not([data-tip]):hover:after {\n visibility: hidden;\n opacity: 0;\n}\n.tw-tooltip:after, .tw-tooltip-top:after {\n transform: translateX(-50%);\n border-color: var(--tooltip-color) transparent transparent transparent;\n top: auto;\n left: 50%;\n right: auto;\n bottom: var(--tooltip-tail-offset);\n}\n.tw-tooltip-left:after {\n transform: translateY(-50%);\n border-color: transparent transparent transparent var(--tooltip-color);\n top: 50%;\n left: auto;\n right: calc(var(--tooltip-tail-offset) + 0.0625rem);\n bottom: auto;\n}\n.tw-fixed {\n position: fixed;\n}\n.tw-absolute {\n position: absolute;\n}\n.tw-relative {\n position: relative;\n}\n.tw-inset-y-0 {\n top: 0px;\n bottom: 0px;\n}\n.tw--right-2 {\n right: -0.5rem;\n}\n.tw--top-2 {\n top: -0.5rem;\n}\n.tw-bottom-0 {\n bottom: 0px;\n}\n.tw-bottom-4 {\n bottom: 1rem;\n}\n.tw-left-0 {\n left: 0px;\n}\n.tw-left-4 {\n left: 1rem;\n}\n.tw-right-0 {\n right: 0px;\n}\n.tw-right-2 {\n right: 0.5rem;\n}\n.tw-right-4 {\n right: 1rem;\n}\n.tw-right-5 {\n right: 1.25rem;\n}\n.tw-top-0 {\n top: 0px;\n}\n.tw-top-2 {\n top: 0.5rem;\n}\n.tw-top-4 {\n top: 1rem;\n}\n.\\!tw-z-\\[10000\\] {\n z-index: 10000 !important;\n}\n.tw-z-1000 {\n z-index: 1000;\n}\n.tw-z-500 {\n z-index: 500;\n}\n.tw-z-\\[1035\\] {\n z-index: 1035;\n}\n.tw-z-\\[699\\] {\n z-index: 699;\n}\n.tw-col-span-1 {\n grid-column: span 1 / span 1;\n}\n.tw-col-span-5 {\n grid-column: span 5 / span 5;\n}\n.tw-float-right {\n float: right;\n}\n.\\!tw-m-0 {\n margin: 0px !important;\n}\n.tw-m-1 {\n margin: 0.25rem;\n}\n.tw-m-auto {\n margin: auto;\n}\n.tw-mx-2 {\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n}\n.tw-mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.\\!tw-mb-2 {\n margin-bottom: 0.5rem !important;\n}\n.tw-mb-16 {\n margin-bottom: 4rem;\n}\n.tw-mb-2 {\n margin-bottom: 0.5rem;\n}\n.tw-mb-3 {\n margin-bottom: 0.75rem;\n}\n.tw-mb-4 {\n margin-bottom: 1rem;\n}\n.tw-mb-5 {\n margin-bottom: 1.25rem;\n}\n.tw-ml-2 {\n margin-left: 0.5rem;\n}\n.tw-mr-2 {\n margin-right: 0.5rem;\n}\n.tw-mt-16 {\n margin-top: 4rem;\n}\n.tw-mt-2 {\n margin-top: 0.5rem;\n}\n.tw-mt-3 {\n margin-top: 0.75rem;\n}\n.tw-mt-4 {\n margin-top: 1rem;\n}\n.tw-mt-5 {\n margin-top: 1.25rem;\n}\n.tw-mt-6 {\n margin-top: 1.5rem;\n}\n.tw-mt-8 {\n margin-top: 2rem;\n}\n.tw-inline-block {\n display: inline-block;\n}\n.tw-flex {\n display: flex;\n}\n.tw-grid {\n display: grid;\n}\n.tw-hidden {\n display: none;\n}\n.tw-h-10 {\n height: 2.5rem;\n}\n.tw-h-3 {\n height: 0.75rem;\n}\n.tw-h-4 {\n height: 1rem;\n}\n.tw-h-40 {\n height: 10rem;\n}\n.tw-h-5 {\n height: 1.25rem;\n}\n.tw-h-6 {\n height: 1.5rem;\n}\n.tw-h-64 {\n height: 16rem;\n}\n.tw-h-fit {\n height: -moz-fit-content;\n height: fit-content;\n}\n.tw-h-full {\n height: 100%;\n}\n.tw-max-h-72 {\n max-height: 18rem;\n}\n.tw-min-h-0 {\n min-height: 0px;\n}\n.tw-w-1 {\n width: 0.25rem;\n}\n.tw-w-10 {\n width: 2.5rem;\n}\n.tw-w-32 {\n width: 8rem;\n}\n.tw-w-4 {\n width: 1rem;\n}\n.tw-w-48 {\n width: 12rem;\n}\n.tw-w-5 {\n width: 1.25rem;\n}\n.tw-w-52 {\n width: 13rem;\n}\n.tw-w-6 {\n width: 1.5rem;\n}\n.tw-w-\\[56px\\] {\n width: 56px;\n}\n.tw-w-\\[calc\\(100vw-2rem\\)\\] {\n width: calc(100vw - 2rem);\n}\n.tw-w-full {\n width: 100%;\n}\n.tw-min-w-80 {\n min-width: 320px;\n}\n.tw-max-w-52 {\n max-width: 208px;\n}\n.tw-max-w-md {\n max-width: 28rem;\n}\n.tw-max-w-sm {\n max-width: 24rem;\n}\n.tw-max-w-xs {\n max-width: 20rem;\n}\n.tw-flex-1 {\n flex: 1 1 0%;\n}\n.tw-flex-none {\n flex: none;\n}\n.tw-basis-1\\/5 {\n flex-basis: 20%;\n}\n.tw-basis-2\\/5 {\n flex-basis: 40%;\n}\n.tw--translate-x-full {\n --tw-translate-x: -100%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.tw-translate-x-0 {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.tw-rotate-180 {\n --tw-rotate: 180deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.tw-cursor-pointer {\n cursor: pointer;\n}\n.tw-list-none {\n list-style-type: none;\n}\n.tw-grid-flow-col {\n grid-auto-flow: column;\n}\n.tw-grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n}\n.tw-grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.tw-grid-cols-6 {\n grid-template-columns: repeat(6, minmax(0, 1fr));\n}\n.tw-flex-row {\n flex-direction: row;\n}\n.tw-flex-col {\n flex-direction: column;\n}\n.tw-flex-wrap {\n flex-wrap: wrap;\n}\n.tw-place-content-center {\n place-content: center;\n}\n.tw-place-items-end {\n place-items: end;\n}\n.tw-items-center {\n align-items: center;\n}\n.tw-justify-normal {\n justify-content: normal;\n}\n.tw-justify-end {\n justify-content: flex-end;\n}\n.tw-justify-center {\n justify-content: center;\n}\n.tw-gap-2 {\n gap: 0.5rem;\n}\n.tw-gap-6 {\n gap: 1.5rem;\n}\n.tw-place-self-center {\n place-self: center;\n}\n.tw-overflow-hidden {\n overflow: hidden;\n}\n.tw-overflow-y-auto {\n overflow-y: auto;\n}\n.tw-overflow-x-hidden {\n overflow-x: hidden;\n}\n.tw-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.\\!tw-rounded-none {\n border-radius: 0px !important;\n}\n.tw-rounded-2xl {\n border-radius: 1rem;\n}\n.tw-rounded-full {\n border-radius: 9999px;\n}\n.tw-rounded-lg {\n border-radius: 0.5rem;\n}\n.tw-rounded-xl {\n border-radius: 0.75rem;\n}\n.tw-rounded-br-md {\n border-bottom-right-radius: 0.375rem;\n}\n.tw-rounded-tr-md {\n border-top-right-radius: 0.375rem;\n}\n.tw-border-0 {\n border-width: 0px;\n}\n.tw-border-none {\n border-style: none;\n}\n.tw-bg-base-100 {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b1) / var(--tw-bg-opacity));\n}\n.tw-bg-base-200 {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n}\n.tw-bg-primary {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--p) / var(--tw-bg-opacity));\n}\n.tw-bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity));\n}\n.tw-stroke-current {\n stroke: currentColor;\n}\n.tw-p-0 {\n padding: 0px;\n}\n.tw-p-2 {\n padding: 0.5rem;\n}\n.tw-p-4 {\n padding: 1rem;\n}\n.tw-p-6 {\n padding: 1.5rem;\n}\n.tw-px-10 {\n padding-left: 2.5rem;\n padding-right: 2.5rem;\n}\n.tw-px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.tw-px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.tw-px-6 {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n.tw-py-10 {\n padding-top: 2.5rem;\n padding-bottom: 2.5rem;\n}\n.tw-py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n.tw-pb-0 {\n padding-bottom: 0px;\n}\n.tw-pb-1 {\n padding-bottom: 0.25rem;\n}\n.tw-pb-2 {\n padding-bottom: 0.5rem;\n}\n.tw-pb-6 {\n padding-bottom: 1.5rem;\n}\n.tw-pl-2 {\n padding-left: 0.5rem;\n}\n.tw-pl-4 {\n padding-left: 1rem;\n}\n.tw-pr-1 {\n padding-right: 0.25rem;\n}\n.tw-pr-4 {\n padding-right: 1rem;\n}\n.tw-pt-0 {\n padding-top: 0px;\n}\n.tw-pt-1 {\n padding-top: 0.25rem;\n}\n.tw-pt-2 {\n padding-top: 0.5rem;\n}\n.tw-pt-6 {\n padding-top: 1.5rem;\n}\n.tw-pt-8 {\n padding-top: 2rem;\n}\n.tw-text-center {\n text-align: center;\n}\n.tw-text-right {\n text-align: right;\n}\n.tw-align-middle {\n vertical-align: middle;\n}\n.tw-text-2xl {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n.tw-text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.tw-text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.tw-text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.tw-font-bold {\n font-weight: 700;\n}\n.tw-font-normal {\n font-weight: 400;\n}\n.tw-font-semibold {\n font-weight: 600;\n}\n.tw-normal-case {\n text-transform: none;\n}\n.tw-leading-3 {\n line-height: .75rem;\n}\n.tw-leading-5 {\n line-height: 1.25rem;\n}\n.\\!tw-text-base-content {\n --tw-text-opacity: 1 !important;\n color: hsl(var(--bc) / var(--tw-text-opacity)) !important;\n}\n.\\!tw-text-error {\n --tw-text-opacity: 1 !important;\n color: hsl(var(--er) / var(--tw-text-opacity)) !important;\n}\n.tw-text-base-content {\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n}\n.tw-text-error {\n --tw-text-opacity: 1;\n color: hsl(var(--er) / var(--tw-text-opacity));\n}\n.tw-text-gray-600 {\n --tw-text-opacity: 1;\n color: rgb(75 85 99 / var(--tw-text-opacity));\n}\n.tw-text-primary {\n --tw-text-opacity: 1;\n color: hsl(var(--p) / var(--tw-text-opacity));\n}\n.tw-text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n.tw-shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tw-shadow-\\[0_4px_12px_0_rgba\\(0\\,0\\,0\\,0\\.07\\)\\,_0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.05\\)\\] {\n --tw-shadow: 0 4px 12px 0 rgba(0,0,0,0.07), 0 2px 4px rgba(0,0,0,0.05);\n --tw-shadow-colored: 0 4px 12px 0 var(--tw-shadow-color), 0 2px 4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tw-shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tw-drop-shadow-md {\n --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06));\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.tw-transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.tw-transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.tw-transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.tw-duration-200 {\n transition-duration: 200ms;\n}\n.tw-duration-300 {\n transition-duration: 300ms;\n}\n.tw-duration-500 {\n transition-duration: 500ms;\n}\n.tw-ease-in {\n transition-timing-function: cubic-bezier(0.4, 0, 1, 1);\n}\n\n.tw-modal {\n z-index: 1200 !important;\n}\n\n.tw-menu li a {\n border-radius: 10px;\n}\n\n.tw-modal {\n z-index: 1200 !important;\n}\n\n.tw-modal-box {\n max-height: calc(100vh - 2em);\n}\n\n.Toastify__toast {\n border-radius: 1rem;\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n margin-left: 1rem;\n margin-right: 1rem;\n margin-bottom: 1rem;\n background-color: hsl(var(--b1) / 1);\n color: hsl(var(--bc) / 1);\n\n\n}\n\n:root {\n\n --toastify-color-info: hsl(var(--in) / 1);\n --toastify-color-success: hsl(var(--su) / 1);\n --toastify-color-warning: hsl(var(--wa) / 1);\n --toastify-color-error: hsl(var(--er) / 1);\n\n}\n\n.hover\\:tw-cursor-pointer:hover {\n cursor: pointer;\n}\n\n.hover\\:tw-bg-transparent:hover {\n background-color: transparent;\n}\n\n.hover\\:tw-text-primary:hover {\n --tw-text-opacity: 1;\n color: hsl(var(--p) / var(--tw-text-opacity));\n}\n\n.hover\\:tw-underline:hover {\n text-decoration-line: underline;\n}\n\n.focus\\:tw-outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.data-\\[te-sidenav-slim\\=\\'true\\'\\]\\:tw-hidden[data-te-sidenav-slim='true'] {\n display: none;\n}\n\n.data-\\[te-sidenav-slim-collapsed\\=\\'true\\'\\]\\:tw-w-\\[56px\\][data-te-sidenav-slim-collapsed='true'] {\n width: 56px;\n}\n\n.data-\\[te-sidenav-slim\\=\\'true\\'\\]\\:tw-w-\\[56px\\][data-te-sidenav-slim='true'] {\n width: 56px;\n}\n\n.data-\\[te-sidenav-hidden\\=\\'false\\'\\]\\:tw-translate-x-0[data-te-sidenav-hidden='false'] {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.tw-group[data-te-sidenav-slim-collapsed='true'] .group-\\[\\&\\[data-te-sidenav-slim-collapsed\\=\\'true\\'\\]\\]\\:data-\\[te-sidenav-slim\\=\\'false\\'\\]\\:tw-hidden[data-te-sidenav-slim='false'] {\n display: none;\n}\n\n:is(.tw-dark .dark\\:tw-bg-zinc-800) {\n --tw-bg-opacity: 1;\n background-color: rgb(39 39 42 / var(--tw-bg-opacity));\n}\n\n@media (min-width: 768px) {\n\n .md\\:tw-flex {\n display: flex;\n }\n\n .md\\:tw-hidden {\n display: none;\n }\n\n .md\\:tw-grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n\n .md\\:tw-grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n}\n\n@media (min-width: 1280px) {\n\n .xl\\:tw-max-w-6xl {\n max-width: 72rem;\n }\n}\n\n.\\[\\&\\[data-te-sidenav-slim-collapsed\\=\\'true\\'\\]\\[data-te-sidenav-slim\\=\\'false\\'\\]\\]\\:tw-hidden[data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='false'] {\n display: none;\n}\n\n.\\[\\&\\[data-te-sidenav-slim-collapsed\\=\\'true\\'\\]\\[data-te-sidenav-slim\\=\\'true\\'\\]\\]\\:\\[display\\:unset\\][data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='true'] {\n display: unset;\n}";
1086
2101
  styleInject(css_248z);
1087
2102
 
1088
- export { AppShell, AuthProviderDirectus, Content, Item, Layer, Modal, Quests, Settings, SideBar, Tags, UtopiaMap, useAuthDirectus };
2103
+ export { AppShell, AuthProvider, CardPage, Content, ItemForm, ItemView, Layer, LoginPage, Modal, Permissions, PopupStartEndInput, PopupTextAreaInput, Quests, Settings, SideBar, SignupPage, StartEndView, Tags, TextAreaInput, TextInput, TextView, TitleCard, UtopiaMap, useAuth };
1089
2104
  //# sourceMappingURL=index.js.map