utopia-ui 3.0.0-alpha.3 → 3.0.0-alpha.31

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 (58) hide show
  1. package/README.md +19 -5
  2. package/dist/Components/AppShell/AppShell.d.ts +7 -5
  3. package/dist/Components/AppShell/NavBar.d.ts +2 -2
  4. package/dist/Components/AppShell/SetAssetsApi.d.ts +5 -0
  5. package/dist/Components/AppShell/SideBar.d.ts +3 -1
  6. package/dist/Components/AppShell/hooks/useAssets.d.ts +13 -0
  7. package/dist/Components/Auth/useAuth.d.ts +2 -2
  8. package/dist/Components/Gaming/Modal.d.ts +4 -1
  9. package/dist/Components/Gaming/hooks/useQuests.d.ts +13 -0
  10. package/dist/Components/Input/SelectBox.d.ts +17 -0
  11. package/dist/Components/Input/TextInput.d.ts +2 -1
  12. package/dist/Components/Input/index.d.ts +1 -0
  13. package/dist/Components/Map/ItemForm.d.ts +14 -4
  14. package/dist/Components/Map/ItemView.d.ts +14 -4
  15. package/dist/Components/Map/Permissions.d.ts +7 -0
  16. package/dist/Components/Map/Subcomponents/AddButton.d.ts +2 -2
  17. package/dist/Components/Map/Subcomponents/Control.d.ts +4 -0
  18. package/dist/Components/Map/Subcomponents/FilterControl.d.ts +2 -0
  19. package/dist/Components/Map/Subcomponents/ItemFormPopup.d.ts +1 -2
  20. package/dist/Components/Map/Subcomponents/ItemPopupComponents/HeaderView.d.ts +3 -1
  21. package/dist/Components/Map/Subcomponents/ItemPopupComponents/PopupTextInput.d.ts +7 -1
  22. package/dist/Components/Map/Subcomponents/ItemViewPopup.d.ts +3 -1
  23. package/dist/Components/Map/Subcomponents/LayerControl.d.ts +2 -0
  24. package/dist/Components/Map/Subcomponents/QuestControl.d.ts +2 -0
  25. package/dist/Components/Map/Tags.d.ts +4 -3
  26. package/dist/Components/Map/UtopiaMap.d.ts +2 -2
  27. package/dist/Components/Map/hooks/useFilter.d.ts +32 -0
  28. package/dist/Components/Map/hooks/useItems.d.ts +4 -0
  29. package/dist/Components/Map/hooks/useLeafletRefs.d.ts +22 -0
  30. package/dist/Components/Map/hooks/usePermissions.d.ts +20 -0
  31. package/dist/Components/Map/hooks/useTags.d.ts +7 -1
  32. package/dist/Components/Map/hooks/useWindowDimension.d.ts +4 -0
  33. package/dist/Components/Map/index.d.ts +2 -0
  34. package/dist/Components/Profile/ColorPicker.d.ts +7 -0
  35. package/dist/Components/Profile/Settings.d.ts +2 -3
  36. package/dist/Components/Profile/useClickOutside.d.ts +2 -0
  37. package/dist/Components/Templates/CardPage.d.ts +5 -1
  38. package/dist/Components/Templates/TitleCard.d.ts +2 -1
  39. package/dist/Components/Typography/Subtitle.d.ts +3 -3
  40. package/dist/Utils/DynamicHeroIcon.d.ts +2 -0
  41. package/dist/Utils/HashTagRegex.d.ts +1 -0
  42. package/dist/Utils/RandomColor.d.ts +1 -0
  43. package/dist/Utils/ReplaceURLs.d.ts +3 -1
  44. package/dist/index.d.ts +2 -2
  45. package/dist/index.js +1609 -631
  46. package/dist/index.js.map +1 -1
  47. package/dist/types.d.ts +25 -6
  48. package/package.json +11 -4
  49. package/dist/Components/Auth/authDirectus.d.ts +0 -24
  50. package/dist/Components/Input/InputText.d.ts +0 -13
  51. package/dist/Components/Map/ItemFormPopup.d.ts +0 -12
  52. package/dist/Components/Map/ItemViewPopup.d.ts +0 -8
  53. package/dist/Components/Map/Subcomponents/HeaderView.d.ts +0 -7
  54. package/dist/Components/Map/Subcomponents/StartEndView.d.ts +0 -6
  55. package/dist/Components/Map/Subcomponents/TextView.d.ts +0 -5
  56. package/dist/Components/TitleCard.d.ts +0 -9
  57. package/dist/Utils/HeighlightTags.d.ts +0 -2
  58. /package/dist/Components/{AppShell → Templates}/DialogModal.d.ts +0 -0
package/dist/index.js CHANGED
@@ -1,18 +1,25 @@
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
- import { createContext, useContext, useReducer, useCallback, useState, useRef, useEffect } from 'react';
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
8
  import * as HIcons from '@heroicons/react/20/solid';
9
- import { Link, BrowserRouter, useLocation, NavLink, useNavigate } from 'react-router-dom';
9
+ import { Link, useLocation, useNavigate, BrowserRouter, NavLink } from 'react-router-dom';
10
10
  import { toast, ToastContainer } from 'react-toastify';
11
+ import reactStringReplace from 'react-string-replace';
12
+ import Tribute from 'tributejs';
13
+ import * as PropTypes from 'prop-types';
14
+ import InformationCircleIcon from '@heroicons/react/24/outline/InformationCircleIcon';
11
15
  import QuestionMarkIcon from '@heroicons/react/24/outline/QuestionMarkCircleIcon';
12
16
  import { initTE, Sidenav } from 'tw-elements';
13
17
  import ChevronDownIcon from '@heroicons/react/24/outline/ChevronDownIcon';
14
18
  import ChevronRightIcon from '@heroicons/react/24/outline/ChevronRightIcon';
19
+ import ReactCrop, { centerCrop, makeAspectCrop } from 'react-image-crop';
20
+ import 'react-image-crop/dist/ReactCrop.css';
15
21
  import 'react-toastify/dist/ReactToastify.css';
22
+ import { HexColorPicker } from 'react-colorful';
16
23
 
17
24
  function styleInject(css, ref) {
18
25
  if ( ref === void 0 ) ref = {};
@@ -41,8 +48,8 @@ function styleInject(css, ref) {
41
48
  }
42
49
  }
43
50
 
44
- 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 }";
45
- styleInject(css_248z$1);
51
+ var css_248z$2 = ".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 .user-icon {\n position: relative;\n top: -36px;\n left: 10px;\n width: 13px;\n }\n\n .circle-icon {\n position: relative;\n top: -33px;\n left: 10px;\n width: 13px;\n }\n\n .fire-icon {\n position: relative;\n top: -36px;\n left: 10px;\n width: 13px;\n }\n\n .tree-icon {\n position: relative;\n top: -38px;\n left: 4px;\n width: 24px;\n }\n \n .leaflet-popup-scrolled {\n overflow-x: hidden;\n }\n\n .leaflet-popup-content-wrapper, .leaflet-popup-tip{\n background-color: var(--fallback-b1,oklch(var(--b1)/1));\n color: var(--fallback-bc,oklch(var(--bc)/1));\n\n }\n\n .leaflet-tooltip {\n background-color: var(--fallback-b1,oklch(var(--b1)/1));\n color: var(--fallback-bc,oklch(var(--bc)/1));\n border-radius: 1em;\n transition: opacity 500ms;\n transition-delay: 50ms;\n }";
52
+ styleInject(css_248z$2);
46
53
 
47
54
  /******************************************************************************
48
55
  Copyright (c) Microsoft Corporation.
@@ -138,7 +145,7 @@ var DynamicHeroIcon = function (props) {
138
145
  console.log("Icon ".concat(props.icon, " doesn't exist"));
139
146
  }
140
147
  return (React.createElement(React.Fragment, null,
141
- React.createElement(TheIcon, { className: "tw-h-6 tw-w-6 tw-text-white", "aria-hidden": "true" })));
148
+ React.createElement(TheIcon, { className: props.className ? props.className : "tw-h-6 tw-w-6 tw-text-white", "aria-hidden": "true" })));
142
149
  };
143
150
 
144
151
  var LayerContext = createContext({
@@ -183,70 +190,462 @@ var useAddLayer = function () {
183
190
  return addLayer;
184
191
  };
185
192
 
186
- function AddButton(_a) {
187
- var setSelectMode = _a.setSelectMode;
188
- var layers = useLayers();
189
- 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" },
190
- 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" },
191
- React.createElement("svg", { viewBox: "0 0 20 20", enableBackground: "new 0 0 20 20", className: "tw-w-6 tw-h-6 tw-inline-block" },
192
- 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" }))),
193
- React.createElement("ul", { tabIndex: 0, className: "tw-dropdown-content tw-pr-2 tw-mb-0 tw-list-none" }, layers.map(function (layer) {
194
- var _a;
195
- return (((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && (React.createElement("li", { key: layer.name },
196
- React.createElement("a", null,
197
- React.createElement("div", { className: "tw-tooltip tw-tooltip-left", "data-tip": layer.menuText },
198
- 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); } },
199
- React.createElement(DynamicHeroIcon, { icon: layer.menuIcon })))))));
200
- }))));
193
+ var AuthContext = createContext({
194
+ isAuthenticated: false,
195
+ user: null,
196
+ login: function () { return Promise.reject(); },
197
+ register: function () { return Promise.reject(); },
198
+ loading: false,
199
+ logout: function () { return Promise.reject(); },
200
+ updateUser: function () { return Promise.reject(); },
201
+ token: ""
202
+ });
203
+ var AuthProvider = function (_a) {
204
+ var userApi = _a.userApi, children = _a.children;
205
+ var _b = useState(null), user = _b[0], setUser = _b[1];
206
+ var _c = useState(null), token = _c[0], setToken = _c[1];
207
+ var _d = useState(false), loading = _d[0], setLoading = _d[1];
208
+ var isAuthenticated = !!user;
209
+ useEffect(function () {
210
+ setLoading(true);
211
+ loadUser();
212
+ setLoading(false);
213
+ }, []);
214
+ function loadUser() {
215
+ return __awaiter(this, void 0, void 0, function () {
216
+ var token_1, me;
217
+ return __generator(this, function (_a) {
218
+ switch (_a.label) {
219
+ case 0:
220
+ _a.trys.push([0, 5, , 6]);
221
+ return [4 /*yield*/, userApi.getToken()];
222
+ case 1:
223
+ token_1 = _a.sent();
224
+ setToken(token_1);
225
+ if (!token_1) return [3 /*break*/, 3];
226
+ return [4 /*yield*/, userApi.getUser()];
227
+ case 2:
228
+ me = _a.sent();
229
+ setUser(me);
230
+ setLoading(false);
231
+ return [2 /*return*/, me];
232
+ case 3: return [2 /*return*/, undefined];
233
+ case 4: return [3 /*break*/, 6];
234
+ case 5:
235
+ _a.sent();
236
+ setLoading(false);
237
+ return [2 /*return*/, undefined];
238
+ case 6: return [2 /*return*/];
239
+ }
240
+ });
241
+ });
242
+ }
243
+ var login = function (credentials) { return __awaiter(void 0, void 0, void 0, function () {
244
+ var res, error_2;
245
+ return __generator(this, function (_a) {
246
+ switch (_a.label) {
247
+ case 0:
248
+ setLoading(true);
249
+ _a.label = 1;
250
+ case 1:
251
+ _a.trys.push([1, 4, , 5]);
252
+ return [4 /*yield*/, userApi.login(credentials.email, credentials.password)];
253
+ case 2:
254
+ res = _a.sent();
255
+ setToken(res.access_token);
256
+ return [4 /*yield*/, loadUser()];
257
+ case 3: return [2 /*return*/, (_a.sent())];
258
+ case 4:
259
+ error_2 = _a.sent();
260
+ setLoading(false);
261
+ throw error_2;
262
+ case 5:
263
+ return [2 /*return*/];
264
+ }
265
+ });
266
+ }); };
267
+ var register = function (credentials, userName) { return __awaiter(void 0, void 0, void 0, function () {
268
+ var error_3;
269
+ return __generator(this, function (_a) {
270
+ switch (_a.label) {
271
+ case 0:
272
+ setLoading(true);
273
+ _a.label = 1;
274
+ case 1:
275
+ _a.trys.push([1, 4, , 5]);
276
+ return [4 /*yield*/, userApi.register(credentials.email, credentials.password, userName)];
277
+ case 2:
278
+ _a.sent();
279
+ return [4 /*yield*/, login(credentials)];
280
+ case 3: return [2 /*return*/, (_a.sent())];
281
+ case 4:
282
+ error_3 = _a.sent();
283
+ setLoading(false);
284
+ throw error_3;
285
+ case 5:
286
+ return [2 /*return*/];
287
+ }
288
+ });
289
+ }); };
290
+ var logout = function () { return __awaiter(void 0, void 0, void 0, function () {
291
+ var error_4;
292
+ return __generator(this, function (_a) {
293
+ switch (_a.label) {
294
+ case 0:
295
+ _a.trys.push([0, 2, , 3]);
296
+ return [4 /*yield*/, userApi.logout()];
297
+ case 1:
298
+ _a.sent();
299
+ setUser(null);
300
+ return [3 /*break*/, 3];
301
+ case 2:
302
+ error_4 = _a.sent();
303
+ setLoading(false);
304
+ throw error_4;
305
+ case 3:
306
+ return [2 /*return*/];
307
+ }
308
+ });
309
+ }); };
310
+ var updateUser = function (user) { return __awaiter(void 0, void 0, void 0, function () {
311
+ var userRest, res, error_5;
312
+ return __generator(this, function (_a) {
313
+ switch (_a.label) {
314
+ case 0:
315
+ setLoading(true);
316
+ user.id, userRest = __rest(user, ["id"]);
317
+ _a.label = 1;
318
+ case 1:
319
+ _a.trys.push([1, 3, , 4]);
320
+ return [4 /*yield*/, userApi.updateUser(userRest)];
321
+ case 2:
322
+ res = _a.sent();
323
+ setUser(res);
324
+ setLoading(false);
325
+ return [2 /*return*/, res];
326
+ case 3:
327
+ error_5 = _a.sent();
328
+ setLoading(false);
329
+ throw error_5;
330
+ case 4:
331
+ return [2 /*return*/];
332
+ }
333
+ });
334
+ }); };
335
+ return (React.createElement(AuthContext.Provider, { value: { isAuthenticated: isAuthenticated, user: user, login: login, register: register, loading: loading, logout: logout, updateUser: updateUser, token: token } }, children));
336
+ };
337
+ var useAuth = function () { return useContext(AuthContext); };
338
+
339
+ function ErrorText(_a) {
340
+ var styleClass = _a.styleClass, children = _a.children;
341
+ return (React.createElement("p", { className: "tw-text-center tw-text-error ".concat(styleClass) }, children));
201
342
  }
202
343
 
