utopia-ui 3.0.0-alpha.97 → 3.0.0-alpha.98

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/dist/index.js CHANGED
@@ -15,10 +15,6 @@ import * as PropTypes from 'prop-types';
15
15
  import InformationCircleIcon from '@heroicons/react/24/outline/InformationCircleIcon';
16
16
  import Markdown from 'react-markdown';
17
17
  import remarkBreaks from 'remark-breaks';
18
- import 'react-image-crop/dist/ReactCrop.css';
19
- import 'react-toastify/dist/ReactToastify.css';
20
- import ReactCrop, { centerCrop, makeAspectCrop } from 'react-image-crop';
21
- import { HexColorPicker } from 'react-colorful';
22
18
  import axios from 'axios';
23
19
  import 'leaflet.locatecontrol/dist/L.Control.Locate.css';
24
20
  import QuestionMarkIcon from '@heroicons/react/24/outline/QuestionMarkCircleIcon';
@@ -26,6 +22,10 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
26
22
  import { initTE, Sidenav } from 'tw-elements';
27
23
  import ChevronDownIcon from '@heroicons/react/24/outline/ChevronDownIcon';
28
24
  import ChevronRightIcon$1 from '@heroicons/react/24/outline/ChevronRightIcon';
25
+ import 'react-image-crop/dist/ReactCrop.css';
26
+ import 'react-toastify/dist/ReactToastify.css';
27
+ import ReactCrop, { centerCrop, makeAspectCrop } from 'react-image-crop';
28
+ import { HexColorPicker } from 'react-colorful';
29
29
 
