utopia-ui 3.0.0-alpha.4 → 3.0.0-alpha.41
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 +7 -5
- package/dist/Components/AppShell/NavBar.d.ts +2 -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 +3 -8
- 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/Layer.d.ts +1 -1
- 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 +2 -3
- package/dist/Components/Map/Subcomponents/ItemPopupComponents/HeaderView.d.ts +4 -1
- package/dist/Components/Map/Subcomponents/ItemPopupComponents/PopupButton.d.ts +10 -0
- package/dist/Components/Map/Subcomponents/ItemPopupComponents/PopupTextInput.d.ts +7 -1
- package/dist/Components/Map/Subcomponents/ItemViewPopup.d.ts +4 -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 +3 -0
- package/dist/Components/Profile/ColorPicker.d.ts +7 -0
- package/dist/Components/Profile/ProfileSettings.d.ts +4 -0
- package/dist/Components/Profile/Settings.d.ts +2 -3
- package/dist/Components/Profile/UserSettings.d.ts +4 -0
- package/dist/Components/Profile/index.d.ts +2 -1
- package/dist/Components/Profile/useClickOutside.d.ts +2 -0
- package/dist/Components/Templates/CardPage.d.ts +6 -1
- package/dist/Components/Templates/TitleCard.d.ts +6 -4
- package/dist/Utils/DynamicHeroIcon.d.ts +2 -0
- package/dist/Utils/GetValue.d.ts +1 -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/Utils/TimeAgo.d.ts +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1703 -644
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +36 -9
- package/package.json +10 -4
- 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/Components/{AppShell → Templates}/DialogModal.d.ts +0 -0
package/dist/index.js
CHANGED
@@ -1,19 +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
|
10
|
-
import { Link, BrowserRouter, useLocation, NavLink, useNavigate } from 'react-router-dom';
|
9
|
+
import { Link, useLocation, useNavigate, BrowserRouter, NavLink } from 'react-router-dom';
|
11
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';
|
12
15
|
import QuestionMarkIcon from '@heroicons/react/24/outline/QuestionMarkCircleIcon';
|
13
16
|
import { initTE, Sidenav } from 'tw-elements';
|
14
17
|
import ChevronDownIcon from '@heroicons/react/24/outline/ChevronDownIcon';
|
15
18
|
import ChevronRightIcon from '@heroicons/react/24/outline/ChevronRightIcon';
|
19
|
+
import 'react-image-crop/dist/ReactCrop.css';
|
16
20
|
import 'react-toastify/dist/ReactToastify.css';
|
21
|
+
import ReactCrop, { centerCrop, makeAspectCrop } from 'react-image-crop';
|
22
|
+
import { HexColorPicker } from 'react-colorful';
|
17
23
|
|
18
24
|
function styleInject(css, ref) {
|
19
25
|
if ( ref === void 0 ) ref = {};
|
@@ -42,8 +48,8 @@ function styleInject(css, ref) {
|
|
42
48
|
}
|
43
49
|
}
|
44
50
|
|
45
|
-
var css_248z$
|
46
|
-
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: var(--fallback-b1,oklch(var(--b1)/1));\n color: var(--fallback-bc,oklch(var(--bc)/1));\n\n }\n\n .leaflet-tooltip {\n background-color: var(--fallback-b1,oklch(var(--b1)/1));\n color: var(--fallback-bc,oklch(var(--bc)/1));\n border-width: 0px;\n border-radius: 1em;\n transition: opacity 500ms;\n transition-delay: 50ms;\n }\n\n .leaflet-tooltip-top::before {\n border-top-color: var(--fallback-b1,oklch(var(--b1)/1));\n }\n\n .marker-cluster span {\n color: #000;\n }";
|
52
|
+
styleInject(css_248z$2);
|
47
53
|
|
48
54
|
/******************************************************************************
|
49
55
|
Copyright (c) Microsoft Corporation.
|
@@ -139,7 +145,7 @@ var DynamicHeroIcon = function (props) {
|
|
139
145
|
console.log("Icon ".concat(props.icon, " doesn't exist"));
|
140
146
|
}
|
141
147
|
return (React.createElement(React.Fragment, null,
|
142
|
-
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" })));
|
143
149
|
};
|
144
150
|
|
145
151
|
var LayerContext = createContext({
|
@@ -184,45 +190,397 @@ var useAddLayer = function () {
|
|
184
190
|
return addLayer;
|
185
191
|
};
|
186
192
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
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));
|
202
342
|
}
|
203
343
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
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; }
|
210
452
|
});
|
211
|
-
function
|
453
|
+
function usePermissionsManager(initialPermissions) {
|
454
|
+
var _this = this;
|
212
455
|
var _a = useReducer(function (state, action) {
|
213
456
|
switch (action.type) {
|
214
457
|
case "ADD":
|
215
|
-
var exist = state.find(function (
|
216
|
-
return
|
458
|
+
var exist = state.find(function (permission) {
|
459
|
+
return permission.id === action.permission.id ? true : false;
|
217
460
|
});
|
218
461
|
if (!exist)
|
219
462
|
return __spreadArray(__spreadArray([], state, true), [
|
220
|
-
action.
|
463
|
+
action.permission,
|
221
464
|
], false);
|
222
465
|
else
|
223
466
|
return state;
|
224
|
-
case "
|
225
|
-
return state.
|
467
|
+
case "REMOVE":
|
468
|
+
return state.filter(function (_a) {
|
469
|
+
var id = _a.id;
|
470
|
+
return id !== action.id;
|
471
|
+
});
|
472
|
+
default:
|
473
|
+
throw new Error();
|
474
|
+
}
|
475
|
+
}, initialPermissions), permissions = _a[0], dispatch = _a[1];
|
476
|
+
var _b = React.useState(null), adminRole = _b[0], setAdminRole = _b[1];
|
477
|
+
var user = useAuth().user;
|
478
|
+
var setPermissionApi = useCallback(function (api) { return __awaiter(_this, void 0, void 0, function () {
|
479
|
+
var result;
|
480
|
+
return __generator(this, function (_a) {
|
481
|
+
switch (_a.label) {
|
482
|
+
case 0: return [4 /*yield*/, api.getItems()];
|
483
|
+
case 1:
|
484
|
+
result = _a.sent();
|
485
|
+
if (result) {
|
486
|
+
result.map(function (permission) {
|
487
|
+
dispatch({ type: "ADD", permission: permission });
|
488
|
+
});
|
489
|
+
}
|
490
|
+
return [2 /*return*/];
|
491
|
+
}
|
492
|
+
});
|
493
|
+
}); }, []);
|
494
|
+
var setPermissionData = useCallback(function (data) {
|
495
|
+
data.map(function (permission) {
|
496
|
+
dispatch({ type: "ADD", permission: permission });
|
497
|
+
});
|
498
|
+
}, []);
|
499
|
+
var hasUserPermission = useCallback(function (collectionName, action) {
|
500
|
+
if (permissions.length == 0)
|
501
|
+
return true;
|
502
|
+
else if (user && user.role == adminRole)
|
503
|
+
return true;
|
504
|
+
else
|
505
|
+
return permissions.some(function (p) { return p.action === action && p.collection === collectionName && p.role == (user === null || user === void 0 ? void 0 : user.role); });
|
506
|
+
}, [permissions, user]);
|
507
|
+
return { permissions: permissions, setPermissionApi: setPermissionApi, setPermissionData: setPermissionData, setAdminRole: setAdminRole, hasUserPermission: hasUserPermission };
|
508
|
+
}
|
509
|
+
var PermissionsProvider = function (_a) {
|
510
|
+
var initialPermissions = _a.initialPermissions, children = _a.children;
|
511
|
+
return (React.createElement(PermissionContext.Provider, { value: usePermissionsManager(initialPermissions) }, children));
|
512
|
+
};
|
513
|
+
var useSetPermissionApi = function () {
|
514
|
+
var setPermissionApi = useContext(PermissionContext).setPermissionApi;
|
515
|
+
return setPermissionApi;
|
516
|
+
};
|
517
|
+
var useSetPermissionData = function () {
|
518
|
+
var setPermissionData = useContext(PermissionContext).setPermissionData;
|
519
|
+
return setPermissionData;
|
520
|
+
};
|
521
|
+
var useHasUserPermission = function () {
|
522
|
+
var hasUserPermission = useContext(PermissionContext).hasUserPermission;
|
523
|
+
return hasUserPermission;
|
524
|
+
};
|
525
|
+
var useSetAdminRole = function () {
|
526
|
+
var setAdminRole = useContext(PermissionContext).setAdminRole;
|
527
|
+
return setAdminRole;
|
528
|
+
};
|
529
|
+
|
530
|
+
function AddButton(_a) {
|
531
|
+
var setSelectNewItemPosition = _a.setSelectNewItemPosition;
|
532
|
+
var layers = useLayers();
|
533
|
+
var hasUserPermission = useHasUserPermission();
|
534
|
+
var canAddItems = function () {
|
535
|
+
var canAdd = false;
|
536
|
+
layers.map(function (layer) {
|
537
|
+
var _a;
|
538
|
+
if (((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && hasUserPermission(layer.api.collectionName, "create"))
|
539
|
+
canAdd = true;
|
540
|
+
});
|
541
|
+
return canAdd;
|
542
|
+
};
|
543
|
+
return (React.createElement(React.Fragment, null, canAddItems() ?
|
544
|
+
React.createElement("div", { className: "tw-dropdown tw-dropdown-top tw-dropdown-end tw-dropdown-hover tw-z-500 tw-absolute tw-right-4 tw-bottom-4" },
|
545
|
+
React.createElement("label", { tabIndex: 0, className: "tw-z-500 tw-btn tw-btn-circle tw-shadow tw-bg-base-100" },
|
546
|
+
React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: "2", stroke: "currentColor", className: "tw-w-5 tw-h-5" },
|
547
|
+
React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4.5v15m7.5-7.5h-15" }))),
|
548
|
+
React.createElement("ul", { tabIndex: 0, className: "tw-dropdown-content tw-pr-1 tw-list-none" }, layers.map(function (layer) {
|
549
|
+
var _a;
|
550
|
+
return (((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && hasUserPermission(layer.api.collectionName, "create") && (React.createElement("li", { key: layer.name },
|
551
|
+
React.createElement("a", null,
|
552
|
+
React.createElement("div", { className: "tw-tooltip tw-tooltip-left", "data-tip": layer.menuText },
|
553
|
+
React.createElement("button", { tabIndex: 0, className: "tw-z-500 tw-border-0 tw-pl-2 tw-p-0 tw-mb-3 tw-w-10 tw-h-10 tw-cursor-pointer tw-rounded-full tw-mouse tw-drop-shadow-md tw-transition tw-ease-in tw-duration-200 focus:tw-outline-none", style: { backgroundColor: layer.menuColor }, onClick: function () { setSelectNewItemPosition(layer); } },
|
554
|
+
React.createElement(DynamicHeroIcon, { type: 'solid', icon: layer.menuIcon })))))));
|
555
|
+
}))) : ""));
|
556
|
+
}
|
557
|
+
|
558
|
+
var ItemContext = createContext({
|
559
|
+
items: [],
|
560
|
+
addItem: function () { },
|
561
|
+
updateItem: function () { },
|
562
|
+
removeItem: function () { },
|
563
|
+
resetItems: function () { },
|
564
|
+
setItemsApi: function () { },
|
565
|
+
setItemsData: function () { },
|
566
|
+
});
|
567
|
+
function useItemsManager(initialItems) {
|
568
|
+
var _this = this;
|
569
|
+
var addLayer = useAddLayer();
|
570
|
+
var _a = useReducer(function (state, action) {
|
571
|
+
switch (action.type) {
|
572
|
+
case "ADD":
|
573
|
+
var exist = state.find(function (item) {
|
574
|
+
return item.id === action.item.id ? true : false;
|
575
|
+
});
|
576
|
+
if (!exist)
|
577
|
+
return __spreadArray(__spreadArray([], state, true), [
|
578
|
+
action.item,
|
579
|
+
], false);
|
580
|
+
else
|
581
|
+
return state;
|
582
|
+
case "UPDATE":
|
583
|
+
return state.map(function (item) {
|
226
584
|
if (item.id === action.item.id) {
|
227
585
|
return action.item;
|
228
586
|
}
|
@@ -231,23 +589,63 @@ function useItemsManager(initialItems) {
|
|
231
589
|
case "REMOVE":
|
232
590
|
return state.filter(function (item) { return item !== action.item; });
|
233
591
|
case "RESET":
|
234
|
-
return state.filter(function (item) { return item.layer.name !== action.layer.name; });
|
592
|
+
return state.filter(function (item) { var _a; return ((_a = item.layer) === null || _a === void 0 ? void 0 : _a.name) !== action.layer.name; });
|
235
593
|
default:
|
236
594
|
throw new Error();
|
237
595
|
}
|
238
596
|
}, initialItems), items = _a[0], dispatch = _a[1];
|
239
|
-
var
|
240
|
-
|
241
|
-
|
242
|
-
|
597
|
+
var setItemsApi = useCallback(function (layer) { return __awaiter(_this, void 0, void 0, function () {
|
598
|
+
var result;
|
599
|
+
var _a;
|
600
|
+
return __generator(this, function (_b) {
|
601
|
+
switch (_b.label) {
|
602
|
+
case 0:
|
603
|
+
((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && addLayer(layer);
|
604
|
+
return [4 /*yield*/, toast.promise(layer.api.getItems(), {
|
605
|
+
pending: "loading ".concat(layer.name, " ..."),
|
606
|
+
success: "".concat(layer.name, " loaded"),
|
607
|
+
error: {
|
608
|
+
render: function (_a) {
|
609
|
+
var data = _a.data;
|
610
|
+
return "".concat(data);
|
611
|
+
},
|
612
|
+
},
|
613
|
+
})];
|
614
|
+
case 1:
|
615
|
+
result = _b.sent();
|
616
|
+
if (result) {
|
617
|
+
result.map(function (item) {
|
618
|
+
dispatch({ type: "ADD", item: __assign(__assign({}, item), { layer: layer }) });
|
619
|
+
});
|
620
|
+
}
|
621
|
+
return [2 /*return*/];
|
622
|
+
}
|
243
623
|
});
|
244
|
-
}, []);
|
245
|
-
var
|
246
|
-
|
247
|
-
|
248
|
-
item: item,
|
624
|
+
}); }, []);
|
625
|
+
var setItemsData = useCallback(function (layer) {
|
626
|
+
var _a;
|
627
|
+
(_a = layer.data) === null || _a === void 0 ? void 0 : _a.map(function (item) {
|
628
|
+
dispatch({ type: "ADD", item: __assign(__assign({}, item), { layer: layer }) });
|
249
629
|
});
|
250
630
|
}, []);
|
631
|
+
var addItem = useCallback(function (item) { return __awaiter(_this, void 0, void 0, function () {
|
632
|
+
return __generator(this, function (_a) {
|
633
|
+
dispatch({
|
634
|
+
type: "ADD",
|
635
|
+
item: item,
|
636
|
+
});
|
637
|
+
return [2 /*return*/];
|
638
|
+
});
|
639
|
+
}); }, []);
|
640
|
+
var updateItem = useCallback(function (item) { return __awaiter(_this, void 0, void 0, function () {
|
641
|
+
return __generator(this, function (_a) {
|
642
|
+
dispatch({
|
643
|
+
type: "UPDATE",
|
644
|
+
item: item,
|
645
|
+
});
|
646
|
+
return [2 /*return*/];
|
647
|
+
});
|
648
|
+
}); }, []);
|
251
649
|
var removeItem = useCallback(function (item) {
|
252
650
|
dispatch({
|
253
651
|
type: "REMOVE",
|
@@ -260,7 +658,7 @@ function useItemsManager(initialItems) {
|
|
260
658
|
layer: layer
|
261
659
|
});
|
262
660
|
}, []);
|
263
|
-
return { items: items, updateItem: updateItem, addItem: addItem, removeItem: removeItem, resetItems: resetItems };
|
661
|
+
return { items: items, updateItem: updateItem, addItem: addItem, removeItem: removeItem, resetItems: resetItems, setItemsApi: setItemsApi, setItemsData: setItemsData };
|
264
662
|
}
|
265
663
|
var ItemsProvider = function (_a) {
|
266
664
|
var initialItems = _a.initialItems, children = _a.children;
|
@@ -282,51 +680,101 @@ var useRemoveItem = function () {
|
|
282
680
|
var removeItem = useContext(ItemContext).removeItem;
|
283
681
|
return removeItem;
|
284
682
|
};
|
285
|
-
var
|
286
|
-
var
|
287
|
-
return
|
683
|
+
var useSetItemsApi = function () {
|
684
|
+
var setItemsApi = useContext(ItemContext).setItemsApi;
|
685
|
+
return setItemsApi;
|
686
|
+
};
|
687
|
+
var useSetItemsData = function () {
|
688
|
+
var setItemsData = useContext(ItemContext).setItemsData;
|
689
|
+
return setItemsData;
|
288
690
|
};
|
289
691
|
|
692
|
+
var hashTagRegex = /(#+[a-zA-Z0-9A-Za-zÀ-ÖØ-öø-ʸ(_)]{1,})/g;
|
693
|
+
|
290
694
|
var TagContext = createContext({
|
291
695
|
tags: [],
|
292
696
|
addTag: function () { },
|
293
|
-
removeTag: function () { }
|
697
|
+
removeTag: function () { },
|
698
|
+
setTagApi: function () { },
|
699
|
+
setTagData: function () { },
|
700
|
+
getItemTags: function () { return []; }
|
294
701
|
});
|
295
702
|
function useTagsManager(initialTags) {
|
703
|
+
var _this = this;
|
296
704
|
var _a = useReducer(function (state, action) {
|
297
705
|
switch (action.type) {
|
298
706
|
case "ADD":
|
299
707
|
var exist = state.find(function (tag) {
|
300
|
-
return tag.id === action.tag.id ? true : false;
|
708
|
+
return tag.id.toLocaleLowerCase() === action.tag.id.toLocaleLowerCase() ? true : false;
|
301
709
|
});
|
302
710
|
if (!exist)
|
303
711
|
return __spreadArray(__spreadArray([], state, true), [
|
304
|
-
action.tag,
|
712
|
+
__assign(__assign({}, action.tag), { id: action.tag.id.toLocaleLowerCase() })
|
305
713
|
], false);
|
306
714
|
else
|
307
715
|
return state;
|
308
716
|
case "REMOVE":
|
309
717
|
return state.filter(function (_a) {
|
310
718
|
var id = _a.id;
|
311
|
-
return id !== action.id;
|
719
|
+
return id !== action.id.toLocaleLowerCase();
|
312
720
|
});
|
313
721
|
default:
|
314
722
|
throw new Error();
|
315
723
|
}
|
316
724
|
}, initialTags), tags = _a[0], dispatch = _a[1];
|
317
|
-
var
|
725
|
+
var _b = React.useState({}), api = _b[0], setApi = _b[1];
|
726
|
+
var setTagApi = useCallback(function (api) { return __awaiter(_this, void 0, void 0, function () {
|
727
|
+
var result;
|
728
|
+
return __generator(this, function (_a) {
|
729
|
+
switch (_a.label) {
|
730
|
+
case 0:
|
731
|
+
setApi(api);
|
732
|
+
return [4 /*yield*/, api.getItems()];
|
733
|
+
case 1:
|
734
|
+
result = _a.sent();
|
735
|
+
if (result) {
|
736
|
+
result.map(function (tag) {
|
737
|
+
tag.id = tag.id.toLocaleLowerCase();
|
738
|
+
dispatch({ type: "ADD", tag: tag });
|
739
|
+
});
|
740
|
+
}
|
741
|
+
return [2 /*return*/];
|
742
|
+
}
|
743
|
+
});
|
744
|
+
}); }, []);
|
745
|
+
var setTagData = useCallback(function (data) {
|
746
|
+
data.map(function (tag) {
|
747
|
+
tag.id = tag.id.toLocaleLowerCase();
|
748
|
+
dispatch({ type: "ADD", tag: tag });
|
749
|
+
});
|
750
|
+
}, []);
|
751
|
+
var addTag = function (tag) {
|
318
752
|
dispatch({
|
319
753
|
type: "ADD",
|
320
754
|
tag: tag,
|
321
755
|
});
|
322
|
-
|
756
|
+
if (!tags.some(function (t) { return t.id.toLocaleLowerCase() === tag.id.toLocaleLowerCase(); })) {
|
757
|
+
(api === null || api === void 0 ? void 0 : api.createItem) && api.createItem(tag);
|
758
|
+
}
|
759
|
+
};
|
323
760
|
var removeTag = useCallback(function (id) {
|
324
761
|
dispatch({
|
325
762
|
type: "REMOVE",
|
326
763
|
id: id,
|
327
764
|
});
|
765
|
+
(api === null || api === void 0 ? void 0 : api.deleteItem) && api.deleteItem(id);
|
328
766
|
}, []);
|
329
|
-
|
767
|
+
var getItemTags = useCallback(function (item) {
|
768
|
+
var itemTagStrings = item.text.toLocaleLowerCase().match(hashTagRegex);
|
769
|
+
var itemTags = [];
|
770
|
+
itemTagStrings === null || itemTagStrings === void 0 ? void 0 : itemTagStrings.map(function (tag) {
|
771
|
+
if (tags.find(function (t) { return t.id === tag.slice(1); })) {
|
772
|
+
itemTags.push(tags.find(function (t) { return t.id === tag.slice(1); }));
|
773
|
+
}
|
774
|
+
});
|
775
|
+
return itemTags;
|
776
|
+
}, [tags]);
|
777
|
+
return { tags: tags, addTag: addTag, removeTag: removeTag, setTagApi: setTagApi, setTagData: setTagData, getItemTags: getItemTags };
|
330
778
|
}
|
331
779
|
var TagsProvider = function (_a) {
|
332
780
|
var initialTags = _a.initialTags, children = _a.children;
|
@@ -339,49 +787,401 @@ var useTags = function () {
|
|
339
787
|
var useAddTag = function () {
|
340
788
|
var addTag = useContext(TagContext).addTag;
|
341
789
|
return addTag;
|
790
|
+
};
|
791
|
+
var useSetTagApi = function () {
|
792
|
+
var setTagApi = useContext(TagContext).setTagApi;
|
793
|
+
return setTagApi;
|
794
|
+
};
|
795
|
+
var useSetTagData = function () {
|
796
|
+
var setTagData = useContext(TagContext).setTagData;
|
797
|
+
return setTagData;
|
798
|
+
};
|
799
|
+
var useGetItemTags = function () {
|
800
|
+
var getItemTags = useContext(TagContext).getItemTags;
|
801
|
+
return getItemTags;
|
342
802
|
};
|
343
803
|
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
804
|
+
var FilterContext = createContext({
|
805
|
+
filterTags: [],
|
806
|
+
searchPhrase: "",
|
807
|
+
visibleLayers: [],
|
808
|
+
addFilterTag: function () { },
|
809
|
+
removeFilterTag: function () { },
|
810
|
+
resetFilterTags: function () { },
|
811
|
+
setSearchPhrase: function () { },
|
812
|
+
addVisibleLayer: function () { },
|
813
|
+
toggleVisibleLayer: function () { },
|
814
|
+
resetVisibleLayers: function () { },
|
815
|
+
isLayerVisible: function () { return true; }
|
816
|
+
});
|
817
|
+
function useFilterManager(initialTags) {
|
818
|
+
var _a = useReducer(function (state, action) {
|
819
|
+
switch (action.type) {
|
820
|
+
case "ADD_TAG":
|
821
|
+
var exist = state.find(function (tag) {
|
822
|
+
return tag.id === action.tag.id ? true : false;
|
823
|
+
});
|
824
|
+
if (!exist)
|
825
|
+
return __spreadArray(__spreadArray([], state, true), [
|
826
|
+
action.tag,
|
827
|
+
], false);
|
828
|
+
else
|
829
|
+
return state;
|
830
|
+
case "REMOVE_TAG":
|
831
|
+
return state.filter(function (_a) {
|
832
|
+
var id = _a.id;
|
833
|
+
return id !== action.id;
|
834
|
+
});
|
835
|
+
case "RESET_TAGS":
|
836
|
+
return initialTags;
|
837
|
+
default:
|
838
|
+
throw new Error();
|
839
|
+
}
|
840
|
+
}, initialTags), filterTags = _a[0], dispatchTags = _a[1];
|
841
|
+
var initialLayers = useLayers();
|
842
|
+
var _b = useReducer(function (state, action) {
|
843
|
+
switch (action.type) {
|
844
|
+
case "ADD_LAYER":
|
845
|
+
var exist1 = state.find(function (layer) {
|
846
|
+
return layer.name === action.layer.name ? true : false;
|
847
|
+
});
|
848
|
+
if (!exist1)
|
849
|
+
return __spreadArray(__spreadArray([], state, true), [
|
850
|
+
action.layer,
|
851
|
+
], false);
|
852
|
+
else
|
853
|
+
return state;
|
854
|
+
case "TOGGLE_LAYER":
|
855
|
+
var exist2 = state.some(function (layer) {
|
856
|
+
return layer.name === action.layer.name;
|
857
|
+
});
|
858
|
+
if (exist2)
|
859
|
+
return state.filter(function (_a) {
|
860
|
+
var name = _a.name;
|
861
|
+
return name != action.layer.name;
|
862
|
+
});
|
863
|
+
else
|
864
|
+
return __spreadArray(__spreadArray([], state, true), [action.layer], false);
|
865
|
+
case "RESET_LAYERS":
|
866
|
+
return initialLayers;
|
867
|
+
default:
|
868
|
+
throw new Error();
|
869
|
+
}
|
870
|
+
}, initialLayers), visibleLayers = _b[0], dispatchLayers = _b[1];
|
871
|
+
var _c = React.useState(""), searchPhrase = _c[0], searchPhraseSet = _c[1];
|
872
|
+
var addFilterTag = function (tag) {
|
873
|
+
dispatchTags({
|
874
|
+
type: "ADD_TAG",
|
875
|
+
tag: tag,
|
876
|
+
});
|
877
|
+
};
|
878
|
+
var removeFilterTag = useCallback(function (id) {
|
879
|
+
dispatchTags({
|
880
|
+
type: "REMOVE_TAG",
|
881
|
+
id: id,
|
882
|
+
});
|
883
|
+
}, []);
|
884
|
+
var resetFilterTags = useCallback(function () {
|
885
|
+
dispatchTags({
|
886
|
+
type: "RESET_TAGS",
|
887
|
+
});
|
888
|
+
}, []);
|
889
|
+
var addVisibleLayer = function (layer) {
|
890
|
+
dispatchLayers({
|
891
|
+
type: "ADD_LAYER",
|
892
|
+
layer: layer,
|
893
|
+
});
|
894
|
+
};
|
895
|
+
var toggleVisibleLayer = function (layer) {
|
896
|
+
dispatchLayers({
|
897
|
+
type: "TOGGLE_LAYER",
|
898
|
+
layer: layer,
|
899
|
+
});
|
900
|
+
};
|
901
|
+
var resetVisibleLayers = useCallback(function () {
|
902
|
+
dispatchLayers({
|
903
|
+
type: "RESET_LAYERS",
|
904
|
+
});
|
905
|
+
}, []);
|
906
|
+
var isLayerVisible = useCallback(function (layer) {
|
907
|
+
return visibleLayers.some(function (l) { return l.name === layer.name; });
|
908
|
+
}, [visibleLayers]);
|
909
|
+
var setSearchPhrase = useCallback(function (phrase) {
|
910
|
+
searchPhraseSet(phrase);
|
911
|
+
}, []);
|
912
|
+
return { filterTags: filterTags, addFilterTag: addFilterTag, removeFilterTag: removeFilterTag, resetFilterTags: resetFilterTags, setSearchPhrase: setSearchPhrase, searchPhrase: searchPhrase, visibleLayers: visibleLayers, toggleVisibleLayer: toggleVisibleLayer, resetVisibleLayers: resetVisibleLayers, isLayerVisible: isLayerVisible, addVisibleLayer: addVisibleLayer };
|
913
|
+
}
|
914
|
+
var FilterProvider = function (_a) {
|
915
|
+
var initialTags = _a.initialTags, children = _a.children;
|
916
|
+
return (React.createElement(FilterContext.Provider, { value: useFilterManager(initialTags) }, children));
|
917
|
+
};
|
918
|
+
var useFilterTags = function () {
|
919
|
+
var filterTags = useContext(FilterContext).filterTags;
|
920
|
+
return filterTags;
|
921
|
+
};
|
922
|
+
var useAddFilterTag = function () {
|
923
|
+
var addFilterTag = useContext(FilterContext).addFilterTag;
|
924
|
+
return addFilterTag;
|
925
|
+
};
|
926
|
+
var useRemoveFilterTag = function () {
|
927
|
+
var removeFilterTag = useContext(FilterContext).removeFilterTag;
|
928
|
+
return removeFilterTag;
|
929
|
+
};
|
930
|
+
var useResetFilterTags = function () {
|
931
|
+
var resetFilterTags = useContext(FilterContext).resetFilterTags;
|
932
|
+
return resetFilterTags;
|
933
|
+
};
|
934
|
+
var useSearchPhrase = function () {
|
935
|
+
var searchPhrase = useContext(FilterContext).searchPhrase;
|
936
|
+
return searchPhrase;
|
937
|
+
};
|
938
|
+
var useSetSearchPhrase = function () {
|
939
|
+
var setSearchPhrase = useContext(FilterContext).setSearchPhrase;
|
940
|
+
return setSearchPhrase;
|
941
|
+
};
|
942
|
+
var useAddVisibleLayer = function () {
|
943
|
+
var addVisibleLayer = useContext(FilterContext).addVisibleLayer;
|
944
|
+
return addVisibleLayer;
|
945
|
+
};
|
946
|
+
var useToggleVisibleLayer = function () {
|
947
|
+
var toggleVisibleLayer = useContext(FilterContext).toggleVisibleLayer;
|
948
|
+
return toggleVisibleLayer;
|
949
|
+
};
|
950
|
+
var useIsLayerVisible = function () {
|
951
|
+
var isLayerVisible = useContext(FilterContext).isLayerVisible;
|
952
|
+
return isLayerVisible;
|
953
|
+
};
|
954
|
+
|
955
|
+
function getWindowDimensions() {
|
956
|
+
var width = window.innerWidth, height = window.innerHeight;
|
957
|
+
return {
|
958
|
+
width: width,
|
959
|
+
height: height
|
960
|
+
};
|
961
|
+
}
|
962
|
+
function useWindowDimensions() {
|
963
|
+
var _a = useState(getWindowDimensions()), windowDimensions = _a[0], setWindowDimensions = _a[1];
|
964
|
+
useEffect(function () {
|
965
|
+
function handleResize() {
|
966
|
+
setWindowDimensions(getWindowDimensions());
|
967
|
+
}
|
968
|
+
window.addEventListener('resize', handleResize);
|
969
|
+
return function () { return window.removeEventListener('resize', handleResize); };
|
970
|
+
}, []);
|
971
|
+
return windowDimensions;
|
972
|
+
}
|
973
|
+
|
974
|
+
function capitalizeFirstLetter(string) {
|
975
|
+
return string.charAt(0).toUpperCase() + string.slice(1);
|
976
|
+
}
|
977
|
+
var FilterControl = function () {
|
978
|
+
var windowDimensions = useWindowDimensions();
|
979
|
+
/**
|
980
|
+
const [popupOpen, setPopupOpen] = useState<boolean>(false);
|
981
|
+
|
982
|
+
useMapEvents({
|
983
|
+
popupopen: (e) => {
|
984
|
+
console.log(e);
|
985
|
+
|
986
|
+
setPopupOpen(true);
|
987
|
+
},
|
988
|
+
popupclose: () => {
|
989
|
+
setPopupOpen(false);
|
351
990
|
}
|
352
|
-
}
|
353
|
-
|
354
|
-
|
991
|
+
})
|
992
|
+
*/
|
993
|
+
var filterTags = useFilterTags();
|
994
|
+
var removeFilterTag = useRemoveFilterTag();
|
995
|
+
var setSearchPhrase = useSetSearchPhrase();
|
996
|
+
return (React.createElement(React.Fragment, null, !(
|
997
|
+
//popupOpen &&
|
998
|
+
windowDimensions.height < 500) &&
|
999
|
+
React.createElement("div", { className: 'tw-flex tw-flex-col tw-absolute tw-top-4 tw-left-4 tw-z-[699] tw-w-[calc(100vw-2rem)] tw-max-w-sm' },
|
1000
|
+
React.createElement("input", { type: "text", placeholder: "search ...", className: "tw-input tw-input-bordered tw-w-full tw-shadow-xl tw-rounded-lg", onChange: function (e) { return setSearchPhrase(e.target.value); } }),
|
1001
|
+
React.createElement("div", { className: 'tw-flex tw-flex-wrap tw-mt-4' }, filterTags.map(function (tag) {
|
1002
|
+
return React.createElement("div", { key: tag.id, className: 'tw-rounded-2xl tw-text-white tw-p-2 tw-px-4 tw-shadow-xl tw-card tw-mr-2 tw-mb-2', style: { backgroundColor: tag.color } },
|
1003
|
+
React.createElement("div", { className: "tw-card-actions tw-justify-end" },
|
1004
|
+
React.createElement("label", { className: "tw-btn tw-btn-xs tw-btn-circle tw-absolute tw--right-2 tw--top-2 tw-bg-white tw-text-gray-600", onClick: function () { return (removeFilterTag(tag.id)); } }, "\u2715")),
|
1005
|
+
React.createElement("b", null,
|
1006
|
+
"#",
|
1007
|
+
capitalizeFirstLetter(tag.id)));
|
1008
|
+
})))));
|
1009
|
+
};
|
1010
|
+
|
1011
|
+
var LeafletRefsContext = createContext({
|
1012
|
+
leafletRefs: {},
|
1013
|
+
addMarker: function () { },
|
1014
|
+
addPopup: function () { },
|
1015
|
+
});
|
1016
|
+
function useLeafletRefsManager(initialLeafletRefs) {
|
1017
|
+
var _a = useReducer(function (state, action) {
|
1018
|
+
var _a, _b;
|
1019
|
+
switch (action.type) {
|
1020
|
+
case "ADD_MARKER":
|
1021
|
+
return __assign(__assign({}, state), (_a = {}, _a[action.item.id] = __assign(__assign({}, state[action.item.id]), { marker: action.marker, item: action.item }), _a));
|
1022
|
+
case "ADD_POPUP":
|
1023
|
+
return __assign(__assign({}, state), (_b = {}, _b[action.item.id] = __assign(__assign({}, state[action.item.id]), { popup: action.popup, item: action.item }), _b));
|
1024
|
+
default:
|
1025
|
+
throw new Error();
|
355
1026
|
}
|
356
|
-
});
|
357
|
-
|
1027
|
+
}, initialLeafletRefs), leafletRefs = _a[0], dispatch = _a[1];
|
1028
|
+
var addMarker = useCallback(function (item, marker) {
|
1029
|
+
dispatch({
|
1030
|
+
type: "ADD_MARKER",
|
1031
|
+
item: item,
|
1032
|
+
marker: marker
|
1033
|
+
});
|
1034
|
+
}, []);
|
1035
|
+
var addPopup = useCallback(function (item, popup) {
|
1036
|
+
dispatch({
|
1037
|
+
type: "ADD_POPUP",
|
1038
|
+
item: item,
|
1039
|
+
popup: popup
|
1040
|
+
});
|
1041
|
+
}, []);
|
1042
|
+
return { leafletRefs: leafletRefs, addMarker: addMarker, addPopup: addPopup };
|
358
1043
|
}
|
1044
|
+
var LeafletRefsProvider = function (_a) {
|
1045
|
+
var initialLeafletRefs = _a.initialLeafletRefs, children = _a.children;
|
1046
|
+
return (React.createElement(LeafletRefsContext.Provider, { value: useLeafletRefsManager(initialLeafletRefs) }, children));
|
1047
|
+
};
|
1048
|
+
var useLeafletRefs = function () {
|
1049
|
+
var leafletRefs = useContext(LeafletRefsContext).leafletRefs;
|
1050
|
+
return leafletRefs;
|
1051
|
+
};
|
1052
|
+
var useAddMarker = function () {
|
1053
|
+
var addMarker = useContext(LeafletRefsContext).addMarker;
|
1054
|
+
return addMarker;
|
1055
|
+
};
|
1056
|
+
var useAddPopup = function () {
|
1057
|
+
var addPopup = useContext(LeafletRefsContext).addPopup;
|
1058
|
+
return addPopup;
|
1059
|
+
};
|
1060
|
+
|
1061
|
+
function LayerControl() {
|
1062
|
+
var _a = React.useState(false), open = _a[0], setOpen = _a[1];
|
1063
|
+
var layers = useLayers();
|
1064
|
+
useEffect(function () {
|
1065
|
+
layers.map(function (layer) {
|
1066
|
+
return addVisibleLayer(layer);
|
1067
|
+
});
|
1068
|
+
}, [layers]);
|
1069
|
+
var isLayerVisible = useIsLayerVisible();
|
1070
|
+
var toggleVisibleLayer = useToggleVisibleLayer();
|
1071
|
+
var addVisibleLayer = useAddVisibleLayer();
|
1072
|
+
return (React.createElement("div", { className: "tw-card tw-bg-base-100 tw-shadow-xl ", onClick: function (e) { return e.stopPropagation(); } }, open ?
|
1073
|
+
React.createElement("div", { className: "tw-card-body tw-p-2 tw-w-32 tw-transition-all tw-duration-300", onClick: function (e) { return e.stopPropagation(); } },
|
1074
|
+
React.createElement("label", { className: "tw-btn tw-btn-sm tw-rounded-2xl tw-btn-circle tw-btn-ghost hover:tw-bg-transparent tw-absolute tw-right-0 tw-top-0 tw-text-gray-600", onClick: function () { return setOpen(false); } },
|
1075
|
+
React.createElement("p", { className: 'tw-text-center ' }, "\u2715")),
|
1076
|
+
React.createElement("ul", { className: 'tw-flex-row' }, layers.map(function (layer) {
|
1077
|
+
return React.createElement("li", { key: layer.name },
|
1078
|
+
React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-1" },
|
1079
|
+
React.createElement("input", { type: "checkbox", className: "tw-checkbox tw-checkbox-xs tw-checkbox-success", checked: isLayerVisible(layer), onChange: function () { return toggleVisibleLayer(layer); } }),
|
1080
|
+
React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, layer.name)));
|
1081
|
+
})))
|
1082
|
+
:
|
1083
|
+
React.createElement("div", { className: "tw-card-body hover:tw-bg-slate-300 tw-card tw-p-2 tw-h-10 tw-w-10 tw-transition-all tw-duration-300 hover:tw-cursor-pointer", onClick: function () { return setOpen(true); } },
|
1084
|
+
React.createElement("svg", { version: "1.1", viewBox: "0 0 20 20", xmlns: "http://www.w3.org/2000/svg" },
|
1085
|
+
React.createElement("path", { id: "svg_1", fill: "currentColor", d: "m2.75565,11.90727l-1.03852,0.28372c-0.77718,0.38859 -0.77718,1.0138 0,1.4023l7.0156,3.5078c0.77718,0.38859 2.0275,0.38859 2.8047,0l7.0156,-3.5078c0.77718,-0.38859 0.77718,-1.0138 0,-1.4023l-0.63311,-0.48643l-4.67718,2.23624c-1.5452,0.77262 -3.31877,1.58343 -4.86407,0.81081l-5.62302,-2.84434z" }),
|
1086
|
+
React.createElement("path", { id: "svg_2", strokeWidth: "2", stroke: "currentColor", fill: "none", d: "m11.247,4.30851l6.2349,3.0877c0.69083,0.34211 0.69083,0.89295 0,1.2351l-6.2349,3.0877c-0.69083,0.34211 -1.8031,0.34212 -2.494,0l-6.2349,-3.0877c-0.69083,-0.34211 -0.69083,-0.89295 0,-1.2351l6.2349,-3.0877c0.69083,-0.34211 1.8031,-0.34211 2.494,0z" })))));
|
1087
|
+
}
|
1088
|
+
|
1089
|
+
var QuestContext = createContext({
|
1090
|
+
open: false,
|
1091
|
+
setQuestsOpen: function () { }
|
1092
|
+
});
|
1093
|
+
function useQuestsManager(initialOpen) {
|
1094
|
+
var _a = useState(initialOpen), open = _a[0], setOpen = _a[1];
|
1095
|
+
var setQuestsOpen = useCallback(function (questOpen) {
|
1096
|
+
setOpen(questOpen);
|
1097
|
+
}, []);
|
1098
|
+
return { open: open, setQuestsOpen: setQuestsOpen };
|
1099
|
+
}
|
1100
|
+
var QuestsProvider = function (_a) {
|
1101
|
+
var initialOpen = _a.initialOpen, children = _a.children;
|
1102
|
+
return (React.createElement(QuestContext.Provider, { value: useQuestsManager(initialOpen) }, children));
|
1103
|
+
};
|
1104
|
+
var useQuestsOpen = function () {
|
1105
|
+
var open = useContext(QuestContext).open;
|
1106
|
+
return open;
|
1107
|
+
};
|
1108
|
+
var useSetQuestOpen = function () {
|
1109
|
+
var setQuestsOpen = useContext(QuestContext).setQuestsOpen;
|
1110
|
+
return setQuestsOpen;
|
1111
|
+
};
|
1112
|
+
|
1113
|
+
function QuestControl() {
|
1114
|
+
var questsOpen = useQuestsOpen();
|
1115
|
+
var setQuestsOpen = useSetQuestOpen();
|
1116
|
+
return (React.createElement(React.Fragment, null, questsOpen ? "" :
|
1117
|
+
React.createElement("div", { className: "tw-card tw-bg-base-100 tw-shadow-xl tw-my-2 tw-w-10", onClick: function (e) { return e.stopPropagation(); } },
|
1118
|
+
React.createElement("div", { className: "tw-card-body hover:tw-bg-slate-300 tw-rounded-2xl tw-p-2 tw-h-10 tw-w-10 tw-transition-all tw-duration-300 hover:tw-cursor-pointer", onClick: function () { return setQuestsOpen(true); } },
|
1119
|
+
React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", stroke: "currentColor", viewBox: "0 0 448 512" },
|
1120
|
+
React.createElement("path", { d: "M192 0c17.7 0 32 14.3 32 32V144H160V32c0-17.7 14.3-32 32-32zM64 64c0-17.7 14.3-32 32-32s32 14.3 32 32v80H64V64zm192 0c0-17.7 14.3-32 32-32s32 14.3 32 32v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V64zm96 64c0-17.7 14.3-32 32-32s32 14.3 32 32v64c0 17.7-14.3 32-32 32s-32-14.3-32-32V128zm-96 88l0-.6c9.4 5.4 20.3 8.6 32 8.6c13.2 0 25.4-4 35.6-10.8c8.7 24.9 32.5 42.8 60.4 42.8c11.7 0 22.6-3.1 32-8.6V256c0 52.3-25.1 98.8-64 128v96c0 17.7-14.3 32-32 32H160c-17.7 0-32-14.3-32-32V401.6c-17.3-7.9-33.2-18.8-46.9-32.5L69.5 357.5C45.5 333.5 32 300.9 32 267V240c0-35.3 28.7-64 64-64h88c22.1 0 40 17.9 40 40s-17.9 40-40 40H128c-8.8 0-16 7.2-16 16s7.2 16 16 16h56c39.8 0 72-32.2 72-72z" }))))));
|
1121
|
+
}
|
1122
|
+
|
1123
|
+
var Control = function (_a) {
|
1124
|
+
var children = _a.children;
|
1125
|
+
return (React.createElement("div", { className: 'tw-absolute tw-bottom-4 tw-left-4 tw-z-[999] tw-flex-col' }, children));
|
1126
|
+
};
|
1127
|
+
|
359
1128
|
// for refreshing map on resize (needs to be implemented)
|
360
1129
|
var mapDivRef = React.createRef();
|
361
1130
|
function UtopiaMap(_a) {
|
362
1131
|
var _b = _a.height, height = _b === void 0 ? "500px" : _b, _c = _a.width, width = _c === void 0 ? "100%" : _c, _d = _a.center, center = _d === void 0 ? new LatLng(50.6, 9.5) : _d, _e = _a.zoom, zoom = _e === void 0 ? 10 : _e, children = _a.children;
|
363
|
-
var
|
364
|
-
var
|
1132
|
+
var meta = document.getElementsByTagName('meta');
|
1133
|
+
var _f = useState(meta), metaTags = _f[0]; _f[1];
|
1134
|
+
function MapEventListener(props) {
|
1135
|
+
useMapEvents({
|
1136
|
+
click: function (e) {
|
1137
|
+
var _a, _b, _c;
|
1138
|
+
window.history.pushState({}, "", "/");
|
1139
|
+
document.title = document.title.split("-")[0];
|
1140
|
+
(_a = document.querySelector('meta[property="og:title"]')) === null || _a === void 0 ? void 0 : _a.setAttribute("content", document.title);
|
1141
|
+
(_b = document.querySelector('meta[property="og:description"]')) === null || _b === void 0 ? void 0 : _b.setAttribute("content", "".concat((_c = document.querySelector('meta[name="description"]')) === null || _c === void 0 ? void 0 : _c.getAttribute("content")));
|
1142
|
+
meta = metaTags;
|
1143
|
+
console.log(e.latlng.lat + ',' + e.latlng.lng);
|
1144
|
+
if (props.selectNewItemPosition != null) {
|
1145
|
+
props.setItemFormPopup({ layer: props.selectNewItemPosition, position: e.latlng });
|
1146
|
+
props.setSelectNewItemPosition(null);
|
1147
|
+
}
|
1148
|
+
},
|
1149
|
+
resize: function () {
|
1150
|
+
console.log("resize");
|
1151
|
+
},
|
1152
|
+
});
|
1153
|
+
return null;
|
1154
|
+
}
|
1155
|
+
var _g = useState(null), selectNewItemPosition = _g[0], setSelectNewItemPosition = _g[1];
|
1156
|
+
var _h = useState(null), itemFormPopup = _h[0], setItemFormPopup = _h[1];
|
1157
|
+
var clusterRef = React.useRef();
|
365
1158
|
return (React.createElement(LayersProvider, { initialLayers: [] },
|
366
1159
|
React.createElement(TagsProvider, { initialTags: [] },
|
367
|
-
React.createElement(
|
368
|
-
React.createElement(
|
369
|
-
React.createElement(
|
370
|
-
React.createElement(
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
1160
|
+
React.createElement(PermissionsProvider, { initialPermissions: [] },
|
1161
|
+
React.createElement(FilterProvider, { initialTags: [] },
|
1162
|
+
React.createElement(ItemsProvider, { initialItems: [] },
|
1163
|
+
React.createElement(LeafletRefsProvider, { initialLeafletRefs: {} },
|
1164
|
+
React.createElement("div", { className: (selectNewItemPosition != null ? "crosshair-cursor-enabled" : undefined) },
|
1165
|
+
React.createElement(MapContainer, { ref: mapDivRef, style: { height: height, width: width }, center: center, zoom: zoom, zoomControl: false },
|
1166
|
+
React.createElement(FilterControl, null),
|
1167
|
+
React.createElement(Control, null,
|
1168
|
+
React.createElement(QuestControl, null),
|
1169
|
+
React.createElement(LayerControl, null)),
|
1170
|
+
React.createElement(TileLayer, { attribution: '\u00A9 <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors', url: "https://tile.osmand.net/hd/{z}/{x}/{y}.png" }),
|
1171
|
+
React.createElement(MarkerClusterGroup, { ref: clusterRef, showCoverageOnHover: true, chunkedLoading: true, maxClusterRadius: 50, removeOutsideVisibleBounds: false }, React.Children.toArray(children).map(function (child) {
|
1172
|
+
return React.isValidElement(child) ?
|
1173
|
+
React.cloneElement(child, { setItemFormPopup: setItemFormPopup, itemFormPopup: itemFormPopup, clusterRef: clusterRef }) : child;
|
1174
|
+
})),
|
1175
|
+
React.createElement(MapEventListener, { setSelectNewItemPosition: setSelectNewItemPosition, selectNewItemPosition: selectNewItemPosition, setItemFormPopup: setItemFormPopup })),
|
1176
|
+
React.createElement(AddButton, { setSelectNewItemPosition: setSelectNewItemPosition }),
|
1177
|
+
selectNewItemPosition != null &&
|
1178
|
+
React.createElement("div", { className: "tw-button tw-z-1000 tw-absolute tw-right-5 tw-top-4 tw-drop-shadow-md" },
|
1179
|
+
React.createElement("div", { className: "tw-alert tw-bg-base-100 tw-text-base-content" },
|
1180
|
+
React.createElement("div", null,
|
1181
|
+
React.createElement("span", null,
|
1182
|
+
"Select ",
|
1183
|
+
selectNewItemPosition.name,
|
1184
|
+
" position!"))))))))))));
|
385
1185
|
}
|
386
1186
|
|
387
1187
|
var createSvg = function (shape, markerColor, borderColor) {
|
@@ -399,6 +1199,12 @@ var addIcon = function (icon) {
|
|
399
1199
|
return '<svg fill="#fff" class="circle-icon" width="13"xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256z"/></svg>';
|
400
1200
|
case "calendar-days-solid":
|
401
1201
|
return '<svg fill="#fff" class="calendar-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M160 32V64H288V32C288 14.33 302.3 0 320 0C337.7 0 352 14.33 352 32V64H400C426.5 64 448 85.49 448 112V160H0V112C0 85.49 21.49 64 48 64H96V32C96 14.33 110.3 0 128 0C145.7 0 160 14.33 160 32zM0 192H448V464C448 490.5 426.5 512 400 512H48C21.49 512 0 490.5 0 464V192zM64 304C64 312.8 71.16 320 80 320H112C120.8 320 128 312.8 128 304V272C128 263.2 120.8 256 112 256H80C71.16 256 64 263.2 64 272V304zM192 304C192 312.8 199.2 320 208 320H240C248.8 320 256 312.8 256 304V272C256 263.2 248.8 256 240 256H208C199.2 256 192 263.2 192 272V304zM336 256C327.2 256 320 263.2 320 272V304C320 312.8 327.2 320 336 320H368C376.8 320 384 312.8 384 304V272C384 263.2 376.8 256 368 256H336zM64 432C64 440.8 71.16 448 80 448H112C120.8 448 128 440.8 128 432V400C128 391.2 120.8 384 112 384H80C71.16 384 64 391.2 64 400V432zM208 384C199.2 384 192 391.2 192 400V432C192 440.8 199.2 448 208 448H240C248.8 448 256 440.8 256 432V400C256 391.2 248.8 384 240 384H208zM320 432C320 440.8 327.2 448 336 448H368C376.8 448 384 440.8 384 432V400C384 391.2 376.8 384 368 384H336C327.2 384 320 391.2 320 400V432z"/></svg>';
|
1202
|
+
case "user":
|
1203
|
+
return '<svg fill="#fff" class="user-icon" xmlns="http://www.w3.org/2000/svg" height="1.5em" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z"/></svg>';
|
1204
|
+
case "fire":
|
1205
|
+
return '<svg fill="#fff" class="fire-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.534 26.387"><path d="M7.15 26.05C2.894 24.876.006 21.028.006 16.53c0-4.036 2.718-8.378 4.38-6.999.289.24.383.993.383 3.074 0 3.3.46 4.508 1.997 5.237 2.512 1.192 5.206-1.18 4.506-3.969-.097-.386-.99-1.562-1.986-2.614C7.04 8.887 6.583 8.026 6.583 6.176c0-2.333 2.02-6.182 3.244-6.182.59 0 1.292.98 1.292 1.805 0 1.227.951 2.596 3.727 5.362 3.655 3.642 4.493 5.216 4.671 8.776.143 2.847-.365 4.593-1.93 6.644-2.332 3.054-6.69 4.503-10.437 3.47z"/></svg>';
|
1206
|
+
case "tree":
|
1207
|
+
return '<svg svg fill="#fff" class="tree-icon" xmlns="http://www.w3.org/2000/svg" height="2em" xml:space="preserve" viewBox="0 0 24 24"><path d="M11 21v-4.3c-.5.2-1 .3-1.5.3C7 17 5 15 5 12.5c0-1.3.5-2.4 1.4-3.2-.3-.6-.4-1.2-.4-1.8C6 5 8 3 10.5 3c1.6 0 2.9.8 3.8 2h.2c3 0 5.5 2.5 5.5 5.5S17.5 16 14.5 16c-.5 0-1-.1-1.5-.2V21h-2z"/><path fill="none" d="M0 0h24v24H0z"/></svg>';
|
402
1208
|
default:
|
403
1209
|
return "";
|
404
1210
|
}
|
@@ -415,14 +1221,46 @@ var MarkerIconFactory = function (shape, color1, color2, icon) {
|
|
415
1221
|
};
|
416
1222
|
|
417
1223
|
function HeaderView(_a) {
|
418
|
-
var
|
1224
|
+
var _this = this;
|
1225
|
+
var _b, _c, _d, _e, _f, _g, _h, _j;
|
1226
|
+
var item = _a.item, title = _a.title, avatar = _a.avatar, owner = _a.owner, setItemFormPopup = _a.setItemFormPopup;
|
1227
|
+
var _k = React.useState(false), loading = _k[0], setLoading = _k[1];
|
419
1228
|
var removeItem = useRemoveItem();
|
420
1229
|
var map = useMap();
|
421
|
-
var
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
1230
|
+
var hasUserPermission = useHasUserPermission();
|
1231
|
+
var user = useAuth().user;
|
1232
|
+
var removeItemFromMap = function (event) { return __awaiter(_this, void 0, void 0, function () {
|
1233
|
+
var success, error_1;
|
1234
|
+
var _a, _b;
|
1235
|
+
return __generator(this, function (_c) {
|
1236
|
+
switch (_c.label) {
|
1237
|
+
case 0:
|
1238
|
+
setLoading(true);
|
1239
|
+
success = false;
|
1240
|
+
_c.label = 1;
|
1241
|
+
case 1:
|
1242
|
+
_c.trys.push([1, 3, , 4]);
|
1243
|
+
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))];
|
1244
|
+
case 2:
|
1245
|
+
_c.sent();
|
1246
|
+
success = true;
|
1247
|
+
return [3 /*break*/, 4];
|
1248
|
+
case 3:
|
1249
|
+
error_1 = _c.sent();
|
1250
|
+
toast.error(error_1.toString());
|
1251
|
+
return [3 /*break*/, 4];
|
1252
|
+
case 4:
|
1253
|
+
if (success) {
|
1254
|
+
removeItem(item);
|
1255
|
+
toast.success("Item deleted");
|
1256
|
+
}
|
1257
|
+
setLoading(false);
|
1258
|
+
map.closePopup();
|
1259
|
+
event.stopPropagation();
|
1260
|
+
return [2 /*return*/];
|
1261
|
+
}
|
1262
|
+
});
|
1263
|
+
}); };
|
426
1264
|
var openEditPopup = function (event) {
|
427
1265
|
event.stopPropagation();
|
428
1266
|
map.closePopup();
|
@@ -431,71 +1269,129 @@ function HeaderView(_a) {
|
|
431
1269
|
};
|
432
1270
|
return (React.createElement("div", { className: 'tw-grid tw-grid-cols-6 tw-pb-2' },
|
433
1271
|
React.createElement("div", { className: 'tw-col-span-5' },
|
434
|
-
React.createElement("
|
435
|
-
|
1272
|
+
React.createElement("div", { className: "tw-flex tw-flex-row" },
|
1273
|
+
avatar ?
|
1274
|
+
React.createElement("div", { className: "tw-w-10 tw-rounded-full" },
|
1275
|
+
React.createElement("img", { className: "tw-rounded-full", src: avatar }))
|
1276
|
+
:
|
1277
|
+
"",
|
1278
|
+
React.createElement("b", { className: "tw-text-xl tw-font-bold ".concat(avatar ? "tw-ml-2 tw-mt-1" : "") }, title ? title : item.name))),
|
1279
|
+
React.createElement("div", { className: 'tw-col-span-1' }, (((_c = (_b = item.layer) === null || _b === void 0 ? void 0 : _b.api) === null || _c === void 0 ? void 0 : _c.deleteItem) || ((_e = (_d = item.layer) === null || _d === void 0 ? void 0 : _d.api) === null || _e === void 0 ? void 0 : _e.updateItem))
|
1280
|
+
&& ((user && owner === user.id) || owner == undefined)
|
1281
|
+
&& (hasUserPermission((_f = item.layer.api) === null || _f === void 0 ? void 0 : _f.collectionName, "delete") || hasUserPermission((_g = item.layer.api) === null || _g === void 0 ? void 0 : _g.collectionName, "update")) &&
|
436
1282
|
React.createElement("div", { className: "tw-dropdown tw-dropdown-bottom" },
|
437
|
-
React.createElement("label", { tabIndex: 0, className: "tw-
|
1283
|
+
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" },
|
438
1284
|
React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
|
439
1285
|
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" }))),
|
440
|
-
React.createElement("ul", { tabIndex: 0, className: "tw-dropdown-content tw-menu tw-p-2 tw-shadow tw-bg-base-100 tw-rounded-box" },
|
441
|
-
item.api.updateItem && React.createElement("li", null,
|
442
|
-
React.createElement("a", { className:
|
1286
|
+
React.createElement("ul", { tabIndex: 0, className: "tw-dropdown-content tw-menu tw-p-2 tw-shadow tw-bg-base-100 tw-rounded-box tw-z-1000" },
|
1287
|
+
item.layer.api.updateItem && hasUserPermission((_h = item.layer.api) === null || _h === void 0 ? void 0 : _h.collectionName, "update") && React.createElement("li", null,
|
1288
|
+
React.createElement("a", { className: "!tw-text-base-content", onClick: openEditPopup },
|
443
1289
|
React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
|
444
1290
|
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" })))),
|
445
|
-
item.api.deleteItem && React.createElement("li", null,
|
446
|
-
React.createElement("a", { className: 'tw-
|
447
|
-
|
448
|
-
React.createElement("
|
1291
|
+
item.layer.api.deleteItem && hasUserPermission((_j = item.layer.api) === null || _j === void 0 ? void 0 : _j.collectionName, "delete") && React.createElement("li", null,
|
1292
|
+
React.createElement("a", { className: ' !tw-text-error', onClick: removeItemFromMap }, loading ? React.createElement("span", { className: "tw-loading tw-loading-spinner tw-loading-sm" })
|
1293
|
+
:
|
1294
|
+
React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
|
1295
|
+
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" })))))))));
|
449
1296
|
}
|
450
1297
|
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
var urlRegex = /(^| )(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,10}(:[0-9]{1,10})?(\/.*)?$/gm;
|
1298
|
+
var urlRegex = /(^| )(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,10}(:[0-9]{1,10})?(\/.*)?$/gm;
|
1299
|
+
var mailRegex = /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi;
|
1300
|
+
function fixUrls(message) {
|
455
1301
|
message = message.replace(urlRegex, function (url) {
|
456
1302
|
var hyperlink = url.replace(' ', '');
|
457
1303
|
if (!hyperlink.match('^https?:\/\/')) {
|
458
|
-
hyperlink = '
|
1304
|
+
hyperlink = 'https://' + hyperlink;
|
459
1305
|
}
|
460
|
-
return
|
461
|
-
});
|
462
|
-
var mailRegex = /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi;
|
463
|
-
message = message.replace(mailRegex, function (mail) {
|
464
|
-
return '<a href="mailto:' + mail + '">' + mail + '</a>';
|
465
|
-
});
|
466
|
-
return message;
|
467
|
-
}
|
468
|
-
|
469
|
-
function heighlightTags(message, tags) {
|
470
|
-
if (!message)
|
471
|
-
return "";
|
472
|
-
var hashTagRegex = /(^|\B)#(?![0-9_]+\b)([a-zA-Z0-9_]{1,30})(\b|\r)/g;
|
473
|
-
message = message.replace(hashTagRegex, function (string) {
|
474
|
-
var tag = tags.find(function (t) { return t.id.toLowerCase() == string.slice(1).toLowerCase(); });
|
475
|
-
return "<span style=\"background-color: ".concat(tag ? tag.color : '#aaa', ";padding: 0px 5px;border-radius: 7px;cursor: pointer;color:#fff\">") + string + '</span>';
|
1306
|
+
return hyperlink;
|
476
1307
|
});
|
477
1308
|
return message;
|
478
1309
|
}
|
479
1310
|
|
480
1311
|
var TextView = function (_a) {
|
481
1312
|
var item = _a.item;
|
482
|
-
var
|
483
|
-
|
1313
|
+
var tags = useTags();
|
1314
|
+
useAddTag();
|
1315
|
+
var addFilterTag = useAddFilterTag();
|
1316
|
+
var replacedText;
|
1317
|
+
if (item && item.text)
|
1318
|
+
replacedText = fixUrls(item.text);
|
1319
|
+
replacedText = reactStringReplace(replacedText, /(https?:\/\/\S+)/g, function (url, i) {
|
1320
|
+
var shortUrl = url;
|
1321
|
+
if (url.match('^https:\/\/')) {
|
1322
|
+
shortUrl = url.split('https://')[1];
|
1323
|
+
}
|
1324
|
+
if (url.match('^http:\/\/')) {
|
1325
|
+
shortUrl = url.split('http://')[1];
|
1326
|
+
}
|
1327
|
+
return (React.createElement("a", { key: i.toString + item.id + url, href: url, target: "_blank", rel: "noopener noreferrer" }, shortUrl));
|
1328
|
+
});
|
1329
|
+
replacedText = reactStringReplace(replacedText, mailRegex, function (url, i) {
|
1330
|
+
return (React.createElement("a", { key: i.toString + item.id + url, href: "mailto:".concat(url), target: "_blank", rel: "noopener noreferrer" }, url));
|
1331
|
+
});
|
1332
|
+
replacedText = reactStringReplace(replacedText, hashTagRegex, function (match, i) {
|
1333
|
+
var tag = tags.find(function (t) { return t.id.toLowerCase() == match.slice(1).toLowerCase(); });
|
1334
|
+
return (React.createElement("a", { style: { color: tag ? tag.color : '#aaa', fontWeight: 'bold', cursor: 'pointer' }, key: tag ? tag.id + item.id + i : i, onClick: function () {
|
1335
|
+
addFilterTag(tag);
|
1336
|
+
// map.fitBounds(items)
|
1337
|
+
// map.closePopup();
|
1338
|
+
} }, match));
|
1339
|
+
});
|
1340
|
+
return (React.createElement("p", { style: { whiteSpace: "pre-wrap" }, className: "!tw-m-0 !tw-mb-2 !tw-mt-2" }, replacedText));
|
484
1341
|
};
|
485
1342
|
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
1343
|
+
// in miliseconds
|
1344
|
+
var units = [
|
1345
|
+
{ label: 'year', seconds: 31536000 },
|
1346
|
+
{ label: 'month', seconds: 2592000 },
|
1347
|
+
{ label: 'week', seconds: 604800 },
|
1348
|
+
{ label: 'day', seconds: 86400 },
|
1349
|
+
{ label: 'hour', seconds: 3600 },
|
1350
|
+
{ label: 'minute', seconds: 60 },
|
1351
|
+
{ label: 'second', seconds: 1 }
|
1352
|
+
];
|
1353
|
+
var timeAgo = function (date) {
|
1354
|
+
var time = Math.floor((new Date().valueOf() - new Date(date).valueOf()) / 1000);
|
1355
|
+
var _a = calculateTimeDifference(time), interval = _a.interval, unit = _a.unit;
|
1356
|
+
var suffix = interval === 1 ? '' : 's';
|
1357
|
+
return "".concat(interval, " ").concat(unit).concat(suffix, " ago");
|
1358
|
+
};
|
1359
|
+
var calculateTimeDifference = function (time) {
|
1360
|
+
for (var _i = 0, units_1 = units; _i < units_1.length; _i++) {
|
1361
|
+
var _a = units_1[_i], label = _a.label, seconds = _a.seconds;
|
1362
|
+
var interval = Math.floor(time / seconds);
|
1363
|
+
if (interval >= 1) {
|
1364
|
+
return {
|
1365
|
+
interval: interval,
|
1366
|
+
unit: label
|
1367
|
+
};
|
1368
|
+
}
|
1369
|
+
}
|
1370
|
+
return {
|
1371
|
+
interval: 0,
|
1372
|
+
unit: ''
|
1373
|
+
};
|
1374
|
+
};
|
1375
|
+
|
1376
|
+
var ItemViewPopup = React.forwardRef(function (props, ref) {
|
1377
|
+
var _a = useState(false), infoExpanded = _a[0], setInfoExpanded = _a[1];
|
1378
|
+
return (React.createElement(Popup, { ref: ref, maxHeight: 377, minWidth: 275, maxWidth: 275, autoPanPadding: [20, 80] },
|
1379
|
+
React.createElement("div", { className: 'tw-bg-base-100 tw-text-base-content' },
|
1380
|
+
React.createElement(HeaderView, { item: props.item, title: props.title, avatar: props.avatar, owner: props.owner, setItemFormPopup: props.setItemFormPopup }),
|
1381
|
+
React.createElement("div", { className: 'tw-overflow-y-auto tw-overflow-x-hidden tw-max-h-64' }, props.children ?
|
1382
|
+
React.Children.toArray(props.children).map(function (child) {
|
1383
|
+
return React.isValidElement(child) ?
|
494
1384
|
React.cloneElement(child, { item: props.item }) : "";
|
495
1385
|
})
|
496
1386
|
:
|
497
|
-
React.createElement(TextView, { item: props.item }))
|
498
|
-
}
|
1387
|
+
React.createElement(TextView, { item: props.item })),
|
1388
|
+
React.createElement("div", { className: 'tw-flex -tw-mb-1 tw-flex-row' },
|
1389
|
+
infoExpanded ?
|
1390
|
+
React.createElement("p", { className: "tw-italic tw-min-h-[21px] !tw-my-0 tw-text-gray-500 tw-cursor-pointer", onClick: function () { return setInfoExpanded(false); } }, "posted ".concat(props.item && props.item.user_created && props.item.user_created.first_name ? "by ".concat(props.item.user_created.first_name) : "", " ").concat(timeAgo(props.item.date_created)))
|
1391
|
+
:
|
1392
|
+
React.createElement("p", { className: "!tw-my-0 tw-min-h-[21px] tw-font-bold tw-cursor-pointer tw-text-gray-500", onClick: function () { return setInfoExpanded(true); } }, "\u24D8"),
|
1393
|
+
React.createElement("div", { className: 'tw-grow' })))));
|
1394
|
+
});
|
499
1395
|
|
500
1396
|
var Geometry = /** @class */ (function () {
|
501
1397
|
function Geometry(lng, lat) {
|
@@ -507,33 +1403,94 @@ var Geometry = /** @class */ (function () {
|
|
507
1403
|
|
508
1404
|
function TextAreaInput(_a) {
|
509
1405
|
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;
|
1406
|
+
var ref = useRef(null);
|
1407
|
+
// prevent react18 from calling useEffect twice
|
1408
|
+
var init = useRef(false);
|
1409
|
+
var tags = useTags();
|
1410
|
+
var values = [];
|
1411
|
+
tags.map(function (tag) {
|
1412
|
+
values.push({ key: tag.id, value: tag.id, color: tag.color });
|
1413
|
+
});
|
1414
|
+
var tribute = new Tribute({
|
1415
|
+
containerClass: 'tw-z-500 tw-bg-white tw-p-2 tw-rounded-lg tw-shadow',
|
1416
|
+
selectClass: 'tw-font-bold',
|
1417
|
+
trigger: "#",
|
1418
|
+
values: values,
|
1419
|
+
noMatchTemplate: function () {
|
1420
|
+
return "";
|
1421
|
+
},
|
1422
|
+
menuItemTemplate: function (item) {
|
1423
|
+
return "<span style=\"color: ".concat(item.original.color, "; padding: 5px; boarder-radius: 3px;\">#").concat(item.string, "</span>");
|
1424
|
+
}
|
1425
|
+
});
|
1426
|
+
useEffect(function () {
|
1427
|
+
if (!init.current) {
|
1428
|
+
if (ref.current) {
|
1429
|
+
tribute.attach(ref.current);
|
1430
|
+
}
|
1431
|
+
init.current = true;
|
1432
|
+
}
|
1433
|
+
}, [ref]);
|
510
1434
|
return (React.createElement("div", { className: "tw-form-control tw-w-full ".concat(containerStyle ? containerStyle : "") },
|
511
1435
|
labelTitle ? React.createElement("label", { className: "tw-label" },
|
512
1436
|
React.createElement("span", { className: "tw-label-text tw-text-base-content " + labelStyle }, labelTitle)) : "",
|
513
|
-
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); } })));
|
1437
|
+
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); } })));
|
514
1438
|
}
|
515
1439
|
|
516
|
-
function
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
1440
|
+
var randomColor = function () {
|
1441
|
+
return hsvToHex((Math.random() + golden_ratio_conjugate) % 1, 0.8, 0.7);
|
1442
|
+
};
|
1443
|
+
var golden_ratio_conjugate = 0.618033988749895;
|
1444
|
+
function hsvToHex(h, s, v) {
|
1445
|
+
var r, g, b;
|
1446
|
+
var i = (Math.floor(h * 6));
|
1447
|
+
var f = h * 6 - i;
|
1448
|
+
var p = v * (1 - s);
|
1449
|
+
var q = v * (1 - f * s);
|
1450
|
+
var t = v * (1 - (1 - f) * s);
|
1451
|
+
switch (i % 6) {
|
1452
|
+
case 0:
|
1453
|
+
r = v, g = t, b = p;
|
1454
|
+
break;
|
1455
|
+
case 1:
|
1456
|
+
r = q, g = v, b = p;
|
1457
|
+
break;
|
1458
|
+
case 2:
|
1459
|
+
r = p, g = v, b = t;
|
1460
|
+
break;
|
1461
|
+
case 3:
|
1462
|
+
r = p, g = q, b = v;
|
1463
|
+
break;
|
1464
|
+
case 4:
|
1465
|
+
r = t, g = p, b = v;
|
1466
|
+
break;
|
1467
|
+
case 5:
|
1468
|
+
r = v, g = p, b = q;
|
1469
|
+
break;
|
1470
|
+
}
|
1471
|
+
return rgbToHex(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255));
|
1472
|
+
}
|
1473
|
+
var rgbToHex = function (r, g, b) { return '#' + [r, g, b].map(function (x) {
|
1474
|
+
var hex = x.toString(16);
|
1475
|
+
return hex.length === 1 ? '0' + hex : hex;
|
1476
|
+
}).join(''); };
|
524
1477
|
|
525
1478
|
function ItemFormPopup(props) {
|
526
1479
|
var _this = this;
|
527
|
-
var formRef = useRef(null);
|
528
1480
|
var _a = useState(false), spinner = _a[0], setSpinner = _a[1];
|
1481
|
+
var formRef = useRef(null);
|
529
1482
|
var map = useMap();
|
530
1483
|
var addItem = useAddItem();
|
531
1484
|
var updateItem = useUpdateItem();
|
1485
|
+
var tags = useTags();
|
1486
|
+
var addTag = useAddTag();
|
1487
|
+
var resetFilterTags = useResetFilterTags();
|
1488
|
+
var user = useAuth().user;
|
532
1489
|
var handleSubmit = function (evt) { return __awaiter(_this, void 0, void 0, function () {
|
533
|
-
var formItem;
|
534
|
-
var _a, _b;
|
535
|
-
return __generator(this, function (
|
536
|
-
switch (
|
1490
|
+
var formItem, success, error_1, uuid, success, error_2;
|
1491
|
+
var _a, _b, _c;
|
1492
|
+
return __generator(this, function (_d) {
|
1493
|
+
switch (_d.label) {
|
537
1494
|
case 0:
|
538
1495
|
formItem = {};
|
539
1496
|
Array.from(evt.target).forEach(function (input) {
|
@@ -544,33 +1501,58 @@ function ItemFormPopup(props) {
|
|
544
1501
|
formItem['position'] = new Geometry(props.position.lng, props.position.lat);
|
545
1502
|
evt.preventDefault();
|
546
1503
|
setSpinner(true);
|
547
|
-
|
548
|
-
|
549
|
-
|
1504
|
+
(_a = formItem.text.toLocaleLowerCase().match(hashTagRegex)) === null || _a === void 0 ? void 0 : _a.map(function (tag) {
|
1505
|
+
if (!tags.find(function (t) { return t.id.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase(); })) {
|
1506
|
+
addTag({ id: tag.slice(1).toLocaleLowerCase(), color: randomColor() });
|
1507
|
+
}
|
1508
|
+
});
|
1509
|
+
if (!props.item) return [3 /*break*/, 5];
|
1510
|
+
success = false;
|
1511
|
+
_d.label = 1;
|
550
1512
|
case 1:
|
551
|
-
|
552
|
-
|
553
|
-
formItem['layer'] = props.layer;
|
554
|
-
return [4 /*yield*/, updateItem(formItem)];
|
1513
|
+
_d.trys.push([1, 3, , 4]);
|
1514
|
+
return [4 /*yield*/, ((_b = props.layer.api) === null || _b === void 0 ? void 0 : _b.updateItem(__assign(__assign({}, formItem), { id: props.item.id })))];
|
555
1515
|
case 2:
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
return [3 /*break*/, 6];
|
1516
|
+
_d.sent();
|
1517
|
+
success = true;
|
1518
|
+
return [3 /*break*/, 4];
|
560
1519
|
case 3:
|
561
|
-
|
562
|
-
|
1520
|
+
error_1 = _d.sent();
|
1521
|
+
toast.error(error_1.toString());
|
1522
|
+
return [3 /*break*/, 4];
|
563
1523
|
case 4:
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
case 5:
|
569
|
-
_c.sent();
|
1524
|
+
if (success) {
|
1525
|
+
updateItem(__assign(__assign({}, props.item), formItem));
|
1526
|
+
toast.success("Item updated");
|
1527
|
+
}
|
570
1528
|
setSpinner(false);
|
571
1529
|
map.closePopup();
|
572
|
-
|
1530
|
+
return [3 /*break*/, 10];
|
1531
|
+
case 5:
|
1532
|
+
uuid = crypto.randomUUID();
|
1533
|
+
success = false;
|
1534
|
+
_d.label = 6;
|
573
1535
|
case 6:
|
1536
|
+
_d.trys.push([6, 8, , 9]);
|
1537
|
+
return [4 /*yield*/, ((_c = props.layer.api) === null || _c === void 0 ? void 0 : _c.createItem(__assign(__assign({}, formItem), { id: uuid })))];
|
1538
|
+
case 7:
|
1539
|
+
_d.sent();
|
1540
|
+
success = true;
|
1541
|
+
return [3 /*break*/, 9];
|
1542
|
+
case 8:
|
1543
|
+
error_2 = _d.sent();
|
1544
|
+
toast.error(error_2.toString());
|
1545
|
+
return [3 /*break*/, 9];
|
1546
|
+
case 9:
|
1547
|
+
if (success) {
|
1548
|
+
addItem(__assign(__assign({}, formItem), { id: uuid, layer: props.layer, user_created: user }));
|
1549
|
+
toast.success("New item created");
|
1550
|
+
resetFilterTags();
|
1551
|
+
}
|
1552
|
+
setSpinner(false);
|
1553
|
+
map.closePopup();
|
1554
|
+
_d.label = 10;
|
1555
|
+
case 10:
|
574
1556
|
props.setItemFormPopup(null);
|
575
1557
|
return [2 /*return*/];
|
576
1558
|
}
|
@@ -584,121 +1566,212 @@ function ItemFormPopup(props) {
|
|
584
1566
|
useEffect(function () {
|
585
1567
|
resetPopup();
|
586
1568
|
}, [props.position]);
|
587
|
-
return (React.createElement(Popup, { minWidth: 275, maxWidth: 275, autoPanPadding: [20,
|
1569
|
+
return (React.createElement(Popup, { minWidth: 275, maxWidth: 275, autoPanPadding: [20, 80], eventHandlers: {
|
588
1570
|
remove: function () {
|
589
1571
|
setTimeout(function () {
|
590
1572
|
resetPopup();
|
591
1573
|
}, 100);
|
592
1574
|
}
|
593
1575
|
}, position: props.position },
|
594
|
-
React.createElement("form", { ref: formRef, onReset: resetPopup, onSubmit: function (e) { return handleSubmit(e); } },
|
1576
|
+
React.createElement("form", { ref: formRef, onReset: resetPopup, autoComplete: 'off', onSubmit: function (e) { return handleSubmit(e); } },
|
595
1577
|
props.item ? React.createElement("div", { className: 'tw-h-3' })
|
596
1578
|
:
|
597
1579
|
React.createElement("div", { className: 'tw-flex tw-justify-center' },
|
598
1580
|
React.createElement("b", { className: "tw-text-xl tw-font-bold" },
|
599
1581
|
"New ",
|
600
1582
|
props.layer.name)),
|
601
|
-
React.createElement(TextInput, { type: "text", placeholder: "Name", dataField: "name", defaultValue: props.item ? props.item.name : "", inputStyle: '' }),
|
602
1583
|
props.children ?
|
603
1584
|
React.Children.toArray(props.children).map(function (child) {
|
604
1585
|
return React.isValidElement(child) ?
|
605
|
-
React.cloneElement(child, { item: props.item }) : "";
|
1586
|
+
React.cloneElement(child, { item: props.item, key: props.position.toString() }) : "";
|
606
1587
|
})
|
607
1588
|
:
|
608
1589
|
React.createElement(React.Fragment, null,
|
609
|
-
React.createElement(
|
1590
|
+
React.createElement(TextInput, { type: "text", placeholder: "Name", dataField: "name", defaultValue: props.item ? props.item.name : "", inputStyle: '' }),
|
1591
|
+
React.createElement(TextAreaInput, { key: props.position.toString(), placeholder: "Text", dataField: "text", defaultValue: props.item ? props.item.text : "", inputStyle: 'tw-h-40 tw-mt-5' })),
|
610
1592
|
React.createElement("div", { className: 'tw-flex tw-justify-center' },
|
611
1593
|
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')))));
|
612
1594
|
}
|
613
1595
|
|
614
|
-
var
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
var
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
1596
|
+
var AssetContext = createContext({
|
1597
|
+
api: {},
|
1598
|
+
setAssetsApi: function () { }
|
1599
|
+
});
|
1600
|
+
function useAssetsManager() {
|
1601
|
+
var _a = useState({}), api = _a[0], setApi = _a[1];
|
1602
|
+
var setAssetsApi = useCallback(function (api) {
|
1603
|
+
setApi(api);
|
1604
|
+
}, []);
|
1605
|
+
return { api: api, setAssetsApi: setAssetsApi };
|
1606
|
+
}
|
1607
|
+
var AssetsProvider = function (_a) {
|
1608
|
+
var children = _a.children;
|
1609
|
+
return (React.createElement(AssetContext.Provider, { value: useAssetsManager() }, children));
|
1610
|
+
};
|
1611
|
+
var useAssetApi = function () {
|
1612
|
+
var api = useContext(AssetContext).api;
|
1613
|
+
return api;
|
1614
|
+
};
|
1615
|
+
var useSetAssetApi = function () {
|
1616
|
+
var setAssetsApi = useContext(AssetContext).setAssetsApi;
|
1617
|
+
return setAssetsApi;
|
1618
|
+
};
|
1619
|
+
|
1620
|
+
function getValue(obj, path) {
|
1621
|
+
if (obj) {
|
1622
|
+
for (var i = 0, path = path.split('.'), len = path.length; i < len; i++) {
|
1623
|
+
obj = obj[path[i]];
|
1624
|
+
}
|
1625
|
+
return obj;
|
1626
|
+
}
|
1627
|
+
}
|
1628
|
+
|
1629
|
+
var Layer = function (_a) {
|
1630
|
+
var _b, _c;
|
1631
|
+
var data = _a.data, children = _a.children, _d = _a.name, name = _d === void 0 ? 'places' : _d, _e = _a.menuIcon, menuIcon = _e === void 0 ? 'MapPinIcon' : _e, _f = _a.menuText, menuText = _f === void 0 ? 'add new place' : _f, _g = _a.menuColor, menuColor = _g === void 0 ? '#2E7D32' : _g, _h = _a.markerIcon, markerIcon = _h === void 0 ? 'circle-solid' : _h, _j = _a.markerShape, markerShape = _j === void 0 ? 'circle' : _j, _k = _a.markerDefaultColor, markerDefaultColor = _k === void 0 ? '#777' : _k, api = _a.api, _l = _a.itemTitleField, itemTitleField = _l === void 0 ? 'name' : _l, _m = _a.itemTextField, itemTextField = _m === void 0 ? 'text' : _m, itemAvatarField = _a.itemAvatarField, itemColorField = _a.itemColorField, itemOwnerField = _a.itemOwnerField, setItemFormPopup = _a.setItemFormPopup, itemFormPopup = _a.itemFormPopup, clusterRef = _a.clusterRef;
|
1632
|
+
var filterTags = useFilterTags();
|
632
1633
|
var items = useItems();
|
633
|
-
var
|
634
|
-
var
|
635
|
-
var
|
1634
|
+
var setItemsApi = useSetItemsApi();
|
1635
|
+
var setItemsData = useSetItemsData();
|
1636
|
+
var getItemTags = useGetItemTags();
|
1637
|
+
var addMarker = useAddMarker();
|
1638
|
+
var addPopup = useAddPopup();
|
1639
|
+
var leafletRefs = useLeafletRefs();
|
1640
|
+
var location = useLocation();
|
1641
|
+
var searchPhrase = useSearchPhrase();
|
1642
|
+
var map = useMap();
|
1643
|
+
var isLayerVisible = useIsLayerVisible();
|
1644
|
+
var assetsApi = useAssetApi();
|
636
1645
|
useEffect(function () {
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
1646
|
+
data && setItemsData({ data: data, children: children, name: name, menuIcon: menuIcon, menuText: menuText, menuColor: menuColor, markerIcon: markerIcon, markerShape: markerShape, markerDefaultColor: markerDefaultColor, api: api, itemTitleField: itemTitleField, itemTextField: itemTextField, itemAvatarField: itemAvatarField, itemColorField: itemColorField, setItemFormPopup: setItemFormPopup, itemFormPopup: itemFormPopup, clusterRef: clusterRef });
|
1647
|
+
api && setItemsApi({ data: data, children: children, name: name, menuIcon: menuIcon, menuText: menuText, menuColor: menuColor, markerIcon: markerIcon, markerShape: markerShape, markerDefaultColor: markerDefaultColor, api: api, itemTitleField: itemTitleField, itemTextField: itemTextField, itemAvatarField: itemAvatarField, itemColorField: itemColorField, setItemFormPopup: setItemFormPopup, itemFormPopup: itemFormPopup, clusterRef: clusterRef });
|
1648
|
+
}, [data, api]);
|
1649
|
+
useMapEvents({
|
1650
|
+
popupopen: function (e) {
|
1651
|
+
var _a, _b, _c;
|
1652
|
+
var item = (_a = Object.entries(leafletRefs).find(function (r) { return r[1].popup == e.popup; })) === null || _a === void 0 ? void 0 : _a[1].item;
|
1653
|
+
if (((_b = item === null || item === void 0 ? void 0 : item.layer) === null || _b === void 0 ? void 0 : _b.name) == name && window.location.pathname.split("/")[2] != item.id) {
|
1654
|
+
window.history.pushState({}, "", "/".concat(name, "/").concat(item.id));
|
1655
|
+
var title = "";
|
1656
|
+
if (item.name)
|
1657
|
+
title = item.name;
|
1658
|
+
else if ((_c = item.layer) === null || _c === void 0 ? void 0 : _c.itemTitleField)
|
1659
|
+
title = getValue(item, item.layer.itemTitleField);
|
1660
|
+
document.title = "".concat(document.title.split("-")[0], " - ").concat(title);
|
643
1661
|
}
|
644
|
-
}
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
1662
|
+
},
|
1663
|
+
});
|
1664
|
+
var openPopup = function () {
|
1665
|
+
var _a, _b, _c, _d, _e, _f;
|
1666
|
+
if (window.location.pathname.split("/").length <= 2 || window.location.pathname.split("/")[2] === "") {
|
1667
|
+
map.closePopup();
|
1668
|
+
}
|
1669
|
+
else {
|
1670
|
+
if (window.location.pathname.split("/")[1] == name) {
|
1671
|
+
if (window.location.pathname.split("/")[2]) {
|
1672
|
+
var id = window.location.pathname.split("/")[2];
|
1673
|
+
var marker_1 = (_a = leafletRefs[id]) === null || _a === void 0 ? void 0 : _a.marker;
|
1674
|
+
if (marker_1 && marker_1 != null) {
|
1675
|
+
marker_1 !== null && ((_b = clusterRef === null || clusterRef === void 0 ? void 0 : clusterRef.current) === null || _b === void 0 ? void 0 : _b.zoomToShowLayer(marker_1, function () {
|
1676
|
+
marker_1.openPopup();
|
1677
|
+
}));
|
1678
|
+
var item = (_c = leafletRefs[id]) === null || _c === void 0 ? void 0 : _c.item;
|
1679
|
+
var title = "";
|
1680
|
+
if (item.name)
|
1681
|
+
title = item.name;
|
1682
|
+
else if ((_d = item.layer) === null || _d === void 0 ? void 0 : _d.itemTitleField)
|
1683
|
+
title = getValue(item, item.layer.itemTitleField);
|
1684
|
+
document.title = "".concat(document.title.split("-")[0], " - ").concat(title);
|
1685
|
+
(_e = document.querySelector('meta[property="og:title"]')) === null || _e === void 0 ? void 0 : _e.setAttribute("content", item.name);
|
1686
|
+
(_f = document.querySelector('meta[property="og:description"]')) === null || _f === void 0 ? void 0 : _f.setAttribute("content", item.text);
|
650
1687
|
}
|
651
|
-
}
|
1688
|
+
}
|
652
1689
|
}
|
653
|
-
});
|
654
|
-
if (props.api || props.api) {
|
655
|
-
addLayer(props);
|
656
1690
|
}
|
657
|
-
}
|
1691
|
+
};
|
1692
|
+
useEffect(function () {
|
1693
|
+
openPopup();
|
1694
|
+
}, [leafletRefs, location]);
|
658
1695
|
return (React.createElement(React.Fragment, null,
|
659
1696
|
items &&
|
660
|
-
((
|
661
|
-
|
662
|
-
var
|
1697
|
+
((_c = (_b = items.
|
1698
|
+
filter(function (item) { return item.text; }).
|
1699
|
+
filter(function (item) { var _a; return ((_a = item.layer) === null || _a === void 0 ? void 0 : _a.name) === name; })) === null || _b === void 0 ? void 0 : _b.filter(function (item) {
|
1700
|
+
return filterTags.length == 0 ? item : filterTags.every(function (tag) { return getItemTags(item).some(function (filterTag) { return filterTag.id === tag.id; }); });
|
1701
|
+
})) === null || _c === void 0 ? void 0 : _c.filter(function (item) {
|
1702
|
+
var _a, _b;
|
1703
|
+
return searchPhrase === ''
|
1704
|
+
? item :
|
1705
|
+
((_a = item.name) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(searchPhrase.toLowerCase())) || ((_b = item.text) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes(searchPhrase.toLowerCase()));
|
1706
|
+
}).filter(function (item) { return item.layer && isLayerVisible(item.layer); }).map(function (item) {
|
1707
|
+
var tags = getItemTags(item);
|
1708
|
+
var color1 = markerDefaultColor;
|
663
1709
|
var color2 = "RGBA(35, 31, 32, 0.2)";
|
664
|
-
if (
|
1710
|
+
if (itemColorField)
|
1711
|
+
color1 = getValue(item, itemColorField);
|
1712
|
+
else if (tags && tags[0]) {
|
665
1713
|
color1 = tags[0].color;
|
666
1714
|
}
|
667
|
-
if (tags[
|
1715
|
+
if (tags && tags[0] && itemColorField)
|
1716
|
+
color2 = tags[0].color;
|
1717
|
+
else if (tags && tags[1]) {
|
668
1718
|
color2 = tags[1].color;
|
669
1719
|
}
|
670
|
-
return (React.createElement(Marker, {
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
1720
|
+
return (React.createElement(Marker, { ref: function (r) {
|
1721
|
+
if (!(item.id in leafletRefs))
|
1722
|
+
r && addMarker(item, r);
|
1723
|
+
}, icon: MarkerIconFactory(markerShape, color1, color2, markerIcon), key: item.id, position: [item.position.coordinates[1], item.position.coordinates[0]] },
|
1724
|
+
(children && React.Children.toArray(children).some(function (child) { return React.isValidElement(child) && child.props.__TYPE === "ItemView"; }) ?
|
1725
|
+
React.Children.toArray(children).map(function (child) {
|
1726
|
+
return React.isValidElement(child) && child.props.__TYPE === "ItemView" ?
|
1727
|
+
React.createElement(ItemViewPopup, { ref: function (r) {
|
1728
|
+
if (!(item.id in leafletRefs))
|
1729
|
+
r && addPopup(item, r);
|
1730
|
+
}, key: item.id + item.name, title: itemTitleField && item ? getValue(item, itemTitleField) : undefined, avatar: itemAvatarField && item ? assetsApi.url + getValue(item, itemAvatarField) : undefined, owner: itemOwnerField && item ? getValue(item, itemOwnerField) : undefined, item: item, setItemFormPopup: setItemFormPopup }, child)
|
1731
|
+
: "";
|
1732
|
+
})
|
1733
|
+
:
|
1734
|
+
React.createElement(React.Fragment, null,
|
1735
|
+
React.createElement(ItemViewPopup, { key: item.id + item.name, ref: function (r) {
|
1736
|
+
if (!(item.id in leafletRefs))
|
1737
|
+
r && addPopup(item, r);
|
1738
|
+
}, title: itemTitleField && item ? getValue(item, itemTitleField) : undefined, avatar: itemAvatarField && item ? assetsApi.url + getValue(item, itemAvatarField) : undefined, owner: itemOwnerField && item ? getValue(item, itemOwnerField) : undefined, item: item, setItemFormPopup: setItemFormPopup }))),
|
1739
|
+
React.createElement(Tooltip, { offset: [0, -38], direction: 'top' }, item.name ? item.name : getValue(item, itemTitleField))));
|
679
1740
|
})),
|
680
|
-
|
681
|
-
(
|
682
|
-
React.Children.toArray(
|
683
|
-
var _a;
|
1741
|
+
itemFormPopup && itemFormPopup.layer.name == name &&
|
1742
|
+
(children && React.Children.toArray(children).some(function (child) { return React.isValidElement(child) && child.props.__TYPE === "ItemForm"; }) ?
|
1743
|
+
React.Children.toArray(children).map(function (child) {
|
684
1744
|
return React.isValidElement(child) && child.props.__TYPE === "ItemForm" ?
|
685
|
-
React.createElement(ItemFormPopup, { key:
|
1745
|
+
React.createElement(ItemFormPopup, { key: setItemFormPopup === null || setItemFormPopup === void 0 ? void 0 : setItemFormPopup.name, position: itemFormPopup.position, layer: itemFormPopup.layer, setItemFormPopup: setItemFormPopup, item: itemFormPopup.item }, child)
|
686
1746
|
: "";
|
687
1747
|
})
|
688
1748
|
:
|
689
1749
|
React.createElement(React.Fragment, null,
|
690
|
-
React.createElement(ItemFormPopup, { position:
|
1750
|
+
React.createElement(ItemFormPopup, { position: itemFormPopup.position, layer: itemFormPopup.layer, setItemFormPopup: setItemFormPopup, item: itemFormPopup.item })))));
|
691
1751
|
};
|
692
1752
|
|
693
1753
|
function Tags(_a) {
|
694
|
-
var data = _a.data;
|
695
|
-
var
|
1754
|
+
var data = _a.data, api = _a.api;
|
1755
|
+
var setTagData = useSetTagData();
|
1756
|
+
var setTagApi = useSetTagApi();
|
696
1757
|
useEffect(function () {
|
697
|
-
data
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
1758
|
+
data && setTagData(data);
|
1759
|
+
api && setTagApi(api);
|
1760
|
+
}, [api, data]);
|
1761
|
+
return (React.createElement(React.Fragment, null));
|
1762
|
+
}
|
1763
|
+
|
1764
|
+
function Permissions(_a) {
|
1765
|
+
var data = _a.data, api = _a.api, adminRole = _a.adminRole;
|
1766
|
+
var setPermissionData = useSetPermissionData();
|
1767
|
+
var setPermissionApi = useSetPermissionApi();
|
1768
|
+
var setAdminRole = useSetAdminRole();
|
1769
|
+
var user = useAuth().user;
|
1770
|
+
useEffect(function () {
|
1771
|
+
adminRole && setAdminRole(adminRole);
|
1772
|
+
data && setPermissionData(data);
|
1773
|
+
api && setPermissionApi(api);
|
1774
|
+
}, [api, data, adminRole, user]);
|
702
1775
|
return (React.createElement(React.Fragment, null));
|
703
1776
|
}
|
704
1777
|
|
@@ -723,7 +1796,7 @@ var ItemView = function (_a) {
|
|
723
1796
|
return (React.createElement("div", null, children ?
|
724
1797
|
React.Children.toArray(children).map(function (child) {
|
725
1798
|
return React.isValidElement(child) ?
|
726
|
-
React.cloneElement(child, { item: item
|
1799
|
+
React.cloneElement(child, { item: item }) : "";
|
727
1800
|
}) : ""));
|
728
1801
|
};
|
729
1802
|
ItemView.propTypes = {
|
@@ -734,6 +1807,28 @@ ItemView.defaultProps = {
|
|
734
1807
|
__TYPE: 'ItemView',
|
735
1808
|
};
|
736
1809
|
|
1810
|
+
function SelectBox(props) {
|
1811
|
+
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;
|
1812
|
+
var _a = useState(defaultValue || ""), value = _a[0], setValue = _a[1];
|
1813
|
+
var updateValue = function (newValue) {
|
1814
|
+
updateFormValue(newValue);
|
1815
|
+
setValue(newValue);
|
1816
|
+
};
|
1817
|
+
return (React.createElement("div", { className: "tw-inline-block ".concat(containerStyle) },
|
1818
|
+
labelTitle ?
|
1819
|
+
React.createElement("label", { className: "tw-label ".concat(labelStyle) },
|
1820
|
+
React.createElement("div", { className: "tw-label-text" },
|
1821
|
+
labelTitle,
|
1822
|
+
labelDescription && React.createElement("div", { className: "tw-tooltip tw-tooltip-right", "data-tip": labelDescription },
|
1823
|
+
React.createElement(InformationCircleIcon, { className: 'tw-w-4 tw-h-4' }))))
|
1824
|
+
: "",
|
1825
|
+
React.createElement("select", { className: "tw-select tw-select-bordered tw-w-full", value: value, onChange: function (e) { return updateValue(e.target.value); } },
|
1826
|
+
React.createElement("option", { disabled: true, value: "PLACEHOLDER" }, placeholder),
|
1827
|
+
options.map(function (o, k) {
|
1828
|
+
return React.createElement("option", { value: o.value || o.name, key: k }, o.name);
|
1829
|
+
}))));
|
1830
|
+
}
|
1831
|
+
|
737
1832
|
var PopupTextAreaInput = function (_a) {
|
738
1833
|
var dataField = _a.dataField, placeholder = _a.placeholder, style = _a.style, item = _a.item;
|
739
1834
|
return (React.createElement(TextAreaInput, { defaultValue: (item === null || item === void 0 ? void 0 : item.text) ? item.text : "", dataField: dataField, placeholder: placeholder, inputStyle: style }));
|
@@ -742,13 +1837,18 @@ var PopupTextAreaInput = function (_a) {
|
|
742
1837
|
var PopupStartEndInput = function (_a) {
|
743
1838
|
var item = _a.item;
|
744
1839
|
return (React.createElement("div", { className: 'tw-grid tw-grid-cols-2 tw-gap-2 tw-mb-5' },
|
745
|
-
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) : "" }),
|
746
|
-
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) : "" })));
|
1840
|
+
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' }),
|
1841
|
+
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' })));
|
1842
|
+
};
|
1843
|
+
|
1844
|
+
var PopupTextInput = function (_a) {
|
1845
|
+
var dataField = _a.dataField, placeholder = _a.placeholder, style = _a.style, item = _a.item;
|
1846
|
+
return (React.createElement(TextInput, { defaultValue: (item === null || item === void 0 ? void 0 : item.text) ? item.text : "", dataField: dataField, placeholder: placeholder, inputStyle: style, type: 'text' }));
|
747
1847
|
};
|
748
1848
|
|
749
1849
|
var StartEndView = function (_a) {
|
750
1850
|
var item = _a.item;
|
751
|
-
return (React.createElement("div", { className: "tw-flex tw-flex-row tw-mb-4
|
1851
|
+
return (React.createElement("div", { className: "tw-flex tw-flex-row tw-mb-4" },
|
752
1852
|
React.createElement("div", { className: "tw-basis-2/5 tw-flex tw-flex-row" },
|
753
1853
|
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 },
|
754
1854
|
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" })),
|
@@ -761,6 +1861,12 @@ var StartEndView = function (_a) {
|
|
761
1861
|
React.createElement("time", { className: 'tw-align-middle', dateTime: item && item.end ? item.end.substring(0, 10) : "" }, item && item.end ? new Date(item.end).toLocaleDateString() : ""))));
|
762
1862
|
};
|
763
1863
|
|
1864
|
+
var PopupButton = function (_a) {
|
1865
|
+
var url = _a.url, parameterField = _a.parameterField, text = _a.text, _b = _a.color, color = _b === void 0 ? 'oklch(var(--p))' : _b, colorField = _a.colorField, item = _a.item;
|
1866
|
+
return (React.createElement(Link, { to: "".concat(url, "/").concat(parameterField ? getValue(item, parameterField) : "") },
|
1867
|
+
React.createElement("button", { style: { backgroundColor: "".concat(colorField ? getValue(item, colorField) : color) }, className: "tw-btn tw-text-white tw-btn-sm tw-float-right -tw-mt-2" }, text)));
|
1868
|
+
};
|
1869
|
+
|
764
1870
|
var isClickInsideRectangle = function (e, element) {
|
765
1871
|
var r = element.getBoundingClientRect();
|
766
1872
|
return (e.clientX > r.left &&
|
@@ -784,7 +1890,7 @@ var DialogModal = function (_a) {
|
|
784
1890
|
document.body.classList.remove("modal-open");
|
785
1891
|
}
|
786
1892
|
}, [isOpened]);
|
787
|
-
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) {
|
1893
|
+
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) {
|
788
1894
|
return ref.current && !isClickInsideRectangle(e, ref.current) && onClose();
|
789
1895
|
} },
|
790
1896
|
React.createElement("div", { className: "tw-card-body tw-p-2" },
|
@@ -795,13 +1901,14 @@ var DialogModal = function (_a) {
|
|
795
1901
|
|
796
1902
|
function NavBar(_a) {
|
797
1903
|
var _this = this;
|
798
|
-
var appName = _a.appName,
|
799
|
-
var
|
800
|
-
var
|
801
|
-
var
|
802
|
-
var
|
803
|
-
var
|
804
|
-
var
|
1904
|
+
var appName = _a.appName, _b = _a.nameWidth, nameWidth = _b === void 0 ? 200 : _b;
|
1905
|
+
var _c = useState(false), signupOpen = _c[0], setSignupOpen = _c[1];
|
1906
|
+
var _d = useState(false), loginOpen = _d[0], setLoginOpen = _d[1];
|
1907
|
+
var _e = useState(""), email = _e[0], setEmail = _e[1];
|
1908
|
+
var _f = useState(""), userName = _f[0], setUserName = _f[1];
|
1909
|
+
var _g = useState(""), password = _g[0], setPassword = _g[1];
|
1910
|
+
var _h = useAuth(), isAuthenticated = _h.isAuthenticated, user = _h.user, login = _h.login, register = _h.register, loading = _h.loading, logout = _h.logout, token = _h.token;
|
1911
|
+
var navigate = useNavigate();
|
805
1912
|
var onRegister = function () { return __awaiter(_this, void 0, void 0, function () {
|
806
1913
|
return __generator(this, function (_a) {
|
807
1914
|
switch (_a.label) {
|
@@ -809,13 +1916,19 @@ function NavBar(_a) {
|
|
809
1916
|
success: {
|
810
1917
|
render: function (_a) {
|
811
1918
|
var data = _a.data;
|
1919
|
+
navigate("/");
|
812
1920
|
return "Hi ".concat(data === null || data === void 0 ? void 0 : data.first_name);
|
813
1921
|
},
|
814
1922
|
// other options
|
815
1923
|
icon: "✌️",
|
816
1924
|
},
|
817
|
-
error:
|
818
|
-
|
1925
|
+
error: {
|
1926
|
+
render: function (_a) {
|
1927
|
+
var data = _a.data;
|
1928
|
+
return "".concat(data);
|
1929
|
+
},
|
1930
|
+
},
|
1931
|
+
pending: 'creating new user ...'
|
819
1932
|
})];
|
820
1933
|
case 1:
|
821
1934
|
_a.sent();
|
@@ -831,13 +1944,19 @@ function NavBar(_a) {
|
|
831
1944
|
success: {
|
832
1945
|
render: function (_a) {
|
833
1946
|
var data = _a.data;
|
1947
|
+
navigate("/");
|
834
1948
|
return "Hi ".concat(data === null || data === void 0 ? void 0 : data.first_name);
|
835
1949
|
},
|
836
1950
|
// other options
|
837
1951
|
icon: "✌️",
|
838
1952
|
},
|
839
|
-
error:
|
840
|
-
|
1953
|
+
error: {
|
1954
|
+
render: function (_a) {
|
1955
|
+
var data = _a.data;
|
1956
|
+
return "".concat(data);
|
1957
|
+
},
|
1958
|
+
},
|
1959
|
+
pending: 'logging in ...'
|
841
1960
|
})];
|
842
1961
|
case 1:
|
843
1962
|
_a.sent();
|
@@ -855,32 +1974,39 @@ function NavBar(_a) {
|
|
855
1974
|
// other options
|
856
1975
|
icon: "👋",
|
857
1976
|
},
|
858
|
-
error:
|
859
|
-
|
1977
|
+
error: {
|
1978
|
+
render: function (_a) {
|
1979
|
+
var data = _a.data;
|
1980
|
+
return "".concat(data);
|
1981
|
+
},
|
1982
|
+
},
|
1983
|
+
pending: 'logging out ..'
|
860
1984
|
});
|
861
1985
|
};
|
862
1986
|
return (React.createElement(React.Fragment, null,
|
863
|
-
React.createElement("div", { className: "tw-navbar tw-bg-base-100 tw-z-
|
1987
|
+
React.createElement("div", { className: "tw-navbar tw-bg-base-100 tw-z-[10000] tw-shadow-xl tw-relative" },
|
864
1988
|
React.createElement("button", { className: "tw-btn tw-btn-square tw-btn-ghost", "data-te-sidenav-toggle-ref": true, "data-te-target": "#sidenav", "aria-controls": "#sidenav", "aria-haspopup": "true" },
|
865
1989
|
React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", className: "tw-inline-block tw-w-5 tw-h-5 tw-stroke-current" },
|
866
1990
|
React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M4 6h16M4 12h16M4 18h16" }))),
|
867
1991
|
React.createElement("div", { className: "tw-flex-1 tw-mr-2" },
|
868
|
-
React.createElement("div", { className: "tw-flex-1 tw-truncate
|
1992
|
+
React.createElement("div", { className: "tw-flex-1 tw-truncate tw-grid tw-grid-flow-col", style: { maxWidth: nameWidth } },
|
869
1993
|
React.createElement(Link, { className: "tw-btn tw-btn-ghost tw-px-2 tw-normal-case tw-text-xl tw-flex-1 tw-truncate", to: "/" },
|
870
|
-
React.createElement("
|
1994
|
+
React.createElement("h1", { className: "tw-truncate" }, appName)),
|
871
1995
|
React.createElement("button", { className: "tw-btn tw-px-2 tw-btn-ghost", onClick: function () { return window.my_modal_3.showModal(); } },
|
872
1996
|
React.createElement(QuestionMarkIcon, { className: "tw-h-5 tw-w-5" })))),
|
873
1997
|
isAuthenticated ?
|
874
1998
|
React.createElement("div", { className: "tw-flex-none" },
|
875
|
-
user.avatar ? React.createElement("div", { className: "tw-avatar" },
|
1999
|
+
(user === null || user === void 0 ? void 0 : user.avatar) ? React.createElement("div", { className: "tw-avatar" },
|
876
2000
|
React.createElement("div", { className: "tw-w-10 tw-rounded-full" },
|
877
|
-
React.createElement("img", { src: "https://
|
2001
|
+
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),
|
878
2002
|
React.createElement("div", { className: 'tw-ml-2 tw-mr-2' }, user === null || user === void 0 ? void 0 : user.first_name),
|
879
2003
|
React.createElement("div", { className: "tw-dropdown tw-dropdown-end" },
|
880
2004
|
React.createElement("label", { tabIndex: 0, className: "tw-btn tw-btn-ghost tw-btn-square" },
|
881
2005
|
React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
|
882
2006
|
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" }))),
|
883
|
-
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-[
|
2007
|
+
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]" },
|
2008
|
+
React.createElement("li", null,
|
2009
|
+
React.createElement(Link, { to: "/profile" }, "Profile")),
|
884
2010
|
React.createElement("li", null,
|
885
2011
|
React.createElement(Link, { to: "/settings" }, "Settings")),
|
886
2012
|
React.createElement("li", null,
|
@@ -894,11 +2020,11 @@ function NavBar(_a) {
|
|
894
2020
|
React.createElement("label", { tabIndex: 1, className: "tw-btn tw-btn-ghost md:tw-hidden" },
|
895
2021
|
React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" },
|
896
2022
|
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" }))),
|
897
|
-
React.createElement("ul", { tabIndex: 1, className: "tw-menu tw-
|
2023
|
+
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]" },
|
898
2024
|
React.createElement("li", null,
|
899
|
-
React.createElement("a", { onClick: function () {
|
2025
|
+
React.createElement("a", { onClick: function () { setLoginOpen(true); } }, "Login")),
|
900
2026
|
React.createElement("li", null,
|
901
|
-
React.createElement("a", { onClick: function () { return setSignupOpen(true); } }, "Sign
|
2027
|
+
React.createElement("a", { onClick: function () { return setSignupOpen(true); } }, "Sign Up")))))),
|
902
2028
|
React.createElement(DialogModal, { title: "Login", isOpened: loginOpen, onClose: function () { return setLoginOpen(false); } },
|
903
2029
|
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" }),
|
904
2030
|
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" }),
|
@@ -912,12 +2038,24 @@ function NavBar(_a) {
|
|
912
2038
|
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')))));
|
913
2039
|
}
|
914
2040
|
|
2041
|
+
var SetAssetsApi = function (_a) {
|
2042
|
+
var assetsApi = _a.assetsApi;
|
2043
|
+
var setAssetsApi = useSetAssetApi();
|
2044
|
+
useEffect(function () {
|
2045
|
+
setAssetsApi(assetsApi);
|
2046
|
+
}, [assetsApi]);
|
2047
|
+
return (React.createElement(React.Fragment, null));
|
2048
|
+
};
|
2049
|
+
|
915
2050
|
function AppShell(_a) {
|
916
|
-
var appName = _a.appName,
|
2051
|
+
var appName = _a.appName, nameWidth = _a.nameWidth, children = _a.children, assetsApi = _a.assetsApi;
|
917
2052
|
return (React.createElement(BrowserRouter, null,
|
918
|
-
React.createElement(
|
919
|
-
|
920
|
-
|
2053
|
+
React.createElement(AssetsProvider, null,
|
2054
|
+
React.createElement(SetAssetsApi, { assetsApi: assetsApi }),
|
2055
|
+
React.createElement(QuestsProvider, { initialOpen: true },
|
2056
|
+
React.createElement(ToastContainer, { position: "top-right", autoClose: 2000, hideProgressBar: true, newestOnTop: false, closeOnClick: true, rtl: false, pauseOnFocusLoss: true, draggable: true, pauseOnHover: true, theme: "light" }),
|
2057
|
+
React.createElement(NavBar, { appName: appName, nameWidth: nameWidth }),
|
2058
|
+
React.createElement("div", { id: "app-content", className: "tw-flex tw-!pl-[77px]" }, children)))));
|
921
2059
|
}
|
922
2060
|
|
923
2061
|
function SidebarSubmenu(_a) {
|
@@ -948,7 +2086,7 @@ function SidebarSubmenu(_a) {
|
|
948
2086
|
}
|
949
2087
|
|
950
2088
|
function SideBar(_a) {
|
951
|
-
var routes = _a.routes;
|
2089
|
+
var routes = _a.routes, bottomRoutes = _a.bottomRoutes;
|
952
2090
|
// prevent react18 from calling useEffect twice
|
953
2091
|
var init = useRef(false);
|
954
2092
|
var location = useLocation();
|
@@ -967,8 +2105,8 @@ function SideBar(_a) {
|
|
967
2105
|
init.current = true;
|
968
2106
|
}
|
969
2107
|
}, []);
|
970
|
-
return (React.createElement("nav", { id: "sidenav", className: "group tw-fixed tw-left-0
|
971
|
-
React.createElement("div", { className: 'tw-flex tw-flex-col tw-h-
|
2108
|
+
return (React.createElement("nav", { id: "sidenav", className: "group tw-fixed tw-left-0 tw-mt-16 tw-top-0 tw-z-[1035] tw-h-[calc(100dvh-64px)] tw--translate-x-full tw-overflow-hidden tw-shadow-xl data-[te-sidenav-slim='true']:tw-hidden data-[te-sidenav-slim-collapsed='true']:tw-w-[56px] data-[te-sidenav-slim='true']:tw-w-[56px] data-[te-sidenav-hidden='false']:tw-translate-x-0 dark:tw-bg-zinc-800 [&[data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='false']]:tw-hidden [&[data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='true']]:[display:unset]", "data-te-sidenav-init": true, "data-te-sidenav-hidden": "true", "data-te-sidenav-mode": "side", "data-te-sidenav-slim": "true", "data-te-sidenav-content": "#app-content", "data-te-sidenav-slim-collapsed": "true", "data-te-sidenav-slim-width": "56", "data-te-sidenav-width": "160" },
|
2109
|
+
React.createElement("div", { className: 'tw-flex tw-flex-col tw-h-[calc(100dvh-64px)]' },
|
972
2110
|
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) {
|
973
2111
|
return (React.createElement("li", { className: "", key: k }, route.submenu ?
|
974
2112
|
React.createElement(SidebarSubmenu, __assign({}, route)) :
|
@@ -983,8 +2121,23 @@ function SideBar(_a) {
|
|
983
2121
|
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),
|
984
2122
|
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))));
|
985
2123
|
})),
|
986
|
-
React.createElement("div", { id: "slim-toggler", className: 'tw-w-full tw-
|
987
|
-
React.createElement(
|
2124
|
+
React.createElement("div", { id: "slim-toggler", className: 'tw-w-full tw-bg-base-100 tw-flex-1 tw-grid tw-place-items-end', "aria-haspopup": "true" },
|
2125
|
+
React.createElement("div", { className: 'tw-w-full' },
|
2126
|
+
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) {
|
2127
|
+
return (React.createElement("li", { className: "", key: k }, route.submenu ?
|
2128
|
+
React.createElement(SidebarSubmenu, __assign({}, route)) :
|
2129
|
+
(React.createElement(NavLink, { end: true, target: route.blank ? "_blank" : "_self", to: route.path, className: function (_a) {
|
2130
|
+
var isActive = _a.isActive;
|
2131
|
+
return "".concat(isActive ? 'tw-font-semibold tw-bg-base-200 !tw-rounded-none' : 'tw-font-normal !tw-rounded-none');
|
2132
|
+
}, onClick: function () {
|
2133
|
+
if (screen.width < 640 && !slim)
|
2134
|
+
instance.toggle();
|
2135
|
+
} },
|
2136
|
+
route.icon,
|
2137
|
+
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),
|
2138
|
+
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))));
|
2139
|
+
})),
|
2140
|
+
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(); } }))))));
|
988
2141
|
}
|
989
2142
|
|
990
2143
|
function Content(_a) {
|
@@ -992,416 +2145,322 @@ function Content(_a) {
|
|
992
2145
|
return (React.createElement("div", { className: 'tw-flex tw-flex-col tw-w-full tw-relative' }, children));
|
993
2146
|
}
|
994
2147
|
|
995
|
-
var AuthContext = createContext({
|
996
|
-
isAuthenticated: false,
|
997
|
-
user: null,
|
998
|
-
login: function () { return Promise.reject(); },
|
999
|
-
register: function () { return Promise.reject(); },
|
1000
|
-
loading: false,
|
1001
|
-
logout: function () { },
|
1002
|
-
updateUser: function () { return Promise.reject(); },
|
1003
|
-
token: ""
|
1004
|
-
});
|
1005
|
-
var AuthProvider = function (_a) {
|
1006
|
-
var userApi = _a.userApi, children = _a.children;
|
1007
|
-
var _b = useState(null), user = _b[0], setUser = _b[1];
|
1008
|
-
var _c = useState(null), token = _c[0], setToken = _c[1];
|
1009
|
-
var _d = useState(false), loading = _d[0], setLoading = _d[1];
|
1010
|
-
var isAuthenticated = !!user;
|
1011
|
-
useEffect(function () {
|
1012
|
-
setLoading(true);
|
1013
|
-
loadUser();
|
1014
|
-
setLoading(false);
|
1015
|
-
}, []);
|
1016
|
-
function loadUser() {
|
1017
|
-
return __awaiter(this, void 0, void 0, function () {
|
1018
|
-
var token_1, me;
|
1019
|
-
return __generator(this, function (_a) {
|
1020
|
-
switch (_a.label) {
|
1021
|
-
case 0:
|
1022
|
-
_a.trys.push([0, 5, , 6]);
|
1023
|
-
return [4 /*yield*/, userApi.getToken()];
|
1024
|
-
case 1:
|
1025
|
-
token_1 = _a.sent();
|
1026
|
-
setToken(token_1);
|
1027
|
-
if (!token_1) return [3 /*break*/, 3];
|
1028
|
-
return [4 /*yield*/, userApi.getUser()];
|
1029
|
-
case 2:
|
1030
|
-
me = _a.sent();
|
1031
|
-
setUser(me);
|
1032
|
-
setLoading(false);
|
1033
|
-
return [2 /*return*/, me];
|
1034
|
-
case 3: return [2 /*return*/, undefined];
|
1035
|
-
case 4: return [3 /*break*/, 6];
|
1036
|
-
case 5:
|
1037
|
-
_a.sent();
|
1038
|
-
setLoading(false);
|
1039
|
-
return [2 /*return*/, undefined];
|
1040
|
-
case 6: return [2 /*return*/];
|
1041
|
-
}
|
1042
|
-
});
|
1043
|
-
});
|
1044
|
-
}
|
1045
|
-
var login = function (credentials) { return __awaiter(void 0, void 0, void 0, function () {
|
1046
|
-
var res, error_2;
|
1047
|
-
return __generator(this, function (_a) {
|
1048
|
-
switch (_a.label) {
|
1049
|
-
case 0:
|
1050
|
-
setLoading(true);
|
1051
|
-
_a.label = 1;
|
1052
|
-
case 1:
|
1053
|
-
_a.trys.push([1, 4, , 5]);
|
1054
|
-
return [4 /*yield*/, userApi.login(credentials.email, credentials.password)];
|
1055
|
-
case 2:
|
1056
|
-
res = _a.sent();
|
1057
|
-
setToken(res.access_token);
|
1058
|
-
return [4 /*yield*/, loadUser()];
|
1059
|
-
case 3: return [2 /*return*/, (_a.sent())];
|
1060
|
-
case 4:
|
1061
|
-
error_2 = _a.sent();
|
1062
|
-
setLoading(false);
|
1063
|
-
console.log(error_2.response.data.error[0]);
|
1064
|
-
return [2 /*return*/, error_2.response.data.error[0]];
|
1065
|
-
case 5:
|
1066
|
-
return [2 /*return*/];
|
1067
|
-
}
|
1068
|
-
});
|
1069
|
-
}); };
|
1070
|
-
var register = function (credentials, userName) { return __awaiter(void 0, void 0, void 0, function () {
|
1071
|
-
var error_3;
|
1072
|
-
return __generator(this, function (_a) {
|
1073
|
-
switch (_a.label) {
|
1074
|
-
case 0:
|
1075
|
-
setLoading(true);
|
1076
|
-
_a.label = 1;
|
1077
|
-
case 1:
|
1078
|
-
_a.trys.push([1, 4, , 5]);
|
1079
|
-
return [4 /*yield*/, userApi.register(credentials.email, credentials.password, userName)];
|
1080
|
-
case 2:
|
1081
|
-
_a.sent();
|
1082
|
-
return [4 /*yield*/, login(credentials)];
|
1083
|
-
case 3: return [2 /*return*/, (_a.sent())];
|
1084
|
-
case 4:
|
1085
|
-
error_3 = _a.sent();
|
1086
|
-
setLoading(false);
|
1087
|
-
console.log(error_3);
|
1088
|
-
return [2 /*return*/, error_3.response.data.error[0]];
|
1089
|
-
case 5:
|
1090
|
-
return [2 /*return*/];
|
1091
|
-
}
|
1092
|
-
});
|
1093
|
-
}); };
|
1094
|
-
var logout = function () { return __awaiter(void 0, void 0, void 0, function () {
|
1095
|
-
return __generator(this, function (_a) {
|
1096
|
-
switch (_a.label) {
|
1097
|
-
case 0: return [4 /*yield*/, userApi.logout()];
|
1098
|
-
case 1:
|
1099
|
-
_a.sent();
|
1100
|
-
setUser(null);
|
1101
|
-
return [2 /*return*/];
|
1102
|
-
}
|
1103
|
-
});
|
1104
|
-
}); };
|
1105
|
-
var updateUser = function (user) { return __awaiter(void 0, void 0, void 0, function () {
|
1106
|
-
var userRest, res, error_4;
|
1107
|
-
return __generator(this, function (_a) {
|
1108
|
-
switch (_a.label) {
|
1109
|
-
case 0:
|
1110
|
-
setLoading(true);
|
1111
|
-
user.id, userRest = __rest(user, ["id"]);
|
1112
|
-
_a.label = 1;
|
1113
|
-
case 1:
|
1114
|
-
_a.trys.push([1, 3, , 4]);
|
1115
|
-
return [4 /*yield*/, userApi.updateUser(userRest)];
|
1116
|
-
case 2:
|
1117
|
-
res = _a.sent();
|
1118
|
-
setUser(res);
|
1119
|
-
setLoading(false);
|
1120
|
-
return [2 /*return*/, res];
|
1121
|
-
case 3:
|
1122
|
-
error_4 = _a.sent();
|
1123
|
-
setLoading(false);
|
1124
|
-
return [2 /*return*/, error_4.response.data.error[0]];
|
1125
|
-
case 4: return [2 /*return*/];
|
1126
|
-
}
|
1127
|
-
});
|
1128
|
-
}); };
|
1129
|
-
return (React.createElement(AuthContext.Provider, { value: { isAuthenticated: isAuthenticated, user: user, login: login, register: register, loading: loading, logout: logout, updateUser: updateUser, token: token } }, children));
|
1130
|
-
};
|
1131
|
-
var useAuth = function () { return useContext(AuthContext); };
|
1132
|
-
|
1133
|
-
function ErrorText(_a) {
|
1134
|
-
var styleClass = _a.styleClass, children = _a.children;
|
1135
|
-
return (React.createElement("p", { className: "tw-text-center tw-text-error ".concat(styleClass) }, children));
|
1136
|
-
}
|
1137
|
-
|
1138
|
-
function LoginPage() {
|
1139
|
-
var INITIAL_LOGIN_OBJ = {
|
1140
|
-
password: "",
|
1141
|
-
emailId: ""
|
1142
|
-
};
|
1143
|
-
var _a = useState(false), loading = _a[0], setLoading = _a[1];
|
1144
|
-
var _b = useState(""), errorMessage = _b[0], setErrorMessage = _b[1];
|
1145
|
-
var _c = useState(INITIAL_LOGIN_OBJ), loginObj = _c[0]; _c[1];
|
1146
|
-
var submitForm = function (e) {
|
1147
|
-
e.preventDefault();
|
1148
|
-
setErrorMessage("");
|
1149
|
-
if (loginObj.emailId.trim() === "")
|
1150
|
-
return setErrorMessage("Email Id is required! (use any value)");
|
1151
|
-
if (loginObj.password.trim() === "")
|
1152
|
-
return setErrorMessage("Password is required! (use any value)");
|
1153
|
-
else {
|
1154
|
-
setLoading(true);
|
1155
|
-
// Call API to check user credentials and save token in localstorage
|
1156
|
-
localStorage.setItem("token", "DumyTokenHere");
|
1157
|
-
setLoading(false);
|
1158
|
-
window.location.href = '/app/welcome';
|
1159
|
-
}
|
1160
|
-
};
|
1161
|
-
var updateFormValue = function (val) {
|
1162
|
-
console.log(val);
|
1163
|
-
};
|
1164
|
-
return (React.createElement("div", { className: "tw-flex-1 tw-bg-base-200 tw-flex tw-items-center" },
|
1165
|
-
React.createElement("div", { className: "tw-card tw-mx-auto tw-w-full tw-max-w-md tw-shadow-xl" },
|
1166
|
-
React.createElement("div", { className: "tw-grid md:tw-grid-cols-1 tw-grid-cols-1 tw-bg-base-100 tw-rounded-xl" },
|
1167
|
-
React.createElement("div", { className: 'tw-py-10 tw-px-10' },
|
1168
|
-
React.createElement("h2", { className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, "Login"),
|
1169
|
-
React.createElement("form", { onSubmit: function (e) { return submitForm(e); } },
|
1170
|
-
React.createElement("div", { className: "tw-mb-4" },
|
1171
|
-
React.createElement(TextInput, { type: "email", defaultValue: loginObj.emailId, containerStyle: "tw-mt-4", labelTitle: "E-Mail", updateFormValue: function (v) { return updateFormValue(v); } }),
|
1172
|
-
React.createElement(TextInput, { defaultValue: loginObj.password, type: "password", containerStyle: "tw-mt-4", labelTitle: "Password", updateFormValue: function (v) { return updateFormValue(v); } })),
|
1173
|
-
React.createElement("div", { className: 'tw-text-right tw-text-primary' },
|
1174
|
-
React.createElement(Link, { to: "/forgot-password" },
|
1175
|
-
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?"))),
|
1176
|
-
React.createElement(ErrorText, { styleClass: "mt-8" }, errorMessage),
|
1177
|
-
React.createElement("button", { type: "submit", className: "tw-btn tw-mt-2 tw-w-full tw-btn-primary" + (loading ? " tw-loading" : "") }, "Login"),
|
1178
|
-
React.createElement("div", { className: 'tw-text-center tw-mt-4' },
|
1179
|
-
"Don't have an account yet? ",
|
1180
|
-
React.createElement(Link, { to: "/signup" },
|
1181
|
-
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")))))))));
|
1182
|
-
}
|
1183
|
-
|
1184
|
-
function SignupPage() {
|
1185
|
-
var INITIAL_REGISTER_OBJ = {
|
1186
|
-
name: "",
|
1187
|
-
password: "",
|
1188
|
-
emailId: ""
|
1189
|
-
};
|
1190
|
-
var _a = useState(false), loading = _a[0], setLoading = _a[1];
|
1191
|
-
var _b = useState(""), errorMessage = _b[0], setErrorMessage = _b[1];
|
1192
|
-
var _c = useState(INITIAL_REGISTER_OBJ), registerObj = _c[0]; _c[1];
|
1193
|
-
var submitForm = function (e) {
|
1194
|
-
e.preventDefault();
|
1195
|
-
setErrorMessage("");
|
1196
|
-
if (registerObj.name.trim() === "")
|
1197
|
-
return setErrorMessage("Name is required! (use any value)");
|
1198
|
-
if (registerObj.emailId.trim() === "")
|
1199
|
-
return setErrorMessage("Email Id is required! (use any value)");
|
1200
|
-
if (registerObj.password.trim() === "")
|
1201
|
-
return setErrorMessage("Password is required! (use any value)");
|
1202
|
-
else {
|
1203
|
-
setLoading(true);
|
1204
|
-
// Call API to check user credentials and save token in localstorage
|
1205
|
-
localStorage.setItem("token", "DumyTokenHere");
|
1206
|
-
setLoading(false);
|
1207
|
-
window.location.href = '/app/welcome';
|
1208
|
-
}
|
1209
|
-
};
|
1210
|
-
var updateFormValue = function (val) {
|
1211
|
-
console.log(val);
|
1212
|
-
};
|
1213
|
-
return (React.createElement("div", { className: "tw-flex-1 tw-bg-base-200 tw-flex tw-items-center" },
|
1214
|
-
React.createElement("div", { className: "tw-card tw-mx-auto tw-w-full tw-max-w-md tw-shadow-xl" },
|
1215
|
-
React.createElement("div", { className: "tw-grid md:tw-grid-cols-1 tw-grid-cols-1 tw-bg-base-100 tw-rounded-xl" },
|
1216
|
-
React.createElement("div", { className: 'tw-py-10 tw-px-10' },
|
1217
|
-
React.createElement("h2", { className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, "Sign Up"),
|
1218
|
-
React.createElement("form", { onSubmit: function (e) { return submitForm(e); } },
|
1219
|
-
React.createElement("div", { className: "mb-4" },
|
1220
|
-
React.createElement(TextInput, { defaultValue: registerObj.name, containerStyle: "tw-mt-4", labelTitle: "Name", updateFormValue: updateFormValue }),
|
1221
|
-
React.createElement(TextInput, { defaultValue: registerObj.emailId, containerStyle: "tw-mt-4", labelTitle: "E-Mail", updateFormValue: updateFormValue }),
|
1222
|
-
React.createElement(TextInput, { defaultValue: registerObj.password, type: "password", containerStyle: "tw-mt-4", labelTitle: "Password", updateFormValue: updateFormValue })),
|
1223
|
-
React.createElement(ErrorText, { styleClass: "tw-mt-8" }, errorMessage),
|
1224
|
-
React.createElement("button", { type: "submit", className: "tw-btn tw-mt-2 tw-w-full tw-btn-primary" + (loading ? " tw-loading" : "") }, "Register"),
|
1225
|
-
React.createElement("div", { className: 'tw-text-center tw-mt-4' },
|
1226
|
-
"Already have an account? ",
|
1227
|
-
React.createElement(Link, { to: "/login" },
|
1228
|
-
React.createElement("span", { className: " tw-inline-block hover:tw-text-primary hover:tw-underline hover:tw-cursor-pointer tw-transition tw-duration-200" }, "Login")))))))));
|
1229
|
-
}
|
1230
|
-
|
1231
2148
|
function Subtitle(_a) {
|
1232
2149
|
var styleClass = _a.styleClass, children = _a.children;
|
1233
2150
|
return (React.createElement("div", { className: "tw-text-xl tw-font-semibold ".concat(styleClass) }, children));
|
1234
2151
|
}
|
1235
2152
|
|
1236
2153
|
function TitleCard(_a) {
|
1237
|
-
var title = _a.title, children = _a.children, topMargin = _a.topMargin, TopSideButtons = _a.TopSideButtons;
|
1238
|
-
return (React.createElement("div", { className: "tw-card tw-w-full tw-p-6 tw-
|
1239
|
-
|
1240
|
-
|
1241
|
-
|
1242
|
-
|
1243
|
-
|
2154
|
+
var title = _a.title, hideTitle = _a.hideTitle, children = _a.children, topMargin = _a.topMargin, TopSideButtons = _a.TopSideButtons, className = _a.className;
|
2155
|
+
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") },
|
2156
|
+
!hideTitle &&
|
2157
|
+
React.createElement(React.Fragment, null,
|
2158
|
+
React.createElement(Subtitle, { styleClass: TopSideButtons ? "tw-inline-block" : "" },
|
2159
|
+
title,
|
2160
|
+
TopSideButtons && React.createElement("div", { className: "tw-inline-block tw-float-right" }, TopSideButtons)),
|
2161
|
+
React.createElement("div", { className: "tw-divider tw-mt-2" })),
|
2162
|
+
React.createElement("div", { className: 'tw-h-full tw-bg-transparent tw-w-full tw-pb-6 tw-bg-base-100' }, children)));
|
1244
2163
|
}
|
1245
2164
|
|
1246
|
-
function
|
1247
|
-
var useAuth = _a.
|
1248
|
-
var _b =
|
1249
|
-
var _c = useState(""),
|
1250
|
-
var _d = useState(""),
|
1251
|
-
var _e = useState(
|
1252
|
-
var
|
1253
|
-
var _g = useState(""), password = _g[0], setPassword = _g[1];
|
1254
|
-
var _h = useState(false), passwordChanged = _h[0], setPasswordChanged = _h[1];
|
2165
|
+
function UserSettings() {
|
2166
|
+
var _a = useAuth(), user = _a.user, updateUser = _a.updateUser, loading = _a.loading; _a.token;
|
2167
|
+
var _b = useState(""), id = _b[0], setId = _b[1];
|
2168
|
+
var _c = useState(""), email = _c[0], setEmail = _c[1];
|
2169
|
+
var _d = useState(""), password = _d[0], setPassword = _d[1];
|
2170
|
+
var _e = useState(false), passwordChanged = _e[0], setPasswordChanged = _e[1];
|
2171
|
+
var navigate = useNavigate();
|
1255
2172
|
useEffect(function () {
|
1256
2173
|
setId((user === null || user === void 0 ? void 0 : user.id) ? user.id : "");
|
1257
|
-
setName((user === null || user === void 0 ? void 0 : user.first_name) ? user.first_name : "");
|
1258
|
-
setText((user === null || user === void 0 ? void 0 : user.description) ? user.description : "");
|
1259
2174
|
setEmail((user === null || user === void 0 ? void 0 : user.email) ? user.email : "");
|
1260
2175
|
setPassword((user === null || user === void 0 ? void 0 : user.password) ? user.password : "");
|
1261
2176
|
}, [user]);
|
1262
|
-
var navigate = useNavigate();
|
1263
2177
|
var onUpdateUser = function () {
|
1264
2178
|
var changedUser = {};
|
1265
|
-
|
1266
|
-
changedUser = { id: id, first_name: name, description: text, email: email, password: password };
|
1267
|
-
}
|
1268
|
-
else {
|
1269
|
-
changedUser = { id: id, first_name: name, description: text, email: email };
|
1270
|
-
}
|
2179
|
+
changedUser = __assign({ id: id, email: email }, passwordChanged && { password: password });
|
1271
2180
|
toast.promise(updateUser(changedUser), {
|
1272
2181
|
pending: 'updating Profile ...',
|
1273
2182
|
success: 'Profile updated',
|
1274
|
-
error:
|
2183
|
+
error: {
|
2184
|
+
render: function (_a) {
|
2185
|
+
var data = _a.data;
|
2186
|
+
return "".concat(data);
|
2187
|
+
},
|
2188
|
+
},
|
1275
2189
|
})
|
1276
2190
|
.then(function () { return navigate("/"); });
|
1277
2191
|
};
|
1278
|
-
return (React.createElement(
|
1279
|
-
React.createElement("
|
1280
|
-
React.createElement(
|
1281
|
-
React.createElement(
|
1282
|
-
React.createElement(
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
React.createElement(
|
1289
|
-
|
1290
|
-
setPasswordChanged(true);
|
1291
|
-
} })),
|
1292
|
-
React.createElement("div", { className: "tw-mt-8" },
|
1293
|
-
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"))))));
|
2192
|
+
return (React.createElement(React.Fragment, null,
|
2193
|
+
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" },
|
2194
|
+
React.createElement("div", { className: 'tw-w-full xl:tw-max-w-6xl' },
|
2195
|
+
React.createElement(TitleCard, { title: "Settings", topMargin: "tw-mt-2", className: 'tw-mb-6' },
|
2196
|
+
React.createElement("div", { className: "tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6" },
|
2197
|
+
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); } }),
|
2198
|
+
React.createElement(TextInput, { type: 'password', placeholder: "new Password", defaultValue: (user === null || user === void 0 ? void 0 : user.password) ? user.password : "", updateFormValue: function (v) {
|
2199
|
+
setPassword(v);
|
2200
|
+
setPasswordChanged(true);
|
2201
|
+
} })),
|
2202
|
+
React.createElement("div", { className: "tw-mt-8" },
|
2203
|
+
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")))))));
|
1294
2204
|
}
|
1295
2205
|
|
1296
|
-
|
1297
|
-
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1306
|
-
|
1307
|
-
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
|
1316
|
-
|
1317
|
-
|
1318
|
-
|
1319
|
-
|
1320
|
-
function
|
1321
|
-
|
1322
|
-
|
1323
|
-
|
1324
|
-
|
1325
|
-
|
1326
|
-
|
1327
|
-
|
1328
|
-
|
1329
|
-
|
1330
|
-
|
1331
|
-
|
1332
|
-
}
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
|
1337
|
-
|
1338
|
-
|
1339
|
-
|
1340
|
-
|
1341
|
-
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1348
|
-
|
1349
|
-
|
2206
|
+
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 }";
|
2207
|
+
styleInject(css_248z$1);
|
2208
|
+
|
2209
|
+
// Improved version of https://usehooks.com/useOnClickOutside/
|
2210
|
+
var useClickOutside = function (ref, handler) {
|
2211
|
+
useEffect(function () {
|
2212
|
+
var startedInside = false;
|
2213
|
+
var startedWhenMounted = false;
|
2214
|
+
var listener = function (event) {
|
2215
|
+
// Do nothing if `mousedown` or `touchstart` started inside ref element
|
2216
|
+
if (startedInside || !startedWhenMounted)
|
2217
|
+
return;
|
2218
|
+
// Do nothing if clicking ref's element or descendent elements
|
2219
|
+
if (!ref.current || ref.current.contains(event.target))
|
2220
|
+
return;
|
2221
|
+
handler(event);
|
2222
|
+
};
|
2223
|
+
var validateEventStart = function (event) {
|
2224
|
+
startedWhenMounted = ref.current;
|
2225
|
+
startedInside = ref.current && ref.current.contains(event.target);
|
2226
|
+
};
|
2227
|
+
document.addEventListener("mousedown", validateEventStart);
|
2228
|
+
document.addEventListener("touchstart", validateEventStart);
|
2229
|
+
document.addEventListener("click", listener);
|
2230
|
+
return function () {
|
2231
|
+
document.removeEventListener("mousedown", validateEventStart);
|
2232
|
+
document.removeEventListener("touchstart", validateEventStart);
|
2233
|
+
document.removeEventListener("click", listener);
|
2234
|
+
};
|
2235
|
+
}, [ref, handler]);
|
2236
|
+
};
|
2237
|
+
|
2238
|
+
var ColorPicker = function (_a) {
|
2239
|
+
var color = _a.color, onChange = _a.onChange, className = _a.className;
|
2240
|
+
var popover = useRef(null);
|
2241
|
+
var _b = useState(false), isOpen = _b[0], toggle = _b[1];
|
2242
|
+
var close = useCallback(function () { return toggle(false); }, []);
|
2243
|
+
useClickOutside(popover, close);
|
2244
|
+
return (React.createElement("div", { className: "picker ".concat(className) },
|
2245
|
+
React.createElement("div", { className: "swatch", style: { backgroundColor: color }, onClick: function () { return toggle(true); } }),
|
2246
|
+
isOpen && (React.createElement("div", { className: "popover", ref: popover },
|
2247
|
+
React.createElement(HexColorPicker, { color: color, onChange: onChange })))));
|
2248
|
+
};
|
2249
|
+
|
2250
|
+
function ProfileSettings() {
|
2251
|
+
var _a = useAuth(), user = _a.user, updateUser = _a.updateUser, loading = _a.loading, token = _a.token;
|
2252
|
+
var _b = useState(""), id = _b[0], setId = _b[1];
|
2253
|
+
var _c = useState(""), name = _c[0], setName = _c[1];
|
2254
|
+
var _d = useState(""), text = _d[0], setText = _d[1];
|
2255
|
+
var _e = useState(""), avatar = _e[0], setAvatar = _e[1];
|
2256
|
+
var _f = useState(""), color = _f[0], setColor = _f[1];
|
2257
|
+
var _g = useState(), crop = _g[0], setCrop = _g[1];
|
2258
|
+
var _h = useState(""), image = _h[0], setImage = _h[1];
|
2259
|
+
var _j = useState(false), cropModalOpen = _j[0], setCropModalOpen = _j[1];
|
2260
|
+
var _k = useState(false), cropping = _k[0], setCropping = _k[1];
|
2261
|
+
var assetsApi = useAssetApi();
|
2262
|
+
var navigate = useNavigate();
|
2263
|
+
useEffect(function () {
|
2264
|
+
setId((user === null || user === void 0 ? void 0 : user.id) ? user.id : "");
|
2265
|
+
setName((user === null || user === void 0 ? void 0 : user.first_name) ? user.first_name : "");
|
2266
|
+
setText((user === null || user === void 0 ? void 0 : user.description) ? user.description : "");
|
2267
|
+
setAvatar((user === null || user === void 0 ? void 0 : user.avatar) ? user === null || user === void 0 ? void 0 : user.avatar : ""),
|
2268
|
+
setColor((user === null || user === void 0 ? void 0 : user.color) ? user.color : "#aabbcc");
|
2269
|
+
}, [user]);
|
2270
|
+
var imgRef = useRef(null);
|
2271
|
+
var onImageChange = function (event) {
|
2272
|
+
if (event.target.files && event.target.files[0]) {
|
2273
|
+
setImage(URL.createObjectURL(event.target.files[0]));
|
1350
2274
|
}
|
2275
|
+
setCropModalOpen(true);
|
1351
2276
|
};
|
2277
|
+
function onImageLoad(e) {
|
2278
|
+
var _a = e.currentTarget, width = _a.width, height = _a.height;
|
2279
|
+
console.log(width);
|
2280
|
+
setCrop(centerAspectCrop(width, height, 1));
|
2281
|
+
}
|
2282
|
+
// This is to demonstate how to make and center a % aspect crop
|
2283
|
+
// which is a bit trickier so we use some helper functions.
|
2284
|
+
function centerAspectCrop(mediaWidth, mediaHeight, aspect) {
|
2285
|
+
return centerCrop(makeAspectCrop({
|
2286
|
+
unit: 'px',
|
2287
|
+
width: mediaWidth / 2,
|
2288
|
+
}, aspect, mediaWidth, mediaHeight), mediaWidth, mediaHeight);
|
2289
|
+
}
|
2290
|
+
function renderCrop() {
|
2291
|
+
return __awaiter(this, void 0, void 0, function () {
|
2292
|
+
var image, scaleX, scaleY, canvas, ctx, pixelRatio, blob;
|
2293
|
+
return __generator(this, function (_a) {
|
2294
|
+
switch (_a.label) {
|
2295
|
+
case 0:
|
2296
|
+
image = imgRef.current;
|
2297
|
+
if (!(crop && image)) return [3 /*break*/, 3];
|
2298
|
+
scaleX = image.naturalWidth / image.width;
|
2299
|
+
scaleY = image.naturalHeight / image.height;
|
2300
|
+
canvas = new OffscreenCanvas(crop.width * scaleX, crop.height * scaleY);
|
2301
|
+
ctx = canvas.getContext("2d");
|
2302
|
+
pixelRatio = window.devicePixelRatio;
|
2303
|
+
canvas.width = crop.width * pixelRatio * scaleX;
|
2304
|
+
canvas.height = crop.height * pixelRatio * scaleY;
|
2305
|
+
if (ctx) {
|
2306
|
+
ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
|
2307
|
+
ctx.drawImage(image, crop.x * scaleX, crop.y * scaleY, crop.width * scaleX, crop.height * scaleY, 0, 0, crop.width * scaleX, crop.height * scaleY);
|
2308
|
+
}
|
2309
|
+
return [4 /*yield*/, canvas.convertToBlob()];
|
2310
|
+
case 1:
|
2311
|
+
blob = _a.sent();
|
2312
|
+
return [4 /*yield*/, resizeBlob(blob)];
|
2313
|
+
case 2:
|
2314
|
+
_a.sent();
|
2315
|
+
setCropping(false);
|
2316
|
+
setImage("");
|
2317
|
+
_a.label = 3;
|
2318
|
+
case 3: return [2 /*return*/];
|
2319
|
+
}
|
2320
|
+
});
|
2321
|
+
});
|
2322
|
+
}
|
2323
|
+
function resizeBlob(blob) {
|
2324
|
+
return __awaiter(this, void 0, void 0, function () {
|
2325
|
+
var img, canvas, ctx, resizedBlob, asset;
|
2326
|
+
return __generator(this, function (_a) {
|
2327
|
+
switch (_a.label) {
|
2328
|
+
case 0:
|
2329
|
+
img = new Image();
|
2330
|
+
img.src = URL.createObjectURL(blob);
|
2331
|
+
return [4 /*yield*/, img.decode()];
|
2332
|
+
case 1:
|
2333
|
+
_a.sent();
|
2334
|
+
canvas = new OffscreenCanvas(400, 400);
|
2335
|
+
ctx = canvas.getContext("2d");
|
2336
|
+
ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(img, 0, 0, 400, 400);
|
2337
|
+
return [4 /*yield*/, canvas.convertToBlob()];
|
2338
|
+
case 2:
|
2339
|
+
resizedBlob = _a.sent();
|
2340
|
+
return [4 /*yield*/, assetsApi.upload(resizedBlob, "test")];
|
2341
|
+
case 3:
|
2342
|
+
asset = _a.sent();
|
2343
|
+
setAvatar(asset.id);
|
2344
|
+
return [2 /*return*/];
|
2345
|
+
}
|
2346
|
+
});
|
2347
|
+
});
|
2348
|
+
}
|
2349
|
+
var onUpdateUser = function () {
|
2350
|
+
var changedUser = {};
|
2351
|
+
changedUser = __assign({ id: id, first_name: name, description: text, color: color }, avatar.length > 10 && { avatar: avatar });
|
2352
|
+
toast.promise(updateUser(changedUser), {
|
2353
|
+
pending: 'updating Profile ...',
|
2354
|
+
success: 'Profile updated',
|
2355
|
+
error: {
|
2356
|
+
render: function (_a) {
|
2357
|
+
var data = _a.data;
|
2358
|
+
return "".concat(data);
|
2359
|
+
},
|
2360
|
+
},
|
2361
|
+
})
|
2362
|
+
.then(function () { return navigate("/"); });
|
2363
|
+
};
|
2364
|
+
return (React.createElement(React.Fragment, null,
|
2365
|
+
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" },
|
2366
|
+
React.createElement("div", { className: 'tw-w-full xl:tw-max-w-6xl' },
|
2367
|
+
React.createElement(TitleCard, { title: "Profile", topMargin: "tw-mt-2", className: 'tw-mb-6' },
|
2368
|
+
React.createElement("div", { className: "tw-flex" },
|
2369
|
+
!cropping ?
|
2370
|
+
React.createElement("label", { className: "custom-file-upload" },
|
2371
|
+
React.createElement("input", { type: "file", accept: "image/*", className: "tw-file-input tw-w-full tw-max-w-xs", onChange: onImageChange }),
|
2372
|
+
React.createElement("div", { className: 'button tw-btn tw-btn-lg tw-btn-circle tw-animate-none' },
|
2373
|
+
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" },
|
2374
|
+
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" }))),
|
2375
|
+
avatar ?
|
2376
|
+
React.createElement("div", { className: 'tw-h-20 tw-w-20' },
|
2377
|
+
React.createElement("img", { src: assetsApi.url + avatar + "?access_token=" + token, className: ' tw-rounded-full' }))
|
2378
|
+
:
|
2379
|
+
React.createElement("div", { className: 'tw-h-20 tw-w-20' },
|
2380
|
+
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" } },
|
2381
|
+
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" }),
|
2382
|
+
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" }))))
|
2383
|
+
: React.createElement("div", { className: 'tw-w-20 tw-flex tw-items-center tw-justify-center' },
|
2384
|
+
React.createElement("span", { className: "tw-loading tw-loading-spinner" })),
|
2385
|
+
React.createElement(ColorPicker, { color: color, onChange: setColor, className: "-tw-left-6 tw-top-14 -tw-mr-6" }),
|
2386
|
+
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 ' })),
|
2387
|
+
React.createElement("div", { className: "tw-grid tw-grid-cols-1 tw-md:grid-cols-1 tw-gap-6 tw-pt-6 tw-pb-6" },
|
2388
|
+
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' })),
|
2389
|
+
React.createElement("div", { className: "tw-mt-8" },
|
2390
|
+
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"))))),
|
2391
|
+
React.createElement(DialogModal, { title: "", isOpened: cropModalOpen, onClose: function () {
|
2392
|
+
setCropModalOpen(false);
|
2393
|
+
setImage("");
|
2394
|
+
} },
|
2395
|
+
React.createElement(ReactCrop, { crop: crop, onChange: function (c) { return setCrop(c); }, aspect: 1 },
|
2396
|
+
React.createElement("img", { src: image, ref: imgRef, onLoad: onImageLoad })),
|
2397
|
+
React.createElement("button", { className: "tw-btn ", onClick: function () {
|
2398
|
+
setCropping(true);
|
2399
|
+
setCropModalOpen(false);
|
2400
|
+
renderCrop();
|
2401
|
+
} }, "Select"))));
|
2402
|
+
}
|
2403
|
+
|
2404
|
+
function Modal(_a) {
|
2405
|
+
var children = _a.children;
|
1352
2406
|
return (React.createElement(React.Fragment, null,
|
1353
|
-
React.createElement("dialog", { id: "my_modal_3", className: "tw-modal" },
|
1354
|
-
React.createElement("form", { method: "dialog", className: "tw-modal-box" },
|
1355
|
-
React.createElement("button", { className: "tw-btn tw-btn-sm tw-btn-circle tw-btn-ghost tw-absolute tw-right-2 tw-top-2" }, "\u2715"),
|
1356
|
-
|
2407
|
+
React.createElement("dialog", { id: "my_modal_3", className: "tw-modal tw-transition-all tw-duration-300" },
|
2408
|
+
React.createElement("form", { method: "dialog", className: "tw-modal-box tw-transition-none" },
|
2409
|
+
React.createElement("button", { className: "tw-btn tw-btn-sm tw-btn-circle tw-btn-ghost tw-absolute tw-right-2 tw-top-2 focus:tw-outline-none" }, "\u2715"),
|
2410
|
+
children),
|
1357
2411
|
React.createElement("form", { method: "dialog", className: "tw-modal-backdrop" },
|
1358
2412
|
React.createElement("button", null, "close")))));
|
1359
2413
|
}
|
1360
2414
|
|
1361
2415
|
function Quests() {
|
1362
|
-
var
|
1363
|
-
|
1364
|
-
|
1365
|
-
|
1366
|
-
|
1367
|
-
|
1368
|
-
|
1369
|
-
|
1370
|
-
|
1371
|
-
|
1372
|
-
|
1373
|
-
|
1374
|
-
|
1375
|
-
|
1376
|
-
|
1377
|
-
|
1378
|
-
|
1379
|
-
React.createElement("
|
1380
|
-
React.createElement("
|
1381
|
-
|
1382
|
-
|
1383
|
-
React.createElement("
|
1384
|
-
React.createElement("
|
1385
|
-
|
1386
|
-
|
1387
|
-
|
1388
|
-
|
2416
|
+
var questsOpen = useQuestsOpen();
|
2417
|
+
var setQuestsOpen = useSetQuestOpen();
|
2418
|
+
var _a = useAuth(), isAuthenticated = _a.isAuthenticated, user = _a.user;
|
2419
|
+
useEffect(function () {
|
2420
|
+
setQuestsOpen(false);
|
2421
|
+
}, []);
|
2422
|
+
return (React.createElement(React.Fragment, null, questsOpen ?
|
2423
|
+
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]" },
|
2424
|
+
React.createElement("div", { className: "tw-card-body tw-p-4 tw-pt-0" },
|
2425
|
+
React.createElement("div", { className: "tw-card-actions tw-justify-end" },
|
2426
|
+
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")),
|
2427
|
+
React.createElement("h2", { className: "tw-card-title tw-m-auto " },
|
2428
|
+
"Level 1",
|
2429
|
+
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" },
|
2430
|
+
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" }))),
|
2431
|
+
React.createElement("ul", { className: 'tw-flex-row' },
|
2432
|
+
React.createElement("li", null,
|
2433
|
+
React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-0" },
|
2434
|
+
React.createElement("input", { type: "checkbox", readOnly: true, className: "tw-checkbox tw-checkbox-xs tw-checkbox-success", checked: isAuthenticated ? isAuthenticated : false }),
|
2435
|
+
React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, "Sign Up"))),
|
2436
|
+
React.createElement("li", null,
|
2437
|
+
React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-0" },
|
2438
|
+
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 }),
|
2439
|
+
React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, "Fill Profile"))),
|
2440
|
+
React.createElement("li", null,
|
2441
|
+
React.createElement("label", { className: "tw-label tw-justify-normal tw-pt-1 tw-pb-0" },
|
2442
|
+
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 }),
|
2443
|
+
React.createElement("span", { className: 'tw-text-sm tw-label-text tw-mx-2' }, "Upload Avatar")))),
|
2444
|
+
" "))
|
2445
|
+
: ""));
|
1389
2446
|
}
|
1390
2447
|
|
1391
2448
|
function CardPage(_a) {
|
1392
|
-
var title = _a.title, children = _a.children;
|
2449
|
+
var title = _a.title, hideTitle = _a.hideTitle, children = _a.children, parent = _a.parent;
|
1393
2450
|
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" },
|
1394
|
-
React.createElement("div", { className: 'tw-w-full xl:tw-max-w-6xl' },
|
2451
|
+
React.createElement("div", { className: 'tw-w-full xl:tw-max-w-6xl ' },
|
1395
2452
|
React.createElement("div", { className: "tw-text-sm tw-breadcrumbs" },
|
1396
2453
|
React.createElement("ul", null,
|
1397
2454
|
React.createElement("li", null,
|
1398
2455
|
React.createElement(Link, { to: '/' }, "Home")),
|
2456
|
+
parent && React.createElement("li", null,
|
2457
|
+
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)),
|
1399
2458
|
React.createElement("li", null, title))),
|
1400
|
-
React.createElement(TitleCard, { title: title, topMargin: "
|
2459
|
+
React.createElement(TitleCard, { hideTitle: hideTitle, title: title, topMargin: "tw-my-2", className: " tw-mb-4" }, children))));
|
1401
2460
|
}
|
1402
2461
|
|
1403
|
-
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-3 {\n height: 0.75rem;\n}\n.tw-h-4 {\n height: 1rem;\n}\n.tw-h-40 {\n height: 10rem;\n}\n.tw-h-5 {\n height: 1.25rem;\n}\n.tw-h-6 {\n height: 1.5rem;\n}\n.tw-h-64 {\n height: 16rem;\n}\n.tw-h-fit {\n height: -moz-fit-content;\n height: fit-content;\n}\n.tw-h-full {\n height: 100%;\n}\n.tw-max-h-72 {\n max-height: 18rem;\n}\n.tw-min-h-0 {\n min-height: 0px;\n}\n.tw-w-1 {\n width: 0.25rem;\n}\n.tw-w-10 {\n width: 2.5rem;\n}\n.tw-w-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}";
|
2462
|
+
var css_248z = "/*\n! tailwindcss v3.3.1 | MIT License | https://tailwindcss.com\n*//*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n*/\n\nhtml {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: Roboto, sans-serif; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font family by default.\n2. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden] {\n display: none;\n}\n\n:root,\n[data-theme] {\n background-color: var(--fallback-b1,oklch(var(--b1)/1));\n color: var(--fallback-bc,oklch(var(--bc)/1));\n}\n\n@supports not (color: oklch(0 0 0)) {\n\n :root {\n color-scheme: light;\n --fallback-p: #491eff;\n --fallback-pc: #d4dbff;\n --fallback-s: #ff41c7;\n --fallback-sc: #fff9fc;\n --fallback-a: #00cfbd;\n --fallback-ac: #00100d;\n --fallback-n: #2b3440;\n --fallback-nc: #d7dde4;\n --fallback-b1: #ffffff;\n --fallback-b2: #e5e6e6;\n --fallback-b3: #e5e6e6;\n --fallback-bc: #1f2937;\n --fallback-in: #00b3f0;\n --fallback-inc: #000000;\n --fallback-su: #00ca92;\n --fallback-suc: #000000;\n --fallback-wa: #ffc22d;\n --fallback-wac: #000000;\n --fallback-er: #ff6f70;\n --fallback-erc: #000000;\n }\n\n @media (prefers-color-scheme: dark) {\n\n :root {\n color-scheme: dark;\n --fallback-p: #7582ff;\n --fallback-pc: #050617;\n --fallback-s: #ff71cf;\n --fallback-sc: #190211;\n --fallback-a: #00c7b5;\n --fallback-ac: #000e0c;\n --fallback-n: #2a323c;\n --fallback-nc: #a6adbb;\n --fallback-b1: #1d232a;\n --fallback-b2: #191e24;\n --fallback-b3: #15191e;\n --fallback-bc: #a6adbb;\n --fallback-in: #00b3f0;\n --fallback-inc: #000000;\n --fallback-su: #00ca92;\n --fallback-suc: #000000;\n --fallback-wa: #ffc22d;\n --fallback-wac: #000000;\n --fallback-er: #ff6f70;\n --fallback-erc: #000000;\n }\n }\n}\n\nhtml {\n -webkit-tap-highlight-color: transparent;\n}\n\n:root {\n color-scheme: light;\n --in: 0.7206 0.191 231.6;\n --su: 64.8% 0.150 160;\n --wa: 0.8471 0.199 83.87;\n --er: 0.7176 0.221 22.18;\n --pc: 0.89824 0.06192 275.75;\n --ac: 0.15352 0.0368 183.61;\n --inc: 0 0 0;\n --suc: 0 0 0;\n --wac: 0 0 0;\n --erc: 0 0 0;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 0.4912 0.3096 275.75;\n --s: 0.6971 0.329 342.55;\n --sc: 0.9871 0.0106 342.55;\n --a: 0.7676 0.184 183.61;\n --n: 0.321785 0.02476 255.701624;\n --nc: 0.894994 0.011585 252.096176;\n --b1: 1 0 0;\n --b2: 0.961151 0 0;\n --b3: 0.924169 0.00108 197.137559;\n --bc: 0.278078 0.029596 256.847952;\n}\n\n@media (prefers-color-scheme: dark) {\n\n :root {\n color-scheme: dark;\n --in: 0.7206 0.191 231.6;\n --su: 64.8% 0.150 160;\n --wa: 0.8471 0.199 83.87;\n --er: 0.7176 0.221 22.18;\n --pc: 0.13138 0.0392 275.75;\n --sc: 0.1496 0.052 342.55;\n --ac: 0.14902 0.0334 183.61;\n --inc: 0 0 0;\n --suc: 0 0 0;\n --wac: 0 0 0;\n --erc: 0 0 0;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 0.6569 0.196 275.75;\n --s: 0.748 0.26 342.55;\n --a: 0.7451 0.167 183.61;\n --n: 0.313815 0.021108 254.139175;\n --nc: 0.746477 0.0216 264.435964;\n --b1: 0.253267 0.015896 252.417568;\n --b2: 0.232607 0.013807 253.100675;\n --b3: 0.211484 0.01165 254.087939;\n --bc: 0.746477 0.0216 264.435964;\n }\n}\n\n[data-theme=light] {\n color-scheme: light;\n --in: 0.7206 0.191 231.6;\n --su: 64.8% 0.150 160;\n --wa: 0.8471 0.199 83.87;\n --er: 0.7176 0.221 22.18;\n --pc: 0.89824 0.06192 275.75;\n --ac: 0.15352 0.0368 183.61;\n --inc: 0 0 0;\n --suc: 0 0 0;\n --wac: 0 0 0;\n --erc: 0 0 0;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 0.4912 0.3096 275.75;\n --s: 0.6971 0.329 342.55;\n --sc: 0.9871 0.0106 342.55;\n --a: 0.7676 0.184 183.61;\n --n: 0.321785 0.02476 255.701624;\n --nc: 0.894994 0.011585 252.096176;\n --b1: 1 0 0;\n --b2: 0.961151 0 0;\n --b3: 0.924169 0.00108 197.137559;\n --bc: 0.278078 0.029596 256.847952;\n}\n\n[data-theme=dark] {\n color-scheme: dark;\n --in: 0.7206 0.191 231.6;\n --su: 64.8% 0.150 160;\n --wa: 0.8471 0.199 83.87;\n --er: 0.7176 0.221 22.18;\n --pc: 0.13138 0.0392 275.75;\n --sc: 0.1496 0.052 342.55;\n --ac: 0.14902 0.0334 183.61;\n --inc: 0 0 0;\n --suc: 0 0 0;\n --wac: 0 0 0;\n --erc: 0 0 0;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 0.6569 0.196 275.75;\n --s: 0.748 0.26 342.55;\n --a: 0.7451 0.167 183.61;\n --n: 0.313815 0.021108 254.139175;\n --nc: 0.746477 0.0216 264.435964;\n --b1: 0.253267 0.015896 252.417568;\n --b2: 0.232607 0.013807 253.100675;\n --b3: 0.211484 0.01165 254.087939;\n --bc: 0.746477 0.0216 264.435964;\n}\n\n[data-theme=cupcake] {\n color-scheme: light;\n --in: 0.7206 0.191 231.6;\n --su: 64.8% 0.150 160;\n --wa: 0.8471 0.199 83.87;\n --er: 0.7176 0.221 22.18;\n --pc: 0.152344 0.017892 200.026556;\n --sc: 0.15787 0.020249 356.29965;\n --ac: 0.158762 0.029206 78.618794;\n --nc: 0.847148 0.013247 313.189598;\n --inc: 0 0 0;\n --suc: 0 0 0;\n --wac: 0 0 0;\n --erc: 0 0 0;\n --rounded-box: 1rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --p: 0.76172 0.089459 200.026556;\n --s: 0.789351 0.101246 356.29965;\n --a: 0.793811 0.146032 78.618794;\n --n: 0.235742 0.066235 313.189598;\n --b1: 0.977882 0.00418 56.375637;\n --b2: 0.939822 0.007638 61.449292;\n --b3: 0.915861 0.006811 53.440502;\n --bc: 0.235742 0.066235 313.189598;\n --rounded-btn: 1.9rem;\n --tab-border: 2px;\n --tab-radius: 0.7rem;\n}\n\n[data-theme=retro] {\n color-scheme: light;\n --inc: 0.90923 0.043042 262.880917;\n --suc: 0.12541 0.033982 149.213788;\n --wac: 0.133168 0.031484 58.31834;\n --erc: 0.13144 0.0398 27.33;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --p: 0.768664 0.104092 22.664655;\n --pc: 0.265104 0.006243 0.522862;\n --s: 0.807415 0.052534 159.094608;\n --sc: 0.265104 0.006243 0.522862;\n --a: 0.703919 0.125455 52.953428;\n --ac: 0.265104 0.006243 0.522862;\n --n: 0.284181 0.009519 355.534017;\n --nc: 0.925604 0.025113 89.217311;\n --b1: 0.916374 0.034554 90.51575;\n --b2: 0.882722 0.049418 91.774344;\n --b3: 0.84133 0.065952 90.856665;\n --bc: 0.265104 0.006243 0.522862;\n --in: 0.54615 0.215208 262.880917;\n --su: 0.627052 0.169912 149.213788;\n --wa: 0.66584 0.157422 58.31834;\n --er: 0.6572 0.199 27.33;\n --rounded-box: 0.4rem;\n --rounded-btn: 0.4rem;\n --rounded-badge: 0.4rem;\n --tab-radius: 0.4rem;\n}\n\n[data-theme=cyberpunk] {\n color-scheme: light;\n --b2: 0.878943 0.16647 104.32;\n --b3: 0.812786 0.15394 104.32;\n --in: 0.7206 0.191 231.6;\n --su: 64.8% 0.150 160;\n --wa: 0.8471 0.199 83.87;\n --er: 0.7176 0.221 22.18;\n --bc: 0.18902 0.0358 104.32;\n --pc: 0.14844 0.0418 6.35;\n --sc: 0.16666 0.0368 204.72;\n --ac: 0.14372 0.04352 310.43;\n --inc: 0 0 0;\n --suc: 0 0 0;\n --wac: 0 0 0;\n --erc: 0 0 0;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n font-family: ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;\n --p: 0.7422 0.209 6.35;\n --s: 0.8333 0.184 204.72;\n --a: 0.7186 0.2176 310.43;\n --n: 0.2304 0.065 269.31;\n --nc: 0.9451 0.179 104.32;\n --b1: 0.9451 0.179 104.32;\n --rounded-box: 0;\n --rounded-btn: 0;\n --rounded-badge: 0;\n --tab-radius: 0;\n}\n\n[data-theme=aqua] {\n color-scheme: dark;\n --b2: 0.453464 0.118611 261.181672;\n --b3: 0.419333 0.109683 261.181672;\n --bc: 0.897519 0.025508 261.181672;\n --sc: 0.121365 0.02175 309.782946;\n --ac: 0.186854 0.020445 94.555431;\n --nc: 0.122124 0.023402 243.760661;\n --inc: 0.90923 0.043042 262.880917;\n --suc: 0.12541 0.033982 149.213788;\n --wac: 0.133168 0.031484 58.31834;\n --erc: 0.1479 0.038 27.33;\n --rounded-box: 1rem;\n --rounded-btn: 0.5rem;\n --rounded-badge: 1.9rem;\n --animation-btn: 0.25s;\n --animation-input: .2s;\n --btn-focus-scale: 0.95;\n --border-btn: 1px;\n --tab-border: 1px;\n --tab-radius: 0.5rem;\n --p: 0.856617 0.14498 198.6458;\n --pc: 0.401249 0.068266 197.603872;\n --s: 0.606827 0.108752 309.782946;\n --a: 0.934269 0.102225 94.555431;\n --n: 0.610622 0.117009 243.760661;\n --b1: 0.487596 0.127539 261.181672;\n --in: 0.54615 0.215208 262.880917;\n --su: 0.627052 0.169912 149.213788;\n --wa: 0.66584 0.157422 58.31834;\n --er: 0.7395 0.19 27.33;\n}\n\ninput[type=\"range\"]::-webkit-slider-thumb {\n height: 1rem;\n width: 1rem;\n border-radius: 9999px;\n border: 0;\n appearance: none;\n -moz-appearance: none;\n -webkit-appearance: none;\n cursor: pointer;\n}\n\ninput[type=\"range\"]:disabled::-webkit-slider-thumb {}\n\ninput[type=\"range\"]:disabled:focus::-webkit-slider-thumb {}\n\ninput[type=\"range\"]:disabled:active::-webkit-slider-thumb {}\n\ninput[type=\"range\"]::-moz-range-thumb {\n height: 1rem;\n width: 1rem;\n border-radius: 9999px;\n border: 0;\n appearance: none;\n -moz-appearance: none;\n -webkit-appearance: none;\n cursor: pointer;\n}\n\ninput[type=\"range\"]:disabled::-moz-range-thumb {}\n\ninput[type=\"range\"]::-moz-range-progress {}\n\ninput[type=\"range\"]::-ms-fill-lower {}\n\ninput[type=\"range\"]:focus {\n outline: none;\n}\n\ninput[type=\"range\"]:focus::-webkit-slider-thumb {}\n\ninput[type=\"range\"]:active::-webkit-slider-thumb {}\n\n*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n.tw-alert {\n display: grid;\n width: 100%;\n grid-auto-flow: row;\n align-content: flex-start;\n align-items: center;\n justify-items: center;\n gap: 1rem;\n text-align: center;\n border-radius: var(--rounded-box, 1rem);\n border-width: 1px;\n --tw-border-opacity: 1;\n border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));\n padding: 1rem;\n --tw-text-opacity: 1;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --alert-bg: var(--fallback-b2,oklch(var(--b2)/1));\n --alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1));\n background-color: var(--alert-bg);\n}\n@media (min-width: 640px) {\n\n .tw-alert {\n grid-auto-flow: column;\n grid-template-columns: auto minmax(auto,1fr);\n justify-items: start;\n text-align: start;\n }\n}\n.tw-avatar {\n position: relative;\n display: inline-flex;\n}\n.tw-avatar > div {\n display: block;\n aspect-ratio: 1 / 1;\n overflow: hidden;\n}\n.tw-avatar img {\n height: 100%;\n width: 100%;\n -o-object-fit: cover;\n object-fit: cover;\n}\n.tw-avatar.tw-placeholder > div {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.tw-breadcrumbs {\n max-width: 100%;\n overflow-x: auto;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.tw-breadcrumbs > ul,\n .tw-breadcrumbs > ol {\n display: flex;\n align-items: center;\n white-space: nowrap;\n min-height: -moz-min-content;\n min-height: min-content;\n}\n.tw-breadcrumbs > ul > li, .tw-breadcrumbs > ol > li {\n display: flex;\n align-items: center;\n}\n.tw-breadcrumbs > ul > li > a, .tw-breadcrumbs > ol > li > a {\n display: flex;\n cursor: pointer;\n align-items: center;\n}\n@media (hover:hover) {\n\n .tw-breadcrumbs > ul > li > a:hover, .tw-breadcrumbs > ol > li > a:hover {\n text-decoration-line: underline;\n }\n\n .tw-checkbox-success:hover {\n --tw-border-opacity: 1;\n border-color: var(--fallback-su,oklch(var(--su)/var(--tw-border-opacity)));\n }\n\n .tw-label a:hover {\n --tw-text-opacity: 1;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n }\n\n .tw-menu li > *:not(ul):not(.tw-menu-title):not(details):active,\n.tw-menu li > *:not(ul):not(.tw-menu-title):not(details).tw-active,\n.tw-menu li > details > summary:active {\n --tw-bg-opacity: 1;\n background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n --tw-text-opacity: 1;\n color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));\n }\n}\n.tw-btn {\n display: inline-flex;\n height: 3rem;\n min-height: 3rem;\n flex-shrink: 0;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n border-radius: var(--rounded-btn, 0.5rem);\n border-color: transparent;\n border-color: oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity));\n padding-left: 1rem;\n padding-right: 1rem;\n text-align: center;\n font-size: 0.875rem;\n line-height: 1em;\n gap: 0.5rem;\n font-weight: 600;\n text-decoration-line: none;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n border-width: var(--border-btn, 1px);\n animation: button-pop var(--animation-btn, 0.25s) ease-out;\n transition-property: color, background-color, border-color, opacity, box-shadow, transform;\n --tw-text-opacity: 1;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n outline-color: var(--fallback-bc,oklch(var(--bc)/1));\n background-color: oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity));\n --tw-bg-opacity: 1;\n --tw-border-opacity: 1;\n}\n.tw-btn-disabled,\n .tw-btn[disabled],\n .tw-btn:disabled {\n pointer-events: none;\n}\n.tw-btn-square {\n height: 3rem;\n width: 3rem;\n padding: 0px;\n}\n.tw-btn-circle {\n height: 3rem;\n width: 3rem;\n border-radius: 9999px;\n padding: 0px;\n}\n:where(.tw-btn:is(input[type=\"checkbox\"])),\n:where(.tw-btn:is(input[type=\"radio\"])) {\n width: auto;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.tw-btn:is(input[type=\"checkbox\"]):after,\n.tw-btn:is(input[type=\"radio\"]):after {\n --tw-content: attr(aria-label);\n content: var(--tw-content);\n}\n.tw-card {\n position: relative;\n display: flex;\n flex-direction: column;\n border-radius: var(--rounded-box, 1rem);\n}\n.tw-card:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-card-body {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n padding: var(--padding-card, 2rem);\n gap: 0.5rem;\n}\n.tw-card-body :where(p) {\n flex-grow: 1;\n}\n.tw-card-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: 0.5rem;\n}\n.tw-card figure {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.tw-card.tw-image-full {\n display: grid;\n}\n.tw-card.tw-image-full:before {\n position: relative;\n content: \"\";\n z-index: 10;\n border-radius: var(--rounded-box, 1rem);\n --tw-bg-opacity: 1;\n background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n opacity: 0.75;\n}\n.tw-card.tw-image-full:before,\n .tw-card.tw-image-full > * {\n grid-column-start: 1;\n grid-row-start: 1;\n}\n.tw-card.tw-image-full > figure img {\n height: 100%;\n -o-object-fit: cover;\n object-fit: cover;\n}\n.tw-card.tw-image-full > .tw-card-body {\n position: relative;\n z-index: 20;\n --tw-text-opacity: 1;\n color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));\n}\n.tw-checkbox {\n flex-shrink: 0;\n --chkbg: var(--fallback-bc,oklch(var(--bc)/1));\n --chkfg: var(--fallback-b1,oklch(var(--b1)/1));\n height: 1.5rem;\n width: 1.5rem;\n cursor: pointer;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n border-radius: var(--rounded-btn, 0.5rem);\n border-width: 1px;\n border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));\n --tw-border-opacity: 0.2;\n}\n.tw-divider {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n margin-top: 1rem;\n margin-bottom: 1rem;\n height: 1rem;\n white-space: nowrap;\n}\n.tw-divider:before,\n .tw-divider:after {\n height: 0.125rem;\n width: 100%;\n flex-grow: 1;\n --tw-content: '';\n content: var(--tw-content);\n background-color: var(--fallback-bc,oklch(var(--bc)/0.1));\n}\n.tw-dropdown {\n position: relative;\n display: inline-block;\n}\n.tw-dropdown > *:not(summary):focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-dropdown .tw-dropdown-content {\n position: absolute;\n}\n.tw-dropdown:is(:not(details)) .tw-dropdown-content {\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n visibility: hidden;\n opacity: 0;\n transform-origin: top;\n --tw-scale-x: .95;\n --tw-scale-y: .95;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n transition-duration: 200ms;\n}\n.tw-dropdown-end .tw-dropdown-content {\n inset-inline-end: 0px;\n}\n.tw-dropdown-left .tw-dropdown-content {\n bottom: auto;\n inset-inline-end: 100%;\n top: 0px;\n transform-origin: right;\n}\n.tw-dropdown-right .tw-dropdown-content {\n bottom: auto;\n inset-inline-start: 100%;\n top: 0px;\n transform-origin: left;\n}\n.tw-dropdown-bottom .tw-dropdown-content {\n bottom: auto;\n top: 100%;\n transform-origin: top;\n}\n.tw-dropdown-top .tw-dropdown-content {\n bottom: 100%;\n top: auto;\n transform-origin: bottom;\n}\n.tw-dropdown-end.tw-dropdown-right .tw-dropdown-content {\n bottom: 0px;\n top: auto;\n}\n.tw-dropdown-end.tw-dropdown-left .tw-dropdown-content {\n bottom: 0px;\n top: auto;\n}\n.tw-dropdown.tw-dropdown-open .tw-dropdown-content,\n.tw-dropdown:not(.tw-dropdown-hover):focus .tw-dropdown-content,\n.tw-dropdown:focus-within .tw-dropdown-content {\n visibility: visible;\n opacity: 1;\n}\n@media (hover: hover) {\n\n .tw-dropdown.tw-dropdown-hover:hover .tw-dropdown-content {\n visibility: visible;\n opacity: 1;\n }\n\n .tw-btn:hover {\n --tw-border-opacity: 1;\n border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn:hover {\n background-color: color-mix(\n in oklab,\n oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,\n black\n );\n border-color: color-mix(\n in oklab,\n oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,\n black\n );\n }\n }\n\n @supports not (color: oklch(0 0 0)) {\n\n .tw-btn:hover {\n background-color: var(--btn-color, var(--fallback-b2));\n border-color: var(--btn-color, var(--fallback-b2));\n }\n }\n\n .tw-btn:hover {\n --tw-border-opacity: 1;\n border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn:hover {\n background-color: color-mix(\n in oklab,\n oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,\n black\n );\n border-color: color-mix(\n in oklab,\n oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,\n black\n );\n }\n }\n\n @supports not (color: oklch(0 0 0)) {\n\n .tw-btn:hover {\n background-color: var(--btn-color, var(--fallback-b2));\n border-color: var(--btn-color, var(--fallback-b2));\n }\n }\n\n .tw-btn:hover {\n --tw-border-opacity: 1;\n border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn:hover {\n background-color: color-mix(\n in oklab,\n oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,\n black\n );\n border-color: color-mix(\n in oklab,\n oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,\n black\n );\n }\n }\n\n @supports not (color: oklch(0 0 0)) {\n\n .tw-btn:hover {\n background-color: var(--btn-color, var(--fallback-b2));\n border-color: var(--btn-color, var(--fallback-b2));\n }\n }\n\n .tw-btn.tw-glass:hover {\n --glass-opacity: 25%;\n --glass-border-opacity: 15%;\n }\n\n .tw-btn-ghost:hover {\n border-color: transparent;\n }\n\n @supports (color: oklch(0 0 0)) {\n\n .tw-btn-ghost:hover {\n background-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n }\n }\n\n .tw-btn-ghost:hover {\n border-color: transparent;\n }\n\n @supports (color: oklch(0 0 0)) {\n\n .tw-btn-ghost:hover {\n background-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n }\n }\n\n .tw-btn-outline.tw-btn-primary:hover {\n --tw-text-opacity: 1;\n color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn-outline.tw-btn-primary:hover {\n background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n }\n }\n\n .tw-btn-outline.tw-btn-primary:hover {\n --tw-text-opacity: 1;\n color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn-outline.tw-btn-primary:hover {\n background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n }\n }\n\n .tw-btn-disabled:hover,\n .tw-btn[disabled]:hover,\n .tw-btn:disabled:hover {\n --tw-border-opacity: 0;\n background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n --tw-bg-opacity: 0.2;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --tw-text-opacity: 0.2;\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn:is(input[type=\"checkbox\"]:checked):hover, .tw-btn:is(input[type=\"radio\"]:checked):hover {\n background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n }\n }\n\n .tw-dropdown.tw-dropdown-hover:hover .tw-dropdown-content {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n }\n\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(.tw-active):hover, :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(.tw-active):hover {\n cursor: pointer;\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n\n @supports (color: oklch(0 0 0)) {\n\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(.tw-active):hover, :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(.tw-active):hover {\n background-color: var(--fallback-bc,oklch(var(--bc)/0.1));\n }\n }\n\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(.tw-active):hover, :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(.tw-active):hover {\n cursor: pointer;\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n\n @supports (color: oklch(0 0 0)) {\n\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(.tw-active):hover, :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(.tw-active):hover {\n background-color: var(--fallback-bc,oklch(var(--bc)/0.1));\n }\n }\n\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(.tw-active):hover, :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(.tw-active):hover {\n cursor: pointer;\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n\n @supports (color: oklch(0 0 0)) {\n\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(.tw-active):hover, :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(.tw-active):hover {\n background-color: var(--fallback-bc,oklch(var(--bc)/0.1));\n }\n }\n\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(.tw-active):hover, :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(.tw-active):hover {\n cursor: pointer;\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n\n @supports (color: oklch(0 0 0)) {\n\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(.tw-active):hover, :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(.tw-active):hover {\n background-color: var(--fallback-bc,oklch(var(--bc)/0.1));\n }\n }\n}\n.tw-dropdown:is(details) summary::-webkit-details-marker {\n display: none;\n}\n.tw-file-input {\n height: 3rem;\n flex-shrink: 1;\n padding-inline-end: 1rem;\n font-size: 1rem;\n line-height: 2;\n line-height: 1.5rem;\n overflow: hidden;\n border-radius: var(--rounded-btn, 0.5rem);\n border-width: 1px;\n border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));\n --tw-border-opacity: 0;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));\n}\n.tw-file-input::file-selector-button {\n margin-inline-end: 1rem;\n display: inline-flex;\n height: 100%;\n flex-shrink: 0;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n padding-left: 1rem;\n padding-right: 1rem;\n text-align: center;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 1em;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n transition-duration: 200ms;\n border-style: solid;\n --tw-border-opacity: 1;\n border-color: var(--fallback-n,oklch(var(--n)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n font-weight: 600;\n text-transform: uppercase;\n --tw-text-opacity: 1;\n color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));\n text-decoration-line: none;\n border-width: var(--border-btn, 1px);\n animation: button-pop var(--animation-btn, 0.25s) ease-out;\n}\n.tw-form-control {\n display: flex;\n flex-direction: column;\n}\n.tw-label {\n display: flex;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n align-items: center;\n justify-content: space-between;\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.tw-input {\n flex-shrink: 1;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n height: 3rem;\n padding-left: 1rem;\n padding-right: 1rem;\n font-size: 1rem;\n line-height: 2;\n line-height: 1.5rem;\n border-radius: var(--rounded-btn, 0.5rem);\n border-width: 1px;\n border-color: transparent;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));\n}\n.tw-join .tw-dropdown .tw-join-item:first-child:not(:last-child),\n .tw-join *:first-child:not(:last-child) .tw-dropdown .tw-join-item {\n border-start-end-radius: inherit;\n border-end-end-radius: inherit;\n}\n.tw-menu {\n display: flex;\n flex-direction: column;\n flex-wrap: wrap;\n font-size: 0.875rem;\n line-height: 1.25rem;\n padding: 0.5rem;\n}\n.tw-menu :where(li ul) {\n position: relative;\n white-space: nowrap;\n margin-inline-start: 1rem;\n padding-inline-start: 0.5rem;\n}\n.tw-menu :where(li:not(.tw-menu-title) > *:not(ul):not(details):not(.tw-menu-title)),\n .tw-menu :where(li:not(.tw-menu-title) > details > summary:not(.tw-menu-title)) {\n display: grid;\n grid-auto-flow: column;\n align-content: flex-start;\n align-items: center;\n gap: 0.5rem;\n grid-auto-columns: minmax(auto, max-content) auto max-content;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.tw-menu li.tw-disabled {\n cursor: not-allowed;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n color: var(--fallback-bc,oklch(var(--bc)/0.3));\n}\n.tw-menu :where(li > .tw-menu-dropdown:not(.tw-menu-dropdown-show)) {\n display: none;\n}\n:where(.tw-menu li) {\n position: relative;\n display: flex;\n flex-shrink: 0;\n flex-direction: column;\n flex-wrap: wrap;\n align-items: stretch;\n}\n:where(.tw-menu li) .tw-badge {\n justify-self: end;\n}\n.tw-modal {\n pointer-events: none;\n position: fixed;\n inset: 0px;\n margin: 0px;\n display: grid;\n height: 100%;\n max-height: none;\n width: 100%;\n max-width: none;\n justify-items: center;\n padding: 0px;\n opacity: 0;\n overscroll-behavior: contain;\n z-index: 999;\n background-color: transparent;\n color: inherit;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n transition-property: transform, opacity, visibility;\n overflow-y: hidden;\n}\n:where(.tw-modal) {\n align-items: center;\n}\n.tw-modal-box {\n max-height: calc(100vh - 5em);\n grid-column-start: 1;\n grid-row-start: 1;\n width: 91.666667%;\n max-width: 32rem;\n --tw-scale-x: .9;\n --tw-scale-y: .9;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-bottom-right-radius: var(--rounded-box, 1rem);\n border-bottom-left-radius: var(--rounded-box, 1rem);\n border-top-left-radius: var(--rounded-box, 1rem);\n border-top-right-radius: var(--rounded-box, 1rem);\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));\n padding: 1.5rem;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n transition-duration: 200ms;\n box-shadow: rgba(0, 0, 0, 0.25) 0px 25px 50px -12px;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n.tw-modal-open,\n.tw-modal:target,\n.tw-modal-toggle:checked + .tw-modal,\n.tw-modal[open] {\n pointer-events: auto;\n visibility: visible;\n opacity: 1;\n}\n:root:has(:is(.tw-modal-open, .tw-modal:target, .tw-modal-toggle:checked + .tw-modal, .tw-modal[open])) {\n overflow: hidden;\n}\n.tw-navbar {\n display: flex;\n align-items: center;\n padding: var(--navbar-padding, 0.5rem);\n min-height: 4rem;\n width: 100%;\n}\n:where(.tw-navbar > *) {\n display: inline-flex;\n align-items: center;\n}\n.tw-select {\n display: inline-flex;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n height: 3rem;\n min-height: 3rem;\n padding-left: 1rem;\n padding-right: 2.5rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 2;\n border-radius: var(--rounded-btn, 0.5rem);\n border-width: 1px;\n border-color: transparent;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));\n background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),\n linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position: calc(100% - 20px) calc(1px + 50%),\n calc(100% - 16.1px) calc(1px + 50%);\n background-size: 4px 4px,\n 4px 4px;\n background-repeat: no-repeat;\n}\n.tw-select[multiple] {\n height: auto;\n}\n.tw-textarea {\n min-height: 3rem;\n flex-shrink: 1;\n padding-left: 1rem;\n padding-right: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 2;\n border-radius: var(--rounded-btn, 0.5rem);\n border-width: 1px;\n border-color: transparent;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));\n}\n.tw-avatar-group :where(.tw-avatar) {\n overflow: hidden;\n border-radius: 9999px;\n border-width: 4px;\n --tw-border-opacity: 1;\n border-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-border-opacity)));\n}\n.tw-btm-nav > * .tw-label {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.tw-breadcrumbs > ul > li > a:focus, .tw-breadcrumbs > ol > li > a:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-breadcrumbs > ul > li > a:focus-visible, .tw-breadcrumbs > ol > li > a:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n.tw-breadcrumbs > ul > li + *:before, .tw-breadcrumbs > ol > li + *:before {\n content: \"\";\n margin-left: 0.5rem;\n margin-right: 0.75rem;\n display: block;\n height: 0.375rem;\n width: 0.375rem;\n --tw-rotate: 45deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n opacity: 0.4;\n border-top: 1px solid;\n border-right: 1px solid;\n background-color: transparent;\n}\n[dir=\"rtl\"] .tw-breadcrumbs > ul > li + *:before,\n[dir=\"rtl\"] .tw-breadcrumbs > ol > li + *:before {\n --tw-rotate: -135deg;\n}\n.tw-btn:active:hover,\n .tw-btn:active:focus {\n animation: button-pop 0s ease-out;\n transform: scale(var(--btn-focus-scale, 0.97));\n}\n@supports not (color: oklch(0 0 0)) {\n\n .tw-btn {\n background-color: var(--btn-color, var(--fallback-b2));\n border-color: var(--btn-color, var(--fallback-b2));\n }\n\n .tw-btn-primary {\n --btn-color: var(--fallback-p);\n }\n\n .tw-btn-neutral {\n --btn-color: var(--fallback-n);\n }\n}\n@supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn-outline.tw-btn-primary.tw-btn-active {\n background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);\n }\n}\n.tw-btn:focus-visible {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n}\n.tw-btn-primary {\n --tw-text-opacity: 1;\n color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));\n outline-color: var(--fallback-p,oklch(var(--p)/1));\n}\n@supports (color: oklch(0 0 0)) {\n\n .tw-btn-primary {\n --btn-color: var(--p);\n }\n\n .tw-btn-neutral {\n --btn-color: var(--n);\n }\n}\n.tw-btn-neutral {\n --tw-text-opacity: 1;\n color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));\n outline-color: var(--fallback-n,oklch(var(--n)/1));\n}\n.tw-btn.tw-glass {\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n outline-color: currentColor;\n}\n.tw-btn.tw-glass.tw-btn-active {\n --glass-opacity: 25%;\n --glass-border-opacity: 15%;\n}\n.tw-btn-ghost {\n border-width: 1px;\n border-color: transparent;\n background-color: transparent;\n color: currentColor;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n outline-color: currentColor;\n}\n.tw-btn-ghost.tw-btn-active {\n border-color: transparent;\n background-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-btn-outline.tw-btn-primary {\n --tw-text-opacity: 1;\n color: var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)));\n}\n.tw-btn-outline.tw-btn-primary.tw-btn-active {\n --tw-text-opacity: 1;\n color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));\n}\n.tw-btn.tw-btn-disabled,\n .tw-btn[disabled],\n .tw-btn:disabled {\n --tw-border-opacity: 0;\n background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n --tw-bg-opacity: 0.2;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --tw-text-opacity: 0.2;\n}\n.tw-btn:is(input[type=\"checkbox\"]:checked),\n.tw-btn:is(input[type=\"radio\"]:checked) {\n --tw-border-opacity: 1;\n border-color: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));\n --tw-text-opacity: 1;\n color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));\n}\n.tw-btn:is(input[type=\"checkbox\"]:checked):focus-visible, .tw-btn:is(input[type=\"radio\"]:checked):focus-visible {\n outline-color: var(--fallback-p,oklch(var(--p)/1));\n}\n@keyframes button-pop {\n\n 0% {\n transform: scale(var(--btn-focus-scale, 0.98));\n }\n\n 40% {\n transform: scale(1.02);\n }\n\n 100% {\n transform: scale(1);\n }\n}\n.tw-card :where(figure:first-child) {\n overflow: hidden;\n border-start-start-radius: inherit;\n border-start-end-radius: inherit;\n border-end-start-radius: unset;\n border-end-end-radius: unset;\n}\n.tw-card :where(figure:last-child) {\n overflow: hidden;\n border-start-start-radius: unset;\n border-start-end-radius: unset;\n border-end-start-radius: inherit;\n border-end-end-radius: inherit;\n}\n.tw-card:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n.tw-card.tw-bordered {\n border-width: 1px;\n --tw-border-opacity: 1;\n border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));\n}\n.tw-card.tw-compact .tw-card-body {\n padding: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.tw-card-title {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 1.25rem;\n line-height: 1.75rem;\n font-weight: 600;\n}\n.tw-card.tw-image-full :where(figure) {\n overflow: hidden;\n border-radius: inherit;\n}\n.tw-checkbox:focus {\n box-shadow: none;\n}\n.tw-checkbox:focus-visible {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: var(--fallback-bc,oklch(var(--bc)/1));\n}\n.tw-checkbox:checked,\n .tw-checkbox[checked=\"true\"],\n .tw-checkbox[aria-checked=\"true\"] {\n background-repeat: no-repeat;\n animation: checkmark var(--animation-input, 0.2s) ease-out;\n background-color: var(--chkbg);\n background-image: linear-gradient(-45deg, transparent 65%, var(--chkbg) 65.99%),\n linear-gradient(45deg, transparent 75%, var(--chkbg) 75.99%),\n linear-gradient(-45deg, var(--chkbg) 40%, transparent 40.99%),\n linear-gradient(\n 45deg,\n var(--chkbg) 30%,\n var(--chkfg) 30.99%,\n var(--chkfg) 40%,\n transparent 40.99%\n ),\n linear-gradient(-45deg, var(--chkfg) 50%, var(--chkbg) 50.99%);\n}\n.tw-checkbox:indeterminate {\n --tw-bg-opacity: 1;\n background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));\n background-repeat: no-repeat;\n animation: checkmark var(--animation-input, 0.2s) ease-out;\n background-image: linear-gradient(90deg, transparent 80%, var(--chkbg) 80%),\n linear-gradient(-90deg, transparent 80%, var(--chkbg) 80%),\n linear-gradient(0deg, var(--chkbg) 43%, var(--chkfg) 43%, var(--chkfg) 57%, var(--chkbg) 57%);\n}\n.tw-checkbox-success {\n --chkbg: var(--fallback-su,oklch(var(--su)/1));\n --chkfg: var(--fallback-suc,oklch(var(--suc)/1));\n --tw-border-opacity: 1;\n border-color: var(--fallback-su,oklch(var(--su)/var(--tw-border-opacity)));\n}\n.tw-checkbox-success:focus-visible {\n outline-color: var(--fallback-su,oklch(var(--su)/1));\n}\n.tw-checkbox-success:checked,\n .tw-checkbox-success[checked=\"true\"],\n .tw-checkbox-success[aria-checked=\"true\"] {\n --tw-border-opacity: 1;\n border-color: var(--fallback-su,oklch(var(--su)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));\n --tw-text-opacity: 1;\n color: var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)));\n}\n.tw-checkbox:disabled {\n cursor: not-allowed;\n border-color: transparent;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));\n opacity: 0.2;\n}\n@keyframes checkmark {\n\n 0% {\n background-position-y: 5px;\n }\n\n 50% {\n background-position-y: -2px;\n }\n\n 100% {\n background-position-y: 0;\n }\n}\n.tw-divider:not(:empty) {\n gap: 1rem;\n}\n.tw-dropdown.tw-dropdown-open .tw-dropdown-content,\n.tw-dropdown:focus .tw-dropdown-content,\n.tw-dropdown:focus-within .tw-dropdown-content {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.tw-file-input:focus {\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-file-input-disabled,\n .tw-file-input[disabled] {\n cursor: not-allowed;\n --tw-border-opacity: 1;\n border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));\n --tw-text-opacity: 0.2;\n}\n.tw-file-input-disabled::-moz-placeholder, .tw-file-input[disabled]::-moz-placeholder {\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-file-input-disabled::placeholder,\n .tw-file-input[disabled]::placeholder {\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-file-input-disabled::file-selector-button, .tw-file-input[disabled]::file-selector-button {\n --tw-border-opacity: 0;\n background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n --tw-bg-opacity: 0.2;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --tw-text-opacity: 0.2;\n}\n.tw-label-text {\n font-size: 0.875rem;\n line-height: 1.25rem;\n --tw-text-opacity: 1;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n}\n.tw-input input:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-input[list]::-webkit-calendar-picker-indicator {\n line-height: 1em;\n}\n.tw-input-bordered {\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-input:focus,\n .tw-input:focus-within {\n box-shadow: none;\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-input-disabled,\n .tw-input:disabled,\n .tw-input[disabled] {\n cursor: not-allowed;\n --tw-border-opacity: 1;\n border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));\n color: var(--fallback-bc,oklch(var(--bc)/0.4));\n}\n.tw-input-disabled::-moz-placeholder, .tw-input:disabled::-moz-placeholder, .tw-input[disabled]::-moz-placeholder {\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-input-disabled::placeholder,\n .tw-input:disabled::placeholder,\n .tw-input[disabled]::placeholder {\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-input::-webkit-date-and-time-value {\n text-align: inherit;\n}\n.tw-loading {\n pointer-events: none;\n display: inline-block;\n aspect-ratio: 1 / 1;\n width: 1.5rem;\n background-color: currentColor;\n -webkit-mask-size: 100%;\n mask-size: 100%;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-position: center;\n mask-position: center;\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.tw-loading-spinner {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E.spinner_V8m1%7Btransform-origin:center;animation:spinner_zKoa 2s linear infinite%7D.spinner_V8m1 circle%7Bstroke-linecap:round;animation:spinner_YpZS 1.5s ease-out infinite%7D%40keyframes spinner_zKoa%7B100%25%7Btransform:rotate(360deg)%7D%7D%40keyframes spinner_YpZS%7B0%25%7Bstroke-dasharray:0 150;stroke-dashoffset:0%7D47.5%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-16%7D95%25%2C100%25%7Bstroke-dasharray:42 150;stroke-dashoffset:-59%7D%7D%3C%2Fstyle%3E%3Cg class='spinner_V8m1'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.tw-loading-sm {\n width: 1.25rem;\n}\n:where(.tw-menu li:empty) {\n --tw-bg-opacity: 1;\n background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));\n opacity: 0.1;\n margin: 0.5rem 1rem;\n height: 1px;\n}\n.tw-menu :where(li ul):before {\n position: absolute;\n bottom: 0.75rem;\n inset-inline-start: 0px;\n top: 0.75rem;\n width: 1px;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));\n opacity: 0.1;\n content: \"\";\n}\n.tw-menu :where(li:not(.tw-menu-title) > *:not(ul):not(details):not(.tw-menu-title)),\n.tw-menu :where(li:not(.tw-menu-title) > details > summary:not(.tw-menu-title)) {\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n border-radius: var(--rounded-btn, 0.5rem);\n padding-left: 1rem;\n padding-right: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n text-align: start;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n transition-duration: 200ms;\n text-wrap: balance;\n}\n:where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(summary):not(.tw-active).tw-focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):not(summary):not(.tw-active):focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > *:not(ul):not(details):not(.tw-menu-title)):is(summary):not(.tw-active):focus-visible,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(summary):not(.tw-active).tw-focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):not(summary):not(.tw-active):focus,\n :where(.tw-menu li:not(.tw-menu-title):not(.tw-disabled) > details > summary:not(.tw-menu-title)):is(summary):not(.tw-active):focus-visible {\n cursor: pointer;\n background-color: var(--fallback-bc,oklch(var(--bc)/0.1));\n --tw-text-opacity: 1;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-menu li > *:not(ul):not(.tw-menu-title):not(details):active,\n.tw-menu li > *:not(ul):not(.tw-menu-title):not(details).tw-active,\n.tw-menu li > details > summary:active {\n --tw-bg-opacity: 1;\n background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));\n --tw-text-opacity: 1;\n color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));\n}\n.tw-menu :where(li > details > summary)::-webkit-details-marker {\n display: none;\n}\n.tw-menu :where(li > details > summary):after,\n.tw-menu :where(li > .tw-menu-dropdown-toggle):after {\n justify-self: end;\n display: block;\n margin-top: -0.5rem;\n height: 0.5rem;\n width: 0.5rem;\n transform: rotate(45deg);\n transition-property: transform, margin-top;\n transition-duration: 0.3s;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n content: \"\";\n transform-origin: 75% 75%;\n box-shadow: 2px 2px;\n pointer-events: none;\n}\n.tw-menu :where(li > details[open] > summary):after,\n.tw-menu :where(li > .tw-menu-dropdown-toggle.tw-menu-dropdown-show):after {\n transform: rotate(225deg);\n margin-top: 0;\n}\n.tw-mockup-browser .tw-mockup-browser-toolbar .tw-input {\n position: relative;\n margin-left: auto;\n margin-right: auto;\n display: block;\n height: 1.75rem;\n width: 24rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));\n padding-left: 2rem;\n direction: ltr;\n}\n.tw-mockup-browser .tw-mockup-browser-toolbar .tw-input:before {\n content: \"\";\n position: absolute;\n left: 0.5rem;\n top: 50%;\n aspect-ratio: 1 / 1;\n height: 0.75rem;\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-radius: 9999px;\n border-width: 2px;\n border-color: currentColor;\n opacity: 0.6;\n}\n.tw-mockup-browser .tw-mockup-browser-toolbar .tw-input:after {\n content: \"\";\n position: absolute;\n left: 1.25rem;\n top: 50%;\n height: 0.5rem;\n --tw-translate-y: 25%;\n --tw-rotate: -45deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-radius: 9999px;\n border-width: 1px;\n border-color: currentColor;\n opacity: 0.6;\n}\n.tw-modal:not(dialog:not(.tw-modal-open)),\n .tw-modal::backdrop {\n background-color: #0006;\n animation: modal-pop 0.2s ease-out;\n}\n.tw-modal-backdrop {\n z-index: -1;\n grid-column-start: 1;\n grid-row-start: 1;\n display: grid;\n align-self: stretch;\n justify-self: stretch;\n color: transparent;\n}\n.tw-modal-open .tw-modal-box,\n.tw-modal-toggle:checked + .tw-modal .tw-modal-box,\n.tw-modal:target .tw-modal-box,\n.tw-modal[open] .tw-modal-box {\n --tw-translate-y: 0px;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes modal-pop {\n\n 0% {\n opacity: 0;\n }\n}\n@keyframes progress-loading {\n\n 50% {\n background-position-x: -115%;\n }\n}\n@keyframes radiomark {\n\n 0% {\n box-shadow: 0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,\n 0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset;\n }\n\n 50% {\n box-shadow: 0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,\n 0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset;\n }\n\n 100% {\n box-shadow: 0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,\n 0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset;\n }\n}\n@keyframes rating-pop {\n\n 0% {\n transform: translateY(-0.125em);\n }\n\n 40% {\n transform: translateY(-0.125em);\n }\n\n 100% {\n transform: translateY(0);\n }\n}\n.tw-select-bordered {\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-select:focus {\n box-shadow: none;\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-select-disabled,\n .tw-select:disabled,\n .tw-select[disabled] {\n cursor: not-allowed;\n --tw-border-opacity: 1;\n border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));\n --tw-text-opacity: 0.2;\n}\n.tw-select-disabled::-moz-placeholder, .tw-select:disabled::-moz-placeholder, .tw-select[disabled]::-moz-placeholder {\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-select-disabled::placeholder,\n .tw-select:disabled::placeholder,\n .tw-select[disabled]::placeholder {\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-select-multiple,\n .tw-select[multiple],\n .tw-select[size].tw-select:not([size=\"1\"]) {\n background-image: none;\n padding-right: 1rem;\n}\n[dir=\"rtl\"] .tw-select {\n background-position: calc(0% + 12px) calc(1px + 50%),\n calc(0% + 16px) calc(1px + 50%);\n}\n@keyframes skeleton {\n\n from {\n background-position: 150%;\n }\n\n to {\n background-position: -50%;\n }\n}\n.tw-textarea-bordered {\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-textarea:focus {\n box-shadow: none;\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n outline-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-textarea-disabled,\n .tw-textarea:disabled,\n .tw-textarea[disabled] {\n cursor: not-allowed;\n --tw-border-opacity: 1;\n border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));\n --tw-text-opacity: 0.2;\n}\n.tw-textarea-disabled::-moz-placeholder, .tw-textarea:disabled::-moz-placeholder, .tw-textarea[disabled]::-moz-placeholder {\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));\n --tw-placeholder-opacity: 0.2;\n}\n.tw-textarea-disabled::placeholder,\n .tw-textarea:disabled::placeholder,\n .tw-textarea[disabled]::placeholder {\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));\n --tw-placeholder-opacity: 0.2;\n}\n@keyframes toast-pop {\n\n 0% {\n transform: scale(0.9);\n opacity: 0;\n }\n\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n.tw-btn-xs {\n height: 1.5rem;\n min-height: 1.5rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-size: 0.75rem;\n}\n.tw-btn-sm {\n height: 2rem;\n min-height: 2rem;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n font-size: 0.875rem;\n}\n.tw-btn-lg {\n height: 4rem;\n min-height: 4rem;\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n font-size: 1.125rem;\n}\n.tw-btn-block {\n width: 100%;\n}\n.tw-btn-square:where(.tw-btn-xs) {\n height: 1.5rem;\n width: 1.5rem;\n padding: 0px;\n}\n.tw-btn-square:where(.tw-btn-sm) {\n height: 2rem;\n width: 2rem;\n padding: 0px;\n}\n.tw-btn-square:where(.tw-btn-md) {\n height: 3rem;\n width: 3rem;\n padding: 0px;\n}\n.tw-btn-square:where(.tw-btn-lg) {\n height: 4rem;\n width: 4rem;\n padding: 0px;\n}\n.tw-btn-circle:where(.tw-btn-xs) {\n height: 1.5rem;\n width: 1.5rem;\n border-radius: 9999px;\n padding: 0px;\n}\n.tw-btn-circle:where(.tw-btn-sm) {\n height: 2rem;\n width: 2rem;\n border-radius: 9999px;\n padding: 0px;\n}\n.tw-btn-circle:where(.tw-btn-md) {\n height: 3rem;\n width: 3rem;\n border-radius: 9999px;\n padding: 0px;\n}\n.tw-btn-circle:where(.tw-btn-lg) {\n height: 4rem;\n width: 4rem;\n border-radius: 9999px;\n padding: 0px;\n}\n[type=\"checkbox\"].tw-checkbox-xs {\n height: 1rem;\n width: 1rem;\n}\n.tw-tooltip {\n position: relative;\n display: inline-block;\n --tooltip-offset: calc(100% + 1px + var(--tooltip-tail, 0px));\n}\n.tw-tooltip:before {\n position: absolute;\n pointer-events: none;\n z-index: 1;\n content: var(--tw-content);\n --tw-content: attr(data-tip);\n}\n.tw-tooltip:before, .tw-tooltip-top:before {\n transform: translateX(-50%);\n top: auto;\n left: 50%;\n right: auto;\n bottom: var(--tooltip-offset);\n}\n.tw-tooltip-left:before {\n transform: translateY(-50%);\n top: 50%;\n left: auto;\n right: var(--tooltip-offset);\n bottom: auto;\n}\n.tw-tooltip-right:before {\n transform: translateY(-50%);\n top: 50%;\n left: var(--tooltip-offset);\n right: auto;\n bottom: auto;\n}\n.tw-avatar.tw-online:before {\n content: \"\";\n position: absolute;\n z-index: 10;\n display: block;\n border-radius: 9999px;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));\n outline-style: solid;\n outline-width: 2px;\n outline-color: var(--fallback-b1,oklch(var(--b1)/1));\n width: 15%;\n height: 15%;\n top: 7%;\n right: 7%;\n}\n.tw-avatar.tw-offline:before {\n content: \"\";\n position: absolute;\n z-index: 10;\n display: block;\n border-radius: 9999px;\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));\n outline-style: solid;\n outline-width: 2px;\n outline-color: var(--fallback-b1,oklch(var(--b1)/1));\n width: 15%;\n height: 15%;\n top: 7%;\n right: 7%;\n}\n.tw-card-compact .tw-card-body {\n padding: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.tw-card-compact .tw-card-title {\n margin-bottom: 0.25rem;\n}\n.tw-card-normal .tw-card-body {\n padding: var(--padding-card, 2rem);\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.tw-card-normal .tw-card-title {\n margin-bottom: 0.75rem;\n}\n.tw-modal-top :where(.tw-modal-box) {\n width: 100%;\n max-width: none;\n --tw-translate-y: -2.5rem;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-bottom-right-radius: var(--rounded-box, 1rem);\n border-bottom-left-radius: var(--rounded-box, 1rem);\n border-top-left-radius: 0px;\n border-top-right-radius: 0px;\n}\n.tw-modal-middle :where(.tw-modal-box) {\n width: 91.666667%;\n max-width: 32rem;\n --tw-translate-y: 0px;\n --tw-scale-x: .9;\n --tw-scale-y: .9;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-top-left-radius: var(--rounded-box, 1rem);\n border-top-right-radius: var(--rounded-box, 1rem);\n border-bottom-right-radius: var(--rounded-box, 1rem);\n border-bottom-left-radius: var(--rounded-box, 1rem);\n}\n.tw-modal-bottom :where(.tw-modal-box) {\n width: 100%;\n max-width: none;\n --tw-translate-y: 2.5rem;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n border-top-left-radius: var(--rounded-box, 1rem);\n border-top-right-radius: var(--rounded-box, 1rem);\n border-bottom-right-radius: 0px;\n border-bottom-left-radius: 0px;\n}\n.tw-tooltip {\n position: relative;\n display: inline-block;\n text-align: center;\n --tooltip-tail: 0.1875rem;\n --tooltip-color: var(--fallback-n,oklch(var(--n)/1));\n --tooltip-text-color: var(--fallback-nc,oklch(var(--nc)/1));\n --tooltip-tail-offset: calc(100% + 0.0625rem - var(--tooltip-tail));\n}\n.tw-tooltip:before,\n.tw-tooltip:after {\n opacity: 0;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-delay: 100ms;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n.tw-tooltip:after {\n position: absolute;\n content: \"\";\n border-style: solid;\n border-width: var(--tooltip-tail, 0);\n width: 0;\n height: 0;\n display: block;\n}\n.tw-tooltip:before {\n max-width: 20rem;\n border-radius: 0.25rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n background-color: var(--tooltip-color);\n color: var(--tooltip-text-color);\n width: -moz-max-content;\n width: max-content;\n}\n.tw-tooltip.tw-tooltip-open:before {\n opacity: 1;\n transition-delay: 75ms;\n}\n.tw-tooltip.tw-tooltip-open:after {\n opacity: 1;\n transition-delay: 75ms;\n}\n.tw-tooltip:hover:before {\n opacity: 1;\n transition-delay: 75ms;\n}\n.tw-tooltip:hover:after {\n opacity: 1;\n transition-delay: 75ms;\n}\n.tw-tooltip:has(:focus-visible):after,\n.tw-tooltip:has(:focus-visible):before {\n opacity: 1;\n transition-delay: 75ms;\n}\n.tw-tooltip:not([data-tip]):hover:before,\n.tw-tooltip:not([data-tip]):hover:after {\n visibility: hidden;\n opacity: 0;\n}\n.tw-tooltip:after, .tw-tooltip-top:after {\n transform: translateX(-50%);\n border-color: var(--tooltip-color) transparent transparent transparent;\n top: auto;\n left: 50%;\n right: auto;\n bottom: var(--tooltip-tail-offset);\n}\n.tw-tooltip-left:after {\n transform: translateY(-50%);\n border-color: transparent transparent transparent var(--tooltip-color);\n top: 50%;\n left: auto;\n right: calc(var(--tooltip-tail-offset) + 0.0625rem);\n bottom: auto;\n}\n.tw-tooltip-right:after {\n transform: translateY(-50%);\n border-color: transparent var(--tooltip-color) transparent transparent;\n top: 50%;\n left: calc(var(--tooltip-tail-offset) + 0.0625rem);\n right: auto;\n bottom: auto;\n}\n.tw-fixed {\n position: fixed;\n}\n.tw-absolute {\n position: absolute;\n}\n.tw-relative {\n position: relative;\n}\n.tw-inset-y-0 {\n top: 0px;\n bottom: 0px;\n}\n.-tw-left-6 {\n left: -1.5rem;\n}\n.tw--right-2 {\n right: -0.5rem;\n}\n.tw--top-2 {\n top: -0.5rem;\n}\n.tw-bottom-0 {\n bottom: 0px;\n}\n.tw-bottom-4 {\n bottom: 1rem;\n}\n.tw-left-0 {\n left: 0px;\n}\n.tw-left-4 {\n left: 1rem;\n}\n.tw-right-0 {\n right: 0px;\n}\n.tw-right-1 {\n right: 0.25rem;\n}\n.tw-right-2 {\n right: 0.5rem;\n}\n.tw-right-4 {\n right: 1rem;\n}\n.tw-right-5 {\n right: 1.25rem;\n}\n.tw-top-0 {\n top: 0px;\n}\n.tw-top-1 {\n top: 0.25rem;\n}\n.tw-top-14 {\n top: 3.5rem;\n}\n.tw-top-2 {\n top: 0.5rem;\n}\n.tw-top-4 {\n top: 1rem;\n}\n.\\!tw-z-\\[10000\\] {\n z-index: 10000 !important;\n}\n.tw-z-1000 {\n z-index: 1000;\n}\n.tw-z-500 {\n z-index: 500;\n}\n.tw-z-\\[10000\\] {\n z-index: 10000;\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-m-0 {\n margin: 0px !important;\n}\n.tw-m-1 {\n margin: 0.25rem;\n}\n.tw-m-auto {\n margin: auto;\n}\n.\\!tw-my-0 {\n margin-top: 0px !important;\n margin-bottom: 0px !important;\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-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-mt-2 {\n margin-top: 0.5rem !important;\n}\n.-tw-mb-1 {\n margin-bottom: -0.25rem;\n}\n.-tw-mr-6 {\n margin-right: -1.5rem;\n}\n.-tw-mt-2 {\n margin-top: -0.5rem;\n}\n.tw-mb-0 {\n margin-bottom: 0px;\n}\n.tw-mb-1 {\n margin-bottom: 0.25rem;\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-64 {\n max-height: 16rem;\n}\n.tw-min-h-0 {\n min-height: 0px;\n}\n.tw-min-h-\\[21px\\] {\n min-height: 21px;\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-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-end {\n place-self: end;\n}\n.tw-place-self-center {\n place-self: center;\n}\n.tw-self-center {\n align-self: center;\n}\n.tw-overflow-hidden {\n overflow: hidden;\n}\n.tw-overflow-y-auto {\n overflow-y: auto;\n}\n.tw-overflow-x-hidden {\n overflow-x: hidden;\n}\n.tw-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.\\!tw-rounded-none {\n border-radius: 0px !important;\n}\n.tw-rounded-2xl {\n border-radius: 1rem;\n}\n.tw-rounded-box {\n border-radius: var(--rounded-box, 1rem);\n}\n.tw-rounded-full {\n border-radius: 9999px;\n}\n.tw-rounded-lg {\n border-radius: 0.5rem;\n}\n.tw-rounded-xl {\n border-radius: 0.75rem;\n}\n.tw-rounded-br-md {\n border-bottom-right-radius: 0.375rem;\n}\n.tw-rounded-tr-md {\n border-top-right-radius: 0.375rem;\n}\n.tw-border-0 {\n border-width: 0px;\n}\n.tw-border-none {\n border-style: none;\n}\n.tw-bg-base-100 {\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));\n}\n.tw-bg-base-200 {\n --tw-bg-opacity: 1;\n background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));\n}\n.tw-bg-primary {\n --tw-bg-opacity: 1;\n background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));\n}\n.tw-bg-transparent {\n background-color: transparent;\n}\n.tw-bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity));\n}\n.tw-stroke-current {\n stroke: currentColor;\n}\n.tw-p-0 {\n padding: 0px;\n}\n.tw-p-2 {\n padding: 0.5rem;\n}\n.tw-p-4 {\n padding: 1rem;\n}\n.tw-p-6 {\n padding: 1.5rem;\n}\n.tw-px-10 {\n padding-left: 2.5rem;\n padding-right: 2.5rem;\n}\n.tw-px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.tw-px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.tw-px-6 {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n.tw-py-10 {\n padding-top: 2.5rem;\n padding-bottom: 2.5rem;\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-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-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-italic {\n font-style: italic;\n}\n.tw-leading-3 {\n line-height: .75rem;\n}\n.tw-leading-5 {\n line-height: 1.25rem;\n}\n.\\!tw-text-base-content {\n --tw-text-opacity: 1 !important;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))) !important;\n}\n.\\!tw-text-error {\n --tw-text-opacity: 1 !important;\n color: var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity))) !important;\n}\n.tw-text-base-content {\n --tw-text-opacity: 1;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n}\n.tw-text-error {\n --tw-text-opacity: 1;\n color: var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)));\n}\n.tw-text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity));\n}\n.tw-text-gray-600 {\n --tw-text-opacity: 1;\n color: rgb(75 85 99 / var(--tw-text-opacity));\n}\n.tw-text-primary {\n --tw-text-opacity: 1;\n color: var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)));\n}\n.tw-text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n.tw-shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tw-shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.tw-drop-shadow-md {\n --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06));\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.tw-transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.tw-transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.tw-transition-none {\n transition-property: none;\n}\n.tw-transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.tw-duration-200 {\n transition-duration: 200ms;\n}\n.tw-duration-300 {\n transition-duration: 300ms;\n}\n.tw-duration-500 {\n transition-duration: 500ms;\n}\n.tw-ease-in {\n transition-timing-function: cubic-bezier(0.4, 0, 1, 1);\n}\n\n.tw-modal {\n z-index: 1200 !important;\n}\n\n.tw-menu li a {\n border-radius: 10px;\n}\n\n.tw-modal {\n z-index: 1200 !important;\n max-height: 100dvh;\n}\n\n.tw-modal-box {\n max-height: calc(100dvh - 2em);\n}\n\n.Toastify__toast {\n border-radius: 1rem;\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n margin-left: 1rem;\n margin-right: 1rem;\n margin-bottom: 1rem;\n background-color: var(--fallback-b1,oklch(var(--b1)/1));\n color: var(--fallback-bc,oklch(var(--bc)/1));\n}\n\n:root {\n\n --toastify-color-info: var(--fallback-in,oklch(var(--in)/1));\n --toastify-color-success: var(--fallback-su,oklch(var(--su)/1));\n --toastify-color-warning: var(--fallback-wa,oklch(var(--wa)/1));\n --toastify-color-error: var(--fallback-er,oklch(var(--er)/1));\n\n}\n\n.custom-file-upload{\n cursor: pointer;\n}\n\ninput[type=\"file\"] {\n display: none;\n}\n\n.custom-file-upload:hover .button{\n opacity: 0.8;\n}\n\n.custom-file-upload .button{\n transition: .5s ease;\n opacity: 0;\n position: absolute;\n transform: translate(8px, 8px);\n\n}\n\n.hover\\:tw-cursor-pointer:hover {\n cursor: pointer;\n}\n\n.hover\\:tw-bg-slate-300:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(203 213 225 / var(--tw-bg-opacity));\n}\n\n.hover\\:tw-bg-transparent:hover {\n background-color: transparent;\n}\n\n.hover\\:tw-text-primary:hover {\n --tw-text-opacity: 1;\n color: var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)));\n}\n\n.hover\\:tw-underline:hover {\n text-decoration-line: underline;\n}\n\n.focus\\:tw-outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.data-\\[te-sidenav-slim\\=\\'true\\'\\]\\:tw-hidden[data-te-sidenav-slim='true'] {\n display: none;\n}\n\n.data-\\[te-sidenav-slim-collapsed\\=\\'true\\'\\]\\:tw-w-\\[56px\\][data-te-sidenav-slim-collapsed='true'] {\n width: 56px;\n}\n\n.data-\\[te-sidenav-slim\\=\\'true\\'\\]\\:tw-w-\\[56px\\][data-te-sidenav-slim='true'] {\n width: 56px;\n}\n\n.data-\\[te-sidenav-hidden\\=\\'false\\'\\]\\:tw-translate-x-0[data-te-sidenav-hidden='false'] {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.tw-group[data-te-sidenav-slim-collapsed='true'] .group-\\[\\&\\[data-te-sidenav-slim-collapsed\\=\\'true\\'\\]\\]\\:data-\\[te-sidenav-slim\\=\\'false\\'\\]\\:tw-hidden[data-te-sidenav-slim='false'] {\n display: none;\n}\n\n@media (prefers-color-scheme: dark) {\n\n .dark\\:tw-bg-zinc-800 {\n --tw-bg-opacity: 1;\n background-color: rgb(39 39 42 / var(--tw-bg-opacity));\n }\n}\n\n@media (min-width: 768px) {\n\n .md\\:tw-flex {\n display: flex;\n }\n\n .md\\:tw-hidden {\n display: none;\n }\n\n .md\\:tw-grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n\n .md\\:tw-grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n}\n\n@media (min-width: 1280px) {\n\n .xl\\:tw-max-w-6xl {\n max-width: 72rem;\n }\n}\n\n.\\[\\&\\[data-te-sidenav-slim-collapsed\\=\\'true\\'\\]\\[data-te-sidenav-slim\\=\\'false\\'\\]\\]\\:tw-hidden[data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='false'] {\n display: none;\n}\n\n.\\[\\&\\[data-te-sidenav-slim-collapsed\\=\\'true\\'\\]\\[data-te-sidenav-slim\\=\\'true\\'\\]\\]\\:\\[display\\:unset\\][data-te-sidenav-slim-collapsed='true'][data-te-sidenav-slim='true'] {\n display: unset;\n}";
|
1404
2463
|
styleInject(css_248z);
|
1405
2464
|
|
1406
|
-
export { AppShell, AuthProvider, CardPage, Content, ItemForm, ItemView, Layer, LoginPage, Modal, PopupStartEndInput, PopupTextAreaInput, Quests,
|
2465
|
+
export { AppShell, AuthProvider, CardPage, Content, ItemForm, ItemView, Layer, LoginPage, Modal, Permissions, PopupButton, PopupStartEndInput, PopupTextAreaInput, PopupTextInput, ProfileSettings, Quests, SelectBox, SideBar, SignupPage, StartEndView, Tags, TextAreaInput, TextInput, TextView, TitleCard, UserSettings, UtopiaMap, useAuth };
|
1407
2466
|
//# sourceMappingURL=index.js.map
|