203
- var ItemContext = createContext({
204
- items: [],
205
- addItem: function () { },
206
- updateItem: function () { },
207
- removeItem: function () { },
208
- resetItems: function () { }
344
+ function TextInput(_a) {
345
+ 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, autocomplete = _a.autocomplete, updateFormValue = _a.updateFormValue;
346
+ return (React.createElement("div", { className: "tw-form-control tw-w-full ".concat(containerStyle) },
347
+ labelTitle ? React.createElement("label", { className: "tw-label" },
348
+ React.createElement("span", { className: "tw-label-text tw-text-base-content " + labelStyle }, labelTitle))
349
+ : " ",
350
+ React.createElement("input", { required: true, type: type || "text", name: dataField, defaultValue: defaultValue, placeholder: placeholder || "", autoComplete: autocomplete, onChange: function (e) { return updateFormValue && updateFormValue(e.target.value); }, className: "tw-input tw-input-bordered tw-w-full ".concat(inputStyle ? inputStyle : "") })));
351
+ }
352
+
353
+ function LoginPage() {
354
+ var INITIAL_LOGIN_OBJ = {
355
+ password: "",
356
+ emailId: ""
357
+ };
358
+ var _a = useState(false), loading = _a[0], setLoading = _a[1];
359
+ var _b = useState(""), errorMessage = _b[0], setErrorMessage = _b[1];
360
+ var _c = useState(INITIAL_LOGIN_OBJ), loginObj = _c[0]; _c[1];
361
+ var submitForm = function (e) {
362
+ e.preventDefault();
363
+ setErrorMessage("");
364
+ if (loginObj.emailId.trim() === "")
365
+ return setErrorMessage("Email Id is required! (use any value)");
366
+ if (loginObj.password.trim() === "")
367
+ return setErrorMessage("Password is required! (use any value)");
368
+ else {
369
+ setLoading(true);
370
+ // Call API to check user credentials and save token in localstorage
371
+ localStorage.setItem("token", "DumyTokenHere");
372
+ setLoading(false);
373
+ window.location.href = '/app/welcome';
374
+ }
375
+ };
376
+ var updateFormValue = function (val) {
377
+ console.log(val);
378
+ };
379
+ return (React.createElement("div", { className: "tw-flex-1 tw-bg-base-200 tw-flex tw-items-center" },
380
+ React.createElement("div", { className: "tw-card tw-mx-auto tw-w-full tw-max-w-md tw-shadow-xl" },
381
+ React.createElement("div", { className: "tw-grid md:tw-grid-cols-1 tw-grid-cols-1 tw-bg-base-100 tw-rounded-xl" },
382
+ React.createElement("div", { className: 'tw-py-10 tw-px-10' },
383
+ React.createElement("h2", { className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, "Login"),
384
+ React.createElement("form", { onSubmit: function (e) { return submitForm(e); } },
385
+ React.createElement("div", { className: "tw-mb-4" },
386
+ React.createElement(TextInput, { type: "email", defaultValue: loginObj.emailId, containerStyle: "tw-mt-4", labelTitle: "E-Mail", updateFormValue: function (v) { return updateFormValue(v); } }),
387
+ React.createElement(TextInput, { defaultValue: loginObj.password, type: "password", containerStyle: "tw-mt-4", labelTitle: "Password", updateFormValue: function (v) { return updateFormValue(v); } })),
388
+ React.createElement("div", { className: 'tw-text-right tw-text-primary' },
389
+ React.createElement(Link, { to: "/forgot-password" },
390
+ 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?"))),
391
+ React.createElement(ErrorText, { styleClass: "mt-8" }, errorMessage),
392
+ React.createElement("button", { type: "submit", className: "tw-btn tw-mt-2 tw-w-full tw-btn-primary" + (loading ? " tw-loading" : "") }, "Login"),
393
+ React.createElement("div", { className: 'tw-text-center tw-mt-4' },
394
+ "Don't have an account yet? ",
395
+ React.createElement(Link, { to: "/signup" },
396
+ 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")))))))));
397
+ }
398
+
399
+ function SignupPage() {
400
+ var INITIAL_REGISTER_OBJ = {
401
+ name: "",
402
+ password: "",
403
+ emailId: ""
404
+ };
405
+ var _a = useState(false), loading = _a[0], setLoading = _a[1];
406
+ var _b = useState(""), errorMessage = _b[0], setErrorMessage = _b[1];
407
+ var _c = useState(INITIAL_REGISTER_OBJ), registerObj = _c[0]; _c[1];
408
+ var submitForm = function (e) {
409
+ e.preventDefault();
410
+ setErrorMessage("");
411
+ if (registerObj.name.trim() === "")
412
+ return setErrorMessage("Name is required! (use any value)");
413
+ if (registerObj.emailId.trim() === "")
414
+ return setErrorMessage("Email Id is required! (use any value)");
415
+ if (registerObj.password.trim() === "")
416
+ return setErrorMessage("Password is required! (use any value)");
417
+ else {
418
+ setLoading(true);
419
+ // Call API to check user credentials and save token in localstorage
420
+ localStorage.setItem("token", "DumyTokenHere");
421
+ setLoading(false);
422
+ window.location.href = '/app/welcome';
423
+ }
424
+ };
425
+ var updateFormValue = function (val) {
426
+ console.log(val);
427
+ };
428
+ return (React.createElement("div", { className: "tw-flex-1 tw-bg-base-200 tw-flex tw-items-center" },
429
+ React.createElement("div", { className: "tw-card tw-mx-auto tw-w-full tw-max-w-md tw-shadow-xl" },
430
+ React.createElement("div", { className: "tw-grid md:tw-grid-cols-1 tw-grid-cols-1 tw-bg-base-100 tw-rounded-xl" },
431
+ React.createElement("div", { className: 'tw-py-10 tw-px-10' },
432
+ React.createElement("h2", { className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, "Sign Up"),
433
+ React.createElement("form", { onSubmit: function (e) { return submitForm(e); } },
434
+ React.createElement("div", { className: "mb-4" },
435
+ React.createElement(TextInput, { defaultValue: registerObj.name, containerStyle: "tw-mt-4", labelTitle: "Name", updateFormValue: updateFormValue }),
436
+ React.createElement(TextInput, { defaultValue: registerObj.emailId, containerStyle: "tw-mt-4", labelTitle: "E-Mail", updateFormValue: updateFormValue }),
437
+ React.createElement(TextInput, { defaultValue: registerObj.password, type: "password", containerStyle: "tw-mt-4", labelTitle: "Password", updateFormValue: updateFormValue })),
438
+ React.createElement(ErrorText, { styleClass: "tw-mt-8" }, errorMessage),
439
+ React.createElement("button", { type: "submit", className: "tw-btn tw-mt-2 tw-w-full tw-btn-primary" + (loading ? " tw-loading" : "") }, "Register"),
440
+ React.createElement("div", { className: 'tw-text-center tw-mt-4' },
441
+ "Already have an account? ",
442
+ React.createElement(Link, { to: "/login" },
443
+ React.createElement("span", { className: " tw-inline-block hover:tw-text-primary hover:tw-underline hover:tw-cursor-pointer tw-transition tw-duration-200" }, "Login")))))))));
444
+ }
445
+
446
+ var PermissionContext = createContext({
447
+ permissions: [],
448
+ setPermissionApi: function () { },
449
+ setPermissionData: function () { },
450
+ setAdminRole: function () { },
451
+ hasUserPermission: function () { return true; }
209
452
  });
210
- function useItemsManager(initialItems) {
453
+ function usePermissionsManager(initialPermissions) {
454
+ var _this = this;
211
455
  var _a = useReducer(function (state, action) {
212
456
  switch (action.type) {
213
457
  case "ADD":
214
- var exist = state.find(function (item) {
215
- return item.id === action.item.id ? true : false;
458
+ var exist = state.find(function (permission) {
459
+ return permission.id === action.permission.id ? true : false;
216
460
  });
217
461
  if (!exist)
218
462
  return __spreadArray(__spreadArray([], state, true), [
219
- action.item,
463
+ action.permission,
220
464
  ], false);
221
465
  else
222
466
  return state;
223
- case "UPDATE":
224
- return state.map(function (item) {
225
- if (item.id === action.item.id) {
226
- return action.item;
467
+ case "REMOVE":
468
+ return state.filter(function (_a) {
469
+ var id = _a.id;
470
+ return id !== action.id;
471
+ });
472
+ default:
473
+ throw new Error();
474
+ }
475
+ }, initialPermissions), permissions = _a[0], dispatch = _a[1];
476
+ var _b = React.useState(null), adminRole = _b[0], setAdminRole = _b[1];
477
+ var user = useAuth().user;
478
+ var setPermissionApi = useCallback(function (api) { return __awaiter(_this, void 0, void 0, function () {
479
+ var result;
480
+ return __generator(this, function (_a) {
481
+ switch (_a.label) {
482
+ case 0: return [4 /*yield*/, api.getItems()];
483
+ case 1:
484
+ result = _a.sent();
485
+ if (result) {
486
+ result.map(function (permission) {
487
+ dispatch({ type: "ADD", permission: permission });
488
+ });
489
+ }
490
+ return [2 /*return*/];
491
+ }
492
+ });
493
+ }); }, []);
494
+ var setPermissionData = useCallback(function (data) {
495
+ data.map(function (permission) {
496
+ dispatch({ type: "ADD", permission: permission });
497
+ });
498
+ }, []);
499
+ var hasUserPermission = useCallback(function (collectionName, action) {
500
+ if (permissions.length == 0)
501
+ return true;
502
+ else if (user && user.role == adminRole)
503
+ return true;
504
+ else
505
+ return permissions.some(function (p) { return p.action === action && p.collection === collectionName && p.role == (user === null || user === void 0 ? void 0 : user.role); });
506
+ }, [permissions, user]);
507
+ return { permissions: permissions, setPermissionApi: setPermissionApi, setPermissionData: setPermissionData, setAdminRole: setAdminRole, hasUserPermission: hasUserPermission };
508
+ }
509
+ var PermissionsProvider = function (_a) {
510
+ var initialPermissions = _a.initialPermissions, children = _a.children;
511
+ return (React.createElement(PermissionContext.Provider, { value: usePermissionsManager(initialPermissions) }, children));
512
+ };
513
+ var useSetPermissionApi = function () {
514
+ var setPermissionApi = useContext(PermissionContext).setPermissionApi;
515
+ return setPermissionApi;
516
+ };
517
+ var useSetPermissionData = function () {
518
+ var setPermissionData = useContext(PermissionContext).setPermissionData;
519
+ return setPermissionData;
520
+ };
521
+ var useHasUserPermission = function () {
522
+ var hasUserPermission = useContext(PermissionContext).hasUserPermission;
523
+ return hasUserPermission;
524
+ };
525
+ var useSetAdminRole = function () {
526
+ var setAdminRole = useContext(PermissionContext).setAdminRole;
527
+ return setAdminRole;
528
+ };
529
+
530
+ function AddButton(_a) {
531
+ var setSelectNewItemPosition = _a.setSelectNewItemPosition;
532
+ var layers = useLayers();
533
+ var hasUserPermission = useHasUserPermission();
534
+ var canAddItems = function () {
535
+ var canAdd = false;
536
+ layers.map(function (layer) {
537
+ var _a;
538
+ if (((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && hasUserPermission(layer.api.collectionName, "create"))
539
+ canAdd = true;
540
+ });
541
+ return canAdd;
542
+ };
543
+ return (React.createElement(React.Fragment, null, canAddItems() ?
544
+ 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" },
545
+ React.createElement("label", { tabIndex: 0, className: "tw-z-500 tw-btn tw-btn-circle tw-shadow tw-bg-base-100" },
546
+ 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" },
547
+ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4.5v15m7.5-7.5h-15" }))),
548
+ React.createElement("ul", { tabIndex: 0, className: "tw-dropdown-content tw-pr-1 tw-list-none" }, layers.map(function (layer) {
549
+ var _a;
550
+ return (((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && hasUserPermission(layer.api.collectionName, "create") && (React.createElement("li", { key: layer.name },
551
+ React.createElement("a", null,
552
+ React.createElement("div", { className: "tw-tooltip tw-tooltip-left", "data-tip": layer.menuText },
553
+ 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); } },
554
+ React.createElement(DynamicHeroIcon, { type: 'solid', icon: layer.menuIcon })))))));
555
+ }))) : ""));
556
+ }
557
+
558
+ var ItemContext = createContext({
559
+ items: [],
560
+ addItem: function () { },
561
+ updateItem: function () { },
562
+ removeItem: function () { },
563
+ resetItems: function () { },
564
+ setItemsApi: function () { },
565
+ setItemsData: function () { },
566
+ });
567
+ function useItemsManager(initialItems) {
568
+ var _this = this;
569
+ var addLayer = useAddLayer();
570
+ var _a = useReducer(function (state, action) {
571
+ switch (action.type) {
572
+ case "ADD":
573
+ var exist = state.find(function (item) {
574
+ return item.id === action.item.id ? true : false;
575
+ });
576
+ if (!exist)
577
+ return __spreadArray(__spreadArray([], state, true), [
578
+ action.item,
579
+ ], false);
580
+ else
581
+ return state;
582
+ case "UPDATE":
583
+ return state.map(function (item) {
584
+ if (item.id === action.item.id) {
585
+ return action.item;
227
586
  }
228
587
  return item;
229
588
  });
230
589
  case "REMOVE":
231
590
  return state.filter(function (item) { return item !== action.item; });
232
591
  case "RESET":
233
- return state.filter(function (item) { return item.layer.name !== action.layer.name; });
592
+ return state.filter(function (item) { var _a; return ((_a = item.layer) === null || _a === void 0 ? void 0 : _a.name) !== action.layer.name; });
234
593
  default:
235
594
  throw new Error();
236
595
  }
237
596
  }, initialItems), items = _a[0], dispatch = _a[1];
238
- var addItem = useCallback(function (item) {
239
- dispatch({
240
- type: "ADD",
241
- item: item,
597
+ var setItemsApi = useCallback(function (layer) { return __awaiter(_this, void 0, void 0, function () {
598
+ var result;
599
+ var _a;
600
+ return __generator(this, function (_b) {
601
+ switch (_b.label) {
602
+ case 0:
603
+ ((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && addLayer(layer);
604
+ return [4 /*yield*/, toast.promise(layer.api.getItems(), {
605
+ pending: "loading ".concat(layer.name, " ..."),
606
+ success: "".concat(layer.name, " loaded"),
607
+ error: {
608
+ render: function (_a) {
609
+ var data = _a.data;
610
+ return "".concat(data);
611
+ },
612
+ },
613
+ })];
614
+ case 1:
615
+ result = _b.sent();
616
+ if (result) {
617
+ result.map(function (item) {
618
+ dispatch({ type: "ADD", item: __assign(__assign({}, item), { layer: layer }) });
619
+ });
620
+ }
621
+ return [2 /*return*/];
622
+ }
242
623
  });
243
- }, []);
244
- var updateItem = useCallback(function (item) {
245
- dispatch({
246
- type: "UPDATE",
247
- item: item,
624
+ }); }, []);
625
+ var setItemsData = useCallback(function (layer) {
626
+ var _a;
627
+ (_a = layer.data) === null || _a === void 0 ? void 0 : _a.map(function (item) {
628
+ dispatch({ type: "ADD", item: __assign(__assign({}, item), { layer: layer }) });
248
629
  });
249
630
  }, []);
631
+ var addItem = useCallback(function (item) { return __awaiter(_this, void 0, void 0, function () {
632
+ return __generator(this, function (_a) {
633
+ dispatch({
634
+ type: "ADD",
635
+ item: item,
636
+ });
637
+ return [2 /*return*/];
638
+ });
639
+ }); }, []);
640
+ var updateItem = useCallback(function (item) { return __awaiter(_this, void 0, void 0, function () {
641
+ return __generator(this, function (_a) {
642
+ dispatch({
643
+ type: "UPDATE",
644
+ item: item,
645
+ });
646
+ return [2 /*return*/];
647
+ });
648
+ }); }, []);
250
649
  var removeItem = useCallback(function (item) {
251
650
  dispatch({
252
651
  type: "REMOVE",
@@ -259,7 +658,7 @@ function useItemsManager(initialItems) {
259
658
  layer: layer
260
659
  });
261
660
  }, []);
262
- return { items: items, updateItem: updateItem, addItem: addItem, removeItem: removeItem, resetItems: resetItems };
661
+ return { items: items, updateItem: updateItem, addItem: addItem, removeItem: removeItem, resetItems: resetItems, setItemsApi: setItemsApi, setItemsData: setItemsData };
263
662
  }
264
663
  var ItemsProvider = function (_a) {
265
664
  var initialItems = _a.initialItems, children = _a.children;
@@ -281,51 +680,101 @@ var useRemoveItem = function () {
281
680
  var removeItem = useContext(ItemContext).removeItem;
282
681
  return removeItem;
283
682
  };
284
- var useResetItems = function () {
285
- var resetItems = useContext(ItemContext).resetItems;
286
- return resetItems;
683
+ var useSetItemsApi = function () {
684
+ var setItemsApi = useContext(ItemContext).setItemsApi;
685
+ return setItemsApi;
686
+ };
687
+ var useSetItemsData = function () {
688
+ var setItemsData = useContext(ItemContext).setItemsData;
689
+ return setItemsData;
287
690
  };
288
691
 
692
+ var hashTagRegex = /(#+[a-zA-Z0-9A-Za-zÀ-ÖØ-öø-ʸ(_)]{1,})/g;
693
+
289
694
  var TagContext = createContext({
290
695
  tags: [],
291
696
  addTag: function () { },
292
- removeTag: function () { }
697
+ removeTag: function () { },
698
+ setTagApi: function () { },
699
+ setTagData: function () { },
700
+ getItemTags: function () { return []; }
293
701
  });
294
702
  function useTagsManager(initialTags) {
703
+ var _this = this;
295
704
  var _a = useReducer(function (state, action) {
296
705
  switch (action.type) {
297
706
  case "ADD":
298
707
  var exist = state.find(function (tag) {
299
- return tag.id === action.tag.id ? true : false;
708
+ return tag.id.toLocaleLowerCase() === action.tag.id.toLocaleLowerCase() ? true : false;
300
709
  });
301
710
  if (!exist)
302
711
  return __spreadArray(__spreadArray([], state, true), [
303
- action.tag,
712
+ __assign(__assign({}, action.tag), { id: action.tag.id.toLocaleLowerCase() })
304
713
  ], false);
305
714
  else
306
715
  return state;
307
716
  case "REMOVE":
308
717
  return state.filter(function (_a) {
309
718
  var id = _a.id;
310
- return id !== action.id;
719
+ return id !== action.id.toLocaleLowerCase();
311
720
  });
312
721
  default:
313
722
  throw new Error();
314
723
  }
315
724
  }, initialTags), tags = _a[0], dispatch = _a[1];
316
- var addTag = useCallback(function (tag) {
725
+ var _b = React.useState({}), api = _b[0], setApi = _b[1];
726
+ var setTagApi = useCallback(function (api) { return __awaiter(_this, void 0, void 0, function () {
727
+ var result;
728
+ return __generator(this, function (_a) {
729
+ switch (_a.label) {
730
+ case 0:
731
+ setApi(api);
732
+ return [4 /*yield*/, api.getItems()];
733
+ case 1:
734
+ result = _a.sent();
735
+ if (result) {
736
+ result.map(function (tag) {
737
+ tag.id = tag.id.toLocaleLowerCase();
738
+ dispatch({ type: "ADD", tag: tag });
739
+ });
740
+ }
741
+ return [2 /*return*/];
742
+ }
743
+ });
744
+ }); }, []);
745
+ var setTagData = useCallback(function (data) {
746
+ data.map(function (tag) {
747
+ tag.id = tag.id.toLocaleLowerCase();
748
+ dispatch({ type: "ADD", tag: tag });
749
+ });
750
+ }, []);
751
+ var addTag = function (tag) {
317
752
  dispatch({
318
753
  type: "ADD",
319
754
  tag: tag,
320
755
  });
321
- }, []);
756
+ if (!tags.some(function (t) { return t.id.toLocaleLowerCase() === tag.id.toLocaleLowerCase(); })) {
757
+ (api === null || api === void 0 ? void 0 : api.createItem) && api.createItem(tag);
758
+ }
759
+ };
322
760
  var removeTag = useCallback(function (id) {
323
761
  dispatch({
324
762
  type: "REMOVE",
325
763
  id: id,
326
764
  });
765
+ (api === null || api === void 0 ? void 0 : api.deleteItem) && api.deleteItem(id);
327
766
  }, []);
328
- return { tags: tags, addTag: addTag, removeTag: removeTag };
767
+ var getItemTags = useCallback(function (item) {
768
+ var itemTagStrings = item.text.toLocaleLowerCase().match(hashTagRegex);
769
+ var itemTags = [];
770
+ itemTagStrings === null || itemTagStrings === void 0 ? void 0 : itemTagStrings.map(function (tag) {
771
+ if (tags.find(function (t) { return t.id === tag.slice(1); })) {
772
+ itemTags.push(tags.find(function (t) { return t.id === tag.slice(1); }));
773
+ }
774
+ });
775
+ return itemTags;
776
+ }, [tags]);
777
+ return { tags: tags, addTag: addTag, removeTag: removeTag, setTagApi: setTagApi, setTagData: setTagData, getItemTags: getItemTags };
329
778
  }
330
779
  var TagsProvider = function (_a) {
331
780
  var initialTags = _a.initialTags, children = _a.children;
@@ -338,49 +787,401 @@ var useTags = function () {
338
787
  var useAddTag = function () {
339
788
  var addTag = useContext(TagContext).addTag;
340
789
  return addTag;
790
+ };
791
+ var useSetTagApi = function () {
792
+ var setTagApi = useContext(TagContext).setTagApi;
793
+ return setTagApi;
794
+ };
795
+ var useSetTagData = function () {
796
+ var setTagData = useContext(TagContext).setTagData;
797
+ return setTagData;
798
+ };
799
+ var useGetItemTags = function () {
800
+ var getItemTags = useContext(TagContext).getItemTags;
801
+ return getItemTags;
341
802
  };
342
803
 
343
- function MapEventListener(props) {
344
- useMapEvents({
345
- click: function (e) {
346
- console.log(e.latlng.lat + ',' + e.latlng.lng);
347
- if (props.selectMode != null) {
348
- props.setItemFormPopup({ layer: props.selectMode, position: e.latlng });
349
- props.setSelectMode(null);
804
+ var FilterContext = createContext({
805
+ filterTags: [],
806
+ searchPhrase: "",
807
+ visibleLayers: [],
808
+ addFilterTag: function () { },
809
+ removeFilterTag: function () { },
810
+ resetFilterTags: function () { },
811
+ setSearchPhrase: function () { },
812
+ addVisibleLayer: function () { },
813
+ toggleVisibleLayer: function () { },
814
+ resetVisibleLayers: function () { },
815
+ isLayerVisible: function () { return true; }
816
+ });
817
+ function useFilterManager(initialTags) {
818
+ var _a = useReducer(function (state, action) {
819
+ switch (action.type) {
820
+ case "ADD_TAG":
821
+ var exist = state.find(function (tag) {
822
+ return tag.id === action.tag.id ? true : false;
823
+ });
824
+ if (!exist)
825
+ return __spreadArray(__spreadArray([], state, true), [
826
+ action.tag,
827
+ ], false);
828
+ else
829
+ return state;
830
+ case "REMOVE_TAG":
831
+ return state.filter(function (_a) {
832
+ var id = _a.id;
833
+ return id !== action.id;
834
+ });
835
+ case "RESET_TAGS":
836
+ return initialTags;
837
+ default:
838
+ throw new Error();
839
+ }
840
+ }, initialTags), filterTags = _a[0], dispatchTags = _a[1];
841
+ var initialLayers = useLayers();
842
+ var _b = useReducer(function (state, action) {
843
+ switch (action.type) {
844
+ case "ADD_LAYER":
845
+ var exist1 = state.find(function (layer) {
846
+ return layer.name === action.layer.name ? true : false;
847
+ });
848
+ if (!exist1)
849
+ return __spreadArray(__spreadArray([], state, true), [
850
+ action.layer,
851
+ ], false);
852
+ else
853
+ return state;
854
+ case "TOGGLE_LAYER":
855
+ var exist2 = state.some(function (layer) {
856
+ return layer.name === action.layer.name;
857
+ });
858
+ if (exist2)
859
+ return state.filter(function (_a) {
860
+ var name = _a.name;
861
+ return name != action.layer.name;
862
+ });
863
+ else
864
+ return __spreadArray(__spreadArray([], state, true), [action.layer], false);
865
+ case "RESET_LAYERS":
866
+ return initialLayers;
867
+ default:
868
+ throw new Error();
869
+ }
870
+ }, initialLayers), visibleLayers = _b[0], dispatchLayers = _b[1];
871
+ var _c = React.useState(""), searchPhrase = _c[0], searchPhraseSet = _c[1];
872
+ var addFilterTag = function (tag) {
873
+ dispatchTags({
874
+ type: "ADD_TAG",
875
+ tag: tag,
876
+ });
877
+ };
878
+ var removeFilterTag = useCallback(function (id) {
879
+ dispatchTags({
880
+ type: "REMOVE_TAG",
881
+ id: id,
882
+ });
883
+ }, []);
884
+ var resetFilterTags = useCallback(function () {
885
+ dispatchTags({
886
+ type: "RESET_TAGS",
887
+ });
888
+ }, []);
889
+ var addVisibleLayer = function (layer) {
890
+ dispatchLayers({
891
+ type: "ADD_LAYER",
892
+ layer: layer,
893
+ });
894
+ };
895
+ var toggleVisibleLayer = function (layer) {
896
+ dispatchLayers({
897
+ type: "TOGGLE_LAYER",
898
+ layer: layer,
899
+ });
900
+ };
901
+ var resetVisibleLayers = useCallback(function () {
902
+ dispatchLayers({
903
+ type: "RESET_LAYERS",
904
+ });
905
+ }, []);
906
+ var isLayerVisible = useCallback(function (layer) {
907
+ return visibleLayers.some(function (l) { return l.name === layer.name; });
908
+ }, [visibleLayers]);
909
+ var setSearchPhrase = useCallback(function (phrase) {
910
+ searchPhraseSet(phrase);
911
+ }, []);
912
+ return { filterTags: filterTags, addFilterTag: addFilterTag, removeFilterTag: removeFilterTag, resetFilterTags: resetFilterTags, setSearchPhrase: setSearchPhrase, searchPhrase: searchPhrase, visibleLayers: visibleLayers, toggleVisibleLayer: toggleVisibleLayer, resetVisibleLayers: resetVisibleLayers, isLayerVisible: isLayerVisible, addVisibleLayer: addVisibleLayer };
913
+ }
914
+ var FilterProvider = function (_a) {
915
+ var initialTags = _a.initialTags, children = _a.children;
916
+ return (React.createElement(FilterContext.Provider, { value: useFilterManager(initialTags) }, children));
917
+ };
918
+ var useFilterTags = function () {
919
+ var filterTags = useContext(FilterContext).filterTags;
920
+ return filterTags;
921
+ };
922
+ var useAddFilterTag = function () {
923
+ var addFilterTag = useContext(FilterContext).addFilterTag;
924
+ return addFilterTag;
925
+ };
926
+ var useRemoveFilterTag = function () {
927
+ var removeFilterTag = useContext(FilterContext).removeFilterTag;
928
+ return removeFilterTag;
929
+ };
930
+ var useResetFilterTags = function () {
931
+ var resetFilterTags = useContext(FilterContext).resetFilterTags;
932
+ return resetFilterTags;
933
+ };
934
+ var useSearchPhrase = function () {
935
+ var searchPhrase = useContext(FilterContext).searchPhrase;
936
+ return searchPhrase;
937
+ };
938
+ var useSetSearchPhrase = function () {
939
+ var setSearchPhrase = useContext(FilterContext).setSearchPhrase;
940
+ return setSearchPhrase;
941
+ };
942
+ var useAddVisibleLayer = function () {
943
+ var addVisibleLayer = useContext(FilterContext).addVisibleLayer;
944
+ return addVisibleLayer;
945
+ };
946
+ var useToggleVisibleLayer = function () {
947
+ var toggleVisibleLayer = useContext(FilterContext).toggleVisibleLayer;
948
+ return toggleVisibleLayer;
949
+ };
950
+ var useIsLayerVisible = function () {
951
+ var isLayerVisible = useContext(FilterContext).isLayerVisible;
952
+ return isLayerVisible;
953
+ };
954
+
955
+ function getWindowDimensions() {
956
+ var width = window.innerWidth, height = window.innerHeight;
957
+ return {
958
+ width: width,
959
+ height: height
960
+ };
961
+ }
962
+ function useWindowDimensions() {
963
+ var _a = useState(getWindowDimensions()), windowDimensions = _a[0], setWindowDimensions = _a[1];
964
+ useEffect(function () {
965
+ function handleResize() {
966
+ setWindowDimensions(getWindowDimensions());
967
+ }
968
+ window.addEventListener('resize', handleResize);
969
+ return function () { return window.removeEventListener('resize', handleResize); };
970
+ }, []);
971
+ return windowDimensions;
972
+ }
973
+
974
+ function capitalizeFirstLetter(string) {
975
+ return string.charAt(0).toUpperCase() + string.slice(1);
976
+ }
977
+ var FilterControl = function () {
978
+ var windowDimensions = useWindowDimensions();
979
+ /**
980
+ const [popupOpen, setPopupOpen] = useState<boolean>(false);
981
+
982
+ useMapEvents({
983
+ popupopen: (e) => {
984
+ console.log(e);
985
+
986
+ setPopupOpen(true);
987
+ },
988
+ popupclose: () => {
989
+ setPopupOpen(false);
350
990
  }
351
- },
352
- resize: function () {
353
- console.log("resize");
991
+ })
992
+ */
993
+ var filterTags = useFilterTags();
994
+ var removeFilterTag = useRemoveFilterTag();
995
+ var setSearchPhrase = useSetSearchPhrase();
996
+ return (React.createElement(React.Fragment, null, !(
997
+ //popupOpen &&
998
+ windowDimensions.height < 500) &&
999
+ 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' },
1000
+ 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); } }),
1001
+ React.createElement("div", { className: 'tw-flex tw-flex-wrap tw-mt-4' }, filterTags.map(function (tag) {
1002
+ 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 } },
1003
+ React.createElement("div", { className: "tw-card-actions tw-justify-end" },
1004
+ 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")),
1005
+ React.createElement("b", null,
1006
+ "#",
1007
+ capitalizeFirstLetter(tag.id)));
1008
+ })))));
1009
+ };
1010
+
1011
+ var LeafletRefsContext = createContext({
1012
+ leafletRefs: {},
1013
+ addMarker: function () { },
1014
+ addPopup: function () { },
1015
+ });
1016
+ function useLeafletRefsManager(initialLeafletRefs) {
1017
+ var _a = useReducer(function (state, action) {
1018
+ var _a, _b;
1019
+ switch (action.type) {
1020
+ case "ADD_MARKER":
1021
+ return __assign(__assign({}, state), (_a = {}, _a[action.item.id] = __assign(__assign({}, state[action.item.id]), { marker: action.marker, item: action.item }), _a));
1022
+ case "ADD_POPUP":
1023
+ return __assign(__assign({}, state), (_b = {}, _b[action.item.id] = __assign(__assign({}, state[action.item.id]), { popup: action.popup, item: action.item }), _b));
1024
+ default:
1025
+ throw new Error();
354
1026
  }
355
- });
356
- return null;
1027
+ }, initialLeafletRefs), leafletRefs = _a[0], dispatch = _a[1];
1028
+ var addMarker = useCallback(function (item, marker) {
1029
+ dispatch({
1030
+ type: "ADD_MARKER",
1031
+ item: item,
1032
+ marker: marker
1033
+ });
1034
+ }, []);
1035
+ var addPopup = useCallback(function (item, popup) {
1036
+ dispatch({
1037
+ type: "ADD_POPUP",
1038
+ item: item,
1039
+ popup: popup
1040
+ });
1041
+ }, []);
1042
+ return { leafletRefs: leafletRefs, addMarker: addMarker, addPopup: addPopup };
1043
+ }
1044
+ var LeafletRefsProvider = function (_a) {
1045
+ var initialLeafletRefs = _a.initialLeafletRefs, children = _a.children;
1046
+ return (React.createElement(LeafletRefsContext.Provider, { value: useLeafletRefsManager(initialLeafletRefs) }, children));
1047
+ };
1048
+ var useLeafletRefs = function () {
1049
+ var leafletRefs = useContext(LeafletRefsContext).leafletRefs;
1050
+ return leafletRefs;
1051
+ };
1052
+ var useAddMarker = function () {
1053
+ var addMarker = useContext(LeafletRefsContext).addMarker;
1054
+ return addMarker;
1055
+ };
1056
+ var useAddPopup = function () {
1057
+ var addPopup = useContext(LeafletRefsContext).addPopup;
1058
+ return addPopup;
1059
+ };
1060
+
1061
+ function LayerControl() {
1062
+ var _a = React.useState(false), open = _a[0], setOpen = _a[1];
1063
+ var layers = useLayers();
1064
+ useEffect(function () {
1065
+ layers.map(function (layer) {
1066
+ return addVisibleLayer(layer);
1067
+ });
1068
+ }, [layers]);
1069
+ var isLayerVisible = useIsLayerVisible();
1070
+ var toggleVisibleLayer = useToggleVisibleLayer();
1071
+ var addVisibleLayer = useAddVisibleLayer();
1072
+ return (React.createElement("div", { className: "tw-card tw-bg-base-100 tw-shadow-xl ", onClick: function (e) { return e.stopPropagation(); } }, open ?
1073
+ 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(); } },
1074
+ 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-text-gray-600", onClick: function () { return setOpen(false); } },
1075
+ React.createElement("p", { className: 'tw-text-center ' }, "\u2715")),
1076
+ React.createElement("ul", { className: 'tw-flex-row' }, layers.map(function (layer) {
1077
+ return React.createElement("li", { key: layer.name },
1078
+ React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-1" },
1079
+ React.createElement("input", { type: "checkbox", className: "tw-checkbox tw-checkbox-xs tw-checkbox-success", checked: isLayerVisible(layer), onChange: function () { return toggleVisibleLayer(layer); } }),
1080
+ React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, layer.name)));
1081
+ })))
1082
+ :
1083
+ React.createElement("div", { className: "tw-card-body hover:tw-bg-slate-300 tw-card tw-p-2 tw-h-10 tw-w-10 tw-transition-all tw-duration-300 hover:tw-cursor-pointer", onClick: function () { return setOpen(true); } },
1084
+ React.createElement("svg", { version: "1.1", viewBox: "0 0 20 20", xmlns: "http://www.w3.org/2000/svg" },
1085
+ React.createElement("path", { id: "svg_1", fill: "currentColor", d: "m2.75565,11.90727l-1.03852,0.28372c-0.77718,0.38859 -0.77718,1.0138 0,1.4023l7.0156,3.5078c0.77718,0.38859 2.0275,0.38859 2.8047,0l7.0156,-3.5078c0.77718,-0.38859 0.77718,-1.0138 0,-1.4023l-0.63311,-0.48643l-4.67718,2.23624c-1.5452,0.77262 -3.31877,1.58343 -4.86407,0.81081l-5.62302,-2.84434z" }),
1086
+ React.createElement("path", { id: "svg_2", strokeWidth: "2", stroke: "currentColor", fill: "none", d: "m11.247,4.30851l6.2349,3.0877c0.69083,0.34211 0.69083,0.89295 0,1.2351l-6.2349,3.0877c-0.69083,0.34211 -1.8031,0.34212 -2.494,0l-6.2349,-3.0877c-0.69083,-0.34211 -0.69083,-0.89295 0,-1.2351l6.2349,-3.0877c0.69083,-0.34211 1.8031,-0.34211 2.494,0z" })))));
1087
+ }
1088
+
1089
+ var QuestContext = createContext({
1090
+ open: false,
1091
+ setQuestsOpen: function () { }
1092
+ });
1093
+ function useQuestsManager(initialOpen) {
1094
+ var _a = useState(initialOpen), open = _a[0], setOpen = _a[1];
1095
+ var setQuestsOpen = useCallback(function (questOpen) {
1096
+ setOpen(questOpen);
1097
+ }, []);
1098
+ return { open: open, setQuestsOpen: setQuestsOpen };
357
1099
  }
1100
+ var QuestsProvider = function (_a) {
1101
+ var initialOpen = _a.initialOpen, children = _a.children;
1102
+ return (React.createElement(QuestContext.Provider, { value: useQuestsManager(initialOpen) }, children));
1103
+ };
1104
+ var useQuestsOpen = function () {
1105
+ var open = useContext(QuestContext).open;
1106
+ return open;
1107
+ };
1108
+ var useSetQuestOpen = function () {
1109
+ var setQuestsOpen = useContext(QuestContext).setQuestsOpen;
1110
+ return setQuestsOpen;
1111
+ };
1112
+
1113
+ function QuestControl() {
1114
+ var questsOpen = useQuestsOpen();
1115
+ var setQuestsOpen = useSetQuestOpen();
1116
+ return (React.createElement(React.Fragment, null, questsOpen ? "" :
1117
+ React.createElement("div", { className: "tw-card tw-bg-base-100 tw-shadow-xl tw-my-2 tw-w-10", onClick: function (e) { return e.stopPropagation(); } },
1118
+ React.createElement("div", { className: "tw-card-body hover:tw-bg-slate-300 tw-rounded-2xl tw-p-2 tw-h-10 tw-w-10 tw-transition-all tw-duration-300 hover:tw-cursor-pointer", onClick: function () { return setQuestsOpen(true); } },
1119
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", stroke: "currentColor", viewBox: "0 0 448 512" },
1120
+ React.createElement("path", { d: "M192 0c17.7 0 32 14.3 32 32V144H160V32c0-17.7 14.3-32 32-32zM64 64c0-17.7 14.3-32 32-32s32 14.3 32 32v80H64V64zm192 0c0-17.7 14.3-32 32-32s32 14.3 32 32v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V64zm96 64c0-17.7 14.3-32 32-32s32 14.3 32 32v64c0 17.7-14.3 32-32 32s-32-14.3-32-32V128zm-96 88l0-.6c9.4 5.4 20.3 8.6 32 8.6c13.2 0 25.4-4 35.6-10.8c8.7 24.9 32.5 42.8 60.4 42.8c11.7 0 22.6-3.1 32-8.6V256c0 52.3-25.1 98.8-64 128v96c0 17.7-14.3 32-32 32H160c-17.7 0-32-14.3-32-32V401.6c-17.3-7.9-33.2-18.8-46.9-32.5L69.5 357.5C45.5 333.5 32 300.9 32 267V240c0-35.3 28.7-64 64-64h88c22.1 0 40 17.9 40 40s-17.9 40-40 40H128c-8.8 0-16 7.2-16 16s7.2 16 16 16h56c39.8 0 72-32.2 72-72z" }))))));
1121
+ }
1122
+
1123
+ var Control = function (_a) {
1124
+ var children = _a.children;
1125
+ return (React.createElement("div", { className: 'tw-absolute tw-bottom-4 tw-left-4 tw-z-[999] tw-flex-col' }, children));
1126
+ };
1127
+
358
1128
  // for refreshing map on resize (needs to be implemented)
359
1129
  var mapDivRef = React.createRef();
360
1130
  function UtopiaMap(_a) {
361
1131
  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;
362
- var _f = useState(null), selectMode = _f[0], setSelectMode = _f[1];
363
- var _g = useState(null), itemFormPopup = _g[0], setItemFormPopup = _g[1];
1132
+ var meta = document.getElementsByTagName('meta');
1133
+ var _f = useState(meta), metaTags = _f[0]; _f[1];
1134
+ function MapEventListener(props) {
1135
+ useMapEvents({
1136
+ click: function (e) {
1137
+ var _a, _b, _c;
1138
+ window.history.pushState({}, "", "/");
1139
+ document.title = document.title.split("-")[0];
1140
+ (_a = document.querySelector('meta[property="og:title"]')) === null || _a === void 0 ? void 0 : _a.setAttribute("content", document.title);
1141
+ (_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")));
1142
+ meta = metaTags;
1143
+ console.log(e.latlng.lat + ',' + e.latlng.lng);
1144
+ if (props.selectNewItemPosition != null) {
1145
+ props.setItemFormPopup({ layer: props.selectNewItemPosition, position: e.latlng });
1146
+ props.setSelectNewItemPosition(null);
1147
+ }
1148
+ },
1149
+ resize: function () {
1150
+ console.log("resize");
1151
+ },
1152
+ });
1153
+ return null;
1154
+ }
1155
+ var _g = useState(null), selectNewItemPosition = _g[0], setSelectNewItemPosition = _g[1];
1156
+ var _h = useState(null), itemFormPopup = _h[0], setItemFormPopup = _h[1];
1157
+ var clusterRef = React.useRef();
364
1158
  return (React.createElement(LayersProvider, { initialLayers: [] },
365
1159
  React.createElement(TagsProvider, { initialTags: [] },
366
- React.createElement(ItemsProvider, { initialItems: [] },
367
- React.createElement("div", { className: (selectMode != null ? "crosshair-cursor-enabled" : undefined) },
368
- React.createElement(MapContainer, { ref: mapDivRef, style: { height: height, width: width }, center: center, zoom: zoom },
369
- 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" }),
370
- React.createElement(MarkerClusterGroup, { showCoverageOnHover: true, chunkedLoading: true, maxClusterRadius: 50 }, React.Children.toArray(children).map(function (child) {
371
- return React.isValidElement(child) && typeof child.type !== "string" && child.type.name === "Layer" ?
372
- React.cloneElement(child, { setItemFormPopup: setItemFormPopup, itemFormPopup: itemFormPopup }) : child;
373
- })),
374
- React.createElement(MapEventListener, { setSelectMode: setSelectMode, selectMode: selectMode, setItemFormPopup: setItemFormPopup }),
375
- React.createElement(AddButton, { setSelectMode: setSelectMode })),
376
- selectMode != null &&
377
- React.createElement("div", { className: "tw-button tw-z-500 tw-absolute tw-right-5 tw-top-20 tw-drop-shadow-md" },
378
- React.createElement("div", { className: "tw-alert tw-bg-white tw-text-green-900" },
379
- React.createElement("div", null,
380
- React.createElement("span", null,
381
- "Select ",
382
- selectMode.name,
383
- " position!")))))))));
1160
+ React.createElement(PermissionsProvider, { initialPermissions: [] },
1161
+ React.createElement(FilterProvider, { initialTags: [] },
1162
+ React.createElement(ItemsProvider, { initialItems: [] },
1163
+ React.createElement(LeafletRefsProvider, { initialLeafletRefs: {} },
1164
+ React.createElement("div", { className: (selectNewItemPosition != null ? "crosshair-cursor-enabled" : undefined) },
1165
+ React.createElement(MapContainer, { ref: mapDivRef, style: { height: height, width: width }, center: center, zoom: zoom, zoomControl: false },
1166
+ React.createElement(FilterControl, null),
1167
+ React.createElement(Control, null,
1168
+ React.createElement(QuestControl, null),
1169
+ React.createElement(LayerControl, null)),
1170
+ 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" }),
1171
+ React.createElement(MarkerClusterGroup, { ref: clusterRef, showCoverageOnHover: true, chunkedLoading: true, maxClusterRadius: 50, removeOutsideVisibleBounds: false }, React.Children.toArray(children).map(function (child) {
1172
+ return React.isValidElement(child) ?
1173
+ React.cloneElement(child, { setItemFormPopup: setItemFormPopup, itemFormPopup: itemFormPopup, clusterRef: clusterRef }) : child;
1174
+ })),
1175
+ React.createElement(MapEventListener, { setSelectNewItemPosition: setSelectNewItemPosition, selectNewItemPosition: selectNewItemPosition, setItemFormPopup: setItemFormPopup })),
1176
+ React.createElement(AddButton, { setSelectNewItemPosition: setSelectNewItemPosition }),
1177
+ selectNewItemPosition != null &&
1178
+ React.createElement("div", { className: "tw-button tw-z-1000 tw-absolute tw-right-5 tw-top-4 tw-drop-shadow-md" },
1179
+ React.createElement("div", { className: "tw-alert tw-bg-base-100 tw-text-base-content" },
1180
+ React.createElement("div", null,
1181
+ React.createElement("span", null,
1182
+ "Select ",
1183
+ selectNewItemPosition.name,
1184
+ " position!"))))))))))));
384
1185
  }
385
1186
 
386
1187
  var createSvg = function (shape, markerColor, borderColor) {
@@ -398,6 +1199,12 @@ var addIcon = function (icon) {
398
1199
  return '<svg fill="#fff" class="circle-icon" width="13"xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256z"/></svg>';
399
1200
  case "calendar-days-solid":
400
1201
  return '<svg fill="#fff" class="calendar-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M160 32V64H288V32C288 14.33 302.3 0 320 0C337.7 0 352 14.33 352 32V64H400C426.5 64 448 85.49 448 112V160H0V112C0 85.49 21.49 64 48 64H96V32C96 14.33 110.3 0 128 0C145.7 0 160 14.33 160 32zM0 192H448V464C448 490.5 426.5 512 400 512H48C21.49 512 0 490.5 0 464V192zM64 304C64 312.8 71.16 320 80 320H112C120.8 320 128 312.8 128 304V272C128 263.2 120.8 256 112 256H80C71.16 256 64 263.2 64 272V304zM192 304C192 312.8 199.2 320 208 320H240C248.8 320 256 312.8 256 304V272C256 263.2 248.8 256 240 256H208C199.2 256 192 263.2 192 272V304zM336 256C327.2 256 320 263.2 320 272V304C320 312.8 327.2 320 336 320H368C376.8 320 384 312.8 384 304V272C384 263.2 376.8 256 368 256H336zM64 432C64 440.8 71.16 448 80 448H112C120.8 448 128 440.8 128 432V400C128 391.2 120.8 384 112 384H80C71.16 384 64 391.2 64 400V432zM208 384C199.2 384 192 391.2 192 400V432C192 440.8 199.2 448 208 448H240C248.8 448 256 440.8 256 432V400C256 391.2 248.8 384 240 384H208zM320 432C320 440.8 327.2 448 336 448H368C376.8 448 384 440.8 384 432V400C384 391.2 376.8 384 368 384H336C327.2 384 320 391.2 320 400V432z"/></svg>';
1202
+ case "user":
1203
+ return '<svg fill="#fff" class="user-icon" xmlns="http://www.w3.org/2000/svg" height="1.5em" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z"/></svg>';
1204
+ case "fire":
1205
+ return '<svg fill="#fff" class="fire-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.534 26.387"><path d="M7.15 26.05C2.894 24.876.006 21.028.006 16.53c0-4.036 2.718-8.378 4.38-6.999.289.24.383.993.383 3.074 0 3.3.46 4.508 1.997 5.237 2.512 1.192 5.206-1.18 4.506-3.969-.097-.386-.99-1.562-1.986-2.614C7.04 8.887 6.583 8.026 6.583 6.176c0-2.333 2.02-6.182 3.244-6.182.59 0 1.292.98 1.292 1.805 0 1.227.951 2.596 3.727 5.362 3.655 3.642 4.493 5.216 4.671 8.776.143 2.847-.365 4.593-1.93 6.644-2.332 3.054-6.69 4.503-10.437 3.47z"/></svg>';
1206
+ case "tree":
1207
+ return '<svg svg fill="#fff" class="tree-icon" xmlns="http://www.w3.org/2000/svg" height="2em" xml:space="preserve" viewBox="0 0 24 24"><path d="M11 21v-4.3c-.5.2-1 .3-1.5.3C7 17 5 15 5 12.5c0-1.3.5-2.4 1.4-3.2-.3-.6-.4-1.2-.4-1.8C6 5 8 3 10.5 3c1.6 0 2.9.8 3.8 2h.2c3 0 5.5 2.5 5.5 5.5S17.5 16 14.5 16c-.5 0-1-.1-1.5-.2V21h-2z"/><path fill="none" d="M0 0h24v24H0z"/></svg>';
401
1208
  default:
402
1209
  return "";
403
1210
  }
@@ -414,14 +1221,45 @@ var MarkerIconFactory = function (shape, color1, color2, icon) {
414
1221
  };
415
1222
 
416
1223
  function HeaderView(_a) {
417
- var item = _a.item, setItemFormPopup = _a.setItemFormPopup;
1224
+ var _this = this;
1225
+ var _b, _c, _d, _e, _f, _g, _h, _j;
1226
+ var item = _a.item, title = _a.title, avatar = _a.avatar, setItemFormPopup = _a.setItemFormPopup;
1227
+ var _k = React.useState(false), loading = _k[0], setLoading = _k[1];
418
1228
  var removeItem = useRemoveItem();
419
1229
  var map = useMap();
420
- var removeItemFromMap = function (event) {
421
- var _a;
422
- (_a = item.api) === null || _a === void 0 ? void 0 : _a.deleteItem(item.id).then(function () { return removeItem(item); }).then(function () { return map.closePopup(); }).catch(function (err) { return console.log(err); });
423
- event.stopPropagation();
424
- };
1230
+ var hasUserPermission = useHasUserPermission();
1231
+ var removeItemFromMap = function (event) { return __awaiter(_this, void 0, void 0, function () {
1232
+ var success, error_1;
1233
+ var _a, _b;
1234
+ return __generator(this, function (_c) {
1235
+ switch (_c.label) {
1236
+ case 0:
1237
+ setLoading(true);
1238
+ success = false;
1239
+ _c.label = 1;
1240
+ case 1:
1241
+ _c.trys.push([1, 3, , 4]);
1242
+ 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))];
1243
+ case 2:
1244
+ _c.sent();
1245
+ success = true;
1246
+ return [3 /*break*/, 4];
1247
+ case 3:
1248
+ error_1 = _c.sent();
1249
+ toast.error(error_1.toString());
1250
+ return [3 /*break*/, 4];
1251
+ case 4:
1252
+ if (success) {
1253
+ removeItem(item);
1254
+ toast.success("Item deleted");
1255
+ }
1256
+ setLoading(false);
1257
+ map.closePopup();
1258
+ event.stopPropagation();
1259
+ return [2 /*return*/];
1260
+ }
1261
+ });
1262
+ }); };
425
1263
  var openEditPopup = function (event) {
426
1264
  event.stopPropagation();
427
1265
  map.closePopup();
@@ -430,63 +1268,112 @@ function HeaderView(_a) {
430
1268
  };
431
1269
  return (React.createElement("div", { className: 'tw-grid tw-grid-cols-6 tw-pb-2' },
432
1270
  React.createElement("div", { className: 'tw-col-span-5' },
433
- React.createElement("b", { className: "tw-text-xl tw-font-bold" }, item.name)),
434
- React.createElement("div", { className: 'tw-col-span-1' }, item.api &&
1271
+ React.createElement("div", { className: "tw-flex tw-flex-row" },
1272
+ avatar ?
1273
+ React.createElement("div", { className: "tw-w-10 tw-rounded-full" },
1274
+ React.createElement("img", { className: "tw-rounded-full", src: avatar }))
1275
+ :
1276
+ "",
1277
+ React.createElement("b", { className: "tw-text-xl tw-font-bold ".concat(avatar ? "tw-ml-2 tw-mt-1" : "") }, title ? title : item.name))),
1278
+ React.createElement("div", { className: 'tw-col-span-1' }, (((_c = (_b = item.layer) === null || _b === void 0 ? void 0 : _b.api) === null || _c === void 0 ? void 0 : _c.deleteItem) || ((_e = (_d = item.layer) === null || _d === void 0 ? void 0 : _d.api) === null || _e === void 0 ? void 0 : _e.updateItem)) && (hasUserPermission((_f = item.layer.api) === null || _f === void 0 ? void 0 : _f.collectionName, "delete") || hasUserPermission((_g = item.layer.api) === null || _g === void 0 ? void 0 : _g.collectionName, "update")) &&
435
1279
  React.createElement("div", { className: "tw-dropdown tw-dropdown-bottom" },
436
- 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" },
1280
+ 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" },
437
1281
  React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
438
1282
  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" }))),
439
1283
  React.createElement("ul", { tabIndex: 0, className: "tw-dropdown-content tw-menu tw-p-2 tw-shadow tw-bg-base-100 tw-rounded-box" },
440
- item.api.updateItem && React.createElement("li", null,
441
- React.createElement("a", { className: 'tw-bg-white hover:tw-bg-gray-300 !tw-text-blue-800 hover:tw-text-gray-700', onClick: openEditPopup },
1284
+ item.layer.api.updateItem && hasUserPermission((_h = item.layer.api) === null || _h === void 0 ? void 0 : _h.collectionName, "update") && React.createElement("li", null,
1285
+ React.createElement("a", { className: "!tw-text-base-content", onClick: openEditPopup },
442
1286
  React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
443
1287
  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" })))),
444
- item.api.deleteItem && React.createElement("li", null,
445
- React.createElement("a", { className: 'tw-bg-white hover:tw-bg-gray-300 !tw-text-red-800 hover:tw-text-red-950', onClick: removeItemFromMap },
446
- React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
447
- 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" })))))))));
1288
+ item.layer.api.deleteItem && hasUserPermission((_j = item.layer.api) === null || _j === void 0 ? void 0 : _j.collectionName, "delete") && React.createElement("li", null,
1289
+ React.createElement("a", { className: ' !tw-text-error', onClick: removeItemFromMap }, loading ? React.createElement("span", { className: "tw-loading tw-loading-spinner tw-loading-sm" })
1290
+ :
1291
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
1292
+ 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" })))))))));
448
1293
  }
449
1294
 
450
- function replaceURLs(message) {
451
- if (!message)
452
- return "";
453
- var urlRegex = /(^| )(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,10}(:[0-9]{1,10})?(\/.*)?$/gm;
1295
+ var urlRegex = /(^| )(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,10}(:[0-9]{1,10})?(\/.*)?$/gm;
1296
+ var mailRegex = /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi;
1297
+ function fixUrls(message) {
454
1298
  message = message.replace(urlRegex, function (url) {
455
1299
  var hyperlink = url.replace(' ', '');
456
1300
  if (!hyperlink.match('^https?:\/\/')) {
457
- hyperlink = 'http://' + hyperlink;
1301
+ hyperlink = 'https://' + hyperlink;
458
1302
  }
459
- return '<a href="' + hyperlink + '" target="_blank" rel="noopener noreferrer">' + url + '</a>';
460
- });
461
- var mailRegex = /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi;
462
- message = message.replace(mailRegex, function (mail) {
463
- return '<a href="mailto:' + mail + '">' + mail + '</a>';
464
- });
465
- return message;
466
- }
467
-
468
- function heighlightTags(message, tags) {
469
- if (!message)
470
- return "";
471
- var hashTagRegex = /(^|\B)#(?![0-9_]+\b)([a-zA-Z0-9_]{1,30})(\b|\r)/g;
472
- message = message.replace(hashTagRegex, function (string) {
473
- var tag = tags.find(function (t) { return t.id.toLowerCase() == string.slice(1).toLowerCase(); });
474
- return "<span style=\"background-color: ".concat(tag ? tag.color : '#aaa', ";padding: 0px 5px;border-radius: 7px;cursor: pointer;color:#fff\">") + string + '</span>';
1303
+ return hyperlink;
475
1304
  });
476
1305
  return message;
477
1306
  }
478
1307
 
479
1308
  var TextView = function (_a) {
480
1309
  var item = _a.item;
481
- var all_tags = useTags();
482
- return (React.createElement("p", { style: { whiteSpace: "pre-wrap" }, className: "!tw-m-0 !tw-mb-2", dangerouslySetInnerHTML: { __html: replaceURLs(heighlightTags(item && item.text ? item.text : "", all_tags)) } }));
1310
+ var tags = useTags();
1311
+ useAddTag();
1312
+ var addFilterTag = useAddFilterTag();
1313
+ var replacedText;
1314
+ if (item && item.text)
1315
+ replacedText = fixUrls(item.text);
1316
+ replacedText = reactStringReplace(replacedText, /(https?:\/\/\S+)/g, function (url, i) {
1317
+ var shortUrl = url;
1318
+ if (url.match('^https:\/\/')) {
1319
+ shortUrl = url.split('https://')[1];
1320
+ }
1321
+ if (url.match('^http:\/\/')) {
1322
+ shortUrl = url.split('http://')[1];
1323
+ }
1324
+ return (React.createElement("a", { key: i.toString + item.id + url, href: url, target: "_blank", rel: "noopener noreferrer" }, shortUrl));
1325
+ });
1326
+ replacedText = reactStringReplace(replacedText, mailRegex, function (url, i) {
1327
+ return (React.createElement("a", { key: i.toString + item.id + url, href: "mailto:".concat(url), target: "_blank", rel: "noopener noreferrer" }, url));
1328
+ });
1329
+ replacedText = reactStringReplace(replacedText, hashTagRegex, function (match, i) {
1330
+ var tag = tags.find(function (t) { return t.id.toLowerCase() == match.slice(1).toLowerCase(); });
1331
+ return (React.createElement("a", { style: { color: tag ? tag.color : '#aaa', fontWeight: 'bold', cursor: 'pointer' }, key: tag ? tag.id + item.id + i : i, onClick: function () {
1332
+ addFilterTag(tag);
1333
+ // map.fitBounds(items)
1334
+ // map.closePopup();
1335
+ } }, match));
1336
+ });
1337
+ return (React.createElement("p", { style: { whiteSpace: "pre-wrap" }, className: "!tw-m-0 !tw-mb-2" }, replacedText));
483
1338
  };
484
1339
 
485
- var ItemViewPopup = function (props) {
486
- props.item;
487
- return (React.createElement(Popup, { maxHeight: 377, minWidth: 275, maxWidth: 275, autoPanPadding: [20, 5] },
488
- React.createElement("div", null,
489
- React.createElement(HeaderView, { item: props.item, setItemFormPopup: props.setItemFormPopup }),
1340
+ var AssetContext = createContext({
1341
+ api: {},
1342
+ setAssetsApi: function () { }
1343
+ });
1344
+ function useAssetsManager() {
1345
+ var _a = useState({}), api = _a[0], setApi = _a[1];
1346
+ var setAssetsApi = useCallback(function (api) {
1347
+ setApi(api);
1348
+ }, []);
1349
+ return { api: api, setAssetsApi: setAssetsApi };
1350
+ }
1351
+ var AssetsProvider = function (_a) {
1352
+ var children = _a.children;
1353
+ return (React.createElement(AssetContext.Provider, { value: useAssetsManager() }, children));
1354
+ };
1355
+ var useAssetApi = function () {
1356
+ var api = useContext(AssetContext).api;
1357
+ return api;
1358
+ };
1359
+ var useSetAssetApi = function () {
1360
+ var setAssetsApi = useContext(AssetContext).setAssetsApi;
1361
+ return setAssetsApi;
1362
+ };
1363
+
1364
+ function getValue(obj, path) {
1365
+ if (obj) {
1366
+ for (var i = 0, path = path.split('.'), len = path.length; i < len; i++) {
1367
+ obj = obj[path[i]];
1368
+ }
1369
+ return obj;
1370
+ }
1371
+ }
1372
+ var ItemViewPopup = React.forwardRef(function (props, ref) {
1373
+ var assetsApi = useAssetApi();
1374
+ return (React.createElement(Popup, { ref: ref, maxHeight: 377, minWidth: 275, maxWidth: 275, autoPanPadding: [20, 80] },
1375
+ React.createElement("div", { className: 'tw-bg-base-100 tw-text-base-content' },
1376
+ React.createElement(HeaderView, { item: props.item, title: props.itemTitleField && props.item ? getValue(props.item, props.itemTitleField) : undefined, avatar: props.itemAvatarField && props.item ? assetsApi.url + getValue(props.item, props.itemAvatarField) : undefined, setItemFormPopup: props.setItemFormPopup }),
490
1377
  React.createElement("div", { className: 'tw-overflow-y-auto tw-max-h-72' }, props.children ?
491
1378
  React.Children.toArray(props.children).map(function (child) {
492
1379
  return React.isValidElement(child) ?
@@ -494,7 +1381,7 @@ var ItemViewPopup = function (props) {
494
1381
  })
495
1382
  :
496
1383
  React.createElement(TextView, { item: props.item })))));
497
- };
1384
+ });
498
1385
 
499
1386
  var Geometry = /** @class */ (function () {
500
1387
  function Geometry(lng, lat) {
@@ -506,33 +1393,93 @@ var Geometry = /** @class */ (function () {
506
1393
 
507
1394
  function TextAreaInput(_a) {
508
1395
  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;
1396
+ var ref = useRef(null);
1397
+ // prevent react18 from calling useEffect twice
1398
+ var init = useRef(false);
1399
+ var tags = useTags();
1400
+ var values = [];
1401
+ tags.map(function (tag) {
1402
+ values.push({ key: tag.id, value: tag.id, color: tag.color });
1403
+ });
1404
+ var tribute = new Tribute({
1405
+ containerClass: 'tw-z-500 tw-bg-white tw-p-2 tw-rounded-lg tw-shadow',
1406
+ selectClass: 'tw-font-bold',
1407
+ trigger: "#",
1408
+ values: values,
1409
+ noMatchTemplate: function () {
1410
+ return "";
1411
+ },
1412
+ menuItemTemplate: function (item) {
1413
+ return "<span style=\"color: ".concat(item.original.color, "; padding: 5px; boarder-radius: 3px;\">#").concat(item.string, "</span>");
1414
+ }
1415
+ });
1416
+ useEffect(function () {
1417
+ if (!init.current) {
1418
+ if (ref.current) {
1419
+ tribute.attach(ref.current);
1420
+ }
1421
+ init.current = true;
1422
+ }
1423
+ }, [ref]);
509
1424
  return (React.createElement("div", { className: "tw-form-control tw-w-full ".concat(containerStyle ? containerStyle : "") },
510
1425
  labelTitle ? React.createElement("label", { className: "tw-label" },
511
1426
  React.createElement("span", { className: "tw-label-text tw-text-base-content " + labelStyle }, labelTitle)) : "",
512
- React.createElement("textarea", { 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); } })));
1427
+ 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); } })));
513
1428
  }
514
1429
 
515
- function TextInput(_a) {
516
- 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;
517
- return (React.createElement("div", { className: "tw-form-control tw-w-full ".concat(containerStyle) },
518
- labelTitle ? React.createElement("label", { className: "tw-label" },
519
- React.createElement("span", { className: "tw-label-text tw-text-base-content " + labelStyle }, labelTitle))
520
- : " ",
521
- React.createElement("input", { 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 : "") })));
522
- }
1430
+ var randomColor = function () {
1431
+ return hsvToHex((Math.random() + golden_ratio_conjugate) % 1, 0.8, 0.7);
1432
+ };
1433
+ var golden_ratio_conjugate = 0.618033988749895;
1434
+ function hsvToHex(h, s, v) {
1435
+ var r, g, b;
1436
+ var i = (Math.floor(h * 6));
1437
+ var f = h * 6 - i;
1438
+ var p = v * (1 - s);
1439
+ var q = v * (1 - f * s);
1440
+ var t = v * (1 - (1 - f) * s);
1441
+ switch (i % 6) {
1442
+ case 0:
1443
+ r = v, g = t, b = p;
1444
+ break;
1445
+ case 1:
1446
+ r = q, g = v, b = p;
1447
+ break;
1448
+ case 2:
1449
+ r = p, g = v, b = t;
1450
+ break;
1451
+ case 3:
1452
+ r = p, g = q, b = v;
1453
+ break;
1454
+ case 4:
1455
+ r = t, g = p, b = v;
1456
+ break;
1457
+ case 5:
1458
+ r = v, g = p, b = q;
1459
+ break;
1460
+ }
1461
+ return rgbToHex(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255));
1462
+ }
1463
+ var rgbToHex = function (r, g, b) { return '#' + [r, g, b].map(function (x) {
1464
+ var hex = x.toString(16);
1465
+ return hex.length === 1 ? '0' + hex : hex;
1466
+ }).join(''); };
523
1467
 
524
1468
  function ItemFormPopup(props) {
525
1469
  var _this = this;
526
- var formRef = useRef(null);
527
1470
  var _a = useState(false), spinner = _a[0], setSpinner = _a[1];
1471
+ var formRef = useRef(null);
528
1472
  var map = useMap();
529
1473
  var addItem = useAddItem();
530
1474
  var updateItem = useUpdateItem();
1475
+ var tags = useTags();
1476
+ var addTag = useAddTag();
1477
+ var resetFilterTags = useResetFilterTags();
531
1478
  var handleSubmit = function (evt) { return __awaiter(_this, void 0, void 0, function () {
532
- var formItem;
533
- var _a, _b;
534
- return __generator(this, function (_c) {
535
- switch (_c.label) {
1479
+ var formItem, success, error_1, success, error_2;
1480
+ var _a, _b, _c;
1481
+ return __generator(this, function (_d) {
1482
+ switch (_d.label) {
536
1483
  case 0:
537
1484
  formItem = {};
538
1485
  Array.from(evt.target).forEach(function (input) {
@@ -543,33 +1490,57 @@ function ItemFormPopup(props) {
543
1490
  formItem['position'] = new Geometry(props.position.lng, props.position.lat);
544
1491
  evt.preventDefault();
545
1492
  setSpinner(true);
546
- if (!props.item) return [3 /*break*/, 3];
547
- formItem['id'] = props.item.id;
548
- return [4 /*yield*/, ((_a = props.api) === null || _a === void 0 ? void 0 : _a.updateItem(formItem))];
1493
+ (_a = formItem.text.toLocaleLowerCase().match(hashTagRegex)) === null || _a === void 0 ? void 0 : _a.map(function (tag) {
1494
+ if (!tags.find(function (t) { return t.id.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase(); })) {
1495
+ addTag({ id: tag.slice(1).toLocaleLowerCase(), color: randomColor() });
1496
+ }
1497
+ });
1498
+ if (!props.item) return [3 /*break*/, 5];
1499
+ success = false;
1500
+ _d.label = 1;
549
1501
  case 1:
550
- _c.sent();
551
- formItem['api'] = props.api;
552
- formItem['layer'] = props.layer;
553
- return [4 /*yield*/, updateItem(formItem)];
1502
+ _d.trys.push([1, 3, , 4]);
1503
+ return [4 /*yield*/, ((_b = props.layer.api) === null || _b === void 0 ? void 0 : _b.updateItem(__assign(__assign({}, formItem), { id: props.item.id })))];
554
1504
  case 2:
555
- _c.sent();
556
- setSpinner(false);
557
- map.closePopup();
558
- return [3 /*break*/, 6];
1505
+ _d.sent();
1506
+ success = true;
1507
+ return [3 /*break*/, 4];
559
1508
  case 3:
560
- formItem['id'] = crypto.randomUUID();
561
- return [4 /*yield*/, ((_b = props.api) === null || _b === void 0 ? void 0 : _b.createItem(formItem))];
1509
+ error_1 = _d.sent();
1510
+ toast.error(error_1.toString());
1511
+ return [3 /*break*/, 4];
562
1512
  case 4:
563
- _c.sent();
564
- formItem['api'] = props.api;
565
- formItem['layer'] = props.layer;
566
- return [4 /*yield*/, addItem(formItem)];
567
- case 5:
568
- _c.sent();
1513
+ if (success) {
1514
+ updateItem(__assign(__assign({}, props.item), formItem));
1515
+ toast.success("Item updated");
1516
+ }
569
1517
  setSpinner(false);
570
1518
  map.closePopup();
571
- _c.label = 6;
1519
+ return [3 /*break*/, 10];
1520
+ case 5:
1521
+ success = false;
1522
+ _d.label = 6;
572
1523
  case 6:
1524
+ _d.trys.push([6, 8, , 9]);
1525
+ return [4 /*yield*/, ((_c = props.layer.api) === null || _c === void 0 ? void 0 : _c.createItem(__assign(__assign({}, formItem), { id: crypto.randomUUID() })))];
1526
+ case 7:
1527
+ _d.sent();
1528
+ success = true;
1529
+ return [3 /*break*/, 9];
1530
+ case 8:
1531
+ error_2 = _d.sent();
1532
+ toast.error(error_2.toString());
1533
+ return [3 /*break*/, 9];
1534
+ case 9:
1535
+ if (success) {
1536
+ addItem(__assign(__assign({}, formItem), { id: crypto.randomUUID(), layer: props.layer }));
1537
+ toast.success("New item created");
1538
+ resetFilterTags();
1539
+ }
1540
+ setSpinner(false);
1541
+ map.closePopup();
1542
+ _d.label = 10;
1543
+ case 10:
573
1544
  props.setItemFormPopup(null);
574
1545
  return [2 /*return*/];
575
1546
  }
@@ -583,15 +1554,15 @@ function ItemFormPopup(props) {
583
1554
  useEffect(function () {
584
1555
  resetPopup();
585
1556
  }, [props.position]);
586
- return (React.createElement(Popup, { minWidth: 275, maxWidth: 275, autoPanPadding: [20, 5], eventHandlers: {
1557
+ return (React.createElement(Popup, { minWidth: 275, maxWidth: 275, autoPanPadding: [20, 80], eventHandlers: {
587
1558
  remove: function () {
588
1559
  setTimeout(function () {
589
1560
  resetPopup();
590
1561
  }, 100);
591
1562
  }
592
1563
  }, position: props.position },
593
- React.createElement("form", { ref: formRef, onReset: resetPopup, onSubmit: function (e) { return handleSubmit(e); } },
594
- props.item ? React.createElement("div", { className: 'tw-h-2' })
1564
+ React.createElement("form", { ref: formRef, onReset: resetPopup, autoComplete: 'off', onSubmit: function (e) { return handleSubmit(e); } },
1565
+ props.item ? React.createElement("div", { className: 'tw-h-3' })
595
1566
  :
596
1567
  React.createElement("div", { className: 'tw-flex tw-justify-center' },
597
1568
  React.createElement("b", { className: "tw-text-xl tw-font-bold" },
@@ -601,103 +1572,147 @@ function ItemFormPopup(props) {
601
1572
  props.children ?
602
1573
  React.Children.toArray(props.children).map(function (child) {
603
1574
  return React.isValidElement(child) ?
604
- React.cloneElement(child, { item: props.item }) : "";
1575
+ React.cloneElement(child, { item: props.item, key: props.position.toString() }) : "";
605
1576
  })
606
1577
  :
607
1578
  React.createElement(React.Fragment, null,
608
- React.createElement(TextAreaInput, { placeholder: "Text", dataField: "text", defaultValue: props.item ? props.item.text : "", inputStyle: 'tw-h-40 tw-mt-5' })),
1579
+ React.createElement(TextAreaInput, { key: props.position.toString(), placeholder: "Text", dataField: "text", defaultValue: props.item ? props.item.text : "", inputStyle: 'tw-h-40 tw-mt-5' })),
609
1580
  React.createElement("div", { className: 'tw-flex tw-justify-center' },
610
1581
  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')))));
611
1582
  }
612
1583
 
613
1584
  var Layer = function (props) {
614
- var _a;
615
- var _b = useState(null); _b[0]; var setItemFormPopup = _b[1];
616
- var tags = useTags();
617
- // create a JS-Map with all Tags
618
- var tagMap = new Map(tags === null || tags === void 0 ? void 0 : tags.map(function (key) { return [key.id, key]; }));
619
- // returns all tags for passed item
620
- var getTags = function (item) {
621
- var regex = /(^|\B)#(?![0-9_]+\b)([a-zA-Z0-9_]{1,30})(\b|\r)/g;
622
- var strings = item.text.toLocaleLowerCase().match(regex);
623
- var tags = [];
624
- strings === null || strings === void 0 ? void 0 : strings.map(function (tag) {
625
- if (tagMap.has(tag.slice(1))) {
626
- tags.push(tagMap.get(tag.slice(1)));
627
- }
628
- });
629
- return tags;
630
- };
1585
+ var _a, _b;
1586
+ var _c = useState(null); _c[0]; var setItemFormPopup = _c[1];
1587
+ var filterTags = useFilterTags();
631
1588
  var items = useItems();
632
- var addItem = useAddItem();
633
- var addLayer = useAddLayer();
634
- var resetItems = useResetItems();
1589
+ var setItemsApi = useSetItemsApi();
1590
+ var setItemsData = useSetItemsData();
1591
+ var getItemTags = useGetItemTags();
1592
+ var addMarker = useAddMarker();
1593
+ var addPopup = useAddPopup();
1594
+ var leafletRefs = useLeafletRefs();
1595
+ var location = useLocation();
1596
+ var searchPhrase = useSearchPhrase();
1597
+ var map = useMap();
1598
+ var isLayerVisible = useIsLayerVisible();
635
1599
  useEffect(function () {
636
- var _a, _b;
637
- resetItems(props);
638
- (_a = props.data) === null || _a === void 0 ? void 0 : _a.map(function (item) {
639
- if (item.position) {
640
- item.layer = props;
641
- addItem(item);
1600
+ props.data && setItemsData(props);
1601
+ props.api && setItemsApi(props);
1602
+ }, [props.data, props.api]);
1603
+ useMapEvents({
1604
+ popupopen: function (e) {
1605
+ var _a, _b;
1606
+ var item = (_a = Object.entries(leafletRefs).find(function (r) { return r[1].popup == e.popup; })) === null || _a === void 0 ? void 0 : _a[1].item;
1607
+ 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) {
1608
+ window.history.pushState({}, "", "/".concat(props.name, "/").concat(item.id));
1609
+ document.title = document.title.split("-")[0] + " - " + item.name;
642
1610
  }
643
- });
644
- (_b = props.api) === null || _b === void 0 ? void 0 : _b.getItems().then(function (result) {
645
- if (result) {
646
- result.map(function (item) {
647
- if (item.position) {
648
- addItem((__assign({ layer: props, api: props.api }, item)));
1611
+ },
1612
+ });
1613
+ var openPopup = function () {
1614
+ var _a, _b, _c, _d, _e, _f;
1615
+ if (window.location.pathname.split("/").length <= 2 || window.location.pathname.split("/")[2] === "") {
1616
+ map.closePopup();
1617
+ }
1618
+ else {
1619
+ if (window.location.pathname.split("/")[1] == props.name) {
1620
+ if (window.location.pathname.split("/")[2]) {
1621
+ var id = window.location.pathname.split("/")[2];
1622
+ var marker_1 = (_a = leafletRefs[id]) === null || _a === void 0 ? void 0 : _a.marker;
1623
+ if (marker_1 && marker_1 != null) {
1624
+ 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 () {
1625
+ marker_1.openPopup();
1626
+ }));
1627
+ var item = (_d = leafletRefs[id]) === null || _d === void 0 ? void 0 : _d.item;
1628
+ document.title = document.title.split("-")[0] + " - " + item.name;
1629
+ (_e = document.querySelector('meta[property="og:title"]')) === null || _e === void 0 ? void 0 : _e.setAttribute("content", item.name);
1630
+ (_f = document.querySelector('meta[property="og:description"]')) === null || _f === void 0 ? void 0 : _f.setAttribute("content", item.text);
649
1631
  }
650
- });
1632
+ }
651
1633
  }
652
- });
653
- if (props.api || props.api) {
654
- addLayer(props);
655
1634
  }
656
- }, [props.data, props.api]);
1635
+ };
1636
+ useEffect(function () {
1637
+ openPopup();
1638
+ }, [leafletRefs, location]);
657
1639
  return (React.createElement(React.Fragment, null,
658
1640
  items &&
659
- ((_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) {
660
- var tags = getTags(place);
1641
+ ((_b = (_a = items.
1642
+ filter(function (item) { return item.text; }).
1643
+ 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) {
1644
+ return filterTags.length == 0 ? item : filterTags.every(function (tag) { return getItemTags(item).some(function (filterTag) { return filterTag.id === tag.id; }); });
1645
+ })) === null || _b === void 0 ? void 0 : _b.filter(function (item) {
1646
+ var _a, _b;
1647
+ return searchPhrase === ''
1648
+ ? item :
1649
+ ((_a = item.name) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(searchPhrase.toLowerCase())) || ((_b = item.text) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes(searchPhrase.toLowerCase()));
1650
+ }).filter(function (item) { return item.layer && isLayerVisible(item.layer); }).map(function (item) {
1651
+ var tags = getItemTags(item);
661
1652
  var color1 = "#666";
662
1653
  var color2 = "RGBA(35, 31, 32, 0.2)";
663
- if (tags[0]) {
1654
+ if (tags && tags[0]) {
664
1655
  color1 = tags[0].color;
665
1656
  }
666
- if (tags[1]) {
1657
+ if (tags && tags[1]) {
667
1658
  color2 = tags[1].color;
668
1659
  }
669
- return (React.createElement(Marker, { icon: MarkerIconFactory(props.markerShape, color1, color2, props.markerIcon), key: place.id, position: [place.position.coordinates[1], place.position.coordinates[0]] }, (props.children && React.Children.toArray(props.children).some(function (e) { return React.isValidElement(e) && typeof e.type !== "string" && e.type.name === "ItemView"; }) ?
670
- React.Children.toArray(props.children).map(function (child) {
671
- return React.isValidElement(child) && typeof child.type !== "string" && child.type.name === "ItemView" ?
672
- React.createElement(ItemViewPopup, { key: place.id, item: place, setItemFormPopup: props.setItemFormPopup }, child)
673
- : "";
674
- })
675
- :
676
- React.createElement(React.Fragment, null,
677
- React.createElement(ItemViewPopup, { item: place, setItemFormPopup: props.setItemFormPopup })))));
1660
+ return (React.createElement(Marker, { ref: function (r) {
1661
+ if (!(item.id in leafletRefs))
1662
+ r && addMarker(item, r);
1663
+ }, icon: MarkerIconFactory(props.markerShape, color1, color2, props.markerIcon), key: item.id, position: [item.position.coordinates[1], item.position.coordinates[0]] },
1664
+ (props.children && React.Children.toArray(props.children).some(function (child) { return React.isValidElement(child) && child.props.__TYPE === "ItemView"; }) ?
1665
+ React.Children.toArray(props.children).map(function (child) {
1666
+ return React.isValidElement(child) && child.props.__TYPE === "ItemView" ?
1667
+ React.createElement(ItemViewPopup, { ref: function (r) {
1668
+ if (!(item.id in leafletRefs))
1669
+ r && addPopup(item, r);
1670
+ }, key: item.id + item.name, itemTitleField: props.itemTitleField, itemAvatarField: props.itemAvatarField, item: item, setItemFormPopup: props.setItemFormPopup }, child)
1671
+ : "";
1672
+ })
1673
+ :
1674
+ React.createElement(React.Fragment, null,
1675
+ React.createElement(ItemViewPopup, { key: item.id + item.name, ref: function (r) {
1676
+ if (!(item.id in leafletRefs))
1677
+ r && addPopup(item, r);
1678
+ }, item: item, itemTitleField: props.itemTitleField, itemAvatarField: props.itemAvatarField, setItemFormPopup: props.setItemFormPopup }))),
1679
+ React.createElement(Tooltip, { offset: [0, -38], direction: 'top' }, item.name)));
678
1680
  })),
679
1681
  props.itemFormPopup && props.itemFormPopup.layer.name == props.name &&
680
- (props.children && React.Children.toArray(props.children).some(function (e) { return React.isValidElement(e) && typeof e.type !== "string" && e.type.name === "ItemForm"; }) ?
1682
+ (props.children && React.Children.toArray(props.children).some(function (child) { return React.isValidElement(child) && child.props.__TYPE === "ItemForm"; }) ?
681
1683
  React.Children.toArray(props.children).map(function (child) {
682
1684
  var _a;
683
- return React.isValidElement(child) && typeof child.type !== "string" && child.type.name === "ItemForm" ?
684
- 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, api: props.api }, child)
1685
+ return React.isValidElement(child) && child.props.__TYPE === "ItemForm" ?
1686
+ 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)
685
1687
  : "";
686
1688
  })
687
1689
  :
688
1690
  React.createElement(React.Fragment, null,
689
- React.createElement(ItemFormPopup, { position: props.itemFormPopup.position, layer: props.itemFormPopup.layer, setItemFormPopup: setItemFormPopup, item: props.itemFormPopup.item, api: props.api })))));
1691
+ React.createElement(ItemFormPopup, { position: props.itemFormPopup.position, layer: props.itemFormPopup.layer, setItemFormPopup: setItemFormPopup, item: props.itemFormPopup.item })))));
690
1692
  };
691
1693
 
692
1694
  function Tags(_a) {
693
- var data = _a.data;
694
- var addTag = useAddTag();
1695
+ var data = _a.data, api = _a.api;
1696
+ var setTagData = useSetTagData();
1697
+ var setTagApi = useSetTagApi();
695
1698
  useEffect(function () {
696
- data.map(function (tag) {
697
- tag.id = tag.id.toLocaleLowerCase();
698
- addTag(tag);
699
- });
700
- }, [addTag, data]);
1699
+ data && setTagData(data);
1700
+ api && setTagApi(api);
1701
+ }, [api, data]);
1702
+ return (React.createElement(React.Fragment, null));
1703
+ }
1704
+
1705
+ function Permissions(_a) {
1706
+ var data = _a.data, api = _a.api, adminRole = _a.adminRole;
1707
+ var setPermissionData = useSetPermissionData();
1708
+ var setPermissionApi = useSetPermissionApi();
1709
+ var setAdminRole = useSetAdminRole();
1710
+ var user = useAuth().user;
1711
+ useEffect(function () {
1712
+ adminRole && setAdminRole(adminRole);
1713
+ data && setPermissionData(data);
1714
+ api && setPermissionApi(api);
1715
+ }, [api, data, adminRole, user]);
701
1716
  return (React.createElement(React.Fragment, null));
702
1717
  }
703
1718
 
@@ -708,6 +1723,13 @@ var ItemForm = function (_a) {
708
1723
  return React.isValidElement(child) ?
709
1724
  React.cloneElement(child, { item: item, test: "test" }) : "";
710
1725
  }) : ""));
1726
+ };
1727
+ ItemForm.propTypes = {
1728
+ children: PropTypes.node,
1729
+ __TYPE: PropTypes.string,
1730
+ };
1731
+ ItemForm.defaultProps = {
1732
+ __TYPE: 'ItemForm',
711
1733
  };
712
1734
 
713
1735
  var ItemView = function (_a) {
@@ -715,10 +1737,39 @@ var ItemView = function (_a) {
715
1737
  return (React.createElement("div", null, children ?
716
1738
  React.Children.toArray(children).map(function (child) {
717
1739
  return React.isValidElement(child) ?
718
- React.cloneElement(child, { item: item, test: "test" }) : "";
1740
+ React.cloneElement(child, { item: item }) : "";
719
1741
  }) : ""));
1742
+ };
1743
+ ItemView.propTypes = {
1744
+ children: PropTypes.node,
1745
+ __TYPE: PropTypes.string,
1746
+ };
1747
+ ItemView.defaultProps = {
1748
+ __TYPE: 'ItemView',
720
1749
  };
721
1750
 
1751
+ function SelectBox(props) {
1752
+ var labelTitle = props.labelTitle, labelDescription = props.labelDescription, defaultValue = props.defaultValue, containerStyle = props.containerStyle, placeholder = props.placeholder, labelStyle = props.labelStyle, options = props.options, updateFormValue = props.updateFormValue;
1753
+ var _a = useState(defaultValue || ""), value = _a[0], setValue = _a[1];
1754
+ var updateValue = function (newValue) {
1755
+ updateFormValue(newValue);
1756
+ setValue(newValue);
1757
+ };
1758
+ return (React.createElement("div", { className: "tw-inline-block ".concat(containerStyle) },
1759
+ labelTitle ?
1760
+ React.createElement("label", { className: "tw-label ".concat(labelStyle) },
1761
+ React.createElement("div", { className: "tw-label-text" },
1762
+ labelTitle,
1763
+ labelDescription && React.createElement("div", { className: "tw-tooltip tw-tooltip-right", "data-tip": labelDescription },
1764
+ React.createElement(InformationCircleIcon, { className: 'tw-w-4 tw-h-4' }))))
1765
+ : "",
1766
+ React.createElement("select", { className: "tw-select tw-select-bordered tw-w-full", value: value, onChange: function (e) { return updateValue(e.target.value); } },
1767
+ React.createElement("option", { disabled: true, value: "PLACEHOLDER" }, placeholder),
1768
+ options.map(function (o, k) {
1769
+ return React.createElement("option", { value: o.value || o.name, key: k }, o.name);
1770
+ }))));
1771
+ }
1772
+
722
1773
  var PopupTextAreaInput = function (_a) {
723
1774
  var dataField = _a.dataField, placeholder = _a.placeholder, style = _a.style, item = _a.item;
724
1775
  return (React.createElement(TextAreaInput, { defaultValue: (item === null || item === void 0 ? void 0 : item.text) ? item.text : "", dataField: dataField, placeholder: placeholder, inputStyle: style }));
@@ -727,13 +1778,18 @@ var PopupTextAreaInput = function (_a) {
727
1778
  var PopupStartEndInput = function (_a) {
728
1779
  var item = _a.item;
729
1780
  return (React.createElement("div", { className: 'tw-grid tw-grid-cols-2 tw-gap-2 tw-mb-5' },
730
- 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) : "" }),
731
- 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) : "" })));
1781
+ 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) : "", autocomplete: 'one-time-code' }),
1782
+ 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) : "", autocomplete: 'one-time-code' })));
1783
+ };
1784
+
1785
+ var PopupTextInput = function (_a) {
1786
+ var dataField = _a.dataField, placeholder = _a.placeholder, style = _a.style, item = _a.item;
1787
+ return (React.createElement(TextInput, { defaultValue: (item === null || item === void 0 ? void 0 : item.text) ? item.text : "", dataField: dataField, placeholder: placeholder, inputStyle: style }));
732
1788
  };
733
1789
 
734
1790
  var StartEndView = function (_a) {
735
1791
  var item = _a.item;
736
- return (React.createElement("div", { className: "tw-flex tw-flex-row tw-mb-4 tw-mt-2" },
1792
+ return (React.createElement("div", { className: "tw-flex tw-flex-row tw-mb-4" },
737
1793
  React.createElement("div", { className: "tw-basis-2/5 tw-flex tw-flex-row" },
738
1794
  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 },
739
1795
  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" })),
@@ -769,7 +1825,7 @@ var DialogModal = function (_a) {
769
1825
  document.body.classList.remove("modal-open");
770
1826
  }
771
1827
  }, [isOpened]);
772
- 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) {
1828
+ 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 tw-p-4 tw-max-w-xl', ref: ref, onCancel: onClose, onClick: function (e) {
773
1829
  return ref.current && !isClickInsideRectangle(e, ref.current) && onClose();
774
1830
  } },
775
1831
  React.createElement("div", { className: "tw-card-body tw-p-2" },
@@ -780,13 +1836,14 @@ var DialogModal = function (_a) {
780
1836
 
781
1837
  function NavBar(_a) {
782
1838
  var _this = this;
783
- var appName = _a.appName, useAuth = _a.useAuth;
784
- var _b = useState(false), signupOpen = _b[0], setSignupOpen = _b[1];
785
- var _c = useState(false), loginOpen = _c[0], setLoginOpen = _c[1];
786
- var _d = useState(""), email = _d[0], setEmail = _d[1];
787
- var _e = useState(""), userName = _e[0], setUserName = _e[1];
788
- var _f = useState(""), password = _f[0], setPassword = _f[1];
789
- var _g = useAuth(), isAuthenticated = _g.isAuthenticated, user = _g.user, login = _g.login, register = _g.register, loading = _g.loading, logout = _g.logout, token = _g.token;
1839
+ var appName = _a.appName, _b = _a.nameWidth, nameWidth = _b === void 0 ? 200 : _b;
1840
+ var _c = useState(false), signupOpen = _c[0], setSignupOpen = _c[1];
1841
+ var _d = useState(false), loginOpen = _d[0], setLoginOpen = _d[1];
1842
+ var _e = useState(""), email = _e[0], setEmail = _e[1];
1843
+ var _f = useState(""), userName = _f[0], setUserName = _f[1];
1844
+ var _g = useState(""), password = _g[0], setPassword = _g[1];
1845
+ var _h = useAuth(), isAuthenticated = _h.isAuthenticated, user = _h.user, login = _h.login, register = _h.register, loading = _h.loading, logout = _h.logout, token = _h.token;
1846
+ var navigate = useNavigate();
790
1847
  var onRegister = function () { return __awaiter(_this, void 0, void 0, function () {
791
1848
  return __generator(this, function (_a) {
792
1849
  switch (_a.label) {
@@ -794,13 +1851,19 @@ function NavBar(_a) {
794
1851
  success: {
795
1852
  render: function (_a) {
796
1853
  var data = _a.data;
1854
+ navigate("/");
797
1855
  return "Hi ".concat(data === null || data === void 0 ? void 0 : data.first_name);
798
1856
  },
799
1857
  // other options
800
1858
  icon: "✌️",
801
1859
  },
802
- error: 'Error',
803
- pending: '123 ...'
1860
+ error: {
1861
+ render: function (_a) {
1862
+ var data = _a.data;
1863
+ return "".concat(data);
1864
+ },
1865
+ },
1866
+ pending: 'creating new user ...'
804
1867
  })];
805
1868
  case 1:
806
1869
  _a.sent();
@@ -816,13 +1879,19 @@ function NavBar(_a) {
816
1879
  success: {
817
1880
  render: function (_a) {
818
1881
  var data = _a.data;
1882
+ navigate("/");
819
1883
  return "Hi ".concat(data === null || data === void 0 ? void 0 : data.first_name);
820
1884
  },
821
1885
  // other options
822
1886
  icon: "✌️",
823
1887
  },
824
- error: 'Error',
825
- pending: '123 ...'
1888
+ error: {
1889
+ render: function (_a) {
1890
+ var data = _a.data;
1891
+ return "".concat(data);
1892
+ },
1893
+ },
1894
+ pending: 'logging in ...'
826
1895
  })];
827
1896
  case 1:
828
1897
  _a.sent();
@@ -840,32 +1909,37 @@ function NavBar(_a) {
840
1909
  // other options
841
1910
  icon: "👋",
842
1911
  },
843
- error: 'Error',
844
- pending: '123 ...'
1912
+ error: {
1913
+ render: function (_a) {
1914
+ var data = _a.data;
1915
+ return "".concat(data);
1916
+ },
1917
+ },
1918
+ pending: 'logging out ..'
845
1919
  });
846
1920
  };
847
1921
  return (React.createElement(React.Fragment, null,
848
- React.createElement("div", { className: "tw-navbar tw-bg-base-100 tw-z-1000" },
1922
+ React.createElement("div", { className: "tw-navbar tw-bg-base-100 tw-z-1000 tw-shadow-xl tw-relative" },
849
1923
  React.createElement("button", { className: "tw-btn tw-btn-square tw-btn-ghost", "data-te-sidenav-toggle-ref": true, "data-te-target": "#sidenav", "aria-controls": "#sidenav", "aria-haspopup": "true" },
850
1924
  React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", className: "tw-inline-block tw-w-5 tw-h-5 tw-stroke-current" },
851
1925
  React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M4 6h16M4 12h16M4 18h16" }))),
852
1926
  React.createElement("div", { className: "tw-flex-1 tw-mr-2" },
853
- React.createElement("div", { className: "tw-flex-1 tw-truncate tw-grid tw-grid-flow-col tw-max-w-52" },
1927
+ React.createElement("div", { className: "tw-flex-1 tw-truncate tw-grid tw-grid-flow-col", style: { maxWidth: nameWidth } },
854
1928
  React.createElement(Link, { className: "tw-btn tw-btn-ghost tw-px-2 tw-normal-case tw-text-xl tw-flex-1 tw-truncate", to: "/" },
855
- React.createElement("p", { className: "tw-truncate" }, appName)),
1929
+ React.createElement("h1", { className: "tw-truncate" }, appName)),
856
1930
  React.createElement("button", { className: "tw-btn tw-px-2 tw-btn-ghost", onClick: function () { return window.my_modal_3.showModal(); } },
857
1931
  React.createElement(QuestionMarkIcon, { className: "tw-h-5 tw-w-5" })))),
858
1932
  isAuthenticated ?
859
1933
  React.createElement("div", { className: "tw-flex-none" },
860
- user.avatar ? React.createElement("div", { className: "tw-avatar" },
1934
+ (user === null || user === void 0 ? void 0 : user.avatar) ? React.createElement("div", { className: "tw-avatar" },
861
1935
  React.createElement("div", { className: "tw-w-10 tw-rounded-full" },
862
- React.createElement("img", { src: "https://map.api.free-planet-earth.org/assets/" + (user === null || user === void 0 ? void 0 : user.avatar) + "?access_token=" + token }))) : React.createElement(React.Fragment, null),
1936
+ 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),
863
1937
  React.createElement("div", { className: 'tw-ml-2 tw-mr-2' }, user === null || user === void 0 ? void 0 : user.first_name),
864
1938
  React.createElement("div", { className: "tw-dropdown tw-dropdown-end" },
865
1939
  React.createElement("label", { tabIndex: 0, className: "tw-btn tw-btn-ghost tw-btn-square" },
866
1940
  React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
867
1941
  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" }))),
868
- 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-[1500]" },
1942
+ 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]" },
869
1943
  React.createElement("li", null,
870
1944
  React.createElement(Link, { to: "/settings" }, "Settings")),
871
1945
  React.createElement("li", null,
@@ -879,11 +1953,11 @@ function NavBar(_a) {
879
1953
  React.createElement("label", { tabIndex: 1, className: "tw-btn tw-btn-ghost md:tw-hidden" },
880
1954
  React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
881
1955
  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" }))),
882
- React.createElement("ul", { tabIndex: 1, 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-[1500]" },
1956
+ 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]" },
883
1957
  React.createElement("li", null,
884
- React.createElement("a", { onClick: function () { return setLoginOpen(true); } }, "Login")),
1958
+ React.createElement("a", { onClick: function () { setLoginOpen(true); } }, "Login")),
885
1959
  React.createElement("li", null,
886
- React.createElement("a", { onClick: function () { return setSignupOpen(true); } }, "Sign In")))))),
1960
+ React.createElement("a", { onClick: function () { return setSignupOpen(true); } }, "Sign Up")))))),
887
1961
  React.createElement(DialogModal, { title: "Login", isOpened: loginOpen, onClose: function () { return setLoginOpen(false); } },
888
1962
  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" }),
889
1963
  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" }),
@@ -897,12 +1971,24 @@ function NavBar(_a) {
897
1971
  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')))));
898
1972
  }
899
1973
 
1974
+ var SetAssetsApi = function (_a) {
1975
+ var assetsApi = _a.assetsApi;
1976
+ var setAssetsApi = useSetAssetApi();
1977
+ useEffect(function () {
1978
+ setAssetsApi(assetsApi);
1979
+ }, [assetsApi]);
1980
+ return (React.createElement(React.Fragment, null));
1981
+ };
1982
+
900
1983
  function AppShell(_a) {
901
- var appName = _a.appName, useAuth = _a.useAuth, children = _a.children;
1984
+ var appName = _a.appName, nameWidth = _a.nameWidth, children = _a.children, assetsApi = _a.assetsApi;
902
1985
  return (React.createElement(BrowserRouter, null,
903
- React.createElement(ToastContainer, { position: "top-right", autoClose: 2000, hideProgressBar: true, newestOnTop: false, closeOnClick: true, rtl: false, pauseOnFocusLoss: true, draggable: true, pauseOnHover: true, theme: "light" }),
904
- React.createElement(NavBar, { appName: appName, useAuth: useAuth }),
905
- React.createElement("div", { id: "app-content", className: "tw-flex tw-!pl-[77px]" }, children)));
1986
+ React.createElement(AssetsProvider, null,
1987
+ React.createElement(SetAssetsApi, { assetsApi: assetsApi }),
1988
+ React.createElement(QuestsProvider, { initialOpen: true },
1989
+ React.createElement(ToastContainer, { position: "top-right", autoClose: 2000, hideProgressBar: true, newestOnTop: false, closeOnClick: true, rtl: false, pauseOnFocusLoss: true, draggable: true, pauseOnHover: true, theme: "light" }),
1990
+ React.createElement(NavBar, { appName: appName, nameWidth: nameWidth }),
1991
+ React.createElement("div", { id: "app-content", className: "tw-flex tw-!pl-[77px]" }, children)))));
906
1992
  }
907
1993
 
908
1994
  function SidebarSubmenu(_a) {
@@ -933,7 +2019,7 @@ function SidebarSubmenu(_a) {
933
2019
  }
934
2020
 
935
2021
  function SideBar(_a) {
936
- var routes = _a.routes;
2022
+ var routes = _a.routes, bottomRoutes = _a.bottomRoutes;
937
2023
  // prevent react18 from calling useEffect twice
938
2024
  var init = useRef(false);
939
2025
  var location = useLocation();
@@ -952,8 +2038,8 @@ function SideBar(_a) {
952
2038
  init.current = true;
953
2039
  }
954
2040
  }, []);
955
- 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" },
956
- React.createElement("div", { className: 'tw-flex tw-flex-col tw-h-full', style: { height: "calc(100vh - 64px)" } },
2041
+ return (React.createElement("nav", { id: "sidenav", className: "group tw-fixed tw-left-0 tw-mt-16 tw-top-0 tw-z-[1035] tw-h-[calc(100dvh-64px)] tw--translate-x-full tw-overflow-hidden tw-shadow-xl 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" },
2042
+ React.createElement("div", { className: 'tw-flex tw-flex-col tw-h-[calc(100dvh-64px)]' },
957
2043
  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) {
958
2044
  return (React.createElement("li", { className: "", key: k }, route.submenu ?
959
2045
  React.createElement(SidebarSubmenu, __assign({}, route)) :
@@ -968,8 +2054,23 @@ function SideBar(_a) {
968
2054
  React.createElement("span", { className: "group-[&[data-te-sidenav-slim-collapsed='true']]:data-[te-sidenav-slim='false']:tw-hidden", "data-te-sidenav-slim": "false" }, route.name),
969
2055
  location.pathname.includes(route.path) && route.path.length > 1 || location.pathname === route.path ? (React.createElement("span", { className: "tw-absolute tw-inset-y-0 tw-left-0 tw-w-1 tw-rounded-tr-md tw-rounded-br-md tw-bg-primary ", "aria-hidden": "true" })) : null))));
970
2056
  })),
971
- React.createElement("div", { id: "slim-toggler", className: 'tw-w-full tw-pr-4 tw-flex-1 tw-grid tw-place-items-end', "aria-haspopup": "true" },
972
- React.createElement(ChevronRightIcon, { className: "tw-w-5 tw-h-5 tw-mb-4 tw-cursor-pointer tw-float-right tw-delay-400 tw-duration-500 tw-transition-all " + (!slim ? "tw-rotate-180" : ''), onClick: function () { return toggleSlim(); } })))));
2057
+ React.createElement("div", { id: "slim-toggler", className: 'tw-w-full tw-flex-1 tw-grid tw-place-items-end', "aria-haspopup": "true" },
2058
+ React.createElement("div", { className: 'tw-w-full' },
2059
+ React.createElement("ul", { className: "tw-menu tw-w-full tw-bg-base-100 tw-text-base-content tw-p-0 tw-mb-0", "data-te-sidenav-menu-ref": true }, bottomRoutes === null || bottomRoutes === void 0 ? void 0 : bottomRoutes.map(function (route, k) {
2060
+ return (React.createElement("li", { className: "", key: k }, route.submenu ?
2061
+ React.createElement(SidebarSubmenu, __assign({}, route)) :
2062
+ (React.createElement(NavLink, { end: true, target: route.blank ? "_blank" : "_self", to: route.path, className: function (_a) {
2063
+ var isActive = _a.isActive;
2064
+ return "".concat(isActive ? 'tw-font-semibold tw-bg-base-200 !tw-rounded-none' : 'tw-font-normal !tw-rounded-none');
2065
+ }, onClick: function () {
2066
+ if (screen.width < 640 && !slim)
2067
+ instance.toggle();
2068
+ } },
2069
+ route.icon,
2070
+ React.createElement("span", { className: "group-[&[data-te-sidenav-slim-collapsed='true']]:data-[te-sidenav-slim='false']:tw-hidden", "data-te-sidenav-slim": "false" }, route.name),
2071
+ location.pathname.includes(route.path) && route.path.length > 1 || location.pathname === route.path ? (React.createElement("span", { className: "tw-absolute tw-inset-y-0 tw-left-0 tw-w-1 tw-rounded-tr-md tw-rounded-br-md tw-bg-primary ", "aria-hidden": "true" })) : null))));
2072
+ })),
2073
+ React.createElement(ChevronRightIcon, { className: "tw-w-5 tw-h-5 tw-mb-4 tw-mr-4 tw-cursor-pointer tw-float-right tw-delay-400 tw-duration-500 tw-transition-all " + (!slim ? "tw-rotate-180" : ''), onClick: function () { return toggleSlim(); } }))))));
973
2074
  }
974
2075
 
975
2076
  function Content(_a) {
@@ -977,416 +2078,293 @@ function Content(_a) {
977
2078
  return (React.createElement("div", { className: 'tw-flex tw-flex-col tw-w-full tw-relative' }, children));
978
2079
  }
979
2080
 
980
- var AuthContext = createContext({
981
- isAuthenticated: false,
982
- user: null,
983
- login: function () { return Promise.reject(); },
984
- register: function () { return Promise.reject(); },
985
- loading: false,
986
- logout: function () { },
987
- updateUser: function () { return Promise.reject(); },
988
- token: ""
989
- });
990
- var AuthProvider = function (_a) {
991
- var userApi = _a.userApi, children = _a.children;
992
- var _b = useState(null), user = _b[0], setUser = _b[1];
993
- var _c = useState(null), token = _c[0], setToken = _c[1];
994
- var _d = useState(false), loading = _d[0], setLoading = _d[1];
995
- var isAuthenticated = !!user;
996
- useEffect(function () {
997
- setLoading(true);
998
- loadUser();
999
- setLoading(false);
1000
- }, []);
1001
- function loadUser() {
1002
- return __awaiter(this, void 0, void 0, function () {
1003
- var token_1, me;
1004
- return __generator(this, function (_a) {
1005
- switch (_a.label) {
1006
- case 0:
1007
- _a.trys.push([0, 5, , 6]);
1008
- return [4 /*yield*/, userApi.getToken()];
1009
- case 1:
1010
- token_1 = _a.sent();
1011
- setToken(token_1);
1012
- if (!token_1) return [3 /*break*/, 3];
1013
- return [4 /*yield*/, userApi.getUser()];
1014
- case 2:
1015
- me = _a.sent();
1016
- setUser(me);
1017
- setLoading(false);
1018
- return [2 /*return*/, me];
1019
- case 3: return [2 /*return*/, undefined];
1020
- case 4: return [3 /*break*/, 6];
1021
- case 5:
1022
- _a.sent();
1023
- setLoading(false);
1024
- return [2 /*return*/, undefined];
1025
- case 6: return [2 /*return*/];
1026
- }
1027
- });
1028
- });
1029
- }
1030
- var login = function (credentials) { return __awaiter(void 0, void 0, void 0, function () {
1031
- var res, error_2;
1032
- return __generator(this, function (_a) {
1033
- switch (_a.label) {
1034
- case 0:
1035
- setLoading(true);
1036
- _a.label = 1;
1037
- case 1:
1038
- _a.trys.push([1, 4, , 5]);
1039
- return [4 /*yield*/, userApi.login(credentials.email, credentials.password)];
1040
- case 2:
1041
- res = _a.sent();
1042
- setToken(res.access_token);
1043
- return [4 /*yield*/, loadUser()];
1044
- case 3: return [2 /*return*/, (_a.sent())];
1045
- case 4:
1046
- error_2 = _a.sent();
1047
- setLoading(false);
1048
- console.log(error_2.response.data.error[0]);
1049
- return [2 /*return*/, error_2.response.data.error[0]];
1050
- case 5:
1051
- return [2 /*return*/];
1052
- }
1053
- });
1054
- }); };
1055
- var register = function (credentials, userName) { return __awaiter(void 0, void 0, void 0, function () {
1056
- var error_3;
1057
- return __generator(this, function (_a) {
1058
- switch (_a.label) {
1059
- case 0:
1060
- setLoading(true);
1061
- _a.label = 1;
1062
- case 1:
1063
- _a.trys.push([1, 4, , 5]);
1064
- return [4 /*yield*/, userApi.register(credentials.email, credentials.password, userName)];
1065
- case 2:
1066
- _a.sent();
1067
- return [4 /*yield*/, login(credentials)];
1068
- case 3: return [2 /*return*/, (_a.sent())];
1069
- case 4:
1070
- error_3 = _a.sent();
1071
- setLoading(false);
1072
- console.log(error_3);
1073
- return [2 /*return*/, error_3.response.data.error[0]];
1074
- case 5:
1075
- return [2 /*return*/];
1076
- }
1077
- });
1078
- }); };
1079
- var logout = function () { return __awaiter(void 0, void 0, void 0, function () {
1080
- return __generator(this, function (_a) {
1081
- switch (_a.label) {
1082
- case 0: return [4 /*yield*/, userApi.logout()];
1083
- case 1:
1084
- _a.sent();
1085
- setUser(null);
1086
- return [2 /*return*/];
1087
- }
1088
- });
1089
- }); };
1090
- var updateUser = function (user) { return __awaiter(void 0, void 0, void 0, function () {
1091
- var userRest, res, error_4;
1092
- return __generator(this, function (_a) {
1093
- switch (_a.label) {
1094
- case 0:
1095
- setLoading(true);
1096
- user.id, userRest = __rest(user, ["id"]);
1097
- _a.label = 1;
1098
- case 1:
1099
- _a.trys.push([1, 3, , 4]);
1100
- return [4 /*yield*/, userApi.updateUser(userRest)];
1101
- case 2:
1102
- res = _a.sent();
1103
- setUser(res);
1104
- setLoading(false);
1105
- return [2 /*return*/, res];
1106
- case 3:
1107
- error_4 = _a.sent();
1108
- setLoading(false);
1109
- return [2 /*return*/, error_4.response.data.error[0]];
1110
- case 4: return [2 /*return*/];
1111
- }
1112
- });
1113
- }); };
1114
- return (React.createElement(AuthContext.Provider, { value: { isAuthenticated: isAuthenticated, user: user, login: login, register: register, loading: loading, logout: logout, updateUser: updateUser, token: token } }, children));
1115
- };
1116
- var useAuth = function () { return useContext(AuthContext); };
1117
-
1118
- function ErrorText(_a) {
1119
- var styleClass = _a.styleClass, children = _a.children;
1120
- return (React.createElement("p", { className: "tw-text-center tw-text-error ".concat(styleClass) }, children));
1121
- }
1122
-
1123
- function LoginPage() {
1124
- var INITIAL_LOGIN_OBJ = {
1125
- password: "",
1126
- emailId: ""
1127
- };
1128
- var _a = useState(false), loading = _a[0], setLoading = _a[1];
1129
- var _b = useState(""), errorMessage = _b[0], setErrorMessage = _b[1];
1130
- var _c = useState(INITIAL_LOGIN_OBJ), loginObj = _c[0]; _c[1];
1131
- var submitForm = function (e) {
1132
- e.preventDefault();
1133
- setErrorMessage("");
1134
- if (loginObj.emailId.trim() === "")
1135
- return setErrorMessage("Email Id is required! (use any value)");
1136
- if (loginObj.password.trim() === "")
1137
- return setErrorMessage("Password is required! (use any value)");
1138
- else {
1139
- setLoading(true);
1140
- // Call API to check user credentials and save token in localstorage
1141
- localStorage.setItem("token", "DumyTokenHere");
1142
- setLoading(false);
1143
- window.location.href = '/app/welcome';
1144
- }
1145
- };
1146
- var updateFormValue = function (val) {
1147
- console.log(val);
1148
- };
1149
- return (React.createElement("div", { className: "tw-flex-1 tw-bg-base-200 tw-flex tw-items-center" },
1150
- React.createElement("div", { className: "tw-card tw-mx-auto tw-w-full tw-max-w-md tw-shadow-xl" },
1151
- React.createElement("div", { className: "tw-grid md:tw-grid-cols-1 tw-grid-cols-1 tw-bg-base-100 tw-rounded-xl" },
1152
- React.createElement("div", { className: 'tw-py-10 tw-px-10' },
1153
- React.createElement("h2", { className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, "Login"),
1154
- React.createElement("form", { onSubmit: function (e) { return submitForm(e); } },
1155
- React.createElement("div", { className: "tw-mb-4" },
1156
- React.createElement(TextInput, { type: "email", defaultValue: loginObj.emailId, containerStyle: "tw-mt-4", labelTitle: "E-Mail", updateFormValue: function (v) { return updateFormValue(v); } }),
1157
- React.createElement(TextInput, { defaultValue: loginObj.password, type: "password", containerStyle: "tw-mt-4", labelTitle: "Password", updateFormValue: function (v) { return updateFormValue(v); } })),
1158
- React.createElement("div", { className: 'tw-text-right tw-text-primary' },
1159
- React.createElement(Link, { to: "/forgot-password" },
1160
- 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?"))),
1161
- React.createElement(ErrorText, { styleClass: "mt-8" }, errorMessage),
1162
- React.createElement("button", { type: "submit", className: "tw-btn tw-mt-2 tw-w-full tw-btn-primary" + (loading ? " tw-loading" : "") }, "Login"),
1163
- React.createElement("div", { className: 'tw-text-center tw-mt-4' },
1164
- "Don't have an account yet? ",
1165
- React.createElement(Link, { to: "/signup" },
1166
- 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")))))))));
1167
- }
1168
-
1169
- function SignupPage() {
1170
- var INITIAL_REGISTER_OBJ = {
1171
- name: "",
1172
- password: "",
1173
- emailId: ""
1174
- };
1175
- var _a = useState(false), loading = _a[0], setLoading = _a[1];
1176
- var _b = useState(""), errorMessage = _b[0], setErrorMessage = _b[1];
1177
- var _c = useState(INITIAL_REGISTER_OBJ), registerObj = _c[0]; _c[1];
1178
- var submitForm = function (e) {
1179
- e.preventDefault();
1180
- setErrorMessage("");
1181
- if (registerObj.name.trim() === "")
1182
- return setErrorMessage("Name is required! (use any value)");
1183
- if (registerObj.emailId.trim() === "")
1184
- return setErrorMessage("Email Id is required! (use any value)");
1185
- if (registerObj.password.trim() === "")
1186
- return setErrorMessage("Password is required! (use any value)");
1187
- else {
1188
- setLoading(true);
1189
- // Call API to check user credentials and save token in localstorage
1190
- localStorage.setItem("token", "DumyTokenHere");
1191
- setLoading(false);
1192
- window.location.href = '/app/welcome';
1193
- }
1194
- };
1195
- var updateFormValue = function (val) {
1196
- console.log(val);
1197
- };
1198
- return (React.createElement("div", { className: "tw-flex-1 tw-bg-base-200 tw-flex tw-items-center" },
1199
- React.createElement("div", { className: "tw-card tw-mx-auto tw-w-full tw-max-w-md tw-shadow-xl" },
1200
- React.createElement("div", { className: "tw-grid md:tw-grid-cols-1 tw-grid-cols-1 tw-bg-base-100 tw-rounded-xl" },
1201
- React.createElement("div", { className: 'tw-py-10 tw-px-10' },
1202
- React.createElement("h2", { className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, "Sign Up"),
1203
- React.createElement("form", { onSubmit: function (e) { return submitForm(e); } },
1204
- React.createElement("div", { className: "mb-4" },
1205
- React.createElement(TextInput, { defaultValue: registerObj.name, containerStyle: "tw-mt-4", labelTitle: "Name", updateFormValue: updateFormValue }),
1206
- React.createElement(TextInput, { defaultValue: registerObj.emailId, containerStyle: "tw-mt-4", labelTitle: "E-Mail", updateFormValue: updateFormValue }),
1207
- React.createElement(TextInput, { defaultValue: registerObj.password, type: "password", containerStyle: "tw-mt-4", labelTitle: "Password", updateFormValue: updateFormValue })),
1208
- React.createElement(ErrorText, { styleClass: "tw-mt-8" }, errorMessage),
1209
- React.createElement("button", { type: "submit", className: "tw-btn tw-mt-2 tw-w-full tw-btn-primary" + (loading ? " tw-loading" : "") }, "Register"),
1210
- React.createElement("div", { className: 'tw-text-center tw-mt-4' },
1211
- "Already have an account? ",
1212
- React.createElement(Link, { to: "/login" },
1213
- React.createElement("span", { className: " tw-inline-block hover:tw-text-primary hover:tw-underline hover:tw-cursor-pointer tw-transition tw-duration-200" }, "Login")))))))));
1214
- }
1215
-
1216
2081
  function Subtitle(_a) {
1217
2082
  var styleClass = _a.styleClass, children = _a.children;
1218
2083
  return (React.createElement("div", { className: "tw-text-xl tw-font-semibold ".concat(styleClass) }, children));
1219
2084
  }
1220
2085
 
1221
2086
  function TitleCard(_a) {
1222
- var title = _a.title, children = _a.children, topMargin = _a.topMargin, TopSideButtons = _a.TopSideButtons;
1223
- return (React.createElement("div", { className: "tw-card tw-w-full tw-p-6 tw-mb-16 tw-bg-base-100 tw-shadow-xl tw-h-fit " + (topMargin || "tw-mt-6") },
2087
+ var title = _a.title, children = _a.children, topMargin = _a.topMargin, TopSideButtons = _a.TopSideButtons, className = _a.className;
2088
+ return (React.createElement("div", { className: "tw-card tw-w-full tw-p-6 tw-bg-base-100 tw-shadow-xl tw-h-fit tw-mb-4 " + (className || "") + " " + (topMargin || "tw-mt-6") },
1224
2089
  React.createElement(Subtitle, { styleClass: TopSideButtons ? "tw-inline-block" : "" },
1225
2090
  title,
1226
2091
  TopSideButtons && React.createElement("div", { className: "tw-inline-block tw-float-right" }, TopSideButtons)),
1227
2092
  React.createElement("div", { className: "tw-divider tw-mt-2" }),
1228
- React.createElement("div", { className: 'tw-h-full tw-w-full tw-pb-6 tw-bg-base-100' }, children)));
2093
+ React.createElement("div", { className: 'tw-h-full tw-bg-transparent tw-w-full tw-pb-6 tw-bg-base-100' }, children)));
1229
2094
  }
1230
2095
 
1231
- function Settings(_a) {
1232
- var useAuth = _a.useAuth;
1233
- var _b = useAuth(), user = _b.user, updateUser = _b.updateUser, loading = _b.loading;
1234
- var _c = useState(""), id = _c[0], setId = _c[1];
1235
- var _d = useState(""), name = _d[0], setName = _d[1];
1236
- var _e = useState(""), text = _e[0], setText = _e[1];
1237
- var _f = useState(""), email = _f[0], setEmail = _f[1];
1238
- var _g = useState(""), password = _g[0], setPassword = _g[1];
1239
- var _h = useState(false), passwordChanged = _h[0], setPasswordChanged = _h[1];
2096
+ var css_248z$1 = ".picker {\n position: relative;\n }\n \n .swatch {\n width: 28px;\n height: 28px;\n border-radius: 8px;\n border: 3px solid #fff;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(0, 0, 0, 0.1);\n cursor: pointer;\n }\n \n .popover {\n position: absolute;\n top: 0;\n left: 36px;\n border-radius: 9px;\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);\n }";
2097
+ styleInject(css_248z$1);
2098
+
2099
+ // Improved version of https://usehooks.com/useOnClickOutside/
2100
+ var useClickOutside = function (ref, handler) {
2101
+ useEffect(function () {
2102
+ var startedInside = false;
2103
+ var startedWhenMounted = false;
2104
+ var listener = function (event) {
2105
+ // Do nothing if `mousedown` or `touchstart` started inside ref element
2106
+ if (startedInside || !startedWhenMounted)
2107
+ return;
2108
+ // Do nothing if clicking ref's element or descendent elements
2109
+ if (!ref.current || ref.current.contains(event.target))
2110
+ return;
2111
+ handler(event);
2112
+ };
2113
+ var validateEventStart = function (event) {
2114
+ startedWhenMounted = ref.current;
2115
+ startedInside = ref.current && ref.current.contains(event.target);
2116
+ };
2117
+ document.addEventListener("mousedown", validateEventStart);
2118
+ document.addEventListener("touchstart", validateEventStart);
2119
+ document.addEventListener("click", listener);
2120
+ return function () {
2121
+ document.removeEventListener("mousedown", validateEventStart);
2122
+ document.removeEventListener("touchstart", validateEventStart);
2123
+ document.removeEventListener("click", listener);
2124
+ };
2125
+ }, [ref, handler]);
2126
+ };
2127
+
2128
+ var ColorPicker = function (_a) {
2129
+ var color = _a.color, onChange = _a.onChange, className = _a.className;
2130
+ var popover = useRef(null);
2131
+ var _b = useState(false), isOpen = _b[0], toggle = _b[1];
2132
+ var close = useCallback(function () { return toggle(false); }, []);
2133
+ useClickOutside(popover, close);
2134
+ return (React.createElement("div", { className: "picker ".concat(className) },
2135
+ React.createElement("div", { className: "swatch", style: { backgroundColor: color }, onClick: function () { return toggle(true); } }),
2136
+ isOpen && (React.createElement("div", { className: "popover", ref: popover },
2137
+ React.createElement(HexColorPicker, { color: color, onChange: onChange })))));
2138
+ };
2139
+
2140
+ function Settings() {
2141
+ var _a = useAuth(), user = _a.user, updateUser = _a.updateUser, loading = _a.loading, token = _a.token;
2142
+ var _b = useState(""), id = _b[0], setId = _b[1];
2143
+ var _c = useState(""), name = _c[0], setName = _c[1];
2144
+ var _d = useState(""), text = _d[0], setText = _d[1];
2145
+ var _e = useState(""), email = _e[0], setEmail = _e[1];
2146
+ var _f = useState(""), password = _f[0], setPassword = _f[1];
2147
+ var _g = useState(""), avatar = _g[0], setAvatar = _g[1];
2148
+ var _h = useState(""), color = _h[0], setColor = _h[1];
2149
+ var _j = useState(false), passwordChanged = _j[0], setPasswordChanged = _j[1];
2150
+ var _k = useState(), crop = _k[0], setCrop = _k[1];
2151
+ var _l = useState(""), image = _l[0], setImage = _l[1];
2152
+ var _m = useState(false), cropModalOpen = _m[0], setCropModalOpen = _m[1];
2153
+ var _o = useState(false), cropping = _o[0], setCropping = _o[1];
2154
+ var assetsApi = useAssetApi();
2155
+ var navigate = useNavigate();
1240
2156
  useEffect(function () {
1241
2157
  setId((user === null || user === void 0 ? void 0 : user.id) ? user.id : "");
1242
2158
  setName((user === null || user === void 0 ? void 0 : user.first_name) ? user.first_name : "");
1243
2159
  setText((user === null || user === void 0 ? void 0 : user.description) ? user.description : "");
1244
2160
  setEmail((user === null || user === void 0 ? void 0 : user.email) ? user.email : "");
1245
2161
  setPassword((user === null || user === void 0 ? void 0 : user.password) ? user.password : "");
2162
+ setAvatar((user === null || user === void 0 ? void 0 : user.avatar) ? user === null || user === void 0 ? void 0 : user.avatar : ""),
2163
+ setColor((user === null || user === void 0 ? void 0 : user.color) ? user.color : "#aabbcc");
1246
2164
  }, [user]);
1247
- var navigate = useNavigate();
2165
+ var imgRef = useRef(null);
2166
+ var onImageChange = function (event) {
2167
+ if (event.target.files && event.target.files[0]) {
2168
+ setImage(URL.createObjectURL(event.target.files[0]));
2169
+ }
2170
+ setCropModalOpen(true);
2171
+ };
2172
+ function onImageLoad(e) {
2173
+ var _a = e.currentTarget, width = _a.width, height = _a.height;
2174
+ console.log(width);
2175
+ setCrop(centerAspectCrop(width, height, 1));
2176
+ }
2177
+ // This is to demonstate how to make and center a % aspect crop
2178
+ // which is a bit trickier so we use some helper functions.
2179
+ function centerAspectCrop(mediaWidth, mediaHeight, aspect) {
2180
+ return centerCrop(makeAspectCrop({
2181
+ unit: 'px',
2182
+ width: mediaWidth / 2,
2183
+ }, aspect, mediaWidth, mediaHeight), mediaWidth, mediaHeight);
2184
+ }
2185
+ function renderCrop() {
2186
+ return __awaiter(this, void 0, void 0, function () {
2187
+ var image, scaleX, scaleY, canvas, ctx, pixelRatio, blob;
2188
+ return __generator(this, function (_a) {
2189
+ switch (_a.label) {
2190
+ case 0:
2191
+ image = imgRef.current;
2192
+ if (!(crop && image)) return [3 /*break*/, 3];
2193
+ scaleX = image.naturalWidth / image.width;
2194
+ scaleY = image.naturalHeight / image.height;
2195
+ canvas = new OffscreenCanvas(crop.width * scaleX, crop.height * scaleY);
2196
+ ctx = canvas.getContext("2d");
2197
+ pixelRatio = window.devicePixelRatio;
2198
+ canvas.width = crop.width * pixelRatio * scaleX;
2199
+ canvas.height = crop.height * pixelRatio * scaleY;
2200
+ if (ctx) {
2201
+ ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
2202
+ ctx.drawImage(image, crop.x * scaleX, crop.y * scaleY, crop.width * scaleX, crop.height * scaleY, 0, 0, crop.width * scaleX, crop.height * scaleY);
2203
+ }
2204
+ return [4 /*yield*/, canvas.convertToBlob()];
2205
+ case 1:
2206
+ blob = _a.sent();
2207
+ return [4 /*yield*/, resizeBlob(blob)];
2208
+ case 2:
2209
+ _a.sent();
2210
+ setCropping(false);
2211
+ setImage("");
2212
+ _a.label = 3;
2213
+ case 3: return [2 /*return*/];
2214
+ }
2215
+ });
2216
+ });
2217
+ }
2218
+ function resizeBlob(blob) {
2219
+ return __awaiter(this, void 0, void 0, function () {
2220
+ var img, canvas, ctx, resizedBlob, asset;
2221
+ return __generator(this, function (_a) {
2222
+ switch (_a.label) {
2223
+ case 0:
2224
+ img = new Image();
2225
+ img.src = URL.createObjectURL(blob);
2226
+ return [4 /*yield*/, img.decode()];
2227
+ case 1:
2228
+ _a.sent();
2229
+ canvas = new OffscreenCanvas(400, 400);
2230
+ ctx = canvas.getContext("2d");
2231
+ ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(img, 0, 0, 400, 400);
2232
+ return [4 /*yield*/, canvas.convertToBlob()];
2233
+ case 2:
2234
+ resizedBlob = _a.sent();
2235
+ return [4 /*yield*/, assetsApi.upload(resizedBlob, "test")];
2236
+ case 3:
2237
+ asset = _a.sent();
2238
+ setAvatar(asset.id);
2239
+ return [2 /*return*/];
2240
+ }
2241
+ });
2242
+ });
2243
+ }
1248
2244
  var onUpdateUser = function () {
1249
2245
  var changedUser = {};
1250
- if (passwordChanged) {
1251
- changedUser = { id: id, first_name: name, description: text, email: email, password: password };
1252
- }
1253
- else {
1254
- changedUser = { id: id, first_name: name, description: text, email: email };
1255
- }
2246
+ changedUser = __assign(__assign({ id: id, first_name: name, description: text, email: email, color: color }, passwordChanged && { password: password }), avatar.length > 10 && { avatar: avatar });
1256
2247
  toast.promise(updateUser(changedUser), {
1257
2248
  pending: 'updating Profile ...',
1258
2249
  success: 'Profile updated',
1259
- error: 'Error'
2250
+ error: {
2251
+ render: function (_a) {
2252
+ var data = _a.data;
2253
+ return "".concat(data);
2254
+ },
2255
+ },
1260
2256
  })
1261
2257
  .then(function () { return navigate("/"); });
1262
2258
  };
1263
- return (React.createElement("main", { className: "tw-flex-1 tw-overflow-y-auto tw-overflow-x-hidden tw-pt-8 tw-px-6 tw-bg-base-200 tw-min-w-80 tw-flex tw-justify-center" },
1264
- React.createElement("div", { className: 'tw-w-full xl:tw-max-w-6xl' },
1265
- React.createElement(TitleCard, { title: "Profile Settings", topMargin: "tw-mt-2" },
1266
- React.createElement("div", { className: "tw-grid tw-grid-cols-1 tw-md:grid-cols-2 tw-gap-6" },
1267
- 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); } })),
1268
- React.createElement("div", { className: "tw-grid tw-grid-cols-1 tw-md:grid-cols-1 tw-gap-6 tw-pt-6 tw-pb-6" },
1269
- 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' })),
1270
- React.createElement("div", { className: "tw-divider" }),
1271
- React.createElement("div", { className: "tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6" },
1272
- 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); } }),
1273
- React.createElement(TextInput, { type: 'password', placeholder: "new Password", defaultValue: (user === null || user === void 0 ? void 0 : user.password) ? user.password : "", updateFormValue: function (v) {
1274
- setPassword(v);
1275
- setPasswordChanged(true);
1276
- } })),
1277
- React.createElement("div", { className: "tw-mt-8" },
1278
- React.createElement("button", { className: loading ? " tw-loading tw-btn-disabled tw-btn tw-btn-primary tw-float-right" : "tw-btn tw-btn-primary tw-float-right", onClick: function () { return onUpdateUser(); } }, "Update"))))));
2259
+ return (React.createElement(React.Fragment, null,
2260
+ React.createElement("main", { className: "tw-flex-1 tw-overflow-y-auto tw-overflow-x-hidden tw-pt-8 tw-px-6 tw-bg-base-200 tw-min-w-80 tw-flex tw-justify-center" },
2261
+ React.createElement("div", { className: 'tw-w-full xl:tw-max-w-6xl' },
2262
+ React.createElement(TitleCard, { title: "Profile Settings", topMargin: "tw-mt-2", className: 'tw-mb-6' },
2263
+ React.createElement("div", { className: "tw-flex" },
2264
+ !cropping ?
2265
+ React.createElement("label", { className: "custom-file-upload" },
2266
+ React.createElement("input", { type: "file", accept: "image/*", className: "tw-file-input tw-w-full tw-max-w-xs", onChange: onImageChange }),
2267
+ React.createElement("div", { className: 'button tw-btn tw-btn-lg tw-btn-circle tw-animate-none' },
2268
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: "1.5", stroke: "currentColor", className: "tw-w-6 tw-h-6" },
2269
+ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5" }))),
2270
+ avatar ?
2271
+ React.createElement("div", { className: 'tw-h-20 tw-w-20' },
2272
+ React.createElement("img", { src: assetsApi.url + avatar + "?access_token=" + token, className: ' tw-rounded-full' }))
2273
+ :
2274
+ React.createElement("div", { className: 'tw-h-20 tw-w-20' },
2275
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", version: "1.0", viewBox: "0 0 150 150", className: 'tw-w-20 tw-h-20 tw-rounded-full', style: { backgroundColor: "#eee" } },
2276
+ React.createElement("path", { fill: "#ccc", d: "M 104.68731,56.689353 C 102.19435,80.640493 93.104981,97.26875 74.372196,97.26875 55.639402,97.26875 46.988823,82.308034 44.057005,57.289941 41.623314,34.938838 55.639402,15.800152 74.372196,15.800152 c 18.732785,0 32.451944,18.493971 30.315114,40.889201 z" }),
2277
+ React.createElement("path", { fill: "#ccc", d: "M 92.5675 89.6048 C 90.79484 93.47893 89.39893 102.4504 94.86478 106.9039 C 103.9375 114.2963 106.7064 116.4723 118.3117 118.9462 C 144.0432 124.4314 141.6492 138.1543 146.5244 149.2206 L 4.268444 149.1023 C 8.472223 138.6518 6.505799 124.7812 32.40051 118.387 C 41.80992 116.0635 45.66513 113.8823 53.58659 107.0158 C 58.52744 102.7329 57.52583 93.99267 56.43084 89.26926 C 52.49275 88.83011 94.1739 88.14054 92.5675 89.6048 z" }))))
2278
+ : React.createElement("div", { className: 'tw-w-20 tw-flex tw-items-center tw-justify-center' },
2279
+ React.createElement("span", { className: "tw-loading tw-loading-spinner" })),
2280
+ React.createElement(ColorPicker, { color: color, onChange: setColor, className: "-tw-left-6 tw-top-14 -tw-mr-6" }),
2281
+ 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); }, containerStyle: 'tw-grow tw-ml-6 tw-my-auto ' })),
2282
+ React.createElement("div", { className: "tw-grid tw-grid-cols-1 tw-md:grid-cols-1 tw-gap-6 tw-pt-6 tw-pb-6" },
2283
+ 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' })),
2284
+ React.createElement("div", { className: "tw-divider" }),
2285
+ React.createElement("div", { className: "tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6" },
2286
+ 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); } }),
2287
+ React.createElement(TextInput, { type: 'password', placeholder: "new Password", defaultValue: (user === null || user === void 0 ? void 0 : user.password) ? user.password : "", updateFormValue: function (v) {
2288
+ setPassword(v);
2289
+ setPasswordChanged(true);
2290
+ } })),
2291
+ React.createElement("div", { className: "tw-mt-8" },
2292
+ React.createElement("button", { className: loading ? " tw-loading tw-btn-disabled tw-btn tw-btn-primary tw-float-right" : "tw-btn tw-btn-primary tw-float-right", onClick: function () { return onUpdateUser(); } }, "Update"))))),
2293
+ React.createElement(DialogModal, { title: "", isOpened: cropModalOpen, onClose: function () {
2294
+ setCropModalOpen(false);
2295
+ setImage("");
2296
+ } },
2297
+ React.createElement(ReactCrop, { crop: crop, onChange: function (c) { return setCrop(c); }, aspect: 1 },
2298
+ React.createElement("img", { src: image, ref: imgRef, onLoad: onImageLoad })),
2299
+ React.createElement("button", { className: "tw-btn ", onClick: function () {
2300
+ setCropping(true);
2301
+ setCropModalOpen(false);
2302
+ renderCrop();
2303
+ } }, "Select"))));
1279
2304
  }
1280
2305
 
1281
- function Welcome1(_a) {
1282
- var clickAction = _a.clickAction;
1283
- return (React.createElement(React.Fragment, null,
1284
- React.createElement("h3", { className: "tw-font-bold tw-text-lg" }, "Herzlich Willkommen, sch\u00F6n dass du da bist! "),
1285
- React.createElement("p", { className: "tw-py-4" },
1286
- "Wir erschaffen zusammen eine Welt, in der wir frei und menschlich zusammen leben d\u00FCrfen. Daf\u00FCr bauen wir ein Netzwerk in dem wir uns im echten Leben begegnen und helfen ... ganz ohne Geld \uD83D\uDE09",
1287
- React.createElement("br", null),
1288
- React.createElement("br", null),
1289
- React.createElement("b", null, "Hast du Lust mitzumachen?")),
1290
- React.createElement("div", { className: "tw-modal-action" },
1291
- React.createElement("label", { className: "tw-btn tw-btn-neutral", onClick: function () { return clickAction(); } }, "Bin dabei"))));
1292
- }
1293
- function Welcome2(_a) {
1294
- var clickAction = _a.clickAction;
1295
- return (React.createElement(React.Fragment, null,
1296
- React.createElement("h3", { className: "tw-font-bold tw-text-lg" }, "Ver\u00E4nderung passiert im echten Leben"),
1297
- React.createElement("p", { className: "tw-py-4" },
1298
- "Mal ganz ehrlich: 99% unser Zeit am Bildschirm ist sinnlose Zeit- und Energie-Verschwendung.",
1299
- React.createElement("br", null),
1300
- React.createElement("br", null),
1301
- "Darum tauchen wir wieder in das echte Leben ein und nutzen digitale Medien nur dort, wo sie uns wirklich helfen in echt zusammen zu kommen"),
1302
- React.createElement("div", { className: "tw-modal-action" },
1303
- React.createElement("label", { className: "tw-btn tw-btn-neutral", onClick: function () { return clickAction(); } }, "Alles klar"))));
1304
- }
1305
- function Welcome3(_a) {
1306
- var clickAction = _a.clickAction;
1307
- return (React.createElement(React.Fragment, null,
1308
- React.createElement("h3", { className: "tw-font-bold tw-text-lg" }, " Gemeinsam erschaffen wir Strukturen "),
1309
- React.createElement("ul", { className: 'tw-flex-row tw-pl-4 tw-mt-4' },
1310
- React.createElement("li", null, "\uD83E\uDD55 Essen & Trinken"),
1311
- React.createElement("li", null, "\uD83C\uDFE1 Wohn- & Lebensraum"),
1312
- React.createElement("li", null, "\uD83D\uDCAC Kommunikation"),
1313
- React.createElement("li", null, "\uD83D\uDCA1 Energie"),
1314
- React.createElement("li", null, "\uD83D\uDE90 Mobilit\u00E4t")),
1315
- React.createElement("div", { className: "tw-modal-action" },
1316
- React.createElement("button", { className: "tw-btn tw-btn-neutral", onClick: function () { return clickAction(); } }, "Ich mach mit"))));
1317
- }
1318
- function Modal() {
1319
- var _a = useState(1), chapter = _a[0], setChapter = _a[1];
1320
- var close = function () {
1321
- window.my_modal_3.close();
1322
- };
1323
- var ActiveChapter = function () {
1324
- switch (chapter) {
1325
- case 1:
1326
- return React.createElement(Welcome1, { clickAction: function () { setChapter(2); } });
1327
- case 2:
1328
- return React.createElement(Welcome2, { clickAction: function () { setChapter(3); } });
1329
- case 3:
1330
- return React.createElement(Welcome3, { clickAction: function () {
1331
- setChapter(1);
1332
- close();
1333
- } });
1334
- default: return React.createElement(React.Fragment, null);
1335
- }
1336
- };
2306
+ function Modal(_a) {
2307
+ var children = _a.children;
2308
+ var _b = useState(1); _b[0]; _b[1];
2309
+ useSetQuestOpen();
1337
2310
  return (React.createElement(React.Fragment, null,
1338
- React.createElement("dialog", { id: "my_modal_3", className: "tw-modal" },
1339
- React.createElement("form", { method: "dialog", className: "tw-modal-box" },
2311
+ React.createElement("dialog", { id: "my_modal_3", className: "tw-modal tw-transition-all tw-duration-300" },
2312
+ React.createElement("form", { method: "dialog", className: "tw-modal-box tw-transition-none" },
1340
2313
  React.createElement("button", { className: "tw-btn tw-btn-sm tw-btn-circle tw-btn-ghost tw-absolute tw-right-2 tw-top-2" }, "\u2715"),
1341
- React.createElement(ActiveChapter, null)),
2314
+ children),
1342
2315
  React.createElement("form", { method: "dialog", className: "tw-modal-backdrop" },
1343
2316
  React.createElement("button", null, "close")))));
1344
2317
  }
1345
2318
 
1346
2319
  function Quests() {
1347
- var _a = React.useState(true), open = _a[0], setOpen = _a[1];
1348
- if (open)
1349
- return (React.createElement(React.Fragment, null,
1350
- React.createElement("div", { className: "tw-card tw-w-48 tw-bg-base-100 tw-shadow-xl tw-absolute tw-bottom-4 tw-left-4 tw-z-1000" },
1351
- React.createElement("div", { className: "tw-card-body tw-p-4 tw-pt-0" },
1352
- React.createElement("div", { className: "tw-card-actions tw-justify-end" },
1353
- React.createElement("label", { className: "tw-btn tw-btn-sm tw-btn-circle tw-btn-ghost tw-absolute tw-right-2 tw-top-2", onClick: function () { return setOpen(false); } }, "\u2715")),
1354
- React.createElement("h2", { className: "tw-card-title tw-m-auto " }, "Level 1"),
1355
- React.createElement("ul", { className: 'tw-flex-row' },
1356
- React.createElement("li", null,
1357
- React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-0" },
1358
- React.createElement("input", { type: "checkbox", readOnly: true, className: "tw-checkbox tw-checkbox-xs tw-checkbox-success", checked: true }),
1359
- React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, "Registrieren"))),
1360
- React.createElement("li", null,
1361
- React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-0" },
1362
- React.createElement("input", { type: "checkbox", readOnly: true, className: "tw-checkbox tw-checkbox-xs tw-checkbox-success", checked: true }),
1363
- React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, "Avatar hochladen"))),
1364
- React.createElement("li", null,
1365
- React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-0" },
1366
- React.createElement("input", { type: "checkbox", readOnly: true, className: "tw-checkbox tw-checkbox-xs tw-checkbox-success", disabled: true }),
1367
- React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, "Profil ausf\u00FCllen"))),
1368
- React.createElement("li", null,
1369
- React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-0" },
1370
- React.createElement("input", { type: "checkbox", readOnly: true, className: "tw-checkbox tw-checkbox-xs tw-checkbox-success", disabled: true }),
1371
- React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, "Gruppe beitreten"))))))));
1372
- else
1373
- return (React.createElement(React.Fragment, null));
2320
+ var questsOpen = useQuestsOpen();
2321
+ var setQuestsOpen = useSetQuestOpen();
2322
+ var _a = useAuth(), isAuthenticated = _a.isAuthenticated, user = _a.user;
2323
+ useEffect(function () {
2324
+ setQuestsOpen(false);
2325
+ }, []);
2326
+ return (React.createElement(React.Fragment, null, questsOpen ?
2327
+ React.createElement("div", { className: "tw-card tw-w-48 tw-bg-base-100 tw-shadow-xl tw-absolute tw-bottom-4 tw-left-4 tw-z-[2000]" },
2328
+ React.createElement("div", { className: "tw-card-body tw-p-4 tw-pt-0" },
2329
+ React.createElement("div", { className: "tw-card-actions tw-justify-end" },
2330
+ React.createElement("label", { className: "tw-btn tw-btn-sm tw-btn-circle tw-btn-ghost tw-absolute tw-right-1 tw-top-1", onClick: function () { return setQuestsOpen(false); } }, "\u2715")),
2331
+ React.createElement("h2", { className: "tw-card-title tw-m-auto " },
2332
+ "Level 1",
2333
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: "#aaa", className: "tw-w-5 tw-h-5 tw-cursor-pointer" },
2334
+ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z" }))),
2335
+ React.createElement("ul", { className: 'tw-flex-row' },
2336
+ React.createElement("li", null,
2337
+ React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-0" },
2338
+ React.createElement("input", { type: "checkbox", readOnly: true, className: "tw-checkbox tw-checkbox-xs tw-checkbox-success", checked: isAuthenticated ? isAuthenticated : false }),
2339
+ React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, "Sign Up"))),
2340
+ React.createElement("li", null,
2341
+ React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-0" },
2342
+ React.createElement("input", { type: "checkbox", readOnly: true, className: "tw-checkbox tw-checkbox-xs tw-checkbox-success", checked: (user === null || user === void 0 ? void 0 : user.description) ? true : false }),
2343
+ React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, "Fill Profile"))),
2344
+ React.createElement("li", null,
2345
+ React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-0" },
2346
+ React.createElement("input", { type: "checkbox", readOnly: true, className: "tw-checkbox tw-checkbox-xs tw-checkbox-success", checked: (user === null || user === void 0 ? void 0 : user.avatar) ? true : false }),
2347
+ React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, "Upload Avatar")))),
2348
+ " "))
2349
+ : ""));
1374
2350
  }
1375
2351
 
1376
2352
  function CardPage(_a) {
1377
- var title = _a.title, children = _a.children;
2353
+ var title = _a.title, children = _a.children, parent = _a.parent;
1378
2354
  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" },
1379
- React.createElement("div", { className: 'tw-w-full xl:tw-max-w-6xl' },
2355
+ React.createElement("div", { className: 'tw-w-full xl:tw-max-w-6xl ' },
1380
2356
  React.createElement("div", { className: "tw-text-sm tw-breadcrumbs" },
1381
2357
  React.createElement("ul", null,
1382
2358
  React.createElement("li", null,
1383
2359
  React.createElement(Link, { to: '/' }, "Home")),
2360
+ parent && React.createElement("li", null,
2361
+ React.createElement(Link, { to: (parent === null || parent === void 0 ? void 0 : parent.url) ? parent === null || parent === void 0 ? void 0 : parent.url : "" }, parent === null || parent === void 0 ? void 0 : parent.name)),
1384
2362
  React.createElement("li", null, title))),
1385
- React.createElement(TitleCard, { title: title, topMargin: "mt-2" }, children))));
2363
+ React.createElement(TitleCard, { title: title, topMargin: "tw-my-2", className: " tw-mb-4" }, children))));
1386
2364
  }
1387
2365
 
1388
- 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.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: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-0 {\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-0 {\n right: 0px;\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-\\[1500\\] {\n z-index: 1500 !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 !important;\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-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-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-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-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-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-h-2 {\n height: 0.5rem;\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-14 {\n width: 3.5rem;\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-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-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-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-full {\n border-radius: 9999px;\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-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-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-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-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-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-error {\n --tw-text-opacity: 1;\n color: hsl(var(--er) / 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-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.hover\\:tw-cursor-pointer:hover {\n cursor: pointer;\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-primary:hover {\n --tw-text-opacity: 1;\n color: hsl(var(--p) / 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.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}";
2366
+ 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: var(--fallback-b1,oklch(var(--b1)/1));\n color: var(--fallback-bc,oklch(var(--bc)/1));\n}\n\n@supports not (color: oklch(0 0 0)) {\n\n :root {\n color-scheme: light;\n --fallback-p: #491eff;\n --fallback-pc: #d4dbff;\n --fallback-s: #ff41c7;\n --fallback-sc: #fff9fc;\n --fallback-a: #00cfbd;\n --fallback-ac: #00100d;\n --fallback-n: #2b3440;\n --fallback-nc: #d7dde4;\n --fallback-b1: #ffffff;\n --fallback-b2: #e5e6e6;\n --fallback-b3: #e5e6e6;\n --fallback-bc: #1f2937;\n --fallback-in: #00b3f0;\n --fallback-inc: #000000;\n --fallback-su: #00ca92;\n --fallback-suc: #000000;\n --fallback-wa: #ffc22d;\n --fallback-wac: #000000;\n --fallback-er: #ff6f70;\n --fallback-erc: #000000;\n }\n\n @media (prefers-color-scheme: dark) {\n\n :root {\n color-scheme: dark;\n --fallback-p: #7582ff;\n --fallback-pc: #050617;\n --fallback-s: #ff71cf;\n --fallback-sc: #190211;\n --fallback-a: #00c7b5;\n --fallback-ac: #000e0c;\n --fallback-n: #2a323c;\n --fallback-nc: #a6adbb;\n --fallback-b1: #1d232a;\n --fallback-b2: #191e24;\n --fallback-b3: #15191e;\n --fallback-bc: #a6adbb;\n --fallback-in: #00b3f0;\n --fallback-inc: #000000;\n --fallback-su: #00ca92;\n --fallback-suc: #000000;\n --fallback-wa: #ffc22d;\n --fallback-wac: #000000;\n --fallback-er: #ff6f70;\n --fallback-erc: #000000;\n }\n }\n}\n\nhtml {\n -webkit-tap-highlight-color: transparent;\n}\n\n:root {\n color-scheme: light;\n --in: 0.7206 0.191 231.6;\n --su: 64.8% 0.150 160;\n --wa: 0.8471 0.199 83.87;\n --er: 0.7176 0.221 22.18;\n --pc: 0.152344 0.017892 200.026556;\n --sc: 0.15787 0.020249 356.29965;\n --ac: 0.158762 0.029206 78.618794;\n --nc: 0.847148 0.013247 313.189598;\n --inc: 0 0 0;\n --suc: 0 0 0;\n --wac: 0 0 0;\n --erc: 0 0 0;\n --rounded-box: 1rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --p: 0.76172 0.089459 200.026556;\n --s: 0.789351 0.101246 356.29965;\n --a: 0.793811 0.146032 78.618794;\n --n: 0.235742 0.066235 313.189598;\n --b1: 0.977882 0.00418 56.375637;\n --b2: 0.939822 0.007638 61.449292;\n --b3: 0.915861 0.006811 53.440502;\n --bc: 0.235742 0.066235 313.189598;\n --rounded-btn: 1.9rem;\n --tab-border: 2px;\n --tab-radius: 0.7rem;\n}\n\n[data-theme=cupcake] {\n color-scheme: light;\n --in: 0.7206 0.191 231.6;\n --su: 64.8% 0.150 160;\n --wa: 0.8471 0.199 83.87;\n --er: 0.7176 0.221 22.18;\n --pc: 0.152344 0.017892 200.026556;\n --sc: 0.15787 0.020249 356.29965;\n --ac: 0.158762 0.029206 78.618794;\n --nc: 0.847148 0.013247 313.189598;\n --inc: 0 0 0;\n --suc: 0 0 0;\n --wac: 0 0 0;\n --erc: 0 0 0;\n --rounded-box: 1rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --p: 0.76172 0.089459 200.026556;\n --s: 0.789351 0.101246 356.29965;\n --a: 0.793811 0.146032 78.618794;\n --n: 0.235742 0.066235 313.189598;\n --b1: 0.977882 0.00418 56.375637;\n --b2: 0.939822 0.007638 61.449292;\n --b3: 0.915861 0.006811 53.440502;\n --bc: 0.235742 0.066235 313.189598;\n --rounded-btn: 1.9rem;\n --tab-border: 2px;\n --tab-radius: 0.7rem;\n}\n\n[data-theme=retro] {\n color-scheme: light;\n --inc: 0.90923 0.043042 262.880917;\n --suc: 0.12541 0.033982 149.213788;\n --wac: 0.133168 0.031484 58.31834;\n --erc: 0.13144 0.0398 27.33;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --p: 0.768664 0.104092 22.664655;\n --pc: 0.265104 0.006243 0.522862;\n --s: 0.807415 0.052534 159.094608;\n --sc: 0.265104 0.006243 0.522862;\n --a: 0.703919 0.125455 52.953428;\n --ac: 0.265104 0.006243 0.522862;\n --n: 0.284181 0.009519 355.534017;\n --nc: 0.925604 0.025113 89.217311;\n --b1: 0.916374 0.034554 90.51575;\n --b2: 0.882722 0.049418 91.774344;\n --b3: 0.84133 0.065952 90.856665;\n --bc: 0.265104 0.006243 0.522862;\n --in: 0.54615 0.215208 262.880917;\n --su: 0.627052 0.169912 149.213788;\n --wa: 0.66584 0.157422 58.31834;\n --er: 0.6572 0.199 27.33;\n --rounded-box: 0.4rem;\n --rounded-btn: 0.4rem;\n --rounded-badge: 0.4rem;\n --tab-radius: 0.4rem;\n}\n\n[data-theme=cyberpunk] {\n color-scheme: light;\n --b2: 0.878943 0.16647 104.32;\n --b3: 0.812786 0.15394 104.32;\n --in: 0.7206 0.191 231.6;\n --su: 64.8% 0.150 160;\n --wa: 0.8471 0.199 83.87;\n --er: 0.7176 0.221 22.18;\n --bc: 0.18902 0.0358 104.32;\n --pc: 0.14844 0.0418 6.35;\n --sc: 0.16666 0.0368 204.72;\n --ac: 0.14372 0.04352 310.43;\n --inc: 0 0 0;\n --suc: 0 0 0;\n --wac: 0 0 0;\n --erc: 0 0 0;\n --animation-btn: 0.25s;\n --animation-input: .2s;\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: 0.7422 0.209 6.35;\n --s: 0.8333 0.184 204.72;\n --a: 0.7186 0.2176 310.43;\n --n: 0.2304 0.065 269.31;\n --nc: 0.9451 0.179 104.32;\n --b1: 0.9451 0.179 104.32;\n --rounded-box: 0;\n --rounded-btn: 0;\n --rounded-badge: 0;\n --tab-radius: 0;\n}\n\n[data-theme=aqua] {\n color-scheme: dark;\n --b2: 0.453464 0.118611 261.181672;\n --b3: 0.419333 0.109683 261.181672;\n --bc: 0.897519 0.025508 261.181672;\n --sc: 0.121365 0.02175 309.782946;\n --ac: 0.186854 0.020445 94.555431;\n --nc: 0.122124 0.023402 243.760661;\n --inc: 0.90923 0.043042 262.880917;\n --suc: 0.12541 0.033982 149.213788;\n --wac: 0.133168 0.031484 58.31834;\n --erc: 0.1479 0.038 27.33;\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-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 0.856617 0.14498 198.6458;\n --pc: 0.401249 0.068266 197.603872;\n --s: 0.606827 0.108752 309.782946;\n --a: 0.934269 0.102225 94.555431;\n --n: 0.610622 0.117009 243.760661;\n --b1: 0.487596 0.127539 261.181672;\n --in: 0.54615 0.215208 262.880917;\n --su: 0.627052 0.169912 149.213788;\n --wa: 0.66584 0.157422 58.31834;\n --er: 0.7395 0.19 27.33;\n}\n\ninput[type=\"range\"]::-webkit-slider-thumb {\n height: 1rem;\n width: 1rem;\n border-radius: 9999px;\n border: 0;\n appearance: none;\n -moz-appearance: none;\n -webkit-appearance: none;\n cursor: pointer;\n}\n\ninput[type=\"range\"]:disabled::-webkit-slider-thumb {}\n\ninput[type=\"range\"]:disabled:focus::-webkit-slider-thumb {}\n\ninput[type=\"range\"]:disabled:active::-webkit-slider-thumb {}\n\ninput[type=\"range\"]::-moz-range-thumb {\n height: 1rem;\n width: 1rem;\n border-radius: 9999px;\n border: 0;\n appearance: none;\n -moz-appearance: none;\n -webkit-appearance: none;\n cursor: pointer;\n}\n\ninput[type=\"range\"]:disabled::-moz-range-thumb {}\n\ninput[type=\"range\"]::-moz-range-progress {}\n\ninput[type=\"range\"]::-ms-fill-lower {}\n\ninput[type=\"range\"]:focus {\n outline: none;\n}\n\ninput[type=\"range\"]:focus::-webkit-slider-thumb {}\n\ninput[type=\"range\"]:active::-webkit-slider-thumb {}\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-radius: var(--rounded-box, 1rem);\n border-width: 1px;\n --tw-border-opacity: 1;\n border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));\n padding: 1rem;\n --tw-text-opacity: 1;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --alert-bg: var(--fallback-b2,oklch(var(--b2)/1));\n --alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1));\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: start;\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: var(--fallback-su,oklch(var(--su)/var(--tw-border-opacity)));\n }\n\n .tw-label a:hover {\n --tw-text-opacity: 1;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n }\n\n .tw-menu li > *:not(ul):not(.tw-menu-title):not(details):active,\n.tw-menu li > *:not(ul):not(.tw-menu-title):not(details).tw-active,\n.tw-menu li > details > summary:active {\n --tw-bg-opacity: 1;\n background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n --tw-text-opacity: 1;\n color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));\n }\n}\n.tw-btn {\n display: inline-flex;\n height: 3rem;\n min-height: 3rem;\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-radius: var(--rounded-btn, 0.5rem);\n border-color: transparent;\n border-color: oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity));\n padding-left: 1rem;\n padding-right: 1rem;\n text-align: center;\n font-size: 0.875rem;\n line-height: 1em;\n gap: 0.5rem;\n font-weight: 600;\n text-decoration-line: none;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n border-width: var(--border-btn, 1px);\n animation: button-pop var(--animation-btn, 0.25s) ease-out;\n transition-property: color, background-color, border-color, opacity, box-shadow, transform;\n --tw-text-opacity: 1;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 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 outline-color: var(--fallback-bc,oklch(var(--bc)/1));\n background-color: oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity));\n --tw-bg-opacity: 1;\n --tw-border-opacity: 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:where(.tw-btn:is(input[type=\"checkbox\"])),\n:where(.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 border-radius: var(--rounded-box, 1rem);\n --tw-bg-opacity: 1;\n background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n opacity: 0.75;\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: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));\n}\n.tw-checkbox {\n flex-shrink: 0;\n --chkbg: var(--fallback-bc,oklch(var(--bc)/1));\n --chkfg: var(--fallback-b1,oklch(var(--b1)/1));\n height: 1.5rem;\n width: 1.5rem;\n cursor: pointer;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n border-radius: var(--rounded-btn, 0.5rem);\n border-width: 1px;\n border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));\n --tw-border-opacity: 0.2;\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 height: 0.125rem;\n width: 100%;\n flex-grow: 1;\n --tw-content: '';\n content: var(--tw-content);\n background-color: var(--fallback-bc,oklch(var(--bc)/0.1));\n}\n.tw-dropdown {\n position: relative;\n display: inline-block;\n}\n.tw-dropdown > *:not(summary):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 transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\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-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n transition-duration: 200ms;\n}\n.tw-dropdown-end .tw-dropdown-content {\n inset-inline-end: 0px;\n}\n.tw-dropdown-left .tw-dropdown-content {\n bottom: auto;\n inset-inline-end: 100%;\n top: 0px;\n transform-origin: right;\n}\n.tw-dropdown-right .tw-dropdown-content {\n bottom: auto;\n inset-inline-start: 100%;\n top: 0px;\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: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn:hover {\n background-color: color-mix(\n in oklab,\n oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,\n black\n );\n border-color: color-mix(\n in oklab,\n oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,\n black\n );\n }\n }\n\n @supports not (color: oklch(0 0 0)) {\n\n .tw-btn:hover {\n background-color: var(--btn-color, var(--fallback-b2));\n border-color: var(--btn-color, var(--fallback-b2));\n }\n }\n\n .tw-btn:hover {\n --tw-border-opacity: 1;\n border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn:hover {\n background-color: color-mix(\n in oklab,\n oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,\n black\n );\n border-color: color-mix(\n in oklab,\n oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,\n black\n );\n }\n }\n\n @supports not (color: oklch(0 0 0)) {\n\n .tw-btn:hover {\n background-color: var(--btn-color, var(--fallback-b2));\n border-color: var(--btn-color, var(--fallback-b2));\n }\n }\n\n .tw-btn:hover {\n --tw-border-opacity: 1;\n border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn:hover {\n background-color: color-mix(\n in oklab,\n oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,\n black\n );\n border-color: color-mix(\n in oklab,\n oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,\n black\n );\n }\n }\n\n @supports not (color: oklch(0 0 0)) {\n\n .tw-btn:hover {\n background-color: var(--btn-color, var(--fallback-b2));\n border-color: var(--btn-color, var(--fallback-b2));\n }\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 border-color: transparent;\n }\n\n @supports (color: oklch(0 0 0)) {\n\n .tw-btn-ghost:hover {\n background-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n }\n }\n\n .tw-btn-ghost:hover {\n border-color: transparent;\n }\n\n @supports (color: oklch(0 0 0)) {\n\n .tw-btn-ghost:hover {\n background-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n }\n }\n\n .tw-btn-outline.tw-btn-primary:hover {\n --tw-text-opacity: 1;\n color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn-outline.tw-btn-primary:hover {\n background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n }\n }\n\n .tw-btn-outline.tw-btn-primary:hover {\n --tw-text-opacity: 1;\n color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn-outline.tw-btn-primary:hover {\n background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n }\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: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n --tw-bg-opacity: 0.2;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --tw-text-opacity: 0.2;\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn:is(input[type=\"checkbox\"]:checked):hover, .tw-btn:is(input[type=\"radio\"]:checked):hover {\n background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n }\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 outline: 2px solid transparent;\n outline-offset: 2px;\n }\n\n @supports (color: oklch(0 0 0)) {\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 background-color: var(--fallback-bc,oklch(var(--bc)/0.1));\n }\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 outline: 2px solid transparent;\n outline-offset: 2px;\n }\n\n @supports (color: oklch(0 0 0)) {\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 background-color: var(--fallback-bc,oklch(var(--bc)/0.1));\n }\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 outline: 2px solid transparent;\n outline-offset: 2px;\n }\n\n @supports (color: oklch(0 0 0)) {\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 background-color: var(--fallback-bc,oklch(var(--bc)/0.1));\n }\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 outline: 2px solid transparent;\n outline-offset: 2px;\n }\n\n @supports (color: oklch(0 0 0)) {\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 background-color: var(--fallback-bc,oklch(var(--bc)/0.1));\n }\n }\n}\n.tw-dropdown:is(details) summary::-webkit-details-marker {\n display: none;\n}\n.tw-file-input {\n height: 3rem;\n flex-shrink: 1;\n padding-inline-end: 1rem;\n font-size: 1rem;\n line-height: 2;\n line-height: 1.5rem;\n overflow: hidden;\n border-radius: var(--rounded-btn, 0.5rem);\n border-width: 1px;\n border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));\n --tw-border-opacity: 0;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));\n}\n.tw-file-input::file-selector-button {\n margin-inline-end: 1rem;\n display: inline-flex;\n height: 100%;\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 padding-left: 1rem;\n padding-right: 1rem;\n text-align: center;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 1em;\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-timing-function: cubic-bezier(0, 0, 0.2, 1);\n transition-duration: 200ms;\n border-style: solid;\n --tw-border-opacity: 1;\n border-color: var(--fallback-n,oklch(var(--n)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n font-weight: 600;\n text-transform: uppercase;\n --tw-text-opacity: 1;\n color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));\n text-decoration-line: none;\n border-width: var(--border-btn, 1px);\n animation: button-pop var(--animation-btn, 0.25s) ease-out;\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 -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\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-radius: var(--rounded-btn, 0.5rem);\n border-width: 1px;\n border-color: transparent;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));\n}\n.tw-join .tw-dropdown .tw-join-item:first-child:not(:last-child),\n .tw-join *:first-child:not(:last-child) .tw-dropdown .tw-join-item {\n border-start-end-radius: inherit;\n border-end-end-radius: inherit;\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-inline-start: 1rem;\n padding-inline-start: 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: minmax(auto, 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: var(--fallback-bc,oklch(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, 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 border-bottom-right-radius: var(--rounded-box, 1rem);\n border-bottom-left-radius: var(--rounded-box, 1rem);\n border-top-left-radius: var(--rounded-box, 1rem);\n border-top-right-radius: var(--rounded-box, 1rem);\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b1,oklch(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-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n transition-duration: 200ms;\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-select {\n display: inline-flex;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n height: 3rem;\n min-height: 3rem;\n padding-left: 1rem;\n padding-right: 2.5rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 2;\n border-radius: var(--rounded-btn, 0.5rem);\n border-width: 1px;\n border-color: transparent;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));\n background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),\n linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position: calc(100% - 20px) calc(1px + 50%),\n calc(100% - 16.1px) calc(1px + 50%);\n background-size: 4px 4px,\n 4px 4px;\n background-repeat: no-repeat;\n}\n.tw-select[multiple] {\n height: auto;\n}\n.tw-textarea {\n min-height: 3rem;\n flex-shrink: 1;\n padding-left: 1rem;\n padding-right: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 2;\n border-radius: var(--rounded-btn, 0.5rem);\n border-width: 1px;\n border-color: transparent;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));\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: var(--fallback-b1,oklch(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: -135deg;\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@supports not (color: oklch(0 0 0)) {\n\n .tw-btn {\n background-color: var(--btn-color, var(--fallback-b2));\n border-color: var(--btn-color, var(--fallback-b2));\n }\n\n .tw-btn-primary {\n --btn-color: var(--fallback-p);\n }\n\n .tw-btn-neutral {\n --btn-color: var(--fallback-n);\n }\n}\n@supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn-outline.tw-btn-primary.tw-btn-active {\n background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n }\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-text-opacity: 1;\n color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));\n outline-color: var(--fallback-p,oklch(var(--p)/1));\n}\n@supports (color: oklch(0 0 0)) {\n\n .tw-btn-primary {\n --btn-color: var(--p);\n }\n\n .tw-btn-neutral {\n --btn-color: var(--n);\n }\n}\n.tw-btn-neutral {\n --tw-text-opacity: 1;\n color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));\n outline-color: var(--fallback-n,oklch(var(--n)/1));\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 border-color: transparent;\n background-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-btn-outline.tw-btn-primary {\n --tw-text-opacity: 1;\n color: var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)));\n}\n.tw-btn-outline.tw-btn-primary.tw-btn-active {\n --tw-text-opacity: 1;\n color: var(--fallback-pc,oklch(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: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n --tw-bg-opacity: 0.2;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --tw-text-opacity: 0.2;\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: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));\n --tw-text-opacity: 1;\n color: var(--fallback-pc,oklch(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: var(--fallback-p,oklch(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: var(--fallback-b2,oklch(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 {\n box-shadow: none;\n}\n.tw-checkbox:focus-visible {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: var(--fallback-bc,oklch(var(--bc)/1));\n}\n.tw-checkbox:checked,\n .tw-checkbox[checked=\"true\"],\n .tw-checkbox[aria-checked=\"true\"] {\n background-repeat: no-repeat;\n animation: checkmark var(--animation-input, 0.2s) ease-out;\n background-color: var(--chkbg);\n background-image: linear-gradient(-45deg, transparent 65%, var(--chkbg) 65.99%),\n linear-gradient(45deg, transparent 75%, var(--chkbg) 75.99%),\n linear-gradient(-45deg, var(--chkbg) 40%, transparent 40.99%),\n linear-gradient(\n 45deg,\n var(--chkbg) 30%,\n var(--chkfg) 30.99%,\n var(--chkfg) 40%,\n transparent 40.99%\n ),\n linear-gradient(-45deg, var(--chkfg) 50%, var(--chkbg) 50.99%);\n}\n.tw-checkbox:indeterminate {\n --tw-bg-opacity: 1;\n background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));\n background-repeat: no-repeat;\n animation: checkmark var(--animation-input, 0.2s) ease-out;\n background-image: linear-gradient(90deg, transparent 80%, var(--chkbg) 80%),\n linear-gradient(-90deg, transparent 80%, var(--chkbg) 80%),\n linear-gradient(0deg, var(--chkbg) 43%, var(--chkfg) 43%, var(--chkfg) 57%, var(--chkbg) 57%);\n}\n.tw-checkbox-success {\n --chkbg: var(--fallback-su,oklch(var(--su)/1));\n --chkfg: var(--fallback-suc,oklch(var(--suc)/1));\n --tw-border-opacity: 1;\n border-color: var(--fallback-su,oklch(var(--su)/var(--tw-border-opacity)));\n}\n.tw-checkbox-success:focus-visible {\n outline-color: var(--fallback-su,oklch(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: var(--fallback-su,oklch(var(--su)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));\n --tw-text-opacity: 1;\n color: var(--fallback-suc,oklch(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: var(--fallback-bc,oklch(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.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-file-input:focus {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-file-input-disabled,\n .tw-file-input[disabled] {\n cursor: not-allowed;\n --tw-border-opacity: 1;\n border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));\n --tw-text-opacity: 0.2;\n}\n.tw-file-input-disabled::-moz-placeholder, .tw-file-input[disabled]::-moz-placeholder {\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-file-input-disabled::placeholder,\n .tw-file-input[disabled]::placeholder {\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-file-input-disabled::file-selector-button, .tw-file-input[disabled]::file-selector-button {\n --tw-border-opacity: 0;\n background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n --tw-bg-opacity: 0.2;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --tw-text-opacity: 0.2;\n}\n.tw-label-text {\n font-size: 0.875rem;\n line-height: 1.25rem;\n --tw-text-opacity: 1;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n}\n.tw-input input:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-input[list]::-webkit-calendar-picker-indicator {\n line-height: 1em;\n}\n.tw-input-bordered {\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-input:focus,\n .tw-input:focus-within {\n box-shadow: none;\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: var(--fallback-bc,oklch(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: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));\n color: var(--fallback-bc,oklch(var(--bc)/0.4));\n}\n.tw-input-disabled::-moz-placeholder, .tw-input:disabled::-moz-placeholder, .tw-input[disabled]::-moz-placeholder {\n color: var(--fallback-bc,oklch(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: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-input::-webkit-date-and-time-value {\n text-align: inherit;\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-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-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-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-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 --tw-bg-opacity: 1;\n background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));\n opacity: 0.1;\n margin: 0.5rem 1rem;\n height: 1px;\n}\n.tw-menu :where(li ul):before {\n position: absolute;\n bottom: 0.75rem;\n inset-inline-start: 0px;\n top: 0.75rem;\n width: 1px;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));\n opacity: 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 transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n border-radius: var(--rounded-btn, 0.5rem);\n padding-left: 1rem;\n padding-right: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n text-align: start;\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-timing-function: cubic-bezier(0, 0, 0.2, 1);\n transition-duration: 200ms;\n text-wrap: balance;\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: var(--fallback-bc,oklch(var(--bc)/0.1));\n --tw-text-opacity: 1;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-menu li > *:not(ul):not(.tw-menu-title):not(details):active,\n.tw-menu li > *:not(ul):not(.tw-menu-title):not(details).tw-active,\n.tw-menu li > details > summary:active {\n --tw-bg-opacity: 1;\n background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n --tw-text-opacity: 1;\n color: var(--fallback-nc,oklch(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: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));\n padding-left: 2rem;\n direction: ltr;\n}\n.tw-mockup-browser .tw-mockup-browser-toolbar .tw-input:before {\n content: \"\";\n position: absolute;\n left: 0.5rem;\n top: 50%;\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 left: 1.25rem;\n top: 50%;\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: #0006;\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 var(--fallback-b1,oklch(var(--b1)/1)) inset,\n 0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset;\n }\n\n 50% {\n box-shadow: 0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,\n 0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset;\n }\n\n 100% {\n box-shadow: 0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,\n 0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) 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-select-bordered {\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-select:focus {\n box-shadow: none;\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-select-disabled,\n .tw-select:disabled,\n .tw-select[disabled] {\n cursor: not-allowed;\n --tw-border-opacity: 1;\n border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));\n --tw-text-opacity: 0.2;\n}\n.tw-select-disabled::-moz-placeholder, .tw-select:disabled::-moz-placeholder, .tw-select[disabled]::-moz-placeholder {\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-select-disabled::placeholder,\n .tw-select:disabled::placeholder,\n .tw-select[disabled]::placeholder {\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-select-multiple,\n .tw-select[multiple],\n .tw-select[size].tw-select:not([size=\"1\"]) {\n background-image: none;\n padding-right: 1rem;\n}\n[dir=\"rtl\"] .tw-select {\n background-position: calc(0% + 12px) calc(1px + 50%),\n calc(0% + 16px) calc(1px + 50%);\n}\n@keyframes skeleton {\n\n from {\n background-position: 150%;\n }\n\n to {\n background-position: -50%;\n }\n}\n.tw-textarea-bordered {\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-textarea:focus {\n box-shadow: none;\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: var(--fallback-bc,oklch(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: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b2,oklch(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: var(--fallback-bc,oklch(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: var(--fallback-bc,oklch(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-btn-xs {\n height: 1.5rem;\n min-height: 1.5rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-size: 0.75rem;\n}\n.tw-btn-sm {\n height: 2rem;\n min-height: 2rem;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n font-size: 0.875rem;\n}\n.tw-btn-lg {\n height: 4rem;\n min-height: 4rem;\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n font-size: 1.125rem;\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[type=\"checkbox\"].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-tooltip-right:before {\n transform: translateY(-50%);\n top: 50%;\n left: var(--tooltip-offset);\n right: auto;\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: var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));\n outline-style: solid;\n outline-width: 2px;\n outline-color: var(--fallback-b1,oklch(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: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));\n outline-style: solid;\n outline-width: 2px;\n outline-color: var(--fallback-b1,oklch(var(--b1)/1));\n width: 15%;\n height: 15%;\n top: 7%;\n right: 7%;\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-bottom-right-radius: var(--rounded-box, 1rem);\n border-bottom-left-radius: var(--rounded-box, 1rem);\n border-top-left-radius: 0px;\n border-top-right-radius: 0px;\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-right-radius: var(--rounded-box, 1rem);\n border-bottom-left-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-top-left-radius: var(--rounded-box, 1rem);\n border-top-right-radius: var(--rounded-box, 1rem);\n border-bottom-right-radius: 0px;\n border-bottom-left-radius: 0px;\n}\n.tw-tooltip {\n position: relative;\n display: inline-block;\n text-align: center;\n --tooltip-tail: 0.1875rem;\n --tooltip-color: var(--fallback-n,oklch(var(--n)/1));\n --tooltip-text-color: var(--fallback-nc,oklch(var(--nc)/1));\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 opacity: 1;\n transition-delay: 75ms;\n}\n.tw-tooltip.tw-tooltip-open:after {\n opacity: 1;\n transition-delay: 75ms;\n}\n.tw-tooltip:hover:before {\n opacity: 1;\n transition-delay: 75ms;\n}\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-tooltip-right:after {\n transform: translateY(-50%);\n border-color: transparent var(--tooltip-color) transparent transparent;\n top: 50%;\n left: calc(var(--tooltip-tail-offset) + 0.0625rem);\n right: auto;\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-left-6 {\n left: -1.5rem;\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-1 {\n right: 0.25rem;\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-1 {\n top: 0.25rem;\n}\n.tw-top-14 {\n top: 3.5rem;\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-\\[2000\\] {\n z-index: 2000;\n}\n.tw-z-\\[699\\] {\n z-index: 699;\n}\n.tw-z-\\[999\\] {\n z-index: 999;\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-float-left {\n float: left;\n}\n.\\!tw-m-0 {\n margin: 0px !important;\n}\n.tw-m-1 {\n margin: 0.25rem;\n}\n.tw-m-2 {\n margin: 0.5rem;\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-4 {\n margin-left: 1rem;\n margin-right: 1rem;\n}\n.tw-mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.tw-my-2 {\n margin-top: 0.5rem;\n margin-bottom: 0.5rem;\n}\n.tw-my-auto {\n margin-top: auto;\n margin-bottom: auto;\n}\n.\\!tw-mb-2 {\n margin-bottom: 0.5rem !important;\n}\n.-tw-mr-6 {\n margin-right: -1.5rem;\n}\n.tw-mb-0 {\n margin-bottom: 0px;\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-mb-6 {\n margin-bottom: 1.5rem;\n}\n.tw-ml-2 {\n margin-left: 0.5rem;\n}\n.tw-ml-6 {\n margin-left: 1.5rem;\n}\n.tw-mr-2 {\n margin-right: 0.5rem;\n}\n.tw-mr-4 {\n margin-right: 1rem;\n}\n.tw-mt-1 {\n margin-top: 0.25rem;\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-20 {\n height: 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-\\[calc\\(100dvh-64px\\)\\] {\n height: calc(100dvh - 64px);\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-20 {\n width: 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-fit {\n width: -moz-fit-content;\n width: fit-content;\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-xl {\n max-width: 36rem;\n}\n.tw-max-w-xs {\n max-width: 20rem;\n}\n.tw-max-w-\\[200\\] {\n max-width: 200;\n}\n.tw-max-w-\\[200px\\] {\n max-width: 200px;\n}\n.tw-flex-1 {\n flex: 1 1 0%;\n}\n.tw-flex-none {\n flex: none;\n}\n.tw-grow {\n flex-grow: 1;\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-animate-none {\n animation: none;\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-self-center {\n align-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-box {\n border-radius: var(--rounded-box, 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: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));\n}\n.tw-bg-base-200 {\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));\n}\n.tw-bg-primary {\n --tw-bg-opacity: 1;\n background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));\n}\n.tw-bg-transparent {\n background-color: transparent;\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-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.tw-py-10 {\n padding-top: 2.5rem;\n padding-bottom: 2.5rem;\n}\n.tw-py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\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-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: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))) !important;\n}\n.\\!tw-text-error {\n --tw-text-opacity: 1 !important;\n color: var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity))) !important;\n}\n.tw-text-base-content {\n --tw-text-opacity: 1;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n}\n.tw-text-error {\n --tw-text-opacity: 1;\n color: var(--fallback-er,oklch(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: var(--fallback-p,oklch(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-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-none {\n transition-property: none;\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: var(--fallback-b1,oklch(var(--b1)/1));\n color: var(--fallback-bc,oklch(var(--bc)/1));\n\n\n}\n\n:root {\n\n --toastify-color-info: var(--fallback-in,oklch(var(--in)/1));\n --toastify-color-success: var(--fallback-su,oklch(var(--su)/1));\n --toastify-color-warning: var(--fallback-wa,oklch(var(--wa)/1));\n --toastify-color-error: var(--fallback-er,oklch(var(--er)/1));\n\n}\n\n.custom-file-upload{\n cursor: pointer;\n}\n\ninput[type=\"file\"] {\n display: none;\n}\n\n.custom-file-upload:hover .button{\n opacity: 0.8;\n}\n\n.custom-file-upload .button{\n transition: .5s ease;\n opacity: 0;\n position: absolute;\n transform: translate(8px, 8px);\n\n}\n\n.hover\\:tw-cursor-pointer:hover {\n cursor: pointer;\n}\n\n.hover\\:tw-bg-slate-300:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(203 213 225 / var(--tw-bg-opacity));\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: var(--fallback-p,oklch(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@media (prefers-color-scheme: dark) {\n\n .dark\\:tw-bg-zinc-800 {\n --tw-bg-opacity: 1;\n background-color: rgb(39 39 42 / var(--tw-bg-opacity));\n }\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}";
1389
2367
  styleInject(css_248z);
1390
2368
 
1391
- export { AppShell, AuthProvider, CardPage, Content, ItemForm, ItemView, Layer, LoginPage, Modal, PopupStartEndInput, PopupTextAreaInput, Quests, Settings, SideBar, SignupPage, StartEndView, Tags, TextAreaInput, TextInput, TextView, TitleCard, UtopiaMap, useAuth };
2369
+ export { AppShell, AuthProvider, CardPage, Content, ItemForm, ItemView, Layer, LoginPage, Modal, Permissions, PopupStartEndInput, PopupTextAreaInput, PopupTextInput, Quests, SelectBox, Settings, SideBar, SignupPage, StartEndView, Tags, TextAreaInput, TextInput, TextView, TitleCard, UtopiaMap, useAuth };
1392
2370
  //# sourceMappingURL=index.js.map