30
30
  /******************************************************************************
31
31
  Copyright (c) Microsoft Corporation.
@@ -524,43 +524,11 @@ var useSetAssetApi = function () {
524
524
  return setAssetsApi;
525
525
  };
526
526
 
527
- function TextInput(_a) {
528
- 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;
529
- return (jsxs("div", __assign({ className: "tw-form-control tw-w-full ".concat(containerStyle) }, { children: [labelTitle ? jsx("label", __assign({ className: "tw-label" }, { children: jsx("span", __assign({ className: "tw-label-text tw-text-base-content " + labelStyle }, { children: labelTitle })) }))
530
- : " ", jsx("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 : "") })] })));
531
- }
532
-
533
- function UserSettings() {
534
- var _a = useAuth(), user = _a.user, updateUser = _a.updateUser, loading = _a.loading; _a.token;
535
- var _b = useState(""), id = _b[0], setId = _b[1];
536
- var _c = useState(""), email = _c[0], setEmail = _c[1];
537
- var _d = useState(""), password = _d[0], setPassword = _d[1];
538
- var _e = useState(false), passwordChanged = _e[0], setPasswordChanged = _e[1];
539
- var navigate = useNavigate();
540
- useEffect(function () {
541
- setId((user === null || user === void 0 ? void 0 : user.id) ? user.id : "");
542
- setEmail((user === null || user === void 0 ? void 0 : user.email) ? user.email : "");
543
- setPassword((user === null || user === void 0 ? void 0 : user.password) ? user.password : "");
544
- }, [user]);
545
- var onUpdateUser = function () {
546
- var changedUser = {};
547
- changedUser = __assign({ id: id, email: email }, passwordChanged && { password: password });
548
- toast.promise(updateUser(changedUser), {
549
- pending: 'updating Profile ...',
550
- success: 'Profile updated',
551
- error: {
552
- render: function (_a) {
553
- var data = _a.data;
554
- return "".concat(data);
555
- },
556
- },
557
- })
558
- .then(function () { return navigate("/"); });
559
- };
560
- return (jsx(Fragment, { children: jsx("main", __assign({ 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" }, { children: jsx("div", __assign({ className: 'tw-w-full xl:tw-max-w-6xl' }, { children: jsxs(TitleCard, __assign({ title: "Settings", topMargin: "tw-mt-2", className: 'tw-mb-6' }, { children: [jsxs("div", __assign({ className: "tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6" }, { children: [jsx(TextInput, { type: 'email', placeholder: "E-Mail", defaultValue: (user === null || user === void 0 ? void 0 : user.email) ? user.email : "", updateFormValue: function (v) { return setEmail(v); } }), jsx(TextInput, { type: 'password', placeholder: "new Password", defaultValue: (user === null || user === void 0 ? void 0 : user.password) ? user.password : "", updateFormValue: function (v) {
561
- setPassword(v);
562
- setPasswordChanged(true);
563
- } })] })), jsx("div", __assign({ className: "tw-mt-8" }, { children: jsx("button", __assign({ 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(); } }, { children: "Update" })) }))] })) })) })) }));
527
+ function PlusButton(_a) {
528
+ var triggerAction = _a.triggerAction, color = _a.color, _b = _a.collection, collection = _b === void 0 ? "items" : _b;
529
+ var hasUserPermission = useHasUserPermission();
530
+ return (jsx(Fragment, { children: hasUserPermission(collection, "create") &&
531
+ jsx("div", __assign({ className: "tw-dropdown tw-dropdown-top tw-dropdown-end tw-dropdown-hover tw-z-500 tw-absolute tw-right-4 tw-bottom-4" }, { children: jsx("button", __assign({ tabIndex: 0, className: "tw-z-500 tw-btn tw-btn-circle tw-shadow", onClick: function () { triggerAction(); }, style: { backgroundColor: color, color: "#fff" } }, { children: jsx("svg", __assign({ 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" }, { children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4.5v15m7.5-7.5h-15" }) })) })) })) }));
564
532
  }
565
533
 
566
534
  var hashTagRegex = /(#+[a-zA-Z0-9À-ÖØ-öø-ʸ_-]{1,})/g;
@@ -720,293 +688,101 @@ function TextAreaInput(_a) {
720
688
  return (jsxs("div", __assign({ className: "tw-form-control tw-w-full ".concat(containerStyle ? containerStyle : "") }, { children: [labelTitle ? jsx("label", __assign({ className: "tw-label" }, { children: jsx("span", __assign({ className: "tw-label-text tw-text-base-content " + labelStyle }, { children: labelTitle })) })) : "", jsx("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); } })] })));
721
689
  }
722
690
 
723
- var isClickInsideRectangle = function (e, element) {
724
- var r = element.getBoundingClientRect();
725
- return (e.clientX > r.left &&
726
- e.clientX < r.right &&
727
- e.clientY > r.top &&
728
- e.clientY < r.bottom);
729
- };
730
- var DialogModal = function (_a) {
731
- var title = _a.title, isOpened = _a.isOpened, onClose = _a.onClose, children = _a.children, _b = _a.showCloseButton, showCloseButton = _b === void 0 ? true : _b;
732
- var ref = useRef(null);
733
- useEffect(function () {
734
- var _a, _b, _c, _d;
735
- if (isOpened) {
736
- (_a = ref.current) === null || _a === void 0 ? void 0 : _a.showModal();
737
- (_b = ref.current) === null || _b === void 0 ? void 0 : _b.classList.remove("tw-hidden");
738
- document.body.classList.add("modal-open"); // prevent bg scroll
739
- }
740
- else {
741
- (_c = ref.current) === null || _c === void 0 ? void 0 : _c.close();
742
- (_d = ref.current) === null || _d === void 0 ? void 0 : _d.classList.add("tw-hidden");
743
- document.body.classList.remove("modal-open");
744
- }
745
- }, [isOpened]);
746
- return (jsx("dialog", __assign({ 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 tw-bg-base-100', ref: ref, onCancel: onClose, onClick: function (e) {
747
- return ref.current && !isClickInsideRectangle(e, ref.current) && onClose();
748
- } }, { children: jsxs("div", __assign({ className: "tw-card-body tw-p-2" }, { children: [jsx("h2", __assign({ className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, { children: title })), children, showCloseButton && jsx("button", __assign({ className: "tw-btn tw-btn-sm tw-btn-circle tw-btn-ghost tw-absolute tw-right-2 tw-top-2", onClick: onClose }, { children: "\u2715" }))] })) })));
749
- };
750
-
751
- 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 }";
752
- styleInject(css_248z$1);
691
+ function TextInput(_a) {
692
+ 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;
693
+ return (jsxs("div", __assign({ className: "tw-form-control tw-w-full ".concat(containerStyle) }, { children: [labelTitle ? jsx("label", __assign({ className: "tw-label" }, { children: jsx("span", __assign({ className: "tw-label-text tw-text-base-content " + labelStyle }, { children: labelTitle })) }))
694
+ : " ", jsx("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 : "") })] })));
695
+ }
753
696
 
754
- // Improved version of https://usehooks.com/useOnClickOutside/
755
- var useClickOutside = function (ref, handler) {
756
- useEffect(function () {
757
- var startedInside = false;
758
- var startedWhenMounted = false;
759
- var listener = function (event) {
760
- // Do nothing if `mousedown` or `touchstart` started inside ref element
761
- if (startedInside || !startedWhenMounted)
762
- return;
763
- // Do nothing if clicking ref's element or descendent elements
764
- if (!ref.current || ref.current.contains(event.target))
765
- return;
766
- handler(event);
767
- };
768
- var validateEventStart = function (event) {
769
- startedWhenMounted = ref.current;
770
- startedInside = ref.current && ref.current.contains(event.target);
771
- };
772
- document.addEventListener("mousedown", validateEventStart);
773
- document.addEventListener("touchstart", validateEventStart);
774
- document.addEventListener("click", listener);
775
- return function () {
776
- document.removeEventListener("mousedown", validateEventStart);
777
- document.removeEventListener("touchstart", validateEventStart);
778
- document.removeEventListener("click", listener);
779
- };
780
- }, [ref, handler]);
781
- };
697
+ function SelectBox(props) {
698
+ 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;
699
+ var _a = useState(defaultValue || ""), value = _a[0], setValue = _a[1];
700
+ var updateValue = function (newValue) {
701
+ updateFormValue(newValue);
702
+ setValue(newValue);
703
+ };
704
+ return (jsxs("div", __assign({ className: "tw-inline-block ".concat(containerStyle) }, { children: [labelTitle ?
705
+ jsx("label", __assign({ className: "tw-label ".concat(labelStyle) }, { children: jsxs("div", __assign({ className: "tw-label-text" }, { children: [labelTitle, labelDescription && jsx("div", __assign({ className: "tw-tooltip tw-tooltip-right", "data-tip": labelDescription }, { children: jsx(InformationCircleIcon, { className: 'tw-w-4 tw-h-4' }) }))] })) }))
706
+ : "", jsxs("select", __assign({ className: "tw-select tw-select-bordered tw-w-full", value: value, onChange: function (e) { return updateValue(e.target.value); } }, { children: [jsx("option", __assign({ disabled: true, value: "PLACEHOLDER" }, { children: placeholder })), options.map(function (o, k) {
707
+ return jsx("option", __assign({ value: o.value || o.name }, { children: o.name }), k);
708
+ })] }))] })));
709
+ }
782
710
 
783
- var ColorPicker = function (_a) {
784
- var color = _a.color, onChange = _a.onChange, className = _a.className;
785
- var popover = useRef(null);
786
- var _b = useState(false), isOpen = _b[0], toggle = _b[1];
787
- var close = useCallback(function () { return toggle(false); }, []);
788
- useClickOutside(popover, close);
789
- var colorPickerRef = React.useRef(null);
790
- useEffect(function () {
791
- // Füge dem Color-Picker explizit Event-Listener hinzu
792
- var colorPickerElement = colorPickerRef.current;
793
- if (colorPickerElement) {
794
- var enablePropagation_1 = function (event) {
795
- // Verhindere, dass Leaflet die Propagation stoppt
796
- event.stopPropagation = function () { };
797
- };
798
- // Event-Listener für den Color-Picker
799
- ['click', 'dblclick', 'mousedown', 'touchstart'].forEach(function (eventType) {
800
- colorPickerElement.addEventListener(eventType, enablePropagation_1, true);
801
- });
711
+ var ItemContext = createContext({
712
+ items: [],
713
+ addItem: function () { },
714
+ updateItem: function () { },
715
+ removeItem: function () { },
716
+ resetItems: function () { },
717
+ setItemsApi: function () { },
718
+ setItemsData: function () { },
719
+ allItemsLoaded: false
720
+ });
721
+ function useItemsManager(initialItems) {
722
+ var _this = this;
723
+ var addLayer = useAddLayer();
724
+ var _a = useState(0); _a[0]; _a[1];
725
+ var _b = useState(false), allItemsLoaded = _b[0], setallItemsLoaded = _b[1];
726
+ var _c = useReducer(function (state, action) {
727
+ switch (action.type) {
728
+ case "ADD":
729
+ var exist = state.find(function (item) {
730
+ return item.id === action.item.id ? true : false;
731
+ });
732
+ if (!exist)
733
+ return __spreadArray(__spreadArray([], state, true), [
734
+ action.item,
735
+ ], false);
736
+ else
737
+ return state;
738
+ case "UPDATE":
739
+ return state.map(function (item) {
740
+ if (item.id === action.item.id) {
741
+ return action.item;
742
+ }
743
+ return item;
744
+ });
745
+ case "REMOVE":
746
+ return state.filter(function (item) { return item !== action.item; });
747
+ case "RESET":
748
+ return state.filter(function (item) { var _a; return ((_a = item.layer) === null || _a === void 0 ? void 0 : _a.name) !== action.layer.name; });
749
+ default:
750
+ throw new Error();
802
751
  }
803
- }, []);
804
- return (jsxs("div", __assign({ ref: colorPickerRef, className: "picker ".concat(className) }, { children: [jsx("div", { className: "swatch", style: { backgroundColor: color }, onClick: function () { return toggle(true); } }), isOpen && (jsx("div", __assign({ className: "popover tw-z-[10000]", ref: popover }, { children: jsx(HexColorPicker, { color: color, onChange: onChange, onClick: function () { return toggle(false); } }) })))] })));
805
- };
806
-
807
- function ProfileSettings() {
808
- var _a = useAuth(), user = _a.user, updateUser = _a.updateUser, loading = _a.loading, token = _a.token;
809
- var _b = useState(""), id = _b[0], setId = _b[1];
810
- var _c = useState(""), name = _c[0], setName = _c[1];
811
- var _d = useState(""), text = _d[0], setText = _d[1];
812
- var _e = useState(""), avatar = _e[0], setAvatar = _e[1];
813
- var _f = useState(""), color = _f[0], setColor = _f[1];
814
- var _g = useState(), crop = _g[0], setCrop = _g[1];
815
- var _h = useState(""), image = _h[0], setImage = _h[1];
816
- var _j = useState(false), cropModalOpen = _j[0], setCropModalOpen = _j[1];
817
- var _k = useState(false), cropping = _k[0], setCropping = _k[1];
818
- var assetsApi = useAssetApi();
819
- var navigate = useNavigate();
820
- useEffect(function () {
821
- setId((user === null || user === void 0 ? void 0 : user.id) ? user.id : "");
822
- setName((user === null || user === void 0 ? void 0 : user.first_name) ? user.first_name : "");
823
- setText((user === null || user === void 0 ? void 0 : user.description) ? user.description : "");
824
- setAvatar((user === null || user === void 0 ? void 0 : user.avatar) ? user === null || user === void 0 ? void 0 : user.avatar : ""),
825
- setColor((user === null || user === void 0 ? void 0 : user.color) ? user.color : "#aabbcc");
826
- }, [user]);
827
- var imgRef = useRef(null);
828
- var onImageChange = function (event) {
829
- if (event.target.files && event.target.files[0]) {
830
- setImage(URL.createObjectURL(event.target.files[0]));
831
- }
832
- setCropModalOpen(true);
833
- };
834
- function onImageLoad(e) {
835
- var _a = e.currentTarget, width = _a.width, height = _a.height;
836
- setCrop(centerAspectCrop(width, height, 1));
837
- }
838
- // This is to demonstate how to make and center a % aspect crop
839
- // which is a bit trickier so we use some helper functions.
840
- function centerAspectCrop(mediaWidth, mediaHeight, aspect) {
841
- return centerCrop(makeAspectCrop({
842
- unit: 'px',
843
- width: mediaWidth / 2,
844
- }, aspect, mediaWidth, mediaHeight), mediaWidth, mediaHeight);
845
- }
846
- function renderCrop() {
847
- return __awaiter(this, void 0, void 0, function () {
848
- var image, scaleX, scaleY, canvas, ctx, pixelRatio, blob;
849
- return __generator(this, function (_a) {
850
- switch (_a.label) {
851
- case 0:
852
- image = imgRef.current;
853
- if (!(crop && image)) return [3 /*break*/, 3];
854
- scaleX = image.naturalWidth / image.width;
855
- scaleY = image.naturalHeight / image.height;
856
- canvas = new OffscreenCanvas(crop.width * scaleX, crop.height * scaleY);
857
- ctx = canvas.getContext("2d");
858
- pixelRatio = window.devicePixelRatio;
859
- canvas.width = crop.width * pixelRatio * scaleX;
860
- canvas.height = crop.height * pixelRatio * scaleY;
861
- if (ctx) {
862
- ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
863
- ctx.drawImage(image, crop.x * scaleX, crop.y * scaleY, crop.width * scaleX, crop.height * scaleY, 0, 0, crop.width * scaleX, crop.height * scaleY);
864
- }
865
- return [4 /*yield*/, canvas.convertToBlob()];
866
- case 1:
867
- blob = _a.sent();
868
- return [4 /*yield*/, resizeBlob(blob)];
869
- case 2:
870
- _a.sent();
871
- setCropping(false);
872
- setImage("");
873
- _a.label = 3;
874
- case 3: return [2 /*return*/];
875
- }
876
- });
877
- });
878
- }
879
- function resizeBlob(blob) {
880
- return __awaiter(this, void 0, void 0, function () {
881
- var img, canvas, ctx, resizedBlob, asset;
882
- return __generator(this, function (_a) {
883
- switch (_a.label) {
884
- case 0:
885
- img = new Image();
886
- img.src = URL.createObjectURL(blob);
887
- return [4 /*yield*/, img.decode()];
888
- case 1:
889
- _a.sent();
890
- canvas = new OffscreenCanvas(400, 400);
891
- ctx = canvas.getContext("2d");
892
- ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(img, 0, 0, 400, 400);
893
- return [4 /*yield*/, canvas.convertToBlob()];
894
- case 2:
895
- resizedBlob = _a.sent();
896
- return [4 /*yield*/, assetsApi.upload(resizedBlob, "test")];
897
- case 3:
898
- asset = _a.sent();
899
- setAvatar(asset.id);
900
- return [2 /*return*/];
901
- }
902
- });
903
- });
904
- }
905
- var onUpdateUser = function () {
906
- var changedUser = {};
907
- changedUser = __assign({ id: id, first_name: name, description: text, color: color }, avatar.length > 10 && { avatar: avatar });
908
- toast.promise(updateUser(changedUser), {
909
- pending: 'updating Profile ...',
910
- success: 'Profile updated',
911
- error: {
912
- render: function (_a) {
913
- var data = _a.data;
914
- return "".concat(data);
915
- },
916
- },
917
- })
918
- .then(function () { return navigate("/"); });
919
- };
920
- return (jsxs("div", __assign({ className: 'tw-backdrop-contrast-50 tw-h-full tw-w-full' }, { children: [jsx("main", __assign({ className: "tw-flex-1 tw-overflow-y-auto tw-overflow-x-hidden tw-pt-8 tw-px-6 tw-min-w-80 tw-flex tw-justify-center" }, { children: jsx("div", __assign({ className: 'tw-w-full xl:tw-max-w-6xl' }, { children: jsxs(TitleCard, __assign({ title: "Profile", topMargin: "tw-mt-2", className: 'tw-mb-6' }, { children: [jsxs("div", __assign({ className: "tw-flex" }, { children: [!cropping ?
921
- jsxs("label", __assign({ className: "custom-file-upload" }, { children: [jsx("input", { type: "file", accept: "image/*", className: "tw-file-input tw-w-full tw-max-w-xs", onChange: onImageChange }), jsx("div", __assign({ className: 'button tw-btn tw-btn-lg tw-btn-circle tw-animate-none' }, { children: jsx("svg", __assign({ 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" }, { children: jsx("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" }) })) })), avatar ?
922
- jsx("div", __assign({ className: 'tw-h-20 tw-w-20' }, { children: jsx("img", { src: assetsApi.url + avatar + "?access_token=" + token, className: ' tw-rounded-full' }) }))
923
- :
924
- jsx("div", __assign({ className: 'tw-h-20 tw-w-20' }, { children: jsxs("svg", __assign({ 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" } }, { children: [jsx("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" }), jsx("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" })] })) }))] }))
925
- : jsx("div", __assign({ className: 'tw-w-20 tw-flex tw-items-center tw-justify-center' }, { children: jsx("span", { className: "tw-loading tw-loading-spinner" }) })), jsx(ColorPicker, { color: color, onChange: setColor, className: "-tw-left-6 tw-top-14 -tw-mr-6" }), jsx(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 ' })] })), jsx("div", __assign({ className: "tw-grid tw-grid-cols-1 tw-md:grid-cols-1 tw-gap-6 tw-pt-6 tw-pb-6" }, { children: jsx(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' }) })), jsx("div", __assign({ className: "tw-mt-8" }, { children: jsx("button", __assign({ 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(); } }, { children: "Update" })) }))] })) })) })), jsxs(DialogModal, __assign({ title: "", isOpened: cropModalOpen, onClose: function () {
926
- setCropModalOpen(false);
927
- setImage("");
928
- } }, { children: [jsx(ReactCrop, __assign({ crop: crop, onChange: function (c) { return setCrop(c); }, aspect: 1 }, { children: jsx("img", { src: image, ref: imgRef, onLoad: onImageLoad }) })), jsx("button", __assign({ className: "tw-btn tw-btn-primary", onClick: function () {
929
- setCropping(true);
930
- setCropModalOpen(false);
931
- renderCrop();
932
- } }, { children: "Select" }))] }))] })));
933
- }
934
-
935
- var ItemContext = createContext({
936
- items: [],
937
- addItem: function () { },
938
- updateItem: function () { },
939
- removeItem: function () { },
940
- resetItems: function () { },
941
- setItemsApi: function () { },
942
- setItemsData: function () { },
943
- allItemsLoaded: false
944
- });
945
- function useItemsManager(initialItems) {
946
- var _this = this;
947
- var addLayer = useAddLayer();
948
- var _a = useState(0); _a[0]; _a[1];
949
- var _b = useState(false), allItemsLoaded = _b[0], setallItemsLoaded = _b[1];
950
- var _c = useReducer(function (state, action) {
951
- switch (action.type) {
952
- case "ADD":
953
- var exist = state.find(function (item) {
954
- return item.id === action.item.id ? true : false;
955
- });
956
- if (!exist)
957
- return __spreadArray(__spreadArray([], state, true), [
958
- action.item,
959
- ], false);
960
- else
961
- return state;
962
- case "UPDATE":
963
- return state.map(function (item) {
964
- if (item.id === action.item.id) {
965
- return action.item;
966
- }
967
- return item;
968
- });
969
- case "REMOVE":
970
- return state.filter(function (item) { return item !== action.item; });
971
- case "RESET":
972
- return state.filter(function (item) { var _a; return ((_a = item.layer) === null || _a === void 0 ? void 0 : _a.name) !== action.layer.name; });
973
- default:
974
- throw new Error();
975
- }
976
- }, initialItems), items = _c[0], dispatch = _c[1];
977
- var setItemsApi = useCallback(function (layer) { return __awaiter(_this, void 0, void 0, function () {
978
- var result;
979
- return __generator(this, function (_a) {
980
- switch (_a.label) {
981
- case 0:
982
- addLayer(layer);
983
- return [4 /*yield*/, toast.promise(layer.api.getItems(), {
984
- pending: "loading ".concat(layer.name, " ..."),
985
- success: "".concat(layer.name, " loaded"),
986
- error: {
987
- render: function (_a) {
988
- var data = _a.data;
989
- return "".concat(data);
990
- },
991
- },
992
- })];
993
- case 1:
994
- result = _a.sent();
995
- if (result) {
996
- result.map(function (item) {
997
- dispatch({ type: "ADD", item: __assign(__assign({}, item), { layer: layer }) });
998
- });
999
- setallItemsLoaded(true);
1000
- }
1001
- return [2 /*return*/];
1002
- }
1003
- });
1004
- }); }, []);
1005
- var setItemsData = useCallback(function (layer) {
1006
- var _a;
1007
- (_a = layer.data) === null || _a === void 0 ? void 0 : _a.map(function (item) {
1008
- dispatch({ type: "ADD", item: __assign(__assign({}, item), { layer: layer }) });
1009
- });
752
+ }, initialItems), items = _c[0], dispatch = _c[1];
753
+ var setItemsApi = useCallback(function (layer) { return __awaiter(_this, void 0, void 0, function () {
754
+ var result;
755
+ return __generator(this, function (_a) {
756
+ switch (_a.label) {
757
+ case 0:
758
+ addLayer(layer);
759
+ return [4 /*yield*/, toast.promise(layer.api.getItems(), {
760
+ pending: "loading ".concat(layer.name, " ..."),
761
+ success: "".concat(layer.name, " loaded"),
762
+ error: {
763
+ render: function (_a) {
764
+ var data = _a.data;
765
+ return "".concat(data);
766
+ },
767
+ },
768
+ })];
769
+ case 1:
770
+ result = _a.sent();
771
+ if (result) {
772
+ result.map(function (item) {
773
+ dispatch({ type: "ADD", item: __assign(__assign({}, item), { layer: layer }) });
774
+ });
775
+ setallItemsLoaded(true);
776
+ }
777
+ return [2 /*return*/];
778
+ }
779
+ });
780
+ }); }, []);
781
+ var setItemsData = useCallback(function (layer) {
782
+ var _a;
783
+ (_a = layer.data) === null || _a === void 0 ? void 0 : _a.map(function (item) {
784
+ dispatch({ type: "ADD", item: __assign(__assign({}, item), { layer: layer }) });
785
+ });
1010
786
  }, []);
1011
787
  var addItem = useCallback(function (item) { return __awaiter(_this, void 0, void 0, function () {
1012
788
  return __generator(this, function (_a) {
@@ -1073,40 +849,6 @@ var useAllItemsLoaded = function () {
1073
849
  return allItemsLoaded;
1074
850
  };
1075
851
 
1076
- function getWindowDimensions() {
1077
- var width = window.innerWidth, height = window.innerHeight;
1078
- return {
1079
- width: width,
1080
- height: height
1081
- };
1082
- }
1083
- function useWindowDimensions() {
1084
- var _a = useState(getWindowDimensions()), windowDimensions = _a[0], setWindowDimensions = _a[1];
1085
- useEffect(function () {
1086
- function handleResize() {
1087
- setWindowDimensions(getWindowDimensions());
1088
- }
1089
- window.addEventListener('resize', handleResize);
1090
- return function () { return window.removeEventListener('resize', handleResize); };
1091
- }, []);
1092
- return windowDimensions;
1093
- }
1094
-
1095
- function decodeTag(string) {
1096
- var formatedTag = string.replace(/_/g, "\u00A0");
1097
- return formatedTag = formatedTag.charAt(0).toUpperCase() + formatedTag.slice(1);
1098
- }
1099
- function encodeTag(string) {
1100
- return string.replace(/\s+/g, "_");
1101
- }
1102
-
1103
- var TagView = function (_a) {
1104
- var tag = _a.tag, heighlight = _a.heighlight, onClick = _a.onClick;
1105
- return (
1106
- // Use your imagination to render suggestions.
1107
- jsxs("div", __assign({ onClick: onClick, className: "tw-rounded-2xl tw-text-white tw-p-2 tw-px-4 tw-shadow-xl tw-card tw-h-[2.75em] tw-mt-3 tw-mr-4 tw-cursor-pointer tw-w-fit ".concat(heighlight && 'tw-border-primary tw-shadow-te-primary'), style: { backgroundColor: tag.color ? tag.color : "#666" } }, { children: [jsx("div", { className: "tw-card-actions tw-justify-end" }), jsx("b", { children: decodeTag(tag.name) })] }), tag.name));
1108
- };
1109
-
1110
852
  var FilterContext = createContext({
1111
853
  filterTags: [],
1112
854
  searchPhrase: "",
@@ -1272,68 +1014,6 @@ var useIsLayerVisible = function () {
1272
1014
  return isLayerVisible;
1273
1015
  };
1274
1016
 
1275
- function OverlayProfile() {
1276
- var _a, _b;
1277
- var location = useLocation();
1278
- var items = useItems();
1279
- var _c = useState({}), item = _c[0], setItem = _c[1];
1280
- var map = useMap();
1281
- var windowDimension = useWindowDimensions();
1282
- var tags = useTags();
1283
- var user = useAuth().user;
1284
- var navigate = useNavigate();
1285
- var _d = useState(), owner = _d[0], setOwner = _d[1];
1286
- var _e = useState([]), offers = _e[0], setOffers = _e[1];
1287
- var _f = useState([]), needs = _f[0], setNeeds = _f[1];
1288
- var _g = useState(1), activeTab = _g[0], setActiveTab = _g[1];
1289
- var addFilterTag = useAddFilterTag();
1290
- useEffect(function () {
1291
- var _a;
1292
- var itemId = location.pathname.split("/")[2];
1293
- var item = items.find(function (i) { return i.id === itemId; });
1294
- item && setItem(item);
1295
- var bounds = map.getBounds();
1296
- var x = bounds.getEast() - bounds.getWest();
1297
- if (windowDimension.width > 768)
1298
- if ((_a = item === null || item === void 0 ? void 0 : item.position) === null || _a === void 0 ? void 0 : _a.coordinates[0])
1299
- map.setView(new LatLng(item === null || item === void 0 ? void 0 : item.position.coordinates[1], (item === null || item === void 0 ? void 0 : item.position.coordinates[0]) + x / 4));
1300
- }, [location, items, activeTab]);
1301
- useEffect(function () {
1302
- var _a, _b, _c, _d;
1303
- setOffers([]);
1304
- setNeeds([]);
1305
- setOwner(undefined);
1306
- ((_a = item === null || item === void 0 ? void 0 : item.layer) === null || _a === void 0 ? void 0 : _a.itemOwnerField) && setOwner(getValue(item, (_b = item.layer) === null || _b === void 0 ? void 0 : _b.itemOwnerField));
1307
- ((_c = item.layer) === null || _c === void 0 ? void 0 : _c.itemOffersField) && getValue(item, item.layer.itemOffersField).map(function (o) {
1308
- var tag = tags.find(function (t) { return t.id === o.tags_id; });
1309
- tag && setOffers(function (current) { return __spreadArray(__spreadArray([], current, true), [tag], false); });
1310
- });
1311
- ((_d = item.layer) === null || _d === void 0 ? void 0 : _d.itemNeedsField) && getValue(item, item.layer.itemNeedsField).map(function (n) {
1312
- var tag = tags.find(function (t) { return t.id === n.tags_id; });
1313
- tag && setNeeds(function (current) { return __spreadArray(__spreadArray([], current, true), [tag], false); });
1314
- });
1315
- }, [item]);
1316
- return (jsx(MapOverlayPage, __assign({ className: 'tw-mx-4 tw-mt-4 tw-max-h-[calc(100dvh-96px)] tw-h-[calc(100dvh-96px)] md:tw-w-[calc(50%-32px)] tw-w-[calc(100%-32px)] tw-max-w-3xl !tw-left-auto tw-top-0 tw-bottom-0' }, { children: item &&
1317
- jsxs(Fragment, { children: [jsxs("div", __assign({ className: 'tw-flex tw-flex-row' }, { children: [jsx("div", __assign({ className: "tw-grow" }, { children: jsxs("p", __assign({ className: "tw-text-3xl tw-font-semibold" }, { children: [((_a = item.layer) === null || _a === void 0 ? void 0 : _a.itemAvatarField) && getValue(item, item.layer.itemAvatarField) && jsx("img", { className: 'tw-h-20 tw-rounded-full tw-inline', src: "https://api.utopia-lab.org/assets/".concat(getValue(item, item.layer.itemAvatarField), "?width=160&heigth=160") }), " ", ((_b = item.layer) === null || _b === void 0 ? void 0 : _b.itemNameField) && getValue(item, item.layer.itemNameField)] })) })), (owner === null || owner === void 0 ? void 0 : owner.id) === (user === null || user === void 0 ? void 0 : user.id) && (owner === null || owner === void 0 ? void 0 : owner.id) ?
1318
- jsx("a", __assign({ className: 'tw-self-center tw-btn tw-btn-sm tw-mr-4 tw-cursor-pointer', onClick: function () { return navigate("/profile-settings"); } }, { children: jsx("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" }, { children: jsx("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" }) })) })) : ""] })), jsx("div", __assign({ className: 'tw-h-full' }, { children: jsxs("div", __assign({ role: "tablist", className: "tw-tabs tw-tabs-lifted tw-mt-2 tw-mb-2" }, { children: [jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Vision", checked: activeTab == 1 && true, onChange: function () { return setActiveTab(1); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto fade tw-pt-2 tw-pb-1" }, { children: jsx(TextView, { item: item }) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab tw-min-w-[10em] [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Offers & Needs", checked: activeTab == 2 && true, onChange: function () { return setActiveTab(2); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto fade tw-pt-4 tw-pb-1" }, { children: jsx("div", __assign({ className: 'tw-h-full' }, { children: jsxs("div", __assign({ className: 'tw-grid tw-grid-cols-1' }, { children: [offers.length > 0 ?
1319
- jsxs("div", __assign({ className: 'tw-col-span-1' }, { children: [jsx("h3", __assign({ className: '-tw-mb-2' }, { children: "Offers" })), jsx("div", __assign({ className: 'tw-flex tw-flex-wrap tw-mb-4' }, { children: offers.map(function (o) { return jsx(TagView, { tag: o, onClick: function () { return addFilterTag(o); } }, o === null || o === void 0 ? void 0 : o.id); }) }))] })) : "", needs.length > 0 ?
1320
- jsxs("div", __assign({ className: 'tw-col-span-1' }, { children: [jsx("h3", __assign({ className: '-tw-mb-2 tw-col-span-1' }, { children: "Needs" })), jsx("div", __assign({ className: 'tw-flex tw-flex-wrap tw-mb-4' }, { children: needs.map(function (n) { return jsx(TagView, { tag: n, onClick: function () { return addFilterTag(n); } }, n === null || n === void 0 ? void 0 : n.id); }) }))] })) : ""] })) })) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Contact", checked: activeTab == 3 && true, onChange: function () { return setActiveTab(3); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto fade tw-pt-2 tw-pb-1" }, { children: jsx(TextView, { item: item, itemTextField: 'user_created.contact' }) }))] })) }))] }) })));
1321
- }
1322
-
1323
- function SelectBox(props) {
1324
- 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;
1325
- var _a = useState(defaultValue || ""), value = _a[0], setValue = _a[1];
1326
- var updateValue = function (newValue) {
1327
- updateFormValue(newValue);
1328
- setValue(newValue);
1329
- };
1330
- return (jsxs("div", __assign({ className: "tw-inline-block ".concat(containerStyle) }, { children: [labelTitle ?
1331
- jsx("label", __assign({ className: "tw-label ".concat(labelStyle) }, { children: jsxs("div", __assign({ className: "tw-label-text" }, { children: [labelTitle, labelDescription && jsx("div", __assign({ className: "tw-tooltip tw-tooltip-right", "data-tip": labelDescription }, { children: jsx(InformationCircleIcon, { className: 'tw-w-4 tw-h-4' }) }))] })) }))
1332
- : "", jsxs("select", __assign({ className: "tw-select tw-select-bordered tw-w-full", value: value, onChange: function (e) { return updateValue(e.target.value); } }, { children: [jsx("option", __assign({ disabled: true, value: "PLACEHOLDER" }, { children: placeholder })), options.map(function (o, k) {
1333
- return jsx("option", __assign({ value: o.value || o.name }, { children: o.name }), k);
1334
- })] }))] })));
1335
- }
1336
-
1337
1017
  var randomColor = function () {
1338
1018
  return hsvToHex((Math.random() + golden_ratio_conjugate) % 1, 0.8, 0.7);
1339
1019
  };
@@ -1372,1026 +1052,407 @@ var rgbToHex = function (r, g, b) { return '#' + [r, g, b].map(function (x) {
1372
1052
  return hex.length === 1 ? '0' + hex : hex;
1373
1053
  }).join(''); };
1374
1054
 
1375
- var Autocomplete = function (_a) {
1376
- var inputProps = _a.inputProps, suggestions = _a.suggestions, onSelected = _a.onSelected, pushFilteredSuggestions = _a.pushFilteredSuggestions, setFocus = _a.setFocus;
1377
- var _b = React.useState([]), filteredSuggestions = _b[0], setFilteredSuggestions = _b[1];
1378
- var _c = React.useState(0), heighlightedSuggestion = _c[0], setHeighlightedSuggestion = _c[1];
1055
+ var ItemsIndexPage = function (_a) {
1056
+ var api = _a.api, url = _a.url, parameterField = _a.parameterField, breadcrumbs = _a.breadcrumbs, itemNameField = _a.itemNameField, itemTextField = _a.itemTextField, itemImageField = _a.itemImageField, itemSymbolField = _a.itemSymbolField, children = _a.children;
1057
+ console.log(itemSymbolField);
1058
+ var _b = useState(false), loading = _b[0], setLoading = _b[1];
1059
+ var _c = useState(""), addItemPopupType = _c[0], setAddItemPopupType = _c[1];
1060
+ var tabRef = useRef(null);
1061
+ function scroll() {
1062
+ var _a;
1063
+ (_a = tabRef.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView();
1064
+ }
1379
1065
  useEffect(function () {
1380
- pushFilteredSuggestions && setFilteredSuggestions(pushFilteredSuggestions);
1381
- }, [pushFilteredSuggestions]);
1066
+ scroll();
1067
+ }, [addItemPopupType]);
1068
+ var _d = useState([]), items = _d[0], setItems = _d[1];
1069
+ var loadProjects = function () { return __awaiter(void 0, void 0, void 0, function () {
1070
+ var items;
1071
+ return __generator(this, function (_a) {
1072
+ switch (_a.label) {
1073
+ case 0: return [4 /*yield*/, (api === null || api === void 0 ? void 0 : api.getItems())];
1074
+ case 1:
1075
+ items = _a.sent();
1076
+ setItems(items);
1077
+ return [2 /*return*/];
1078
+ }
1079
+ });
1080
+ }); };
1081
+ var assetsApi = useAssetApi();
1082
+ var navigate = useNavigate();
1083
+ var tags = useTags();
1084
+ var addTag = useAddTag();
1085
+ var addItem = useAddItem();
1086
+ var resetFilterTags = useResetFilterTags();
1087
+ var user = useAuth().user;
1382
1088
  useEffect(function () {
1089
+ loadProjects();
1090
+ }, [api]);
1091
+ var layers = useLayers();
1092
+ var submitNewItem = function (evt, type) { return __awaiter(void 0, void 0, void 0, function () {
1093
+ var formItem, uuid, success, error_1;
1383
1094
  var _a;
1384
- setFocus && ((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus());
1385
- }, [setFocus]);
1386
- var inputRef = React.useRef();
1387
- var getSuggestions = function (value) {
1388
- var inputValue = value.trim().toLowerCase();
1389
- var inputLength = inputValue.length;
1390
- return inputLength === 0 ? [] : suggestions.filter(function (tag) {
1391
- return tag.name.toLowerCase().slice(0, inputLength) === inputValue;
1095
+ return __generator(this, function (_b) {
1096
+ switch (_b.label) {
1097
+ case 0:
1098
+ evt.preventDefault();
1099
+ formItem = {};
1100
+ Array.from(evt.target).forEach(function (input) {
1101
+ if (input.name) {
1102
+ formItem[input.name] = input.value;
1103
+ }
1104
+ });
1105
+ setLoading(true);
1106
+ formItem.text && ((_a = formItem.text.toLocaleLowerCase().match(hashTagRegex)) === null || _a === void 0 ? void 0 : _a.map(function (tag) {
1107
+ if (!tags.find(function (t) { return t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase(); })) {
1108
+ addTag({ id: crypto.randomUUID(), name: tag.slice(1), color: randomColor() });
1109
+ }
1110
+ }));
1111
+ uuid = crypto.randomUUID();
1112
+ success = false;
1113
+ _b.label = 1;
1114
+ case 1:
1115
+ _b.trys.push([1, 3, , 4]);
1116
+ return [4 /*yield*/, (api === null || api === void 0 ? void 0 : api.createItem(__assign(__assign({}, formItem), { id: uuid, type: type })))];
1117
+ case 2:
1118
+ _b.sent();
1119
+ success = true;
1120
+ return [3 /*break*/, 4];
1121
+ case 3:
1122
+ error_1 = _b.sent();
1123
+ toast.error(error_1.toString());
1124
+ return [3 /*break*/, 4];
1125
+ case 4:
1126
+ if (success) {
1127
+ addItem(__assign(__assign({}, formItem), { id: uuid, type: type, layer: layers.find(function (l) { return l.name == addItemPopupType; }), user_created: user }));
1128
+ toast.success("New item created");
1129
+ resetFilterTags();
1130
+ }
1131
+ setLoading(false);
1132
+ setAddItemPopupType("");
1133
+ setItems(function (current) { return __spreadArray(__spreadArray([], current, true), [__assign(__assign({}, formItem), { id: uuid, type: type, layer: layers.find(function (l) { return l.name == addItemPopupType; }), user_created: user })], false); });
1134
+ return [2 /*return*/];
1135
+ }
1392
1136
  });
1393
- };
1394
- var handleChange = function (e) {
1395
- setFilteredSuggestions(getSuggestions(e.target.value));
1396
- // Call the parent's onChange handler, if it exists
1397
- if (inputProps.onChange) {
1398
- inputProps.onChange(e);
1399
- }
1400
- };
1401
- function handleSuggestionClick(suggestion) {
1402
- onSelected(suggestion);
1403
- }
1404
- var handleKeyDown = function (event) {
1405
- switch (event.key) {
1406
- case 'ArrowDown':
1407
- heighlightedSuggestion < filteredSuggestions.length - 1 && setHeighlightedSuggestion(function (current) { return current + 1; });
1408
- break;
1409
- case 'ArrowUp':
1410
- heighlightedSuggestion > 0 && setHeighlightedSuggestion(function (current) { return current - 1; });
1411
- break;
1412
- case 'Enter':
1413
- if (filteredSuggestions.length > 0) {
1414
- onSelected(filteredSuggestions[heighlightedSuggestion]);
1415
- setHeighlightedSuggestion(0);
1416
- }
1417
- filteredSuggestions.length == 0 && inputProps.onKeyDown(event);
1418
- break;
1419
- default:
1420
- inputProps.onKeyDown(event);
1421
- break;
1422
- }
1423
- };
1424
- return (jsxs("div", { children: [jsx("input", __assign({ ref: inputRef }, inputProps, { type: "text", onChange: function (e) { return handleChange(e); }, onKeyDown: handleKeyDown })), jsx("ul", __assign({ className: "tw-absolute tw-z-[4000] ".concat(filteredSuggestions.length > 0 && 'tw-bg-base-100 tw-rounded-xl tw-p-2') }, { children: filteredSuggestions.map(function (suggestion, index) { return (jsx("li", __assign({ onClick: function () { return handleSuggestionClick(suggestion); } }, { children: jsx(TagView, { heighlight: index == heighlightedSuggestion, tag: suggestion }) }), index)); }) }))] }));
1137
+ }); };
1138
+ return (jsxs("main", __assign({ className: "tw-flex-1 tw-overflow-y-auto tw-pt-2 tw-px-6 tw-bg-base-200 tw-min-w-80 tw-flex tw-justify-center" }, { children: [jsxs("div", __assign({ className: ' tw-w-full xl:tw-max-w-6xl' }, { children: [breadcrumbs &&
1139
+ jsx("div", __assign({ className: "tw-text-sm tw-breadcrumbs" }, { children: jsx("ul", { children: breadcrumbs.map(function (b, i) { return jsx("li", { children: jsx(Link, __assign({ to: b.path }, { children: b.name })) }, i); }) }) })), jsxs("div", __assign({ className: "tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-3 tw-gap-6 tw-pt-8" }, { children: [items === null || items === void 0 ? void 0 : items.map(function (i, k) {
1140
+ return (jsxs("div", __assign({ className: 'tw-cursor-pointer tw-card tw-border-[1px] tw-border-base-300 tw-card-body tw-shadow-xl tw-bg-base-100 tw-text-base-content tw-p-4 tw-mb-4 tw-h-fit', onClick: function () { return navigate(url + getValue(i, parameterField)); } }, { children: [jsxs("div", __assign({ className: 'tw-grid tw-grid-cols-6 tw-pb-2' }, { children: [jsx("div", __assign({ className: 'tw-col-span-5' }, { children: jsxs("div", __assign({ className: "tw-flex tw-flex-row" }, { children: [getValue(i, itemImageField) ?
1141
+ jsx("div", __assign({ className: "tw-w-10 tw-min-w-[2.5em] tw-rounded-full" }, { children: jsx("img", { className: "tw-rounded-full", src: "".concat(assetsApi.url).concat(getValue(i, itemImageField), "?width=80&height=80") }) }))
1142
+ :
1143
+ "", jsx("b", __assign({ className: "tw-text-xl tw-font-bold ".concat(getValue(i, itemImageField) ? "tw-ml-2 tw-mt-1" : "") }, { children: getValue(i, itemNameField) }))] })) })), jsx("div", { className: 'tw-col-span-1' })] })), jsx("div", __assign({ className: 'tw-overflow-y-auto tw-overflow-x-hidden tw-max-h-64 fade' }, { children: jsx(TextView, { truncate: true, item: i, itemTextField: itemTextField }) }))] }), k));
1144
+ }), addItemPopupType == "project" ?
1145
+ jsx("form", __assign({ ref: tabRef, autoComplete: 'off', onSubmit: function (e) { return submitNewItem(e, addItemPopupType); } }, { children: jsxs("div", __assign({ className: 'tw-cursor-pointer tw-card tw-border-[1px] tw-border-base-300 tw-card-body tw-shadow-xl tw-bg-base-100 tw-text-base-content tw-p-6 tw-mb-10' }, { children: [jsx("label", __assign({ 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 () {
1146
+ setAddItemPopupType("");
1147
+ } }, { children: jsx("p", __assign({ className: 'tw-text-center ' }, { children: "\u2715" })) })), jsx(TextInput, { type: "text", placeholder: "Name", dataField: "name", defaultValue: "", inputStyle: '' }), jsx(TextAreaInput, { placeholder: "Text", dataField: "text", defaultValue: "", inputStyle: 'tw-h-40 tw-mt-5' }), jsx("div", __assign({ className: 'tw-flex tw-justify-center' }, { children: jsx("button", __assign({ className: loading ? 'tw-btn tw-btn-disabled tw-mt-5 tw-place-self-center' : 'tw-btn tw-mt-5 tw-place-self-center', type: 'submit' }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Save' })) }))] })) })) : jsx(Fragment, {})] }))] })), jsx(PlusButton, { triggerAction: function () { setAddItemPopupType("project"); scroll(); }, color: '#777', collection: 'items' }), children] })));
1425
1148
  };
1426
1149
 
1427
- var TagsWidget = function (_a) {
1428
- var placeholder = _a.placeholder, containerStyle = _a.containerStyle, defaultTags = _a.defaultTags, onUpdate = _a.onUpdate;
1429
- var _b = useState(''), input = _b[0], setInput = _b[1];
1430
- var _c = useState(false), isKeyReleased = _c[0], setIsKeyReleased = _c[1];
1431
- var tags = useTags();
1432
- var _d = useState([]), pushFilteredSuggestions = _d[0], setPushFilteredSuggestions = _d[1];
1433
- var _e = useState(false), focusInput = _e[0], setFocusInput = _e[1];
1434
- var onChange = function (e) {
1435
- var value = e.target.value;
1436
- setInput(value);
1437
- };
1438
- var onKeyDown = function (e) {
1439
- var key = e.key;
1440
- var trimmedInput = input.trim();
1441
- if ((key === 'Enter' || key === ',') && trimmedInput.length && !defaultTags.some(function (tag) { return tag.name.toLocaleLowerCase() === trimmedInput.toLocaleLowerCase(); })) {
1442
- e.preventDefault();
1443
- var newTag_1 = tags.find(function (t) { return t.name === trimmedInput.toLocaleLowerCase(); });
1444
- newTag_1 && onUpdate(function (prevState) { return __spreadArray(__spreadArray([], prevState, true), [newTag_1], false); });
1445
- !newTag_1 && onUpdate(function (prevState) { return __spreadArray(__spreadArray([], prevState, true), [{ id: crypto.randomUUID(), name: encodeTag(trimmedInput), color: randomColor() }], false); });
1446
- setInput('');
1447
- setPushFilteredSuggestions([]);
1448
- }
1449
- if (key === "Backspace" && !input.length && defaultTags.length && isKeyReleased) {
1450
- var defaultTagsCopy = __spreadArray([], defaultTags, true);
1451
- var poppedTag = defaultTagsCopy.pop();
1452
- e.preventDefault();
1453
- onUpdate(defaultTagsCopy);
1454
- poppedTag && setInput(poppedTag.name);
1455
- }
1456
- setIsKeyReleased(false);
1457
- };
1458
- var onKeyUp = function () {
1459
- setIsKeyReleased(true);
1460
- };
1461
- var deleteTag = function (tag) {
1462
- onUpdate(function (prevState) { return prevState.filter(function (t) { return t !== tag; }); });
1463
- };
1464
- var onSelected = function (tag) {
1465
- if (!defaultTags.some(function (t) { return t.name.toLocaleLowerCase() === tag.name.toLocaleLowerCase(); })) {
1466
- var newTag_2 = tags.find(function (t) { return t.name.toLocaleLowerCase() === tag.name.toLocaleLowerCase(); });
1467
- newTag_2 && onUpdate(function (prevState) { return __spreadArray(__spreadArray([], prevState, true), [newTag_2], false); });
1468
- !newTag_2 && onUpdate(function (prevState) { return __spreadArray(__spreadArray([], prevState, true), [{ id: crypto.randomUUID(), name: tag.name.toLocaleLowerCase(), color: randomColor() }], false); });
1469
- setInput('');
1470
- setPushFilteredSuggestions([]);
1471
- }
1472
- };
1473
- var inputProps = {
1474
- value: input,
1475
- placeholder: placeholder,
1476
- onKeyDown: onKeyDown,
1477
- onKeyUp: onKeyUp,
1478
- onChange: onChange,
1479
- className: 'tw-bg-transparent tw-w-fit tw-mt-5 tw-h-fit'
1480
- };
1481
- return (jsx("div", __assign({ onClick: function () {
1482
- setFocusInput(true);
1483
- setTimeout(function () {
1484
- setFocusInput(false);
1485
- }, 200);
1486
- }, className: "tw-input tw-input-bordered tw-cursor-text ".concat(containerStyle) }, { children: jsxs("div", __assign({ className: 'tw-flex tw-flex-wrap tw-h-fit' }, { children: [defaultTags.map(function (tag) { return (jsxs("div", __assign({ className: 'tw-rounded-2xl tw-text-white tw-p-2 tw-px-4 tw-shadow-xl tw-card tw-h-[2.75em] tw-mt-3 tw-mr-4', style: { backgroundColor: tag.color ? tag.color : "#666" } }, { children: [jsx("div", __assign({ className: "tw-card-actions tw-justify-end" }, { children: jsx("label", __assign({ 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 (deleteTag(tag)); } }, { children: "\u2715" })) })), jsx("b", { children: decodeTag(tag.name) })] }), tag.name)); }), jsx(Autocomplete, { suggestions: tags, pushFilteredSuggestions: pushFilteredSuggestions, setFocus: focusInput, inputProps: inputProps, onSelected: function (tag) { return onSelected(tag); } })] })) })));
1150
+ var ItemViewPage = function (_a) {
1151
+ var api = _a.api, parents = _a.parents, itemNameField = _a.itemNameField, itemTextField = _a.itemTextField, itemImageField = _a.itemImageField, itemSymbolField = _a.itemSymbolField;
1152
+ var _b = useState(), item = _b[0], setItem = _b[1];
1153
+ var location = useLocation();
1154
+ var loadProject = function () { return __awaiter(void 0, void 0, void 0, function () {
1155
+ var project;
1156
+ return __generator(this, function (_a) {
1157
+ switch (_a.label) {
1158
+ case 0:
1159
+ if (!(api === null || api === void 0 ? void 0 : api.getItem)) return [3 /*break*/, 2];
1160
+ return [4 /*yield*/, (api === null || api === void 0 ? void 0 : api.getItem(location.pathname.split("/")[2]))];
1161
+ case 1:
1162
+ project = _a.sent();
1163
+ setItem(project);
1164
+ _a.label = 2;
1165
+ case 2: return [2 /*return*/];
1166
+ }
1167
+ });
1168
+ }); };
1169
+ useEffect(function () {
1170
+ loadProject();
1171
+ }, [api]);
1172
+ return (jsx(CardPage, __assign({ title: getValue(item, itemNameField) || "", parents: parents }, { children: item &&
1173
+ jsxs(Fragment, { children: [getValue(item, itemImageField) ?
1174
+ jsx("div", __assign({ className: ' tw-h-36 flex items-center justify-center ' }, { children: jsx("img", { className: 'tw-h-24', src: "https://api.utopia-lab.org/assets/".concat(getValue(item, itemImageField)) }) })) :
1175
+ jsx("div", __assign({ className: "tw-h-36 !bg-transparent tw-flex tw-items-center tw-justify-center tw-text-7xl" }, { children: getValue(item, itemSymbolField) })), jsx("p", __assign({ className: 'text-sm mb-2' }, { children: getValue(item, itemTextField) }))] }) })));
1487
1176
  };
1488
1177
 
1489
- var AvatarWidget = function (_a) {
1490
- var avatar = _a.avatar, setAvatar = _a.setAvatar;
1491
- var _b = useState(), crop = _b[0], setCrop = _b[1];
1492
- var _c = useState(""), image = _c[0], setImage = _c[1];
1493
- var _d = useState(false), cropModalOpen = _d[0], setCropModalOpen = _d[1];
1494
- var _e = useState(false), cropping = _e[0], setCropping = _e[1];
1495
- var assetsApi = useAssetApi();
1496
- var imgRef = React.useRef(null);
1497
- var onImageChange = function (event) {
1498
- if (event.target.files && event.target.files[0]) {
1499
- setImage(URL.createObjectURL(event.target.files[0]));
1500
- }
1501
- setCropModalOpen(true);
1502
- };
1503
- function onImageLoad(e) {
1504
- var _a = e.currentTarget, width = _a.width, height = _a.height;
1505
- setCrop(centerAspectCrop(width, height, 1));
1506
- }
1507
- // This is to demonstate how to make and center a % aspect crop
1508
- // which is a bit trickier so we use some helper functions.
1509
- function centerAspectCrop(mediaWidth, mediaHeight, aspect) {
1510
- return centerCrop(makeAspectCrop({
1511
- unit: 'px',
1512
- width: mediaWidth / 2,
1513
- }, aspect, mediaWidth, mediaHeight), mediaWidth, mediaHeight);
1514
- }
1515
- function renderCrop() {
1516
- return __awaiter(this, void 0, void 0, function () {
1517
- var image, scaleX, scaleY, canvas, ctx, pixelRatio, blob;
1518
- return __generator(this, function (_a) {
1519
- switch (_a.label) {
1520
- case 0:
1521
- image = imgRef.current;
1522
- if (!(crop && image)) return [3 /*break*/, 3];
1523
- scaleX = image.naturalWidth / image.width;
1524
- scaleY = image.naturalHeight / image.height;
1525
- canvas = new OffscreenCanvas(crop.width * scaleX, crop.height * scaleY);
1526
- ctx = canvas.getContext("2d");
1527
- pixelRatio = window.devicePixelRatio;
1528
- canvas.width = crop.width * pixelRatio * scaleX;
1529
- canvas.height = crop.height * pixelRatio * scaleY;
1530
- if (ctx) {
1531
- ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
1532
- ctx.drawImage(image, crop.x * scaleX, crop.y * scaleY, crop.width * scaleX, crop.height * scaleY, 0, 0, crop.width * scaleX, crop.height * scaleY);
1533
- }
1534
- return [4 /*yield*/, canvas.convertToBlob()];
1535
- case 1:
1536
- blob = _a.sent();
1537
- return [4 /*yield*/, resizeBlob(blob)];
1538
- case 2:
1539
- _a.sent();
1540
- setCropping(false);
1541
- setImage("");
1542
- _a.label = 3;
1543
- case 3: return [2 /*return*/];
1544
- }
1545
- });
1546
- });
1547
- }
1548
- function resizeBlob(blob) {
1549
- return __awaiter(this, void 0, void 0, function () {
1550
- var img, canvas, ctx, resizedBlob, asset;
1551
- return __generator(this, function (_a) {
1552
- switch (_a.label) {
1553
- case 0:
1554
- img = new Image();
1555
- img.src = URL.createObjectURL(blob);
1556
- return [4 /*yield*/, img.decode()];
1557
- case 1:
1558
- _a.sent();
1559
- canvas = new OffscreenCanvas(400, 400);
1560
- ctx = canvas.getContext("2d");
1561
- ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(img, 0, 0, 400, 400);
1562
- return [4 /*yield*/, canvas.convertToBlob()];
1563
- case 2:
1564
- resizedBlob = _a.sent();
1565
- return [4 /*yield*/, assetsApi.upload(resizedBlob, "test")];
1566
- case 3:
1567
- asset = _a.sent();
1568
- setAvatar(asset.id);
1569
- return [2 /*return*/];
1570
- }
1571
- });
1572
- });
1573
- }
1574
- return (jsxs(Fragment, { children: [!cropping ?
1575
- jsxs("label", __assign({ className: "custom-file-upload" }, { children: [jsx("input", { type: "file", accept: "image/*", className: "tw-file-input tw-w-full tw-max-w-xs", onChange: onImageChange }), jsx("div", __assign({ className: 'button tw-btn tw-btn-lg tw-btn-circle tw-animate-none' }, { children: jsx("svg", __assign({ 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" }, { children: jsx("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" }) })) })), avatar ?
1576
- jsx("div", __assign({ className: 'tw-h-20 tw-w-20' }, { children: jsx("img", { src: assetsApi.url + avatar, className: 'tw-h-20 tw-w-20 tw-rounded-full' }) }))
1577
- :
1578
- jsx("div", __assign({ className: 'tw-h-20 tw-w-20' }, { children: jsxs("svg", __assign({ 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" } }, { children: [jsx("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" }), jsx("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" })] })) }))] }))
1579
- : jsx("div", __assign({ className: 'tw-w-20 tw-flex tw-items-center tw-justify-center' }, { children: jsx("span", { className: "tw-loading tw-loading-spinner" }) })), jsxs(DialogModal, __assign({ title: "", isOpened: cropModalOpen, onClose: function () {
1580
- setCropModalOpen(false);
1581
- setImage("");
1582
- } }, { children: [jsx(ReactCrop, __assign({ crop: crop, onChange: function (c) { return setCrop(c); }, aspect: 1 }, { children: jsx("img", { src: image, ref: imgRef, onLoad: onImageLoad }) })), jsx("button", __assign({ className: "tw-btn tw-btn-primary", onClick: function () {
1583
- setCropping(true);
1584
- setCropModalOpen(false);
1585
- renderCrop();
1586
- } }, { children: "Select" }))] }))] }));
1587
- };
1588
-
1589
- function OverlayProfileSettings() {
1178
+ function LoginPage() {
1590
1179
  var _this = this;
1591
- var _a = useAuth(), user = _a.user, updateUser = _a.updateUser, loading = _a.loading;
1592
- var _b = useState(""), id = _b[0], setId = _b[1];
1593
- var _c = useState(""), name = _c[0], setName = _c[1];
1594
- var _d = useState(""), text = _d[0], setText = _d[1];
1595
- var _e = useState(""), avatar = _e[0], setAvatar = _e[1];
1596
- var _f = useState(""), color = _f[0], setColor = _f[1];
1597
- var _g = useState([]), offers = _g[0], setOffers = _g[1];
1598
- var _h = useState([]), needs = _h[0], setNeeds = _h[1];
1599
- var _j = useState(""), contact = _j[0], setContact = _j[1];
1600
- var _k = useState(1), activeTab = _k[0], setActiveTab = _k[1];
1601
- var items = useItems();
1602
- var updateItem = useUpdateItem();
1603
- var tags = useTags();
1604
- var addTag = useAddTag();
1180
+ var _a = useState(""), email = _a[0], setEmail = _a[1];
1181
+ var _b = useState(""), password = _b[0], setPassword = _b[1];
1182
+ var _c = useAuth(), login = _c.login, loading = _c.loading;
1605
1183
  var navigate = useNavigate();
1606
- React.useEffect(function () {
1607
- setId((user === null || user === void 0 ? void 0 : user.id) ? user.id : "");
1608
- setName((user === null || user === void 0 ? void 0 : user.first_name) ? user.first_name : "");
1609
- setText((user === null || user === void 0 ? void 0 : user.description) ? user.description : "");
1610
- setAvatar((user === null || user === void 0 ? void 0 : user.avatar) ? user === null || user === void 0 ? void 0 : user.avatar : "");
1611
- setColor((user === null || user === void 0 ? void 0 : user.color) ? user.color : "#aabbcc");
1612
- setOffers([]);
1613
- setNeeds([]);
1614
- user === null || user === void 0 ? void 0 : user.offers.map(function (o) {
1615
- var offer = tags.find(function (t) { return t.id === o.tags_id; });
1616
- offer && setOffers(function (current) { return __spreadArray(__spreadArray([], current, true), [offer], false); });
1617
- });
1618
- user === null || user === void 0 ? void 0 : user.needs.map(function (o) {
1619
- var need = tags.find(function (t) { return t.id === o.tags_id; });
1620
- need && setNeeds(function (current) { return __spreadArray(__spreadArray([], current, true), [need], false); });
1621
- });
1622
- setContact((user === null || user === void 0 ? void 0 : user.contact) ? user.contact : "");
1623
- }, [user]);
1624
- var onUpdateUser = function () { return __awaiter(_this, void 0, void 0, function () {
1625
- var changedUser, offer_updates, needs_updates, item, offer_state, needs_state;
1626
- var _a;
1627
- return __generator(this, function (_b) {
1628
- switch (_b.label) {
1629
- case 0:
1630
- changedUser = {};
1631
- offer_updates = [];
1632
- //check for new offers
1633
- offers.map(function (o) {
1634
- var existingOffer = user === null || user === void 0 ? void 0 : user.offers.find(function (t) { return t.tags_id === o.id; });
1635
- existingOffer && offer_updates.push(existingOffer.id);
1636
- if (!existingOffer && !tags.some(function (t) { return t.id === o.id; }))
1637
- addTag(__assign(__assign({}, o), { offer_or_need: true }));
1638
- !existingOffer && offer_updates.push({ directus_user_id: user === null || user === void 0 ? void 0 : user.id, tags_id: o.id });
1639
- });
1640
- needs_updates = [];
1641
- needs.map(function (n) {
1642
- var existingNeed = user === null || user === void 0 ? void 0 : user.needs.find(function (t) { return t.tags_id === n.id; });
1643
- existingNeed && needs_updates.push(existingNeed.id);
1644
- !existingNeed && needs_updates.push({ directus_user_id: user === null || user === void 0 ? void 0 : user.id, tags_id: n.id });
1645
- !existingNeed && !tags.some(function (t) { return t.id === n.id; }) && addTag(__assign(__assign({}, n), { offer_or_need: true }));
1646
- });
1647
- changedUser = __assign(__assign(__assign({ id: id, first_name: name, description: text, contact: contact, color: color }, avatar.length > 10 && { avatar: avatar }), offers.length > 0 && { offers: offer_updates }), needs.length > 0 && { needs: needs_updates });
1648
- item = items.find(function (i) { var _a, _b; return ((_a = i.layer) === null || _a === void 0 ? void 0 : _a.itemOwnerField) && getValue(i, (_b = i.layer) === null || _b === void 0 ? void 0 : _b.itemOwnerField).id === id; });
1649
- offer_state = [];
1650
- needs_state = [];
1651
- return [4 /*yield*/, offers.map(function (o) {
1652
- offer_state.push({ directus_user_id: user === null || user === void 0 ? void 0 : user.id, tags_id: o.id });
1653
- })];
1654
- case 1:
1655
- _b.sent();
1656
- return [4 /*yield*/, needs.map(function (n) {
1657
- needs_state.push({ directus_user_id: user === null || user === void 0 ? void 0 : user.id, tags_id: n.id });
1658
- })];
1659
- case 2:
1660
- _b.sent();
1661
- if (item && item.layer && item.layer.itemOwnerField)
1662
- item[item.layer.itemOwnerField] = __assign(__assign({}, changedUser), { offers: offer_state, needs: needs_state });
1663
- // add new hashtags from profile text
1664
- (_a = text.toLocaleLowerCase().match(hashTagRegex)) === null || _a === void 0 ? void 0 : _a.map(function (tag) {
1665
- if (!tags.find(function (t) { return t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase(); })) {
1666
- addTag({ id: crypto.randomUUID(), name: encodeTag(tag.slice(1).toLocaleLowerCase()), color: randomColor() });
1667
- }
1668
- });
1669
- toast.promise(updateUser(changedUser), {
1670
- pending: 'updating Profile ...',
1671
- success: 'Profile updated',
1184
+ var onLogin = function () { return __awaiter(_this, void 0, void 0, function () {
1185
+ return __generator(this, function (_a) {
1186
+ switch (_a.label) {
1187
+ case 0: return [4 /*yield*/, toast.promise(login({ email: email, password: password }), {
1188
+ success: {
1189
+ render: function (_a) {
1190
+ var data = _a.data;
1191
+ navigate("/");
1192
+ return "Hi ".concat(data === null || data === void 0 ? void 0 : data.first_name);
1193
+ },
1194
+ // other options
1195
+ icon: "✌️",
1196
+ },
1672
1197
  error: {
1673
1198
  render: function (_a) {
1674
1199
  var data = _a.data;
1675
1200
  return "".concat(data);
1676
1201
  },
1677
1202
  },
1678
- })
1679
- .then(function () { return item && updateItem(item); })
1680
- .then(function () { return navigate("/"); });
1203
+ pending: 'logging in ...'
1204
+ })];
1205
+ case 1:
1206
+ _a.sent();
1681
1207
  return [2 /*return*/];
1682
1208
  }
1683
1209
  });
1684
1210
  }); };
1685
- return (jsx(Fragment, { children: jsx(MapOverlayPage, __assign({ backdrop: true, className: 'tw-mx-4 tw-mt-4 tw-mb-12 tw-overflow-x-hidden tw-max-h-[calc(100dvh-96px)] !tw-h-[calc(100dvh-96px)] tw-w-[calc(100%-32px)] md:tw-w-[calc(50%-32px)] tw-max-w-3xl !tw-left-auto tw-top-0 tw-bottom-0' }, { children: jsxs("div", __assign({ className: 'tw-flex tw-flex-col tw-h-full' }, { children: [jsxs("div", __assign({ className: "tw-flex" }, { children: [jsx(AvatarWidget, { avatar: avatar, setAvatar: setAvatar }), jsx(ColorPicker, { color: color, onChange: setColor, className: "-tw-left-6 tw-top-14 -tw-mr-6" }), jsx(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 ' })] })), jsxs("div", __assign({ role: "tablist", className: "tw-tabs tw-tabs-lifted tw-mt-4" }, { children: [jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Vision", checked: activeTab == 1 && true, onChange: function () { return setActiveTab(1); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-border-[var(--fallback-bc,oklch(var(--bc)/0.2))] tw-rounded-box tw-h-[calc(100dvh-332px)] tw-min-h-56" }, { children: jsx(TextAreaInput, { placeholder: "My Vision...", defaultValue: (user === null || user === void 0 ? void 0 : user.description) ? user.description : "", updateFormValue: function (v) { return setText(v); }, containerStyle: 'tw-h-full', inputStyle: 'tw-h-full tw-border-t-0 tw-rounded-tl-none' }) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab tw-min-w-[10em] [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Offers & Needs", checked: activeTab == 2 && true, onChange: function () { return setActiveTab(2); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-pt-4 tw-h-[calc(100dvh-332px)] tw-min-h-56" }, { children: jsxs("div", __assign({ className: 'tw-h-full' }, { children: [jsx("div", __assign({ className: 'tw-w-full tw-h-[calc(50%-0.75em)] tw-mb-4' }, { children: jsx(TagsWidget, { defaultTags: offers, onUpdate: function (v) { return setOffers(v); }, placeholder: "enter your offers", containerStyle: 'tw-bg-transparent tw-w-full tw-h-full tw-mt-3 tw-text-xs tw-h-[calc(100%-1rem)] tw-min-h-[5em] tw-pb-2 tw-overflow-auto' }) })), jsx("div", __assign({ className: 'tw-w-full tw-h-[calc(50%-0.75em)] ' }, { children: jsx(TagsWidget, { defaultTags: needs, onUpdate: function (v) { return setNeeds(v); }, placeholder: "enter your needs", containerStyle: 'tw-bg-transparent tw-w-full tw-h-full tw-mt-3 tw-text-xs tw-h-[calc(100%-1rem)] tw-min-h-[5em] tw-pb-2 tw-overflow-auto' }) }))] })) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Contact", checked: activeTab == 3 && true, onChange: function () { return setActiveTab(3); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-border-[var(--fallback-bc,oklch(var(--bc)/0.2))] tw-rounded-box tw-h-[calc(100dvh-332px)] tw-min-h-56" }, { children: jsx(TextAreaInput, { placeholder: "Contact ...", defaultValue: (user === null || user === void 0 ? void 0 : user.contact) ? user.contact : "", updateFormValue: function (v) { return setContact(v); }, containerStyle: 'tw-h-full', inputStyle: 'tw-h-full tw-border-t-0 ' }) }))] })), jsx("div", __assign({ className: "tw-mt-4 tw-mb-4" }, { children: jsx("button", __assign({ 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(); } }, { children: "Update" })) }))] })) })) }));
1211
+ return (jsxs(MapOverlayPage, __assign({ backdrop: true, className: 'tw-max-w-xs tw-h-fit' }, { children: [jsx("h2", __assign({ className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, { children: "Login" })), jsx("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" }), jsx("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" }), jsx("div", __assign({ className: 'tw-text-right tw-text-primary' }, { children: jsx(Link, __assign({ to: "/reset-password" }, { children: jsx("span", __assign({ className: "tw-text-sm tw-inline-block hover:tw-text-primary hover:tw-underline hover:tw-cursor-pointer tw-transition tw-duration-200" }, { children: "Forgot Password?" })) })) })), jsx("div", __assign({ className: "tw-card-actions" }, { children: jsx("button", __assign({ className: loading ? 'tw-btn tw-btn-disabled tw-btn-block tw-btn-primary' : 'tw-btn tw-btn-primary tw-btn-block', onClick: function () { return onLogin(); } }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Login' })) }))] })));
1686
1212
  }
1687
1213
 
1688
- function OverlayUserSettings() {
1689
- var _a = useAuth(), user = _a.user, updateUser = _a.updateUser, loading = _a.loading; _a.token;
1690
- var _b = useState(""), id = _b[0], setId = _b[1];
1691
- var _c = useState(""), email = _c[0], setEmail = _c[1];
1692
- var _d = useState(""), password = _d[0], setPassword = _d[1];
1693
- var _e = useState(false), passwordChanged = _e[0], setPasswordChanged = _e[1];
1214
+ function SignupPage() {
1215
+ var _this = this;
1216
+ var _a = useState(""), email = _a[0], setEmail = _a[1];
1217
+ var _b = useState(""), userName = _b[0], setUserName = _b[1];
1218
+ var _c = useState(""), password = _c[0], setPassword = _c[1];
1219
+ var _d = useAuth(), register = _d.register, loading = _d.loading;
1694
1220
  var navigate = useNavigate();
1695
- React.useEffect(function () {
1696
- setId((user === null || user === void 0 ? void 0 : user.id) ? user.id : "");
1697
- setEmail((user === null || user === void 0 ? void 0 : user.email) ? user.email : "");
1698
- setPassword((user === null || user === void 0 ? void 0 : user.password) ? user.password : "");
1699
- }, [user]);
1700
- var onUpdateUser = function () {
1701
- var changedUser = {};
1702
- changedUser = __assign({ id: id, email: email }, passwordChanged && { password: password });
1703
- toast.promise(updateUser(changedUser), {
1704
- pending: 'updating Profile ...',
1705
- success: 'Profile updated',
1706
- error: {
1707
- render: function (_a) {
1708
- var data = _a.data;
1709
- return "".concat(data);
1710
- },
1711
- },
1712
- })
1713
- .then(function () { return navigate("/"); });
1714
- };
1715
- return (jsxs(MapOverlayPage, __assign({ backdrop: true, className: 'tw-mx-4 tw-mt-4 tw-max-h-[calc(100dvh-96px)] tw-h-fit md:tw-w-[calc(50%-32px)] tw-w-[calc(100%-32px)] tw-max-w-xl !tw-left-auto tw-top-0 tw-bottom-0' }, { children: [jsx("div", __assign({ className: "tw-text-xl tw-font-semibold" }, { children: "Settings" })), jsx("div", { className: "tw-divider tw-mt-2" }), jsxs("div", __assign({ className: "tw-grid tw-grid-cols-1 tw-gap-6" }, { children: [jsx(TextInput, { type: 'email', placeholder: "new E-Mail", defaultValue: (user === null || user === void 0 ? void 0 : user.email) ? user.email : "", updateFormValue: function (v) { return setEmail(v); } }), jsx(TextInput, { type: 'password', placeholder: "new Password", defaultValue: (user === null || user === void 0 ? void 0 : user.password) ? user.password : "", updateFormValue: function (v) {
1716
- setPassword(v);
1717
- setPasswordChanged(true);
1718
- } })] })), jsx("div", __assign({ className: "tw-mt-8" }, { children: jsx("button", __assign({ 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(); } }, { children: "Update" })) }))] })));
1221
+ var onRegister = function () { return __awaiter(_this, void 0, void 0, function () {
1222
+ return __generator(this, function (_a) {
1223
+ switch (_a.label) {
1224
+ case 0: return [4 /*yield*/, toast.promise(register({ email: email, password: password }, userName), {
1225
+ success: {
1226
+ render: function (_a) {
1227
+ var data = _a.data;
1228
+ navigate("/");
1229
+ return "Hi ".concat(data === null || data === void 0 ? void 0 : data.first_name);
1230
+ },
1231
+ // other options
1232
+ icon: "✌️",
1233
+ },
1234
+ error: {
1235
+ render: function (_a) {
1236
+ var data = _a.data;
1237
+ return "".concat(data);
1238
+ },
1239
+ },
1240
+ pending: 'creating new user ...'
1241
+ })];
1242
+ case 1:
1243
+ _a.sent();
1244
+ return [2 /*return*/];
1245
+ }
1246
+ });
1247
+ }); };
1248
+ return (jsxs(MapOverlayPage, __assign({ backdrop: true, className: 'tw-max-w-xs tw-h-fit' }, { children: [jsx("h2", __assign({ className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, { children: "Sign Up" })), jsx("input", { type: "text", placeholder: "Name", value: userName, onChange: function (e) { return setUserName(e.target.value); }, className: "tw-input tw-input-bordered tw-w-full tw-max-w-xs" }), jsx("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" }), jsx("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" }), jsx("div", __assign({ className: "tw-card-actions tw-mt-4" }, { children: jsx("button", __assign({ 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(); } }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Sign Up' })) }))] })));
1719
1249
  }
1720
1250
 
1721
- function HeaderView(_a) {
1251
+ function RequestPasswordPage(_a) {
1722
1252
  var _this = this;
1723
- var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
1724
- var item = _a.item, setItemFormPopup = _a.setItemFormPopup, _s = _a.hideMenu, hideMenu = _s === void 0 ? false : _s;
1725
- var _t = React.useState(false), modalOpen = _t[0], setModalOpen = _t[1];
1726
- var _u = React.useState(false), loading = _u[0], setLoading = _u[1];
1727
- var removeItem = useRemoveItem();
1728
- var map = useMap();
1729
- var hasUserPermission = useHasUserPermission();
1730
- var user = useAuth().user;
1731
- var assetsApi = useAssetApi();
1253
+ var reset_url = _a.reset_url;
1254
+ var _b = useState(""), email = _b[0], setEmail = _b[1];
1255
+ var _c = useAuth(), requestPasswordReset = _c.requestPasswordReset, loading = _c.loading;
1732
1256
  var navigate = useNavigate();
1733
- var avatar = ((_b = item.layer) === null || _b === void 0 ? void 0 : _b.itemAvatarField) && item && getValue(item, (_c = item.layer) === null || _c === void 0 ? void 0 : _c.itemAvatarField) ? assetsApi.url + getValue(item, (_d = item.layer) === null || _d === void 0 ? void 0 : _d.itemAvatarField) : undefined;
1734
- var title = ((_e = item.layer) === null || _e === void 0 ? void 0 : _e.itemNameField) && item ? getValue(item, (_f = item.layer) === null || _f === void 0 ? void 0 : _f.itemNameField) : undefined;
1735
- var owner = ((_g = item.layer) === null || _g === void 0 ? void 0 : _g.itemOwnerField) && item ? getValue(item, (_h = item.layer) === null || _h === void 0 ? void 0 : _h.itemOwnerField) : undefined;
1736
- var removeItemFromMap = function (event) { return __awaiter(_this, void 0, void 0, function () {
1737
- var success, error_1, params;
1738
- var _a, _b;
1739
- return __generator(this, function (_c) {
1740
- switch (_c.label) {
1741
- case 0:
1742
- setLoading(true);
1743
- success = false;
1744
- _c.label = 1;
1257
+ var onReset = function () { return __awaiter(_this, void 0, void 0, function () {
1258
+ return __generator(this, function (_a) {
1259
+ switch (_a.label) {
1260
+ case 0: return [4 /*yield*/, toast.promise(requestPasswordReset(email, reset_url), {
1261
+ success: {
1262
+ render: function () {
1263
+ navigate("/");
1264
+ return "Check your mailbox";
1265
+ },
1266
+ // other options
1267
+ icon: "📬",
1268
+ },
1269
+ error: {
1270
+ render: function (_a) {
1271
+ var data = _a.data;
1272
+ return "".concat(data);
1273
+ },
1274
+ },
1275
+ pending: 'sending email ...'
1276
+ })];
1745
1277
  case 1:
1746
- _c.trys.push([1, 3, , 4]);
1747
- 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))];
1748
- case 2:
1749
- _c.sent();
1750
- success = true;
1751
- return [3 /*break*/, 4];
1752
- case 3:
1753
- error_1 = _c.sent();
1754
- toast.error(error_1.toString());
1755
- return [3 /*break*/, 4];
1756
- case 4:
1757
- if (success) {
1758
- removeItem(item);
1759
- toast.success("Item deleted");
1760
- }
1761
- setLoading(false);
1762
- map.closePopup();
1763
- params = new URLSearchParams(window.location.search);
1764
- window.history.pushState({}, "", "/" + "".concat(params ? "?".concat(params) : ""));
1765
- event.stopPropagation();
1278
+ _a.sent();
1766
1279
  return [2 /*return*/];
1767
1280
  }
1768
1281
  });
1769
1282
  }); };
1770
- var openDeleteModal = function (event) { return __awaiter(_this, void 0, void 0, function () {
1771
- return __generator(this, function (_a) {
1772
- setModalOpen(true);
1773
- event.stopPropagation();
1774
- return [2 /*return*/];
1775
- });
1776
- }); };
1777
- var openEditPopup = function (event) {
1778
- event.stopPropagation();
1779
- map.closePopup();
1780
- if (setItemFormPopup && item.position)
1781
- setItemFormPopup({ position: new LatLng(item.position.coordinates[1], item.position.coordinates[0]), layer: item.layer, item: item, setItemFormPopup: setItemFormPopup });
1782
- };
1783
- return (jsxs(Fragment, { children: [jsxs("div", __assign({ className: 'tw-grid tw-grid-cols-6 tw-pb-2' }, { children: [jsx("div", __assign({ className: 'tw-col-span-5' }, { children: jsxs("div", __assign({ className: "tw-flex tw-flex-row" }, { children: [avatar ?
1784
- jsx("div", __assign({ className: "tw-w-10 tw-min-w-[2.5em] tw-rounded-full" }, { children: jsx("img", { className: "tw-rounded-full", src: "".concat(avatar, "?width=80&height=80") }) }))
1785
- :
1786
- "", jsx("b", __assign({ className: "tw-text-xl tw-font-bold ".concat(avatar ? "tw-ml-2 tw-mt-1" : "") }, { children: title ? title : item.name }))] })) })), jsx("div", __assign({ className: 'tw-col-span-1' }, { children: (((_k = (_j = item.layer) === null || _j === void 0 ? void 0 : _j.api) === null || _k === void 0 ? void 0 : _k.deleteItem) || ((_m = (_l = item.layer) === null || _l === void 0 ? void 0 : _l.api) === null || _m === void 0 ? void 0 : _m.updateItem))
1787
- && ((user && (owner === null || owner === void 0 ? void 0 : owner.id) === user.id) || owner == undefined)
1788
- && (hasUserPermission((_o = item.layer.api) === null || _o === void 0 ? void 0 : _o.collectionName, "delete") || hasUserPermission((_p = item.layer.api) === null || _p === void 0 ? void 0 : _p.collectionName, "update"))
1789
- && !hideMenu &&
1790
- jsxs("div", __assign({ className: "tw-dropdown tw-dropdown-bottom" }, { children: [jsx("label", __assign({ 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" }, { children: jsx("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" }, { children: jsx("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" }) })) })), jsxs("ul", __assign({ tabIndex: 0, className: "tw-dropdown-content tw-menu tw-p-2 tw-shadow tw-bg-base-100 tw-rounded-box tw-z-1000" }, { children: [((item.layer.api.updateItem && hasUserPermission((_q = item.layer.api) === null || _q === void 0 ? void 0 : _q.collectionName, "update")) || item.layer.customEditLink) && jsx("li", { children: jsx("a", __assign({ className: "!tw-text-base-content tw-cursor-pointer", onClick: function (e) {
1791
- var _a, _b;
1792
- ((_a = item.layer) === null || _a === void 0 ? void 0 : _a.customEditLink) && navigate(item.layer.customEditLink);
1793
- !((_b = item.layer) === null || _b === void 0 ? void 0 : _b.customEditLink) && openEditPopup(e);
1794
- } }, { children: jsx("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" }, { children: jsx("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" }) })) })) }), item.layer.api.deleteItem && hasUserPermission((_r = item.layer.api) === null || _r === void 0 ? void 0 : _r.collectionName, "delete") && jsx("li", { children: jsx("a", __assign({ className: 'tw-cursor-pointer !tw-text-error', onClick: openDeleteModal }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner tw-loading-sm" })
1795
- :
1796
- jsx("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" }, { children: jsx("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" }) })) })) })] }))] })) }))] })), jsxs(DialogModal, __assign({ isOpened: modalOpen, title: "Are you sure?", showCloseButton: false, onClose: function () { return (setModalOpen(false)); } }, { children: [jsxs("span", { children: ["Do you want to delete ", jsx("b", { children: item.name }), "?"] }), jsx("div", __assign({ className: "tw-grid" }, { children: jsxs("div", __assign({ className: "tw-flex tw-justify-between" }, { children: [jsx("label", __assign({ className: "tw-btn tw-mt-4 tw-btn-error", onClick: removeItemFromMap }, { children: "Yes" })), jsx("label", __assign({ className: "tw-btn tw-mt-4", onClick: function () { return setModalOpen(false); } }, { children: "No" }))] })) }))] }))] }));
1797
- }
1798
-
1799
- function PlusButton(_a) {
1800
- var triggerAction = _a.triggerAction, color = _a.color, _b = _a.collection, collection = _b === void 0 ? "items" : _b;
1801
- var hasUserPermission = useHasUserPermission();
1802
- return (jsx(Fragment, { children: hasUserPermission(collection, "create") &&
1803
- jsx("div", __assign({ className: "tw-dropdown tw-dropdown-top tw-dropdown-end tw-dropdown-hover tw-z-500 tw-absolute tw-right-4 tw-bottom-4" }, { children: jsx("button", __assign({ tabIndex: 0, className: "tw-z-500 tw-btn tw-btn-circle tw-shadow", onClick: function () { triggerAction(); }, style: { backgroundColor: color, color: "#fff" } }, { children: jsx("svg", __assign({ 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" }, { children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4.5v15m7.5-7.5h-15" }) })) })) })) }));
1283
+ return (jsxs(MapOverlayPage, __assign({ backdrop: true, className: 'tw-max-w-xs tw-h-fit' }, { children: [jsx("h2", __assign({ className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, { children: "Reset Password" })), jsx("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" }), jsx("div", __assign({ className: "tw-card-actions tw-mt-4" }, { children: jsx("button", __assign({ className: loading ? 'tw-btn tw-btn-disabled tw-btn-block tw-btn-primary' : 'tw-btn tw-btn-primary tw-btn-block', onClick: function () { return onReset(); } }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Send' })) }))] })));
1804
1284
  }
1805
1285
 
1806
- function OverlayItemProfile() {
1286
+ function SetNewPasswordPage() {
1807
1287
  var _this = this;
1808
- var _a, _b, _c, _d, _e;
1809
- var location = useLocation();
1810
- var items = useItems();
1811
- var updateItem = useUpdateItem();
1812
- var _f = useState({}), item = _f[0], setItem = _f[1];
1813
- var map = useMap();
1814
- var windowDimension = useWindowDimensions();
1815
- useLayers();
1816
- var tags = useTags();
1288
+ var _a = useState(""), password = _a[0], setPassword = _a[1];
1289
+ var _b = useAuth(), passwordReset = _b.passwordReset, loading = _b.loading;
1817
1290
  var navigate = useNavigate();
1818
- var _g = useState(); _g[0]; var setOwner = _g[1];
1819
- var _h = useState([]); _h[0]; var setOffers = _h[1];
1820
- var _j = useState([]); _j[0]; var setNeeds = _j[1];
1821
- var _k = useState([]), relations = _k[0], setRelations = _k[1];
1822
- var _l = useState(1), activeTab = _l[0], setActiveTab = _l[1];
1823
- var _m = useState(""), addItemPopupType = _m[0], setAddItemPopupType = _m[1];
1824
- var _o = useState(false), loading = _o[0], setLoading = _o[1];
1825
- var addTag = useAddTag();
1826
- var resetFilterTags = useResetFilterTags();
1827
- var addItem = useAddItem();
1828
- var user = useAuth().user;
1829
- var hasUserPermission = useHasUserPermission();
1830
- var tabRef = useRef(null);
1831
- function scroll() {
1832
- var _a;
1833
- (_a = tabRef.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView();
1834
- }
1835
- useEffect(function () {
1836
- scroll();
1837
- }, [addItemPopupType]);
1838
- useEffect(function () {
1839
- var itemId = location.pathname.split("/")[2];
1840
- var item = items.find(function (i) { return i.id === itemId; });
1841
- item && setItem(item);
1842
- var bounds = map.getBounds();
1843
- var x = bounds.getEast() - bounds.getWest();
1844
- if (windowDimension.width > 768)
1845
- if ((item === null || item === void 0 ? void 0 : item.position) && (item === null || item === void 0 ? void 0 : item.position.coordinates[0]))
1846
- map.setView(new LatLng(item === null || item === void 0 ? void 0 : item.position.coordinates[1], (item === null || item === void 0 ? void 0 : item.position.coordinates[0]) + x / 4));
1847
- }, [location, items, activeTab]);
1848
- useEffect(function () {
1849
- setActiveTab(1);
1850
- }, [location]);
1851
- useEffect(function () {
1852
- var _a, _b, _c, _d, _e;
1853
- setOffers([]);
1854
- setNeeds([]);
1855
- setRelations([]);
1856
- setOwner(undefined);
1857
- ((_a = item === null || item === void 0 ? void 0 : item.layer) === null || _a === void 0 ? void 0 : _a.itemOwnerField) && setOwner(getValue(item, (_b = item.layer) === null || _b === void 0 ? void 0 : _b.itemOwnerField));
1858
- ((_c = item.layer) === null || _c === void 0 ? void 0 : _c.itemOffersField) && getValue(item, item.layer.itemOffersField).map(function (o) {
1859
- var tag = tags.find(function (t) { return t.id === o.tags_id; });
1860
- tag && setOffers(function (current) { return __spreadArray(__spreadArray([], current, true), [tag], false); });
1861
- });
1862
- ((_d = item.layer) === null || _d === void 0 ? void 0 : _d.itemNeedsField) && getValue(item, item.layer.itemNeedsField).map(function (n) {
1863
- var tag = tags.find(function (t) { return t.id === n.tags_id; });
1864
- tag && setNeeds(function (current) { return __spreadArray(__spreadArray([], current, true), [tag], false); });
1865
- });
1866
- (_e = item.relations) === null || _e === void 0 ? void 0 : _e.map(function (r) {
1867
- var item = items.find(function (i) { return i.id == r.related_items_id; });
1868
- item && setRelations(function (current) { return __spreadArray(__spreadArray([], current, true), [item], false); });
1869
- });
1870
- }, [item]);
1871
- var submitNewItem = function (evt, type) { return __awaiter(_this, void 0, void 0, function () {
1872
- var formItem, uuid, success, error_1;
1873
- var _a, _b, _c;
1874
- return __generator(this, function (_d) {
1875
- switch (_d.label) {
1876
- case 0:
1877
- evt.preventDefault();
1878
- formItem = {};
1879
- Array.from(evt.target).forEach(function (input) {
1880
- if (input.name) {
1881
- formItem[input.name] = input.value;
1882
- }
1883
- });
1884
- setLoading(true);
1885
- formItem.text && ((_a = formItem.text.toLocaleLowerCase().match(hashTagRegex)) === null || _a === void 0 ? void 0 : _a.map(function (tag) {
1886
- if (!tags.find(function (t) { return t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase(); })) {
1887
- addTag({ id: crypto.randomUUID(), name: tag.slice(1), color: randomColor() });
1888
- }
1889
- }));
1890
- uuid = crypto.randomUUID();
1891
- success = false;
1892
- _d.label = 1;
1893
- case 1:
1894
- _d.trys.push([1, 4, , 5]);
1895
- return [4 /*yield*/, ((_c = (_b = item === null || item === void 0 ? void 0 : item.layer) === null || _b === void 0 ? void 0 : _b.api) === null || _c === void 0 ? void 0 : _c.createItem(__assign(__assign({}, formItem), { id: uuid, type: type })))];
1896
- case 2:
1897
- _d.sent();
1898
- return [4 /*yield*/, linkItem(uuid)];
1899
- case 3:
1900
- _d.sent();
1901
- success = true;
1902
- return [3 /*break*/, 5];
1903
- case 4:
1904
- error_1 = _d.sent();
1905
- toast.error(error_1.toString());
1906
- return [3 /*break*/, 5];
1907
- case 5:
1908
- if (success) {
1909
- addItem(__assign(__assign({}, formItem), { id: uuid, type: type, layer: item === null || item === void 0 ? void 0 : item.layer, user_created: user }));
1910
- toast.success("New item created");
1911
- resetFilterTags();
1912
- }
1913
- setLoading(false);
1914
- setAddItemPopupType("");
1915
- return [2 /*return*/];
1916
- }
1917
- });
1918
- }); };
1919
- var linkItem = function (id) { return __awaiter(_this, void 0, void 0, function () {
1920
- var new_relations, updatedItem;
1921
- var _a, _b;
1922
- return __generator(this, function (_c) {
1923
- switch (_c.label) {
1291
+ var onReset = function () { return __awaiter(_this, void 0, void 0, function () {
1292
+ var token;
1293
+ return __generator(this, function (_a) {
1294
+ switch (_a.label) {
1924
1295
  case 0:
1925
- new_relations = item.relations;
1926
- new_relations === null || new_relations === void 0 ? void 0 : new_relations.push({ items_id: item.id, related_items_id: id });
1927
- updatedItem = { id: item.id, relations: new_relations };
1928
- return [4 /*yield*/, ((_b = (_a = item === null || item === void 0 ? void 0 : item.layer) === null || _a === void 0 ? void 0 : _a.api) === null || _b === void 0 ? void 0 : _b.updateItem(updatedItem))];
1296
+ token = window.location.search.split("token=")[1];
1297
+ console.log(token);
1298
+ return [4 /*yield*/, toast.promise(passwordReset(token, password), {
1299
+ success: {
1300
+ render: function () {
1301
+ navigate("/");
1302
+ return "New password set";
1303
+ },
1304
+ },
1305
+ error: {
1306
+ render: function (_a) {
1307
+ var data = _a.data;
1308
+ return "".concat(data);
1309
+ },
1310
+ },
1311
+ pending: 'setting password ...'
1312
+ })];
1929
1313
  case 1:
1930
- _c.sent();
1931
- updateItem(__assign(__assign({}, item), { relations: new_relations }));
1314
+ _a.sent();
1932
1315
  return [2 /*return*/];
1933
1316
  }
1934
1317
  });
1935
1318
  }); };
1936
- return (jsx(MapOverlayPage, __assign({ className: 'tw-mx-4 tw-mt-4 tw-max-h-[calc(100dvh-96px)] tw-h-[calc(100dvh-96px)] md:tw-w-[calc(50%-32px)] tw-w-[calc(100%-32px)] tw-max-w-3xl !tw-left-auto tw-top-0 tw-bottom-0' }, { children: item &&
1937
- jsxs(Fragment, { children: [jsxs("div", __assign({ className: 'tw-flex tw-flex-row' }, { children: [jsx("div", __assign({ className: "tw-grow" }, { children: jsxs("p", __assign({ className: "tw-text-3xl tw-font-semibold" }, { children: [((_a = item.layer) === null || _a === void 0 ? void 0 : _a.itemAvatarField) && getValue(item, item.layer.itemAvatarField) && jsx("img", { className: 'tw-w-20 tw-h-20 tw-rounded-full tw-inline', src: "https://api.utopia-lab.org/assets/".concat(getValue(item, item.layer.itemAvatarField), "?width=160&heigth=160") }), " ", ((_b = item.layer) === null || _b === void 0 ? void 0 : _b.itemNameField) && getValue(item, item.layer.itemNameField)] })) })), (((_d = (_c = item.layer) === null || _c === void 0 ? void 0 : _c.api) === null || _d === void 0 ? void 0 : _d.updateItem) && hasUserPermission((_e = item.layer.api) === null || _e === void 0 ? void 0 : _e.collectionName, "update")) ?
1938
- jsx("a", __assign({ className: 'tw-self-center tw-btn tw-btn-sm tw-mr-4 tw-cursor-pointer', onClick: function () { return navigate("/edit-item/" + item.id); } }, { children: jsx("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" }, { children: jsx("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" }) })) })) : ""] })), jsx("div", __assign({ className: 'tw-h-full' }, { children: jsxs("div", __assign({ role: "tablist", className: "tw-tabs tw-tabs-lifted tw-mt-2 tw-mb-2" }, { children: [jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Info", checked: activeTab == 1 && true, onChange: function () { return setActiveTab(1); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto fade tw-pt-2 tw-pb-1" }, { children: jsx(TextView, { item: item }) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Projects", checked: activeTab == 2 && true, onChange: function () { return setActiveTab(2); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto tw-pt-4 tw-pb-1 -tw-mx-4" }, { children: jsx("div", __assign({ className: 'tw-h-full' }, { children: jsxs("div", __assign({ className: 'tw-grid tw-grid-cols-1 sm:tw-grid-cols-2 md:tw-grid-cols-1 lg:tw-grid-cols-1 xl:tw-grid-cols-2' }, { children: [relations && relations.map(function (i) {
1939
- if (i.type == 'project')
1940
- return (jsxs("div", __assign({ className: 'tw-cursor-pointer tw-card tw-border-[1px] tw-border-base-300 tw-card-body tw-shadow-xl tw-bg-base-100 tw-text-base-content tw-mx-4 tw-p-4 tw-mb-4 tw-h-fit', onClick: function () { return navigate('/item/' + i.id); } }, { children: [jsx(HeaderView, { item: i }), jsx("div", __assign({ className: 'tw-overflow-y-auto tw-overflow-x-hidden tw-max-h-64 fade' }, { children: jsx(TextView, { truncate: true, item: i }) }))] }), i.id));
1941
- else
1942
- return null;
1943
- }), addItemPopupType == "project" ?
1944
- jsx("form", __assign({ ref: tabRef, autoComplete: 'off', onSubmit: function (e) { return submitNewItem(e, addItemPopupType); } }, { children: jsxs("div", __assign({ className: 'tw-cursor-pointer tw-card tw-border-[1px] tw-border-base-300 tw-card-body tw-shadow-xl tw-bg-base-100 tw-text-base-content tw-mx-4 tw-p-6 tw-mb-4' }, { children: [jsx("label", __assign({ 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 () {
1945
- setAddItemPopupType("");
1946
- } }, { children: jsx("p", __assign({ className: 'tw-text-center ' }, { children: "\u2715" })) })), jsx(TextInput, { type: "text", placeholder: "Name", dataField: "name", defaultValue: "", inputStyle: '' }), jsx(TextAreaInput, { placeholder: "Text", dataField: "text", defaultValue: "", inputStyle: 'tw-h-40 tw-mt-5' }), jsx("div", __assign({ className: 'tw-flex tw-justify-center' }, { children: jsx("button", __assign({ className: loading ? 'tw-btn tw-btn-disabled tw-mt-5 tw-place-self-center' : 'tw-btn tw-mt-5 tw-place-self-center', type: 'submit' }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Save' })) }))] })) })) : jsx(Fragment, {}), jsx(PlusButton, { triggerAction: function () { setAddItemPopupType("project"); scroll(); }, color: item.color })] })) })) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Events", checked: activeTab == 3 && true, onChange: function () { return setActiveTab(3); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto tw-pt-4 tw-pb-1" }, { children: jsx("div", __assign({ className: 'tw-h-full' }, { children: jsxs("div", __assign({ className: 'tw-grid tw-grid-cols-1 sm:tw-grid-cols-2 md:tw-grid-cols-1 lg:tw-grid-cols-1 xl:tw-grid-cols-2' }, { children: [relations && relations.map(function (i) {
1947
- if (i.type == 'event')
1948
- return (jsxs("div", __assign({ className: 'tw-cursor-pointer tw-card tw-border-[1px] tw-border-base-300 tw-card-body tw-shadow-xl tw-bg-base-100 tw-text-base-content tw-mx-4 tw-p-6 tw-mb-4', onClick: function () { return navigate('/item/' + i.id); } }, { children: [jsx(HeaderView, { item: i, hideMenu: true }), jsxs("div", __assign({ className: 'tw-overflow-y-auto tw-overflow-x-hidden tw-max-h-64 fade' }, { children: [jsx(StartEndView, { item: i }), jsx(TextView, { truncate: true, item: i })] }))] }), i.id));
1949
- else
1950
- return null;
1951
- }), addItemPopupType == "event" ?
1952
- jsx("form", __assign({ autoComplete: 'off', onSubmit: function (e) { return submitNewItem(e, addItemPopupType); } }, { children: jsxs("div", __assign({ className: 'tw-cursor-pointer tw-card tw-border-[1px] tw-border-base-300 tw-card-body tw-shadow-xl tw-bg-base-100 tw-text-base-content tw-mx-4 tw-p-4 tw-mb-4' }, { children: [jsx("label", __assign({ 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 () {
1953
- setAddItemPopupType("");
1954
- } }, { children: jsx("p", __assign({ className: 'tw-text-center ' }, { children: "\u2715" })) })), jsx(TextInput, { type: "text", placeholder: "Name", dataField: "name", defaultValue: "", inputStyle: '' }), jsx(PopupStartEndInput, {}), jsx(TextAreaInput, { placeholder: "Text", dataField: "text", defaultValue: "", inputStyle: 'tw-h-40 tw-mt-5' }), jsx("div", __assign({ className: 'tw-flex tw-justify-center' }, { children: jsx("button", __assign({ className: loading ? 'tw-btn tw-btn-disabled tw-mt-5 tw-place-self-center' : 'tw-btn tw-mt-5 tw-place-self-center', type: 'submit' }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Save' })) }))] })) })) : jsx(Fragment, {}), jsx(PlusButton, { triggerAction: function () { setAddItemPopupType("event"); scroll(); }, color: item.color })] })) })) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Friends", checked: activeTab == 4 && true, onChange: function () { return setActiveTab(4); } }), jsx("div", { role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto fade tw-pt-2 tw-pb-1" })] })) }))] }) })));
1319
+ return (jsxs(MapOverlayPage, __assign({ backdrop: true, className: 'tw-max-w-xs tw-h-fit' }, { children: [jsx("h2", __assign({ className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, { children: "Set new Password" })), jsx("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" }), jsx("div", __assign({ className: "tw-card-actions tw-mt-4" }, { children: jsx("button", __assign({ className: loading ? 'tw-btn tw-btn-disabled tw-btn-block tw-btn-primary' : 'tw-btn tw-btn-primary tw-btn-block', onClick: function () { return onReset(); } }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Set' })) }))] })));
1955
1320
  }
1956
1321
 
1957
- function OverlayItemProfileSettings() {
1322
+ var PermissionContext = createContext({
1323
+ permissions: [],
1324
+ setPermissionApi: function () { },
1325
+ setPermissionData: function () { },
1326
+ setAdminRole: function () { },
1327
+ hasUserPermission: function () { return true; }
1328
+ });
1329
+ function usePermissionsManager(initialPermissions) {
1958
1330
  var _this = this;
1959
- var _a = useState(""), id = _a[0], setId = _a[1];
1960
- var _b = useState(""), name = _b[0], setName = _b[1];
1961
- var _c = useState(""), text = _c[0], setText = _c[1];
1962
- var _d = useState(""), image = _d[0], setImage = _d[1];
1963
- var _e = useState(""), color = _e[0], setColor = _e[1];
1964
- var _f = useState(1), activeTab = _f[0], setActiveTab = _f[1];
1965
- var _g = useState(false), loading = _g[0], setLoading = _g[1];
1966
- var updateItem = useUpdateItem();
1967
- var location = useLocation();
1968
- var items = useItems();
1969
- var _h = useState({}), item = _h[0], setItem = _h[1];
1970
- var tags = useTags();
1971
- var addTag = useAddTag();
1972
- var navigate = useNavigate();
1973
- useEffect(function () {
1974
- var itemId = location.pathname.split("/")[2];
1975
- var item = items.find(function (i) { return i.id === itemId; });
1976
- item && setItem(item);
1977
- }, [location, items, activeTab]);
1978
- React.useEffect(function () {
1979
- var _a, _b, _c;
1980
- if ((_a = item.layer) === null || _a === void 0 ? void 0 : _a.itemColorField)
1981
- setColor(getValue(item, (_b = item.layer) === null || _b === void 0 ? void 0 : _b.itemColorField));
1982
- else
1983
- setColor(((_c = item.layer) === null || _c === void 0 ? void 0 : _c.markerDefaultColor) || "#000");
1984
- setId((item === null || item === void 0 ? void 0 : item.id) ? item.id : "");
1985
- setName((item === null || item === void 0 ? void 0 : item.name) ? item.name : "");
1986
- setText((item === null || item === void 0 ? void 0 : item.text) ? item.text : "");
1987
- setImage((item === null || item === void 0 ? void 0 : item.image) ? item === null || item === void 0 ? void 0 : item.image : "");
1988
- }, [item]);
1989
- var onUpdateItem = function () { return __awaiter(_this, void 0, void 0, function () {
1990
- var changedItem;
1991
- var _a, _b, _c, _d, _e;
1992
- return __generator(this, function (_f) {
1993
- changedItem = {};
1994
- changedItem = __assign({ id: id, name: name, text: text, color: color, position: item.position }, image.length > 10 && { image: image });
1995
- // update profile item in current state
1996
- //const item = items.find(i => i.layer?.itemOwnerField && getValue(i, i.layer?.itemOwnerField).id === id);
1997
- // if (item && item.layer && item.layer.itemOwnerField) item[item.layer.itemOwnerField] = {... changedUser, offers: offer_state, needs: needs_state};
1998
- // add new hashtags from profile text
1999
- (_a = text.toLocaleLowerCase().match(hashTagRegex)) === null || _a === void 0 ? void 0 : _a.map(function (tag) {
2000
- if (!tags.find(function (t) { return t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase(); })) {
2001
- addTag({ id: crypto.randomUUID(), name: encodeTag(tag.slice(1).toLocaleLowerCase()), color: randomColor() });
2002
- }
2003
- });
2004
- setLoading(true);
2005
- ((_c = (_b = item === null || item === void 0 ? void 0 : item.layer) === null || _b === void 0 ? void 0 : _b.api) === null || _c === void 0 ? void 0 : _c.updateItem) && toast.promise((_e = (_d = item === null || item === void 0 ? void 0 : item.layer) === null || _d === void 0 ? void 0 : _d.api) === null || _e === void 0 ? void 0 : _e.updateItem(changedItem), {
2006
- pending: 'updating Item ...',
2007
- success: 'Item updated',
2008
- error: {
2009
- render: function (_a) {
2010
- var data = _a.data;
2011
- return "".concat(data);
2012
- },
2013
- },
2014
- })
2015
- .then(function () { return item && updateItem(__assign(__assign({}, item), changedItem)); })
2016
- .then(function () {
2017
- setLoading(false);
2018
- navigate("/item/" + item.id);
2019
- });
2020
- return [2 /*return*/];
2021
- });
2022
- }); };
2023
- return (jsx(Fragment, { children: jsx(MapOverlayPage, __assign({ backdrop: true, className: 'tw-mx-4 tw-mt-4 tw-mb-12 tw-overflow-x-hidden tw-max-h-[calc(100dvh-96px)] !tw-h-[calc(100dvh-96px)] tw-w-[calc(100%-32px)] md:tw-w-[calc(50%-32px)] tw-max-w-3xl !tw-left-auto tw-top-0 tw-bottom-0' }, { children: jsxs("div", __assign({ className: 'tw-flex tw-flex-col tw-h-full' }, { children: [jsxs("div", __assign({ className: "tw-flex" }, { children: [jsx(AvatarWidget, { avatar: image, setAvatar: setImage }), jsx(ColorPicker, { color: color, onChange: setColor, className: "-tw-left-6 tw-top-14 -tw-mr-6" }), jsx(TextInput, { placeholder: "Name", defaultValue: (item === null || item === void 0 ? void 0 : item.name) ? item.name : "", updateFormValue: function (v) { return setName(v); }, containerStyle: 'tw-grow tw-ml-6 tw-my-auto ' })] })), jsxs("div", __assign({ role: "tablist", className: "tw-tabs tw-tabs-lifted tw-mt-4" }, { children: [jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Vision", checked: activeTab == 1 && true, onChange: function () { return setActiveTab(1); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-border-[var(--fallback-bc,oklch(var(--bc)/0.2))] tw-rounded-box tw-h-[calc(100dvh-332px)] tw-min-h-56" }, { children: jsx(TextAreaInput, { placeholder: "My Vision...", defaultValue: (item === null || item === void 0 ? void 0 : item.text) ? item.text : "", updateFormValue: function (v) { console.log(v); setText(v); }, containerStyle: 'tw-h-full', inputStyle: 'tw-h-full tw-border-t-0 tw-rounded-tl-none' }) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Projects", checked: activeTab == 2 && true, onChange: function () { return setActiveTab(2); } }), jsx("div", { role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-pt-4 tw-h-[calc(100dvh-332px)] tw-min-h-56" }), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Events", checked: activeTab == 3 && true, onChange: function () { return setActiveTab(3); } }), jsx("div", { role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-border-[var(--fallback-bc,oklch(var(--bc)/0.2))] tw-rounded-box tw-h-[calc(100dvh-332px)] tw-min-h-56" }), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Friends", checked: activeTab == 4 && true, onChange: function () { return setActiveTab(4); } }), jsx("div", { role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-border-[var(--fallback-bc,oklch(var(--bc)/0.2))] tw-rounded-box tw-h-[calc(100dvh-332px)] tw-min-h-56" })] })), jsx("div", __assign({ className: "tw-mt-4 tw-mb-4" }, { children: jsx("button", __assign({ 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 onUpdateItem(); } }, { children: "Update" })) }))] })) })) }));
2024
- }
2025
-
2026
- var ItemsIndexPage = function (_a) {
2027
- var api = _a.api, url = _a.url, parameterField = _a.parameterField, breadcrumbs = _a.breadcrumbs, itemNameField = _a.itemNameField, itemTextField = _a.itemTextField, itemImageField = _a.itemImageField, itemSymbolField = _a.itemSymbolField;
2028
- console.log(itemSymbolField);
2029
- var _b = useState(false), loading = _b[0], setLoading = _b[1];
2030
- var _c = useState(""), addItemPopupType = _c[0], setAddItemPopupType = _c[1];
2031
- var tabRef = useRef(null);
2032
- function scroll() {
2033
- var _a;
2034
- (_a = tabRef.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView();
2035
- }
2036
- useEffect(function () {
2037
- scroll();
2038
- }, [addItemPopupType]);
2039
- var _d = useState([]), items = _d[0], setItems = _d[1];
2040
- var loadProjects = function () { return __awaiter(void 0, void 0, void 0, function () {
2041
- var items;
1331
+ var _a = useReducer(function (state, action) {
1332
+ switch (action.type) {
1333
+ case "ADD":
1334
+ var exist = state.find(function (permission) {
1335
+ return permission.id === action.permission.id ? true : false;
1336
+ });
1337
+ if (!exist)
1338
+ return __spreadArray(__spreadArray([], state, true), [
1339
+ action.permission,
1340
+ ], false);
1341
+ else
1342
+ return state;
1343
+ case "REMOVE":
1344
+ return state.filter(function (_a) {
1345
+ var id = _a.id;
1346
+ return id !== action.id;
1347
+ });
1348
+ default:
1349
+ throw new Error();
1350
+ }
1351
+ }, initialPermissions), permissions = _a[0], dispatch = _a[1];
1352
+ var _b = React.useState(null), adminRole = _b[0], setAdminRole = _b[1];
1353
+ var user = useAuth().user;
1354
+ var setPermissionApi = useCallback(function (api) { return __awaiter(_this, void 0, void 0, function () {
1355
+ var result;
2042
1356
  return __generator(this, function (_a) {
2043
1357
  switch (_a.label) {
2044
- case 0: return [4 /*yield*/, (api === null || api === void 0 ? void 0 : api.getItems())];
2045
- case 1:
2046
- items = _a.sent();
2047
- setItems(items);
2048
- return [2 /*return*/];
2049
- }
2050
- });
2051
- }); };
2052
- var assetsApi = useAssetApi();
2053
- var navigate = useNavigate();
2054
- var tags = useTags();
2055
- var addTag = useAddTag();
2056
- var addItem = useAddItem();
2057
- var resetFilterTags = useResetFilterTags();
2058
- var user = useAuth().user;
2059
- useEffect(function () {
2060
- loadProjects();
2061
- }, [api]);
2062
- var layers = useLayers();
2063
- var submitNewItem = function (evt, type) { return __awaiter(void 0, void 0, void 0, function () {
2064
- var formItem, uuid, success, error_1;
2065
- var _a;
2066
- return __generator(this, function (_b) {
2067
- switch (_b.label) {
2068
- case 0:
2069
- evt.preventDefault();
2070
- formItem = {};
2071
- Array.from(evt.target).forEach(function (input) {
2072
- if (input.name) {
2073
- formItem[input.name] = input.value;
2074
- }
2075
- });
2076
- setLoading(true);
2077
- formItem.text && ((_a = formItem.text.toLocaleLowerCase().match(hashTagRegex)) === null || _a === void 0 ? void 0 : _a.map(function (tag) {
2078
- if (!tags.find(function (t) { return t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase(); })) {
2079
- addTag({ id: crypto.randomUUID(), name: tag.slice(1), color: randomColor() });
2080
- }
2081
- }));
2082
- uuid = crypto.randomUUID();
2083
- success = false;
2084
- _b.label = 1;
1358
+ case 0: return [4 /*yield*/, api.getItems()];
2085
1359
  case 1:
2086
- _b.trys.push([1, 3, , 4]);
2087
- return [4 /*yield*/, (api === null || api === void 0 ? void 0 : api.createItem(__assign(__assign({}, formItem), { id: uuid, type: type })))];
2088
- case 2:
2089
- _b.sent();
2090
- success = true;
2091
- return [3 /*break*/, 4];
2092
- case 3:
2093
- error_1 = _b.sent();
2094
- toast.error(error_1.toString());
2095
- return [3 /*break*/, 4];
2096
- case 4:
2097
- if (success) {
2098
- addItem(__assign(__assign({}, formItem), { id: uuid, type: type, layer: layers.find(function (l) { return l.name == addItemPopupType; }), user_created: user }));
2099
- toast.success("New item created");
2100
- resetFilterTags();
1360
+ result = _a.sent();
1361
+ if (result) {
1362
+ result.map(function (permission) {
1363
+ dispatch({ type: "ADD", permission: permission });
1364
+ });
2101
1365
  }
2102
- setLoading(false);
2103
- setAddItemPopupType("");
2104
- setItems(function (current) { return __spreadArray(__spreadArray([], current, true), [__assign(__assign({}, formItem), { id: uuid, type: type, layer: layers.find(function (l) { return l.name == addItemPopupType; }), user_created: user })], false); });
2105
1366
  return [2 /*return*/];
2106
1367
  }
2107
1368
  });
2108
- }); };
2109
- return (jsxs("main", __assign({ className: "tw-flex-1 tw-overflow-y-auto tw-pt-2 tw-px-6 tw-bg-base-200 tw-min-w-80 tw-flex tw-justify-center" }, { children: [jsxs("div", __assign({ className: ' tw-w-full xl:tw-max-w-6xl' }, { children: [breadcrumbs &&
2110
- jsx("div", __assign({ className: "tw-text-sm tw-breadcrumbs" }, { children: jsx("ul", { children: breadcrumbs.map(function (b, i) { return jsx("li", { children: jsx(Link, __assign({ to: b.path }, { children: b.name })) }, i); }) }) })), jsxs("div", __assign({ className: "tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-3 tw-gap-6 tw-pt-8" }, { children: [items === null || items === void 0 ? void 0 : items.map(function (i, k) {
2111
- return (jsx(Link, __assign({ to: url + getValue(i, parameterField) }, { children: jsxs("div", __assign({ className: 'tw-cursor-pointer tw-card tw-border-[1px] tw-border-base-300 tw-card-body tw-shadow-xl tw-bg-base-100 tw-text-base-content tw-p-4 tw-mb-4 tw-h-fit', onClick: function () { return navigate('/item/' + i.id); } }, { children: [jsxs("div", __assign({ className: 'tw-grid tw-grid-cols-6 tw-pb-2' }, { children: [jsx("div", __assign({ className: 'tw-col-span-5' }, { children: jsxs("div", __assign({ className: "tw-flex tw-flex-row" }, { children: [getValue(i, itemImageField) ?
2112
- jsx("div", __assign({ className: "tw-w-10 tw-min-w-[2.5em] tw-rounded-full" }, { children: jsx("img", { className: "tw-rounded-full", src: "".concat(assetsApi.url).concat(getValue(i, itemImageField), "?width=80&height=80") }) }))
2113
- :
2114
- "", jsx("b", __assign({ className: "tw-text-xl tw-font-bold ".concat(getValue(i, itemImageField) ? "tw-ml-2 tw-mt-1" : "") }, { children: getValue(i, itemNameField) }))] })) })), jsx("div", { className: 'tw-col-span-1' })] })), jsx("div", __assign({ className: 'tw-overflow-y-auto tw-overflow-x-hidden tw-max-h-64 fade' }, { children: jsx(TextView, { truncate: true, item: i, itemTextField: itemTextField }) }))] }), i.id) }), k));
2115
- }), addItemPopupType == "project" ?
2116
- jsx("form", __assign({ ref: tabRef, autoComplete: 'off', onSubmit: function (e) { return submitNewItem(e, addItemPopupType); } }, { children: jsxs("div", __assign({ className: 'tw-cursor-pointer tw-card tw-border-[1px] tw-border-base-300 tw-card-body tw-shadow-xl tw-bg-base-100 tw-text-base-content tw-p-6 tw-mb-10' }, { children: [jsx("label", __assign({ 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 () {
2117
- setAddItemPopupType("");
2118
- } }, { children: jsx("p", __assign({ className: 'tw-text-center ' }, { children: "\u2715" })) })), jsx(TextInput, { type: "text", placeholder: "Name", dataField: "name", defaultValue: "", inputStyle: '' }), jsx(TextAreaInput, { placeholder: "Text", dataField: "text", defaultValue: "", inputStyle: 'tw-h-40 tw-mt-5' }), jsx("div", __assign({ className: 'tw-flex tw-justify-center' }, { children: jsx("button", __assign({ className: loading ? 'tw-btn tw-btn-disabled tw-mt-5 tw-place-self-center' : 'tw-btn tw-mt-5 tw-place-self-center', type: 'submit' }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Save' })) }))] })) })) : jsx(Fragment, {})] }))] })), jsx(PlusButton, { triggerAction: function () { setAddItemPopupType("project"); scroll(); }, color: '#777' })] })));
1369
+ }); }, []);
1370
+ var setPermissionData = useCallback(function (data) {
1371
+ data.map(function (permission) {
1372
+ dispatch({ type: "ADD", permission: permission });
1373
+ });
1374
+ }, []);
1375
+ var hasUserPermission = useCallback(function (collectionName, action, item) {
1376
+ if (permissions.length === 0)
1377
+ return true;
1378
+ else if (user && user.role === adminRole)
1379
+ return true;
1380
+ else {
1381
+ return permissions.some(function (p) {
1382
+ return p.action === action &&
1383
+ p.collection === collectionName &&
1384
+ p.role === (user === null || user === void 0 ? void 0 : user.role) &&
1385
+ (
1386
+ // Wenn 'item' nicht gesetzt ist, ignorieren wir die Überprüfung von 'user_created'
1387
+ !item || !p.permissions || !p.permissions._and ||
1388
+ p.permissions._and.some(function (condition) {
1389
+ return condition.user_created &&
1390
+ condition.user_created._eq === "$CURRENT_USER" &&
1391
+ item.user_created.id === (user === null || user === void 0 ? void 0 : user.id);
1392
+ }));
1393
+ });
1394
+ }
1395
+ }, [permissions, user]);
1396
+ return { permissions: permissions, setPermissionApi: setPermissionApi, setPermissionData: setPermissionData, setAdminRole: setAdminRole, hasUserPermission: hasUserPermission };
1397
+ }
1398
+ var PermissionsProvider = function (_a) {
1399
+ var initialPermissions = _a.initialPermissions, children = _a.children;
1400
+ return (jsx(PermissionContext.Provider, __assign({ value: usePermissionsManager(initialPermissions) }, { children: children })));
1401
+ };
1402
+ var useSetPermissionApi = function () {
1403
+ var setPermissionApi = useContext(PermissionContext).setPermissionApi;
1404
+ return setPermissionApi;
1405
+ };
1406
+ var useSetPermissionData = function () {
1407
+ var setPermissionData = useContext(PermissionContext).setPermissionData;
1408
+ return setPermissionData;
1409
+ };
1410
+ var useHasUserPermission = function () {
1411
+ var hasUserPermission = useContext(PermissionContext).hasUserPermission;
1412
+ return hasUserPermission;
1413
+ };
1414
+ var useSetAdminRole = function () {
1415
+ var setAdminRole = useContext(PermissionContext).setAdminRole;
1416
+ return setAdminRole;
2119
1417
  };
2120
1418
 
2121
- var ItemViewPage = function (_a) {
2122
- var api = _a.api, parents = _a.parents, itemNameField = _a.itemNameField, itemTextField = _a.itemTextField, itemImageField = _a.itemImageField, itemSymbolField = _a.itemSymbolField;
2123
- var _b = useState(), item = _b[0], setItem = _b[1];
2124
- var location = useLocation();
2125
- var loadProject = function () { return __awaiter(void 0, void 0, void 0, function () {
2126
- var project;
2127
- return __generator(this, function (_a) {
2128
- switch (_a.label) {
2129
- case 0:
2130
- if (!(api === null || api === void 0 ? void 0 : api.getItem)) return [3 /*break*/, 2];
2131
- return [4 /*yield*/, (api === null || api === void 0 ? void 0 : api.getItem(location.pathname.split("/")[2]))];
2132
- case 1:
2133
- project = _a.sent();
2134
- setItem(project);
2135
- _a.label = 2;
2136
- case 2: return [2 /*return*/];
2137
- }
1419
+ function AddButton(_a) {
1420
+ var triggerAction = _a.triggerAction;
1421
+ var layers = useLayers();
1422
+ var hasUserPermission = useHasUserPermission();
1423
+ var canAddItems = function () {
1424
+ var canAdd = false;
1425
+ layers.map(function (layer) {
1426
+ var _a;
1427
+ if (((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && hasUserPermission(layer.api.collectionName, "create"))
1428
+ canAdd = true;
2138
1429
  });
2139
- }); };
2140
- useEffect(function () {
2141
- loadProject();
2142
- }, [api]);
2143
- return (jsx(CardPage, __assign({ title: getValue(item, itemNameField) || "", parents: parents }, { children: item &&
2144
- jsxs(Fragment, { children: [getValue(item, itemImageField) ?
2145
- jsx("div", __assign({ className: ' tw-h-36 flex items-center justify-center ' }, { children: jsx("img", { className: 'tw-h-24', src: "https://api.utopia-lab.org/assets/".concat(getValue(item, itemImageField)) }) })) :
2146
- jsx("div", __assign({ className: "tw-h-36 !bg-transparent tw-flex tw-items-center tw-justify-center tw-text-7xl" }, { children: getValue(item, itemSymbolField) })), jsx("p", __assign({ className: 'text-sm mb-2' }, { children: getValue(item, itemTextField) }))] }) })));
2147
- };
1430
+ return canAdd;
1431
+ };
1432
+ return (jsx(Fragment, { children: canAddItems() ?
1433
+ jsxs("div", __assign({ className: "tw-dropdown tw-dropdown-top tw-dropdown-end tw-dropdown-hover tw-z-500 tw-absolute tw-right-4 tw-bottom-4" }, { children: [jsx("label", __assign({ tabIndex: 0, className: "tw-z-500 tw-btn tw-btn-circle tw-shadow tw-bg-base-100" }, { children: jsx("svg", __assign({ 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" }, { children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4.5v15m7.5-7.5h-15" }) })) })), jsx("ul", __assign({ tabIndex: 0, className: "tw-dropdown-content tw-pr-1 tw-list-none" }, { children: layers.map(function (layer) {
1434
+ var _a;
1435
+ return (((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && hasUserPermission(layer.api.collectionName, "create") && (jsx("li", { children: jsx("a", { children: jsx("div", __assign({ className: "tw-tooltip tw-tooltip-left", "data-tip": layer.menuText }, { children: jsx("button", __assign({ 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 () { triggerAction(layer); } }, { children: jsx(layer.menuIcon, { className: "tw-h-6 tw-w-6 tw-text-white" }) })) })) }) }, layer.name)));
1436
+ }) }))] })) : "" }));
1437
+ }
2148
1438
 
2149
- function LoginPage() {
2150
- var _this = this;
2151
- var _a = useState(""), email = _a[0], setEmail = _a[1];
2152
- var _b = useState(""), password = _b[0], setPassword = _b[1];
2153
- var _c = useAuth(), login = _c.login, loading = _c.loading;
2154
- var navigate = useNavigate();
2155
- var onLogin = function () { return __awaiter(_this, void 0, void 0, function () {
2156
- return __generator(this, function (_a) {
2157
- switch (_a.label) {
2158
- case 0: return [4 /*yield*/, toast.promise(login({ email: email, password: password }), {
2159
- success: {
2160
- render: function (_a) {
2161
- var data = _a.data;
2162
- navigate("/");
2163
- return "Hi ".concat(data === null || data === void 0 ? void 0 : data.first_name);
2164
- },
2165
- // other options
2166
- icon: "✌️",
2167
- },
2168
- error: {
2169
- render: function (_a) {
2170
- var data = _a.data;
2171
- return "".concat(data);
2172
- },
2173
- },
2174
- pending: 'logging in ...'
2175
- })];
2176
- case 1:
2177
- _a.sent();
2178
- return [2 /*return*/];
2179
- }
2180
- });
2181
- }); };
2182
- return (jsxs(MapOverlayPage, __assign({ backdrop: true, className: 'tw-max-w-xs tw-h-fit' }, { children: [jsx("h2", __assign({ className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, { children: "Login" })), jsx("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" }), jsx("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" }), jsx("div", __assign({ className: 'tw-text-right tw-text-primary' }, { children: jsx(Link, __assign({ to: "/reset-password" }, { children: jsx("span", __assign({ className: "tw-text-sm tw-inline-block hover:tw-text-primary hover:tw-underline hover:tw-cursor-pointer tw-transition tw-duration-200" }, { children: "Forgot Password?" })) })) })), jsx("div", __assign({ className: "tw-card-actions" }, { children: jsx("button", __assign({ className: loading ? 'tw-btn tw-btn-disabled tw-btn-block tw-btn-primary' : 'tw-btn tw-btn-primary tw-btn-block', onClick: function () { return onLogin(); } }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Login' })) }))] })));
2183
- }
2184
-
2185
- function SignupPage() {
2186
- var _this = this;
2187
- var _a = useState(""), email = _a[0], setEmail = _a[1];
2188
- var _b = useState(""), userName = _b[0], setUserName = _b[1];
2189
- var _c = useState(""), password = _c[0], setPassword = _c[1];
2190
- var _d = useAuth(), register = _d.register, loading = _d.loading;
2191
- var navigate = useNavigate();
2192
- var onRegister = function () { return __awaiter(_this, void 0, void 0, function () {
2193
- return __generator(this, function (_a) {
2194
- switch (_a.label) {
2195
- case 0: return [4 /*yield*/, toast.promise(register({ email: email, password: password }, userName), {
2196
- success: {
2197
- render: function (_a) {
2198
- var data = _a.data;
2199
- navigate("/");
2200
- return "Hi ".concat(data === null || data === void 0 ? void 0 : data.first_name);
2201
- },
2202
- // other options
2203
- icon: "✌️",
2204
- },
2205
- error: {
2206
- render: function (_a) {
2207
- var data = _a.data;
2208
- return "".concat(data);
2209
- },
2210
- },
2211
- pending: 'creating new user ...'
2212
- })];
2213
- case 1:
2214
- _a.sent();
2215
- return [2 /*return*/];
2216
- }
2217
- });
2218
- }); };
2219
- return (jsxs(MapOverlayPage, __assign({ backdrop: true, className: 'tw-max-w-xs tw-h-fit' }, { children: [jsx("h2", __assign({ className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, { children: "Sign Up" })), jsx("input", { type: "text", placeholder: "Name", value: userName, onChange: function (e) { return setUserName(e.target.value); }, className: "tw-input tw-input-bordered tw-w-full tw-max-w-xs" }), jsx("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" }), jsx("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" }), jsx("div", __assign({ className: "tw-card-actions tw-mt-4" }, { children: jsx("button", __assign({ 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(); } }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Sign Up' })) }))] })));
2220
- }
2221
-
2222
- function RequestPasswordPage(_a) {
2223
- var _this = this;
2224
- var reset_url = _a.reset_url;
2225
- var _b = useState(""), email = _b[0], setEmail = _b[1];
2226
- var _c = useAuth(), requestPasswordReset = _c.requestPasswordReset, loading = _c.loading;
2227
- var navigate = useNavigate();
2228
- var onReset = function () { return __awaiter(_this, void 0, void 0, function () {
2229
- return __generator(this, function (_a) {
2230
- switch (_a.label) {
2231
- case 0: return [4 /*yield*/, toast.promise(requestPasswordReset(email, reset_url), {
2232
- success: {
2233
- render: function () {
2234
- navigate("/");
2235
- return "Check your mailbox";
2236
- },
2237
- // other options
2238
- icon: "📬",
2239
- },
2240
- error: {
2241
- render: function (_a) {
2242
- var data = _a.data;
2243
- return "".concat(data);
2244
- },
2245
- },
2246
- pending: 'sending email ...'
2247
- })];
2248
- case 1:
2249
- _a.sent();
2250
- return [2 /*return*/];
2251
- }
2252
- });
2253
- }); };
2254
- return (jsxs(MapOverlayPage, __assign({ backdrop: true, className: 'tw-max-w-xs tw-h-fit' }, { children: [jsx("h2", __assign({ className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, { children: "Reset Password" })), jsx("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" }), jsx("div", __assign({ className: "tw-card-actions tw-mt-4" }, { children: jsx("button", __assign({ className: loading ? 'tw-btn tw-btn-disabled tw-btn-block tw-btn-primary' : 'tw-btn tw-btn-primary tw-btn-block', onClick: function () { return onReset(); } }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Send' })) }))] })));
2255
- }
2256
-
2257
- function SetNewPasswordPage() {
2258
- var _this = this;
2259
- var _a = useState(""), password = _a[0], setPassword = _a[1];
2260
- var _b = useAuth(), passwordReset = _b.passwordReset, loading = _b.loading;
2261
- var navigate = useNavigate();
2262
- var onReset = function () { return __awaiter(_this, void 0, void 0, function () {
2263
- var token;
2264
- return __generator(this, function (_a) {
2265
- switch (_a.label) {
2266
- case 0:
2267
- token = window.location.search.split("token=")[1];
2268
- console.log(token);
2269
- return [4 /*yield*/, toast.promise(passwordReset(token, password), {
2270
- success: {
2271
- render: function () {
2272
- navigate("/");
2273
- return "New password set";
2274
- },
2275
- },
2276
- error: {
2277
- render: function (_a) {
2278
- var data = _a.data;
2279
- return "".concat(data);
2280
- },
2281
- },
2282
- pending: 'setting password ...'
2283
- })];
2284
- case 1:
2285
- _a.sent();
2286
- return [2 /*return*/];
2287
- }
2288
- });
2289
- }); };
2290
- return (jsxs(MapOverlayPage, __assign({ backdrop: true, className: 'tw-max-w-xs tw-h-fit' }, { children: [jsx("h2", __assign({ className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, { children: "Set new Password" })), jsx("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" }), jsx("div", __assign({ className: "tw-card-actions tw-mt-4" }, { children: jsx("button", __assign({ className: loading ? 'tw-btn tw-btn-disabled tw-btn-block tw-btn-primary' : 'tw-btn tw-btn-primary tw-btn-block', onClick: function () { return onReset(); } }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Set' })) }))] })));
2291
- }
2292
-
2293
- var PermissionContext = createContext({
2294
- permissions: [],
2295
- setPermissionApi: function () { },
2296
- setPermissionData: function () { },
2297
- setAdminRole: function () { },
2298
- hasUserPermission: function () { return true; }
2299
- });
2300
- function usePermissionsManager(initialPermissions) {
2301
- var _this = this;
2302
- var _a = useReducer(function (state, action) {
2303
- switch (action.type) {
2304
- case "ADD":
2305
- var exist = state.find(function (permission) {
2306
- return permission.id === action.permission.id ? true : false;
2307
- });
2308
- if (!exist)
2309
- return __spreadArray(__spreadArray([], state, true), [
2310
- action.permission,
2311
- ], false);
2312
- else
2313
- return state;
2314
- case "REMOVE":
2315
- return state.filter(function (_a) {
2316
- var id = _a.id;
2317
- return id !== action.id;
2318
- });
2319
- default:
2320
- throw new Error();
1439
+ function getWindowDimensions() {
1440
+ var width = window.innerWidth, height = window.innerHeight;
1441
+ return {
1442
+ width: width,
1443
+ height: height
1444
+ };
1445
+ }
1446
+ function useWindowDimensions() {
1447
+ var _a = useState(getWindowDimensions()), windowDimensions = _a[0], setWindowDimensions = _a[1];
1448
+ useEffect(function () {
1449
+ function handleResize() {
1450
+ setWindowDimensions(getWindowDimensions());
2321
1451
  }
2322
- }, initialPermissions), permissions = _a[0], dispatch = _a[1];
2323
- var _b = React.useState(null), adminRole = _b[0], setAdminRole = _b[1];
2324
- var user = useAuth().user;
2325
- var setPermissionApi = useCallback(function (api) { return __awaiter(_this, void 0, void 0, function () {
2326
- var result;
2327
- return __generator(this, function (_a) {
2328
- switch (_a.label) {
2329
- case 0: return [4 /*yield*/, api.getItems()];
2330
- case 1:
2331
- result = _a.sent();
2332
- if (result) {
2333
- result.map(function (permission) {
2334
- dispatch({ type: "ADD", permission: permission });
2335
- });
2336
- }
2337
- return [2 /*return*/];
2338
- }
2339
- });
2340
- }); }, []);
2341
- var setPermissionData = useCallback(function (data) {
2342
- data.map(function (permission) {
2343
- dispatch({ type: "ADD", permission: permission });
2344
- });
1452
+ window.addEventListener('resize', handleResize);
1453
+ return function () { return window.removeEventListener('resize', handleResize); };
2345
1454
  }, []);
2346
- var hasUserPermission = useCallback(function (collectionName, action) {
2347
- if (permissions.length == 0)
2348
- return true;
2349
- else if (user && user.role == adminRole)
2350
- return true;
2351
- else
2352
- return permissions.some(function (p) { return p.action === action && p.collection === collectionName && p.role == (user === null || user === void 0 ? void 0 : user.role); });
2353
- }, [permissions, user]);
2354
- return { permissions: permissions, setPermissionApi: setPermissionApi, setPermissionData: setPermissionData, setAdminRole: setAdminRole, hasUserPermission: hasUserPermission };
2355
- }
2356
- var PermissionsProvider = function (_a) {
2357
- var initialPermissions = _a.initialPermissions, children = _a.children;
2358
- return (jsx(PermissionContext.Provider, __assign({ value: usePermissionsManager(initialPermissions) }, { children: children })));
2359
- };
2360
- var useSetPermissionApi = function () {
2361
- var setPermissionApi = useContext(PermissionContext).setPermissionApi;
2362
- return setPermissionApi;
2363
- };
2364
- var useSetPermissionData = function () {
2365
- var setPermissionData = useContext(PermissionContext).setPermissionData;
2366
- return setPermissionData;
2367
- };
2368
- var useHasUserPermission = function () {
2369
- var hasUserPermission = useContext(PermissionContext).hasUserPermission;
2370
- return hasUserPermission;
2371
- };
2372
- var useSetAdminRole = function () {
2373
- var setAdminRole = useContext(PermissionContext).setAdminRole;
2374
- return setAdminRole;
2375
- };
2376
-
2377
- function AddButton(_a) {
2378
- var triggerAction = _a.triggerAction;
2379
- var layers = useLayers();
2380
- var hasUserPermission = useHasUserPermission();
2381
- var canAddItems = function () {
2382
- var canAdd = false;
2383
- layers.map(function (layer) {
2384
- var _a;
2385
- if (((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && hasUserPermission(layer.api.collectionName, "create"))
2386
- canAdd = true;
2387
- });
2388
- return canAdd;
2389
- };
2390
- return (jsx(Fragment, { children: canAddItems() ?
2391
- jsxs("div", __assign({ className: "tw-dropdown tw-dropdown-top tw-dropdown-end tw-dropdown-hover tw-z-500 tw-absolute tw-right-4 tw-bottom-4" }, { children: [jsx("label", __assign({ tabIndex: 0, className: "tw-z-500 tw-btn tw-btn-circle tw-shadow tw-bg-base-100" }, { children: jsx("svg", __assign({ 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" }, { children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4.5v15m7.5-7.5h-15" }) })) })), jsx("ul", __assign({ tabIndex: 0, className: "tw-dropdown-content tw-pr-1 tw-list-none" }, { children: layers.map(function (layer) {
2392
- var _a;
2393
- return (((_a = layer.api) === null || _a === void 0 ? void 0 : _a.createItem) && hasUserPermission(layer.api.collectionName, "create") && (jsx("li", { children: jsx("a", { children: jsx("div", __assign({ className: "tw-tooltip tw-tooltip-left", "data-tip": layer.menuText }, { children: jsx("button", __assign({ 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 () { triggerAction(layer); } }, { children: jsx(layer.menuIcon, { className: "tw-h-6 tw-w-6 tw-text-white" }) })) })) }) }, layer.name)));
2394
- }) }))] })) : "" }));
1455
+ return windowDimensions;
2395
1456
  }
2396
1457
 
2397
1458
  var useTimeout = function (callback, delay) {
@@ -3495,6 +2556,14 @@ var MarkerIconFactory = function (shape, color1, color2, icon) {
3495
2556
  });
3496
2557
  };
3497
2558
 
2559
+ function decodeTag(string) {
2560
+ var formatedTag = string.replace(/_/g, "\u00A0");
2561
+ return formatedTag = formatedTag.charAt(0).toUpperCase() + formatedTag.slice(1);
2562
+ }
2563
+ function encodeTag(string) {
2564
+ return string.replace(/\s+/g, "_");
2565
+ }
2566
+
3498
2567
  var SearchControl = function (_a) {
3499
2568
  var clusterRef = _a.clusterRef;
3500
2569
  var windowDimensions = useWindowDimensions();
@@ -3731,18 +2800,125 @@ function UtopiaMap(_a) {
3731
2800
  var params = new URLSearchParams(location.search);
3732
2801
  params.get("position");
3733
2802
  }, [location]);
3734
- return (jsx(Fragment, { children: jsx(LayersProvider, __assign({ initialLayers: [] }, { children: jsx(TagsProvider, __assign({ initialTags: [] }, { children: jsx(PermissionsProvider, __assign({ initialPermissions: [] }, { children: jsx(FilterProvider, __assign({ initialTags: [] }, { children: jsx(ItemsProvider, __assign({ initialItems: [] }, { children: jsx(LeafletRefsProvider, __assign({ initialLeafletRefs: {} }, { children: jsxs("div", __assign({ className: (selectNewItemPosition != null ? "crosshair-cursor-enabled" : undefined) }, { children: [jsxs(MapContainer, __assign({ ref: mapDivRef, style: { height: height, width: width }, center: new LatLng(center[0], center[1]), zoom: zoom, zoomControl: false, maxZoom: 19 }, { children: [jsx(Outlet, {}), jsxs(Control, __assign({ position: 'topLeft', zIndex: "1000" }, { children: [jsx(SearchControl, { clusterRef: clusterRef }), jsx(TagsControl, {})] })), jsxs(Control, __assign({ position: 'bottomLeft', zIndex: "999" }, { children: [jsx(QuestControl, {}), jsx(LayerControl, {})] })), jsx(TileLayer, { maxZoom: 19, attribution: '\u00A9 <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors', url: "https://tile.osmand.net/hd/{z}/{x}/{y}.png" }), jsx(MarkerClusterGroup, __assign({ ref: clusterRef, showCoverageOnHover: true, chunkedLoading: true, maxClusterRadius: 50, removeOutsideVisibleBounds: false }, { children: React.Children.toArray(children).map(function (child) {
3735
- return React.isValidElement(child) ?
3736
- React.cloneElement(child, { setItemFormPopup: setItemFormPopup, itemFormPopup: itemFormPopup, clusterRef: clusterRef }) : child;
3737
- }) })), jsx(MapEventListener, { setSelectNewItemPosition: setSelectNewItemPosition, selectNewItemPosition: selectNewItemPosition, setItemFormPopup: setItemFormPopup })] })), jsx(AddButton, { triggerAction: setSelectNewItemPosition }), selectNewItemPosition != null &&
3738
- jsx("div", __assign({ className: "tw-button tw-z-1000 tw-absolute tw-right-5 tw-top-4 tw-drop-shadow-md" }, { children: jsx("div", __assign({ className: "tw-alert tw-bg-base-100 tw-text-base-content" }, { children: jsx("div", { children: jsxs("span", { children: ["Select ", selectNewItemPosition.name, " position!"] }) }) })) }))] })) })) })) })) })) })) })) }));
2803
+ return (jsx(Fragment, { children: jsx(LayersProvider, __assign({ initialLayers: [] }, { children: jsx(FilterProvider, __assign({ initialTags: [] }, { children: jsx(ItemsProvider, __assign({ initialItems: [] }, { children: jsx(LeafletRefsProvider, __assign({ initialLeafletRefs: {} }, { children: jsxs("div", __assign({ className: (selectNewItemPosition != null ? "crosshair-cursor-enabled" : undefined) }, { children: [jsxs(MapContainer, __assign({ ref: mapDivRef, style: { height: height, width: width }, center: new LatLng(center[0], center[1]), zoom: zoom, zoomControl: false, maxZoom: 19 }, { children: [jsx(Outlet, {}), jsxs(Control, __assign({ position: 'topLeft', zIndex: "1000" }, { children: [jsx(SearchControl, { clusterRef: clusterRef }), jsx(TagsControl, {})] })), jsxs(Control, __assign({ position: 'bottomLeft', zIndex: "999" }, { children: [jsx(QuestControl, {}), jsx(LayerControl, {})] })), jsx(TileLayer, { maxZoom: 19, attribution: '\u00A9 <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors', url: "https://tile.osmand.net/hd/{z}/{x}/{y}.png" }), jsx(MarkerClusterGroup, __assign({ ref: clusterRef, showCoverageOnHover: true, chunkedLoading: true, maxClusterRadius: 50, removeOutsideVisibleBounds: false }, { children: React.Children.toArray(children).map(function (child) {
2804
+ return React.isValidElement(child) ?
2805
+ React.cloneElement(child, { setItemFormPopup: setItemFormPopup, itemFormPopup: itemFormPopup, clusterRef: clusterRef }) : child;
2806
+ }) })), jsx(MapEventListener, { setSelectNewItemPosition: setSelectNewItemPosition, selectNewItemPosition: selectNewItemPosition, setItemFormPopup: setItemFormPopup })] })), jsx(AddButton, { triggerAction: setSelectNewItemPosition }), selectNewItemPosition != null &&
2807
+ jsx("div", __assign({ className: "tw-button tw-z-1000 tw-absolute tw-right-5 tw-top-4 tw-drop-shadow-md" }, { children: jsx("div", __assign({ className: "tw-alert tw-bg-base-100 tw-text-base-content" }, { children: jsx("div", { children: jsxs("span", { children: ["Select ", selectNewItemPosition.name, " position!"] }) }) })) }))] })) })) })) })) })) }));
3739
2808
  }
3740
2809
 
3741
- var urlRegex = /(^| )(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,10}(:[0-9]{1,10})?(\/.*)?$/gm;
3742
- var mailRegex = /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi;
3743
- function fixUrls(message) {
3744
- message = message.replace(urlRegex, function (url) {
3745
- var hyperlink = url.replace(' ', '');
2810
+ var isClickInsideRectangle = function (e, element) {
2811
+ var r = element.getBoundingClientRect();
2812
+ return (e.clientX > r.left &&
2813
+ e.clientX < r.right &&
2814
+ e.clientY > r.top &&
2815
+ e.clientY < r.bottom);
2816
+ };
2817
+ var DialogModal = function (_a) {
2818
+ var title = _a.title, isOpened = _a.isOpened, onClose = _a.onClose, children = _a.children, _b = _a.showCloseButton, showCloseButton = _b === void 0 ? true : _b;
2819
+ var ref = useRef(null);
2820
+ useEffect(function () {
2821
+ var _a, _b, _c, _d;
2822
+ if (isOpened) {
2823
+ (_a = ref.current) === null || _a === void 0 ? void 0 : _a.showModal();
2824
+ (_b = ref.current) === null || _b === void 0 ? void 0 : _b.classList.remove("tw-hidden");
2825
+ document.body.classList.add("modal-open"); // prevent bg scroll
2826
+ }
2827
+ else {
2828
+ (_c = ref.current) === null || _c === void 0 ? void 0 : _c.close();
2829
+ (_d = ref.current) === null || _d === void 0 ? void 0 : _d.classList.add("tw-hidden");
2830
+ document.body.classList.remove("modal-open");
2831
+ }
2832
+ }, [isOpened]);
2833
+ return (jsx("dialog", __assign({ 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 tw-bg-base-100', ref: ref, onCancel: onClose, onClick: function (e) {
2834
+ return ref.current && !isClickInsideRectangle(e, ref.current) && onClose();
2835
+ } }, { children: jsxs("div", __assign({ className: "tw-card-body tw-p-2" }, { children: [jsx("h2", __assign({ className: 'tw-text-2xl tw-font-semibold tw-mb-2 tw-text-center' }, { children: title })), children, showCloseButton && jsx("button", __assign({ className: "tw-btn tw-btn-sm tw-btn-circle tw-btn-ghost tw-absolute tw-right-2 tw-top-2", onClick: onClose }, { children: "\u2715" }))] })) })));
2836
+ };
2837
+
2838
+ function HeaderView(_a) {
2839
+ var _this = this;
2840
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
2841
+ var item = _a.item, setItemFormPopup = _a.setItemFormPopup, _s = _a.hideMenu, hideMenu = _s === void 0 ? false : _s;
2842
+ var _t = React.useState(false), modalOpen = _t[0], setModalOpen = _t[1];
2843
+ var _u = React.useState(false), loading = _u[0], setLoading = _u[1];
2844
+ var removeItem = useRemoveItem();
2845
+ var map = useMap();
2846
+ var hasUserPermission = useHasUserPermission();
2847
+ useAuth().user;
2848
+ var assetsApi = useAssetApi();
2849
+ var navigate = useNavigate();
2850
+ var avatar = ((_b = item.layer) === null || _b === void 0 ? void 0 : _b.itemAvatarField) && item && getValue(item, (_c = item.layer) === null || _c === void 0 ? void 0 : _c.itemAvatarField) ? assetsApi.url + getValue(item, (_d = item.layer) === null || _d === void 0 ? void 0 : _d.itemAvatarField) : undefined;
2851
+ var title = ((_e = item.layer) === null || _e === void 0 ? void 0 : _e.itemNameField) && item ? getValue(item, (_f = item.layer) === null || _f === void 0 ? void 0 : _f.itemNameField) : undefined;
2852
+ ((_g = item.layer) === null || _g === void 0 ? void 0 : _g.itemOwnerField) && item ? getValue(item, (_h = item.layer) === null || _h === void 0 ? void 0 : _h.itemOwnerField) : undefined;
2853
+ var removeItemFromMap = function (event) { return __awaiter(_this, void 0, void 0, function () {
2854
+ var success, error_1, params;
2855
+ var _a, _b;
2856
+ return __generator(this, function (_c) {
2857
+ switch (_c.label) {
2858
+ case 0:
2859
+ event.stopPropagation();
2860
+ setLoading(true);
2861
+ success = false;
2862
+ _c.label = 1;
2863
+ case 1:
2864
+ _c.trys.push([1, 3, , 4]);
2865
+ 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))];
2866
+ case 2:
2867
+ _c.sent();
2868
+ success = true;
2869
+ return [3 /*break*/, 4];
2870
+ case 3:
2871
+ error_1 = _c.sent();
2872
+ toast.error(error_1.toString());
2873
+ return [3 /*break*/, 4];
2874
+ case 4:
2875
+ if (success) {
2876
+ removeItem(item);
2877
+ toast.success("Item deleted");
2878
+ }
2879
+ setLoading(false);
2880
+ map.closePopup();
2881
+ params = new URLSearchParams(window.location.search);
2882
+ window.history.pushState({}, "", "/" + "".concat(params ? "?".concat(params) : ""));
2883
+ setModalOpen(false);
2884
+ navigate("/");
2885
+ return [2 /*return*/];
2886
+ }
2887
+ });
2888
+ }); };
2889
+ var openDeleteModal = function (event) { return __awaiter(_this, void 0, void 0, function () {
2890
+ return __generator(this, function (_a) {
2891
+ setModalOpen(true);
2892
+ event.stopPropagation();
2893
+ return [2 /*return*/];
2894
+ });
2895
+ }); };
2896
+ var openEditPopup = function (event) {
2897
+ event.stopPropagation();
2898
+ map.closePopup();
2899
+ if (setItemFormPopup && item.position)
2900
+ setItemFormPopup({ position: new LatLng(item.position.coordinates[1], item.position.coordinates[0]), layer: item.layer, item: item, setItemFormPopup: setItemFormPopup });
2901
+ };
2902
+ return (jsxs(Fragment, { children: [jsxs("div", __assign({ className: 'tw-grid tw-grid-cols-6 tw-pb-2' }, { children: [jsx("div", __assign({ className: 'tw-col-span-5' }, { children: jsxs("div", __assign({ className: "tw-flex tw-flex-row" }, { children: [avatar ?
2903
+ jsx("div", __assign({ className: "tw-w-10 tw-min-w-[2.5em] tw-rounded-full" }, { children: jsx("img", { className: "tw-rounded-full", src: "".concat(avatar, "?width=80&height=80") }) }))
2904
+ :
2905
+ "", jsx("b", __assign({ className: "tw-text-xl tw-font-bold ".concat(avatar ? "tw-ml-2 tw-mt-1" : "") }, { children: title ? title : item.name }))] })) })), jsx("div", __assign({ className: 'tw-col-span-1', onClick: function (e) { return e.stopPropagation(); } }, { children: (((_k = (_j = item.layer) === null || _j === void 0 ? void 0 : _j.api) === null || _k === void 0 ? void 0 : _k.deleteItem) || ((_m = (_l = item.layer) === null || _l === void 0 ? void 0 : _l.api) === null || _m === void 0 ? void 0 : _m.updateItem))
2906
+ && (hasUserPermission((_o = item.layer.api) === null || _o === void 0 ? void 0 : _o.collectionName, "delete", item) || hasUserPermission((_p = item.layer.api) === null || _p === void 0 ? void 0 : _p.collectionName, "update", item))
2907
+ && !hideMenu &&
2908
+ jsxs("div", __assign({ className: "tw-dropdown tw-dropdown-bottom" }, { children: [jsx("label", __assign({ 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" }, { children: jsx("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" }, { children: jsx("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" }) })) })), jsxs("ul", __assign({ tabIndex: 0, className: "tw-dropdown-content tw-menu tw-p-2 tw-shadow tw-bg-base-100 tw-rounded-box tw-z-1000" }, { children: [((item.layer.api.updateItem && hasUserPermission((_q = item.layer.api) === null || _q === void 0 ? void 0 : _q.collectionName, "update", item)) || item.layer.customEditLink) && jsx("li", { children: jsx("a", __assign({ className: "!tw-text-base-content tw-cursor-pointer", onClick: function (e) {
2909
+ var _a, _b;
2910
+ ((_a = item.layer) === null || _a === void 0 ? void 0 : _a.customEditLink) && navigate(item.layer.customEditLink);
2911
+ !((_b = item.layer) === null || _b === void 0 ? void 0 : _b.customEditLink) && openEditPopup(e);
2912
+ } }, { children: jsx("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" }, { children: jsx("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" }) })) })) }), item.layer.api.deleteItem && hasUserPermission((_r = item.layer.api) === null || _r === void 0 ? void 0 : _r.collectionName, "delete", item) && jsx("li", { children: jsx("a", __assign({ className: 'tw-cursor-pointer !tw-text-error', onClick: openDeleteModal }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner tw-loading-sm" })
2913
+ :
2914
+ jsx("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" }, { children: jsx("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" }) })) })) })] }))] })) }))] })), jsxs(DialogModal, __assign({ isOpened: modalOpen, title: "Are you sure?", showCloseButton: false, onClose: function () { return (setModalOpen(false)); } }, { children: [jsxs("span", { children: ["Do you want to delete ", jsx("b", { children: item.name }), "?"] }), jsx("div", __assign({ className: "tw-grid" }, { children: jsxs("div", __assign({ className: "tw-flex tw-justify-between" }, { children: [jsx("label", __assign({ className: "tw-btn tw-mt-4 tw-btn-error", onClick: removeItemFromMap }, { children: "Yes" })), jsx("label", __assign({ className: "tw-btn tw-mt-4", onClick: function () { return setModalOpen(false); } }, { children: "No" }))] })) }))] }))] }));
2915
+ }
2916
+
2917
+ var urlRegex = /(^| )(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,10}(:[0-9]{1,10})?(\/.*)?$/gm;
2918
+ var mailRegex = /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi;
2919
+ function fixUrls(message) {
2920
+ message = message.replace(urlRegex, function (url) {
2921
+ var hyperlink = url.replace(' ', '');
3746
2922
  if (!hyperlink.match('^https?:\/\/')) {
3747
2923
  hyperlink = 'https://' + hyperlink;
3748
2924
  }
@@ -4345,7 +3521,7 @@ function AppShell(_a) {
4345
3521
  var appName = _a.appName, nameWidth = _a.nameWidth, children = _a.children, assetsApi = _a.assetsApi;
4346
3522
  // Create a client
4347
3523
  var queryClient = new QueryClient();
4348
- return (jsx(QueryClientProvider, __assign({ client: queryClient }, { children: jsx(BrowserRouter, { children: jsxs(AssetsProvider, { children: [jsx(SetAssetsApi, { assetsApi: assetsApi }), jsxs(QuestsProvider, __assign({ initialOpen: true }, { children: [jsx(ToastContainer, { position: "top-right", autoClose: 2000, hideProgressBar: true, newestOnTop: false, closeOnClick: true, rtl: false, pauseOnFocusLoss: true, draggable: true, pauseOnHover: true, theme: "light" }), jsx(NavBar, { appName: appName, nameWidth: nameWidth }), jsx("div", __assign({ id: "app-content", className: "tw-flex tw-!pl-[77px]" }, { children: children }))] }))] }) }) })));
3524
+ return (jsx(PermissionsProvider, __assign({ initialPermissions: [] }, { children: jsx(TagsProvider, __assign({ initialTags: [] }, { children: jsx(QueryClientProvider, __assign({ client: queryClient }, { children: jsx(BrowserRouter, { children: jsxs(AssetsProvider, { children: [jsx(SetAssetsApi, { assetsApi: assetsApi }), jsxs(QuestsProvider, __assign({ initialOpen: true }, { children: [jsx(ToastContainer, { position: "top-right", autoClose: 2000, hideProgressBar: true, newestOnTop: false, closeOnClick: true, rtl: false, pauseOnFocusLoss: true, draggable: true, pauseOnHover: true, theme: "light" }), jsx(NavBar, { appName: appName, nameWidth: nameWidth }), jsx("div", __assign({ id: "app-content", className: "tw-flex tw-!pl-[77px]" }, { children: children }))] }))] }) }) })) })) })));
4349
3525
  }
4350
3526
 
4351
3527
  function SidebarSubmenu(_a) {
@@ -4410,6 +3586,830 @@ function Content(_a) {
4410
3586
  return (jsx("div", __assign({ className: 'tw-flex tw-flex-col tw-w-full tw-bg-base-200 tw-relative' }, { children: children })));
4411
3587
  }
4412
3588
 
3589
+ function UserSettings() {
3590
+ var _a = useAuth(), user = _a.user, updateUser = _a.updateUser, loading = _a.loading; _a.token;
3591
+ var _b = useState(""), id = _b[0], setId = _b[1];
3592
+ var _c = useState(""), email = _c[0], setEmail = _c[1];
3593
+ var _d = useState(""), password = _d[0], setPassword = _d[1];
3594
+ var _e = useState(false), passwordChanged = _e[0], setPasswordChanged = _e[1];
3595
+ var navigate = useNavigate();
3596
+ useEffect(function () {
3597
+ setId((user === null || user === void 0 ? void 0 : user.id) ? user.id : "");
3598
+ setEmail((user === null || user === void 0 ? void 0 : user.email) ? user.email : "");
3599
+ setPassword((user === null || user === void 0 ? void 0 : user.password) ? user.password : "");
3600
+ }, [user]);
3601
+ var onUpdateUser = function () {
3602
+ var changedUser = {};
3603
+ changedUser = __assign({ id: id, email: email }, passwordChanged && { password: password });
3604
+ toast.promise(updateUser(changedUser), {
3605
+ pending: 'updating Profile ...',
3606
+ success: 'Profile updated',
3607
+ error: {
3608
+ render: function (_a) {
3609
+ var data = _a.data;
3610
+ return "".concat(data);
3611
+ },
3612
+ },
3613
+ })
3614
+ .then(function () { return navigate("/"); });
3615
+ };
3616
+ return (jsx(Fragment, { children: jsx("main", __assign({ 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" }, { children: jsx("div", __assign({ className: 'tw-w-full xl:tw-max-w-6xl' }, { children: jsxs(TitleCard, __assign({ title: "Settings", topMargin: "tw-mt-2", className: 'tw-mb-6' }, { children: [jsxs("div", __assign({ className: "tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-6" }, { children: [jsx(TextInput, { type: 'email', placeholder: "E-Mail", defaultValue: (user === null || user === void 0 ? void 0 : user.email) ? user.email : "", updateFormValue: function (v) { return setEmail(v); } }), jsx(TextInput, { type: 'password', placeholder: "new Password", defaultValue: (user === null || user === void 0 ? void 0 : user.password) ? user.password : "", updateFormValue: function (v) {
3617
+ setPassword(v);
3618
+ setPasswordChanged(true);
3619
+ } })] })), jsx("div", __assign({ className: "tw-mt-8" }, { children: jsx("button", __assign({ 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(); } }, { children: "Update" })) }))] })) })) })) }));
3620
+ }
3621
+
3622
+ 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 }";
3623
+ styleInject(css_248z$1);
3624
+
3625
+ // Improved version of https://usehooks.com/useOnClickOutside/
3626
+ var useClickOutside = function (ref, handler) {
3627
+ useEffect(function () {
3628
+ var startedInside = false;
3629
+ var startedWhenMounted = false;
3630
+ var listener = function (event) {
3631
+ // Do nothing if `mousedown` or `touchstart` started inside ref element
3632
+ if (startedInside || !startedWhenMounted)
3633
+ return;
3634
+ // Do nothing if clicking ref's element or descendent elements
3635
+ if (!ref.current || ref.current.contains(event.target))
3636
+ return;
3637
+ handler(event);
3638
+ };
3639
+ var validateEventStart = function (event) {
3640
+ startedWhenMounted = ref.current;
3641
+ startedInside = ref.current && ref.current.contains(event.target);
3642
+ };
3643
+ document.addEventListener("mousedown", validateEventStart);
3644
+ document.addEventListener("touchstart", validateEventStart);
3645
+ document.addEventListener("click", listener);
3646
+ return function () {
3647
+ document.removeEventListener("mousedown", validateEventStart);
3648
+ document.removeEventListener("touchstart", validateEventStart);
3649
+ document.removeEventListener("click", listener);
3650
+ };
3651
+ }, [ref, handler]);
3652
+ };
3653
+
3654
+ var ColorPicker = function (_a) {
3655
+ var color = _a.color, onChange = _a.onChange, className = _a.className;
3656
+ var popover = useRef(null);
3657
+ var _b = useState(false), isOpen = _b[0], toggle = _b[1];
3658
+ var close = useCallback(function () { return toggle(false); }, []);
3659
+ useClickOutside(popover, close);
3660
+ var colorPickerRef = React.useRef(null);
3661
+ useEffect(function () {
3662
+ // Füge dem Color-Picker explizit Event-Listener hinzu
3663
+ var colorPickerElement = colorPickerRef.current;
3664
+ if (colorPickerElement) {
3665
+ var enablePropagation_1 = function (event) {
3666
+ // Verhindere, dass Leaflet die Propagation stoppt
3667
+ event.stopPropagation = function () { };
3668
+ };
3669
+ // Event-Listener für den Color-Picker
3670
+ ['click', 'dblclick', 'mousedown', 'touchstart'].forEach(function (eventType) {
3671
+ colorPickerElement.addEventListener(eventType, enablePropagation_1, true);
3672
+ });
3673
+ }
3674
+ }, []);
3675
+ return (jsxs("div", __assign({ ref: colorPickerRef, className: "picker ".concat(className) }, { children: [jsx("div", { className: "swatch", style: { backgroundColor: color }, onClick: function () { return toggle(true); } }), isOpen && (jsx("div", __assign({ className: "popover tw-z-[10000]", ref: popover }, { children: jsx(HexColorPicker, { color: color, onChange: onChange, onClick: function () { return toggle(false); } }) })))] })));
3676
+ };
3677
+
3678
+ function ProfileSettings() {
3679
+ var _a = useAuth(), user = _a.user, updateUser = _a.updateUser, loading = _a.loading, token = _a.token;
3680
+ var _b = useState(""), id = _b[0], setId = _b[1];
3681
+ var _c = useState(""), name = _c[0], setName = _c[1];
3682
+ var _d = useState(""), text = _d[0], setText = _d[1];
3683
+ var _e = useState(""), avatar = _e[0], setAvatar = _e[1];
3684
+ var _f = useState(""), color = _f[0], setColor = _f[1];
3685
+ var _g = useState(), crop = _g[0], setCrop = _g[1];
3686
+ var _h = useState(""), image = _h[0], setImage = _h[1];
3687
+ var _j = useState(false), cropModalOpen = _j[0], setCropModalOpen = _j[1];
3688
+ var _k = useState(false), cropping = _k[0], setCropping = _k[1];
3689
+ var assetsApi = useAssetApi();
3690
+ var navigate = useNavigate();
3691
+ useEffect(function () {
3692
+ setId((user === null || user === void 0 ? void 0 : user.id) ? user.id : "");
3693
+ setName((user === null || user === void 0 ? void 0 : user.first_name) ? user.first_name : "");
3694
+ setText((user === null || user === void 0 ? void 0 : user.description) ? user.description : "");
3695
+ setAvatar((user === null || user === void 0 ? void 0 : user.avatar) ? user === null || user === void 0 ? void 0 : user.avatar : ""),
3696
+ setColor((user === null || user === void 0 ? void 0 : user.color) ? user.color : "#aabbcc");
3697
+ }, [user]);
3698
+ var imgRef = useRef(null);
3699
+ var onImageChange = function (event) {
3700
+ if (event.target.files && event.target.files[0]) {
3701
+ setImage(URL.createObjectURL(event.target.files[0]));
3702
+ }
3703
+ setCropModalOpen(true);
3704
+ };
3705
+ function onImageLoad(e) {
3706
+ var _a = e.currentTarget, width = _a.width, height = _a.height;
3707
+ setCrop(centerAspectCrop(width, height, 1));
3708
+ }
3709
+ // This is to demonstate how to make and center a % aspect crop
3710
+ // which is a bit trickier so we use some helper functions.
3711
+ function centerAspectCrop(mediaWidth, mediaHeight, aspect) {
3712
+ return centerCrop(makeAspectCrop({
3713
+ unit: 'px',
3714
+ width: mediaWidth / 2,
3715
+ }, aspect, mediaWidth, mediaHeight), mediaWidth, mediaHeight);
3716
+ }
3717
+ function renderCrop() {
3718
+ return __awaiter(this, void 0, void 0, function () {
3719
+ var image, scaleX, scaleY, canvas, ctx, pixelRatio, blob;
3720
+ return __generator(this, function (_a) {
3721
+ switch (_a.label) {
3722
+ case 0:
3723
+ image = imgRef.current;
3724
+ if (!(crop && image)) return [3 /*break*/, 3];
3725
+ scaleX = image.naturalWidth / image.width;
3726
+ scaleY = image.naturalHeight / image.height;
3727
+ canvas = new OffscreenCanvas(crop.width * scaleX, crop.height * scaleY);
3728
+ ctx = canvas.getContext("2d");
3729
+ pixelRatio = window.devicePixelRatio;
3730
+ canvas.width = crop.width * pixelRatio * scaleX;
3731
+ canvas.height = crop.height * pixelRatio * scaleY;
3732
+ if (ctx) {
3733
+ ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
3734
+ ctx.drawImage(image, crop.x * scaleX, crop.y * scaleY, crop.width * scaleX, crop.height * scaleY, 0, 0, crop.width * scaleX, crop.height * scaleY);
3735
+ }
3736
+ return [4 /*yield*/, canvas.convertToBlob()];
3737
+ case 1:
3738
+ blob = _a.sent();
3739
+ return [4 /*yield*/, resizeBlob(blob)];
3740
+ case 2:
3741
+ _a.sent();
3742
+ setCropping(false);
3743
+ setImage("");
3744
+ _a.label = 3;
3745
+ case 3: return [2 /*return*/];
3746
+ }
3747
+ });
3748
+ });
3749
+ }
3750
+ function resizeBlob(blob) {
3751
+ return __awaiter(this, void 0, void 0, function () {
3752
+ var img, canvas, ctx, resizedBlob, asset;
3753
+ return __generator(this, function (_a) {
3754
+ switch (_a.label) {
3755
+ case 0:
3756
+ img = new Image();
3757
+ img.src = URL.createObjectURL(blob);
3758
+ return [4 /*yield*/, img.decode()];
3759
+ case 1:
3760
+ _a.sent();
3761
+ canvas = new OffscreenCanvas(400, 400);
3762
+ ctx = canvas.getContext("2d");
3763
+ ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(img, 0, 0, 400, 400);
3764
+ return [4 /*yield*/, canvas.convertToBlob()];
3765
+ case 2:
3766
+ resizedBlob = _a.sent();
3767
+ return [4 /*yield*/, assetsApi.upload(resizedBlob, "test")];
3768
+ case 3:
3769
+ asset = _a.sent();
3770
+ setAvatar(asset.id);
3771
+ return [2 /*return*/];
3772
+ }
3773
+ });
3774
+ });
3775
+ }
3776
+ var onUpdateUser = function () {
3777
+ var changedUser = {};
3778
+ changedUser = __assign({ id: id, first_name: name, description: text, color: color }, avatar.length > 10 && { avatar: avatar });
3779
+ toast.promise(updateUser(changedUser), {
3780
+ pending: 'updating Profile ...',
3781
+ success: 'Profile updated',
3782
+ error: {
3783
+ render: function (_a) {
3784
+ var data = _a.data;
3785
+ return "".concat(data);
3786
+ },
3787
+ },
3788
+ })
3789
+ .then(function () { return navigate("/"); });
3790
+ };
3791
+ return (jsxs("div", __assign({ className: 'tw-backdrop-contrast-50 tw-h-full tw-w-full' }, { children: [jsx("main", __assign({ className: "tw-flex-1 tw-overflow-y-auto tw-overflow-x-hidden tw-pt-8 tw-px-6 tw-min-w-80 tw-flex tw-justify-center" }, { children: jsx("div", __assign({ className: 'tw-w-full xl:tw-max-w-6xl' }, { children: jsxs(TitleCard, __assign({ title: "Profile", topMargin: "tw-mt-2", className: 'tw-mb-6' }, { children: [jsxs("div", __assign({ className: "tw-flex" }, { children: [!cropping ?
3792
+ jsxs("label", __assign({ className: "custom-file-upload" }, { children: [jsx("input", { type: "file", accept: "image/*", className: "tw-file-input tw-w-full tw-max-w-xs", onChange: onImageChange }), jsx("div", __assign({ className: 'button tw-btn tw-btn-lg tw-btn-circle tw-animate-none' }, { children: jsx("svg", __assign({ 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" }, { children: jsx("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" }) })) })), avatar ?
3793
+ jsx("div", __assign({ className: 'tw-h-20 tw-w-20' }, { children: jsx("img", { src: assetsApi.url + avatar + "?access_token=" + token, className: ' tw-rounded-full' }) }))
3794
+ :
3795
+ jsx("div", __assign({ className: 'tw-h-20 tw-w-20' }, { children: jsxs("svg", __assign({ 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" } }, { children: [jsx("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" }), jsx("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" })] })) }))] }))
3796
+ : jsx("div", __assign({ className: 'tw-w-20 tw-flex tw-items-center tw-justify-center' }, { children: jsx("span", { className: "tw-loading tw-loading-spinner" }) })), jsx(ColorPicker, { color: color, onChange: setColor, className: "-tw-left-6 tw-top-14 -tw-mr-6" }), jsx(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 ' })] })), jsx("div", __assign({ className: "tw-grid tw-grid-cols-1 tw-md:grid-cols-1 tw-gap-6 tw-pt-6 tw-pb-6" }, { children: jsx(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' }) })), jsx("div", __assign({ className: "tw-mt-8" }, { children: jsx("button", __assign({ 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(); } }, { children: "Update" })) }))] })) })) })), jsxs(DialogModal, __assign({ title: "", isOpened: cropModalOpen, onClose: function () {
3797
+ setCropModalOpen(false);
3798
+ setImage("");
3799
+ } }, { children: [jsx(ReactCrop, __assign({ crop: crop, onChange: function (c) { return setCrop(c); }, aspect: 1 }, { children: jsx("img", { src: image, ref: imgRef, onLoad: onImageLoad }) })), jsx("button", __assign({ className: "tw-btn tw-btn-primary", onClick: function () {
3800
+ setCropping(true);
3801
+ setCropModalOpen(false);
3802
+ renderCrop();
3803
+ } }, { children: "Select" }))] }))] })));
3804
+ }
3805
+
3806
+ var TagView = function (_a) {
3807
+ var tag = _a.tag, heighlight = _a.heighlight, onClick = _a.onClick;
3808
+ return (
3809
+ // Use your imagination to render suggestions.
3810
+ jsxs("div", __assign({ onClick: onClick, className: "tw-rounded-2xl tw-text-white tw-p-2 tw-px-4 tw-shadow-xl tw-card tw-h-[2.75em] tw-mt-3 tw-mr-4 tw-cursor-pointer tw-w-fit ".concat(heighlight && 'tw-border-primary tw-shadow-te-primary'), style: { backgroundColor: tag.color ? tag.color : "#666" } }, { children: [jsx("div", { className: "tw-card-actions tw-justify-end" }), jsx("b", { children: decodeTag(tag.name) })] }), tag.name));
3811
+ };
3812
+
3813
+ function OverlayProfile() {
3814
+ var _a, _b;
3815
+ var location = useLocation();
3816
+ var items = useItems();
3817
+ var _c = useState({}), item = _c[0], setItem = _c[1];
3818
+ var map = useMap();
3819
+ var windowDimension = useWindowDimensions();
3820
+ var tags = useTags();
3821
+ var user = useAuth().user;
3822
+ var navigate = useNavigate();
3823
+ var _d = useState(), owner = _d[0], setOwner = _d[1];
3824
+ var _e = useState([]), offers = _e[0], setOffers = _e[1];
3825
+ var _f = useState([]), needs = _f[0], setNeeds = _f[1];
3826
+ var _g = useState(1), activeTab = _g[0], setActiveTab = _g[1];
3827
+ var addFilterTag = useAddFilterTag();
3828
+ useEffect(function () {
3829
+ var _a;
3830
+ var itemId = location.pathname.split("/")[2];
3831
+ var item = items.find(function (i) { return i.id === itemId; });
3832
+ item && setItem(item);
3833
+ var bounds = map.getBounds();
3834
+ var x = bounds.getEast() - bounds.getWest();
3835
+ if (windowDimension.width > 768)
3836
+ if ((_a = item === null || item === void 0 ? void 0 : item.position) === null || _a === void 0 ? void 0 : _a.coordinates[0])
3837
+ map.setView(new LatLng(item === null || item === void 0 ? void 0 : item.position.coordinates[1], (item === null || item === void 0 ? void 0 : item.position.coordinates[0]) + x / 4));
3838
+ }, [location, items, activeTab]);
3839
+ useEffect(function () {
3840
+ var _a, _b, _c, _d;
3841
+ setOffers([]);
3842
+ setNeeds([]);
3843
+ setOwner(undefined);
3844
+ ((_a = item === null || item === void 0 ? void 0 : item.layer) === null || _a === void 0 ? void 0 : _a.itemOwnerField) && setOwner(getValue(item, (_b = item.layer) === null || _b === void 0 ? void 0 : _b.itemOwnerField));
3845
+ ((_c = item.layer) === null || _c === void 0 ? void 0 : _c.itemOffersField) && getValue(item, item.layer.itemOffersField).map(function (o) {
3846
+ var tag = tags.find(function (t) { return t.id === o.tags_id; });
3847
+ tag && setOffers(function (current) { return __spreadArray(__spreadArray([], current, true), [tag], false); });
3848
+ });
3849
+ ((_d = item.layer) === null || _d === void 0 ? void 0 : _d.itemNeedsField) && getValue(item, item.layer.itemNeedsField).map(function (n) {
3850
+ var tag = tags.find(function (t) { return t.id === n.tags_id; });
3851
+ tag && setNeeds(function (current) { return __spreadArray(__spreadArray([], current, true), [tag], false); });
3852
+ });
3853
+ }, [item]);
3854
+ return (jsx(MapOverlayPage, __assign({ className: 'tw-mx-4 tw-mt-4 tw-max-h-[calc(100dvh-96px)] tw-h-[calc(100dvh-96px)] md:tw-w-[calc(50%-32px)] tw-w-[calc(100%-32px)] tw-max-w-3xl !tw-left-auto tw-top-0 tw-bottom-0' }, { children: item &&
3855
+ jsxs(Fragment, { children: [jsxs("div", __assign({ className: 'tw-flex tw-flex-row' }, { children: [jsx("div", __assign({ className: "tw-grow" }, { children: jsxs("p", __assign({ className: "tw-text-3xl tw-font-semibold" }, { children: [((_a = item.layer) === null || _a === void 0 ? void 0 : _a.itemAvatarField) && getValue(item, item.layer.itemAvatarField) && jsx("img", { className: 'tw-h-20 tw-rounded-full tw-inline', src: "https://api.utopia-lab.org/assets/".concat(getValue(item, item.layer.itemAvatarField), "?width=160&heigth=160") }), " ", ((_b = item.layer) === null || _b === void 0 ? void 0 : _b.itemNameField) && getValue(item, item.layer.itemNameField)] })) })), (owner === null || owner === void 0 ? void 0 : owner.id) === (user === null || user === void 0 ? void 0 : user.id) && (owner === null || owner === void 0 ? void 0 : owner.id) ?
3856
+ jsx("a", __assign({ className: 'tw-self-center tw-btn tw-btn-sm tw-mr-4 tw-cursor-pointer', onClick: function () { return navigate("/profile-settings"); } }, { children: jsx("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" }, { children: jsx("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" }) })) })) : ""] })), jsx("div", __assign({ className: 'tw-h-full' }, { children: jsxs("div", __assign({ role: "tablist", className: "tw-tabs tw-tabs-lifted tw-mt-2 tw-mb-2" }, { children: [jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Vision", checked: activeTab == 1 && true, onChange: function () { return setActiveTab(1); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto fade tw-pt-2 tw-pb-1" }, { children: jsx(TextView, { item: item }) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab tw-min-w-[10em] [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Offers & Needs", checked: activeTab == 2 && true, onChange: function () { return setActiveTab(2); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto fade tw-pt-4 tw-pb-1" }, { children: jsx("div", __assign({ className: 'tw-h-full' }, { children: jsxs("div", __assign({ className: 'tw-grid tw-grid-cols-1' }, { children: [offers.length > 0 ?
3857
+ jsxs("div", __assign({ className: 'tw-col-span-1' }, { children: [jsx("h3", __assign({ className: '-tw-mb-2' }, { children: "Offers" })), jsx("div", __assign({ className: 'tw-flex tw-flex-wrap tw-mb-4' }, { children: offers.map(function (o) { return jsx(TagView, { tag: o, onClick: function () { return addFilterTag(o); } }, o === null || o === void 0 ? void 0 : o.id); }) }))] })) : "", needs.length > 0 ?
3858
+ jsxs("div", __assign({ className: 'tw-col-span-1' }, { children: [jsx("h3", __assign({ className: '-tw-mb-2 tw-col-span-1' }, { children: "Needs" })), jsx("div", __assign({ className: 'tw-flex tw-flex-wrap tw-mb-4' }, { children: needs.map(function (n) { return jsx(TagView, { tag: n, onClick: function () { return addFilterTag(n); } }, n === null || n === void 0 ? void 0 : n.id); }) }))] })) : ""] })) })) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Contact", checked: activeTab == 3 && true, onChange: function () { return setActiveTab(3); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto fade tw-pt-2 tw-pb-1" }, { children: jsx(TextView, { item: item, itemTextField: 'user_created.contact' }) }))] })) }))] }) })));
3859
+ }
3860
+
3861
+ var Autocomplete = function (_a) {
3862
+ var inputProps = _a.inputProps, suggestions = _a.suggestions, onSelected = _a.onSelected, pushFilteredSuggestions = _a.pushFilteredSuggestions, setFocus = _a.setFocus;
3863
+ var _b = React.useState([]), filteredSuggestions = _b[0], setFilteredSuggestions = _b[1];
3864
+ var _c = React.useState(0), heighlightedSuggestion = _c[0], setHeighlightedSuggestion = _c[1];
3865
+ useEffect(function () {
3866
+ pushFilteredSuggestions && setFilteredSuggestions(pushFilteredSuggestions);
3867
+ }, [pushFilteredSuggestions]);
3868
+ useEffect(function () {
3869
+ var _a;
3870
+ setFocus && ((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus());
3871
+ }, [setFocus]);
3872
+ var inputRef = React.useRef();
3873
+ var getSuggestions = function (value) {
3874
+ var inputValue = value.trim().toLowerCase();
3875
+ var inputLength = inputValue.length;
3876
+ return inputLength === 0 ? [] : suggestions.filter(function (tag) {
3877
+ return tag.name.toLowerCase().slice(0, inputLength) === inputValue;
3878
+ });
3879
+ };
3880
+ var handleChange = function (e) {
3881
+ setFilteredSuggestions(getSuggestions(e.target.value));
3882
+ // Call the parent's onChange handler, if it exists
3883
+ if (inputProps.onChange) {
3884
+ inputProps.onChange(e);
3885
+ }
3886
+ };
3887
+ function handleSuggestionClick(suggestion) {
3888
+ onSelected(suggestion);
3889
+ }
3890
+ var handleKeyDown = function (event) {
3891
+ switch (event.key) {
3892
+ case 'ArrowDown':
3893
+ heighlightedSuggestion < filteredSuggestions.length - 1 && setHeighlightedSuggestion(function (current) { return current + 1; });
3894
+ break;
3895
+ case 'ArrowUp':
3896
+ heighlightedSuggestion > 0 && setHeighlightedSuggestion(function (current) { return current - 1; });
3897
+ break;
3898
+ case 'Enter':
3899
+ if (filteredSuggestions.length > 0) {
3900
+ onSelected(filteredSuggestions[heighlightedSuggestion]);
3901
+ setHeighlightedSuggestion(0);
3902
+ }
3903
+ filteredSuggestions.length == 0 && inputProps.onKeyDown(event);
3904
+ break;
3905
+ default:
3906
+ inputProps.onKeyDown(event);
3907
+ break;
3908
+ }
3909
+ };
3910
+ return (jsxs("div", { children: [jsx("input", __assign({ ref: inputRef }, inputProps, { type: "text", onChange: function (e) { return handleChange(e); }, onKeyDown: handleKeyDown })), jsx("ul", __assign({ className: "tw-absolute tw-z-[4000] ".concat(filteredSuggestions.length > 0 && 'tw-bg-base-100 tw-rounded-xl tw-p-2') }, { children: filteredSuggestions.map(function (suggestion, index) { return (jsx("li", __assign({ onClick: function () { return handleSuggestionClick(suggestion); } }, { children: jsx(TagView, { heighlight: index == heighlightedSuggestion, tag: suggestion }) }), index)); }) }))] }));
3911
+ };
3912
+
3913
+ var TagsWidget = function (_a) {
3914
+ var placeholder = _a.placeholder, containerStyle = _a.containerStyle, defaultTags = _a.defaultTags, onUpdate = _a.onUpdate;
3915
+ var _b = useState(''), input = _b[0], setInput = _b[1];
3916
+ var _c = useState(false), isKeyReleased = _c[0], setIsKeyReleased = _c[1];
3917
+ var tags = useTags();
3918
+ var _d = useState([]), pushFilteredSuggestions = _d[0], setPushFilteredSuggestions = _d[1];
3919
+ var _e = useState(false), focusInput = _e[0], setFocusInput = _e[1];
3920
+ var onChange = function (e) {
3921
+ var value = e.target.value;
3922
+ setInput(value);
3923
+ };
3924
+ var onKeyDown = function (e) {
3925
+ var key = e.key;
3926
+ var trimmedInput = input.trim();
3927
+ if ((key === 'Enter' || key === ',') && trimmedInput.length && !defaultTags.some(function (tag) { return tag.name.toLocaleLowerCase() === trimmedInput.toLocaleLowerCase(); })) {
3928
+ e.preventDefault();
3929
+ var newTag_1 = tags.find(function (t) { return t.name === trimmedInput.toLocaleLowerCase(); });
3930
+ newTag_1 && onUpdate(function (prevState) { return __spreadArray(__spreadArray([], prevState, true), [newTag_1], false); });
3931
+ !newTag_1 && onUpdate(function (prevState) { return __spreadArray(__spreadArray([], prevState, true), [{ id: crypto.randomUUID(), name: encodeTag(trimmedInput), color: randomColor() }], false); });
3932
+ setInput('');
3933
+ setPushFilteredSuggestions([]);
3934
+ }
3935
+ if (key === "Backspace" && !input.length && defaultTags.length && isKeyReleased) {
3936
+ var defaultTagsCopy = __spreadArray([], defaultTags, true);
3937
+ var poppedTag = defaultTagsCopy.pop();
3938
+ e.preventDefault();
3939
+ onUpdate(defaultTagsCopy);
3940
+ poppedTag && setInput(poppedTag.name);
3941
+ }
3942
+ setIsKeyReleased(false);
3943
+ };
3944
+ var onKeyUp = function () {
3945
+ setIsKeyReleased(true);
3946
+ };
3947
+ var deleteTag = function (tag) {
3948
+ onUpdate(function (prevState) { return prevState.filter(function (t) { return t !== tag; }); });
3949
+ };
3950
+ var onSelected = function (tag) {
3951
+ if (!defaultTags.some(function (t) { return t.name.toLocaleLowerCase() === tag.name.toLocaleLowerCase(); })) {
3952
+ var newTag_2 = tags.find(function (t) { return t.name.toLocaleLowerCase() === tag.name.toLocaleLowerCase(); });
3953
+ newTag_2 && onUpdate(function (prevState) { return __spreadArray(__spreadArray([], prevState, true), [newTag_2], false); });
3954
+ !newTag_2 && onUpdate(function (prevState) { return __spreadArray(__spreadArray([], prevState, true), [{ id: crypto.randomUUID(), name: tag.name.toLocaleLowerCase(), color: randomColor() }], false); });
3955
+ setInput('');
3956
+ setPushFilteredSuggestions([]);
3957
+ }
3958
+ };
3959
+ var inputProps = {
3960
+ value: input,
3961
+ placeholder: placeholder,
3962
+ onKeyDown: onKeyDown,
3963
+ onKeyUp: onKeyUp,
3964
+ onChange: onChange,
3965
+ className: 'tw-bg-transparent tw-w-fit tw-mt-5 tw-h-fit'
3966
+ };
3967
+ return (jsx("div", __assign({ onClick: function () {
3968
+ setFocusInput(true);
3969
+ setTimeout(function () {
3970
+ setFocusInput(false);
3971
+ }, 200);
3972
+ }, className: "tw-input tw-input-bordered tw-cursor-text ".concat(containerStyle) }, { children: jsxs("div", __assign({ className: 'tw-flex tw-flex-wrap tw-h-fit' }, { children: [defaultTags.map(function (tag) { return (jsxs("div", __assign({ className: 'tw-rounded-2xl tw-text-white tw-p-2 tw-px-4 tw-shadow-xl tw-card tw-h-[2.75em] tw-mt-3 tw-mr-4', style: { backgroundColor: tag.color ? tag.color : "#666" } }, { children: [jsx("div", __assign({ className: "tw-card-actions tw-justify-end" }, { children: jsx("label", __assign({ 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 (deleteTag(tag)); } }, { children: "\u2715" })) })), jsx("b", { children: decodeTag(tag.name) })] }), tag.name)); }), jsx(Autocomplete, { suggestions: tags, pushFilteredSuggestions: pushFilteredSuggestions, setFocus: focusInput, inputProps: inputProps, onSelected: function (tag) { return onSelected(tag); } })] })) })));
3973
+ };
3974
+
3975
+ var AvatarWidget = function (_a) {
3976
+ var avatar = _a.avatar, setAvatar = _a.setAvatar;
3977
+ var _b = useState(), crop = _b[0], setCrop = _b[1];
3978
+ var _c = useState(""), image = _c[0], setImage = _c[1];
3979
+ var _d = useState(false), cropModalOpen = _d[0], setCropModalOpen = _d[1];
3980
+ var _e = useState(false), cropping = _e[0], setCropping = _e[1];
3981
+ var assetsApi = useAssetApi();
3982
+ var imgRef = React.useRef(null);
3983
+ var onImageChange = function (event) {
3984
+ if (event.target.files && event.target.files[0]) {
3985
+ setImage(URL.createObjectURL(event.target.files[0]));
3986
+ }
3987
+ setCropModalOpen(true);
3988
+ };
3989
+ function onImageLoad(e) {
3990
+ var _a = e.currentTarget, width = _a.width, height = _a.height;
3991
+ setCrop(centerAspectCrop(width, height, 1));
3992
+ }
3993
+ // This is to demonstate how to make and center a % aspect crop
3994
+ // which is a bit trickier so we use some helper functions.
3995
+ function centerAspectCrop(mediaWidth, mediaHeight, aspect) {
3996
+ return centerCrop(makeAspectCrop({
3997
+ unit: 'px',
3998
+ width: mediaWidth / 2,
3999
+ }, aspect, mediaWidth, mediaHeight), mediaWidth, mediaHeight);
4000
+ }
4001
+ function renderCrop() {
4002
+ return __awaiter(this, void 0, void 0, function () {
4003
+ var image, scaleX, scaleY, canvas, ctx, pixelRatio, blob;
4004
+ return __generator(this, function (_a) {
4005
+ switch (_a.label) {
4006
+ case 0:
4007
+ image = imgRef.current;
4008
+ if (!(crop && image)) return [3 /*break*/, 3];
4009
+ scaleX = image.naturalWidth / image.width;
4010
+ scaleY = image.naturalHeight / image.height;
4011
+ canvas = new OffscreenCanvas(crop.width * scaleX, crop.height * scaleY);
4012
+ ctx = canvas.getContext("2d");
4013
+ pixelRatio = window.devicePixelRatio;
4014
+ canvas.width = crop.width * pixelRatio * scaleX;
4015
+ canvas.height = crop.height * pixelRatio * scaleY;
4016
+ if (ctx) {
4017
+ ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
4018
+ ctx.drawImage(image, crop.x * scaleX, crop.y * scaleY, crop.width * scaleX, crop.height * scaleY, 0, 0, crop.width * scaleX, crop.height * scaleY);
4019
+ }
4020
+ return [4 /*yield*/, canvas.convertToBlob()];
4021
+ case 1:
4022
+ blob = _a.sent();
4023
+ return [4 /*yield*/, resizeBlob(blob)];
4024
+ case 2:
4025
+ _a.sent();
4026
+ setCropping(false);
4027
+ setImage("");
4028
+ _a.label = 3;
4029
+ case 3: return [2 /*return*/];
4030
+ }
4031
+ });
4032
+ });
4033
+ }
4034
+ function resizeBlob(blob) {
4035
+ return __awaiter(this, void 0, void 0, function () {
4036
+ var img, canvas, ctx, resizedBlob, asset;
4037
+ return __generator(this, function (_a) {
4038
+ switch (_a.label) {
4039
+ case 0:
4040
+ img = new Image();
4041
+ img.src = URL.createObjectURL(blob);
4042
+ return [4 /*yield*/, img.decode()];
4043
+ case 1:
4044
+ _a.sent();
4045
+ canvas = new OffscreenCanvas(400, 400);
4046
+ ctx = canvas.getContext("2d");
4047
+ ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(img, 0, 0, 400, 400);
4048
+ return [4 /*yield*/, canvas.convertToBlob()];
4049
+ case 2:
4050
+ resizedBlob = _a.sent();
4051
+ return [4 /*yield*/, assetsApi.upload(resizedBlob, "test")];
4052
+ case 3:
4053
+ asset = _a.sent();
4054
+ setAvatar(asset.id);
4055
+ return [2 /*return*/];
4056
+ }
4057
+ });
4058
+ });
4059
+ }
4060
+ return (jsxs(Fragment, { children: [!cropping ?
4061
+ jsxs("label", __assign({ className: "custom-file-upload" }, { children: [jsx("input", { type: "file", accept: "image/*", className: "tw-file-input tw-w-full tw-max-w-xs", onChange: onImageChange }), jsx("div", __assign({ className: 'button tw-btn tw-btn-lg tw-btn-circle tw-animate-none' }, { children: jsx("svg", __assign({ 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" }, { children: jsx("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" }) })) })), avatar ?
4062
+ jsx("div", __assign({ className: 'tw-h-20 tw-w-20' }, { children: jsx("img", { src: assetsApi.url + avatar, className: 'tw-h-20 tw-w-20 tw-rounded-full' }) }))
4063
+ :
4064
+ jsx("div", __assign({ className: 'tw-h-20 tw-w-20' }, { children: jsxs("svg", __assign({ 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" } }, { children: [jsx("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" }), jsx("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" })] })) }))] }))
4065
+ : jsx("div", __assign({ className: 'tw-w-20 tw-flex tw-items-center tw-justify-center' }, { children: jsx("span", { className: "tw-loading tw-loading-spinner" }) })), jsxs(DialogModal, __assign({ title: "", isOpened: cropModalOpen, onClose: function () {
4066
+ setCropModalOpen(false);
4067
+ setImage("");
4068
+ } }, { children: [jsx(ReactCrop, __assign({ crop: crop, onChange: function (c) { return setCrop(c); }, aspect: 1 }, { children: jsx("img", { src: image, ref: imgRef, onLoad: onImageLoad }) })), jsx("button", __assign({ className: "tw-btn tw-btn-primary", onClick: function () {
4069
+ setCropping(true);
4070
+ setCropModalOpen(false);
4071
+ renderCrop();
4072
+ } }, { children: "Select" }))] }))] }));
4073
+ };
4074
+
4075
+ function OverlayProfileSettings() {
4076
+ var _this = this;
4077
+ var _a = useAuth(), user = _a.user, updateUser = _a.updateUser, loading = _a.loading;
4078
+ var _b = useState(""), id = _b[0], setId = _b[1];
4079
+ var _c = useState(""), name = _c[0], setName = _c[1];
4080
+ var _d = useState(""), text = _d[0], setText = _d[1];
4081
+ var _e = useState(""), avatar = _e[0], setAvatar = _e[1];
4082
+ var _f = useState(""), color = _f[0], setColor = _f[1];
4083
+ var _g = useState([]), offers = _g[0], setOffers = _g[1];
4084
+ var _h = useState([]), needs = _h[0], setNeeds = _h[1];
4085
+ var _j = useState(""), contact = _j[0], setContact = _j[1];
4086
+ var _k = useState(1), activeTab = _k[0], setActiveTab = _k[1];
4087
+ var items = useItems();
4088
+ var updateItem = useUpdateItem();
4089
+ var tags = useTags();
4090
+ var addTag = useAddTag();
4091
+ var navigate = useNavigate();
4092
+ React.useEffect(function () {
4093
+ setId((user === null || user === void 0 ? void 0 : user.id) ? user.id : "");
4094
+ setName((user === null || user === void 0 ? void 0 : user.first_name) ? user.first_name : "");
4095
+ setText((user === null || user === void 0 ? void 0 : user.description) ? user.description : "");
4096
+ setAvatar((user === null || user === void 0 ? void 0 : user.avatar) ? user === null || user === void 0 ? void 0 : user.avatar : "");
4097
+ setColor((user === null || user === void 0 ? void 0 : user.color) ? user.color : "#aabbcc");
4098
+ setOffers([]);
4099
+ setNeeds([]);
4100
+ user === null || user === void 0 ? void 0 : user.offers.map(function (o) {
4101
+ var offer = tags.find(function (t) { return t.id === o.tags_id; });
4102
+ offer && setOffers(function (current) { return __spreadArray(__spreadArray([], current, true), [offer], false); });
4103
+ });
4104
+ user === null || user === void 0 ? void 0 : user.needs.map(function (o) {
4105
+ var need = tags.find(function (t) { return t.id === o.tags_id; });
4106
+ need && setNeeds(function (current) { return __spreadArray(__spreadArray([], current, true), [need], false); });
4107
+ });
4108
+ setContact((user === null || user === void 0 ? void 0 : user.contact) ? user.contact : "");
4109
+ }, [user]);
4110
+ var onUpdateUser = function () { return __awaiter(_this, void 0, void 0, function () {
4111
+ var changedUser, offer_updates, needs_updates, item, offer_state, needs_state;
4112
+ var _a;
4113
+ return __generator(this, function (_b) {
4114
+ switch (_b.label) {
4115
+ case 0:
4116
+ changedUser = {};
4117
+ offer_updates = [];
4118
+ //check for new offers
4119
+ offers.map(function (o) {
4120
+ var existingOffer = user === null || user === void 0 ? void 0 : user.offers.find(function (t) { return t.tags_id === o.id; });
4121
+ existingOffer && offer_updates.push(existingOffer.id);
4122
+ if (!existingOffer && !tags.some(function (t) { return t.id === o.id; }))
4123
+ addTag(__assign(__assign({}, o), { offer_or_need: true }));
4124
+ !existingOffer && offer_updates.push({ directus_user_id: user === null || user === void 0 ? void 0 : user.id, tags_id: o.id });
4125
+ });
4126
+ needs_updates = [];
4127
+ needs.map(function (n) {
4128
+ var existingNeed = user === null || user === void 0 ? void 0 : user.needs.find(function (t) { return t.tags_id === n.id; });
4129
+ existingNeed && needs_updates.push(existingNeed.id);
4130
+ !existingNeed && needs_updates.push({ directus_user_id: user === null || user === void 0 ? void 0 : user.id, tags_id: n.id });
4131
+ !existingNeed && !tags.some(function (t) { return t.id === n.id; }) && addTag(__assign(__assign({}, n), { offer_or_need: true }));
4132
+ });
4133
+ changedUser = __assign(__assign(__assign({ id: id, first_name: name, description: text, contact: contact, color: color }, avatar.length > 10 && { avatar: avatar }), offers.length > 0 && { offers: offer_updates }), needs.length > 0 && { needs: needs_updates });
4134
+ item = items.find(function (i) { var _a, _b; return ((_a = i.layer) === null || _a === void 0 ? void 0 : _a.itemOwnerField) && getValue(i, (_b = i.layer) === null || _b === void 0 ? void 0 : _b.itemOwnerField).id === id; });
4135
+ offer_state = [];
4136
+ needs_state = [];
4137
+ return [4 /*yield*/, offers.map(function (o) {
4138
+ offer_state.push({ directus_user_id: user === null || user === void 0 ? void 0 : user.id, tags_id: o.id });
4139
+ })];
4140
+ case 1:
4141
+ _b.sent();
4142
+ return [4 /*yield*/, needs.map(function (n) {
4143
+ needs_state.push({ directus_user_id: user === null || user === void 0 ? void 0 : user.id, tags_id: n.id });
4144
+ })];
4145
+ case 2:
4146
+ _b.sent();
4147
+ if (item && item.layer && item.layer.itemOwnerField)
4148
+ item[item.layer.itemOwnerField] = __assign(__assign({}, changedUser), { offers: offer_state, needs: needs_state });
4149
+ // add new hashtags from profile text
4150
+ (_a = text.toLocaleLowerCase().match(hashTagRegex)) === null || _a === void 0 ? void 0 : _a.map(function (tag) {
4151
+ if (!tags.find(function (t) { return t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase(); })) {
4152
+ addTag({ id: crypto.randomUUID(), name: encodeTag(tag.slice(1).toLocaleLowerCase()), color: randomColor() });
4153
+ }
4154
+ });
4155
+ toast.promise(updateUser(changedUser), {
4156
+ pending: 'updating Profile ...',
4157
+ success: 'Profile updated',
4158
+ error: {
4159
+ render: function (_a) {
4160
+ var data = _a.data;
4161
+ return "".concat(data);
4162
+ },
4163
+ },
4164
+ })
4165
+ .then(function () { return item && updateItem(item); })
4166
+ .then(function () { return navigate("/"); });
4167
+ return [2 /*return*/];
4168
+ }
4169
+ });
4170
+ }); };
4171
+ return (jsx(Fragment, { children: jsx(MapOverlayPage, __assign({ backdrop: true, className: 'tw-mx-4 tw-mt-4 tw-mb-12 tw-overflow-x-hidden tw-max-h-[calc(100dvh-96px)] !tw-h-[calc(100dvh-96px)] tw-w-[calc(100%-32px)] md:tw-w-[calc(50%-32px)] tw-max-w-3xl !tw-left-auto tw-top-0 tw-bottom-0' }, { children: jsxs("div", __assign({ className: 'tw-flex tw-flex-col tw-h-full' }, { children: [jsxs("div", __assign({ className: "tw-flex" }, { children: [jsx(AvatarWidget, { avatar: avatar, setAvatar: setAvatar }), jsx(ColorPicker, { color: color, onChange: setColor, className: "-tw-left-6 tw-top-14 -tw-mr-6" }), jsx(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 ' })] })), jsxs("div", __assign({ role: "tablist", className: "tw-tabs tw-tabs-lifted tw-mt-4" }, { children: [jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Vision", checked: activeTab == 1 && true, onChange: function () { return setActiveTab(1); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-border-[var(--fallback-bc,oklch(var(--bc)/0.2))] tw-rounded-box tw-h-[calc(100dvh-332px)] tw-min-h-56" }, { children: jsx(TextAreaInput, { placeholder: "My Vision...", defaultValue: (user === null || user === void 0 ? void 0 : user.description) ? user.description : "", updateFormValue: function (v) { return setText(v); }, containerStyle: 'tw-h-full', inputStyle: 'tw-h-full tw-border-t-0 tw-rounded-tl-none' }) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab tw-min-w-[10em] [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Offers & Needs", checked: activeTab == 2 && true, onChange: function () { return setActiveTab(2); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-pt-4 tw-h-[calc(100dvh-332px)] tw-min-h-56" }, { children: jsxs("div", __assign({ className: 'tw-h-full' }, { children: [jsx("div", __assign({ className: 'tw-w-full tw-h-[calc(50%-0.75em)] tw-mb-4' }, { children: jsx(TagsWidget, { defaultTags: offers, onUpdate: function (v) { return setOffers(v); }, placeholder: "enter your offers", containerStyle: 'tw-bg-transparent tw-w-full tw-h-full tw-mt-3 tw-text-xs tw-h-[calc(100%-1rem)] tw-min-h-[5em] tw-pb-2 tw-overflow-auto' }) })), jsx("div", __assign({ className: 'tw-w-full tw-h-[calc(50%-0.75em)] ' }, { children: jsx(TagsWidget, { defaultTags: needs, onUpdate: function (v) { return setNeeds(v); }, placeholder: "enter your needs", containerStyle: 'tw-bg-transparent tw-w-full tw-h-full tw-mt-3 tw-text-xs tw-h-[calc(100%-1rem)] tw-min-h-[5em] tw-pb-2 tw-overflow-auto' }) }))] })) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Contact", checked: activeTab == 3 && true, onChange: function () { return setActiveTab(3); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-border-[var(--fallback-bc,oklch(var(--bc)/0.2))] tw-rounded-box tw-h-[calc(100dvh-332px)] tw-min-h-56" }, { children: jsx(TextAreaInput, { placeholder: "Contact ...", defaultValue: (user === null || user === void 0 ? void 0 : user.contact) ? user.contact : "", updateFormValue: function (v) { return setContact(v); }, containerStyle: 'tw-h-full', inputStyle: 'tw-h-full tw-border-t-0 ' }) }))] })), jsx("div", __assign({ className: "tw-mt-4 tw-mb-4" }, { children: jsx("button", __assign({ 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(); } }, { children: "Update" })) }))] })) })) }));
4172
+ }
4173
+
4174
+ function OverlayUserSettings() {
4175
+ var _a = useAuth(), user = _a.user, updateUser = _a.updateUser, loading = _a.loading; _a.token;
4176
+ var _b = useState(""), id = _b[0], setId = _b[1];
4177
+ var _c = useState(""), email = _c[0], setEmail = _c[1];
4178
+ var _d = useState(""), password = _d[0], setPassword = _d[1];
4179
+ var _e = useState(false), passwordChanged = _e[0], setPasswordChanged = _e[1];
4180
+ var navigate = useNavigate();
4181
+ React.useEffect(function () {
4182
+ setId((user === null || user === void 0 ? void 0 : user.id) ? user.id : "");
4183
+ setEmail((user === null || user === void 0 ? void 0 : user.email) ? user.email : "");
4184
+ setPassword((user === null || user === void 0 ? void 0 : user.password) ? user.password : "");
4185
+ }, [user]);
4186
+ var onUpdateUser = function () {
4187
+ var changedUser = {};
4188
+ changedUser = __assign({ id: id, email: email }, passwordChanged && { password: password });
4189
+ toast.promise(updateUser(changedUser), {
4190
+ pending: 'updating Profile ...',
4191
+ success: 'Profile updated',
4192
+ error: {
4193
+ render: function (_a) {
4194
+ var data = _a.data;
4195
+ return "".concat(data);
4196
+ },
4197
+ },
4198
+ })
4199
+ .then(function () { return navigate("/"); });
4200
+ };
4201
+ return (jsxs(MapOverlayPage, __assign({ backdrop: true, className: 'tw-mx-4 tw-mt-4 tw-max-h-[calc(100dvh-96px)] tw-h-fit md:tw-w-[calc(50%-32px)] tw-w-[calc(100%-32px)] tw-max-w-xl !tw-left-auto tw-top-0 tw-bottom-0' }, { children: [jsx("div", __assign({ className: "tw-text-xl tw-font-semibold" }, { children: "Settings" })), jsx("div", { className: "tw-divider tw-mt-2" }), jsxs("div", __assign({ className: "tw-grid tw-grid-cols-1 tw-gap-6" }, { children: [jsx(TextInput, { type: 'email', placeholder: "new E-Mail", defaultValue: (user === null || user === void 0 ? void 0 : user.email) ? user.email : "", updateFormValue: function (v) { return setEmail(v); } }), jsx(TextInput, { type: 'password', placeholder: "new Password", defaultValue: (user === null || user === void 0 ? void 0 : user.password) ? user.password : "", updateFormValue: function (v) {
4202
+ setPassword(v);
4203
+ setPasswordChanged(true);
4204
+ } })] })), jsx("div", __assign({ className: "tw-mt-8" }, { children: jsx("button", __assign({ 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(); } }, { children: "Update" })) }))] })));
4205
+ }
4206
+
4207
+ function OverlayItemProfile() {
4208
+ var _this = this;
4209
+ var _a, _b, _c, _d, _e;
4210
+ var location = useLocation();
4211
+ var items = useItems();
4212
+ var updateItem = useUpdateItem();
4213
+ var _f = useState({}), item = _f[0], setItem = _f[1];
4214
+ var map = useMap();
4215
+ var windowDimension = useWindowDimensions();
4216
+ var _g = useState(false), addButton = _g[0], setAddButton = _g[1];
4217
+ var tags = useTags();
4218
+ var navigate = useNavigate();
4219
+ var _h = useState([]), relations = _h[0], setRelations = _h[1];
4220
+ var _j = useState(1), activeTab = _j[0], setActiveTab = _j[1];
4221
+ var _k = useState(""), addItemPopupType = _k[0], setAddItemPopupType = _k[1];
4222
+ var _l = useState(false), loading = _l[0], setLoading = _l[1];
4223
+ var addTag = useAddTag();
4224
+ var resetFilterTags = useResetFilterTags();
4225
+ var addItem = useAddItem();
4226
+ var user = useAuth().user;
4227
+ var hasUserPermission = useHasUserPermission();
4228
+ var tabRef = useRef(null);
4229
+ function scroll() {
4230
+ var _a;
4231
+ (_a = tabRef.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView();
4232
+ }
4233
+ useEffect(function () {
4234
+ scroll();
4235
+ }, [addItemPopupType]);
4236
+ useEffect(function () {
4237
+ var itemId = location.pathname.split("/")[2];
4238
+ var item = items.find(function (i) { return i.id === itemId; });
4239
+ item && setItem(item);
4240
+ hasUserPermission("items", "update", item) && setAddButton(true);
4241
+ var bounds = map.getBounds();
4242
+ var x = bounds.getEast() - bounds.getWest();
4243
+ if (windowDimension.width > 768)
4244
+ if ((item === null || item === void 0 ? void 0 : item.position) && (item === null || item === void 0 ? void 0 : item.position.coordinates[0]))
4245
+ map.setView(new LatLng(item === null || item === void 0 ? void 0 : item.position.coordinates[1], (item === null || item === void 0 ? void 0 : item.position.coordinates[0]) + x / 4));
4246
+ }, [location, items, activeTab]);
4247
+ useEffect(function () {
4248
+ setActiveTab(1);
4249
+ }, [location]);
4250
+ useEffect(function () {
4251
+ var _a;
4252
+ setRelations([]);
4253
+ (_a = item.relations) === null || _a === void 0 ? void 0 : _a.map(function (r) {
4254
+ var item = items.find(function (i) { return i.id == r.related_items_id; });
4255
+ item && setRelations(function (current) { return __spreadArray(__spreadArray([], current, true), [item], false); });
4256
+ });
4257
+ }, [item, items]);
4258
+ var submitNewItem = function (evt, type) { return __awaiter(_this, void 0, void 0, function () {
4259
+ var formItem, uuid, success, error_1;
4260
+ var _a, _b, _c;
4261
+ return __generator(this, function (_d) {
4262
+ switch (_d.label) {
4263
+ case 0:
4264
+ evt.preventDefault();
4265
+ formItem = {};
4266
+ Array.from(evt.target).forEach(function (input) {
4267
+ if (input.name) {
4268
+ formItem[input.name] = input.value;
4269
+ }
4270
+ });
4271
+ setLoading(true);
4272
+ formItem.text && ((_a = formItem.text.toLocaleLowerCase().match(hashTagRegex)) === null || _a === void 0 ? void 0 : _a.map(function (tag) {
4273
+ if (!tags.find(function (t) { return t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase(); })) {
4274
+ addTag({ id: crypto.randomUUID(), name: tag.slice(1), color: randomColor() });
4275
+ }
4276
+ }));
4277
+ uuid = crypto.randomUUID();
4278
+ success = false;
4279
+ _d.label = 1;
4280
+ case 1:
4281
+ _d.trys.push([1, 4, , 5]);
4282
+ return [4 /*yield*/, ((_c = (_b = item === null || item === void 0 ? void 0 : item.layer) === null || _b === void 0 ? void 0 : _b.api) === null || _c === void 0 ? void 0 : _c.createItem(__assign(__assign({}, formItem), { id: uuid, type: type })))];
4283
+ case 2:
4284
+ _d.sent();
4285
+ return [4 /*yield*/, linkItem(uuid)];
4286
+ case 3:
4287
+ _d.sent();
4288
+ success = true;
4289
+ return [3 /*break*/, 5];
4290
+ case 4:
4291
+ error_1 = _d.sent();
4292
+ toast.error(error_1.toString());
4293
+ return [3 /*break*/, 5];
4294
+ case 5:
4295
+ if (success) {
4296
+ addItem(__assign(__assign({}, formItem), { id: uuid, type: type, layer: item === null || item === void 0 ? void 0 : item.layer, user_created: user }));
4297
+ toast.success("New item created");
4298
+ resetFilterTags();
4299
+ }
4300
+ setLoading(false);
4301
+ setAddItemPopupType("");
4302
+ return [2 /*return*/];
4303
+ }
4304
+ });
4305
+ }); };
4306
+ var linkItem = function (id) { return __awaiter(_this, void 0, void 0, function () {
4307
+ var new_relations, updatedItem;
4308
+ var _a, _b;
4309
+ return __generator(this, function (_c) {
4310
+ switch (_c.label) {
4311
+ case 0:
4312
+ new_relations = item.relations || [];
4313
+ new_relations === null || new_relations === void 0 ? void 0 : new_relations.push({ items_id: item.id, related_items_id: id });
4314
+ updatedItem = { id: item.id, relations: new_relations };
4315
+ return [4 /*yield*/, ((_b = (_a = item === null || item === void 0 ? void 0 : item.layer) === null || _a === void 0 ? void 0 : _a.api) === null || _b === void 0 ? void 0 : _b.updateItem(updatedItem))];
4316
+ case 1:
4317
+ _c.sent();
4318
+ updateItem(__assign(__assign({}, item), { relations: new_relations }));
4319
+ return [2 /*return*/];
4320
+ }
4321
+ });
4322
+ }); };
4323
+ return (jsx(MapOverlayPage, __assign({ className: 'tw-mx-4 tw-mt-4 tw-max-h-[calc(100dvh-96px)] tw-h-[calc(100dvh-96px)] md:tw-w-[calc(50%-32px)] tw-w-[calc(100%-32px)] tw-min-w-80 tw-max-w-3xl !tw-left-auto tw-top-0 tw-bottom-0' }, { children: item &&
4324
+ jsxs(Fragment, { children: [jsxs("div", __assign({ className: 'tw-flex tw-flex-row' }, { children: [jsx("div", __assign({ className: "tw-grow" }, { children: jsxs("p", __assign({ className: "tw-text-3xl tw-font-semibold" }, { children: [((_a = item.layer) === null || _a === void 0 ? void 0 : _a.itemAvatarField) && getValue(item, item.layer.itemAvatarField) && jsx("img", { className: 'tw-w-20 tw-h-20 tw-rounded-full tw-inline', src: "https://api.utopia-lab.org/assets/".concat(getValue(item, item.layer.itemAvatarField), "?width=160&heigth=160") }), " ", ((_b = item.layer) === null || _b === void 0 ? void 0 : _b.itemNameField) && getValue(item, item.layer.itemNameField)] })) })), (((_d = (_c = item.layer) === null || _c === void 0 ? void 0 : _c.api) === null || _d === void 0 ? void 0 : _d.updateItem) && hasUserPermission((_e = item.layer.api) === null || _e === void 0 ? void 0 : _e.collectionName, "update", item)) ?
4325
+ jsx("a", __assign({ className: 'tw-self-center tw-btn tw-btn-sm tw-mr-4 tw-cursor-pointer', onClick: function () { return navigate("/edit-item/" + item.id); } }, { children: jsx("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", className: "tw-h-5 tw-w-5", viewBox: "0 0 20 20", fill: "currentColor" }, { children: jsx("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" }) })) })) : ""] })), jsx("div", __assign({ className: 'tw-h-full' }, { children: jsxs("div", __assign({ role: "tablist", className: "tw-tabs tw-tabs-lifted tw-mt-2 tw-mb-2" }, { children: [jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Info", checked: activeTab == 1 && true, onChange: function () { return setActiveTab(1); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto fade tw-pt-2 tw-pb-1" }, { children: jsx(TextView, { item: item }) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Projects", checked: activeTab == 2 && true, onChange: function () { return setActiveTab(2); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto tw-pt-4 tw-pb-1 -tw-mx-4" }, { children: jsx("div", __assign({ className: 'tw-h-full' }, { children: jsxs("div", __assign({ className: 'tw-grid tw-grid-cols-1 sm:tw-grid-cols-2 md:tw-grid-cols-1 lg:tw-grid-cols-1 xl:tw-grid-cols-2' }, { children: [relations && relations.map(function (i) {
4326
+ if (i.type == 'project')
4327
+ return (jsxs("div", __assign({ className: 'tw-cursor-pointer tw-card tw-border-[1px] tw-border-base-300 tw-card-body tw-shadow-xl tw-bg-base-100 tw-text-base-content tw-mx-4 tw-p-4 tw-mb-4 tw-h-fit', onClick: function () { return navigate('/item/' + i.id); } }, { children: [jsx(HeaderView, { item: i }), jsx("div", __assign({ className: 'tw-overflow-y-auto tw-overflow-x-hidden tw-max-h-64 fade' }, { children: jsx(TextView, { truncate: true, item: i }) }))] }), i.id));
4328
+ else
4329
+ return null;
4330
+ }), addItemPopupType == "project" ?
4331
+ jsx("form", __assign({ ref: tabRef, autoComplete: 'off', onSubmit: function (e) { return submitNewItem(e, addItemPopupType); } }, { children: jsxs("div", __assign({ className: 'tw-cursor-pointer tw-card tw-border-[1px] tw-border-base-300 tw-card-body tw-shadow-xl tw-bg-base-100 tw-text-base-content tw-mx-4 tw-p-6 tw-mb-4' }, { children: [jsx("label", __assign({ 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 () {
4332
+ setAddItemPopupType("");
4333
+ } }, { children: jsx("p", __assign({ className: 'tw-text-center ' }, { children: "\u2715" })) })), jsx(TextInput, { type: "text", placeholder: "Name", dataField: "name", defaultValue: "", inputStyle: '' }), jsx(TextAreaInput, { placeholder: "Text", dataField: "text", defaultValue: "", inputStyle: 'tw-h-40 tw-mt-5' }), jsx("div", __assign({ className: 'tw-flex tw-justify-center' }, { children: jsx("button", __assign({ className: loading ? 'tw-btn tw-btn-disabled tw-mt-5 tw-place-self-center' : 'tw-btn tw-mt-5 tw-place-self-center', type: 'submit' }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Save' })) }))] })) })) : jsx(Fragment, {}), addButton && jsx(PlusButton, { triggerAction: function () { setAddItemPopupType("project"); scroll(); }, color: item.color })] })) })) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Events", checked: activeTab == 3 && true, onChange: function () { return setActiveTab(3); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto tw-pt-4 tw-pb-1" }, { children: jsx("div", __assign({ className: 'tw-h-full' }, { children: jsxs("div", __assign({ className: 'tw-grid tw-grid-cols-1 sm:tw-grid-cols-2 md:tw-grid-cols-1 lg:tw-grid-cols-1 xl:tw-grid-cols-2' }, { children: [relations && relations.map(function (i) {
4334
+ if (i.type == 'event')
4335
+ return (jsxs("div", __assign({ className: 'tw-cursor-pointer tw-card tw-border-[1px] tw-border-base-300 tw-card-body tw-shadow-xl tw-bg-base-100 tw-text-base-content tw-mx-4 tw-p-6 tw-mb-4', onClick: function () { return navigate('/item/' + i.id); } }, { children: [jsx(HeaderView, { item: i, hideMenu: true }), jsxs("div", __assign({ className: 'tw-overflow-y-auto tw-overflow-x-hidden tw-max-h-64 fade' }, { children: [jsx(StartEndView, { item: i }), jsx(TextView, { truncate: true, item: i })] }))] }), i.id));
4336
+ else
4337
+ return null;
4338
+ }), addItemPopupType == "event" ?
4339
+ jsx("form", __assign({ autoComplete: 'off', onSubmit: function (e) { return submitNewItem(e, addItemPopupType); } }, { children: jsxs("div", __assign({ className: 'tw-cursor-pointer tw-card tw-border-[1px] tw-border-base-300 tw-card-body tw-shadow-xl tw-bg-base-100 tw-text-base-content tw-mx-4 tw-p-4 tw-mb-4' }, { children: [jsx("label", __assign({ 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 () {
4340
+ setAddItemPopupType("");
4341
+ } }, { children: jsx("p", __assign({ className: 'tw-text-center ' }, { children: "\u2715" })) })), jsx(TextInput, { type: "text", placeholder: "Name", dataField: "name", defaultValue: "", inputStyle: '' }), jsx(PopupStartEndInput, {}), jsx(TextAreaInput, { placeholder: "Text", dataField: "text", defaultValue: "", inputStyle: 'tw-h-40 tw-mt-5' }), jsx("div", __assign({ className: 'tw-flex tw-justify-center' }, { children: jsx("button", __assign({ className: loading ? 'tw-btn tw-btn-disabled tw-mt-5 tw-place-self-center' : 'tw-btn tw-mt-5 tw-place-self-center', type: 'submit' }, { children: loading ? jsx("span", { className: "tw-loading tw-loading-spinner" }) : 'Save' })) }))] })) })) : jsx(Fragment, {}), jsx(PlusButton, { triggerAction: function () { setAddItemPopupType("event"); scroll(); }, color: item.color })] })) })) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Friends", checked: activeTab == 4 && true, onChange: function () { return setActiveTab(4); } }), jsx("div", { role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-h-[calc(100dvh-268px)] tw-overflow-y-auto fade tw-pt-2 tw-pb-1" })] })) }))] }) })));
4342
+ }
4343
+
4344
+ function OverlayItemProfileSettings() {
4345
+ var _this = this;
4346
+ var _a = useState(""), id = _a[0], setId = _a[1];
4347
+ var _b = useState(""), name = _b[0], setName = _b[1];
4348
+ var _c = useState(""), text = _c[0], setText = _c[1];
4349
+ var _d = useState(""), image = _d[0], setImage = _d[1];
4350
+ var _e = useState(""), color = _e[0], setColor = _e[1];
4351
+ var _f = useState(1), activeTab = _f[0], setActiveTab = _f[1];
4352
+ var _g = useState(false), loading = _g[0], setLoading = _g[1];
4353
+ var updateItem = useUpdateItem();
4354
+ var location = useLocation();
4355
+ var items = useItems();
4356
+ var _h = useState({}), item = _h[0], setItem = _h[1];
4357
+ var tags = useTags();
4358
+ var addTag = useAddTag();
4359
+ var navigate = useNavigate();
4360
+ useEffect(function () {
4361
+ var itemId = location.pathname.split("/")[2];
4362
+ var item = items.find(function (i) { return i.id === itemId; });
4363
+ item && setItem(item);
4364
+ }, [location, items, activeTab]);
4365
+ React.useEffect(function () {
4366
+ var _a, _b, _c;
4367
+ if ((_a = item.layer) === null || _a === void 0 ? void 0 : _a.itemColorField)
4368
+ setColor(getValue(item, (_b = item.layer) === null || _b === void 0 ? void 0 : _b.itemColorField));
4369
+ else
4370
+ setColor(((_c = item.layer) === null || _c === void 0 ? void 0 : _c.markerDefaultColor) || "#000");
4371
+ setId((item === null || item === void 0 ? void 0 : item.id) ? item.id : "");
4372
+ setName((item === null || item === void 0 ? void 0 : item.name) ? item.name : "");
4373
+ setText((item === null || item === void 0 ? void 0 : item.text) ? item.text : "");
4374
+ setImage((item === null || item === void 0 ? void 0 : item.image) ? item === null || item === void 0 ? void 0 : item.image : "");
4375
+ }, [item]);
4376
+ var onUpdateItem = function () { return __awaiter(_this, void 0, void 0, function () {
4377
+ var changedItem;
4378
+ var _a, _b, _c, _d, _e;
4379
+ return __generator(this, function (_f) {
4380
+ changedItem = {};
4381
+ changedItem = __assign({ id: id, name: name, text: text, color: color, position: item.position }, image.length > 10 && { image: image });
4382
+ // update profile item in current state
4383
+ //const item = items.find(i => i.layer?.itemOwnerField && getValue(i, i.layer?.itemOwnerField).id === id);
4384
+ // if (item && item.layer && item.layer.itemOwnerField) item[item.layer.itemOwnerField] = {... changedUser, offers: offer_state, needs: needs_state};
4385
+ // add new hashtags from profile text
4386
+ (_a = text.toLocaleLowerCase().match(hashTagRegex)) === null || _a === void 0 ? void 0 : _a.map(function (tag) {
4387
+ if (!tags.find(function (t) { return t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase(); })) {
4388
+ addTag({ id: crypto.randomUUID(), name: encodeTag(tag.slice(1).toLocaleLowerCase()), color: randomColor() });
4389
+ }
4390
+ });
4391
+ setLoading(true);
4392
+ ((_c = (_b = item === null || item === void 0 ? void 0 : item.layer) === null || _b === void 0 ? void 0 : _b.api) === null || _c === void 0 ? void 0 : _c.updateItem) && toast.promise((_e = (_d = item === null || item === void 0 ? void 0 : item.layer) === null || _d === void 0 ? void 0 : _d.api) === null || _e === void 0 ? void 0 : _e.updateItem(changedItem), {
4393
+ pending: 'updating Item ...',
4394
+ success: 'Item updated',
4395
+ error: {
4396
+ render: function (_a) {
4397
+ var data = _a.data;
4398
+ return "".concat(data);
4399
+ },
4400
+ },
4401
+ })
4402
+ .then(function () { return item && updateItem(__assign(__assign({}, item), changedItem)); })
4403
+ .then(function () {
4404
+ setLoading(false);
4405
+ navigate("/item/" + item.id);
4406
+ });
4407
+ return [2 /*return*/];
4408
+ });
4409
+ }); };
4410
+ return (jsx(Fragment, { children: jsx(MapOverlayPage, __assign({ backdrop: true, className: 'tw-mx-4 tw-mt-4 tw-mb-12 tw-overflow-x-hidden tw-max-h-[calc(100dvh-96px)] !tw-h-[calc(100dvh-96px)] tw-w-[calc(100%-32px)] md:tw-w-[calc(50%-32px)] tw-max-w-3xl !tw-left-auto tw-top-0 tw-bottom-0' }, { children: jsxs("div", __assign({ className: 'tw-flex tw-flex-col tw-h-full' }, { children: [jsxs("div", __assign({ className: "tw-flex" }, { children: [jsx(AvatarWidget, { avatar: image, setAvatar: setImage }), jsx(ColorPicker, { color: color, onChange: setColor, className: "-tw-left-6 tw-top-14 -tw-mr-6" }), jsx(TextInput, { placeholder: "Name", defaultValue: (item === null || item === void 0 ? void 0 : item.name) ? item.name : "", updateFormValue: function (v) { return setName(v); }, containerStyle: 'tw-grow tw-ml-6 tw-my-auto ' })] })), jsxs("div", __assign({ role: "tablist", className: "tw-tabs tw-tabs-lifted tw-mt-4" }, { children: [jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Vision", checked: activeTab == 1 && true, onChange: function () { return setActiveTab(1); } }), jsx("div", __assign({ role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-border-[var(--fallback-bc,oklch(var(--bc)/0.2))] tw-rounded-box tw-h-[calc(100dvh-332px)] tw-min-h-56" }, { children: jsx(TextAreaInput, { placeholder: "My Vision...", defaultValue: (item === null || item === void 0 ? void 0 : item.text) ? item.text : "", updateFormValue: function (v) { console.log(v); setText(v); }, containerStyle: 'tw-h-full', inputStyle: 'tw-h-full tw-border-t-0 tw-rounded-tl-none' }) })), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Projects", checked: activeTab == 2 && true, onChange: function () { return setActiveTab(2); } }), jsx("div", { role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-rounded-box tw-pt-4 tw-h-[calc(100dvh-332px)] tw-min-h-56" }), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Events", checked: activeTab == 3 && true, onChange: function () { return setActiveTab(3); } }), jsx("div", { role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-border-[var(--fallback-bc,oklch(var(--bc)/0.2))] tw-rounded-box tw-h-[calc(100dvh-332px)] tw-min-h-56" }), jsx("input", { type: "radio", name: "my_tabs_2", role: "tab", className: "tw-tab [--tab-border-color:var(--fallback-bc,oklch(var(--bc)/0.2))]", "aria-label": "Friends", checked: activeTab == 4 && true, onChange: function () { return setActiveTab(4); } }), jsx("div", { role: "tabpanel", className: "tw-tab-content tw-bg-base-100 tw-border-[var(--fallback-bc,oklch(var(--bc)/0.2))] tw-rounded-box tw-h-[calc(100dvh-332px)] tw-min-h-56" })] })), jsx("div", __assign({ className: "tw-mt-4 tw-mb-4" }, { children: jsx("button", __assign({ 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 onUpdateItem(); } }, { children: "Update" })) }))] })) })) }));
4411
+ }
4412
+
4413
4413
  function Modal(_a) {
4414
4414
  var children = _a.children, showOnStartup = _a.showOnStartup;
4415
4415
  useEffect(function () {
@@ -4431,7 +4431,7 @@ function Quests() {
4431
4431
  : "" }));
4432
4432
  }
4433
4433
 
4434
- 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: Helvetica, sans-serif, Roboto; /* 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-tab:hover {\n --tw-text-opacity: 1;\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-outline.tw-btn-error:hover {\n --tw-text-opacity: 1;\n color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn-outline.tw-btn-error:hover {\n background-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black);\n }\n }\n\n .tw-btn-outline.tw-btn-error:hover {\n --tw-text-opacity: 1;\n color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn-outline.tw-btn-error:hover {\n background-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/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-tab[disabled],\n .tw-tab[disabled]:hover {\n cursor: not-allowed;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --tw-text-opacity: 0.2;\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-tabs {\n display: grid;\n align-items: flex-end;\n}\n.tw-tabs-lifted:has(.tw-tab-content[class^=\"rounded-\"]) .tw-tab:first-child:not(.tw-tab-active),\n .tw-tabs-lifted:has(.tw-tab-content[class*=\" rounded-\"]) .tw-tab:first-child:not(.tw-tab-active) {\n border-bottom-color: transparent;\n}\n.tw-tab {\n position: relative;\n grid-row-start: 1;\n display: inline-flex;\n height: 2rem;\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 flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n text-align: center;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 2;\n --tab-padding: 1rem;\n --tw-text-opacity: 0.5;\n --tab-color: var(--fallback-bc,oklch(var(--bc)/1));\n --tab-bg: var(--fallback-b1,oklch(var(--b1)/1));\n --tab-border-color: var(--fallback-b3,oklch(var(--b3)/1));\n color: var(--tab-color);\n padding-inline-start: var(--tab-padding, 1rem);\n padding-inline-end: var(--tab-padding, 1rem);\n}\n.tw-tab:is(input[type=\"radio\"]) {\n width: auto;\n border-bottom-right-radius: 0px;\n border-bottom-left-radius: 0px;\n}\n.tw-tab:is(input[type=\"radio\"]):after {\n --tw-content: attr(aria-label);\n content: var(--tw-content);\n}\n.tw-tab:not(input):empty {\n cursor: default;\n grid-column-start: span 9999;\n}\n.tw-tab-content {\n grid-column-start: 1;\n grid-column-end: span 9999;\n grid-row-start: 2;\n margin-top: calc(var(--tab-border) * -1);\n display: none;\n border-color: transparent;\n border-width: var(--tab-border, 0);\n}\n:checked + .tw-tab-content:nth-child(2),\n .tw-tab-active + .tw-tab-content:nth-child(2) {\n border-start-start-radius: 0px;\n}\ninput.tw-tab:checked + .tw-tab-content,\n.tw-tab-active + .tw-tab-content {\n display: block;\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 .tw-btn-error {\n --btn-color: var(--fallback-er);\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-outline.tw-btn-error.tw-btn-active {\n background-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/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-error {\n --btn-color: var(--er);\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-error {\n --tw-text-opacity: 1;\n color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)));\n outline-color: var(--fallback-er,oklch(var(--er)/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-outline.tw-btn-error {\n --tw-text-opacity: 1;\n color: var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)));\n}\n.tw-btn-outline.tw-btn-error.tw-btn-active {\n --tw-text-opacity: 1;\n color: var(--fallback-erc,oklch(var(--erc)/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.tw-loading-md {\n width: 1.5rem;\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 color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-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-tabs-lifted > .tw-tab:focus-visible {\n border-end-end-radius: 0;\n border-end-start-radius: 0;\n}\n.tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]),\n .tw-tab:is(input:checked) {\n border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));\n --tw-border-opacity: 1;\n --tw-text-opacity: 1;\n}\n.tw-tab:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-tab:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: -5px;\n}\n.tw-tab-disabled,\n .tw-tab[disabled] {\n cursor: not-allowed;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --tw-text-opacity: 0.2;\n}\n.tw-tabs-bordered > .tw-tab {\n border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));\n --tw-border-opacity: 0.2;\n border-style: solid;\n border-bottom-width: calc(var(--tab-border, 1px) + 1px);\n}\n.tw-tabs-lifted > .tw-tab {\n border: var(--tab-border, 1px) solid transparent;\n border-width: 0 0 var(--tab-border, 1px) 0;\n border-start-start-radius: var(--tab-radius, 0.5rem);\n border-start-end-radius: var(--tab-radius, 0.5rem);\n border-bottom-color: var(--tab-border-color);\n padding-inline-start: var(--tab-padding, 1rem);\n padding-inline-end: var(--tab-padding, 1rem);\n padding-top: var(--tab-border, 1px);\n}\n.tw-tabs-lifted > .tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]),\n .tw-tabs-lifted > .tw-tab:is(input:checked) {\n background-color: var(--tab-bg);\n border-width: var(--tab-border, 1px) var(--tab-border, 1px) 0 var(--tab-border, 1px);\n border-inline-start-color: var(--tab-border-color);\n border-inline-end-color: var(--tab-border-color);\n border-top-color: var(--tab-border-color);\n padding-inline-start: calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));\n padding-inline-end: calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));\n padding-bottom: var(--tab-border, 1px);\n padding-top: 0;\n}\n.tw-tabs-lifted > .tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]):before, .tw-tabs-lifted > .tw-tab:is(input:checked):before {\n z-index: 1;\n content: \"\";\n display: block;\n position: absolute;\n width: calc(100% + var(--tab-radius, 0.5rem) * 2);\n height: var(--tab-radius, 0.5rem);\n bottom: 0;\n background-size: var(--tab-radius, 0.5rem);\n background-position: top left,\n top right;\n background-repeat: no-repeat;\n --tab-grad: calc(69% - var(--tab-border, 1px));\n --radius-start: radial-gradient(\n circle at top left,\n transparent var(--tab-grad),\n var(--tab-border-color) calc(var(--tab-grad) + 0.25px),\n var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)),\n var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + 0.25px)\n );\n --radius-end: radial-gradient(\n circle at top right,\n transparent var(--tab-grad),\n var(--tab-border-color) calc(var(--tab-grad) + 0.25px),\n var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)),\n var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + 0.25px)\n );\n background-image: var(--radius-start), var(--radius-end);\n}\n.tw-tabs-lifted > .tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]):first-child:before, .tw-tabs-lifted > .tw-tab:is(input:checked):first-child:before {\n background-image: var(--radius-end);\n background-position: top right;\n}\n[dir=\"rtl\"] .tw-tabs-lifted > .tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]):first-child:before, [dir=\"rtl\"] .tw-tabs-lifted > .tw-tab:is(input:checked):first-child:before {\n background-image: var(--radius-start);\n background-position: top left;\n}\n.tw-tabs-lifted > .tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]):last-child:before, .tw-tabs-lifted > .tw-tab:is(input:checked):last-child:before {\n background-image: var(--radius-start);\n background-position: top left;\n}\n[dir=\"rtl\"] .tw-tabs-lifted > .tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]):last-child:before, [dir=\"rtl\"] .tw-tabs-lifted > .tw-tab:is(input:checked):last-child:before {\n background-image: var(--radius-end);\n background-position: top right;\n}\n.tw-tabs-lifted\n > .tw-tab-active:not(.tw-tab-disabled):not([disabled])\n + .tw-tabs-lifted\n .tw-tab-active:not(.tw-tab-disabled):not([disabled]):before, .tw-tabs-lifted > .tw-tab:is(input:checked) + .tw-tabs-lifted .tw-tab:is(input:checked):before {\n background-image: var(--radius-end);\n background-position: top right;\n}\n.tw-tabs-boxed .tw-tab {\n border-radius: var(--rounded-btn, 0.5rem);\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-tabs-md :where(.tw-tab) {\n height: 2rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 2;\n --tab-padding: 1rem;\n}\n.tw-tabs-lg :where(.tw-tab) {\n height: 3rem;\n font-size: 1.125rem;\n line-height: 1.75rem;\n line-height: 2;\n --tab-padding: 1.25rem;\n}\n.tw-tabs-sm :where(.tw-tab) {\n height: 1.5rem;\n font-size: 0.875rem;\n line-height: .75rem;\n --tab-padding: 0.75rem;\n}\n.tw-tabs-xs :where(.tw-tab) {\n height: 1.25rem;\n font-size: 0.75rem;\n line-height: .75rem;\n --tab-padding: 0.5rem;\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-auto {\n left: auto !important;\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-16 {\n right: 4rem;\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-3000 {\n z-index: 3000;\n}\n.tw-z-500 {\n z-index: 500;\n}\n.tw-z-\\[10000\\] {\n z-index: 10000;\n}\n.tw-z-\\[10035\\] {\n z-index: 10035;\n}\n.tw-z-\\[2000\\] {\n z-index: 2000;\n}\n.tw-z-\\[4000\\] {\n z-index: 4000;\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-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-my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n.-tw-mx-4 {\n margin-left: -1rem;\n margin-right: -1rem;\n}\n.tw-mx-2 {\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n}\n.tw-mx-4 {\n margin-left: 1rem;\n margin-right: 1rem;\n}\n.tw-mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.tw-my-2 {\n margin-top: 0.5rem;\n margin-bottom: 0.5rem;\n}\n.tw-my-auto {\n margin-top: auto;\n margin-bottom: auto;\n}\n.-tw-mb-1 {\n margin-bottom: -0.25rem;\n}\n.-tw-mb-2 {\n margin-bottom: -0.5rem;\n}\n.-tw-mr-6 {\n margin-right: -1.5rem;\n}\n.tw-mb-0 {\n margin-bottom: 0px;\n}\n.tw-mb-1 {\n margin-bottom: 0.25rem;\n}\n.tw-mb-12 {\n margin-bottom: 3rem;\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-0 {\n margin-top: 0px;\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-mb-8 {\n margin-bottom: 2rem;\n}\n.tw-mb-10 {\n margin-bottom: 2.5rem;\n}\n.tw-inline-block {\n display: inline-block;\n}\n.tw-inline {\n display: inline;\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-96 {\n height: 24rem !important;\n}\n.\\!tw-h-\\[calc\\(100dvh-96px\\)\\] {\n height: calc(100dvh - 96px) !important;\n}\n.tw-h-10 {\n height: 2.5rem;\n}\n.tw-h-20 {\n height: 5rem;\n}\n.tw-h-24 {\n height: 6rem;\n}\n.tw-h-3 {\n height: 0.75rem;\n}\n.tw-h-36 {\n height: 9rem;\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-96 {\n height: 24rem;\n}\n.tw-h-\\[2\\.75em\\] {\n height: 2.75em;\n}\n.tw-h-\\[calc\\(100\\%-1rem\\)\\] {\n height: calc(100% - 1rem);\n}\n.tw-h-\\[calc\\(100dvh-268px\\)\\] {\n height: calc(100dvh - 268px);\n}\n.tw-h-\\[calc\\(100dvh-332px\\)\\] {\n height: calc(100dvh - 332px);\n}\n.tw-h-\\[calc\\(100dvh-64px\\)\\] {\n height: calc(100dvh - 64px);\n}\n.tw-h-\\[calc\\(100dvh-96px\\)\\] {\n height: calc(100dvh - 96px);\n}\n.tw-h-\\[calc\\(50\\%-0\\.75em\\)\\] {\n height: calc(50% - 0.75em);\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-16 {\n max-height: 4rem;\n}\n.tw-max-h-64 {\n max-height: 16rem;\n}\n.tw-max-h-\\[calc\\(100dvh-152px\\)\\] {\n max-height: calc(100dvh - 152px);\n}\n.tw-max-h-\\[calc\\(100dvh-96px\\)\\] {\n max-height: calc(100dvh - 96px);\n}\n.tw-min-h-0 {\n min-height: 0px;\n}\n.tw-min-h-56 {\n min-height: 224px;\n}\n.tw-min-h-\\[21px\\] {\n min-height: 21px;\n}\n.tw-min-h-\\[32px\\] {\n min-height: 32px;\n}\n.tw-min-h-\\[5em\\] {\n min-height: 5em;\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-20 {\n width: 5rem;\n}\n.tw-w-36 {\n width: 9rem;\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-80 {\n width: 20rem;\n}\n.tw-w-\\[56px\\] {\n width: 56px;\n}\n.tw-w-\\[calc\\(100\\%-32px\\)\\] {\n width: calc(100% - 32px);\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-min-w-\\[10em\\] {\n min-width: 10em;\n}\n.tw-min-w-\\[2\\.5em\\] {\n min-width: 2.5em;\n}\n.tw-max-w-3xl {\n max-width: 48rem;\n}\n.tw-max-w-\\[17rem\\] {\n max-width: 17rem;\n}\n.tw-max-w-\\[22rem\\] {\n max-width: 22rem;\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-cursor-text {\n cursor: text;\n}\n.tw-list-inside {\n list-style-position: inside;\n}\n.tw-list-decimal {\n list-style-type: decimal;\n}\n.tw-list-disc {\n list-style-type: disc;\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-place-items-center {\n place-items: center;\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-justify-between {\n justify-content: space-between;\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-auto {\n overflow: auto;\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-text-ellipsis {\n text-overflow: ellipsis;\n}\n.tw-whitespace-nowrap {\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-tl-none {\n border-top-left-radius: 0px;\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-\\[1px\\] {\n border-width: 1px;\n}\n.tw-border-t-0 {\n border-top-width: 0px;\n}\n.tw-border-none {\n border-style: none;\n}\n.tw-border-\\[var\\(--fallback-bc\\,oklch\\(var\\(--bc\\)\\/0\\.2\\)\\)\\] {\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-border-base-300 {\n --tw-border-opacity: 1;\n border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));\n}\n.tw-border-current {\n border-color: currentColor;\n}\n.tw-border-primary {\n --tw-border-opacity: 1;\n border-color: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));\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-1 {\n padding: 0.25rem;\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-p-\\[1px\\] {\n padding: 1px;\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-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-4 {\n padding-top: 1rem;\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-3xl {\n font-size: 1.875rem;\n line-height: 2.25rem;\n}\n.tw-text-7xl {\n font-size: 4.5rem;\n line-height: 1;\n}\n.tw-text-base {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.tw-text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.tw-text-map {\n font-size: 13px;\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-text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\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-leading-map {\n line-height: 1.4em;\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-current {\n color: currentColor;\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-opacity-50 {\n opacity: 0.5;\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-md {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px 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-te-primary {\n --tw-shadow: 0 0 0 1px rgb(59, 113, 202);\n --tw-shadow-colored: 0 0 0 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-backdrop-brightness-75 {\n --tw-backdrop-brightness: brightness(.75);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.tw-backdrop-contrast-50 {\n --tw-backdrop-contrast: contrast(.5);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\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.\\[--tab-border-color\\:var\\(--fallback-bc\\2c oklch\\(var\\(--bc\\)\\/0\\.2\\)\\)\\] {\n --tab-border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n\n.fade {\n -webkit-mask-image: linear-gradient(180deg, transparent, #000 2%, #000 98%, transparent);\n mask-image: linear-gradient(180deg, transparent, #000 2%, #000 98%, transparent);\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.Toastify__toast-container {\n z-index: 1999 !important;\n}\n\n.Toastify__toast-container--top-right {\n top: 4.75em !important;\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.tw-tab-content .container {\n height: 100%;\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-font-bold:hover {\n font-weight: 700;\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: 640px) {\n\n .sm\\:tw-grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\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-w-\\[calc\\(50\\%-32px\\)\\] {\n width: calc(50% - 32px);\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: 1024px) {\n\n .lg\\:tw-grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n\n .lg\\:tw-grid-cols-3 {\n grid-template-columns: repeat(3, 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 .xl\\:tw-grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\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}";
4434
+ 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: Helvetica, sans-serif, Roboto; /* 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-tab:hover {\n --tw-text-opacity: 1;\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-outline.tw-btn-error:hover {\n --tw-text-opacity: 1;\n color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn-outline.tw-btn-error:hover {\n background-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black);\n }\n }\n\n .tw-btn-outline.tw-btn-error:hover {\n --tw-text-opacity: 1;\n color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)));\n }\n\n @supports (color: color-mix(in oklab, black, black)) {\n\n .tw-btn-outline.tw-btn-error:hover {\n background-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/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-tab[disabled],\n .tw-tab[disabled]:hover {\n cursor: not-allowed;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --tw-text-opacity: 0.2;\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-tabs {\n display: grid;\n align-items: flex-end;\n}\n.tw-tabs-lifted:has(.tw-tab-content[class^=\"rounded-\"]) .tw-tab:first-child:not(.tw-tab-active),\n .tw-tabs-lifted:has(.tw-tab-content[class*=\" rounded-\"]) .tw-tab:first-child:not(.tw-tab-active) {\n border-bottom-color: transparent;\n}\n.tw-tab {\n position: relative;\n grid-row-start: 1;\n display: inline-flex;\n height: 2rem;\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 flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n text-align: center;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 2;\n --tab-padding: 1rem;\n --tw-text-opacity: 0.5;\n --tab-color: var(--fallback-bc,oklch(var(--bc)/1));\n --tab-bg: var(--fallback-b1,oklch(var(--b1)/1));\n --tab-border-color: var(--fallback-b3,oklch(var(--b3)/1));\n color: var(--tab-color);\n padding-inline-start: var(--tab-padding, 1rem);\n padding-inline-end: var(--tab-padding, 1rem);\n}\n.tw-tab:is(input[type=\"radio\"]) {\n width: auto;\n border-bottom-right-radius: 0px;\n border-bottom-left-radius: 0px;\n}\n.tw-tab:is(input[type=\"radio\"]):after {\n --tw-content: attr(aria-label);\n content: var(--tw-content);\n}\n.tw-tab:not(input):empty {\n cursor: default;\n grid-column-start: span 9999;\n}\n.tw-tab-content {\n grid-column-start: 1;\n grid-column-end: span 9999;\n grid-row-start: 2;\n margin-top: calc(var(--tab-border) * -1);\n display: none;\n border-color: transparent;\n border-width: var(--tab-border, 0);\n}\n:checked + .tw-tab-content:nth-child(2),\n .tw-tab-active + .tw-tab-content:nth-child(2) {\n border-start-start-radius: 0px;\n}\ninput.tw-tab:checked + .tw-tab-content,\n.tw-tab-active + .tw-tab-content {\n display: block;\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 .tw-btn-error {\n --btn-color: var(--fallback-er);\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-outline.tw-btn-error.tw-btn-active {\n background-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black);\n border-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/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-error {\n --btn-color: var(--er);\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-error {\n --tw-text-opacity: 1;\n color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)));\n outline-color: var(--fallback-er,oklch(var(--er)/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-outline.tw-btn-error {\n --tw-text-opacity: 1;\n color: var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)));\n}\n.tw-btn-outline.tw-btn-error.tw-btn-active {\n --tw-text-opacity: 1;\n color: var(--fallback-erc,oklch(var(--erc)/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.tw-loading-md {\n width: 1.5rem;\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 color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-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-tabs-lifted > .tw-tab:focus-visible {\n border-end-end-radius: 0;\n border-end-start-radius: 0;\n}\n.tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]),\n .tw-tab:is(input:checked) {\n border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));\n --tw-border-opacity: 1;\n --tw-text-opacity: 1;\n}\n.tw-tab:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.tw-tab:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: -5px;\n}\n.tw-tab-disabled,\n .tw-tab[disabled] {\n cursor: not-allowed;\n color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));\n --tw-text-opacity: 0.2;\n}\n.tw-tabs-bordered > .tw-tab {\n border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));\n --tw-border-opacity: 0.2;\n border-style: solid;\n border-bottom-width: calc(var(--tab-border, 1px) + 1px);\n}\n.tw-tabs-lifted > .tw-tab {\n border: var(--tab-border, 1px) solid transparent;\n border-width: 0 0 var(--tab-border, 1px) 0;\n border-start-start-radius: var(--tab-radius, 0.5rem);\n border-start-end-radius: var(--tab-radius, 0.5rem);\n border-bottom-color: var(--tab-border-color);\n padding-inline-start: var(--tab-padding, 1rem);\n padding-inline-end: var(--tab-padding, 1rem);\n padding-top: var(--tab-border, 1px);\n}\n.tw-tabs-lifted > .tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]),\n .tw-tabs-lifted > .tw-tab:is(input:checked) {\n background-color: var(--tab-bg);\n border-width: var(--tab-border, 1px) var(--tab-border, 1px) 0 var(--tab-border, 1px);\n border-inline-start-color: var(--tab-border-color);\n border-inline-end-color: var(--tab-border-color);\n border-top-color: var(--tab-border-color);\n padding-inline-start: calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));\n padding-inline-end: calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));\n padding-bottom: var(--tab-border, 1px);\n padding-top: 0;\n}\n.tw-tabs-lifted > .tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]):before, .tw-tabs-lifted > .tw-tab:is(input:checked):before {\n z-index: 1;\n content: \"\";\n display: block;\n position: absolute;\n width: calc(100% + var(--tab-radius, 0.5rem) * 2);\n height: var(--tab-radius, 0.5rem);\n bottom: 0;\n background-size: var(--tab-radius, 0.5rem);\n background-position: top left,\n top right;\n background-repeat: no-repeat;\n --tab-grad: calc(69% - var(--tab-border, 1px));\n --radius-start: radial-gradient(\n circle at top left,\n transparent var(--tab-grad),\n var(--tab-border-color) calc(var(--tab-grad) + 0.25px),\n var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)),\n var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + 0.25px)\n );\n --radius-end: radial-gradient(\n circle at top right,\n transparent var(--tab-grad),\n var(--tab-border-color) calc(var(--tab-grad) + 0.25px),\n var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)),\n var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + 0.25px)\n );\n background-image: var(--radius-start), var(--radius-end);\n}\n.tw-tabs-lifted > .tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]):first-child:before, .tw-tabs-lifted > .tw-tab:is(input:checked):first-child:before {\n background-image: var(--radius-end);\n background-position: top right;\n}\n[dir=\"rtl\"] .tw-tabs-lifted > .tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]):first-child:before, [dir=\"rtl\"] .tw-tabs-lifted > .tw-tab:is(input:checked):first-child:before {\n background-image: var(--radius-start);\n background-position: top left;\n}\n.tw-tabs-lifted > .tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]):last-child:before, .tw-tabs-lifted > .tw-tab:is(input:checked):last-child:before {\n background-image: var(--radius-start);\n background-position: top left;\n}\n[dir=\"rtl\"] .tw-tabs-lifted > .tw-tab.tw-tab-active:not(.tw-tab-disabled):not([disabled]):last-child:before, [dir=\"rtl\"] .tw-tabs-lifted > .tw-tab:is(input:checked):last-child:before {\n background-image: var(--radius-end);\n background-position: top right;\n}\n.tw-tabs-lifted\n > .tw-tab-active:not(.tw-tab-disabled):not([disabled])\n + .tw-tabs-lifted\n .tw-tab-active:not(.tw-tab-disabled):not([disabled]):before, .tw-tabs-lifted > .tw-tab:is(input:checked) + .tw-tabs-lifted .tw-tab:is(input:checked):before {\n background-image: var(--radius-end);\n background-position: top right;\n}\n.tw-tabs-boxed .tw-tab {\n border-radius: var(--rounded-btn, 0.5rem);\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-tabs-md :where(.tw-tab) {\n height: 2rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n line-height: 2;\n --tab-padding: 1rem;\n}\n.tw-tabs-lg :where(.tw-tab) {\n height: 3rem;\n font-size: 1.125rem;\n line-height: 1.75rem;\n line-height: 2;\n --tab-padding: 1.25rem;\n}\n.tw-tabs-sm :where(.tw-tab) {\n height: 1.5rem;\n font-size: 0.875rem;\n line-height: .75rem;\n --tab-padding: 0.75rem;\n}\n.tw-tabs-xs :where(.tw-tab) {\n height: 1.25rem;\n font-size: 0.75rem;\n line-height: .75rem;\n --tab-padding: 0.5rem;\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-auto {\n left: auto !important;\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-16 {\n right: 4rem;\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-3000 {\n z-index: 3000;\n}\n.tw-z-500 {\n z-index: 500;\n}\n.tw-z-\\[10000\\] {\n z-index: 10000;\n}\n.tw-z-\\[10035\\] {\n z-index: 10035;\n}\n.tw-z-\\[2000\\] {\n z-index: 2000;\n}\n.tw-z-\\[4000\\] {\n z-index: 4000;\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-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-my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n.-tw-mx-4 {\n margin-left: -1rem;\n margin-right: -1rem;\n}\n.tw-mx-2 {\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n}\n.tw-mx-4 {\n margin-left: 1rem;\n margin-right: 1rem;\n}\n.tw-mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.tw-my-2 {\n margin-top: 0.5rem;\n margin-bottom: 0.5rem;\n}\n.tw-my-auto {\n margin-top: auto;\n margin-bottom: auto;\n}\n.-tw-mb-1 {\n margin-bottom: -0.25rem;\n}\n.-tw-mb-2 {\n margin-bottom: -0.5rem;\n}\n.-tw-mr-6 {\n margin-right: -1.5rem;\n}\n.tw-mb-0 {\n margin-bottom: 0px;\n}\n.tw-mb-1 {\n margin-bottom: 0.25rem;\n}\n.tw-mb-10 {\n margin-bottom: 2.5rem;\n}\n.tw-mb-12 {\n margin-bottom: 3rem;\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-0 {\n margin-top: 0px;\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-inline {\n display: inline;\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-\\[calc\\(100dvh-96px\\)\\] {\n height: calc(100dvh - 96px) !important;\n}\n.tw-h-10 {\n height: 2.5rem;\n}\n.tw-h-20 {\n height: 5rem;\n}\n.tw-h-24 {\n height: 6rem;\n}\n.tw-h-3 {\n height: 0.75rem;\n}\n.tw-h-36 {\n height: 9rem;\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-96 {\n height: 24rem;\n}\n.tw-h-\\[2\\.75em\\] {\n height: 2.75em;\n}\n.tw-h-\\[calc\\(100\\%-1rem\\)\\] {\n height: calc(100% - 1rem);\n}\n.tw-h-\\[calc\\(100dvh-268px\\)\\] {\n height: calc(100dvh - 268px);\n}\n.tw-h-\\[calc\\(100dvh-332px\\)\\] {\n height: calc(100dvh - 332px);\n}\n.tw-h-\\[calc\\(100dvh-64px\\)\\] {\n height: calc(100dvh - 64px);\n}\n.tw-h-\\[calc\\(100dvh-96px\\)\\] {\n height: calc(100dvh - 96px);\n}\n.tw-h-\\[calc\\(50\\%-0\\.75em\\)\\] {\n height: calc(50% - 0.75em);\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-16 {\n max-height: 4rem;\n}\n.tw-max-h-64 {\n max-height: 16rem;\n}\n.tw-max-h-\\[calc\\(100dvh-152px\\)\\] {\n max-height: calc(100dvh - 152px);\n}\n.tw-max-h-\\[calc\\(100dvh-96px\\)\\] {\n max-height: calc(100dvh - 96px);\n}\n.tw-min-h-0 {\n min-height: 0px;\n}\n.tw-min-h-56 {\n min-height: 224px;\n}\n.tw-min-h-\\[21px\\] {\n min-height: 21px;\n}\n.tw-min-h-\\[32px\\] {\n min-height: 32px;\n}\n.tw-min-h-\\[5em\\] {\n min-height: 5em;\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-20 {\n width: 5rem;\n}\n.tw-w-36 {\n width: 9rem;\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-80 {\n width: 20rem;\n}\n.tw-w-\\[56px\\] {\n width: 56px;\n}\n.tw-w-\\[calc\\(100\\%-32px\\)\\] {\n width: calc(100% - 32px);\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-min-w-\\[10em\\] {\n min-width: 10em;\n}\n.tw-min-w-\\[2\\.5em\\] {\n min-width: 2.5em;\n}\n.tw-max-w-3xl {\n max-width: 48rem;\n}\n.tw-max-w-\\[17rem\\] {\n max-width: 17rem;\n}\n.tw-max-w-\\[22rem\\] {\n max-width: 22rem;\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-cursor-text {\n cursor: text;\n}\n.tw-list-inside {\n list-style-position: inside;\n}\n.tw-list-decimal {\n list-style-type: decimal;\n}\n.tw-list-disc {\n list-style-type: disc;\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-place-items-center {\n place-items: center;\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-justify-between {\n justify-content: space-between;\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-auto {\n overflow: auto;\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-text-ellipsis {\n text-overflow: ellipsis;\n}\n.tw-whitespace-nowrap {\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-tl-none {\n border-top-left-radius: 0px;\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-\\[1px\\] {\n border-width: 1px;\n}\n.tw-border-t-0 {\n border-top-width: 0px;\n}\n.tw-border-none {\n border-style: none;\n}\n.tw-border-\\[var\\(--fallback-bc\\,oklch\\(var\\(--bc\\)\\/0\\.2\\)\\)\\] {\n border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n.tw-border-base-300 {\n --tw-border-opacity: 1;\n border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));\n}\n.tw-border-current {\n border-color: currentColor;\n}\n.tw-border-primary {\n --tw-border-opacity: 1;\n border-color: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));\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-1 {\n padding: 0.25rem;\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-p-\\[1px\\] {\n padding: 1px;\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-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-4 {\n padding-top: 1rem;\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-3xl {\n font-size: 1.875rem;\n line-height: 2.25rem;\n}\n.tw-text-7xl {\n font-size: 4.5rem;\n line-height: 1;\n}\n.tw-text-base {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.tw-text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.tw-text-map {\n font-size: 13px;\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-text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\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-leading-map {\n line-height: 1.4em;\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-current {\n color: currentColor;\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-opacity-50 {\n opacity: 0.5;\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-md {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px 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-te-primary {\n --tw-shadow: 0 0 0 1px rgb(59, 113, 202);\n --tw-shadow-colored: 0 0 0 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-backdrop-brightness-75 {\n --tw-backdrop-brightness: brightness(.75);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.tw-backdrop-contrast-50 {\n --tw-backdrop-contrast: contrast(.5);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\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.\\[--tab-border-color\\:var\\(--fallback-bc\\2c oklch\\(var\\(--bc\\)\\/0\\.2\\)\\)\\] {\n --tab-border-color: var(--fallback-bc,oklch(var(--bc)/0.2));\n}\n\n.fade {\n -webkit-mask-image: linear-gradient(180deg, transparent, #000 2%, #000 98%, transparent);\n mask-image: linear-gradient(180deg, transparent, #000 2%, #000 98%, transparent);\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.Toastify__toast-container {\n z-index: 1999 !important;\n}\n\n.Toastify__toast-container--top-right {\n top: 4.75em !important;\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.tw-tab-content .container {\n height: 100%;\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-font-bold:hover {\n font-weight: 700;\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: 640px) {\n\n .sm\\:tw-grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\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-w-\\[calc\\(50\\%-32px\\)\\] {\n width: calc(50% - 32px);\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: 1024px) {\n\n .lg\\:tw-grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n\n .lg\\:tw-grid-cols-3 {\n grid-template-columns: repeat(3, 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 .xl\\:tw-grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\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}";
4435
4435
  styleInject(css_248z);
4436
4436
 
4437
4437
  export { AppShell, AuthProvider, CardPage, CircleLayout, Content, ItemForm, ItemView, ItemViewPage, ItemsIndexPage, Layer, LoginPage, MapOverlayPage, Modal, MoonCalendar, OverlayItemProfile, OverlayItemProfileSettings, OverlayProfile, OverlayProfileSettings, OverlayUserSettings, Permissions, PlusButton, PopupButton, PopupStartEndInput, PopupTextAreaInput, PopupTextInput, ProfileSettings, Quests, RequestPasswordPage, SelectBox, SetNewPasswordPage, SideBar, SignupPage, StartEndView, Tags, TextAreaInput, TextInput, TextView, TitleCard, UserSettings, UtopiaMap, useAuth };