utopia-ui 3.0.0-alpha.3 → 3.0.0-alpha.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -5
- package/dist/Components/AppShell/AppShell.d.ts +2 -2
- package/dist/Components/AppShell/NavBar.d.ts +1 -2
- package/dist/Components/AppShell/SetAssetsApi.d.ts +5 -0
- package/dist/Components/AppShell/SideBar.d.ts +3 -1
- package/dist/Components/AppShell/hooks/useAssets.d.ts +13 -0
- package/dist/Components/Auth/useAuth.d.ts +2 -2
- package/dist/Components/Gaming/Modal.d.ts +1 -0
- package/dist/Components/Gaming/hooks/useQuests.d.ts +13 -0
- package/dist/Components/Input/SelectBox.d.ts +17 -0
- package/dist/Components/Input/TextInput.d.ts +2 -1
- package/dist/Components/Input/index.d.ts +1 -0
- package/dist/Components/Map/ItemForm.d.ts +14 -4
- package/dist/Components/Map/ItemView.d.ts +14 -4
- package/dist/Components/Map/Permissions.d.ts +7 -0
- package/dist/Components/Map/Subcomponents/AddButton.d.ts +2 -2
- package/dist/Components/Map/Subcomponents/Control.d.ts +4 -0
- package/dist/Components/Map/Subcomponents/FilterControl.d.ts +2 -0
- package/dist/Components/Map/Subcomponents/ItemFormPopup.d.ts +1 -2
- package/dist/Components/Map/Subcomponents/ItemPopupComponents/HeaderView.d.ts +3 -1
- package/dist/Components/Map/Subcomponents/ItemPopupComponents/PopupTextInput.d.ts +7 -1
- package/dist/Components/Map/Subcomponents/ItemViewPopup.d.ts +3 -1
- package/dist/Components/Map/Subcomponents/LayerControl.d.ts +2 -0
- package/dist/Components/Map/Subcomponents/QuestControl.d.ts +2 -0
- package/dist/Components/Map/Tags.d.ts +4 -3
- package/dist/Components/Map/UtopiaMap.d.ts +2 -2
- package/dist/Components/Map/hooks/useFilter.d.ts +32 -0
- package/dist/Components/Map/hooks/useItems.d.ts +4 -0
- package/dist/Components/Map/hooks/useLeafletRefs.d.ts +22 -0
- package/dist/Components/Map/hooks/usePermissions.d.ts +20 -0
- package/dist/Components/Map/hooks/useTags.d.ts +7 -1
- package/dist/Components/Map/hooks/useWindowDimension.d.ts +4 -0
- package/dist/Components/Map/index.d.ts +2 -0
- package/dist/Components/Profile/ColorPicker.d.ts +7 -0
- package/dist/Components/Profile/Settings.d.ts +2 -3
- package/dist/Components/Profile/useClickOutside.d.ts +2 -0
- package/dist/Components/Templates/CardPage.d.ts +5 -1
- package/dist/Components/Templates/DialogModal.d.ts +9 -0
- package/dist/Components/Templates/TitleCard.d.ts +2 -1
- package/dist/Components/Typography/Subtitle.d.ts +3 -3
- package/dist/Utils/DynamicHeroIcon.d.ts +2 -0
- package/dist/Utils/HashTagRegex.d.ts +1 -0
- package/dist/Utils/RandomColor.d.ts +1 -0
- package/dist/Utils/ReplaceURLs.d.ts +3 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1607 -590
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +25 -6
- package/package.json +10 -3
- package/dist/Components/Auth/authDirectus.d.ts +0 -24
- package/dist/Components/Input/InputText.d.ts +0 -13
- package/dist/Components/Map/ItemFormPopup.d.ts +0 -12
- package/dist/Components/Map/ItemViewPopup.d.ts +0 -8
- package/dist/Components/Map/Subcomponents/HeaderView.d.ts +0 -7
- package/dist/Components/Map/Subcomponents/StartEndView.d.ts +0 -6
- package/dist/Components/Map/Subcomponents/TextView.d.ts +0 -5
- package/dist/Components/TitleCard.d.ts +0 -9
- package/dist/Utils/HeighlightTags.d.ts +0 -2
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,
|
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,
|
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$
|
45
|
-
styleInject(css_248z$
|
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: hsl(var(--b1) / 1);\n color: hsl(var(--bc) / 1);\n\n }\n\n .leaflet-tooltip {\n border-radius: 1em;\n transition: opacity 500ms;\n transition-delay: 50ms;\n\n }";
|
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,44 +190,386 @@ var useAddLayer = function () {
|
|
183
190
|
return addLayer;
|
184
191
|
};
|
185
192
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
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
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
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
|
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 (
|
215
|
-
return
|
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.
|
463
|
+
action.permission,
|
220
464
|
], false);
|
221
465
|
else
|
222
466
|
return state;
|
223
|
-
case "
|
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
|
+
return (React.createElement("div", { className: "tw-dropdown tw-dropdown-top tw-dropdown-end tw-dropdown-hover tw-z-500 tw-absolute tw-right-4 tw-bottom-4" },
|
535
|
+
React.createElement("label", { tabIndex: 0, className: "tw-z-500 tw-btn tw-btn-circle tw-shadow tw-bg-base-100" },
|
536
|
+
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" },
|
537
|
+
React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4.5v15m7.5-7.5h-15" }))),
|
538
|
+
React.createElement("ul", { tabIndex: 0, className: "tw-dropdown-content tw-pr-1 tw-list-none" }, layers.map(function (layer) {
|
539
|
+
var _a;
|
540
|
+
return (((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && hasUserPermission(layer.api.collectionName, "create") && (React.createElement("li", { key: layer.name },
|
541
|
+
React.createElement("a", null,
|
542
|
+
React.createElement("div", { className: "tw-tooltip tw-tooltip-left", "data-tip": layer.menuText },
|
543
|
+
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); } },
|
544
|
+
React.createElement(DynamicHeroIcon, { type: 'solid', icon: layer.menuIcon })))))));
|
545
|
+
}))));
|
546
|
+
}
|
547
|
+
|
548
|
+
var ItemContext = createContext({
|
549
|
+
items: [],
|
550
|
+
addItem: function () { },
|
551
|
+
updateItem: function () { },
|
552
|
+
removeItem: function () { },
|
553
|
+
resetItems: function () { },
|
554
|
+
setItemsApi: function () { },
|
555
|
+
setItemsData: function () { },
|
556
|
+
});
|
557
|
+
function useItemsManager(initialItems) {
|
558
|
+
var _this = this;
|
559
|
+
var addLayer = useAddLayer();
|
560
|
+
var _a = useReducer(function (state, action) {
|
561
|
+
switch (action.type) {
|
562
|
+
case "ADD":
|
563
|
+
var exist = state.find(function (item) {
|
564
|
+
return item.id === action.item.id ? true : false;
|
565
|
+
});
|
566
|
+
if (!exist)
|
567
|
+
return __spreadArray(__spreadArray([], state, true), [
|
568
|
+
action.item,
|
569
|
+
], false);
|
570
|
+
else
|
571
|
+
return state;
|
572
|
+
case "UPDATE":
|
224
573
|
return state.map(function (item) {
|
225
574
|
if (item.id === action.item.id) {
|
226
575
|
return action.item;
|
@@ -230,23 +579,63 @@ function useItemsManager(initialItems) {
|
|
230
579
|
case "REMOVE":
|
231
580
|
return state.filter(function (item) { return item !== action.item; });
|
232
581
|
case "RESET":
|
233
|
-
return state.filter(function (item) { return item.layer.name !== action.layer.name; });
|
582
|
+
return state.filter(function (item) { var _a; return ((_a = item.layer) === null || _a === void 0 ? void 0 : _a.name) !== action.layer.name; });
|
234
583
|
default:
|
235
584
|
throw new Error();
|
236
585
|
}
|
237
586
|
}, initialItems), items = _a[0], dispatch = _a[1];
|
238
|
-
var
|
239
|
-
|
240
|
-
|
241
|
-
|
587
|
+
var setItemsApi = useCallback(function (layer) { return __awaiter(_this, void 0, void 0, function () {
|
588
|
+
var result;
|
589
|
+
var _a;
|
590
|
+
return __generator(this, function (_b) {
|
591
|
+
switch (_b.label) {
|
592
|
+
case 0:
|
593
|
+
((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && addLayer(layer);
|
594
|
+
return [4 /*yield*/, toast.promise(layer.api.getItems(), {
|
595
|
+
pending: "loading ".concat(layer.name, " ..."),
|
596
|
+
success: "".concat(layer.name, " loaded"),
|
597
|
+
error: {
|
598
|
+
render: function (_a) {
|
599
|
+
var data = _a.data;
|
600
|
+
return "".concat(data);
|
601
|
+
},
|
602
|
+
},
|
603
|
+
})];
|
604
|
+
case 1:
|
605
|
+
result = _b.sent();
|
606
|
+
if (result) {
|
607
|
+
result.map(function (item) {
|
608
|
+
dispatch({ type: "ADD", item: __assign(__assign({}, item), { layer: layer }) });
|
609
|
+
});
|
610
|
+
}
|
611
|
+
return [2 /*return*/];
|
612
|
+
}
|
242
613
|
});
|
243
|
-
}, []);
|
244
|
-
var
|
245
|
-
|
246
|
-
|
247
|
-
item: item,
|
614
|
+
}); }, []);
|
615
|
+
var setItemsData = useCallback(function (layer) {
|
616
|
+
var _a;
|
617
|
+
(_a = layer.data) === null || _a === void 0 ? void 0 : _a.map(function (item) {
|
618
|
+
dispatch({ type: "ADD", item: __assign(__assign({}, item), { layer: layer }) });
|
248
619
|
});
|
249
620
|
}, []);
|
621
|
+
var addItem = useCallback(function (item) { return __awaiter(_this, void 0, void 0, function () {
|
622
|
+
return __generator(this, function (_a) {
|
623
|
+
dispatch({
|
624
|
+
type: "ADD",
|
625
|
+
item: item,
|
626
|
+
});
|
627
|
+
return [2 /*return*/];
|
628
|
+
});
|
629
|
+
}); }, []);
|
630
|
+
var updateItem = useCallback(function (item) { return __awaiter(_this, void 0, void 0, function () {
|
631
|
+
return __generator(this, function (_a) {
|
632
|
+
dispatch({
|
633
|
+
type: "UPDATE",
|
634
|
+
item: item,
|
635
|
+
});
|
636
|
+
return [2 /*return*/];
|
637
|
+
});
|
638
|
+
}); }, []);
|
250
639
|
var removeItem = useCallback(function (item) {
|
251
640
|
dispatch({
|
252
641
|
type: "REMOVE",
|
@@ -259,7 +648,7 @@ function useItemsManager(initialItems) {
|
|
259
648
|
layer: layer
|
260
649
|
});
|
261
650
|
}, []);
|
262
|
-
return { items: items, updateItem: updateItem, addItem: addItem, removeItem: removeItem, resetItems: resetItems };
|
651
|
+
return { items: items, updateItem: updateItem, addItem: addItem, removeItem: removeItem, resetItems: resetItems, setItemsApi: setItemsApi, setItemsData: setItemsData };
|
263
652
|
}
|
264
653
|
var ItemsProvider = function (_a) {
|
265
654
|
var initialItems = _a.initialItems, children = _a.children;
|
@@ -281,51 +670,101 @@ var useRemoveItem = function () {
|
|
281
670
|
var removeItem = useContext(ItemContext).removeItem;
|
282
671
|
return removeItem;
|
283
672
|
};
|
284
|
-
var
|
285
|
-
var
|
286
|
-
return
|
673
|
+
var useSetItemsApi = function () {
|
674
|
+
var setItemsApi = useContext(ItemContext).setItemsApi;
|
675
|
+
return setItemsApi;
|
676
|
+
};
|
677
|
+
var useSetItemsData = function () {
|
678
|
+
var setItemsData = useContext(ItemContext).setItemsData;
|
679
|
+
return setItemsData;
|
287
680
|
};
|
288
681
|
|
682
|
+
var hashTagRegex = /(#+[a-zA-Z0-9A-Za-zÀ-ÖØ-öø-ʸ(_)]{1,})/g;
|
683
|
+
|
289
684
|
var TagContext = createContext({
|
290
685
|
tags: [],
|
291
686
|
addTag: function () { },
|
292
|
-
removeTag: function () { }
|
687
|
+
removeTag: function () { },
|
688
|
+
setTagApi: function () { },
|
689
|
+
setTagData: function () { },
|
690
|
+
getItemTags: function () { return []; }
|
293
691
|
});
|
294
692
|
function useTagsManager(initialTags) {
|
693
|
+
var _this = this;
|
295
694
|
var _a = useReducer(function (state, action) {
|
296
695
|
switch (action.type) {
|
297
696
|
case "ADD":
|
298
697
|
var exist = state.find(function (tag) {
|
299
|
-
return tag.id === action.tag.id ? true : false;
|
698
|
+
return tag.id.toLocaleLowerCase() === action.tag.id.toLocaleLowerCase() ? true : false;
|
300
699
|
});
|
301
700
|
if (!exist)
|
302
701
|
return __spreadArray(__spreadArray([], state, true), [
|
303
|
-
action.tag,
|
702
|
+
__assign(__assign({}, action.tag), { id: action.tag.id.toLocaleLowerCase() })
|
304
703
|
], false);
|
305
704
|
else
|
306
705
|
return state;
|
307
706
|
case "REMOVE":
|
308
707
|
return state.filter(function (_a) {
|
309
708
|
var id = _a.id;
|
310
|
-
return id !== action.id;
|
709
|
+
return id !== action.id.toLocaleLowerCase();
|
311
710
|
});
|
312
711
|
default:
|
313
712
|
throw new Error();
|
314
713
|
}
|
315
714
|
}, initialTags), tags = _a[0], dispatch = _a[1];
|
316
|
-
var
|
715
|
+
var _b = React.useState({}), api = _b[0], setApi = _b[1];
|
716
|
+
var setTagApi = useCallback(function (api) { return __awaiter(_this, void 0, void 0, function () {
|
717
|
+
var result;
|
718
|
+
return __generator(this, function (_a) {
|
719
|
+
switch (_a.label) {
|
720
|
+
case 0:
|
721
|
+
setApi(api);
|
722
|
+
return [4 /*yield*/, api.getItems()];
|
723
|
+
case 1:
|
724
|
+
result = _a.sent();
|
725
|
+
if (result) {
|
726
|
+
result.map(function (tag) {
|
727
|
+
tag.id = tag.id.toLocaleLowerCase();
|
728
|
+
dispatch({ type: "ADD", tag: tag });
|
729
|
+
});
|
730
|
+
}
|
731
|
+
return [2 /*return*/];
|
732
|
+
}
|
733
|
+
});
|
734
|
+
}); }, []);
|
735
|
+
var setTagData = useCallback(function (data) {
|
736
|
+
data.map(function (tag) {
|
737
|
+
tag.id = tag.id.toLocaleLowerCase();
|
738
|
+
dispatch({ type: "ADD", tag: tag });
|
739
|
+
});
|
740
|
+
}, []);
|
741
|
+
var addTag = function (tag) {
|
317
742
|
dispatch({
|
318
743
|
type: "ADD",
|
319
744
|
tag: tag,
|
320
745
|
});
|
321
|
-
|
746
|
+
if (!tags.some(function (t) { return t.id.toLocaleLowerCase() === tag.id.toLocaleLowerCase(); })) {
|
747
|
+
(api === null || api === void 0 ? void 0 : api.createItem) && api.createItem(tag);
|
748
|
+
}
|
749
|
+
};
|
322
750
|
var removeTag = useCallback(function (id) {
|
323
751
|
dispatch({
|
324
752
|
type: "REMOVE",
|
325
753
|
id: id,
|
326
754
|
});
|
755
|
+
(api === null || api === void 0 ? void 0 : api.deleteItem) && api.deleteItem(id);
|
327
756
|
}, []);
|
328
|
-
|
757
|
+
var getItemTags = useCallback(function (item) {
|
758
|
+
var itemTagStrings = item.text.toLocaleLowerCase().match(hashTagRegex);
|
759
|
+
var itemTags = [];
|
760
|
+
itemTagStrings === null || itemTagStrings === void 0 ? void 0 : itemTagStrings.map(function (tag) {
|
761
|
+
if (tags.find(function (t) { return t.id === tag.slice(1); })) {
|
762
|
+
itemTags.push(tags.find(function (t) { return t.id === tag.slice(1); }));
|
763
|
+
}
|
764
|
+
});
|
765
|
+
return itemTags;
|
766
|
+
}, [tags]);
|
767
|
+
return { tags: tags, addTag: addTag, removeTag: removeTag, setTagApi: setTagApi, setTagData: setTagData, getItemTags: getItemTags };
|
329
768
|
}
|
330
769
|
var TagsProvider = function (_a) {
|
331
770
|
var initialTags = _a.initialTags, children = _a.children;
|
@@ -338,49 +777,401 @@ var useTags = function () {
|
|
338
777
|
var useAddTag = function () {
|
339
778
|
var addTag = useContext(TagContext).addTag;
|
340
779
|
return addTag;
|
780
|
+
};
|
781
|
+
var useSetTagApi = function () {
|
782
|
+
var setTagApi = useContext(TagContext).setTagApi;
|
783
|
+
return setTagApi;
|
784
|
+
};
|
785
|
+
var useSetTagData = function () {
|
786
|
+
var setTagData = useContext(TagContext).setTagData;
|
787
|
+
return setTagData;
|
788
|
+
};
|
789
|
+
var useGetItemTags = function () {
|
790
|
+
var getItemTags = useContext(TagContext).getItemTags;
|
791
|
+
return getItemTags;
|
341
792
|
};
|
342
793
|
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
794
|
+
var FilterContext = createContext({
|
795
|
+
filterTags: [],
|
796
|
+
searchPhrase: "",
|
797
|
+
visibleLayers: [],
|
798
|
+
addFilterTag: function () { },
|
799
|
+
removeFilterTag: function () { },
|
800
|
+
resetFilterTags: function () { },
|
801
|
+
setSearchPhrase: function () { },
|
802
|
+
addVisibleLayer: function () { },
|
803
|
+
toggleVisibleLayer: function () { },
|
804
|
+
resetVisibleLayers: function () { },
|
805
|
+
isLayerVisible: function () { return true; }
|
806
|
+
});
|
807
|
+
function useFilterManager(initialTags) {
|
808
|
+
var _a = useReducer(function (state, action) {
|
809
|
+
switch (action.type) {
|
810
|
+
case "ADD_TAG":
|
811
|
+
var exist = state.find(function (tag) {
|
812
|
+
return tag.id === action.tag.id ? true : false;
|
813
|
+
});
|
814
|
+
if (!exist)
|
815
|
+
return __spreadArray(__spreadArray([], state, true), [
|
816
|
+
action.tag,
|
817
|
+
], false);
|
818
|
+
else
|
819
|
+
return state;
|
820
|
+
case "REMOVE_TAG":
|
821
|
+
return state.filter(function (_a) {
|
822
|
+
var id = _a.id;
|
823
|
+
return id !== action.id;
|
824
|
+
});
|
825
|
+
case "RESET_TAGS":
|
826
|
+
return initialTags;
|
827
|
+
default:
|
828
|
+
throw new Error();
|
829
|
+
}
|
830
|
+
}, initialTags), filterTags = _a[0], dispatchTags = _a[1];
|
831
|
+
var initialLayers = useLayers();
|
832
|
+
var _b = useReducer(function (state, action) {
|
833
|
+
switch (action.type) {
|
834
|
+
case "ADD_LAYER":
|
835
|
+
var exist1 = state.find(function (layer) {
|
836
|
+
return layer.name === action.layer.name ? true : false;
|
837
|
+
});
|
838
|
+
if (!exist1)
|
839
|
+
return __spreadArray(__spreadArray([], state, true), [
|
840
|
+
action.layer,
|
841
|
+
], false);
|
842
|
+
else
|
843
|
+
return state;
|
844
|
+
case "TOGGLE_LAYER":
|
845
|
+
var exist2 = state.some(function (layer) {
|
846
|
+
return layer.name === action.layer.name;
|
847
|
+
});
|
848
|
+
if (exist2)
|
849
|
+
return state.filter(function (_a) {
|
850
|
+
var name = _a.name;
|
851
|
+
return name != action.layer.name;
|
852
|
+
});
|
853
|
+
else
|
854
|
+
return __spreadArray(__spreadArray([], state, true), [action.layer], false);
|
855
|
+
case "RESET_LAYERS":
|
856
|
+
return initialLayers;
|
857
|
+
default:
|
858
|
+
throw new Error();
|
859
|
+
}
|
860
|
+
}, initialLayers), visibleLayers = _b[0], dispatchLayers = _b[1];
|
861
|
+
var _c = React.useState(""), searchPhrase = _c[0], searchPhraseSet = _c[1];
|
862
|
+
var addFilterTag = function (tag) {
|
863
|
+
dispatchTags({
|
864
|
+
type: "ADD_TAG",
|
865
|
+
tag: tag,
|
866
|
+
});
|
867
|
+
};
|
868
|
+
var removeFilterTag = useCallback(function (id) {
|
869
|
+
dispatchTags({
|
870
|
+
type: "REMOVE_TAG",
|
871
|
+
id: id,
|
872
|
+
});
|
873
|
+
}, []);
|
874
|
+
var resetFilterTags = useCallback(function () {
|
875
|
+
dispatchTags({
|
876
|
+
type: "RESET_TAGS",
|
877
|
+
});
|
878
|
+
}, []);
|
879
|
+
var addVisibleLayer = function (layer) {
|
880
|
+
dispatchLayers({
|
881
|
+
type: "ADD_LAYER",
|
882
|
+
layer: layer,
|
883
|
+
});
|
884
|
+
};
|
885
|
+
var toggleVisibleLayer = function (layer) {
|
886
|
+
dispatchLayers({
|
887
|
+
type: "TOGGLE_LAYER",
|
888
|
+
layer: layer,
|
889
|
+
});
|
890
|
+
};
|
891
|
+
var resetVisibleLayers = useCallback(function () {
|
892
|
+
dispatchLayers({
|
893
|
+
type: "RESET_LAYERS",
|
894
|
+
});
|
895
|
+
}, []);
|
896
|
+
var isLayerVisible = useCallback(function (layer) {
|
897
|
+
return visibleLayers.some(function (l) { return l.name === layer.name; });
|
898
|
+
}, [visibleLayers]);
|
899
|
+
var setSearchPhrase = useCallback(function (phrase) {
|
900
|
+
searchPhraseSet(phrase);
|
901
|
+
}, []);
|
902
|
+
return { filterTags: filterTags, addFilterTag: addFilterTag, removeFilterTag: removeFilterTag, resetFilterTags: resetFilterTags, setSearchPhrase: setSearchPhrase, searchPhrase: searchPhrase, visibleLayers: visibleLayers, toggleVisibleLayer: toggleVisibleLayer, resetVisibleLayers: resetVisibleLayers, isLayerVisible: isLayerVisible, addVisibleLayer: addVisibleLayer };
|
903
|
+
}
|
904
|
+
var FilterProvider = function (_a) {
|
905
|
+
var initialTags = _a.initialTags, children = _a.children;
|
906
|
+
return (React.createElement(FilterContext.Provider, { value: useFilterManager(initialTags) }, children));
|
907
|
+
};
|
908
|
+
var useFilterTags = function () {
|
909
|
+
var filterTags = useContext(FilterContext).filterTags;
|
910
|
+
return filterTags;
|
911
|
+
};
|
912
|
+
var useAddFilterTag = function () {
|
913
|
+
var addFilterTag = useContext(FilterContext).addFilterTag;
|
914
|
+
return addFilterTag;
|
915
|
+
};
|
916
|
+
var useRemoveFilterTag = function () {
|
917
|
+
var removeFilterTag = useContext(FilterContext).removeFilterTag;
|
918
|
+
return removeFilterTag;
|
919
|
+
};
|
920
|
+
var useResetFilterTags = function () {
|
921
|
+
var resetFilterTags = useContext(FilterContext).resetFilterTags;
|
922
|
+
return resetFilterTags;
|
923
|
+
};
|
924
|
+
var useSearchPhrase = function () {
|
925
|
+
var searchPhrase = useContext(FilterContext).searchPhrase;
|
926
|
+
return searchPhrase;
|
927
|
+
};
|
928
|
+
var useSetSearchPhrase = function () {
|
929
|
+
var setSearchPhrase = useContext(FilterContext).setSearchPhrase;
|
930
|
+
return setSearchPhrase;
|
931
|
+
};
|
932
|
+
var useAddVisibleLayer = function () {
|
933
|
+
var addVisibleLayer = useContext(FilterContext).addVisibleLayer;
|
934
|
+
return addVisibleLayer;
|
935
|
+
};
|
936
|
+
var useToggleVisibleLayer = function () {
|
937
|
+
var toggleVisibleLayer = useContext(FilterContext).toggleVisibleLayer;
|
938
|
+
return toggleVisibleLayer;
|
939
|
+
};
|
940
|
+
var useIsLayerVisible = function () {
|
941
|
+
var isLayerVisible = useContext(FilterContext).isLayerVisible;
|
942
|
+
return isLayerVisible;
|
943
|
+
};
|
944
|
+
|
945
|
+
function getWindowDimensions() {
|
946
|
+
var width = window.innerWidth, height = window.innerHeight;
|
947
|
+
return {
|
948
|
+
width: width,
|
949
|
+
height: height
|
950
|
+
};
|
951
|
+
}
|
952
|
+
function useWindowDimensions() {
|
953
|
+
var _a = useState(getWindowDimensions()), windowDimensions = _a[0], setWindowDimensions = _a[1];
|
954
|
+
useEffect(function () {
|
955
|
+
function handleResize() {
|
956
|
+
setWindowDimensions(getWindowDimensions());
|
957
|
+
}
|
958
|
+
window.addEventListener('resize', handleResize);
|
959
|
+
return function () { return window.removeEventListener('resize', handleResize); };
|
960
|
+
}, []);
|
961
|
+
return windowDimensions;
|
962
|
+
}
|
963
|
+
|
964
|
+
function capitalizeFirstLetter(string) {
|
965
|
+
return string.charAt(0).toUpperCase() + string.slice(1);
|
966
|
+
}
|
967
|
+
var FilterControl = function () {
|
968
|
+
var windowDimensions = useWindowDimensions();
|
969
|
+
/**
|
970
|
+
const [popupOpen, setPopupOpen] = useState<boolean>(false);
|
971
|
+
|
972
|
+
useMapEvents({
|
973
|
+
popupopen: (e) => {
|
974
|
+
console.log(e);
|
975
|
+
|
976
|
+
setPopupOpen(true);
|
977
|
+
},
|
978
|
+
popupclose: () => {
|
979
|
+
setPopupOpen(false);
|
350
980
|
}
|
351
|
-
}
|
352
|
-
|
353
|
-
|
981
|
+
})
|
982
|
+
*/
|
983
|
+
var filterTags = useFilterTags();
|
984
|
+
var removeFilterTag = useRemoveFilterTag();
|
985
|
+
var setSearchPhrase = useSetSearchPhrase();
|
986
|
+
return (React.createElement(React.Fragment, null, !(
|
987
|
+
//popupOpen &&
|
988
|
+
windowDimensions.height < 500) &&
|
989
|
+
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' },
|
990
|
+
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); } }),
|
991
|
+
React.createElement("div", { className: 'tw-flex tw-flex-wrap tw-mt-4' }, filterTags.map(function (tag) {
|
992
|
+
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 } },
|
993
|
+
React.createElement("div", { className: "tw-card-actions tw-justify-end" },
|
994
|
+
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")),
|
995
|
+
React.createElement("b", null,
|
996
|
+
"#",
|
997
|
+
capitalizeFirstLetter(tag.id)));
|
998
|
+
})))));
|
999
|
+
};
|
1000
|
+
|
1001
|
+
var LeafletRefsContext = createContext({
|
1002
|
+
leafletRefs: {},
|
1003
|
+
addMarker: function () { },
|
1004
|
+
addPopup: function () { },
|
1005
|
+
});
|
1006
|
+
function useLeafletRefsManager(initialLeafletRefs) {
|
1007
|
+
var _a = useReducer(function (state, action) {
|
1008
|
+
var _a, _b;
|
1009
|
+
switch (action.type) {
|
1010
|
+
case "ADD_MARKER":
|
1011
|
+
return __assign(__assign({}, state), (_a = {}, _a[action.item.id] = __assign(__assign({}, state[action.item.id]), { marker: action.marker, item: action.item }), _a));
|
1012
|
+
case "ADD_POPUP":
|
1013
|
+
return __assign(__assign({}, state), (_b = {}, _b[action.item.id] = __assign(__assign({}, state[action.item.id]), { popup: action.popup, item: action.item }), _b));
|
1014
|
+
default:
|
1015
|
+
throw new Error();
|
354
1016
|
}
|
355
|
-
});
|
356
|
-
|
1017
|
+
}, initialLeafletRefs), leafletRefs = _a[0], dispatch = _a[1];
|
1018
|
+
var addMarker = useCallback(function (item, marker) {
|
1019
|
+
dispatch({
|
1020
|
+
type: "ADD_MARKER",
|
1021
|
+
item: item,
|
1022
|
+
marker: marker
|
1023
|
+
});
|
1024
|
+
}, []);
|
1025
|
+
var addPopup = useCallback(function (item, popup) {
|
1026
|
+
dispatch({
|
1027
|
+
type: "ADD_POPUP",
|
1028
|
+
item: item,
|
1029
|
+
popup: popup
|
1030
|
+
});
|
1031
|
+
}, []);
|
1032
|
+
return { leafletRefs: leafletRefs, addMarker: addMarker, addPopup: addPopup };
|
357
1033
|
}
|
1034
|
+
var LeafletRefsProvider = function (_a) {
|
1035
|
+
var initialLeafletRefs = _a.initialLeafletRefs, children = _a.children;
|
1036
|
+
return (React.createElement(LeafletRefsContext.Provider, { value: useLeafletRefsManager(initialLeafletRefs) }, children));
|
1037
|
+
};
|
1038
|
+
var useLeafletRefs = function () {
|
1039
|
+
var leafletRefs = useContext(LeafletRefsContext).leafletRefs;
|
1040
|
+
return leafletRefs;
|
1041
|
+
};
|
1042
|
+
var useAddMarker = function () {
|
1043
|
+
var addMarker = useContext(LeafletRefsContext).addMarker;
|
1044
|
+
return addMarker;
|
1045
|
+
};
|
1046
|
+
var useAddPopup = function () {
|
1047
|
+
var addPopup = useContext(LeafletRefsContext).addPopup;
|
1048
|
+
return addPopup;
|
1049
|
+
};
|
1050
|
+
|
1051
|
+
function LayerControl() {
|
1052
|
+
var _a = React.useState(false), open = _a[0], setOpen = _a[1];
|
1053
|
+
var layers = useLayers();
|
1054
|
+
useEffect(function () {
|
1055
|
+
layers.map(function (layer) {
|
1056
|
+
return addVisibleLayer(layer);
|
1057
|
+
});
|
1058
|
+
}, [layers]);
|
1059
|
+
var isLayerVisible = useIsLayerVisible();
|
1060
|
+
var toggleVisibleLayer = useToggleVisibleLayer();
|
1061
|
+
var addVisibleLayer = useAddVisibleLayer();
|
1062
|
+
return (React.createElement("div", { className: "tw-card tw-bg-base-100 tw-shadow-xl ", onClick: function (e) { return e.stopPropagation(); } }, open ?
|
1063
|
+
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(); } },
|
1064
|
+
React.createElement("label", { className: "tw-btn tw-btn-sm tw-rounded-2xl tw-btn-circle tw-btn-ghost hover:tw-bg-transparent tw-absolute tw-right-0 tw-top-0 tw-bg-white tw-text-gray-600", onClick: function () { return setOpen(false); } },
|
1065
|
+
React.createElement("p", { className: 'tw-text-center ' }, "\u2715")),
|
1066
|
+
React.createElement("ul", { className: 'tw-flex-row' }, layers.map(function (layer) {
|
1067
|
+
return React.createElement("li", { key: layer.name },
|
1068
|
+
React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-1" },
|
1069
|
+
React.createElement("input", { type: "checkbox", className: "tw-checkbox tw-checkbox-xs tw-checkbox-success", checked: isLayerVisible(layer), onChange: function () { return toggleVisibleLayer(layer); } }),
|
1070
|
+
React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, layer.name)));
|
1071
|
+
})))
|
1072
|
+
:
|
1073
|
+
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 setOpen(true); } },
|
1074
|
+
React.createElement("svg", { version: "1.1", viewBox: "0 0 20 20", xmlns: "http://www.w3.org/2000/svg" },
|
1075
|
+
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" }),
|
1076
|
+
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" })))));
|
1077
|
+
}
|
1078
|
+
|
1079
|
+
var QuestContext = createContext({
|
1080
|
+
open: false,
|
1081
|
+
setQuestsOpen: function () { }
|
1082
|
+
});
|
1083
|
+
function useQuestsManager(initialOpen) {
|
1084
|
+
var _a = useState(initialOpen), open = _a[0], setOpen = _a[1];
|
1085
|
+
var setQuestsOpen = useCallback(function (questOpen) {
|
1086
|
+
setOpen(questOpen);
|
1087
|
+
}, []);
|
1088
|
+
return { open: open, setQuestsOpen: setQuestsOpen };
|
1089
|
+
}
|
1090
|
+
var QuestsProvider = function (_a) {
|
1091
|
+
var initialOpen = _a.initialOpen, children = _a.children;
|
1092
|
+
return (React.createElement(QuestContext.Provider, { value: useQuestsManager(initialOpen) }, children));
|
1093
|
+
};
|
1094
|
+
var useQuestsOpen = function () {
|
1095
|
+
var open = useContext(QuestContext).open;
|
1096
|
+
return open;
|
1097
|
+
};
|
1098
|
+
var useSetQuestOpen = function () {
|
1099
|
+
var setQuestsOpen = useContext(QuestContext).setQuestsOpen;
|
1100
|
+
return setQuestsOpen;
|
1101
|
+
};
|
1102
|
+
|
1103
|
+
function QuestControl() {
|
1104
|
+
var questsOpen = useQuestsOpen();
|
1105
|
+
var setQuestsOpen = useSetQuestOpen();
|
1106
|
+
return (React.createElement(React.Fragment, null, questsOpen ? "" :
|
1107
|
+
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(); } },
|
1108
|
+
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); } },
|
1109
|
+
React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", stroke: "currentColor", viewBox: "0 0 448 512" },
|
1110
|
+
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" }))))));
|
1111
|
+
}
|
1112
|
+
|
1113
|
+
var Control = function (_a) {
|
1114
|
+
var children = _a.children;
|
1115
|
+
return (React.createElement("div", { className: 'tw-absolute tw-bottom-4 tw-left-4 tw-z-[999] tw-flex-col' }, children));
|
1116
|
+
};
|
1117
|
+
|
358
1118
|
// for refreshing map on resize (needs to be implemented)
|
359
1119
|
var mapDivRef = React.createRef();
|
360
1120
|
function UtopiaMap(_a) {
|
361
1121
|
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
|
363
|
-
var
|
1122
|
+
var meta = document.getElementsByTagName('meta');
|
1123
|
+
var _f = useState(meta), metaTags = _f[0]; _f[1];
|
1124
|
+
function MapEventListener(props) {
|
1125
|
+
useMapEvents({
|
1126
|
+
click: function (e) {
|
1127
|
+
var _a, _b, _c;
|
1128
|
+
window.history.pushState({}, "", "/");
|
1129
|
+
document.title = document.title.split("-")[0];
|
1130
|
+
(_a = document.querySelector('meta[property="og:title"]')) === null || _a === void 0 ? void 0 : _a.setAttribute("content", document.title);
|
1131
|
+
(_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")));
|
1132
|
+
meta = metaTags;
|
1133
|
+
console.log(e.latlng.lat + ',' + e.latlng.lng);
|
1134
|
+
if (props.selectNewItemPosition != null) {
|
1135
|
+
props.setItemFormPopup({ layer: props.selectNewItemPosition, position: e.latlng });
|
1136
|
+
props.setSelectNewItemPosition(null);
|
1137
|
+
}
|
1138
|
+
},
|
1139
|
+
resize: function () {
|
1140
|
+
console.log("resize");
|
1141
|
+
},
|
1142
|
+
});
|
1143
|
+
return null;
|
1144
|
+
}
|
1145
|
+
var _g = useState(null), selectNewItemPosition = _g[0], setSelectNewItemPosition = _g[1];
|
1146
|
+
var _h = useState(null), itemFormPopup = _h[0], setItemFormPopup = _h[1];
|
1147
|
+
var clusterRef = React.useRef();
|
364
1148
|
return (React.createElement(LayersProvider, { initialLayers: [] },
|
365
1149
|
React.createElement(TagsProvider, { initialTags: [] },
|
366
|
-
React.createElement(
|
367
|
-
React.createElement(
|
368
|
-
React.createElement(
|
369
|
-
React.createElement(
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
1150
|
+
React.createElement(PermissionsProvider, { initialPermissions: [] },
|
1151
|
+
React.createElement(FilterProvider, { initialTags: [] },
|
1152
|
+
React.createElement(ItemsProvider, { initialItems: [] },
|
1153
|
+
React.createElement(LeafletRefsProvider, { initialLeafletRefs: {} },
|
1154
|
+
React.createElement("div", { className: (selectNewItemPosition != null ? "crosshair-cursor-enabled" : undefined) },
|
1155
|
+
React.createElement(MapContainer, { ref: mapDivRef, style: { height: height, width: width }, center: center, zoom: zoom, zoomControl: false },
|
1156
|
+
React.createElement(FilterControl, null),
|
1157
|
+
React.createElement(Control, null,
|
1158
|
+
React.createElement(QuestControl, null),
|
1159
|
+
React.createElement(LayerControl, null)),
|
1160
|
+
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" }),
|
1161
|
+
React.createElement(MarkerClusterGroup, { ref: clusterRef, showCoverageOnHover: true, chunkedLoading: true, maxClusterRadius: 50, removeOutsideVisibleBounds: false }, React.Children.toArray(children).map(function (child) {
|
1162
|
+
return React.isValidElement(child) ?
|
1163
|
+
React.cloneElement(child, { setItemFormPopup: setItemFormPopup, itemFormPopup: itemFormPopup, clusterRef: clusterRef }) : child;
|
1164
|
+
})),
|
1165
|
+
React.createElement(MapEventListener, { setSelectNewItemPosition: setSelectNewItemPosition, selectNewItemPosition: selectNewItemPosition, setItemFormPopup: setItemFormPopup })),
|
1166
|
+
React.createElement(AddButton, { setSelectNewItemPosition: setSelectNewItemPosition }),
|
1167
|
+
selectNewItemPosition != null &&
|
1168
|
+
React.createElement("div", { className: "tw-button tw-z-1000 tw-absolute tw-right-5 tw-top-4 tw-drop-shadow-md" },
|
1169
|
+
React.createElement("div", { className: "tw-alert tw-bg-base-100 tw-text-base-content" },
|
1170
|
+
React.createElement("div", null,
|
1171
|
+
React.createElement("span", null,
|
1172
|
+
"Select ",
|
1173
|
+
selectNewItemPosition.name,
|
1174
|
+
" position!"))))))))))));
|
384
1175
|
}
|
385
1176
|
|
386
1177
|
var createSvg = function (shape, markerColor, borderColor) {
|
@@ -398,6 +1189,12 @@ var addIcon = function (icon) {
|
|
398
1189
|
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
1190
|
case "calendar-days-solid":
|
400
1191
|
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>';
|
1192
|
+
case "user":
|
1193
|
+
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>';
|
1194
|
+
case "fire":
|
1195
|
+
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>';
|
1196
|
+
case "tree":
|
1197
|
+
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
1198
|
default:
|
402
1199
|
return "";
|
403
1200
|
}
|
@@ -414,87 +1211,168 @@ var MarkerIconFactory = function (shape, color1, color2, icon) {
|
|
414
1211
|
};
|
415
1212
|
|
416
1213
|
function HeaderView(_a) {
|
417
|
-
var
|
1214
|
+
var _this = this;
|
1215
|
+
var _b, _c, _d;
|
1216
|
+
var item = _a.item, title = _a.title, avatar = _a.avatar, setItemFormPopup = _a.setItemFormPopup;
|
1217
|
+
var _e = React.useState(false), loading = _e[0], setLoading = _e[1];
|
418
1218
|
var removeItem = useRemoveItem();
|
419
1219
|
var map = useMap();
|
420
|
-
var
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
1220
|
+
var hasUserPermission = useHasUserPermission();
|
1221
|
+
var removeItemFromMap = function (event) { return __awaiter(_this, void 0, void 0, function () {
|
1222
|
+
var success, error_1;
|
1223
|
+
var _a, _b;
|
1224
|
+
return __generator(this, function (_c) {
|
1225
|
+
switch (_c.label) {
|
1226
|
+
case 0:
|
1227
|
+
setLoading(true);
|
1228
|
+
success = false;
|
1229
|
+
_c.label = 1;
|
1230
|
+
case 1:
|
1231
|
+
_c.trys.push([1, 3, , 4]);
|
1232
|
+
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))];
|
1233
|
+
case 2:
|
1234
|
+
_c.sent();
|
1235
|
+
success = true;
|
1236
|
+
return [3 /*break*/, 4];
|
1237
|
+
case 3:
|
1238
|
+
error_1 = _c.sent();
|
1239
|
+
toast.error(error_1.toString());
|
1240
|
+
return [3 /*break*/, 4];
|
1241
|
+
case 4:
|
1242
|
+
if (success) {
|
1243
|
+
removeItem(item);
|
1244
|
+
toast.success("Item deleted");
|
1245
|
+
}
|
1246
|
+
setLoading(false);
|
1247
|
+
map.closePopup();
|
1248
|
+
event.stopPropagation();
|
1249
|
+
return [2 /*return*/];
|
1250
|
+
}
|
1251
|
+
});
|
1252
|
+
}); };
|
425
1253
|
var openEditPopup = function (event) {
|
426
1254
|
event.stopPropagation();
|
427
1255
|
map.closePopup();
|
428
1256
|
if (setItemFormPopup)
|
429
1257
|
setItemFormPopup({ position: new LatLng(item.position.coordinates[1], item.position.coordinates[0]), layer: item.layer, item: item, setItemFormPopup: setItemFormPopup });
|
430
1258
|
};
|
1259
|
+
console.log(title);
|
431
1260
|
return (React.createElement("div", { className: 'tw-grid tw-grid-cols-6 tw-pb-2' },
|
432
1261
|
React.createElement("div", { className: 'tw-col-span-5' },
|
433
|
-
React.createElement("
|
434
|
-
|
1262
|
+
React.createElement("div", { className: "tw-flex tw-flex-row" },
|
1263
|
+
avatar ?
|
1264
|
+
React.createElement("div", { className: "tw-w-10 tw-rounded-full" },
|
1265
|
+
React.createElement("img", { className: "tw-rounded-full", src: avatar }))
|
1266
|
+
:
|
1267
|
+
"",
|
1268
|
+
React.createElement("b", { className: "tw-text-xl tw-font-bold ".concat(avatar ? "tw-ml-2 tw-mt-1" : "") }, title ? title : item.name))),
|
1269
|
+
React.createElement("div", { className: 'tw-col-span-1' }, ((_b = item.layer) === null || _b === void 0 ? void 0 : _b.api) &&
|
435
1270
|
React.createElement("div", { className: "tw-dropdown tw-dropdown-bottom" },
|
436
|
-
React.createElement("label", { tabIndex: 0, className: "tw-
|
1271
|
+
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
1272
|
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
1273
|
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
1274
|
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:
|
1275
|
+
item.layer.api.updateItem && hasUserPermission((_c = item.layer.api) === null || _c === void 0 ? void 0 : _c.collectionName, "update") && React.createElement("li", null,
|
1276
|
+
React.createElement("a", { className: "!tw-text-base-content", onClick: openEditPopup },
|
442
1277
|
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
1278
|
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-
|
446
|
-
|
447
|
-
React.createElement("
|
1279
|
+
item.layer.api.deleteItem && hasUserPermission((_d = item.layer.api) === null || _d === void 0 ? void 0 : _d.collectionName, "delete") && React.createElement("li", null,
|
1280
|
+
React.createElement("a", { className: ' !tw-text-error', onClick: removeItemFromMap }, loading ? React.createElement("span", { className: "tw-loading tw-loading-spinner tw-loading-sm" })
|
1281
|
+
:
|
1282
|
+
React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
|
1283
|
+
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
1284
|
}
|
449
1285
|
|
450
|
-
|
451
|
-
|
452
|
-
|
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;
|
1286
|
+
var urlRegex = /(^| )(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,10}(:[0-9]{1,10})?(\/.*)?$/gm;
|
1287
|
+
var mailRegex = /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi;
|
1288
|
+
function fixUrls(message) {
|
454
1289
|
message = message.replace(urlRegex, function (url) {
|
455
1290
|
var hyperlink = url.replace(' ', '');
|
456
1291
|
if (!hyperlink.match('^https?:\/\/')) {
|
457
|
-
hyperlink = '
|
1292
|
+
hyperlink = 'https://' + hyperlink;
|
458
1293
|
}
|
459
|
-
return
|
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>';
|
1294
|
+
return hyperlink;
|
475
1295
|
});
|
476
1296
|
return message;
|
477
1297
|
}
|
478
1298
|
|
479
1299
|
var TextView = function (_a) {
|
480
1300
|
var item = _a.item;
|
481
|
-
var
|
482
|
-
|
1301
|
+
var tags = useTags();
|
1302
|
+
useAddTag();
|
1303
|
+
var addFilterTag = useAddFilterTag();
|
1304
|
+
var replacedText;
|
1305
|
+
if (item && item.text)
|
1306
|
+
replacedText = fixUrls(item.text);
|
1307
|
+
replacedText = reactStringReplace(replacedText, /(https?:\/\/\S+)/g, function (url, i) {
|
1308
|
+
var shortUrl = url;
|
1309
|
+
if (url.match('^https:\/\/')) {
|
1310
|
+
shortUrl = url.split('https://')[1];
|
1311
|
+
}
|
1312
|
+
if (url.match('^http:\/\/')) {
|
1313
|
+
shortUrl = url.split('http://')[1];
|
1314
|
+
}
|
1315
|
+
return (React.createElement("a", { key: i.toString + item.id + url, href: url, target: "_blank", rel: "noopener noreferrer" }, shortUrl));
|
1316
|
+
});
|
1317
|
+
replacedText = reactStringReplace(replacedText, mailRegex, function (url, i) {
|
1318
|
+
return (React.createElement("a", { key: i.toString + item.id + url, href: "mailto:".concat(url), target: "_blank", rel: "noopener noreferrer" }, url));
|
1319
|
+
});
|
1320
|
+
replacedText = reactStringReplace(replacedText, hashTagRegex, function (match, i) {
|
1321
|
+
var tag = tags.find(function (t) { return t.id.toLowerCase() == match.slice(1).toLowerCase(); });
|
1322
|
+
return (React.createElement("a", { style: { color: tag ? tag.color : '#aaa', fontWeight: 'bold', cursor: 'pointer' }, key: tag ? tag.id + item.id + i : i, onClick: function () {
|
1323
|
+
addFilterTag(tag);
|
1324
|
+
// map.fitBounds(items)
|
1325
|
+
// map.closePopup();
|
1326
|
+
} }, match));
|
1327
|
+
});
|
1328
|
+
return (React.createElement("p", { style: { whiteSpace: "pre-wrap" }, className: "!tw-m-0 !tw-mb-2" }, replacedText));
|
483
1329
|
};
|
484
1330
|
|
485
|
-
var
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
1331
|
+
var AssetContext = createContext({
|
1332
|
+
api: {},
|
1333
|
+
setAssetsApi: function () { }
|
1334
|
+
});
|
1335
|
+
function useAssetsManager() {
|
1336
|
+
var _a = useState({}), api = _a[0], setApi = _a[1];
|
1337
|
+
var setAssetsApi = useCallback(function (api) {
|
1338
|
+
setApi(api);
|
1339
|
+
}, []);
|
1340
|
+
return { api: api, setAssetsApi: setAssetsApi };
|
1341
|
+
}
|
1342
|
+
var AssetsProvider = function (_a) {
|
1343
|
+
var children = _a.children;
|
1344
|
+
return (React.createElement(AssetContext.Provider, { value: useAssetsManager() }, children));
|
1345
|
+
};
|
1346
|
+
var useAssetApi = function () {
|
1347
|
+
var api = useContext(AssetContext).api;
|
1348
|
+
return api;
|
1349
|
+
};
|
1350
|
+
var useSetAssetApi = function () {
|
1351
|
+
var setAssetsApi = useContext(AssetContext).setAssetsApi;
|
1352
|
+
return setAssetsApi;
|
1353
|
+
};
|
1354
|
+
|
1355
|
+
function getValue(obj, path) {
|
1356
|
+
if (obj) {
|
1357
|
+
for (var i = 0, path = path.split('.'), len = path.length; i < len; i++) {
|
1358
|
+
obj = obj[path[i]];
|
1359
|
+
}
|
1360
|
+
return obj;
|
1361
|
+
}
|
1362
|
+
}
|
1363
|
+
var ItemViewPopup = React.forwardRef(function (props, ref) {
|
1364
|
+
var assetsApi = useAssetApi();
|
1365
|
+
return (React.createElement(Popup, { ref: ref, maxHeight: 377, minWidth: 275, maxWidth: 275, autoPanPadding: [20, 80] },
|
1366
|
+
React.createElement("div", { className: 'tw-bg-base-100 tw-text-base-content' },
|
1367
|
+
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 }),
|
1368
|
+
React.createElement("div", { className: 'tw-overflow-y-auto tw-max-h-72' }, props.children ?
|
1369
|
+
React.Children.toArray(props.children).map(function (child) {
|
492
1370
|
return React.isValidElement(child) ?
|
493
1371
|
React.cloneElement(child, { item: props.item }) : "";
|
494
1372
|
})
|
495
1373
|
:
|
496
1374
|
React.createElement(TextView, { item: props.item })))));
|
497
|
-
};
|
1375
|
+
});
|
498
1376
|
|
499
1377
|
var Geometry = /** @class */ (function () {
|
500
1378
|
function Geometry(lng, lat) {
|
@@ -506,33 +1384,93 @@ var Geometry = /** @class */ (function () {
|
|
506
1384
|
|
507
1385
|
function TextAreaInput(_a) {
|
508
1386
|
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;
|
1387
|
+
var ref = useRef(null);
|
1388
|
+
// prevent react18 from calling useEffect twice
|
1389
|
+
var init = useRef(false);
|
1390
|
+
var tags = useTags();
|
1391
|
+
var values = [];
|
1392
|
+
tags.map(function (tag) {
|
1393
|
+
values.push({ key: tag.id, value: tag.id, color: tag.color });
|
1394
|
+
});
|
1395
|
+
var tribute = new Tribute({
|
1396
|
+
containerClass: 'tw-z-500 tw-bg-white tw-p-2 tw-rounded-lg tw-shadow',
|
1397
|
+
selectClass: 'tw-font-bold',
|
1398
|
+
trigger: "#",
|
1399
|
+
values: values,
|
1400
|
+
noMatchTemplate: function () {
|
1401
|
+
return "";
|
1402
|
+
},
|
1403
|
+
menuItemTemplate: function (item) {
|
1404
|
+
return "<span style=\"color: ".concat(item.original.color, "; padding: 5px; boarder-radius: 3px;\">#").concat(item.string, "</span>");
|
1405
|
+
}
|
1406
|
+
});
|
1407
|
+
useEffect(function () {
|
1408
|
+
if (!init.current) {
|
1409
|
+
if (ref.current) {
|
1410
|
+
tribute.attach(ref.current);
|
1411
|
+
}
|
1412
|
+
init.current = true;
|
1413
|
+
}
|
1414
|
+
}, [ref]);
|
509
1415
|
return (React.createElement("div", { className: "tw-form-control tw-w-full ".concat(containerStyle ? containerStyle : "") },
|
510
1416
|
labelTitle ? React.createElement("label", { className: "tw-label" },
|
511
1417
|
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); } })));
|
1418
|
+
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
1419
|
}
|
514
1420
|
|
515
|
-
function
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
1421
|
+
var randomColor = function () {
|
1422
|
+
return hsvToHex((Math.random() + golden_ratio_conjugate) % 1, 0.8, 0.7);
|
1423
|
+
};
|
1424
|
+
var golden_ratio_conjugate = 0.618033988749895;
|
1425
|
+
function hsvToHex(h, s, v) {
|
1426
|
+
var r, g, b;
|
1427
|
+
var i = (Math.floor(h * 6));
|
1428
|
+
var f = h * 6 - i;
|
1429
|
+
var p = v * (1 - s);
|
1430
|
+
var q = v * (1 - f * s);
|
1431
|
+
var t = v * (1 - (1 - f) * s);
|
1432
|
+
switch (i % 6) {
|
1433
|
+
case 0:
|
1434
|
+
r = v, g = t, b = p;
|
1435
|
+
break;
|
1436
|
+
case 1:
|
1437
|
+
r = q, g = v, b = p;
|
1438
|
+
break;
|
1439
|
+
case 2:
|
1440
|
+
r = p, g = v, b = t;
|
1441
|
+
break;
|
1442
|
+
case 3:
|
1443
|
+
r = p, g = q, b = v;
|
1444
|
+
break;
|
1445
|
+
case 4:
|
1446
|
+
r = t, g = p, b = v;
|
1447
|
+
break;
|
1448
|
+
case 5:
|
1449
|
+
r = v, g = p, b = q;
|
1450
|
+
break;
|
1451
|
+
}
|
1452
|
+
return rgbToHex(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255));
|
1453
|
+
}
|
1454
|
+
var rgbToHex = function (r, g, b) { return '#' + [r, g, b].map(function (x) {
|
1455
|
+
var hex = x.toString(16);
|
1456
|
+
return hex.length === 1 ? '0' + hex : hex;
|
1457
|
+
}).join(''); };
|
523
1458
|
|
524
1459
|
function ItemFormPopup(props) {
|
525
1460
|
var _this = this;
|
526
|
-
var formRef = useRef(null);
|
527
1461
|
var _a = useState(false), spinner = _a[0], setSpinner = _a[1];
|
1462
|
+
var formRef = useRef(null);
|
528
1463
|
var map = useMap();
|
529
1464
|
var addItem = useAddItem();
|
530
1465
|
var updateItem = useUpdateItem();
|
1466
|
+
var tags = useTags();
|
1467
|
+
var addTag = useAddTag();
|
1468
|
+
var resetFilterTags = useResetFilterTags();
|
531
1469
|
var handleSubmit = function (evt) { return __awaiter(_this, void 0, void 0, function () {
|
532
|
-
var formItem;
|
533
|
-
var _a, _b;
|
534
|
-
return __generator(this, function (
|
535
|
-
switch (
|
1470
|
+
var formItem, success, error_1, success, error_2;
|
1471
|
+
var _a, _b, _c;
|
1472
|
+
return __generator(this, function (_d) {
|
1473
|
+
switch (_d.label) {
|
536
1474
|
case 0:
|
537
1475
|
formItem = {};
|
538
1476
|
Array.from(evt.target).forEach(function (input) {
|
@@ -543,33 +1481,57 @@ function ItemFormPopup(props) {
|
|
543
1481
|
formItem['position'] = new Geometry(props.position.lng, props.position.lat);
|
544
1482
|
evt.preventDefault();
|
545
1483
|
setSpinner(true);
|
546
|
-
|
547
|
-
|
548
|
-
|
1484
|
+
(_a = formItem.text.toLocaleLowerCase().match(hashTagRegex)) === null || _a === void 0 ? void 0 : _a.map(function (tag) {
|
1485
|
+
if (!tags.find(function (t) { return t.id.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase(); })) {
|
1486
|
+
addTag({ id: tag.slice(1).toLocaleLowerCase(), color: randomColor() });
|
1487
|
+
}
|
1488
|
+
});
|
1489
|
+
if (!props.item) return [3 /*break*/, 5];
|
1490
|
+
success = false;
|
1491
|
+
_d.label = 1;
|
549
1492
|
case 1:
|
550
|
-
|
551
|
-
|
552
|
-
formItem['layer'] = props.layer;
|
553
|
-
return [4 /*yield*/, updateItem(formItem)];
|
1493
|
+
_d.trys.push([1, 3, , 4]);
|
1494
|
+
return [4 /*yield*/, ((_b = props.layer.api) === null || _b === void 0 ? void 0 : _b.updateItem(__assign(__assign({}, formItem), { id: props.item.id })))];
|
554
1495
|
case 2:
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
return [3 /*break*/, 6];
|
1496
|
+
_d.sent();
|
1497
|
+
success = true;
|
1498
|
+
return [3 /*break*/, 4];
|
559
1499
|
case 3:
|
560
|
-
|
561
|
-
|
1500
|
+
error_1 = _d.sent();
|
1501
|
+
toast.error(error_1.toString());
|
1502
|
+
return [3 /*break*/, 4];
|
562
1503
|
case 4:
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
case 5:
|
568
|
-
_c.sent();
|
1504
|
+
if (success) {
|
1505
|
+
updateItem(__assign(__assign({}, props.item), formItem));
|
1506
|
+
toast.success("Item updated");
|
1507
|
+
}
|
569
1508
|
setSpinner(false);
|
570
1509
|
map.closePopup();
|
571
|
-
|
1510
|
+
return [3 /*break*/, 10];
|
1511
|
+
case 5:
|
1512
|
+
success = false;
|
1513
|
+
_d.label = 6;
|
572
1514
|
case 6:
|
1515
|
+
_d.trys.push([6, 8, , 9]);
|
1516
|
+
return [4 /*yield*/, ((_c = props.layer.api) === null || _c === void 0 ? void 0 : _c.createItem(__assign(__assign({}, formItem), { id: crypto.randomUUID() })))];
|
1517
|
+
case 7:
|
1518
|
+
_d.sent();
|
1519
|
+
success = true;
|
1520
|
+
return [3 /*break*/, 9];
|
1521
|
+
case 8:
|
1522
|
+
error_2 = _d.sent();
|
1523
|
+
toast.error(error_2.toString());
|
1524
|
+
return [3 /*break*/, 9];
|
1525
|
+
case 9:
|
1526
|
+
if (success) {
|
1527
|
+
addItem(__assign(__assign({}, formItem), { id: crypto.randomUUID(), layer: props.layer }));
|
1528
|
+
toast.success("New item created");
|
1529
|
+
resetFilterTags();
|
1530
|
+
}
|
1531
|
+
setSpinner(false);
|
1532
|
+
map.closePopup();
|
1533
|
+
_d.label = 10;
|
1534
|
+
case 10:
|
573
1535
|
props.setItemFormPopup(null);
|
574
1536
|
return [2 /*return*/];
|
575
1537
|
}
|
@@ -583,15 +1545,15 @@ function ItemFormPopup(props) {
|
|
583
1545
|
useEffect(function () {
|
584
1546
|
resetPopup();
|
585
1547
|
}, [props.position]);
|
586
|
-
return (React.createElement(Popup, { minWidth: 275, maxWidth: 275, autoPanPadding: [20,
|
1548
|
+
return (React.createElement(Popup, { minWidth: 275, maxWidth: 275, autoPanPadding: [20, 80], eventHandlers: {
|
587
1549
|
remove: function () {
|
588
1550
|
setTimeout(function () {
|
589
1551
|
resetPopup();
|
590
1552
|
}, 100);
|
591
1553
|
}
|
592
1554
|
}, 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-
|
1555
|
+
React.createElement("form", { ref: formRef, onReset: resetPopup, autoComplete: 'off', onSubmit: function (e) { return handleSubmit(e); } },
|
1556
|
+
props.item ? React.createElement("div", { className: 'tw-h-3' })
|
595
1557
|
:
|
596
1558
|
React.createElement("div", { className: 'tw-flex tw-justify-center' },
|
597
1559
|
React.createElement("b", { className: "tw-text-xl tw-font-bold" },
|
@@ -601,103 +1563,146 @@ function ItemFormPopup(props) {
|
|
601
1563
|
props.children ?
|
602
1564
|
React.Children.toArray(props.children).map(function (child) {
|
603
1565
|
return React.isValidElement(child) ?
|
604
|
-
React.cloneElement(child, { item: props.item }) : "";
|
1566
|
+
React.cloneElement(child, { item: props.item, key: props.position.toString() }) : "";
|
605
1567
|
})
|
606
1568
|
:
|
607
1569
|
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' })),
|
1570
|
+
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
1571
|
React.createElement("div", { className: 'tw-flex tw-justify-center' },
|
610
1572
|
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
1573
|
}
|
612
1574
|
|
613
1575
|
var Layer = function (props) {
|
614
|
-
var _a;
|
615
|
-
var
|
616
|
-
var
|
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
|
-
};
|
1576
|
+
var _a, _b;
|
1577
|
+
var _c = useState(null); _c[0]; var setItemFormPopup = _c[1];
|
1578
|
+
var filterTags = useFilterTags();
|
631
1579
|
var items = useItems();
|
632
|
-
var
|
633
|
-
var
|
634
|
-
var
|
1580
|
+
var setItemsApi = useSetItemsApi();
|
1581
|
+
var setItemsData = useSetItemsData();
|
1582
|
+
var getItemTags = useGetItemTags();
|
1583
|
+
var addMarker = useAddMarker();
|
1584
|
+
var addPopup = useAddPopup();
|
1585
|
+
var leafletRefs = useLeafletRefs();
|
1586
|
+
var location = useLocation();
|
1587
|
+
var searchPhrase = useSearchPhrase();
|
1588
|
+
var map = useMap();
|
1589
|
+
var isLayerVisible = useIsLayerVisible();
|
635
1590
|
useEffect(function () {
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
1591
|
+
props.data && setItemsData(props);
|
1592
|
+
props.api && setItemsApi(props);
|
1593
|
+
}, [props.data, props.api]);
|
1594
|
+
useMapEvents({
|
1595
|
+
popupopen: function (e) {
|
1596
|
+
var _a, _b;
|
1597
|
+
var item = (_a = Object.entries(leafletRefs).find(function (r) { return r[1].popup == e.popup; })) === null || _a === void 0 ? void 0 : _a[1].item;
|
1598
|
+
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) {
|
1599
|
+
window.history.pushState({}, "", "/".concat(props.name, "/").concat(item.id));
|
1600
|
+
document.title = document.title.split("-")[0] + " - " + item.name;
|
642
1601
|
}
|
643
|
-
}
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
1602
|
+
},
|
1603
|
+
});
|
1604
|
+
var openPopup = function () {
|
1605
|
+
var _a, _b, _c, _d, _e, _f;
|
1606
|
+
if (window.location.pathname.split("/").length <= 2 || window.location.pathname.split("/")[2] === "") {
|
1607
|
+
map.closePopup();
|
1608
|
+
}
|
1609
|
+
else {
|
1610
|
+
if (window.location.pathname.split("/")[1] == props.name) {
|
1611
|
+
if (window.location.pathname.split("/")[2]) {
|
1612
|
+
var id = window.location.pathname.split("/")[2];
|
1613
|
+
var marker_1 = (_a = leafletRefs[id]) === null || _a === void 0 ? void 0 : _a.marker;
|
1614
|
+
if (marker_1 && marker_1 != null) {
|
1615
|
+
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 () {
|
1616
|
+
marker_1.openPopup();
|
1617
|
+
}));
|
1618
|
+
var item = (_d = leafletRefs[id]) === null || _d === void 0 ? void 0 : _d.item;
|
1619
|
+
document.title = document.title.split("-")[0] + " - " + item.name;
|
1620
|
+
(_e = document.querySelector('meta[property="og:title"]')) === null || _e === void 0 ? void 0 : _e.setAttribute("content", item.name);
|
1621
|
+
(_f = document.querySelector('meta[property="og:description"]')) === null || _f === void 0 ? void 0 : _f.setAttribute("content", item.text);
|
649
1622
|
}
|
650
|
-
}
|
1623
|
+
}
|
651
1624
|
}
|
652
|
-
});
|
653
|
-
if (props.api || props.api) {
|
654
|
-
addLayer(props);
|
655
1625
|
}
|
656
|
-
}
|
1626
|
+
};
|
1627
|
+
useEffect(function () {
|
1628
|
+
openPopup();
|
1629
|
+
}, [leafletRefs, location]);
|
657
1630
|
return (React.createElement(React.Fragment, null,
|
658
1631
|
items &&
|
659
|
-
((
|
660
|
-
|
1632
|
+
((_b = (_a = items.
|
1633
|
+
filter(function (item) { return item.text; }).
|
1634
|
+
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) {
|
1635
|
+
return filterTags.length == 0 ? item : filterTags.every(function (tag) { return getItemTags(item).some(function (filterTag) { return filterTag.id === tag.id; }); });
|
1636
|
+
})) === null || _b === void 0 ? void 0 : _b.filter(function (item) {
|
1637
|
+
return searchPhrase === ''
|
1638
|
+
? item :
|
1639
|
+
item.name.toLowerCase().includes(searchPhrase.toLowerCase()) || item.text.toLowerCase().includes(searchPhrase.toLowerCase());
|
1640
|
+
}).filter(function (item) { return item.layer && isLayerVisible(item.layer); }).map(function (item) {
|
1641
|
+
var tags = getItemTags(item);
|
661
1642
|
var color1 = "#666";
|
662
1643
|
var color2 = "RGBA(35, 31, 32, 0.2)";
|
663
|
-
if (tags[0]) {
|
1644
|
+
if (tags && tags[0]) {
|
664
1645
|
color1 = tags[0].color;
|
665
1646
|
}
|
666
|
-
if (tags[1]) {
|
1647
|
+
if (tags && tags[1]) {
|
667
1648
|
color2 = tags[1].color;
|
668
1649
|
}
|
669
|
-
return (React.createElement(Marker, {
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
1650
|
+
return (React.createElement(Marker, { ref: function (r) {
|
1651
|
+
if (!(item.id in leafletRefs))
|
1652
|
+
r && addMarker(item, r);
|
1653
|
+
}, icon: MarkerIconFactory(props.markerShape, color1, color2, props.markerIcon), key: item.id, position: [item.position.coordinates[1], item.position.coordinates[0]] },
|
1654
|
+
(props.children && React.Children.toArray(props.children).some(function (child) { return React.isValidElement(child) && child.props.__TYPE === "ItemView"; }) ?
|
1655
|
+
React.Children.toArray(props.children).map(function (child) {
|
1656
|
+
return React.isValidElement(child) && child.props.__TYPE === "ItemView" ?
|
1657
|
+
React.createElement(ItemViewPopup, { ref: function (r) {
|
1658
|
+
if (!(item.id in leafletRefs))
|
1659
|
+
r && addPopup(item, r);
|
1660
|
+
}, key: item.id + item.name, itemTitleField: props.itemTitleField, itemAvatarField: props.itemAvatarField, item: item, setItemFormPopup: props.setItemFormPopup }, child)
|
1661
|
+
: "";
|
1662
|
+
})
|
1663
|
+
:
|
1664
|
+
React.createElement(React.Fragment, null,
|
1665
|
+
React.createElement(ItemViewPopup, { key: item.id + item.name, ref: function (r) {
|
1666
|
+
if (!(item.id in leafletRefs))
|
1667
|
+
r && addPopup(item, r);
|
1668
|
+
}, item: item, itemTitleField: props.itemTitleField, itemAvatarField: props.itemAvatarField, setItemFormPopup: props.setItemFormPopup }))),
|
1669
|
+
React.createElement(Tooltip, { offset: [0, -38], direction: 'top' }, item.name)));
|
678
1670
|
})),
|
679
1671
|
props.itemFormPopup && props.itemFormPopup.layer.name == props.name &&
|
680
|
-
(props.children && React.Children.toArray(props.children).some(function (
|
1672
|
+
(props.children && React.Children.toArray(props.children).some(function (child) { return React.isValidElement(child) && child.props.__TYPE === "ItemForm"; }) ?
|
681
1673
|
React.Children.toArray(props.children).map(function (child) {
|
682
1674
|
var _a;
|
683
|
-
return React.isValidElement(child) &&
|
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
|
1675
|
+
return React.isValidElement(child) && child.props.__TYPE === "ItemForm" ?
|
1676
|
+
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
1677
|
: "";
|
686
1678
|
})
|
687
1679
|
:
|
688
1680
|
React.createElement(React.Fragment, null,
|
689
|
-
React.createElement(ItemFormPopup, { position: props.itemFormPopup.position, layer: props.itemFormPopup.layer, setItemFormPopup: setItemFormPopup, item: props.itemFormPopup.item
|
1681
|
+
React.createElement(ItemFormPopup, { position: props.itemFormPopup.position, layer: props.itemFormPopup.layer, setItemFormPopup: setItemFormPopup, item: props.itemFormPopup.item })))));
|
690
1682
|
};
|
691
1683
|
|
692
1684
|
function Tags(_a) {
|
693
|
-
var data = _a.data;
|
694
|
-
var
|
1685
|
+
var data = _a.data, api = _a.api;
|
1686
|
+
var setTagData = useSetTagData();
|
1687
|
+
var setTagApi = useSetTagApi();
|
695
1688
|
useEffect(function () {
|
696
|
-
data
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
1689
|
+
data && setTagData(data);
|
1690
|
+
api && setTagApi(api);
|
1691
|
+
}, [api, data]);
|
1692
|
+
return (React.createElement(React.Fragment, null));
|
1693
|
+
}
|
1694
|
+
|
1695
|
+
function Permissions(_a) {
|
1696
|
+
var data = _a.data, api = _a.api, adminRole = _a.adminRole;
|
1697
|
+
var setPermissionData = useSetPermissionData();
|
1698
|
+
var setPermissionApi = useSetPermissionApi();
|
1699
|
+
var setAdminRole = useSetAdminRole();
|
1700
|
+
var user = useAuth().user;
|
1701
|
+
useEffect(function () {
|
1702
|
+
adminRole && setAdminRole(adminRole);
|
1703
|
+
data && setPermissionData(data);
|
1704
|
+
api && setPermissionApi(api);
|
1705
|
+
}, [api, data, adminRole, user]);
|
701
1706
|
return (React.createElement(React.Fragment, null));
|
702
1707
|
}
|
703
1708
|
|
@@ -708,6 +1713,13 @@ var ItemForm = function (_a) {
|
|
708
1713
|
return React.isValidElement(child) ?
|
709
1714
|
React.cloneElement(child, { item: item, test: "test" }) : "";
|
710
1715
|
}) : ""));
|
1716
|
+
};
|
1717
|
+
ItemForm.propTypes = {
|
1718
|
+
children: PropTypes.node,
|
1719
|
+
__TYPE: PropTypes.string,
|
1720
|
+
};
|
1721
|
+
ItemForm.defaultProps = {
|
1722
|
+
__TYPE: 'ItemForm',
|
711
1723
|
};
|
712
1724
|
|
713
1725
|
var ItemView = function (_a) {
|
@@ -715,10 +1727,39 @@ var ItemView = function (_a) {
|
|
715
1727
|
return (React.createElement("div", null, children ?
|
716
1728
|
React.Children.toArray(children).map(function (child) {
|
717
1729
|
return React.isValidElement(child) ?
|
718
|
-
React.cloneElement(child, { item: item
|
1730
|
+
React.cloneElement(child, { item: item }) : "";
|
719
1731
|
}) : ""));
|
1732
|
+
};
|
1733
|
+
ItemView.propTypes = {
|
1734
|
+
children: PropTypes.node,
|
1735
|
+
__TYPE: PropTypes.string,
|
1736
|
+
};
|
1737
|
+
ItemView.defaultProps = {
|
1738
|
+
__TYPE: 'ItemView',
|
720
1739
|
};
|
721
1740
|
|
1741
|
+
function SelectBox(props) {
|
1742
|
+
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;
|
1743
|
+
var _a = useState(defaultValue || ""), value = _a[0], setValue = _a[1];
|
1744
|
+
var updateValue = function (newValue) {
|
1745
|
+
updateFormValue(newValue);
|
1746
|
+
setValue(newValue);
|
1747
|
+
};
|
1748
|
+
return (React.createElement("div", { className: "tw-inline-block ".concat(containerStyle) },
|
1749
|
+
labelTitle ?
|
1750
|
+
React.createElement("label", { className: "tw-label ".concat(labelStyle) },
|
1751
|
+
React.createElement("div", { className: "tw-label-text" },
|
1752
|
+
labelTitle,
|
1753
|
+
labelDescription && React.createElement("div", { className: "tw-tooltip tw-tooltip-right", "data-tip": labelDescription },
|
1754
|
+
React.createElement(InformationCircleIcon, { className: 'tw-w-4 tw-h-4' }))))
|
1755
|
+
: "",
|
1756
|
+
React.createElement("select", { className: "tw-select tw-select-bordered tw-w-full", value: value, onChange: function (e) { return updateValue(e.target.value); } },
|
1757
|
+
React.createElement("option", { disabled: true, value: "PLACEHOLDER" }, placeholder),
|
1758
|
+
options.map(function (o, k) {
|
1759
|
+
return React.createElement("option", { value: o.value || o.name, key: k }, o.name);
|
1760
|
+
}))));
|
1761
|
+
}
|
1762
|
+
|
722
1763
|
var PopupTextAreaInput = function (_a) {
|
723
1764
|
var dataField = _a.dataField, placeholder = _a.placeholder, style = _a.style, item = _a.item;
|
724
1765
|
return (React.createElement(TextAreaInput, { defaultValue: (item === null || item === void 0 ? void 0 : item.text) ? item.text : "", dataField: dataField, placeholder: placeholder, inputStyle: style }));
|
@@ -727,13 +1768,18 @@ var PopupTextAreaInput = function (_a) {
|
|
727
1768
|
var PopupStartEndInput = function (_a) {
|
728
1769
|
var item = _a.item;
|
729
1770
|
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) : "" })));
|
1771
|
+
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' }),
|
1772
|
+
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' })));
|
1773
|
+
};
|
1774
|
+
|
1775
|
+
var PopupTextInput = function (_a) {
|
1776
|
+
var dataField = _a.dataField, placeholder = _a.placeholder, style = _a.style, item = _a.item;
|
1777
|
+
return (React.createElement(TextInput, { defaultValue: (item === null || item === void 0 ? void 0 : item.text) ? item.text : "", dataField: dataField, placeholder: placeholder, inputStyle: style }));
|
732
1778
|
};
|
733
1779
|
|
734
1780
|
var StartEndView = function (_a) {
|
735
1781
|
var item = _a.item;
|
736
|
-
return (React.createElement("div", { className: "tw-flex tw-flex-row tw-mb-4
|
1782
|
+
return (React.createElement("div", { className: "tw-flex tw-flex-row tw-mb-4" },
|
737
1783
|
React.createElement("div", { className: "tw-basis-2/5 tw-flex tw-flex-row" },
|
738
1784
|
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
1785
|
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 +1815,7 @@ var DialogModal = function (_a) {
|
|
769
1815
|
document.body.classList.remove("modal-open");
|
770
1816
|
}
|
771
1817
|
}, [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) {
|
1818
|
+
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
1819
|
return ref.current && !isClickInsideRectangle(e, ref.current) && onClose();
|
774
1820
|
} },
|
775
1821
|
React.createElement("div", { className: "tw-card-body tw-p-2" },
|
@@ -780,13 +1826,14 @@ var DialogModal = function (_a) {
|
|
780
1826
|
|
781
1827
|
function NavBar(_a) {
|
782
1828
|
var _this = this;
|
783
|
-
var appName = _a.appName
|
1829
|
+
var appName = _a.appName;
|
784
1830
|
var _b = useState(false), signupOpen = _b[0], setSignupOpen = _b[1];
|
785
1831
|
var _c = useState(false), loginOpen = _c[0], setLoginOpen = _c[1];
|
786
1832
|
var _d = useState(""), email = _d[0], setEmail = _d[1];
|
787
1833
|
var _e = useState(""), userName = _e[0], setUserName = _e[1];
|
788
1834
|
var _f = useState(""), password = _f[0], setPassword = _f[1];
|
789
1835
|
var _g = useAuth(), isAuthenticated = _g.isAuthenticated, user = _g.user, login = _g.login, register = _g.register, loading = _g.loading, logout = _g.logout, token = _g.token;
|
1836
|
+
var navigate = useNavigate();
|
790
1837
|
var onRegister = function () { return __awaiter(_this, void 0, void 0, function () {
|
791
1838
|
return __generator(this, function (_a) {
|
792
1839
|
switch (_a.label) {
|
@@ -794,13 +1841,19 @@ function NavBar(_a) {
|
|
794
1841
|
success: {
|
795
1842
|
render: function (_a) {
|
796
1843
|
var data = _a.data;
|
1844
|
+
navigate("/");
|
797
1845
|
return "Hi ".concat(data === null || data === void 0 ? void 0 : data.first_name);
|
798
1846
|
},
|
799
1847
|
// other options
|
800
1848
|
icon: "✌️",
|
801
1849
|
},
|
802
|
-
error:
|
803
|
-
|
1850
|
+
error: {
|
1851
|
+
render: function (_a) {
|
1852
|
+
var data = _a.data;
|
1853
|
+
return "".concat(data);
|
1854
|
+
},
|
1855
|
+
},
|
1856
|
+
pending: 'creating new user ...'
|
804
1857
|
})];
|
805
1858
|
case 1:
|
806
1859
|
_a.sent();
|
@@ -816,13 +1869,19 @@ function NavBar(_a) {
|
|
816
1869
|
success: {
|
817
1870
|
render: function (_a) {
|
818
1871
|
var data = _a.data;
|
1872
|
+
navigate("/");
|
819
1873
|
return "Hi ".concat(data === null || data === void 0 ? void 0 : data.first_name);
|
820
1874
|
},
|
821
1875
|
// other options
|
822
1876
|
icon: "✌️",
|
823
1877
|
},
|
824
|
-
error:
|
825
|
-
|
1878
|
+
error: {
|
1879
|
+
render: function (_a) {
|
1880
|
+
var data = _a.data;
|
1881
|
+
return "".concat(data);
|
1882
|
+
},
|
1883
|
+
},
|
1884
|
+
pending: 'logging in ...'
|
826
1885
|
})];
|
827
1886
|
case 1:
|
828
1887
|
_a.sent();
|
@@ -840,8 +1899,13 @@ function NavBar(_a) {
|
|
840
1899
|
// other options
|
841
1900
|
icon: "👋",
|
842
1901
|
},
|
843
|
-
error:
|
844
|
-
|
1902
|
+
error: {
|
1903
|
+
render: function (_a) {
|
1904
|
+
var data = _a.data;
|
1905
|
+
return "".concat(data);
|
1906
|
+
},
|
1907
|
+
},
|
1908
|
+
pending: 'logging out ..'
|
845
1909
|
});
|
846
1910
|
};
|
847
1911
|
return (React.createElement(React.Fragment, null,
|
@@ -857,15 +1921,15 @@ function NavBar(_a) {
|
|
857
1921
|
React.createElement(QuestionMarkIcon, { className: "tw-h-5 tw-w-5" })))),
|
858
1922
|
isAuthenticated ?
|
859
1923
|
React.createElement("div", { className: "tw-flex-none" },
|
860
|
-
user.avatar ? React.createElement("div", { className: "tw-avatar" },
|
1924
|
+
(user === null || user === void 0 ? void 0 : user.avatar) ? React.createElement("div", { className: "tw-avatar" },
|
861
1925
|
React.createElement("div", { className: "tw-w-10 tw-rounded-full" },
|
862
|
-
React.createElement("img", { src: "https://
|
1926
|
+
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
1927
|
React.createElement("div", { className: 'tw-ml-2 tw-mr-2' }, user === null || user === void 0 ? void 0 : user.first_name),
|
864
1928
|
React.createElement("div", { className: "tw-dropdown tw-dropdown-end" },
|
865
1929
|
React.createElement("label", { tabIndex: 0, className: "tw-btn tw-btn-ghost tw-btn-square" },
|
866
1930
|
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
1931
|
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-[
|
1932
|
+
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
1933
|
React.createElement("li", null,
|
870
1934
|
React.createElement(Link, { to: "/settings" }, "Settings")),
|
871
1935
|
React.createElement("li", null,
|
@@ -879,11 +1943,11 @@ function NavBar(_a) {
|
|
879
1943
|
React.createElement("label", { tabIndex: 1, className: "tw-btn tw-btn-ghost md:tw-hidden" },
|
880
1944
|
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
1945
|
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-
|
1946
|
+
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
1947
|
React.createElement("li", null,
|
884
|
-
React.createElement("a", { onClick: function () {
|
1948
|
+
React.createElement("a", { onClick: function () { setLoginOpen(true); } }, "Login")),
|
885
1949
|
React.createElement("li", null,
|
886
|
-
React.createElement("a", { onClick: function () { return setSignupOpen(true); } }, "Sign
|
1950
|
+
React.createElement("a", { onClick: function () { return setSignupOpen(true); } }, "Sign Up")))))),
|
887
1951
|
React.createElement(DialogModal, { title: "Login", isOpened: loginOpen, onClose: function () { return setLoginOpen(false); } },
|
888
1952
|
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
1953
|
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 +1961,24 @@ function NavBar(_a) {
|
|
897
1961
|
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
1962
|
}
|
899
1963
|
|
1964
|
+
var SetAssetsApi = function (_a) {
|
1965
|
+
var assetsApi = _a.assetsApi;
|
1966
|
+
var setAssetsApi = useSetAssetApi();
|
1967
|
+
useEffect(function () {
|
1968
|
+
setAssetsApi(assetsApi);
|
1969
|
+
}, [assetsApi]);
|
1970
|
+
return (React.createElement(React.Fragment, null));
|
1971
|
+
};
|
1972
|
+
|
900
1973
|
function AppShell(_a) {
|
901
|
-
var appName = _a.appName,
|
1974
|
+
var appName = _a.appName, children = _a.children, assetsApi = _a.assetsApi;
|
902
1975
|
return (React.createElement(BrowserRouter, null,
|
903
|
-
React.createElement(
|
904
|
-
|
905
|
-
|
1976
|
+
React.createElement(AssetsProvider, null,
|
1977
|
+
React.createElement(SetAssetsApi, { assetsApi: assetsApi }),
|
1978
|
+
React.createElement(QuestsProvider, { initialOpen: false },
|
1979
|
+
React.createElement(ToastContainer, { position: "top-right", autoClose: 2000, hideProgressBar: true, newestOnTop: false, closeOnClick: true, rtl: false, pauseOnFocusLoss: true, draggable: true, pauseOnHover: true, theme: "light" }),
|
1980
|
+
React.createElement(NavBar, { appName: appName }),
|
1981
|
+
React.createElement("div", { id: "app-content", className: "tw-flex tw-!pl-[77px]" }, children)))));
|
906
1982
|
}
|
907
1983
|
|
908
1984
|
function SidebarSubmenu(_a) {
|
@@ -933,7 +2009,7 @@ function SidebarSubmenu(_a) {
|
|
933
2009
|
}
|
934
2010
|
|
935
2011
|
function SideBar(_a) {
|
936
|
-
var routes = _a.routes;
|
2012
|
+
var routes = _a.routes, bottomRoutes = _a.bottomRoutes;
|
937
2013
|
// prevent react18 from calling useEffect twice
|
938
2014
|
var init = useRef(false);
|
939
2015
|
var location = useLocation();
|
@@ -952,8 +2028,8 @@ function SideBar(_a) {
|
|
952
2028
|
init.current = true;
|
953
2029
|
}
|
954
2030
|
}, []);
|
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-
|
956
|
-
React.createElement("div", { className: 'tw-flex tw-flex-col tw-h-
|
2031
|
+
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-[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" },
|
2032
|
+
React.createElement("div", { className: 'tw-flex tw-flex-col tw-h-[calc(100dvh-64px)]' },
|
957
2033
|
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
2034
|
return (React.createElement("li", { className: "", key: k }, route.submenu ?
|
959
2035
|
React.createElement(SidebarSubmenu, __assign({}, route)) :
|
@@ -968,8 +2044,23 @@ function SideBar(_a) {
|
|
968
2044
|
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
2045
|
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
2046
|
})),
|
971
|
-
React.createElement("div", { id: "slim-toggler", className: 'tw-w-full
|
972
|
-
React.createElement(
|
2047
|
+
React.createElement("div", { id: "slim-toggler", className: 'tw-w-full tw-flex-1 tw-grid tw-place-items-end', "aria-haspopup": "true" },
|
2048
|
+
React.createElement("div", { className: 'tw-w-full' },
|
2049
|
+
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) {
|
2050
|
+
return (React.createElement("li", { className: "", key: k }, route.submenu ?
|
2051
|
+
React.createElement(SidebarSubmenu, __assign({}, route)) :
|
2052
|
+
(React.createElement(NavLink, { end: true, target: route.blank ? "_blank" : "_self", to: route.path, className: function (_a) {
|
2053
|
+
var isActive = _a.isActive;
|
2054
|
+
return "".concat(isActive ? 'tw-font-semibold tw-bg-base-200 !tw-rounded-none' : 'tw-font-normal !tw-rounded-none');
|
2055
|
+
}, onClick: function () {
|
2056
|
+
if (screen.width < 640 && !slim)
|
2057
|
+
instance.toggle();
|
2058
|
+
} },
|
2059
|
+
route.icon,
|
2060
|
+
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),
|
2061
|
+
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))));
|
2062
|
+
})),
|
2063
|
+
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
2064
|
}
|
974
2065
|
|
975
2066
|
function Content(_a) {
|
@@ -977,349 +2068,270 @@ function Content(_a) {
|
|
977
2068
|
return (React.createElement("div", { className: 'tw-flex tw-flex-col tw-w-full tw-relative' }, children));
|
978
2069
|
}
|
979
2070
|
|
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
2071
|
function Subtitle(_a) {
|
1217
2072
|
var styleClass = _a.styleClass, children = _a.children;
|
1218
2073
|
return (React.createElement("div", { className: "tw-text-xl tw-font-semibold ".concat(styleClass) }, children));
|
1219
2074
|
}
|
1220
2075
|
|
1221
2076
|
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-
|
2077
|
+
var title = _a.title, children = _a.children, topMargin = _a.topMargin, TopSideButtons = _a.TopSideButtons, className = _a.className;
|
2078
|
+
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
2079
|
React.createElement(Subtitle, { styleClass: TopSideButtons ? "tw-inline-block" : "" },
|
1225
2080
|
title,
|
1226
2081
|
TopSideButtons && React.createElement("div", { className: "tw-inline-block tw-float-right" }, TopSideButtons)),
|
1227
2082
|
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)));
|
2083
|
+
React.createElement("div", { className: 'tw-h-full tw-bg-transparent tw-w-full tw-pb-6 tw-bg-base-100' }, children)));
|
1229
2084
|
}
|
1230
2085
|
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
1237
|
-
|
1238
|
-
|
1239
|
-
|
2086
|
+
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 }";
|
2087
|
+
styleInject(css_248z$1);
|
2088
|
+
|
2089
|
+
// Improved version of https://usehooks.com/useOnClickOutside/
|
2090
|
+
var useClickOutside = function (ref, handler) {
|
2091
|
+
useEffect(function () {
|
2092
|
+
var startedInside = false;
|
2093
|
+
var startedWhenMounted = false;
|
2094
|
+
var listener = function (event) {
|
2095
|
+
// Do nothing if `mousedown` or `touchstart` started inside ref element
|
2096
|
+
if (startedInside || !startedWhenMounted)
|
2097
|
+
return;
|
2098
|
+
// Do nothing if clicking ref's element or descendent elements
|
2099
|
+
if (!ref.current || ref.current.contains(event.target))
|
2100
|
+
return;
|
2101
|
+
handler(event);
|
2102
|
+
};
|
2103
|
+
var validateEventStart = function (event) {
|
2104
|
+
startedWhenMounted = ref.current;
|
2105
|
+
startedInside = ref.current && ref.current.contains(event.target);
|
2106
|
+
};
|
2107
|
+
document.addEventListener("mousedown", validateEventStart);
|
2108
|
+
document.addEventListener("touchstart", validateEventStart);
|
2109
|
+
document.addEventListener("click", listener);
|
2110
|
+
return function () {
|
2111
|
+
document.removeEventListener("mousedown", validateEventStart);
|
2112
|
+
document.removeEventListener("touchstart", validateEventStart);
|
2113
|
+
document.removeEventListener("click", listener);
|
2114
|
+
};
|
2115
|
+
}, [ref, handler]);
|
2116
|
+
};
|
2117
|
+
|
2118
|
+
var ColorPicker = function (_a) {
|
2119
|
+
var color = _a.color, onChange = _a.onChange, className = _a.className;
|
2120
|
+
var popover = useRef(null);
|
2121
|
+
var _b = useState(false), isOpen = _b[0], toggle = _b[1];
|
2122
|
+
var close = useCallback(function () { return toggle(false); }, []);
|
2123
|
+
useClickOutside(popover, close);
|
2124
|
+
return (React.createElement("div", { className: "picker ".concat(className) },
|
2125
|
+
React.createElement("div", { className: "swatch", style: { backgroundColor: color }, onClick: function () { return toggle(true); } }),
|
2126
|
+
isOpen && (React.createElement("div", { className: "popover", ref: popover },
|
2127
|
+
React.createElement(HexColorPicker, { color: color, onChange: onChange })))));
|
2128
|
+
};
|
2129
|
+
|
2130
|
+
function Settings() {
|
2131
|
+
var _a = useAuth(), user = _a.user, updateUser = _a.updateUser, loading = _a.loading, token = _a.token;
|
2132
|
+
var _b = useState(""), id = _b[0], setId = _b[1];
|
2133
|
+
var _c = useState(""), name = _c[0], setName = _c[1];
|
2134
|
+
var _d = useState(""), text = _d[0], setText = _d[1];
|
2135
|
+
var _e = useState(""), email = _e[0], setEmail = _e[1];
|
2136
|
+
var _f = useState(""), password = _f[0], setPassword = _f[1];
|
2137
|
+
var _g = useState(""), avatar = _g[0], setAvatar = _g[1];
|
2138
|
+
var _h = useState(""), color = _h[0], setColor = _h[1];
|
2139
|
+
var _j = useState(false), passwordChanged = _j[0], setPasswordChanged = _j[1];
|
2140
|
+
var _k = useState(), crop = _k[0], setCrop = _k[1];
|
2141
|
+
var _l = useState(""), image = _l[0], setImage = _l[1];
|
2142
|
+
var _m = useState(false), cropModalOpen = _m[0], setCropModalOpen = _m[1];
|
2143
|
+
var _o = useState(false), cropping = _o[0], setCropping = _o[1];
|
2144
|
+
var assetsApi = useAssetApi();
|
2145
|
+
var navigate = useNavigate();
|
1240
2146
|
useEffect(function () {
|
1241
2147
|
setId((user === null || user === void 0 ? void 0 : user.id) ? user.id : "");
|
1242
2148
|
setName((user === null || user === void 0 ? void 0 : user.first_name) ? user.first_name : "");
|
1243
2149
|
setText((user === null || user === void 0 ? void 0 : user.description) ? user.description : "");
|
1244
2150
|
setEmail((user === null || user === void 0 ? void 0 : user.email) ? user.email : "");
|
1245
2151
|
setPassword((user === null || user === void 0 ? void 0 : user.password) ? user.password : "");
|
2152
|
+
setAvatar((user === null || user === void 0 ? void 0 : user.avatar) ? user === null || user === void 0 ? void 0 : user.avatar : ""),
|
2153
|
+
setColor((user === null || user === void 0 ? void 0 : user.color) ? user.color : "#aabbcc");
|
1246
2154
|
}, [user]);
|
1247
|
-
var
|
2155
|
+
var imgRef = useRef(null);
|
2156
|
+
var onImageChange = function (event) {
|
2157
|
+
if (event.target.files && event.target.files[0]) {
|
2158
|
+
setImage(URL.createObjectURL(event.target.files[0]));
|
2159
|
+
}
|
2160
|
+
setCropModalOpen(true);
|
2161
|
+
};
|
2162
|
+
function onImageLoad(e) {
|
2163
|
+
var _a = e.currentTarget, width = _a.width, height = _a.height;
|
2164
|
+
console.log(width);
|
2165
|
+
setCrop(centerAspectCrop(width, height, 1));
|
2166
|
+
}
|
2167
|
+
// This is to demonstate how to make and center a % aspect crop
|
2168
|
+
// which is a bit trickier so we use some helper functions.
|
2169
|
+
function centerAspectCrop(mediaWidth, mediaHeight, aspect) {
|
2170
|
+
return centerCrop(makeAspectCrop({
|
2171
|
+
unit: 'px',
|
2172
|
+
width: mediaWidth / 2,
|
2173
|
+
}, aspect, mediaWidth, mediaHeight), mediaWidth, mediaHeight);
|
2174
|
+
}
|
2175
|
+
function renderCrop() {
|
2176
|
+
return __awaiter(this, void 0, void 0, function () {
|
2177
|
+
var image, scaleX, scaleY, canvas, ctx, pixelRatio, blob;
|
2178
|
+
return __generator(this, function (_a) {
|
2179
|
+
switch (_a.label) {
|
2180
|
+
case 0:
|
2181
|
+
image = imgRef.current;
|
2182
|
+
if (!(crop && image)) return [3 /*break*/, 3];
|
2183
|
+
scaleX = image.naturalWidth / image.width;
|
2184
|
+
scaleY = image.naturalHeight / image.height;
|
2185
|
+
canvas = new OffscreenCanvas(crop.width * scaleX, crop.height * scaleY);
|
2186
|
+
ctx = canvas.getContext("2d");
|
2187
|
+
pixelRatio = window.devicePixelRatio;
|
2188
|
+
canvas.width = crop.width * pixelRatio * scaleX;
|
2189
|
+
canvas.height = crop.height * pixelRatio * scaleY;
|
2190
|
+
if (ctx) {
|
2191
|
+
ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
|
2192
|
+
ctx.drawImage(image, crop.x * scaleX, crop.y * scaleY, crop.width * scaleX, crop.height * scaleY, 0, 0, crop.width * scaleX, crop.height * scaleY);
|
2193
|
+
}
|
2194
|
+
return [4 /*yield*/, canvas.convertToBlob()];
|
2195
|
+
case 1:
|
2196
|
+
blob = _a.sent();
|
2197
|
+
return [4 /*yield*/, resizeBlob(blob)];
|
2198
|
+
case 2:
|
2199
|
+
_a.sent();
|
2200
|
+
setCropping(false);
|
2201
|
+
setImage("");
|
2202
|
+
_a.label = 3;
|
2203
|
+
case 3: return [2 /*return*/];
|
2204
|
+
}
|
2205
|
+
});
|
2206
|
+
});
|
2207
|
+
}
|
2208
|
+
function resizeBlob(blob) {
|
2209
|
+
return __awaiter(this, void 0, void 0, function () {
|
2210
|
+
var img, canvas, ctx, resizedBlob, asset;
|
2211
|
+
return __generator(this, function (_a) {
|
2212
|
+
switch (_a.label) {
|
2213
|
+
case 0:
|
2214
|
+
img = new Image();
|
2215
|
+
img.src = URL.createObjectURL(blob);
|
2216
|
+
return [4 /*yield*/, img.decode()];
|
2217
|
+
case 1:
|
2218
|
+
_a.sent();
|
2219
|
+
canvas = new OffscreenCanvas(400, 400);
|
2220
|
+
ctx = canvas.getContext("2d");
|
2221
|
+
ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(img, 0, 0, 400, 400);
|
2222
|
+
return [4 /*yield*/, canvas.convertToBlob()];
|
2223
|
+
case 2:
|
2224
|
+
resizedBlob = _a.sent();
|
2225
|
+
return [4 /*yield*/, assetsApi.upload(resizedBlob, "test")];
|
2226
|
+
case 3:
|
2227
|
+
asset = _a.sent();
|
2228
|
+
setAvatar(asset.id);
|
2229
|
+
return [2 /*return*/];
|
2230
|
+
}
|
2231
|
+
});
|
2232
|
+
});
|
2233
|
+
}
|
1248
2234
|
var onUpdateUser = function () {
|
1249
2235
|
var changedUser = {};
|
1250
|
-
|
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
|
-
}
|
2236
|
+
changedUser = __assign(__assign({ id: id, first_name: name, description: text, email: email, color: color }, passwordChanged && { password: password }), avatar.length > 10 && { avatar: avatar });
|
1256
2237
|
toast.promise(updateUser(changedUser), {
|
1257
2238
|
pending: 'updating Profile ...',
|
1258
2239
|
success: 'Profile updated',
|
1259
|
-
error:
|
2240
|
+
error: {
|
2241
|
+
render: function (_a) {
|
2242
|
+
var data = _a.data;
|
2243
|
+
return "".concat(data);
|
2244
|
+
},
|
2245
|
+
},
|
1260
2246
|
})
|
1261
2247
|
.then(function () { return navigate("/"); });
|
1262
2248
|
};
|
1263
|
-
return (React.createElement(
|
1264
|
-
React.createElement("
|
1265
|
-
React.createElement(
|
1266
|
-
React.createElement(
|
1267
|
-
React.createElement(
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
1273
|
-
|
1274
|
-
|
1275
|
-
|
1276
|
-
|
1277
|
-
|
1278
|
-
|
2249
|
+
return (React.createElement(React.Fragment, null,
|
2250
|
+
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" },
|
2251
|
+
React.createElement("div", { className: 'tw-w-full xl:tw-max-w-6xl' },
|
2252
|
+
React.createElement(TitleCard, { title: "Profile Settings", topMargin: "tw-mt-2", className: 'tw-mb-6' },
|
2253
|
+
React.createElement("div", { className: "tw-flex" },
|
2254
|
+
!cropping ?
|
2255
|
+
React.createElement("label", { className: "custom-file-upload" },
|
2256
|
+
React.createElement("input", { type: "file", accept: "image/*", className: "tw-file-input tw-w-full tw-max-w-xs", onChange: onImageChange }),
|
2257
|
+
React.createElement("div", { className: 'button tw-btn tw-btn-lg tw-btn-circle tw-animate-none' },
|
2258
|
+
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" },
|
2259
|
+
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" }))),
|
2260
|
+
avatar ?
|
2261
|
+
React.createElement("div", { className: 'tw-h-20 tw-w-20' },
|
2262
|
+
React.createElement("img", { src: assetsApi.url + avatar + "?access_token=" + token, className: ' tw-rounded-full' }))
|
2263
|
+
:
|
2264
|
+
React.createElement("div", { className: 'tw-h-20 tw-w-20' },
|
2265
|
+
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" } },
|
2266
|
+
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" }),
|
2267
|
+
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" }))))
|
2268
|
+
: React.createElement("div", { className: 'tw-w-20 tw-flex tw-items-center tw-justify-center' },
|
2269
|
+
React.createElement("span", { className: "tw-loading tw-loading-spinner" })),
|
2270
|
+
React.createElement(ColorPicker, { color: color, onChange: setColor, className: "-tw-left-6 tw-top-14 -tw-mr-6" }),
|
2271
|
+
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 ' })),
|
2272
|
+
React.createElement("div", { className: "tw-grid tw-grid-cols-1 tw-md:grid-cols-1 tw-gap-6 tw-pt-6 tw-pb-6" },
|
2273
|
+
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' })),
|
2274
|
+
React.createElement("div", { className: "tw-divider" }),
|
2275
|
+
React.createElement("div", { className: "tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6" },
|
2276
|
+
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); } }),
|
2277
|
+
React.createElement(TextInput, { type: 'password', placeholder: "new Password", defaultValue: (user === null || user === void 0 ? void 0 : user.password) ? user.password : "", updateFormValue: function (v) {
|
2278
|
+
setPassword(v);
|
2279
|
+
setPasswordChanged(true);
|
2280
|
+
} })),
|
2281
|
+
React.createElement("div", { className: "tw-mt-8" },
|
2282
|
+
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"))))),
|
2283
|
+
React.createElement(DialogModal, { title: "", isOpened: cropModalOpen, onClose: function () {
|
2284
|
+
setCropModalOpen(false);
|
2285
|
+
setImage("");
|
2286
|
+
} },
|
2287
|
+
React.createElement(ReactCrop, { crop: crop, onChange: function (c) { return setCrop(c); }, aspect: 1 },
|
2288
|
+
React.createElement("img", { src: image, ref: imgRef, onLoad: onImageLoad })),
|
2289
|
+
React.createElement("button", { className: "tw-btn ", onClick: function () {
|
2290
|
+
setCropping(true);
|
2291
|
+
setCropModalOpen(false);
|
2292
|
+
renderCrop();
|
2293
|
+
} }, "Select"))));
|
1279
2294
|
}
|
1280
2295
|
|
1281
2296
|
function Welcome1(_a) {
|
1282
2297
|
var clickAction = _a.clickAction;
|
1283
2298
|
return (React.createElement(React.Fragment, null,
|
1284
|
-
React.createElement("h3", { className: "tw-font-bold tw-text-lg" }, "
|
1285
|
-
React.createElement("
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
React.createElement("b", null, "Hast du Lust mitzumachen?")),
|
2299
|
+
React.createElement("h3", { className: "tw-font-bold tw-text-lg" }, "Welcome, glad you are here!"),
|
2300
|
+
React.createElement("img", { className: "tw-float-right tw-w-32 tw-m-2", src: "/earth.svg" }),
|
2301
|
+
React.createElement("p", { className: "tw-py-3" }, "In the 21st century, humanity is at a special point in its history."),
|
2302
|
+
React.createElement("p", { className: "tw-py-1" }, "On the one hand, the people of Planet Earth are facing a multitude of fundamental crises."),
|
2303
|
+
React.createElement("p", { className: "tw-py-1" }, "On the other hand, we have all the knowledge and technology to heal the planet and live in harmony with Mother Earth. "),
|
1290
2304
|
React.createElement("div", { className: "tw-modal-action" },
|
1291
|
-
React.createElement("label", { className: "tw-btn
|
2305
|
+
React.createElement("label", { className: "tw-btn", onClick: function () { return clickAction(); } }, "Next"))));
|
1292
2306
|
}
|
1293
2307
|
function Welcome2(_a) {
|
1294
2308
|
var clickAction = _a.clickAction;
|
1295
2309
|
return (React.createElement(React.Fragment, null,
|
1296
|
-
React.createElement("h3", { className: "tw-font-bold tw-text-lg" }, "
|
1297
|
-
React.createElement("p", { className: "tw-py-
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
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"),
|
2310
|
+
React.createElement("h3", { className: "tw-font-bold tw-text-lg" }, " Hypnosis and Disillusion "),
|
2311
|
+
React.createElement("p", { className: "tw-py-3" }, "Most people are still stuck in old ways of thinking and living. "),
|
2312
|
+
React.createElement("img", { className: "tw-float-right tw-w-32 tw-mx-4 tw-my-2", src: "/fear2.svg" }),
|
2313
|
+
React.createElement("p", { className: "tw-py-1" }, "Hypnotised, they sit in front of screens in concrete blocks, flooded and disillusioned by irrelevant information."),
|
2314
|
+
React.createElement("p", { className: "tw-py-1" }, "From an early age, they are trained to do alienated work and consume unhealthy and meaningless products."),
|
1302
2315
|
React.createElement("div", { className: "tw-modal-action" },
|
1303
|
-
React.createElement("label", { className: "tw-btn
|
2316
|
+
React.createElement("label", { className: "tw-btn", onClick: function () { return clickAction(); } }, "next"))));
|
1304
2317
|
}
|
1305
2318
|
function Welcome3(_a) {
|
1306
2319
|
var clickAction = _a.clickAction;
|
1307
2320
|
return (React.createElement(React.Fragment, null,
|
1308
|
-
React.createElement("h3", { className: "tw-font-bold tw-text-lg" }, "
|
1309
|
-
React.createElement("
|
1310
|
-
|
1311
|
-
|
1312
|
-
|
1313
|
-
React.createElement("li", null, "\uD83D\uDCA1 Energie"),
|
1314
|
-
React.createElement("li", null, "\uD83D\uDE90 Mobilit\u00E4t")),
|
2321
|
+
React.createElement("h3", { className: "tw-font-bold tw-text-lg" }, "But Consciousness is rising "),
|
2322
|
+
React.createElement("p", { className: "tw-py-3" }, "More and more people are waking up to what's really happening. "),
|
2323
|
+
React.createElement("p", { className: "tw-py-1" }, "They are in the process of understanding the potential that is within themselves and within the whole mankind."),
|
2324
|
+
React.createElement("img", { className: "tw-float-left tw-w-32 tw-mx-4", src: "/camp3.svg" }),
|
2325
|
+
React.createElement("p", { className: "tw-py-1" }, "Starting to reconnect with our Mother Earth and beginning to question things that long times have been taken for granted."),
|
1315
2326
|
React.createElement("div", { className: "tw-modal-action" },
|
1316
|
-
React.createElement("
|
2327
|
+
React.createElement("label", { className: "tw-btn", onClick: function () { return clickAction(); } }, "next"))));
|
1317
2328
|
}
|
2329
|
+
var close = function () {
|
2330
|
+
window.my_modal_3.close();
|
2331
|
+
};
|
1318
2332
|
function Modal() {
|
1319
2333
|
var _a = useState(1), chapter = _a[0], setChapter = _a[1];
|
1320
|
-
var
|
1321
|
-
window.my_modal_3.close();
|
1322
|
-
};
|
2334
|
+
var setQuestsOpen = useSetQuestOpen();
|
1323
2335
|
var ActiveChapter = function () {
|
1324
2336
|
switch (chapter) {
|
1325
2337
|
case 1:
|
@@ -1328,15 +2340,18 @@ function Modal() {
|
|
1328
2340
|
return React.createElement(Welcome2, { clickAction: function () { setChapter(3); } });
|
1329
2341
|
case 3:
|
1330
2342
|
return React.createElement(Welcome3, { clickAction: function () {
|
1331
|
-
setChapter(1);
|
1332
2343
|
close();
|
2344
|
+
setTimeout(function () {
|
2345
|
+
setQuestsOpen(true);
|
2346
|
+
setChapter(1);
|
2347
|
+
}, 1000);
|
1333
2348
|
} });
|
1334
2349
|
default: return React.createElement(React.Fragment, null);
|
1335
2350
|
}
|
1336
2351
|
};
|
1337
2352
|
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" },
|
2353
|
+
React.createElement("dialog", { id: "my_modal_3", className: "tw-modal tw-transition-all tw-duration-300" },
|
2354
|
+
React.createElement("form", { method: "dialog", className: "tw-modal-box tw-transition-none" },
|
1340
2355
|
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
2356
|
React.createElement(ActiveChapter, null)),
|
1342
2357
|
React.createElement("form", { method: "dialog", className: "tw-modal-backdrop" },
|
@@ -1344,49 +2359,51 @@ function Modal() {
|
|
1344
2359
|
}
|
1345
2360
|
|
1346
2361
|
function Quests() {
|
1347
|
-
var
|
1348
|
-
|
1349
|
-
|
1350
|
-
|
1351
|
-
|
1352
|
-
|
1353
|
-
|
1354
|
-
React.createElement("
|
1355
|
-
|
1356
|
-
|
1357
|
-
|
1358
|
-
|
1359
|
-
|
1360
|
-
|
1361
|
-
|
1362
|
-
|
1363
|
-
|
1364
|
-
|
1365
|
-
|
1366
|
-
|
1367
|
-
|
1368
|
-
|
1369
|
-
|
1370
|
-
|
1371
|
-
|
1372
|
-
|
1373
|
-
|
2362
|
+
var questsOpen = useQuestsOpen();
|
2363
|
+
var setQuestsOpen = useSetQuestOpen();
|
2364
|
+
var _a = useAuth(), isAuthenticated = _a.isAuthenticated, user = _a.user;
|
2365
|
+
return (React.createElement(React.Fragment, null, questsOpen ?
|
2366
|
+
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]" },
|
2367
|
+
React.createElement("div", { className: "tw-card-body tw-p-4 tw-pt-0" },
|
2368
|
+
React.createElement("div", { className: "tw-card-actions tw-justify-end" },
|
2369
|
+
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")),
|
2370
|
+
React.createElement("h2", { className: "tw-card-title tw-m-auto " },
|
2371
|
+
"Level 1",
|
2372
|
+
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" },
|
2373
|
+
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" }))),
|
2374
|
+
React.createElement("ul", { className: 'tw-flex-row' },
|
2375
|
+
React.createElement("li", null,
|
2376
|
+
React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-0" },
|
2377
|
+
React.createElement("input", { type: "checkbox", readOnly: true, className: "tw-checkbox tw-checkbox-xs tw-checkbox-success", checked: isAuthenticated ? isAuthenticated : false }),
|
2378
|
+
React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, "Sign Up"))),
|
2379
|
+
React.createElement("li", null,
|
2380
|
+
React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-0" },
|
2381
|
+
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 }),
|
2382
|
+
React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, "Fill Profile"))),
|
2383
|
+
React.createElement("li", null,
|
2384
|
+
React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-0" },
|
2385
|
+
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 }),
|
2386
|
+
React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, "Upload Avatar")))),
|
2387
|
+
" "))
|
2388
|
+
: ""));
|
1374
2389
|
}
|
1375
2390
|
|
1376
2391
|
function CardPage(_a) {
|
1377
|
-
var title = _a.title, children = _a.children;
|
2392
|
+
var title = _a.title, children = _a.children, parent = _a.parent;
|
1378
2393
|
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' },
|
2394
|
+
React.createElement("div", { className: 'tw-w-full xl:tw-max-w-6xl ' },
|
1380
2395
|
React.createElement("div", { className: "tw-text-sm tw-breadcrumbs" },
|
1381
2396
|
React.createElement("ul", null,
|
1382
2397
|
React.createElement("li", null,
|
1383
2398
|
React.createElement(Link, { to: '/' }, "Home")),
|
2399
|
+
parent && React.createElement("li", null,
|
2400
|
+
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
2401
|
React.createElement("li", null, title))),
|
1385
|
-
React.createElement(TitleCard, { title: title, topMargin: "
|
2402
|
+
React.createElement(TitleCard, { title: title, topMargin: "tw-my-2", className: " tw-mb-4" }, children))));
|
1386
2403
|
}
|
1387
2404
|
|
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}";
|
2405
|
+
var css_248z = "/*\n! tailwindcss v3.3.1 | MIT License | https://tailwindcss.com\n*//*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n*/\n\nhtml {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: Roboto, sans-serif; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font family by default.\n2. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden] {\n display: none;\n}\n\n:root,\n[data-theme] {\n background-color: hsl(var(--b1) / var(--tw-bg-opacity, 1));\n color: hsl(var(--bc) / var(--tw-text-opacity, 1));\n}\n\nhtml {\n -webkit-tap-highlight-color: transparent;\n}\n\n:root {\n color-scheme: light;\n --pf: 259 94% 44%;\n --sf: 314 100% 40%;\n --af: 174 75% 39%;\n --nf: 214 20% 14%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 259 94% 51%;\n --pc: 259 96% 91%;\n --s: 314 100% 47%;\n --sc: 314 100% 91%;\n --a: 174 75% 46%;\n --ac: 174 75% 11%;\n --n: 214 20% 21%;\n --nc: 212 19% 87%;\n --b1: 0 0% 100%;\n --b2: 0 0% 95%;\n --b3: 180 2% 90%;\n --bc: 215 28% 17%;\n}\n\n@media (prefers-color-scheme: dark) {\n\n :root {\n color-scheme: dark;\n --pf: 262 80% 43%;\n --sf: 316 70% 43%;\n --af: 175 70% 34%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 262 80% 50%;\n --pc: 0 0% 100%;\n --s: 316 70% 50%;\n --sc: 0 0% 100%;\n --a: 175 70% 41%;\n --ac: 0 0% 100%;\n --n: 213 18% 20%;\n --nf: 212 17% 17%;\n --nc: 220 13% 69%;\n --b1: 212 18% 14%;\n --b2: 213 18% 12%;\n --b3: 213 18% 10%;\n --bc: 220 13% 69%;\n }\n}\n\n[data-theme=light] {\n color-scheme: light;\n --pf: 259 94% 44%;\n --sf: 314 100% 40%;\n --af: 174 75% 39%;\n --nf: 214 20% 14%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 259 94% 51%;\n --pc: 259 96% 91%;\n --s: 314 100% 47%;\n --sc: 314 100% 91%;\n --a: 174 75% 46%;\n --ac: 174 75% 11%;\n --n: 214 20% 21%;\n --nc: 212 19% 87%;\n --b1: 0 0% 100%;\n --b2: 0 0% 95%;\n --b3: 180 2% 90%;\n --bc: 215 28% 17%;\n}\n\n[data-theme=dark] {\n color-scheme: dark;\n --pf: 262 80% 43%;\n --sf: 316 70% 43%;\n --af: 175 70% 34%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 262 80% 50%;\n --pc: 0 0% 100%;\n --s: 316 70% 50%;\n --sc: 0 0% 100%;\n --a: 175 70% 41%;\n --ac: 0 0% 100%;\n --n: 213 18% 20%;\n --nf: 212 17% 17%;\n --nc: 220 13% 69%;\n --b1: 212 18% 14%;\n --b2: 213 18% 12%;\n --b3: 213 18% 10%;\n --bc: 220 13% 69%;\n}\n\n[data-theme=cupcake] {\n color-scheme: light;\n --pf: 183 47% 52%;\n --sf: 338 71% 71%;\n --af: 39 84% 51%;\n --nf: 280 46% 7%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --pc: 183 20% 13%;\n --sc: 340 15% 16%;\n --ac: 37 41% 13%;\n --nc: 283 9% 81%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --p: 183 47% 59%;\n --s: 338 71% 78%;\n --a: 39 84% 58%;\n --n: 280 46% 14%;\n --b1: 24 33% 97%;\n --b2: 27 22% 92%;\n --b3: 23 14% 89%;\n --bc: 280 46% 14%;\n --rounded-btn: 1.9rem;\n --tab-border: 2px;\n --tab-radius: .5rem;\n}\n\n[data-theme=forest] {\n color-scheme: dark;\n --pf: 141 72% 35%;\n --sf: 164 73% 35%;\n --af: 175 73% 35%;\n --nf: 161 37% 8%;\n --b2: 0 12% 1%;\n --b3: 0 0% 0%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --bc: 360 1% 79%;\n --sc: 158 32% 11%;\n --ac: 172 31% 11%;\n --nc: 157 7% 81%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --rounded-box: 1rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 141 72% 42%;\n --pc: 0 0% 0%;\n --s: 164 73% 42%;\n --a: 175 73% 42%;\n --n: 161 37% 15%;\n --b1: 0 12% 8%;\n --rounded-btn: 1.9rem;\n}\n\n[data-theme=cyberpunk] {\n color-scheme: light;\n --pf: 345 100% 66%;\n --sf: 195 80% 63%;\n --af: 276 74% 64%;\n --nf: 57 100% 6%;\n --b2: 56 100% 43%;\n --b3: 56 100% 36%;\n --in: 198 93% 60%;\n --su: 158 64% 52%;\n --wa: 43 96% 56%;\n --er: 0 91% 71%;\n --bc: 53 46% 13%;\n --pc: 348 27% 15%;\n --sc: 196 23% 15%;\n --ac: 277 22% 15%;\n --inc: 198 100% 12%;\n --suc: 158 100% 10%;\n --wac: 43 100% 11%;\n --erc: 0 100% 14%;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-text-case: uppercase;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n font-family: ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;\n --p: 345 100% 73%;\n --s: 195 80% 70%;\n --a: 276 74% 71%;\n --n: 57 100% 13%;\n --nc: 56 100% 50%;\n --b1: 56 100% 50%;\n --rounded-box: 0;\n --rounded-btn: 0;\n --rounded-badge: 0;\n --tab-radius: 0;\n}\n\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-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-file-input {\n height: 3rem;\n flex-shrink: 1;\n padding-right: 1rem;\n font-size: 1rem;\n line-height: 2;\n line-height: 1.5rem;\n overflow: hidden;\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-file-input::file-selector-button {\n margin-right: 1rem;\n display: inline-flex;\n height: 2.875rem;\n min-height: 2.875rem;\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-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n border-style: solid;\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 font-weight: 600;\n text-transform: uppercase;\n text-transform: var(--btn-text-case, uppercase);\n --tw-text-opacity: 1;\n color: hsl(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 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-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 padding-left: 1rem;\n padding-right: 2.5rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 2;\n min-height: 3rem;\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 font-weight: 600;\n border-radius: var(--rounded-btn, 0.5rem);\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%), calc(100% - 16px) calc(1px + 50%);\n background-size: 4px 4px, 4px 4px;\n background-repeat: no-repeat;\n}\n.tw-select[multiple] {\n height: auto;\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-file-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-file-input-disabled,\n .tw-file-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-file-input-disabled::-moz-placeholder, .tw-file-input[disabled]::-moz-placeholder {\n color: hsl(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: hsl(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: 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-label-text {\n font-size: 0.875rem;\n line-height: 1.25rem;\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n}\n.tw-input[list]::-webkit-calendar-picker-indicator {\n line-height: 1em;\n}\n.tw-input-bordered {\n --tw-border-opacity: 0.2;\n}\n.tw-input:focus {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: hsl(var(--bc) / 0.2);\n}\n.tw-input-disabled,\n .tw-input:disabled,\n .tw-input[disabled] {\n cursor: not-allowed;\n --tw-border-opacity: 1;\n border-color: hsl(var(--b2) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n --tw-text-opacity: 0.2;\n}\n.tw-input-disabled::-moz-placeholder, .tw-input:disabled::-moz-placeholder, .tw-input[disabled]::-moz-placeholder {\n color: hsl(var(--bc) / var(--tw-placeholder-opacity));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-input-disabled::placeholder,\n .tw-input:disabled::placeholder,\n .tw-input[disabled]::placeholder {\n color: hsl(var(--bc) / var(--tw-placeholder-opacity));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-loading {\n pointer-events: none;\n display: inline-block;\n aspect-ratio: 1 / 1;\n width: 1.5rem;\n background-color: currentColor;\n -webkit-mask-size: 100%;\n mask-size: 100%;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-position: center;\n mask-position: center;\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-in-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-in-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.tw-loading-spinner {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-in-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-in-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.tw-loading-sm {\n width: 1.25rem;\n}\n:where(.tw-menu li:empty) {\n background-color: hsl(var(--bc) / 0.1);\n margin: 0.5rem 1rem;\n height: 1px;\n}\n.tw-menu :where(li ul):before {\n position: absolute;\n left: 0px;\n top: 0.75rem;\n bottom: 0.75rem;\n width: 1px;\n background-color: hsl(var(--bc) / 0.1);\n content: \"\";\n}\n.tw-menu :where(li:not(.tw-menu-title) > *:not(ul):not(details):not(.tw-menu-title)),\n.tw-menu :where(li:not(.tw-menu-title) > details > summary:not(.tw-menu-title)) {\n padding-left: 1rem;\n padding-right: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n text-align: left;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: var(--rounded-btn, 0.5rem);\n}\n:where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(summary):not(.tw-active).tw-focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(summary):not(.tw-active):focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):is(summary):not(.tw-active):focus-visible,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(summary):not(.tw-active).tw-focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(summary):not(.tw-active):focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):is(summary):not(.tw-active):focus-visible {\n cursor: pointer;\n background-color: hsl(var(--bc) / 0.1);\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-menu li > *:not(ul):not(details):active,\n.tw-menu li > *:not(ul):not(details).tw-active,\n.tw-menu li > details > summary:active {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--n) / var(--tw-bg-opacity));\n --tw-text-opacity: 1;\n color: hsl(var(--nc) / var(--tw-text-opacity));\n}\n.tw-menu :where(li > details > summary)::-webkit-details-marker {\n display: none;\n}\n.tw-menu :where(li > details > summary):after,\n.tw-menu :where(li > .tw-menu-dropdown-toggle):after {\n justify-self: end;\n display: block;\n margin-top: -0.5rem;\n height: 0.5rem;\n width: 0.5rem;\n transform: rotate(45deg);\n transition-property: transform, margin-top;\n transition-duration: 0.3s;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n content: \"\";\n transform-origin: 75% 75%;\n box-shadow: 2px 2px;\n pointer-events: none;\n}\n.tw-menu :where(li > details[open] > summary):after,\n.tw-menu :where(li > .tw-menu-dropdown-toggle.tw-menu-dropdown-show):after {\n transform: rotate(225deg);\n margin-top: 0;\n}\n.tw-mockup-browser .tw-mockup-browser-toolbar .tw-input {\n position: relative;\n margin-left: auto;\n margin-right: auto;\n display: block;\n height: 1.75rem;\n width: 24rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n padding-left: 2rem;\n}\n.tw-mockup-browser .tw-mockup-browser-toolbar .tw-input:before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 0.5rem;\n aspect-ratio: 1 / 1;\n height: 0.75rem;\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-radius: 9999px;\n border-width: 2px;\n border-color: currentColor;\n opacity: 0.6;\n}\n.tw-mockup-browser .tw-mockup-browser-toolbar .tw-input:after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 1.25rem;\n height: 0.5rem;\n --tw-translate-y: 25%;\n --tw-rotate: -45deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-radius: 9999px;\n border-width: 1px;\n border-color: currentColor;\n opacity: 0.6;\n}\n.tw-modal:not(dialog:not(.tw-modal-open)),\n .tw-modal::backdrop {\n background-color: rgba(0, 0, 0, 0.3);\n animation: modal-pop 0.2s ease-out;\n}\n.tw-modal-backdrop {\n z-index: -1;\n grid-column-start: 1;\n grid-row-start: 1;\n display: grid;\n align-self: stretch;\n justify-self: stretch;\n color: transparent;\n}\n.tw-modal-open .tw-modal-box,\n.tw-modal-toggle:checked + .tw-modal .tw-modal-box,\n.tw-modal:target .tw-modal-box,\n.tw-modal[open] .tw-modal-box {\n --tw-translate-y: 0px;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.tw-modal-action > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n}\n@keyframes modal-pop {\n\n 0% {\n opacity: 0;\n }\n}\n@keyframes progress-loading {\n\n 50% {\n background-position-x: -115%;\n }\n}\n@keyframes radiomark {\n\n 0% {\n box-shadow: 0 0 0 12px hsl(var(--b1)) inset, 0 0 0 12px hsl(var(--b1)) inset;\n }\n\n 50% {\n box-shadow: 0 0 0 3px hsl(var(--b1)) inset, 0 0 0 3px hsl(var(--b1)) inset;\n }\n\n 100% {\n box-shadow: 0 0 0 4px hsl(var(--b1)) inset, 0 0 0 4px hsl(var(--b1)) inset;\n }\n}\n@keyframes rating-pop {\n\n 0% {\n transform: translateY(-0.125em);\n }\n\n 40% {\n transform: translateY(-0.125em);\n }\n\n 100% {\n transform: translateY(0);\n }\n}\n.tw-select-bordered {\n --tw-border-opacity: 0.2;\n}\n.tw-select:focus {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: hsl(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: 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-select-disabled::-moz-placeholder, .tw-select:disabled::-moz-placeholder, .tw-select[disabled]::-moz-placeholder {\n color: hsl(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: hsl(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%), calc(0% + 16px) calc(1px + 50%);\n}\n.tw-textarea-bordered {\n --tw-border-opacity: 0.2;\n}\n.tw-textarea:focus {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: hsl(var(--bc) / 0.2);\n}\n.tw-textarea-disabled,\n .tw-textarea:disabled,\n .tw-textarea[disabled] {\n cursor: not-allowed;\n --tw-border-opacity: 1;\n border-color: hsl(var(--b2) / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n --tw-text-opacity: 0.2;\n}\n.tw-textarea-disabled::-moz-placeholder, .tw-textarea:disabled::-moz-placeholder, .tw-textarea[disabled]::-moz-placeholder {\n color: hsl(var(--bc) / var(--tw-placeholder-opacity));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-textarea-disabled::placeholder,\n .tw-textarea:disabled::placeholder,\n .tw-textarea[disabled]::placeholder {\n color: hsl(var(--bc) / var(--tw-placeholder-opacity));\n --tw-placeholder-opacity: 0.2;\n}\n@keyframes toast-pop {\n\n 0% {\n transform: scale(0.9);\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n.tw-tooltip.tw-tooltip-primary {\n --tooltip-color: hsl(var(--p));\n --tooltip-text-color: hsl(var(--pc));\n}\n.tw-tooltip.tw-tooltip-secondary {\n --tooltip-color: hsl(var(--s));\n --tooltip-text-color: hsl(var(--sc));\n}\n.tw-tooltip.tw-tooltip-accent {\n --tooltip-color: hsl(var(--a));\n --tooltip-text-color: hsl(var(--ac));\n}\n.tw-tooltip.tw-tooltip-info {\n --tooltip-color: hsl(var(--in));\n --tooltip-text-color: hsl(var(--inc));\n}\n.tw-tooltip.tw-tooltip-success {\n --tooltip-color: hsl(var(--su));\n --tooltip-text-color: hsl(var(--suc));\n}\n.tw-tooltip.tw-tooltip-warning {\n --tooltip-color: hsl(var(--wa));\n --tooltip-text-color: hsl(var(--wac));\n}\n.tw-tooltip.tw-tooltip-error {\n --tooltip-color: hsl(var(--er));\n --tooltip-text-color: hsl(var(--erc));\n}\n.tw-rounded-box {\n border-radius: var(--rounded-box, 1rem);\n}\n.tw-btn-xs {\n height: 1.5rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n min-height: 1.5rem;\n font-size: 0.75rem;\n}\n.tw-btn-sm {\n height: 2rem;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n min-height: 2rem;\n font-size: 0.875rem;\n}\n.tw-btn-lg {\n height: 4rem;\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n min-height: 4rem;\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.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: 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-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-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-full {\n border-radius: 9999px;\n}\n.tw-rounded-lg {\n border-radius: 0.5rem;\n}\n.tw-rounded-xl {\n border-radius: 0.75rem;\n}\n.tw-rounded-br-md {\n border-bottom-right-radius: 0.375rem;\n}\n.tw-rounded-tr-md {\n border-top-right-radius: 0.375rem;\n}\n.tw-border-0 {\n border-width: 0px;\n}\n.tw-border-none {\n border-style: none;\n}\n.tw-bg-base-100 {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b1) / var(--tw-bg-opacity));\n}\n.tw-bg-base-200 {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--b2) / var(--tw-bg-opacity));\n}\n.tw-bg-primary {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--p) / var(--tw-bg-opacity));\n}\n.tw-bg-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: hsl(var(--bc) / var(--tw-text-opacity)) !important;\n}\n.\\!tw-text-error {\n --tw-text-opacity: 1 !important;\n color: hsl(var(--er) / var(--tw-text-opacity)) !important;\n}\n.tw-text-base-content {\n --tw-text-opacity: 1;\n color: hsl(var(--bc) / var(--tw-text-opacity));\n}\n.tw-text-error {\n --tw-text-opacity: 1;\n color: hsl(var(--er) / var(--tw-text-opacity));\n}\n.tw-text-gray-600 {\n --tw-text-opacity: 1;\n color: rgb(75 85 99 / var(--tw-text-opacity));\n}\n.tw-text-primary {\n --tw-text-opacity: 1;\n color: hsl(var(--p) / var(--tw-text-opacity));\n}\n.tw-text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n.tw-shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tw-shadow-\\[0_4px_12px_0_rgba\\(0\\,0\\,0\\,0\\.07\\)\\,_0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.05\\)\\] {\n --tw-shadow: 0 4px 12px 0 rgba(0,0,0,0.07), 0 2px 4px rgba(0,0,0,0.05);\n --tw-shadow-colored: 0 4px 12px 0 var(--tw-shadow-color), 0 2px 4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tw-shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tw-drop-shadow-md {\n --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06));\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.tw-transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.tw-transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.tw-transition-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: hsl(var(--b1) / 1);\n color: hsl(var(--bc) / 1);\n\n\n}\n\n:root {\n\n --toastify-color-info: hsl(var(--in) / 1);\n --toastify-color-success: hsl(var(--su) / 1);\n --toastify-color-warning: hsl(var(--wa) / 1);\n --toastify-color-error: hsl(var(--er) / 1);\n\n}\n\n.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: hsl(var(--p) / var(--tw-text-opacity));\n}\n\n.hover\\:tw-underline:hover {\n text-decoration-line: underline;\n}\n\n.focus\\:tw-outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.data-\\[te-sidenav-slim\\=\\'true\\'\\]\\:tw-hidden[data-te-sidenav-slim='true'] {\n display: none;\n}\n\n.data-\\[te-sidenav-slim-collapsed\\=\\'true\\'\\]\\:tw-w-\\[56px\\][data-te-sidenav-slim-collapsed='true'] {\n width: 56px;\n}\n\n.data-\\[te-sidenav-slim\\=\\'true\\'\\]\\:tw-w-\\[56px\\][data-te-sidenav-slim='true'] {\n width: 56px;\n}\n\n.data-\\[te-sidenav-hidden\\=\\'false\\'\\]\\:tw-translate-x-0[data-te-sidenav-hidden='false'] {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.tw-group[data-te-sidenav-slim-collapsed='true'] .group-\\[\\&\\[data-te-sidenav-slim-collapsed\\=\\'true\\'\\]\\]\\:data-\\[te-sidenav-slim\\=\\'false\\'\\]\\:tw-hidden[data-te-sidenav-slim='false'] {\n display: none;\n}\n\n:is(.tw-dark .dark\\:tw-bg-zinc-800) {\n --tw-bg-opacity: 1;\n background-color: rgb(39 39 42 / var(--tw-bg-opacity));\n}\n\n@media (min-width: 768px) {\n\n .md\\:tw-flex {\n display: flex;\n }\n\n .md\\:tw-hidden {\n display: none;\n }\n\n .md\\:tw-grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n\n .md\\:tw-grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n}\n\n@media (min-width: 1280px) {\n\n .xl\\:tw-max-w-6xl {\n max-width: 72rem;\n }\n}\n\n.\\[\\&\\[data-te-sidenav-slim-collapsed\\=\\'true\\'\\]\\[data-te-sidenav-slim\\=\\'false\\'\\]\\]\\:tw-hidden[data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='false'] {\n display: none;\n}\n\n.\\[\\&\\[data-te-sidenav-slim-collapsed\\=\\'true\\'\\]\\[data-te-sidenav-slim\\=\\'true\\'\\]\\]\\:\\[display\\:unset\\][data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='true'] {\n display: unset;\n}";
|
1389
2406
|
styleInject(css_248z);
|
1390
2407
|
|
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 };
|
2408
|
+
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
2409
|
//# sourceMappingURL=index.js.map
|