utopia-ui 3.0.107 → 3.0.109
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/ItemsApi.d-D5bfsxpo.d.ts +13 -0
- package/dist/Profile.cjs.js +39429 -0
- package/dist/Profile.cjs.js.map +1 -0
- package/dist/Profile.d.ts +21 -2
- package/dist/Profile.esm.js +39403 -14
- package/dist/Profile.esm.js.map +1 -1
- package/dist/TagView-BDAxR2Eb.js +45021 -0
- package/dist/TagView-BDAxR2Eb.js.map +1 -0
- package/dist/TagView-BWPdSE7Z.js +44930 -0
- package/dist/TagView-BWPdSE7Z.js.map +1 -0
- package/dist/TagView-N0Ody3tW.js +2556 -0
- package/dist/TagView-N0Ody3tW.js.map +1 -0
- package/dist/TagView-S5y3vDwZ.js +2468 -0
- package/dist/TagView-S5y3vDwZ.js.map +1 -0
- package/dist/index.cjs.js +2105 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.esm.js +2 -8
- package/dist/index.esm.js.map +1 -1
- package/dist/types/src/Components/Input/RichTextEditor/Extensions/CustomHeading.d.ts +1 -0
- package/dist/types/src/Components/Input/RichTextEditor/Extensions/CustomImage.d.ts +1 -0
- package/dist/types/src/Components/Input/RichTextEditor/Extensions/Hashtag.d.ts +2 -0
- package/dist/types/src/Components/Input/RichTextEditor/Extensions/HashtagMention.d.ts +1 -0
- package/dist/types/src/Components/Input/RichTextEditor/Extensions/MentionList.d.ts +13 -0
- package/dist/types/src/Components/Input/RichTextEditor/Extensions/suggestion.d.ts +2 -0
- package/dist/types/src/Components/Input/RichTextEditor/RichTextEditor.d.ts +17 -0
- package/dist/types/src/Components/Input/RichTextEditor/TextEditorMenu.d.ts +4 -0
- package/dist/types/src/Utils/getTextFromMarkdown.d.ts +1 -0
- package/dist/types/src/index.d.ts +0 -1
- package/package.json +1 -1
@@ -0,0 +1,2105 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
require('leaflet/dist/leaflet.css');
|
4
|
+
require('leaflet.locatecontrol/dist/L.Control.Locate.css');
|
5
|
+
require('react-image-crop/dist/ReactCrop.css');
|
6
|
+
require('react-toastify/dist/ReactToastify.css');
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
8
|
+
var leaflet = require('leaflet');
|
9
|
+
var reactLeaflet = require('react-leaflet');
|
10
|
+
var reactQuery = require('@tanstack/react-query');
|
11
|
+
var React = require('react');
|
12
|
+
var reactRouterDom = require('react-router-dom');
|
13
|
+
var reactToastify = require('react-toastify');
|
14
|
+
var TagView = require('./TagView-N0Ody3tW.js');
|
15
|
+
var MarkerClusterGroup = require('react-leaflet-cluster');
|
16
|
+
var SVG = require('react-inlinesvg');
|
17
|
+
var axios = require('axios');
|
18
|
+
var QuestionMarkIcon = require('@heroicons/react/24/outline/QuestionMarkCircleIcon');
|
19
|
+
var ChevronRightIcon = require('@heroicons/react/24/outline/ChevronRightIcon');
|
20
|
+
var ChevronDownIcon = require('@heroicons/react/24/outline/ChevronDownIcon');
|
21
|
+
require('react-markdown');
|
22
|
+
require('remark-breaks');
|
23
|
+
|
24
|
+
function _interopNamespaceDefault(e) {
|
25
|
+
var n = Object.create(null);
|
26
|
+
if (e) {
|
27
|
+
Object.keys(e).forEach(function (k) {
|
28
|
+
if (k !== 'default') {
|
29
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
30
|
+
Object.defineProperty(n, k, d.get ? d : {
|
31
|
+
enumerable: true,
|
32
|
+
get: function () { return e[k]; }
|
33
|
+
});
|
34
|
+
}
|
35
|
+
});
|
36
|
+
}
|
37
|
+
n.default = e;
|
38
|
+
return Object.freeze(n);
|
39
|
+
}
|
40
|
+
|
41
|
+
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
42
|
+
|
43
|
+
function styleInject(css, ref) {
|
44
|
+
if ( ref === void 0 ) ref = {};
|
45
|
+
var insertAt = ref.insertAt;
|
46
|
+
|
47
|
+
if (!css || typeof document === 'undefined') { return; }
|
48
|
+
|
49
|
+
var head = document.head || document.getElementsByTagName('head')[0];
|
50
|
+
var style = document.createElement('style');
|
51
|
+
style.type = 'text/css';
|
52
|
+
|
53
|
+
if (insertAt === 'top') {
|
54
|
+
if (head.firstChild) {
|
55
|
+
head.insertBefore(style, head.firstChild);
|
56
|
+
} else {
|
57
|
+
head.appendChild(style);
|
58
|
+
}
|
59
|
+
} else {
|
60
|
+
head.appendChild(style);
|
61
|
+
}
|
62
|
+
|
63
|
+
if (style.styleSheet) {
|
64
|
+
style.styleSheet.cssText = css;
|
65
|
+
} else {
|
66
|
+
style.appendChild(document.createTextNode(css));
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
var css_248z$c = ".react-photo-album{display:flex}.react-photo-album,.react-photo-album *{box-sizing:border-box}.react-photo-album--track{align-items:flex-start;display:flex}.react-photo-album--photo{padding:calc(var(--react-photo-album--padding)*1px);position:relative}.react-photo-album--image{aspect-ratio:var(--react-photo-album--photo-width)/var(--react-photo-album--photo-height);display:block;height:auto;width:100%}.react-photo-album--button{background:initial;border:initial;cursor:pointer}.react-photo-album--rows{flex-direction:column;row-gap:calc(var(--react-photo-album--spacing)*1px)}.react-photo-album--rows .react-photo-album--track{justify-content:space-between;--react-photo-album--track-gaps:calc(var(--react-photo-album--spacing)*(var(--react-photo-album--track-size) - 1) + var(--react-photo-album--padding)*2*var(--react-photo-album--track-size))}.react-photo-album--rows .react-photo-album--photo{width:calc((100% - var(--react-photo-album--track-gaps)*1px)/(var(--react-photo-album--container-width) - var(--react-photo-album--track-gaps))*var(--react-photo-album--photo-width) + 2px*var(--react-photo-album--padding))}";
|
71
|
+
styleInject(css_248z$c);
|
72
|
+
|
73
|
+
var css_248z$b = ".yarl__fullsize{height:100%;width:100%}.yarl__relative{position:relative}.yarl__portal{bottom:0;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transition:opacity var(--yarl__fade_animation_duration,.25s) var(--yarl__fade_animation_timing_function,ease);z-index:var(--yarl__portal_zindex,9999)}.yarl__portal_open{opacity:1}.yarl__container{background-color:var(--yarl__container_background_color,var(--yarl__color_backdrop,#000));bottom:0;left:0;outline:none;overflow:hidden;overscroll-behavior:var(--yarl__controller_overscroll_behavior,contain);position:absolute;right:0;top:0;touch-action:var(--yarl__controller_touch_action,none);-webkit-user-select:none;-moz-user-select:none;user-select:none}.yarl__carousel{align-content:center;align-items:stretch;display:flex;flex:0 0 auto;height:100%;justify-content:center;opacity:var(--yarl__pull_opacity,1);transform:translate(var(--yarl__swipe_offset,0),var(--yarl__pull_offset,0));width:calc(100% + (var(--yarl__carousel_slides_count) - 1)*(100% + var(--yarl__carousel_spacing_px, 0)*1px + var(--yarl__carousel_spacing_percent, 0)*1%))}.yarl__carousel_with_slides{-moz-column-gap:calc(var(--yarl__carousel_spacing_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_spacing_percent, 0)*1%);column-gap:calc(var(--yarl__carousel_spacing_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_spacing_percent, 0)*1%)}.yarl__flex_center{align-content:center;align-items:center;display:flex;justify-content:center}.yarl__slide{flex:1;overflow:hidden;padding:calc(var(--yarl__carousel_padding_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_padding_percent, 0)*1%);position:relative}[dir=rtl] .yarl__slide{--yarl__direction:-1}.yarl__slide_image{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;touch-action:var(--yarl__controller_touch_action,none);-moz-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.yarl__slide_image_cover{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.yarl__slide_image_loading{opacity:0}@media screen and (min-width:800px){.yarl__slide_wrapper:not(.yarl__slide_wrapper_interactive) .yarl__slide_image{-webkit-backface-visibility:hidden;-webkit-transform:translateZ(0);-webkit-transform-style:preserve-3d}}.yarl__slide_placeholder{left:50%;line-height:0;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%)}.yarl__slide_loading{animation:yarl__delayed_fadein 1s linear;color:var(--yarl__slide_icon_loading_color,var(--yarl__color_button,hsla(0,0%,100%,.8)))}.yarl__slide_loading line{animation:yarl__stroke_opacity 1s linear infinite}.yarl__slide_loading line:first-of-type{animation-delay:-1.875s}.yarl__slide_loading line:nth-of-type(2){animation-delay:-1.75s}.yarl__slide_loading line:nth-of-type(3){animation-delay:-1.625s}.yarl__slide_loading line:nth-of-type(4){animation-delay:-1.5s}.yarl__slide_loading line:nth-of-type(5){animation-delay:-1.375s}.yarl__slide_loading line:nth-of-type(6){animation-delay:-1.25s}.yarl__slide_loading line:nth-of-type(7){animation-delay:-1.125s}.yarl__slide_loading line:nth-of-type(8){animation-delay:-1s}.yarl__slide_error{color:var(--yarl__slide_icon_error_color,red);height:var(--yarl__slide_icon_error_size,48px);width:var(--yarl__slide_icon_error_size,48px)}@media (prefers-reduced-motion){.yarl__portal,.yarl__slide{transition:unset}.yarl__slide_loading,.yarl__slide_loading line{animation:unset}}.yarl__toolbar{bottom:auto;display:flex;justify-content:flex-end;left:auto;padding:var(--yarl__toolbar_padding,8px);position:absolute;right:0;top:0}[dir=rtl] .yarl__toolbar{bottom:auto;left:0;right:auto;top:0}.yarl__icon{height:var(--yarl__icon_size,32px);width:var(--yarl__icon_size,32px)}.yarl__button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--yarl__button_background_color,transparent);border:var(--yarl__button_border,0);color:var(--yarl__color_button,hsla(0,0%,100%,.8));cursor:pointer;filter:var(--yarl__button_filter,drop-shadow(2px 2px 2px rgba(0,0,0,.8)));line-height:0;margin:var(--yarl__button_margin,0);outline:none;padding:var(--yarl__button_padding,8px);-webkit-tap-highlight-color:transparent}.yarl__button:focus{color:var(--yarl__color_button_active,#fff)}.yarl__button:focus:not(:focus-visible){color:var(--yarl__color_button,hsla(0,0%,100%,.8))}.yarl__button:focus-visible{color:var(--yarl__color_button_active,#fff)}@media (hover:hover){.yarl__button:focus-visible:hover,.yarl__button:focus:hover,.yarl__button:hover{color:var(--yarl__color_button_active,#fff)}}.yarl__button:disabled{color:var(--yarl__color_button_disabled,hsla(0,0%,100%,.4));cursor:default}.yarl__navigation_next,.yarl__navigation_prev{padding:var(--yarl__navigation_button_padding,24px 16px);position:absolute;top:50%;transform:translateY(-50%)}.yarl__navigation_prev{left:0}[dir=rtl] .yarl__navigation_prev{left:unset;right:0;transform:translateY(-50%) rotate(180deg)}.yarl__navigation_next{right:0}[dir=rtl] .yarl__navigation_next{left:0;right:unset;transform:translateY(-50%) rotate(180deg)}.yarl__no_scroll{height:100%;overflow:hidden;overscroll-behavior:none}@keyframes yarl__delayed_fadein{0%{opacity:0}80%{opacity:0}to{opacity:1}}@keyframes yarl__stroke_opacity{0%{stroke-opacity:1}to{stroke-opacity:.125}}";
|
74
|
+
styleInject(css_248z$b);
|
75
|
+
|
76
|
+
var css_248z$a = "/*! tailwindcss v4.0.14 | MIT License | https://tailwindcss.com */\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --tw-color-red-500: oklch(0.637 0.237 25.331);\n --tw-color-red-600: oklch(0.577 0.245 27.325);\n --tw-color-green-500: oklch(0.723 0.219 149.579);\n --tw-color-slate-200: oklch(0.929 0.013 255.508);\n --tw-color-slate-300: oklch(0.869 0.022 252.894);\n --tw-color-gray-200: oklch(0.928 0.006 264.531);\n --tw-color-gray-400: oklch(0.707 0.022 261.325);\n --tw-color-gray-500: oklch(0.551 0.027 264.364);\n --tw-color-gray-600: oklch(0.446 0.03 256.802);\n --tw-color-zinc-500: oklch(0.552 0.016 285.938);\n --tw-color-zinc-800: oklch(0.274 0.006 286.033);\n --tw-color-white: #fff;\n --tw-spacing: 0.25rem;\n --tw-container-xs: 20rem;\n --tw-container-xl: 36rem;\n --tw-container-2xl: 42rem;\n --tw-container-3xl: 48rem;\n --tw-container-6xl: 72rem;\n --tw-text-xs: 0.75rem;\n --tw-text-xs--line-height: calc(1 / 0.75);\n --tw-text-sm: 0.875rem;\n --tw-text-sm--line-height: calc(1.25 / 0.875);\n --tw-text-base: 1rem;\n --tw-text-base--line-height: calc(1.5 / 1);\n --tw-text-lg: 1.125rem;\n --tw-text-lg--line-height: calc(1.75 / 1.125);\n --tw-text-xl: 1.25rem;\n --tw-text-xl--line-height: calc(1.75 / 1.25);\n --tw-text-2xl: 1.5rem;\n --tw-text-2xl--line-height: calc(2 / 1.5);\n --tw-text-3xl: 1.875rem;\n --tw-text-3xl--line-height: calc(2.25 / 1.875);\n --tw-text-6xl: 3.75rem;\n --tw-text-6xl--line-height: 1;\n --tw-font-weight-normal: 400;\n --tw-font-weight-medium: 500;\n --tw-font-weight-semibold: 600;\n --tw-font-weight-bold: 700;\n --tw-radius-md: 0.375rem;\n --tw-radius-lg: 0.5rem;\n --tw-radius-xl: 0.75rem;\n --tw-radius-2xl: 1rem;\n --tw-drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12);\n --tw-ease-in: cubic-bezier(0.4, 0, 1, 1);\n --tw-default-transition-duration: 150ms;\n --tw-default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --tw-z-index-500: 500;\n --tw-z-index-1000: 1000;\n --tw-z-index-2000: 2000;\n --tw-z-index-3000: 3000;\n --tw-min-width-80: 320px;\n --tw-container-52: 208px;\n --tw-min-height-56: 224px;\n --tw-min-height-80: 320px;\n --tw-text-map: 13px;\n --tw-leading-map: 1.4em;\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var( --default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" );\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var( --default-font-variation-settings, normal );\n -webkit-tap-highlight-color: transparent;\n }\n body {\n line-height: inherit;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var( --default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace );\n font-feature-settings: var( --default-mono-font-feature-settings, normal );\n font-variation-settings: var( --default-mono-font-variation-settings, normal );\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n color: color-mix(in oklab, currentColor 50%, transparent);\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .tw\\:\\@container {\n container-type: inline-size;\n }\n .tw\\:modal {\n pointer-events: none;\n visibility: hidden;\n position: fixed;\n inset: calc(0.25rem * 0);\n margin: calc(0.25rem * 0);\n display: grid;\n height: 100%;\n max-height: none;\n width: 100%;\n max-width: none;\n align-items: center;\n justify-items: center;\n background-color: transparent;\n padding: calc(0.25rem * 0);\n color: inherit;\n overflow-x: hidden;\n transition: transform 0.3s ease-out, visibility 0.3s allow-discrete, background-color 0.3s ease-out, opacity 0.1s ease-out;\n overflow-y: hidden;\n overscroll-behavior: contain;\n z-index: 999;\n &::backdrop {\n display: none;\n }\n &.tw\\:modal-open, &[open], &:target {\n background-color: oklch(0% 0 0/ 0.4);\n transition: transform 0.3s ease-out, background-color 0.3s ease-out, opacity 0.1s ease-out;\n pointer-events: auto;\n visibility: visible;\n opacity: 100%;\n .tw\\:modal-box {\n translate: 0 0;\n scale: 1;\n opacity: 1;\n }\n }\n @starting-style {\n &.tw\\:modal-open, &[open], &:target {\n visibility: hidden;\n opacity: 0%;\n }\n }\n }\n .tw\\:tooltip {\n position: relative;\n display: inline-block;\n --tt-bg: var(--color-neutral);\n --tt-off: calc(100% + 0.5rem);\n --tt-tail: calc(100% + 1px + 0.25rem);\n > :where(.tw\\:tooltip-content), &[data-tip]:before {\n position: absolute;\n max-width: 20rem;\n border-radius: var(--radius-field);\n padding-inline: calc(0.25rem * 2);\n padding-block: calc(0.25rem * 1);\n text-align: center;\n white-space: normal;\n color: var(--color-neutral-content);\n opacity: 0%;\n font-size: 0.875rem;\n line-height: 1.25em;\n transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms;\n background-color: var(--tt-bg);\n width: max-content;\n pointer-events: none;\n z-index: 1;\n --tw-content: attr(data-tip);\n content: var(--tw-content);\n }\n &:after {\n position: absolute;\n position: absolute;\n opacity: 0%;\n background-color: var(--tt-bg);\n transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms;\n content: \"\";\n pointer-events: none;\n width: 0.625rem;\n height: 0.25rem;\n display: block;\n mask-repeat: no-repeat;\n mask-position: -1px 0;\n --mask-tooltip: url(\"data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A\");\n mask-image: var(--mask-tooltip);\n }\n &.tw\\:tooltip-open, &[data-tip]:hover, &:hover, &:has(:focus-visible) {\n > .tw\\:tooltip-content, &[data-tip]:before, &:after {\n opacity: 100%;\n --tt-pos: 0rem;\n transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 0ms;\n }\n }\n > .tw\\:tooltip-content, &[data-tip]:before {\n transform: translateX(-50%) translateY(var(--tt-pos, 0.25rem));\n inset: auto auto var(--tt-off) 50%;\n }\n &:after {\n transform: translateX(-50%) translateY(var(--tt-pos, 0.25rem));\n inset: auto auto var(--tt-tail) 50%;\n }\n }\n .tw\\:tab {\n position: relative;\n display: inline-flex;\n cursor: pointer;\n appearance: none;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n text-align: center;\n webkit-user-select: none;\n user-select: none;\n &:hover {\n @media (hover: hover) {\n color: var(--color-base-content);\n }\n }\n --tab-p: 1rem;\n --tab-bg: var(--color-base-100);\n --tab-border-color: var(--color-base-300);\n --tab-radius-ss: 0;\n --tab-radius-se: 0;\n --tab-radius-es: 0;\n --tab-radius-ee: 0;\n --tab-order: 0;\n --tab-radius-min: calc(0.75rem - var(--border));\n border-color: #0000;\n order: var(--tab-order);\n height: calc(var(--size-field, 0.25rem) * 10);\n font-size: 0.875rem;\n padding-inline-start: var(--tab-p);\n padding-inline-end: var(--tab-p);\n &:is(input[type=\"radio\"]) {\n min-width: fit-content;\n &:after {\n content: attr(aria-label);\n }\n }\n &:is(label) {\n position: relative;\n input {\n position: absolute;\n inset: calc(0.25rem * 0);\n cursor: pointer;\n appearance: none;\n opacity: 0%;\n }\n }\n &:checked, &:is(label:has(:checked)), &:is(.tw\\:tab-active, [aria-selected=\"true\"]) {\n & + .tw\\:tab-content {\n display: block;\n height: 100%;\n }\n }\n &:not(:checked, label:has(:checked), :hover, .tw\\:tab-active, [aria-selected=\"true\"]) {\n color: color-mix(in oklab, var(--color-base-content) 50%, transparent);\n }\n &:not(input):empty {\n flex-grow: 1;\n cursor: default;\n }\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n &:focus-visible, &:is(label:has(:checked:focus-visible)) {\n outline: 2px solid currentColor;\n outline-offset: -5px;\n }\n &[disabled] {\n pointer-events: none;\n opacity: 40%;\n }\n }\n .tw\\:menu {\n display: flex;\n width: fit-content;\n flex-direction: column;\n flex-wrap: wrap;\n padding: calc(0.25rem * 2);\n --menu-active-fg: var(--color-neutral-content);\n --menu-active-bg: var(--color-neutral);\n font-size: 0.875rem;\n :where(li ul) {\n position: relative;\n margin-inline-start: calc(0.25rem * 4);\n padding-inline-start: calc(0.25rem * 2);\n white-space: nowrap;\n &:before {\n position: absolute;\n inset-inline-start: calc(0.25rem * 0);\n top: calc(0.25rem * 3);\n bottom: calc(0.25rem * 3);\n background-color: var(--color-base-content);\n opacity: 10%;\n width: var(--border);\n content: \"\";\n }\n }\n :where(li > .tw\\:menu-dropdown:not(.tw\\:menu-dropdown-show)) {\n display: none;\n }\n :where(li:not(.tw\\:menu-title) > *:not(ul, details, .tw\\:menu-title, .tw\\:btn)), :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: calc(0.25rem * 2);\n border-radius: var(--radius-field);\n padding-inline: calc(0.25rem * 3);\n padding-block: calc(0.25rem * 1.5);\n text-align: start;\n transition-property: color, background-color, box-shadow;\n transition-duration: 0.2s;\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n grid-auto-columns: minmax(auto, max-content) auto max-content;\n text-wrap: balance;\n user-select: none;\n }\n :where(li > details > summary) {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n &::-webkit-details-marker {\n display: none;\n }\n }\n :where(li > details > summary), :where(li > .tw\\:menu-dropdown-toggle) {\n &:after {\n justify-self: flex-end;\n display: block;\n height: 0.375rem;\n width: 0.375rem;\n rotate: -135deg;\n translate: 0 -1px;\n transition-property: rotate, translate;\n transition-duration: 0.2s;\n content: \"\";\n transform-origin: 50% 50%;\n box-shadow: 2px 2px inset;\n pointer-events: none;\n }\n }\n :where(li > details[open] > summary):after, :where(li > .tw\\:menu-dropdown-toggle.tw\\:menu-dropdown-show):after {\n rotate: 45deg;\n translate: 0 1px;\n }\n :where( li:not(.tw\\:menu-title, .tw\\:disabled) > *:not(ul, details, .tw\\:menu-title), li:not(.tw\\:menu-title, .tw\\:disabled) > details > summary:not(.tw\\:menu-title) ):not(.tw\\:menu-active, :active, .tw\\:btn) {\n &.tw\\:menu-focus, &:focus-visible {\n cursor: pointer;\n background-color: color-mix(in oklab, var(--color-base-content) 10%, transparent);\n color: var(--color-base-content);\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n :where( li:not(.tw\\:menu-title, .tw\\:disabled) > *:not(ul, details, .tw\\:menu-title):not(.tw\\:menu-active, :active, .tw\\:btn):hover, li:not(.tw\\:menu-title, .tw\\:disabled) > details > summary:not(.tw\\:menu-title):not(.tw\\:menu-active, :active, .tw\\:btn):hover ) {\n cursor: pointer;\n background-color: color-mix(in oklab, var(--color-base-content) 10%, transparent);\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n box-shadow: 0 1px oklch(0% 0 0 / 0.01) inset, 0 -1px oklch(100% 0 0 / 0.01) inset;\n }\n :where(li:empty) {\n background-color: var(--color-base-content);\n opacity: 10%;\n margin: 0.5rem 1rem;\n height: 1px;\n }\n :where(li) {\n position: relative;\n display: flex;\n flex-shrink: 0;\n flex-direction: column;\n flex-wrap: wrap;\n align-items: stretch;\n .tw\\:badge {\n justify-self: flex-end;\n }\n & > *:not(ul, .tw\\:menu-title, details, .tw\\:btn):active, & > *:not(ul, .tw\\:menu-title, details, .tw\\:btn).tw\\:menu-active, & > details > summary:active {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n color: var(--menu-active-fg);\n background-color: var(--menu-active-bg);\n background-size: auto, calc(var(--noise) * 100%);\n background-image: none, var(--fx-noise);\n &:not(&:active) {\n box-shadow: 0 2px calc(var(--depth) * 3px) -2px var(--menu-active-bg);\n }\n }\n &.tw\\:menu-disabled {\n pointer-events: none;\n color: color-mix(in oklab, var(--color-base-content) 20%, transparent);\n }\n }\n .tw\\:dropdown:focus-within {\n .tw\\:menu-dropdown-toggle:after {\n rotate: 45deg;\n translate: 0 1px;\n }\n }\n .tw\\:dropdown-content {\n margin-top: calc(0.25rem * 2);\n padding: calc(0.25rem * 2);\n &:before {\n display: none;\n }\n }\n }\n .tw\\:dropdown {\n position: relative;\n display: inline-block;\n position-area: var(--anchor-v, bottom) var(--anchor-h, span-right);\n & > *:not(summary):focus {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n .tw\\:dropdown-content {\n position: absolute;\n }\n &:not(details, .tw\\:dropdown-open, .tw\\:dropdown-hover:hover, :focus-within) {\n .tw\\:dropdown-content {\n display: none;\n transform-origin: top;\n opacity: 0%;\n scale: 95%;\n }\n }\n &[popover], .tw\\:dropdown-content {\n z-index: 999;\n animation: dropdown 0.2s;\n transition-property: opacity, scale, display;\n transition-behavior: allow-discrete;\n transition-duration: 0.2s;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n @starting-style {\n &[popover], .tw\\:dropdown-content {\n scale: 95%;\n opacity: 0;\n }\n }\n &.tw\\:dropdown-open, &:not(.tw\\:dropdown-hover):focus, &:focus-within {\n > [tabindex]:first-child {\n pointer-events: none;\n }\n .tw\\:dropdown-content {\n opacity: 100%;\n }\n }\n &.tw\\:dropdown-hover:hover {\n .tw\\:dropdown-content {\n opacity: 100%;\n scale: 100%;\n }\n }\n &:is(details) {\n summary {\n &::-webkit-details-marker {\n display: none;\n }\n }\n }\n &.tw\\:dropdown-open, &:focus, &:focus-within {\n .tw\\:dropdown-content {\n scale: 100%;\n }\n }\n &:where([popover]) {\n background: #0000;\n }\n &[popover] {\n position: fixed;\n color: inherit;\n @supports not (position-area: bottom) {\n margin: auto;\n &.tw\\:dropdown-open:not(:popover-open) {\n display: none;\n transform-origin: top;\n opacity: 0%;\n scale: 95%;\n }\n &::backdrop {\n background-color: color-mix(in oklab, #000 30%, #0000);\n }\n }\n &:not(.tw\\:dropdown-open, :popover-open) {\n display: none;\n transform-origin: top;\n opacity: 0%;\n scale: 95%;\n }\n }\n }\n .tw\\:btn {\n display: inline-flex;\n flex-shrink: 0;\n cursor: pointer;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: center;\n gap: calc(0.25rem * 1.5);\n text-align: center;\n vertical-align: middle;\n outline-offset: 2px;\n webkit-user-select: none;\n user-select: none;\n padding-inline: var(--btn-p);\n color: var(--btn-fg);\n --tw-prose-links: var(--btn-fg);\n height: var(--size);\n font-size: var(--fontsize, 0.875rem);\n font-weight: 600;\n outline-color: var(--btn-color, var(--color-base-content));\n transition-property: color, background-color, border-color, box-shadow;\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n transition-duration: 0.2s;\n border-start-start-radius: var(--join-ss, var(--radius-field));\n border-start-end-radius: var(--join-se, var(--radius-field));\n border-end-start-radius: var(--join-es, var(--radius-field));\n border-end-end-radius: var(--join-ee, var(--radius-field));\n background-color: var(--btn-bg);\n background-size: auto, calc(var(--noise) * 100%);\n background-image: none, var(--btn-noise);\n border-width: var(--border);\n border-style: solid;\n border-color: var(--btn-border);\n text-shadow: 0 0.5px oklch(100% 0 0 / calc(var(--depth) * 0.15));\n box-shadow: 0 0.5px 0 0.5px oklch(100% 0 0 / calc(var(--depth) * 6%)) inset, var(--btn-shadow);\n --size: calc(var(--size-field, 0.25rem) * 10);\n --btn-bg: var(--btn-color, var(--color-base-200));\n --btn-fg: var(--color-base-content);\n --btn-p: 1rem;\n --btn-border: color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%));\n --btn-shadow: 0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000),\n 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000);\n --btn-noise: var(--fx-noise);\n .tw\\:prose & {\n text-decoration-line: none;\n }\n @media (hover: hover) {\n &:hover {\n --btn-bg: color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%);\n }\n }\n &:focus-visible {\n outline-width: 2px;\n outline-style: solid;\n }\n &:active:not(.tw\\:btn-active) {\n translate: 0 0.5px;\n --btn-bg: color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 5%);\n --btn-border: color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%);\n --btn-shadow: 0 0 0 0 oklch(0% 0 0/0), 0 0 0 0 oklch(0% 0 0/0);\n }\n &:is(:disabled, [disabled], .tw\\:btn-disabled) {\n &:not(.tw\\:btn-link, .tw\\:btn-ghost) {\n background-color: color-mix(in oklab, var(--color-base-content) 10%, transparent);\n box-shadow: none;\n }\n pointer-events: none;\n --btn-border: #0000;\n --btn-noise: none;\n --btn-fg: color-mix(in oklch, var(--color-base-content) 20%, #0000);\n @media (hover: hover) {\n &:hover {\n pointer-events: none;\n background-color: color-mix(in oklab, var(--color-neutral) 20%, transparent);\n --btn-border: #0000;\n --btn-fg: color-mix(in oklch, var(--color-base-content) 20%, #0000);\n }\n }\n }\n &:is(input[type=\"checkbox\"], input[type=\"radio\"]) {\n appearance: none;\n &::after {\n content: attr(aria-label);\n }\n }\n &:where(input:checked:not(.tw\\:filter .tw\\:btn)) {\n --btn-color: var(--color-primary);\n --btn-fg: var(--color-primary-content);\n isolation: isolate;\n }\n }\n .tw\\:loading {\n pointer-events: none;\n display: inline-block;\n aspect-ratio: 1 / 1;\n background-color: currentColor;\n vertical-align: middle;\n width: calc(var(--size-selector, 0.25rem) * 6);\n mask-size: 100%;\n mask-repeat: no-repeat;\n mask-position: center;\n mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\");\n }\n .tw\\:pointer-events-auto {\n pointer-events: auto;\n }\n .tw\\:pointer-events-none {\n pointer-events: none;\n }\n .tw\\:tabs-lift {\n --tabs-height: auto;\n --tabs-direction: row;\n > .tw\\:tab {\n --tab-border: 0 0 var(--border) 0;\n --tab-radius-ss: min(var(--radius-field), var(--tab-radius-min));\n --tab-radius-se: min(var(--radius-field), var(--tab-radius-min));\n --tab-radius-es: 0;\n --tab-radius-ee: 0;\n --tab-paddings: var(--border) var(--tab-p) 0 var(--tab-p);\n --tab-border-colors: #0000 #0000 var(--tab-border-color) #0000;\n --tab-corner-width: calc(100% + min(var(--radius-field), var(--tab-radius-min)) * 2);\n --tab-corner-height: min(var(--radius-field), var(--tab-radius-min));\n --tab-corner-position: top left, top right;\n border-width: var(--tab-border);\n border-start-start-radius: var(--tab-radius-ss);\n border-start-end-radius: var(--tab-radius-se);\n border-end-start-radius: var(--tab-radius-es);\n border-end-end-radius: var(--tab-radius-ee);\n padding: var(--tab-paddings);\n border-color: var(--tab-border-colors);\n &:is(.tw\\:tab-active, [aria-selected=\"true\"]):not(.tw\\:tab-disabled, [disabled]), &:is(input:checked, label:has(:checked)) {\n --tab-border: var(--border) var(--border) 0 var(--border);\n --tab-border-colors: var(--tab-border-color) var(--tab-border-color) #0000\n var(--tab-border-color);\n --tab-paddings: 0 calc(var(--tab-p) - var(--border)) var(--border)\n calc(var(--tab-p) - var(--border));\n --tab-inset: auto auto 0 auto;\n --tab-grad: calc(69% - var(--border));\n --radius-start: radial-gradient(\n circle at top left,\n #0000 var(--tab-grad),\n var(--tab-border-color) calc(var(--tab-grad) + 0.25px),\n var(--tab-border-color) calc(var(--tab-grad) + var(--border)),\n var(--tab-bg) calc(var(--tab-grad) + var(--border) + 0.25px)\n );\n --radius-end: radial-gradient(\n circle at top right,\n #0000 var(--tab-grad),\n var(--tab-border-color) calc(var(--tab-grad) + 0.25px),\n var(--tab-border-color) calc(var(--tab-grad) + var(--border)),\n var(--tab-bg) calc(var(--tab-grad) + var(--border) + 0.25px)\n );\n background-color: var(--tab-bg);\n &:before {\n z-index: 1;\n content: \"\";\n display: block;\n position: absolute;\n width: var(--tab-corner-width);\n height: var(--tab-corner-height);\n background-position: var(--tab-corner-position);\n background-image: var(--radius-start), var(--radius-end);\n background-size: min(var(--radius-field), var(--tab-radius-min)) min(var(--radius-field), var(--tab-radius-min));\n background-repeat: no-repeat;\n inset: var(--tab-inset);\n }\n &:first-child:before {\n --radius-start: none;\n }\n [dir=\"rtl\"] &:first-child:before {\n transform: rotateY(180deg);\n }\n &:last-child:before {\n --radius-end: none;\n }\n [dir=\"rtl\"] &:last-child:before {\n transform: rotateY(180deg);\n }\n }\n }\n &:has(.tw\\:tab-content) {\n > .tw\\:tab:first-child {\n &:not(.tw\\:tab-active, [aria-selected=\"true\"]) {\n --tab-border-colors: var(--tab-border-color) var(--tab-border-color) #0000\n var(--tab-border-color);\n }\n }\n }\n .tw\\:tab-content {\n --tabcontent-margin: calc(-1 * var(--border)) 0 0 0;\n --tabcontent-radius-ss: 0;\n --tabcontent-radius-se: var(--radius-box);\n --tabcontent-radius-es: var(--radius-box);\n --tabcontent-radius-ee: var(--radius-box);\n }\n :checked, label:has(:checked), :is(.tw\\:tab-active, [aria-selected=\"true\"]) {\n & + .tw\\:tab-content {\n &:nth-child(1), &:nth-child(n + 3) {\n --tabcontent-radius-ss: var(--radius-box);\n }\n }\n }\n }\n .tw\\:input {\n cursor: text;\n border: var(--border) solid #0000;\n position: relative;\n display: inline-flex;\n flex-shrink: 1;\n appearance: none;\n align-items: center;\n gap: calc(0.25rem * 2);\n background-color: var(--color-base-100);\n padding-inline: calc(0.25rem * 3);\n vertical-align: middle;\n white-space: nowrap;\n width: clamp(3rem, 20rem, 100%);\n height: var(--size);\n font-size: 0.875rem;\n border-start-start-radius: var(--join-ss, var(--radius-field));\n border-start-end-radius: var(--join-se, var(--radius-field));\n border-end-start-radius: var(--join-es, var(--radius-field));\n border-end-end-radius: var(--join-ee, var(--radius-field));\n border-color: var(--input-color);\n box-shadow: 0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset;\n --size: calc(var(--size-field, 0.25rem) * 10);\n --input-color: color-mix(in oklab, var(--color-base-content) 20%, #0000);\n &:where(input) {\n display: inline-flex;\n }\n :where(input) {\n display: inline-flex;\n height: 100%;\n width: 100%;\n appearance: none;\n background-color: transparent;\n border: none;\n &:focus, &:focus-within {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n &:focus, &:focus-within {\n --input-color: var(--color-base-content);\n box-shadow: 0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000);\n outline: 2px solid var(--input-color);\n outline-offset: 2px;\n isolation: isolate;\n }\n &:has(> input[disabled]), &:is(:disabled, [disabled]) {\n cursor: not-allowed;\n border-color: var(--color-base-200);\n background-color: var(--color-base-200);\n color: color-mix(in oklab, var(--color-base-content) 40%, transparent);\n &::placeholder {\n color: color-mix(in oklab, var(--color-base-content) 20%, transparent);\n }\n box-shadow: none;\n }\n &:has(> input[disabled]) > input[disabled] {\n cursor: not-allowed;\n }\n &::-webkit-date-and-time-value {\n text-align: inherit;\n }\n &[type=\"number\"] {\n &::-webkit-inner-spin-button {\n margin-block: calc(0.25rem * -3);\n margin-inline-end: calc(0.25rem * -3);\n }\n }\n &::-webkit-calendar-picker-indicator {\n position: absolute;\n inset-inline-end: 0.75em;\n }\n }\n .tw\\:indicator {\n position: relative;\n display: inline-flex;\n width: max-content;\n :where(.tw\\:indicator-item) {\n z-index: 1;\n position: absolute;\n white-space: nowrap;\n top: var(--inidicator-t, 0);\n bottom: var(--inidicator-b, auto);\n left: var(--inidicator-s, auto);\n right: var(--inidicator-e, 0);\n translate: var(--inidicator-x, 50%) var(--indicator-y, -50%);\n }\n }\n .tw\\:table {\n font-size: 0.875rem;\n position: relative;\n width: 100%;\n border-radius: var(--radius-box);\n text-align: left;\n &:where(:dir(rtl), [dir=\"rtl\"], [dir=\"rtl\"] *) {\n text-align: right;\n }\n tr.tw\\:row-hover {\n &, &:nth-child(even) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-base-200);\n }\n }\n }\n }\n :where(th, td) {\n padding-inline: calc(0.25rem * 4);\n padding-block: calc(0.25rem * 3);\n vertical-align: middle;\n }\n :where(thead, tfoot) {\n white-space: nowrap;\n color: color-mix(in oklab, var(--color-base-content) 60%, transparent);\n font-size: 0.875rem;\n font-weight: 600;\n }\n :where(tfoot) {\n border-top: var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000);\n }\n :where(.tw\\:table-pin-rows thead tr) {\n position: sticky;\n top: calc(0.25rem * 0);\n z-index: 1;\n background-color: var(--color-base-100);\n }\n :where(.tw\\:table-pin-rows tfoot tr) {\n position: sticky;\n bottom: calc(0.25rem * 0);\n z-index: 1;\n background-color: var(--color-base-100);\n }\n :where(.tw\\:table-pin-cols tr th) {\n position: sticky;\n right: calc(0.25rem * 0);\n left: calc(0.25rem * 0);\n background-color: var(--color-base-100);\n }\n :where(thead tr, tbody tr:not(:last-child)) {\n border-bottom: var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000);\n }\n }\n .tw\\:card {\n position: relative;\n display: flex;\n flex-direction: column;\n border-radius: var(--radius-box);\n outline-width: 2px;\n transition: outline 0.2s ease-in-out;\n outline: 0 solid #0000;\n outline-offset: 2px;\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n &:focus-visible {\n outline-color: currentColor;\n }\n :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 :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 &:where(.tw\\:card-border) {\n border: var(--border) solid var(--color-base-200);\n }\n &:where(.tw\\:card-dash) {\n border: var(--border) dashed var(--color-base-200);\n }\n &.tw\\:image-full {\n display: grid;\n &:before {\n position: relative;\n grid-column-start: 1;\n grid-row-start: 1;\n border-radius: var(--radius-box);\n background-color: var(--color-neutral);\n opacity: 75%;\n content: \"\";\n }\n > * {\n grid-column-start: 1;\n grid-row-start: 1;\n }\n > .tw\\:card-body {\n position: relative;\n color: var(--color-neutral-content);\n }\n :where(figure) {\n overflow: hidden;\n border-radius: inherit;\n }\n > figure img {\n height: 100%;\n object-fit: cover;\n }\n }\n figure {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n &:has(> input:is(input[type=\"checkbox\"], input[type=\"radio\"])) {\n cursor: pointer;\n user-select: none;\n }\n &:has(> :checked) {\n outline: 2px solid currentColor;\n }\n }\n .tw\\:select {\n border: var(--border) solid #0000;\n position: relative;\n display: inline-flex;\n flex-shrink: 1;\n appearance: none;\n align-items: center;\n gap: calc(0.25rem * 1.5);\n background-color: var(--color-base-100);\n padding-inline-start: calc(0.25rem * 4);\n padding-inline-end: calc(0.25rem * 7);\n vertical-align: middle;\n width: clamp(3rem, 20rem, 100%);\n height: var(--size);\n font-size: 0.875rem;\n border-start-start-radius: var(--join-ss, var(--radius-field));\n border-start-end-radius: var(--join-se, var(--radius-field));\n border-end-start-radius: var(--join-es, var(--radius-field));\n border-end-end-radius: var(--join-ee, var(--radius-field));\n background-image: linear-gradient(45deg, #0000 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, #0000 50%);\n background-position: calc(100% - 20px) calc(1px + 50%), calc(100% - 16.1px) calc(1px + 50%);\n background-size: 4px 4px, 4px 4px;\n background-repeat: no-repeat;\n text-overflow: ellipsis;\n box-shadow: 0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset;\n border-color: var(--input-color);\n --input-color: color-mix(in oklab, var(--color-base-content) 20%, #0000);\n --size: calc(var(--size-field, 0.25rem) * 10);\n [dir=\"rtl\"] & {\n background-position: calc(0% + 12px) calc(1px + 50%), calc(0% + 16px) calc(1px + 50%);\n }\n select {\n margin-inline-start: calc(0.25rem * -4);\n margin-inline-end: calc(0.25rem * -7);\n width: calc(100% + 2.75rem);\n appearance: none;\n padding-inline-start: calc(0.25rem * 4);\n padding-inline-end: calc(0.25rem * 7);\n height: calc(100% - 2px);\n background: inherit;\n border-radius: inherit;\n border-style: none;\n &:focus, &:focus-within {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n &:not(:last-child) {\n margin-inline-end: calc(0.25rem * -5.5);\n background-image: none;\n }\n }\n &:focus, &:focus-within {\n --input-color: var(--color-base-content);\n box-shadow: 0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000);\n outline: 2px solid var(--input-color);\n outline-offset: 2px;\n }\n &:has(> select[disabled]), &:is(:disabled, [disabled]) {\n cursor: not-allowed;\n border-color: var(--color-base-200);\n background-color: var(--color-base-200);\n color: color-mix(in oklab, var(--color-base-content) 40%, transparent);\n &::placeholder {\n color: color-mix(in oklab, var(--color-base-content) 20%, transparent);\n }\n }\n &:has(> select[disabled]) > select[disabled] {\n cursor: not-allowed;\n }\n }\n .tw\\:menu-horizontal {\n display: inline-flex;\n flex-direction: row;\n & > li:not(.tw\\:menu-title) > details > ul {\n position: absolute;\n margin-inline-start: calc(0.25rem * 0);\n margin-top: calc(0.25rem * 4);\n padding-block: calc(0.25rem * 2);\n padding-inline-end: calc(0.25rem * 2);\n }\n & > li > details > ul {\n &:before {\n content: none;\n }\n }\n :where(& > li:not(.tw\\:menu-title) > details > ul) {\n border-radius: var(--radius-box);\n background-color: var(--color-base-100);\n box-shadow: 0 1px 3px 0 oklch(0% 0 0/0.1), 0 1px 2px -1px oklch(0% 0 0/0.1);\n }\n }\n .tw\\:avatar {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n & > div {\n display: block;\n aspect-ratio: 1 / 1;\n overflow: hidden;\n }\n img {\n height: 100%;\n width: 100%;\n object-fit: cover;\n }\n }\n .tw\\:checkbox {\n border: var(--border) solid var(--input-color, color-mix(in oklab, var(--color-base-content) 20%, #0000));\n position: relative;\n flex-shrink: 0;\n cursor: pointer;\n appearance: none;\n border-radius: var(--radius-selector);\n padding: calc(0.25rem * 1);\n vertical-align: middle;\n color: var(--color-base-content);\n box-shadow: 0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 0 #0000 inset, 0 0 #0000;\n transition: background-color 0.2s, box-shadow 0.2s;\n --size: calc(var(--size-selector, 0.25rem) * 6);\n width: var(--size);\n height: var(--size);\n background-size: auto, calc(var(--noise) * 100%);\n background-image: none, var(--fx-noise);\n &:before {\n --tw-content: \"\";\n content: var(--tw-content);\n display: block;\n width: 100%;\n height: 100%;\n rotate: 45deg;\n background-color: currentColor;\n opacity: 0%;\n transition: clip-path 0.3s, opacity 0.1s, rotate 0.3s, translate 0.3s;\n transition-delay: 0.1s;\n clip-path: polygon(20% 100%, 20% 80%, 50% 80%, 50% 80%, 70% 80%, 70% 100%);\n box-shadow: 0px 3px 0 0px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset;\n font-size: 1rem;\n line-height: 0.75;\n }\n &:focus-visible {\n outline: 2px solid var(--input-color, currentColor);\n outline-offset: 2px;\n }\n &:checked, &[aria-checked=\"true\"] {\n background-color: var(--input-color, #0000);\n box-shadow: 0 0 #0000 inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1));\n &:before {\n clip-path: polygon(20% 100%, 20% 80%, 50% 80%, 50% 0%, 70% 0%, 70% 100%);\n opacity: 100%;\n }\n @media (forced-colors: active) {\n &:before {\n rotate: 0deg;\n background-color: transparent;\n --tw-content: \"✔︎\";\n clip-path: none;\n }\n }\n @media print {\n &:before {\n rotate: 0deg;\n background-color: transparent;\n --tw-content: \"✔︎\";\n clip-path: none;\n }\n }\n }\n &:indeterminate {\n &:before {\n rotate: 0deg;\n opacity: 100%;\n translate: 0 -35%;\n clip-path: polygon(20% 100%, 20% 80%, 50% 80%, 50% 80%, 80% 80%, 80% 100%);\n }\n }\n &:disabled {\n cursor: not-allowed;\n opacity: 20%;\n }\n }\n .tw\\:stats {\n position: relative;\n display: inline-grid;\n grid-auto-flow: column;\n overflow-x: auto;\n border-radius: var(--radius-box);\n }\n .tw\\:absolute {\n position: absolute;\n }\n .tw\\:fixed {\n position: fixed;\n }\n .tw\\:relative {\n position: relative;\n }\n .tw\\:tooltip-left {\n > .tw\\:tooltip-content, &[data-tip]:before {\n transform: translateX(calc(var(--tt-pos, 0.25rem) - 0.25rem)) translateY(-50%);\n inset: 50% var(--tt-off) auto auto;\n }\n &:after {\n transform: translateX(var(--tt-pos, 0.25rem)) translateY(-50%) rotate(-90deg);\n inset: 50% calc(var(--tt-tail) + 1px) auto auto;\n }\n }\n .tw\\:tooltip-right {\n > .tw\\:tooltip-content, &[data-tip]:before {\n transform: translateX(calc(var(--tt-pos, -0.25rem) + 0.25rem)) translateY(-50%);\n inset: 50% auto auto var(--tt-off);\n }\n &:after {\n transform: translateX(var(--tt-pos, -0.25rem)) translateY(-50%) rotate(90deg);\n inset: 50% auto auto calc(var(--tt-tail) + 1px);\n }\n }\n .tw\\:inset-0 {\n inset: calc(var(--tw-spacing) * 0);\n }\n .tw\\:inset-y-0 {\n inset-block: calc(var(--tw-spacing) * 0);\n }\n .tw\\:dropdown-end {\n --anchor-h: span-left;\n :where(.tw\\:dropdown-content) {\n inset-inline-end: calc(0.25rem * 0);\n translate: 0 0;\n }\n &.tw\\:dropdown-left {\n --anchor-h: left;\n --anchor-v: span-top;\n .tw\\:dropdown-content {\n top: auto;\n bottom: calc(0.25rem * 0);\n }\n }\n &.tw\\:dropdown-right {\n --anchor-h: right;\n --anchor-v: span-top;\n .tw\\:dropdown-content {\n top: auto;\n bottom: calc(0.25rem * 0);\n }\n }\n }\n .tw\\:dropdown-bottom {\n --anchor-v: bottom;\n .tw\\:dropdown-content {\n top: 100%;\n bottom: auto;\n transform-origin: top;\n }\n }\n .tw\\:dropdown-top {\n --anchor-v: top;\n .tw\\:dropdown-content {\n top: auto;\n bottom: 100%;\n transform-origin: bottom;\n }\n }\n .tw\\:-top-2 {\n top: calc(var(--tw-spacing) * -2);\n }\n .tw\\:top-0 {\n top: calc(var(--tw-spacing) * 0);\n }\n .tw\\:top-1 {\n top: calc(var(--tw-spacing) * 1);\n }\n .tw\\:top-2 {\n top: calc(var(--tw-spacing) * 2);\n }\n .tw\\:top-4 {\n top: calc(var(--tw-spacing) * 4);\n }\n .tw\\:top-14 {\n top: calc(var(--tw-spacing) * 14);\n }\n .tw\\:-right-2 {\n right: calc(var(--tw-spacing) * -2);\n }\n .tw\\:right-0 {\n right: calc(var(--tw-spacing) * 0);\n }\n .tw\\:right-1 {\n right: calc(var(--tw-spacing) * 1);\n }\n .tw\\:right-2 {\n right: calc(var(--tw-spacing) * 2);\n }\n .tw\\:right-4 {\n right: calc(var(--tw-spacing) * 4);\n }\n .tw\\:right-5 {\n right: calc(var(--tw-spacing) * 5);\n }\n .tw\\:right-6 {\n right: calc(var(--tw-spacing) * 6);\n }\n .tw\\:bottom-0 {\n bottom: calc(var(--tw-spacing) * 0);\n }\n .tw\\:bottom-4 {\n bottom: calc(var(--tw-spacing) * 4);\n }\n .tw\\:bottom-24\\! {\n bottom: calc(var(--tw-spacing) * 24) !important;\n }\n .tw\\:-left-6 {\n left: calc(var(--tw-spacing) * -6);\n }\n .tw\\:left-0 {\n left: calc(var(--tw-spacing) * 0);\n }\n .tw\\:left-0\\! {\n left: calc(var(--tw-spacing) * 0) !important;\n }\n .tw\\:left-1\\/2 {\n left: calc(1/2 * 100%);\n }\n .tw\\:left-4 {\n left: calc(var(--tw-spacing) * 4);\n }\n .tw\\:left-auto\\! {\n left: auto !important;\n }\n .tw\\:file-input {\n cursor: pointer;\n cursor: pointer;\n border: var(--border) solid #0000;\n display: inline-flex;\n appearance: none;\n align-items: center;\n background-color: var(--color-base-100);\n vertical-align: middle;\n webkit-user-select: none;\n user-select: none;\n width: clamp(3rem, 20rem, 100%);\n height: var(--size);\n padding-inline-end: 0.75rem;\n font-size: 0.875rem;\n line-height: 2;\n border-start-start-radius: var(--join-ss, var(--radius-field));\n border-start-end-radius: var(--join-se, var(--radius-field));\n border-end-start-radius: var(--join-es, var(--radius-field));\n border-end-end-radius: var(--join-ee, var(--radius-field));\n border-color: var(--input-color);\n box-shadow: 0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset;\n --size: calc(var(--size-field, 0.25rem) * 10);\n --input-color: color-mix(in oklab, var(--color-base-content) 20%, #0000);\n &::file-selector-button {\n margin-inline-end: calc(0.25rem * 4);\n cursor: pointer;\n padding-inline: calc(0.25rem * 4);\n webkit-user-select: none;\n user-select: none;\n height: calc(100% + var(--border) * 2);\n margin-block: calc(var(--border) * -1);\n margin-inline-start: calc(var(--border) * -1);\n font-size: 0.875rem;\n color: var(--btn-fg);\n border-width: var(--border);\n border-style: solid;\n border-color: var(--btn-border);\n border-start-start-radius: calc(var(--join-ss, var(--radius-field) - var(--border)));\n border-end-start-radius: calc(var(--join-es, var(--radius-field) - var(--border)));\n font-weight: 600;\n background-color: var(--btn-bg);\n background-size: calc(var(--noise) * 100%);\n background-image: var(--btn-noise);\n text-shadow: 0 0.5px oklch(1 0 0 / calc(var(--depth) * 0.15));\n box-shadow: 0 0.5px 0 0.5px color-mix( in oklab, color-mix(in oklab, white 30%, var(--btn-bg)) calc(var(--depth) * 20%), #0000 ) inset, var(--btn-shadow);\n --size: calc(var(--size-field, 0.25rem) * 10);\n --btn-bg: var(--btn-color, var(--color-base-200));\n --btn-fg: var(--color-base-content);\n --btn-border: color-mix(in oklab, var(--btn-bg), #000 5%);\n --btn-shadow: 0 3px 2px -2px color-mix(in oklab, var(--btn-bg) 30%, #0000),\n 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) 30%, #0000);\n --btn-noise: var(--fx-noise);\n }\n &:focus {\n --input-color: var(--color-base-content);\n box-shadow: 0 1px color-mix(in oklab, var(--input-color) 10%, #0000);\n outline: 2px solid var(--input-color);\n outline-offset: 2px;\n isolation: isolate;\n }\n &:has(> input[disabled]), &:is(:disabled, [disabled]) {\n cursor: not-allowed;\n border-color: var(--color-base-200);\n background-color: var(--color-base-200);\n &::placeholder {\n color: color-mix(in oklab, var(--color-base-content) 20%, transparent);\n }\n box-shadow: none;\n color: color-mix(in oklch, var(--color-base-content) 20%, #0000);\n &::file-selector-button {\n cursor: not-allowed;\n border-color: var(--color-base-200);\n background-color: var(--color-base-200);\n --btn-border: #0000;\n --btn-noise: none;\n --btn-fg: color-mix(in oklch, var(--color-base-content) 20%, #0000);\n }\n }\n }\n .tw\\:textarea {\n border: var(--border) solid #0000;\n min-height: calc(0.25rem * 20);\n flex-shrink: 1;\n appearance: none;\n border-radius: var(--radius-field);\n background-color: var(--color-base-100);\n padding-block: calc(0.25rem * 2);\n vertical-align: middle;\n width: clamp(3rem, 20rem, 100%);\n padding-inline-start: 0.75rem;\n padding-inline-end: 0.75rem;\n font-size: 0.875rem;\n border-color: var(--input-color);\n box-shadow: 0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset;\n --input-color: color-mix(in oklab, var(--color-base-content) 20%, #0000);\n textarea {\n appearance: none;\n background-color: transparent;\n border: none;\n &:focus, &:focus-within {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n &:focus, &:focus-within {\n --input-color: var(--color-base-content);\n box-shadow: 0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000);\n outline: 2px solid var(--input-color);\n outline-offset: 2px;\n isolation: isolate;\n }\n &:has(> textarea[disabled]), &:is(:disabled, [disabled]) {\n cursor: not-allowed;\n border-color: var(--color-base-200);\n background-color: var(--color-base-200);\n color: color-mix(in oklab, var(--color-base-content) 40%, transparent);\n &::placeholder {\n color: color-mix(in oklab, var(--color-base-content) 20%, transparent);\n }\n box-shadow: none;\n }\n &:has(> textarea[disabled]) > textarea[disabled] {\n cursor: not-allowed;\n }\n }\n .tw\\:modal-backdrop {\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 z-index: -1;\n button {\n cursor: pointer;\n }\n }\n .tw\\:z-1 {\n z-index: 1;\n }\n .tw\\:z-500 {\n z-index: var(--tw-z-index-500);\n }\n .tw\\:z-999 {\n z-index: 999;\n }\n .tw\\:z-1000 {\n z-index: var(--tw-z-index-1000);\n }\n .tw\\:z-2000 {\n z-index: var(--tw-z-index-2000);\n }\n .tw\\:z-3000 {\n z-index: var(--tw-z-index-3000);\n }\n .tw\\:z-4000 {\n z-index: 4000;\n }\n .tw\\:z-9998 {\n z-index: 9998;\n }\n .tw\\:z-10000 {\n z-index: 10000;\n }\n .tw\\:z-10000\\! {\n z-index: 10000 !important;\n }\n .tw\\:z-10035 {\n z-index: 10035;\n }\n .tw\\:tab-content {\n order: var(--tabcontent-order);\n display: none;\n border-color: transparent;\n --tabcontent-radius-ss: 0;\n --tabcontent-radius-se: 0;\n --tabcontent-radius-es: 0;\n --tabcontent-radius-ee: 0;\n --tabcontent-order: 1;\n width: 100%;\n margin: var(--tabcontent-margin);\n border-width: var(--border);\n border-start-start-radius: var(--tabcontent-radius-ss);\n border-start-end-radius: var(--tabcontent-radius-se);\n border-end-start-radius: var(--tabcontent-radius-es);\n border-end-end-radius: var(--tabcontent-radius-ee);\n }\n .tw\\:col-span-1 {\n grid-column: span 1 / span 1;\n }\n .tw\\:modal-box {\n grid-column-start: 1;\n grid-row-start: 1;\n max-height: 100vh;\n width: calc(11/12 * 100%);\n max-width: 32rem;\n background-color: var(--color-base-100);\n padding: calc(0.25rem * 6);\n transition: translate 0.3s ease-out, scale 0.3s ease-out, opacity 0.2s ease-out 0.05s, box-shadow 0.3s ease-out;\n border-top-left-radius: var(--modal-tl, var(--radius-box));\n border-top-right-radius: var(--modal-tr, var(--radius-box));\n border-bottom-left-radius: var(--modal-bl, var(--radius-box));\n border-bottom-right-radius: var(--modal-br, var(--radius-box));\n scale: 95%;\n opacity: 0;\n box-shadow: oklch(0% 0 0/ 0.25) 0px 25px 50px -12px;\n overflow-y: auto;\n overscroll-behavior: contain;\n }\n .tw\\:stat-value {\n grid-column-start: 1;\n white-space: nowrap;\n font-size: 2rem;\n font-weight: 800;\n }\n .tw\\:stat-title {\n grid-column-start: 1;\n white-space: nowrap;\n color: color-mix(in oklab, var(--color-base-content) 60%, transparent);\n font-size: 0.75rem;\n }\n .tw\\:float-left {\n float: left;\n }\n .tw\\:float-right {\n float: right;\n }\n .tw\\:divider {\n display: flex;\n height: calc(0.25rem * 4);\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n white-space: nowrap;\n margin: var(--divider-m, 1rem 0);\n &:before, &:after {\n content: \"\";\n height: calc(0.25rem * 0.5);\n width: 100%;\n flex-grow: 1;\n background-color: color-mix(in oklab, var(--color-base-content) 10%, transparent);\n }\n @media print {\n &:before, &:after {\n border: 0.5px solid;\n }\n }\n &:not(:empty) {\n gap: calc(0.25rem * 4);\n }\n }\n .tw\\:m-1 {\n margin: calc(var(--tw-spacing) * 1);\n }\n .tw\\:m-2 {\n margin: calc(var(--tw-spacing) * 2);\n }\n .tw\\:m-4 {\n margin: calc(var(--tw-spacing) * 4);\n }\n .tw\\:m-4\\! {\n margin: calc(var(--tw-spacing) * 4) !important;\n }\n .tw\\:m-auto {\n margin: auto;\n }\n .tw\\:mx-0\\.5 {\n margin-inline: calc(var(--tw-spacing) * 0.5);\n }\n .tw\\:mx-1 {\n margin-inline: calc(var(--tw-spacing) * 1);\n }\n .tw\\:mx-2 {\n margin-inline: calc(var(--tw-spacing) * 2);\n }\n .tw\\:mx-4 {\n margin-inline: calc(var(--tw-spacing) * 4);\n }\n .tw\\:mx-6 {\n margin-inline: calc(var(--tw-spacing) * 6);\n }\n .tw\\:input-md {\n --size: calc(var(--size-field, 0.25rem) * 10);\n font-size: 0.875rem;\n &[type=\"number\"] {\n &::-webkit-inner-spin-button {\n margin-block: calc(0.25rem * -3);\n margin-inline-end: calc(0.25rem * -3);\n }\n }\n }\n .tw\\:input-sm {\n --size: calc(var(--size-field, 0.25rem) * 8);\n font-size: 0.75rem;\n &[type=\"number\"] {\n &::-webkit-inner-spin-button {\n margin-block: calc(0.25rem * -2);\n margin-inline-end: calc(0.25rem * -3);\n }\n }\n }\n .tw\\:my-0\\! {\n margin-block: calc(var(--tw-spacing) * 0) !important;\n }\n .tw\\:my-1 {\n margin-block: calc(var(--tw-spacing) * 1);\n }\n .tw\\:my-2 {\n margin-block: calc(var(--tw-spacing) * 2);\n }\n .tw\\:my-4 {\n margin-block: calc(var(--tw-spacing) * 4);\n }\n .tw\\:my-10 {\n margin-block: calc(var(--tw-spacing) * 10);\n }\n .tw\\:label {\n display: inline-flex;\n align-items: center;\n gap: calc(0.25rem * 1.5);\n white-space: nowrap;\n color: color-mix(in oklab, currentColor 60%, transparent);\n &:has(input) {\n cursor: pointer;\n }\n &:is(.tw\\:input > *, .tw\\:select > *) {\n display: flex;\n height: calc(100% - 0.5rem);\n align-items: center;\n padding-inline: calc(0.25rem * 3);\n white-space: nowrap;\n font-size: inherit;\n &:first-child {\n margin-inline-start: calc(0.25rem * -3);\n margin-inline-end: calc(0.25rem * 3);\n border-inline-end: var(--border) solid color-mix(in oklab, currentColor 10%, #0000);\n }\n &:last-child {\n margin-inline-start: calc(0.25rem * 3);\n margin-inline-end: calc(0.25rem * -3);\n border-inline-start: var(--border) solid color-mix(in oklab, currentColor 10%, #0000);\n }\n }\n }\n .tw\\:-mt-2 {\n margin-top: calc(var(--tw-spacing) * -2);\n }\n .tw\\:mt-0 {\n margin-top: calc(var(--tw-spacing) * 0);\n }\n .tw\\:mt-1 {\n margin-top: calc(var(--tw-spacing) * 1);\n }\n .tw\\:mt-1\\.5 {\n margin-top: calc(var(--tw-spacing) * 1.5);\n }\n .tw\\:mt-2 {\n margin-top: calc(var(--tw-spacing) * 2);\n }\n .tw\\:mt-3 {\n margin-top: calc(var(--tw-spacing) * 3);\n }\n .tw\\:mt-4 {\n margin-top: calc(var(--tw-spacing) * 4);\n }\n .tw\\:mt-5 {\n margin-top: calc(var(--tw-spacing) * 5);\n }\n .tw\\:mt-5\\.5 {\n margin-top: calc(var(--tw-spacing) * 5.5);\n }\n .tw\\:mt-6 {\n margin-top: calc(var(--tw-spacing) * 6);\n }\n .tw\\:mt-8 {\n margin-top: calc(var(--tw-spacing) * 8);\n }\n .tw\\:mt-12 {\n margin-top: calc(var(--tw-spacing) * 12);\n }\n .tw\\:mt-16 {\n margin-top: calc(var(--tw-spacing) * 16);\n }\n .tw\\:-mr-4 {\n margin-right: calc(var(--tw-spacing) * -4);\n }\n .tw\\:-mr-6 {\n margin-right: calc(var(--tw-spacing) * -6);\n }\n .tw\\:mr-1 {\n margin-right: calc(var(--tw-spacing) * 1);\n }\n .tw\\:mr-2 {\n margin-right: calc(var(--tw-spacing) * 2);\n }\n .tw\\:mr-4 {\n margin-right: calc(var(--tw-spacing) * 4);\n }\n .tw\\:mr-5 {\n margin-right: calc(var(--tw-spacing) * 5);\n }\n .tw\\:-mb-1 {\n margin-bottom: calc(var(--tw-spacing) * -1);\n }\n .tw\\:-mb-2 {\n margin-bottom: calc(var(--tw-spacing) * -2);\n }\n .tw\\:-mb-4 {\n margin-bottom: calc(var(--tw-spacing) * -4);\n }\n .tw\\:mb-0 {\n margin-bottom: calc(var(--tw-spacing) * 0);\n }\n .tw\\:mb-1 {\n margin-bottom: calc(var(--tw-spacing) * 1);\n }\n .tw\\:mb-2 {\n margin-bottom: calc(var(--tw-spacing) * 2);\n }\n .tw\\:mb-3 {\n margin-bottom: calc(var(--tw-spacing) * 3);\n }\n .tw\\:mb-4 {\n margin-bottom: calc(var(--tw-spacing) * 4);\n }\n .tw\\:mb-6 {\n margin-bottom: calc(var(--tw-spacing) * 6);\n }\n .tw\\:mb-10 {\n margin-bottom: calc(var(--tw-spacing) * 10);\n }\n .tw\\:ml-1 {\n margin-left: calc(var(--tw-spacing) * 1);\n }\n .tw\\:ml-2 {\n margin-left: calc(var(--tw-spacing) * 2);\n }\n .tw\\:ml-3 {\n margin-left: calc(var(--tw-spacing) * 3);\n }\n .tw\\:ml-4 {\n margin-left: calc(var(--tw-spacing) * 4);\n }\n .tw\\:ml-14 {\n margin-left: calc(var(--tw-spacing) * 14);\n }\n .tw\\:ml-48 {\n margin-left: calc(var(--tw-spacing) * 48);\n }\n .tw\\:badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: calc(0.25rem * 2);\n border-radius: var(--radius-selector);\n vertical-align: middle;\n color: var(--badge-fg);\n border: var(--border) solid var(--badge-color, var(--color-base-200));\n font-size: 0.875rem;\n width: fit-content;\n padding-inline: calc(0.25rem * 3 - var(--border));\n background-size: auto, calc(var(--noise) * 100%);\n background-image: none, var(--fx-noise);\n background-color: var(--badge-bg);\n --badge-bg: var(--badge-color, var(--color-base-100));\n --badge-fg: var(--color-base-content);\n --size: calc(var(--size-selector, 0.25rem) * 6);\n height: var(--size);\n &.tw\\:badge-outline {\n --badge-fg: var(--badge-color);\n --badge-bg: #0000;\n background-image: none;\n }\n &.tw\\:badge-dash {\n --badge-fg: var(--badge-color);\n --badge-bg: #0000;\n border-style: dashed;\n background-image: none;\n }\n &.tw\\:badge-soft {\n color: var(--badge-color, var(--color-base-content));\n background-color: color-mix( in oklab, var(--badge-color, var(--color-base-content)) 8%, var(--color-base-100) );\n border-color: color-mix( in oklab, var(--badge-color, var(--color-base-content)) 10%, var(--color-base-100) );\n background-image: none;\n }\n }\n .tw\\:tabs {\n display: flex;\n flex-wrap: wrap;\n --tabs-height: auto;\n --tabs-direction: row;\n height: var(--tabs-height);\n flex-direction: var(--tabs-direction);\n }\n .tw\\:navbar {\n display: flex;\n width: 100%;\n align-items: center;\n padding: 0.5rem;\n min-height: 4rem;\n }\n .tw\\:stat {\n display: inline-grid;\n width: 100%;\n column-gap: calc(0.25rem * 4);\n padding-inline: calc(0.25rem * 6);\n padding-block: calc(0.25rem * 4);\n grid-template-columns: repeat(1, 1fr);\n &:not(:last-child) {\n border-inline-end: var(--border) dashed color-mix(in oklab, currentColor 10%, #0000);\n border-block-end: none;\n }\n }\n .tw\\:card-body {\n display: flex;\n flex: auto;\n flex-direction: column;\n gap: calc(0.25rem * 2);\n padding: var(--card-p, 1.5rem);\n font-size: var(--card-fs, 0.875rem);\n :where(p) {\n flex-grow: 1;\n }\n }\n .tw\\:alert {\n display: grid;\n align-items: center;\n gap: calc(0.25rem * 4);\n border-radius: var(--radius-box);\n padding-inline: calc(0.25rem * 4);\n padding-block: calc(0.25rem * 3);\n color: var(--color-base-content);\n background-color: var(--alert-color, var(--color-base-200));\n justify-content: start;\n justify-items: start;\n grid-auto-flow: column;\n grid-template-columns: auto minmax(auto, 1fr);\n text-align: start;\n border: var(--border) solid var(--color-base-200);\n font-size: 0.875rem;\n line-height: 1.25rem;\n background-size: auto, calc(var(--noise) * 100%);\n background-image: none, var(--fx-noise);\n box-shadow: 0 3px 0 -2px oklch(100% 0 0 / calc(var(--depth) * 0.08)) inset, 0 1px color-mix( in oklab, color-mix(in oklab, #000 20%, var(--alert-color, var(--color-base-200))) calc(var(--depth) * 20%), #0000 ), 0 4px 3px -2px oklch(0% 0 0 / calc(var(--depth) * 0.08));\n &.tw\\:alert-outline {\n background-color: transparent;\n color: var(--alert-color);\n box-shadow: none;\n background-image: none;\n }\n &.tw\\:alert-dash {\n background-color: transparent;\n color: var(--alert-color);\n border-style: dashed;\n box-shadow: none;\n background-image: none;\n }\n &.tw\\:alert-soft {\n color: var(--alert-color, var(--color-base-content));\n background: color-mix( in oklab, var(--alert-color, var(--color-base-content)) 8%, var(--color-base-100) );\n border-color: color-mix( in oklab, var(--alert-color, var(--color-base-content)) 10%, var(--color-base-100) );\n box-shadow: none;\n background-image: none;\n }\n }\n .tw\\:card-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: calc(0.25rem * 2);\n }\n .tw\\:card-title {\n display: flex;\n align-items: center;\n gap: calc(0.25rem * 2);\n font-size: var(--cardtitle-fs, 1.125rem);\n font-weight: 600;\n }\n .tw\\:mask {\n display: inline-block;\n vertical-align: middle;\n mask-size: contain;\n mask-repeat: no-repeat;\n mask-position: center;\n }\n .tw\\:block {\n display: block;\n }\n .tw\\:flex {\n display: flex;\n }\n .tw\\:grid {\n display: grid;\n }\n .tw\\:hidden {\n display: none;\n }\n .tw\\:inline {\n display: inline;\n }\n .tw\\:inline-block {\n display: inline-block;\n }\n .tw\\:inline-flex {\n display: inline-flex;\n }\n .tw\\:table {\n display: table;\n }\n .tw\\:btn-circle {\n border-radius: calc(infinity * 1px);\n padding-inline: calc(0.25rem * 0);\n width: var(--size);\n height: var(--size);\n }\n .tw\\:btn-square {\n padding-inline: calc(0.25rem * 0);\n width: var(--size);\n height: var(--size);\n }\n .tw\\:\\!h-\\[calc\\(100dvh-280px\\)\\] {\n height: calc(100dvh - 280px) !important;\n }\n .tw\\:h-2 {\n height: calc(var(--tw-spacing) * 2);\n }\n .tw\\:h-3 {\n height: calc(var(--tw-spacing) * 3);\n }\n .tw\\:h-3\\/4 {\n height: calc(3/4 * 100%);\n }\n .tw\\:h-4 {\n height: calc(var(--tw-spacing) * 4);\n }\n .tw\\:h-5 {\n height: calc(var(--tw-spacing) * 5);\n }\n .tw\\:h-6 {\n height: calc(var(--tw-spacing) * 6);\n }\n .tw\\:h-8 {\n height: calc(var(--tw-spacing) * 8);\n }\n .tw\\:h-10 {\n height: calc(var(--tw-spacing) * 10);\n }\n .tw\\:h-12 {\n height: calc(var(--tw-spacing) * 12);\n }\n .tw\\:h-16 {\n height: calc(var(--tw-spacing) * 16);\n }\n .tw\\:h-20 {\n height: calc(var(--tw-spacing) * 20);\n }\n .tw\\:h-24 {\n height: calc(var(--tw-spacing) * 24);\n }\n .tw\\:h-28 {\n height: calc(var(--tw-spacing) * 28);\n }\n .tw\\:h-32 {\n height: calc(var(--tw-spacing) * 32);\n }\n .tw\\:h-36 {\n height: calc(var(--tw-spacing) * 36);\n }\n .tw\\:h-40 {\n height: calc(var(--tw-spacing) * 40);\n }\n .tw\\:h-48 {\n height: calc(var(--tw-spacing) * 48);\n }\n .tw\\:h-64 {\n height: calc(var(--tw-spacing) * 64);\n }\n .tw\\:h-\\[2em\\] {\n height: 2em;\n }\n .tw\\:h-\\[calc\\(50\\%-0\\.75em\\)\\] {\n height: calc(50% - 0.75em);\n }\n .tw\\:h-\\[calc\\(50\\%-1\\.5em\\)\\] {\n height: calc(50% - 1.5em);\n }\n .tw\\:h-\\[calc\\(100\\%-1rem\\)\\] {\n height: calc(100% - 1rem);\n }\n .tw\\:h-\\[calc\\(100dvh-22px\\)\\] {\n height: calc(100dvh - 22px);\n }\n .tw\\:h-\\[calc\\(100dvh-64px\\)\\] {\n height: calc(100dvh - 64px);\n }\n .tw\\:h-\\[calc\\(100dvh-268px\\)\\] {\n height: calc(100dvh - 268px);\n }\n .tw\\:h-fit {\n height: fit-content;\n }\n .tw\\:h-full {\n height: 100%;\n }\n .tw\\:max-h-64 {\n max-height: calc(var(--tw-spacing) * 64);\n }\n .tw\\:max-h-124 {\n max-height: calc(var(--tw-spacing) * 124);\n }\n .tw\\:max-h-136 {\n max-height: calc(var(--tw-spacing) * 136);\n }\n .tw\\:max-h-\\[1000px\\] {\n max-height: 1000px;\n }\n .tw\\:max-h-\\[calc\\(100dvh-96px\\)\\] {\n max-height: calc(100dvh - 96px);\n }\n .tw\\:max-h-\\[calc\\(100dvh-152px\\)\\] {\n max-height: calc(100dvh - 152px);\n }\n .tw\\:max-h-full {\n max-height: 100%;\n }\n .tw\\:min-h-0 {\n min-height: calc(var(--tw-spacing) * 0);\n }\n .tw\\:min-h-36 {\n min-height: calc(var(--tw-spacing) * 36);\n }\n .tw\\:min-h-42 {\n min-height: calc(var(--tw-spacing) * 42);\n }\n .tw\\:min-h-56 {\n min-height: var(--tw-min-height-56);\n }\n .tw\\:min-h-80 {\n min-height: var(--tw-min-height-80);\n }\n .tw\\:min-h-\\[5em\\] {\n min-height: 5em;\n }\n .tw\\:min-h-\\[21px\\] {\n min-height: 21px;\n }\n .tw\\:btn-block {\n width: 100%;\n }\n .tw\\:loading-lg {\n width: calc(var(--size-selector, 0.25rem) * 7);\n }\n .tw\\:loading-md {\n width: calc(var(--size-selector, 0.25rem) * 6);\n }\n .tw\\:loading-sm {\n width: calc(var(--size-selector, 0.25rem) * 5);\n }\n .tw\\:loading-xl {\n width: calc(var(--size-selector, 0.25rem) * 8);\n }\n .tw\\:w-1 {\n width: calc(var(--tw-spacing) * 1);\n }\n .tw\\:w-2 {\n width: calc(var(--tw-spacing) * 2);\n }\n .tw\\:w-4 {\n width: calc(var(--tw-spacing) * 4);\n }\n .tw\\:w-5 {\n width: calc(var(--tw-spacing) * 5);\n }\n .tw\\:w-6 {\n width: calc(var(--tw-spacing) * 6);\n }\n .tw\\:w-8 {\n width: calc(var(--tw-spacing) * 8);\n }\n .tw\\:w-10 {\n width: calc(var(--tw-spacing) * 10);\n }\n .tw\\:w-12 {\n width: calc(var(--tw-spacing) * 12);\n }\n .tw\\:w-14 {\n width: calc(var(--tw-spacing) * 14);\n }\n .tw\\:w-16 {\n width: calc(var(--tw-spacing) * 16);\n }\n .tw\\:w-20 {\n width: calc(var(--tw-spacing) * 20);\n }\n .tw\\:w-28 {\n width: calc(var(--tw-spacing) * 28);\n }\n .tw\\:w-36 {\n width: calc(var(--tw-spacing) * 36);\n }\n .tw\\:w-48 {\n width: calc(var(--tw-spacing) * 48);\n }\n .tw\\:w-52 {\n width: var(--tw-container-52);\n }\n .tw\\:w-80 {\n width: calc(var(--tw-spacing) * 80);\n }\n .tw\\:w-83 {\n width: calc(var(--tw-spacing) * 83);\n }\n .tw\\:w-96 {\n width: calc(var(--tw-spacing) * 96);\n }\n .tw\\:w-\\[1px\\] {\n width: 1px;\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: fit-content;\n }\n .tw\\:w-full {\n width: 100%;\n }\n .tw\\:w-xl {\n width: var(--tw-container-xl);\n }\n .tw\\:max-w-3xl {\n max-width: var(--tw-container-3xl);\n }\n .tw\\:max-w-69 {\n max-width: calc(var(--tw-spacing) * 69);\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-\\[calc\\(100\\%-60px\\)\\] {\n max-width: calc(100% - 60px);\n }\n .tw\\:max-w-full {\n max-width: 100%;\n }\n .tw\\:max-w-xl {\n max-width: var(--tw-container-xl);\n }\n .tw\\:max-w-xs {\n max-width: var(--tw-container-xs);\n }\n .tw\\:min-w-0 {\n min-width: calc(var(--tw-spacing) * 0);\n }\n .tw\\:min-w-80 {\n min-width: var(--tw-min-width-80);\n }\n .tw\\:min-w-\\[8rem\\] {\n min-width: 8rem;\n }\n .tw\\:min-w-\\[10\\.4em\\] {\n min-width: 10.4em;\n }\n .tw\\:min-w-fit {\n min-width: fit-content;\n }\n .tw\\:flex-1 {\n flex: 1;\n }\n .tw\\:flex-none {\n flex: none;\n }\n .tw\\:shrink {\n flex-shrink: 1;\n }\n .tw\\:flex-grow {\n flex-grow: 1;\n }\n .tw\\:grow {\n flex-grow: 1;\n }\n .tw\\:basis-1\\/5 {\n flex-basis: calc(1/5 * 100%);\n }\n .tw\\:basis-2\\/5 {\n flex-basis: calc(2/5 * 100%);\n }\n .tw\\:-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .tw\\:-translate-x-full {\n --tw-translate-x: -100%;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .tw\\:translate-x-0 {\n --tw-translate-x: calc(var(--tw-spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .tw\\:translate-x-1\\/3 {\n --tw-translate-x: calc(1/3 * 100%);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .tw\\:-translate-y-1\\/3 {\n --tw-translate-y: calc(calc(1/3 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .tw\\:rotate-180 {\n rotate: 180deg;\n }\n .tw\\:transform {\n transform: var(--tw-rotate-x) var(--tw-rotate-y) var(--tw-rotate-z) var(--tw-skew-x) var(--tw-skew-y);\n }\n .tw\\:animate-none {\n animation: none;\n }\n .tw\\:cursor-not-allowed {\n cursor: not-allowed;\n }\n .tw\\:cursor-pointer {\n cursor: pointer;\n }\n .tw\\:cursor-text {\n cursor: text;\n }\n .tw\\:resize-none {\n resize: none;\n }\n .tw\\:list-none {\n list-style-type: none;\n }\n .tw\\:columns-1 {\n columns: 1;\n }\n .tw\\:break-inside-avoid {\n break-inside: avoid;\n }\n .tw\\:stats-horizontal {\n grid-auto-flow: column;\n overflow-x: auto;\n .tw\\:stat:not(:last-child) {\n border-inline-end: var(--border) dashed color-mix(in oklab, currentColor 10%, #0000);\n border-block-end: none;\n }\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-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n .tw\\:grid-cols-6 {\n grid-template-columns: repeat(6, minmax(0, 1fr));\n }\n .tw\\:flex-col {\n flex-direction: column;\n }\n .tw\\:flex-row {\n flex-direction: row;\n }\n .tw\\:flex-nowrap {\n flex-wrap: nowrap;\n }\n .tw\\:flex-wrap {\n flex-wrap: wrap;\n }\n .tw\\:place-content-center {\n place-content: center;\n }\n .tw\\:place-content-end {\n place-content: end;\n }\n .tw\\:place-items-center {\n place-items: center;\n }\n .tw\\:place-items-end {\n place-items: end;\n }\n .tw\\:items-center {\n align-items: center;\n }\n .tw\\:justify-between {\n justify-content: space-between;\n }\n .tw\\:justify-center {\n justify-content: center;\n }\n .tw\\:justify-end {\n justify-content: flex-end;\n }\n .tw\\:justify-normal {\n justify-content: normal;\n }\n .tw\\:justify-start {\n justify-content: flex-start;\n }\n .tw\\:gap-2 {\n gap: calc(var(--tw-spacing) * 2);\n }\n .tw\\:gap-4 {\n gap: calc(var(--tw-spacing) * 4);\n }\n .tw\\:gap-6 {\n gap: calc(var(--tw-spacing) * 6);\n }\n .tw\\:space-y-2 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--tw-spacing) * 2) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--tw-spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .tw\\:space-y-4 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--tw-spacing) * 4) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--tw-spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .tw\\:space-y-6 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--tw-spacing) * 6) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--tw-spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .tw\\:space-x-2 {\n :where(& > :not(:last-child)) {\n --tw-space-x-reverse: 0;\n margin-inline-start: calc(calc(var(--tw-spacing) * 2) * var(--tw-space-x-reverse));\n margin-inline-end: calc(calc(var(--tw-spacing) * 2) * calc(1 - var(--tw-space-x-reverse)));\n }\n }\n .tw\\:space-x-3 {\n :where(& > :not(:last-child)) {\n --tw-space-x-reverse: 0;\n margin-inline-start: calc(calc(var(--tw-spacing) * 3) * var(--tw-space-x-reverse));\n margin-inline-end: calc(calc(var(--tw-spacing) * 3) * calc(1 - var(--tw-space-x-reverse)));\n }\n }\n .tw\\:place-self-center {\n place-self: center;\n }\n .tw\\:place-self-end {\n place-self: end;\n }\n .tw\\:self-center {\n align-self: center;\n }\n .tw\\:truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .tw\\:overflow-auto {\n overflow: auto;\n }\n .tw\\:overflow-hidden {\n overflow: hidden;\n }\n .tw\\:overflow-scroll {\n overflow: scroll;\n }\n .tw\\:overflow-x-auto {\n overflow-x: auto;\n }\n .tw\\:overflow-x-hidden {\n overflow-x: hidden;\n }\n .tw\\:overflow-y-auto {\n overflow-y: auto;\n }\n .tw\\:rounded {\n border-radius: 0.25rem;\n }\n .tw\\:rounded-2xl {\n border-radius: var(--tw-radius-2xl);\n }\n .tw\\:rounded-box {\n border-radius: var(--radius-box);\n }\n .tw\\:rounded-box {\n border-radius: var(--radius-box);\n }\n .tw\\:rounded-full {\n border-radius: calc(infinity * 1px);\n }\n .tw\\:rounded-lg {\n border-radius: var(--tw-radius-lg);\n }\n .tw\\:rounded-md {\n border-radius: var(--tw-radius-md);\n }\n .tw\\:rounded-none {\n border-radius: 0;\n }\n .tw\\:rounded-none\\! {\n border-radius: 0 !important;\n }\n .tw\\:rounded-xl {\n border-radius: var(--tw-radius-xl);\n }\n .tw\\:rounded-tr-md {\n border-top-right-radius: var(--tw-radius-md);\n }\n .tw\\:rounded-b-none {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n }\n .tw\\:rounded-br-md {\n border-bottom-right-radius: var(--tw-radius-md);\n }\n .tw\\:border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .tw\\:border-0 {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n .tw\\:border-1 {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .tw\\:border-4 {\n border-style: var(--tw-border-style);\n border-width: 4px;\n }\n .tw\\:border-\\[1px\\] {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .tw\\:border-dashed {\n --tw-border-style: dashed;\n border-style: dashed;\n }\n .tw\\:border-none {\n --tw-border-style: none;\n border-style: none;\n }\n .tw\\:border-base-200 {\n border-color: var(--color-base-200);\n }\n .tw\\:border-base-300 {\n border-color: var(--color-base-300);\n }\n .tw\\:border-base-content\\/20 {\n border-color: color-mix(in oklab, var(--color-base-content) 20%, transparent);\n }\n .tw\\:border-current\\/10 {\n border-color: color-mix(in oklab, currentColor 10%, transparent);\n }\n .tw\\:border-current\\/50 {\n border-color: color-mix(in oklab, currentColor 50%, transparent);\n }\n .tw\\:bg-base-100 {\n background-color: var(--color-base-100);\n }\n .tw\\:bg-base-200 {\n background-color: var(--color-base-200);\n }\n .tw\\:bg-base-300 {\n background-color: var(--color-base-300);\n }\n .tw\\:bg-base-content\\/10 {\n background-color: color-mix(in oklab, var(--color-base-content) 10%, transparent);\n }\n .tw\\:bg-gray-200 {\n background-color: var(--tw-color-gray-200);\n }\n .tw\\:bg-neutral-content {\n background-color: var(--color-neutral-content);\n }\n .tw\\:bg-primary {\n background-color: var(--color-primary);\n }\n .tw\\:bg-red-500 {\n background-color: var(--tw-color-red-500);\n }\n .tw\\:bg-slate-200 {\n background-color: var(--tw-color-slate-200);\n }\n .tw\\:bg-transparent {\n background-color: transparent;\n }\n .tw\\:bg-white {\n background-color: var(--tw-color-white);\n }\n .tw\\:fill-current {\n fill: currentColor;\n }\n .tw\\:stroke-3 {\n stroke-width: 3;\n }\n .tw\\:stroke-\\[2\\.5\\] {\n stroke-width: 2.5;\n }\n .tw\\:object-cover {\n object-fit: cover;\n }\n .tw\\:checkbox-xs {\n padding: 0.125rem;\n --size: calc(var(--size-selector, 0.25rem) * 4);\n }\n .tw\\:p-0 {\n padding: calc(var(--tw-spacing) * 0);\n }\n .tw\\:p-0\\! {\n padding: calc(var(--tw-spacing) * 0) !important;\n }\n .tw\\:p-1 {\n padding: calc(var(--tw-spacing) * 1);\n }\n .tw\\:p-2 {\n padding: calc(var(--tw-spacing) * 2);\n }\n .tw\\:p-3 {\n padding: calc(var(--tw-spacing) * 3);\n }\n .tw\\:p-4 {\n padding: calc(var(--tw-spacing) * 4);\n }\n .tw\\:p-4\\! {\n padding: calc(var(--tw-spacing) * 4) !important;\n }\n .tw\\:p-6 {\n padding: calc(var(--tw-spacing) * 6);\n }\n .tw\\:p-9\\! {\n padding: calc(var(--tw-spacing) * 9) !important;\n }\n .tw\\:p-\\[1px\\] {\n padding: 1px;\n }\n .tw\\:px-0 {\n padding-inline: calc(var(--tw-spacing) * 0);\n }\n .tw\\:px-1 {\n padding-inline: calc(var(--tw-spacing) * 1);\n }\n .tw\\:px-1\\.5 {\n padding-inline: calc(var(--tw-spacing) * 1.5);\n }\n .tw\\:px-2 {\n padding-inline: calc(var(--tw-spacing) * 2);\n }\n .tw\\:px-4 {\n padding-inline: calc(var(--tw-spacing) * 4);\n }\n .tw\\:px-6 {\n padding-inline: calc(var(--tw-spacing) * 6);\n }\n .tw\\:px-8 {\n padding-inline: calc(var(--tw-spacing) * 8);\n }\n .tw\\:py-0\\.5 {\n padding-block: calc(var(--tw-spacing) * 0.5);\n }\n .tw\\:py-1 {\n padding-block: calc(var(--tw-spacing) * 1);\n }\n .tw\\:py-2 {\n padding-block: calc(var(--tw-spacing) * 2);\n }\n .tw\\:ps-2\\! {\n padding-inline-start: calc(var(--tw-spacing) * 2) !important;\n }\n .tw\\:pe-2\\! {\n padding-inline-end: calc(var(--tw-spacing) * 2) !important;\n }\n .tw\\:pt-0 {\n padding-top: calc(var(--tw-spacing) * 0);\n }\n .tw\\:pt-1 {\n padding-top: calc(var(--tw-spacing) * 1);\n }\n .tw\\:pt-2 {\n padding-top: calc(var(--tw-spacing) * 2);\n }\n .tw\\:pt-4 {\n padding-top: calc(var(--tw-spacing) * 4);\n }\n .tw\\:pt-6 {\n padding-top: calc(var(--tw-spacing) * 6);\n }\n .tw\\:pr-1 {\n padding-right: calc(var(--tw-spacing) * 1);\n }\n .tw\\:pr-4 {\n padding-right: calc(var(--tw-spacing) * 4);\n }\n .tw\\:pr-12 {\n padding-right: calc(var(--tw-spacing) * 12);\n }\n .tw\\:pb-0 {\n padding-bottom: calc(var(--tw-spacing) * 0);\n }\n .tw\\:pb-1 {\n padding-bottom: calc(var(--tw-spacing) * 1);\n }\n .tw\\:pb-2 {\n padding-bottom: calc(var(--tw-spacing) * 2);\n }\n .tw\\:pb-4 {\n padding-bottom: calc(var(--tw-spacing) * 4);\n }\n .tw\\:pb-6 {\n padding-bottom: calc(var(--tw-spacing) * 6);\n }\n .tw\\:pl-2 {\n padding-left: calc(var(--tw-spacing) * 2);\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: var(--tw-text-2xl);\n line-height: var(--tw-leading, var(--tw-text-2xl--line-height));\n }\n .tw\\:text-3xl {\n font-size: var(--tw-text-3xl);\n line-height: var(--tw-leading, var(--tw-text-3xl--line-height));\n }\n .tw\\:text-6xl {\n font-size: var(--tw-text-6xl);\n line-height: var(--tw-leading, var(--tw-text-6xl--line-height));\n }\n .tw\\:text-base {\n font-size: var(--tw-text-base);\n line-height: var(--tw-leading, var(--tw-text-base--line-height));\n }\n .tw\\:text-lg {\n font-size: var(--tw-text-lg);\n line-height: var(--tw-leading, var(--tw-text-lg--line-height));\n }\n .tw\\:text-sm {\n font-size: var(--tw-text-sm);\n line-height: var(--tw-leading, var(--tw-text-sm--line-height));\n }\n .tw\\:text-xl {\n font-size: var(--tw-text-xl);\n line-height: var(--tw-leading, var(--tw-text-xl--line-height));\n }\n .tw\\:text-xs {\n font-size: var(--tw-text-xs);\n line-height: var(--tw-leading, var(--tw-text-xs--line-height));\n }\n .tw\\:text-map {\n font-size: var(--tw-text-map);\n }\n .tw\\:leading-3 {\n --tw-leading: calc(var(--tw-spacing) * 3);\n line-height: calc(var(--tw-spacing) * 3);\n }\n .tw\\:leading-5 {\n --tw-leading: calc(var(--tw-spacing) * 5);\n line-height: calc(var(--tw-spacing) * 5);\n }\n .tw\\:leading-map {\n --tw-leading: var(--tw-leading-map);\n line-height: var(--tw-leading-map);\n }\n .tw\\:font-bold {\n --tw-font-weight: var(--tw-font-weight-bold);\n font-weight: var(--tw-font-weight-bold);\n }\n .tw\\:font-medium {\n --tw-font-weight: var(--tw-font-weight-medium);\n font-weight: var(--tw-font-weight-medium);\n }\n .tw\\:font-normal {\n --tw-font-weight: var(--tw-font-weight-normal);\n font-weight: var(--tw-font-weight-normal);\n }\n .tw\\:font-semibold {\n --tw-font-weight: var(--tw-font-weight-semibold);\n font-weight: var(--tw-font-weight-semibold);\n }\n .tw\\:text-ellipsis {\n text-overflow: ellipsis;\n }\n .tw\\:whitespace-nowrap {\n white-space: nowrap;\n }\n .tw\\:checkbox-success {\n color: var(--color-success-content);\n --input-color: var(--color-success);\n }\n .tw\\:text-base-content {\n color: var(--color-base-content);\n }\n .tw\\:text-base-content\\! {\n color: var(--color-base-content) !important;\n }\n .tw\\:text-base-content\\/50 {\n color: color-mix(in oklab, var(--color-base-content) 50%, transparent);\n }\n .tw\\:text-current {\n color: currentColor;\n }\n .tw\\:text-error {\n color: var(--color-error);\n }\n .tw\\:text-error\\! {\n color: var(--color-error) !important;\n }\n .tw\\:text-gray-400 {\n color: var(--tw-color-gray-400);\n }\n .tw\\:text-gray-500 {\n color: var(--tw-color-gray-500);\n }\n .tw\\:text-gray-600 {\n color: var(--tw-color-gray-600);\n }\n .tw\\:text-green-500 {\n color: var(--tw-color-green-500);\n }\n .tw\\:text-neutral-content {\n color: var(--color-neutral-content);\n }\n .tw\\:text-primary {\n color: var(--color-primary);\n }\n .tw\\:text-red-500 {\n color: var(--tw-color-red-500);\n }\n .tw\\:text-white {\n color: var(--tw-color-white);\n }\n .tw\\:text-zinc-500 {\n color: var(--tw-color-zinc-500);\n }\n .tw\\:normal-case {\n text-transform: none;\n }\n .tw\\:italic {\n font-style: italic;\n }\n .tw\\:opacity-0 {\n opacity: 0%;\n }\n .tw\\:opacity-50 {\n opacity: 50%;\n }\n .tw\\:opacity-60 {\n opacity: 60%;\n }\n .tw\\:opacity-100 {\n opacity: 100%;\n }\n .tw\\:shadow {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .tw\\:shadow-2xl {\n --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .tw\\:shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .tw\\:shadow-md {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .tw\\:shadow-xl {\n --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .tw\\:btn-ghost {\n &:not(.tw\\:btn-active, :hover, :active:focus, :focus-visible) {\n --btn-shadow: \"\";\n --btn-bg: #0000;\n --btn-border: #0000;\n --btn-noise: none;\n &:not(:disabled, [disabled], .tw\\:btn-disabled) {\n outline-color: currentColor;\n --btn-fg: currentColor;\n }\n }\n }\n .tw\\:drop-shadow-md {\n --tw-drop-shadow: drop-shadow(var(--tw-drop-shadow-md));\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\\:transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter;\n transition-timing-function: var(--tw-ease, var(--tw-default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--tw-default-transition-duration));\n }\n .tw\\:transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--tw-default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--tw-default-transition-duration));\n }\n .tw\\:transition-opacity {\n transition-property: opacity;\n transition-timing-function: var(--tw-ease, var(--tw-default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--tw-default-transition-duration));\n }\n .tw\\:transition-none {\n transition-property: none;\n }\n .tw\\:delay-400 {\n transition-delay: 400ms;\n }\n .tw\\:duration-200 {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n .tw\\:duration-300 {\n --tw-duration: 300ms;\n transition-duration: 300ms;\n }\n .tw\\:duration-500 {\n --tw-duration: 500ms;\n transition-duration: 500ms;\n }\n .tw\\:ease-in {\n --tw-ease: var(--tw-ease-in);\n transition-timing-function: var(--tw-ease-in);\n }\n .tw\\:btn-lg {\n --fontsize: 1.125rem;\n --btn-p: 1.25rem;\n --size: calc(var(--size-field, 0.25rem) * 12);\n }\n .tw\\:btn-sm {\n --fontsize: 0.75rem;\n --btn-p: 0.75rem;\n --size: calc(var(--size-field, 0.25rem) * 8);\n }\n .tw\\:btn-xs {\n --fontsize: 0.6875rem;\n --btn-p: 0.5rem;\n --size: calc(var(--size-field, 0.25rem) * 6);\n }\n .tw\\:badge-success {\n --badge-color: var(--color-success);\n --badge-fg: var(--color-success-content);\n }\n .tw\\:btn-error {\n --btn-color: var(--color-error);\n --btn-fg: var(--color-error-content);\n }\n .tw\\:btn-neutral {\n --btn-color: var(--color-neutral);\n --btn-fg: var(--color-neutral-content);\n }\n .tw\\:btn-primary {\n --btn-color: var(--color-primary);\n --btn-fg: var(--color-primary-content);\n }\n .tw\\:loading-spinner {\n mask-image: url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\");\n }\n .tw\\:mask-circle {\n mask-image: url(\"data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle fill='black' cx='100' cy='100' r='100' fill-rule='evenodd'/%3e%3c/svg%3e\");\n }\n .tw\\:mask-hexagon-2 {\n mask-image: url(\"data:image/svg+xml,%3csvg width='200' height='182' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M64.786 181.4c-9.196 0-20.063-6.687-25.079-14.21L3.762 105.33c-5.016-8.36-5.016-20.9 0-29.259l35.945-61.86C44.723 5.851 55.59 0 64.786 0h71.055c9.196 0 20.063 6.688 25.079 14.211l35.945 61.86c4.18 8.36 4.18 20.899 0 29.258l-35.945 61.86c-4.18 8.36-15.883 14.211-25.079 14.211H64.786Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e\");\n }\n .tw\\:mask-squircle {\n mask-image: url(\"data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M100 0C20 0 0 20 0 100s20 100 100 100 100-20 100-100S180 0 100 0Z'/%3e%3c/svg%3e\");\n }\n .tw\\:hover\\:cursor-pointer {\n &:hover {\n @media (hover: hover) {\n cursor: pointer;\n }\n }\n }\n .tw\\:hover\\:bg-base-200 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-base-200);\n }\n }\n }\n .tw\\:hover\\:bg-red-600 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--tw-color-red-600);\n }\n }\n }\n .tw\\:hover\\:bg-slate-300 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--tw-color-slate-300);\n }\n }\n }\n .tw\\:hover\\:bg-transparent {\n &:hover {\n @media (hover: hover) {\n background-color: transparent;\n }\n }\n }\n .tw\\:hover\\:font-bold {\n &:hover {\n @media (hover: hover) {\n --tw-font-weight: var(--tw-font-weight-bold);\n font-weight: var(--tw-font-weight-bold);\n }\n }\n }\n .tw\\:hover\\:text-primary {\n &:hover {\n @media (hover: hover) {\n color: var(--color-primary);\n }\n }\n }\n .tw\\:hover\\:underline {\n &:hover {\n @media (hover: hover) {\n text-decoration-line: underline;\n }\n }\n }\n .tw\\:focus\\:ring-0 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentColor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .tw\\:focus\\:outline-hidden {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .tw\\:focus\\:outline-none {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n .tw\\:sm\\:left-auto\\! {\n @media (width >= 40rem) {\n left: auto !important;\n }\n }\n .tw\\:sm\\:w-2xl {\n @media (width >= 40rem) {\n width: var(--tw-container-2xl);\n }\n }\n .tw\\:sm\\:grid-cols-2 {\n @media (width >= 40rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .tw\\:md\\:mb-0 {\n @media (width >= 48rem) {\n margin-bottom: calc(var(--tw-spacing) * 0);\n }\n }\n .tw\\:md\\:flex {\n @media (width >= 48rem) {\n display: flex;\n }\n }\n .tw\\:md\\:hidden {\n @media (width >= 48rem) {\n display: none;\n }\n }\n .tw\\:md\\:max-h-full {\n @media (width >= 48rem) {\n max-height: 100%;\n }\n }\n .tw\\:md\\:w-1\\/2 {\n @media (width >= 48rem) {\n width: calc(1/2 * 100%);\n }\n }\n .tw\\:md\\:w-\\[calc\\(50\\%-32px\\)\\] {\n @media (width >= 48rem) {\n width: calc(50% - 32px);\n }\n }\n .tw\\:md\\:columns-2 {\n @media (width >= 48rem) {\n columns: 2;\n }\n }\n .tw\\:md\\:grid-cols-1 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n }\n .tw\\:md\\:grid-cols-2 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .tw\\:md\\:space-x-4 {\n @media (width >= 48rem) {\n :where(& > :not(:last-child)) {\n --tw-space-x-reverse: 0;\n margin-inline-start: calc(calc(var(--tw-spacing) * 4) * var(--tw-space-x-reverse));\n margin-inline-end: calc(calc(var(--tw-spacing) * 4) * calc(1 - var(--tw-space-x-reverse)));\n }\n }\n }\n .tw\\:md\\:text-2xl {\n @media (width >= 48rem) {\n font-size: var(--tw-text-2xl);\n line-height: var(--tw-leading, var(--tw-text-2xl--line-height));\n }\n }\n .tw\\:lg\\:columns-3 {\n @media (width >= 64rem) {\n columns: 3;\n }\n }\n .tw\\:lg\\:grid-cols-1 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n }\n .tw\\:xl\\:max-w-6xl {\n @media (width >= 80rem) {\n max-width: var(--tw-container-6xl);\n }\n }\n .tw\\:xl\\:grid-cols-1 {\n @media (width >= 80rem) {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n }\n .tw\\:xl\\:text-3xl {\n @media (width >= 80rem) {\n font-size: var(--tw-text-3xl);\n line-height: var(--tw-leading, var(--tw-text-3xl--line-height));\n }\n }\n .tw\\:2xl\\:columns-4 {\n @media (width >= 96rem) {\n columns: 4;\n }\n }\n .tw\\:2xl\\:grid-cols-2 {\n @media (width >= 96rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .tw\\:\\@sm\\:tooltip {\n @container (width >= 24rem) {\n position: relative;\n display: inline-block;\n --tt-bg: var(--color-neutral);\n --tt-off: calc(100% + 0.5rem);\n --tt-tail: calc(100% + 1px + 0.25rem);\n > :where(.tw\\:tooltip-content), &[data-tip]:before {\n position: absolute;\n max-width: 20rem;\n border-radius: var(--radius-field);\n padding-inline: calc(0.25rem * 2);\n padding-block: calc(0.25rem * 1);\n text-align: center;\n white-space: normal;\n color: var(--color-neutral-content);\n opacity: 0%;\n font-size: 0.875rem;\n line-height: 1.25em;\n transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms;\n background-color: var(--tt-bg);\n width: max-content;\n pointer-events: none;\n z-index: 1;\n --tw-content: attr(data-tip);\n content: var(--tw-content);\n }\n &:after {\n position: absolute;\n position: absolute;\n opacity: 0%;\n background-color: var(--tt-bg);\n transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms;\n content: \"\";\n pointer-events: none;\n width: 0.625rem;\n height: 0.25rem;\n display: block;\n mask-repeat: no-repeat;\n mask-position: -1px 0;\n --mask-tooltip: url(\"data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A\");\n mask-image: var(--mask-tooltip);\n }\n &.tw\\:tooltip-open, &[data-tip]:hover, &:hover, &:has(:focus-visible) {\n > .tw\\:tooltip-content, &[data-tip]:before, &:after {\n opacity: 100%;\n --tt-pos: 0rem;\n transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 0ms;\n }\n }\n > .tw\\:tooltip-content, &[data-tip]:before {\n transform: translateX(-50%) translateY(var(--tt-pos, 0.25rem));\n inset: auto auto var(--tt-off) 50%;\n }\n &:after {\n transform: translateX(-50%) translateY(var(--tt-pos, 0.25rem));\n inset: auto auto var(--tt-tail) 50%;\n }\n }\n }\n .tw\\:\\@sm\\:block {\n @container (width >= 24rem) {\n display: block;\n }\n }\n .tw\\:\\@sm\\:grid-cols-2 {\n @container (width >= 24rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .tw\\:\\@sm\\:overflow-visible {\n @container (width >= 24rem) {\n overflow: visible;\n }\n }\n .tw\\:\\@md\\:grid-cols-3 {\n @container (width >= 28rem) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n }\n .tw\\:\\@lg\\:grid-cols-4 {\n @container (width >= 32rem) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n }\n .tw\\:dark\\:bg-zinc-800 {\n @media (prefers-color-scheme: dark) {\n background-color: var(--tw-color-zinc-800);\n }\n }\n}\n@layer base {\n *,\n ::after,\n ::before,\n ::backdrop,\n ::file-selector-button {\n border-color: var(--color-gray-200, currentColor);\n }\n}\n.modal {\n z-index: 1200 !important;\n}\n.menu li a {\n border-radius: 10px;\n}\n.modal {\n z-index: 1200 !important;\n max-height: 100dvh;\n}\n.modal-box {\n max-height: calc(100dvh - 2em);\n}\n@layer base {\n :where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light] {\n color-scheme: light;\n --color-base-100: oklch(100% 0 0);\n --color-base-200: oklch(98% 0 0);\n --color-base-300: oklch(95% 0 0);\n --color-base-content: oklch(21% 0.006 285.885);\n --color-primary: oklch(45% 0.24 277.023);\n --color-primary-content: oklch(93% 0.034 272.788);\n --color-secondary: oklch(65% 0.241 354.308);\n --color-secondary-content: oklch(94% 0.028 342.258);\n --color-accent: oklch(77% 0.152 181.912);\n --color-accent-content: oklch(38% 0.063 188.416);\n --color-neutral: oklch(14% 0.005 285.823);\n --color-neutral-content: oklch(92% 0.004 286.32);\n --color-info: oklch(74% 0.16 232.661);\n --color-info-content: oklch(29% 0.066 243.157);\n --color-success: oklch(76% 0.177 163.223);\n --color-success-content: oklch(37% 0.077 168.94);\n --color-warning: oklch(82% 0.189 84.429);\n --color-warning-content: oklch(41% 0.112 45.904);\n --color-error: oklch(71% 0.194 13.428);\n --color-error-content: oklch(27% 0.105 12.094);\n --radius-selector: 0.5rem;\n --radius-field: 0.25rem;\n --radius-box: 0.5rem;\n --size-selector: 0.25rem;\n --size-field: 0.25rem;\n --border: 1px;\n --depth: 1;\n --noise: 0;\n }\n}\n@layer base {\n @media (prefers-color-scheme: dark) {\n :root {\n color-scheme: dark;\n --color-base-100: oklch(25.33% 0.016 252.42);\n --color-base-200: oklch(23.26% 0.014 253.1);\n --color-base-300: oklch(21.15% 0.012 254.09);\n --color-base-content: oklch(97.807% 0.029 256.847);\n --color-primary: oklch(58% 0.233 277.117);\n --color-primary-content: oklch(96% 0.018 272.314);\n --color-secondary: oklch(65% 0.241 354.308);\n --color-secondary-content: oklch(94% 0.028 342.258);\n --color-accent: oklch(77% 0.152 181.912);\n --color-accent-content: oklch(38% 0.063 188.416);\n --color-neutral: oklch(14% 0.005 285.823);\n --color-neutral-content: oklch(92% 0.004 286.32);\n --color-info: oklch(74% 0.16 232.661);\n --color-info-content: oklch(29% 0.066 243.157);\n --color-success: oklch(76% 0.177 163.223);\n --color-success-content: oklch(37% 0.077 168.94);\n --color-warning: oklch(82% 0.189 84.429);\n --color-warning-content: oklch(41% 0.112 45.904);\n --color-error: oklch(71% 0.194 13.428);\n --color-error-content: oklch(27% 0.105 12.094);\n --radius-selector: 0.5rem;\n --radius-field: 0.25rem;\n --radius-box: 0.5rem;\n --size-selector: 0.25rem;\n --size-field: 0.25rem;\n --border: 1px;\n --depth: 1;\n --noise: 0;\n }\n }\n}\n@layer base {\n :root:has(input.theme-controller[value=light]:checked),[data-theme=light] {\n color-scheme: light;\n --color-base-100: oklch(100% 0 0);\n --color-base-200: oklch(98% 0 0);\n --color-base-300: oklch(95% 0 0);\n --color-base-content: oklch(21% 0.006 285.885);\n --color-primary: oklch(45% 0.24 277.023);\n --color-primary-content: oklch(93% 0.034 272.788);\n --color-secondary: oklch(65% 0.241 354.308);\n --color-secondary-content: oklch(94% 0.028 342.258);\n --color-accent: oklch(77% 0.152 181.912);\n --color-accent-content: oklch(38% 0.063 188.416);\n --color-neutral: oklch(14% 0.005 285.823);\n --color-neutral-content: oklch(92% 0.004 286.32);\n --color-info: oklch(74% 0.16 232.661);\n --color-info-content: oklch(29% 0.066 243.157);\n --color-success: oklch(76% 0.177 163.223);\n --color-success-content: oklch(37% 0.077 168.94);\n --color-warning: oklch(82% 0.189 84.429);\n --color-warning-content: oklch(41% 0.112 45.904);\n --color-error: oklch(71% 0.194 13.428);\n --color-error-content: oklch(27% 0.105 12.094);\n --radius-selector: 0.5rem;\n --radius-field: 0.25rem;\n --radius-box: 0.5rem;\n --size-selector: 0.25rem;\n --size-field: 0.25rem;\n --border: 1px;\n --depth: 1;\n --noise: 0;\n }\n}\n@layer base {\n :root:has(input.theme-controller[value=dark]:checked),[data-theme=dark] {\n color-scheme: dark;\n --color-base-100: oklch(25.33% 0.016 252.42);\n --color-base-200: oklch(23.26% 0.014 253.1);\n --color-base-300: oklch(21.15% 0.012 254.09);\n --color-base-content: oklch(97.807% 0.029 256.847);\n --color-primary: oklch(58% 0.233 277.117);\n --color-primary-content: oklch(96% 0.018 272.314);\n --color-secondary: oklch(65% 0.241 354.308);\n --color-secondary-content: oklch(94% 0.028 342.258);\n --color-accent: oklch(77% 0.152 181.912);\n --color-accent-content: oklch(38% 0.063 188.416);\n --color-neutral: oklch(14% 0.005 285.823);\n --color-neutral-content: oklch(92% 0.004 286.32);\n --color-info: oklch(74% 0.16 232.661);\n --color-info-content: oklch(29% 0.066 243.157);\n --color-success: oklch(76% 0.177 163.223);\n --color-success-content: oklch(37% 0.077 168.94);\n --color-warning: oklch(82% 0.189 84.429);\n --color-warning-content: oklch(41% 0.112 45.904);\n --color-error: oklch(71% 0.194 13.428);\n --color-error-content: oklch(27% 0.105 12.094);\n --radius-selector: 0.5rem;\n --radius-field: 0.25rem;\n --radius-box: 0.5rem;\n --size-selector: 0.25rem;\n --size-field: 0.25rem;\n --border: 1px;\n --depth: 1;\n --noise: 0;\n }\n}\n@layer base {\n :root:has(input.theme-controller[value=valentine]:checked),[data-theme=valentine] {\n color-scheme: light;\n --color-base-100: oklch(97% 0.014 343.198);\n --color-base-200: oklch(94% 0.028 342.258);\n --color-base-300: oklch(89% 0.061 343.231);\n --color-base-content: oklch(52% 0.223 3.958);\n --color-primary: oklch(65% 0.241 354.308);\n --color-primary-content: oklch(100% 0 0);\n --color-secondary: oklch(62% 0.265 303.9);\n --color-secondary-content: oklch(97% 0.014 308.299);\n --color-accent: oklch(82% 0.111 230.318);\n --color-accent-content: oklch(39% 0.09 240.876);\n --color-neutral: oklch(40% 0.153 2.432);\n --color-neutral-content: oklch(89% 0.061 343.231);\n --color-info: oklch(86% 0.127 207.078);\n --color-info-content: oklch(44% 0.11 240.79);\n --color-success: oklch(84% 0.143 164.978);\n --color-success-content: oklch(43% 0.095 166.913);\n --color-warning: oklch(75% 0.183 55.934);\n --color-warning-content: oklch(26% 0.079 36.259);\n --color-error: oklch(63% 0.237 25.331);\n --color-error-content: oklch(97% 0.013 17.38);\n --radius-selector: 1rem;\n --radius-field: 2rem;\n --radius-box: 1rem;\n --size-selector: 0.25rem;\n --size-field: 0.25rem;\n --border: 1px;\n --depth: 0;\n --noise: 0;\n }\n}\n@layer base {\n :root:has(input.theme-controller[value=retro]:checked),[data-theme=retro] {\n color-scheme: light;\n --color-base-100: oklch(91.637% 0.034 90.515);\n --color-base-200: oklch(88.272% 0.049 91.774);\n --color-base-300: oklch(84.133% 0.065 90.856);\n --color-base-content: oklch(41% 0.112 45.904);\n --color-primary: oklch(80% 0.114 19.571);\n --color-primary-content: oklch(39% 0.141 25.723);\n --color-secondary: oklch(92% 0.084 155.995);\n --color-secondary-content: oklch(44% 0.119 151.328);\n --color-accent: oklch(68% 0.162 75.834);\n --color-accent-content: oklch(41% 0.112 45.904);\n --color-neutral: oklch(44% 0.011 73.639);\n --color-neutral-content: oklch(86% 0.005 56.366);\n --color-info: oklch(58% 0.158 241.966);\n --color-info-content: oklch(96% 0.059 95.617);\n --color-success: oklch(51% 0.096 186.391);\n --color-success-content: oklch(96% 0.059 95.617);\n --color-warning: oklch(64% 0.222 41.116);\n --color-warning-content: oklch(96% 0.059 95.617);\n --color-error: oklch(70% 0.191 22.216);\n --color-error-content: oklch(40% 0.123 38.172);\n --radius-selector: 0.25rem;\n --radius-field: 0.25rem;\n --radius-box: 0.5rem;\n --size-selector: 0.25rem;\n --size-field: 0.25rem;\n --border: 1px;\n --depth: 0;\n --noise: 0;\n }\n}\n@layer base {\n :root:has(input.theme-controller[value=aqua]:checked),[data-theme=aqua] {\n color-scheme: dark;\n --color-base-100: oklch(37% 0.146 265.522);\n --color-base-200: oklch(28% 0.091 267.935);\n --color-base-300: oklch(22% 0.091 267.935);\n --color-base-content: oklch(90% 0.058 230.902);\n --color-primary: oklch(85.661% 0.144 198.645);\n --color-primary-content: oklch(40.124% 0.068 197.603);\n --color-secondary: oklch(60.682% 0.108 309.782);\n --color-secondary-content: oklch(96% 0.016 293.756);\n --color-accent: oklch(93.426% 0.102 94.555);\n --color-accent-content: oklch(18.685% 0.02 94.555);\n --color-neutral: oklch(27% 0.146 265.522);\n --color-neutral-content: oklch(80% 0.146 265.522);\n --color-info: oklch(54.615% 0.215 262.88);\n --color-info-content: oklch(90.923% 0.043 262.88);\n --color-success: oklch(62.705% 0.169 149.213);\n --color-success-content: oklch(12.541% 0.033 149.213);\n --color-warning: oklch(66.584% 0.157 58.318);\n --color-warning-content: oklch(27% 0.077 45.635);\n --color-error: oklch(73.95% 0.19 27.33);\n --color-error-content: oklch(14.79% 0.038 27.33);\n --radius-selector: 1rem;\n --radius-field: 0.5rem;\n --radius-box: 1rem;\n --size-selector: 0.25rem;\n --size-field: 0.25rem;\n --border: 1px;\n --depth: 1;\n --noise: 0;\n }\n}\n@layer base {\n :root:has(input.theme-controller[value=cyberpunk]:checked),[data-theme=cyberpunk] {\n color-scheme: light;\n --color-base-100: oklch(94.51% 0.179 104.32);\n --color-base-200: oklch(91.51% 0.179 104.32);\n --color-base-300: oklch(85.51% 0.179 104.32);\n --color-base-content: oklch(0% 0 0);\n --color-primary: oklch(74.22% 0.209 6.35);\n --color-primary-content: oklch(14.844% 0.041 6.35);\n --color-secondary: oklch(83.33% 0.184 204.72);\n --color-secondary-content: oklch(16.666% 0.036 204.72);\n --color-accent: oklch(71.86% 0.217 310.43);\n --color-accent-content: oklch(14.372% 0.043 310.43);\n --color-neutral: oklch(23.04% 0.065 269.31);\n --color-neutral-content: oklch(94.51% 0.179 104.32);\n --color-info: oklch(72.06% 0.191 231.6);\n --color-info-content: oklch(0% 0 0);\n --color-success: oklch(64.8% 0.15 160);\n --color-success-content: oklch(0% 0 0);\n --color-warning: oklch(84.71% 0.199 83.87);\n --color-warning-content: oklch(0% 0 0);\n --color-error: oklch(71.76% 0.221 22.18);\n --color-error-content: oklch(0% 0 0);\n --radius-selector: 0rem;\n --radius-field: 0rem;\n --radius-box: 0rem;\n --size-selector: 0.25rem;\n --size-field: 0.25rem;\n --border: 1px;\n --depth: 0;\n --noise: 0;\n }\n}\n@layer base {\n :root:has(input.theme-controller[value=caramellatte]:checked),[data-theme=caramellatte] {\n color-scheme: light;\n --color-base-100: oklch(98% 0.016 73.684);\n --color-base-200: oklch(95% 0.038 75.164);\n --color-base-300: oklch(90% 0.076 70.697);\n --color-base-content: oklch(40% 0.123 38.172);\n --color-primary: oklch(0% 0 0);\n --color-primary-content: oklch(100% 0 0);\n --color-secondary: oklch(22.45% 0.075 37.85);\n --color-secondary-content: oklch(90% 0.076 70.697);\n --color-accent: oklch(46.44% 0.111 37.85);\n --color-accent-content: oklch(90% 0.076 70.697);\n --color-neutral: oklch(55% 0.195 38.402);\n --color-neutral-content: oklch(98% 0.016 73.684);\n --color-info: oklch(42% 0.199 265.638);\n --color-info-content: oklch(90% 0.076 70.697);\n --color-success: oklch(43% 0.095 166.913);\n --color-success-content: oklch(90% 0.076 70.697);\n --color-warning: oklch(82% 0.189 84.429);\n --color-warning-content: oklch(41% 0.112 45.904);\n --color-error: oklch(70% 0.191 22.216);\n --color-error-content: oklch(39% 0.141 25.723);\n --radius-selector: 2rem;\n --radius-field: 0.5rem;\n --radius-box: 1rem;\n --size-selector: 0.25rem;\n --size-field: 0.25rem;\n --border: 2px;\n --depth: 1;\n --noise: 1;\n }\n}\n@layer base {\n :root:has(input.theme-controller[value=abyss]:checked),[data-theme=abyss] {\n color-scheme: dark;\n --color-base-100: oklch(20% 0.08 209);\n --color-base-200: oklch(15% 0.08 209);\n --color-base-300: oklch(10% 0.08 209);\n --color-base-content: oklch(90% 0.076 70.697);\n --color-primary: oklch(92% 0.2653 125);\n --color-primary-content: oklch(50% 0.2653 125);\n --color-secondary: oklch(83.27% 0.0764 298.3);\n --color-secondary-content: oklch(43.27% 0.0764 298.3);\n --color-accent: oklch(43% 0 0);\n --color-accent-content: oklch(98% 0 0);\n --color-neutral: oklch(30% 0.08 209);\n --color-neutral-content: oklch(90% 0.076 70.697);\n --color-info: oklch(74% 0.16 232.661);\n --color-info-content: oklch(29% 0.066 243.157);\n --color-success: oklch(79% 0.209 151.711);\n --color-success-content: oklch(26% 0.065 152.934);\n --color-warning: oklch(84.8% 0.1962 84.62);\n --color-warning-content: oklch(44.8% 0.1962 84.62);\n --color-error: oklch(65% 0.1985 24.22);\n --color-error-content: oklch(27% 0.1985 24.22);\n --radius-selector: 2rem;\n --radius-field: 0.25rem;\n --radius-box: 0.5rem;\n --size-selector: 0.25rem;\n --size-field: 0.25rem;\n --border: 1px;\n --depth: 1;\n --noise: 0;\n }\n}\n@layer base {\n :root:has(input.theme-controller[value=silk]:checked),[data-theme=silk] {\n color-scheme: light;\n --color-base-100: oklch(97% 0.0035 67.78);\n --color-base-200: oklch(95% 0.0081 61.42);\n --color-base-300: oklch(90% 0.0081 61.42);\n --color-base-content: oklch(40% 0.0081 61.42);\n --color-primary: oklch(23.27% 0.0249 284.3);\n --color-primary-content: oklch(94.22% 0.2505 117.44);\n --color-secondary: oklch(23.27% 0.0249 284.3);\n --color-secondary-content: oklch(73.92% 0.2135 50.94);\n --color-accent: oklch(23.27% 0.0249 284.3);\n --color-accent-content: oklch(88.92% 0.2061 189.9);\n --color-neutral: oklch(20% 0 0);\n --color-neutral-content: oklch(80% 0.0081 61.42);\n --color-info: oklch(80.39% 0.1148 241.68);\n --color-info-content: oklch(30.39% 0.1148 241.68);\n --color-success: oklch(83.92% 0.0901 136.87);\n --color-success-content: oklch(23.92% 0.0901 136.87);\n --color-warning: oklch(83.92% 0.1085 80);\n --color-warning-content: oklch(43.92% 0.1085 80);\n --color-error: oklch(75.1% 0.1814 22.37);\n --color-error-content: oklch(35.1% 0.1814 22.37);\n --radius-selector: 2rem;\n --radius-field: 0.5rem;\n --radius-box: 1rem;\n --size-selector: 0.25rem;\n --size-field: 0.25rem;\n --border: 2px;\n --depth: 1;\n --noise: 0;\n }\n}\n@layer base {\n @property --radialprogress {\n syntax: \"<percentage>\";\n inherits: true;\n initial-value: 0%;\n }\n}\n@layer base {\n :root {\n scrollbar-color: color-mix(in oklch, currentColor 35%, #0000) #0000;\n }\n}\n@layer base {\n :root:has( .modal-open, .modal[open], .modal:target, .modal-toggle:checked, .drawer:not([class*=\"drawer-open\"]) > .drawer-toggle:checked ) {\n overflow: hidden;\n }\n}\n@layer base {\n :root,\n[data-theme] {\n background-color: var(--root-bg, var(--color-base-100));\n color: var(--color-base-content);\n }\n}\n@layer base {\n :root {\n --fx-noise: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E\");\n }\n .chat {\n --mask-chat: url(\"data:image/svg+xml,%3csvg width='13' height='13' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M0 11.5004C0 13.0004 2 13.0004 2 13.0004H12H13V0.00036329L12.5 0C12.5 0 11.977 2.09572 11.8581 2.50033C11.6075 3.35237 10.9149 4.22374 9 5.50036C6 7.50036 0 10.0004 0 11.5004Z'/%3e%3c/svg%3e\");\n }\n}\n@layer base {\n :where(\n :root:has(\n .modal-open,\n .modal[open],\n .modal:target,\n .modal-toggle:checked,\n .drawer:not(.drawer-open) > .drawer-toggle:checked\n )\n) {\n scrollbar-gutter: stable;\n background-image: linear-gradient(var(--color-base-100), var(--color-base-100));\n --root-bg: color-mix(in srgb, var(--color-base-100), oklch(0% 0 0) 40%);\n }\n}\n@keyframes skeleton {\n 0% {\n background-position: 150%;\n }\n 100% {\n background-position: -50%;\n }\n}\n@keyframes progress {\n 50% {\n background-position-x: -115%;\n }\n}\n@keyframes radio {\n 0% {\n padding: 5px;\n }\n 50% {\n padding: 3px;\n }\n}\n@keyframes dropdown {\n 0% {\n opacity: 0;\n }\n}\n@keyframes rating {\n 0%, 40% {\n scale: 1.1;\n filter: brightness(1.05) contrast(1.05);\n }\n}\n@keyframes toast {\n 0% {\n scale: 0.9;\n opacity: 0;\n }\n 100% {\n scale: 1;\n opacity: 1;\n }\n}\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: rotateX(0);\n}\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: rotateY(0);\n}\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: rotateZ(0);\n}\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false;\n initial-value: skewX(0);\n}\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false;\n initial-value: skewY(0);\n}\n@property --tw-space-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-space-x-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-leading {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-blur {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-brightness {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-contrast {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-grayscale {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-hue-rotate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-invert {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-opacity {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-saturate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-sepia {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-drop-shadow {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-blur {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-brightness {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-contrast {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-grayscale {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-hue-rotate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-invert {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-opacity {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-saturate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-sepia {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ease {\n syntax: \"*\";\n inherits: false;\n}";
|
77
|
+
styleInject(css_248z$a);
|
78
|
+
|
79
|
+
var css_248z$9 = ".masonry {\n column-count: 1;\n column-gap: 1.5rem;\n}\n\n.masonry-item {\n break-inside: avoid;\n margin-bottom: 1.5rem;\n}\n\n@media (min-width: 640px) {\n .masonry {\n column-count: 2;\n }\n}\n\n@media (min-width: 1024px) {\n .masonry {\n column-count: 3;\n }\n}\n\n@media (min-width: 1536px) {\n .masonry {\n column-count: 4;\n }\n}";
|
80
|
+
styleInject(css_248z$9);
|
81
|
+
|
82
|
+
var css_248z$8 = ":root {\n --toastify-color-info: var(--color-info);\n --toastify-color-success: var(--color-success);\n --toastify-color-warning: var(--color-warning);\n --toastify-color-error: var(--color-error);\n}\n\n.Toastify__toast {\n border-radius: var(--radius-box);\n --shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --shadow-colored: 0 20px 25px -5px var(--shadow-color), 0 8px 10px -6px var(--shadow-color);\n box-shadow: var(--ring-offset-shadow, 0 0 #0000), var(--ring-shadow, 0 0 #0000), var(--shadow);\n margin-left: 1rem;\n margin-right: 1rem;\n margin-bottom: 1rem;\n background-color: var(--color-base-100);\n color: var(--color-base-content);\n}\n\n.Toastify__toast-container {\n z-index: 2001 !important;\n}\n\n.Toastify__toast-container--top-right {\n top: 4.75em !important;\n}";
|
83
|
+
styleInject(css_248z$8);
|
84
|
+
|
85
|
+
var css_248z$7 = ".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(16px, 16px);\n}";
|
86
|
+
styleInject(css_248z$7);
|
87
|
+
|
88
|
+
var css_248z$6 = ".fade {\n mask-image: linear-gradient(180deg, transparent, #000 1%, #000 99%, transparent);\n}\n\n.placeholder-center::placeholder {\n text-align: center;\n}\n\ninput {\n box-sizing: border-box;\n}\n\ntextarea {\n box-sizing: border-box;\n}\n\n.crosshair-cursor-enabled {\n cursor: crosshair;\n}\n\n.marker-cluster span {\n color: #000;\n}";
|
89
|
+
styleInject(css_248z$6);
|
90
|
+
|
91
|
+
var css_248z$5 = ".svg-container {\n position: relative;\n width: 33px; /* gleiche Breite wie das untere SVG */\n height: 44px; /* gleiche Höhe wie das untere SVG */\n }\n \n .overlay-svg {\n position: absolute;\n width: 12.5px;\n top: calc(50% - 5px);\n left: 50%;\n transform: translate(-50%, -50%);\n }";
|
92
|
+
styleInject(css_248z$5);
|
93
|
+
|
94
|
+
var css_248z$4 = " .leaflet-control-attribution {\n display: none;\n }\n\n .leaflet-control-locate {\n display: none;\n }\n\n .leaflet-data-marker {\n background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAQCAYAAACcN8ZaAAAB3klEQVR42s3U4UdDURzG8czMXJnJ1Vwzc6VJZjaZJdlMlpQsKdmUFNOUspRSSqUolfQfr+fF98Vx5mwv9qbDx7LdznnO7/7Omej3+/+Ga0QMUYkhbvBgmhzCQxwxibIGrGEF8CQhU+LLtKQkQNqScUgjxRxTBIxbgfgD/BgnhM8kM5KTeclLQYqGkkMRBckzR8ic/mAgd5BAZplsUaqyIg2sDtHg2brUZJk5SmwopErJUWE8SpmTMhNvya60Zd/SNrR4bkeaskG4uiwRZk6yrJEYFibGAxn+scECHTmTnuVCzvmty3PHciB7bGKN6lQkzysPqIrHmpFhYbKUtckC1/Ioz4ZHuZdbuSLYiRxRpSZVWXZVxAzC0R4Ik5SQsu6w8yd5l2/5kg95I9SdXMoZQfYIUjeqEUrgOkXGPeN4TYRhxy8E+ZUf+eS7B7miIoeybVSjKDnm8u3+gH3pDTYwu1igATvs/pXqvBKiR4i2bNJfi1ZfUAnjgrOG8wY2quNzBKuU/ZS+uSFEl5O0xRGuUIlZCcw7xG5QPkeHYUSNV5WXGou2sC3rBC0LjenqCXGO0WEiTJa0Lr4KixdHBrDGuGGiRqCUpFk8pGIpQtCU7p4YPwxYxEMCk1aAMQZh8Ac8PfbIzYPJOwAAAABJRU5ErkJggg==') no-repeat;\n background-position: 6px 32px;\n }\n\n .leaflet-container {\n cursor: inherit;\n }\n\n .leaflet-popup-scrolled {\n overflow-x: hidden;\n }\n\n .leaflet-popup-content-wrapper,\n .leaflet-popup-tip {\n background-color: var(--color-base-100);\n color: var(--color-base-content);\n border-radius: var(--radius-box);\n }\n\n .leaflet-popup-tip-container,\n .leaflet-popup-tip {\n border-radius: 0;\n }\n\n .leaflet-tooltip {\n background-color: var(--color-base-100);\n color: var(--color-base-content);\n border-width: 0px;\n }\n\n .leaflet-tooltip {\n border-radius: var(--radius-box);\n transition: opacity 500ms;\n transition-delay: 50ms;\n }\n\n .leaflet-tooltip::before {\n border-top-color: var(--color-base-100);\n }\n\n .leaflet-container {\n text-align: left;\n background-image: url(\"data:image/svg+xml,%3Csvg width='40' height='40' 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 background-repeat: no-repeat;\n background-attachment: fixed;\n background-position: 50% 80%;\n }\n\n .leaflet-popup-close-button span {\n color: var(--color-base-content);\n opacity: 50%;\n }\n\n .leaflet-top {\n top: 6em\n }\n\n .leaflet-left {\n left: 0.5em\n }\n\n .leaflet-control-zoom {\n border-radius: var(--radius-box);\n color: var(--color-base-content);\n background-color: var(--color-base-100);\n width: calc(var(--tw-spacing) * 10);\n border: 2px solid var(--color-base-300) !important;\n box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1) !important;\n }\n\n .leaflet-control-zoom-in {\n border-top-left-radius: var(--radius-box) !important;\n border-top-right-radius: var(--radius-box) !important;\n color: var(--color-base-content) !important;\n background-color: var(--color-base-100) !important;\n width: calc(var(--tw-spacing) * 9) !important;\n border-bottom: 1px solid var(--color-base-300) !important;\n height: calc(var(--tw-spacing) * 9) !important;\n line-height: 40px !important;\n }\n\n .leaflet-control-zoom-out {\n border-bottom-left-radius: var(--radius-box) !important;\n border-bottom-right-radius: var(--radius-box) !important;\n color: var(--color-base-content) !important;\n background-color: var(--color-base-100) !important;\n width: calc(var(--tw-spacing) * 9) !important;\n height: calc(var(--tw-spacing) * 9) !important;\n line-height: 40px !important;\n }\n\n .leaflet-popup-content p {\n margin: calc(var(--tw-spacing) * 1) !important\n }";
|
95
|
+
styleInject(css_248z$4);
|
96
|
+
|
97
|
+
var css_248z$3 = ".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}";
|
98
|
+
styleInject(css_248z$3);
|
99
|
+
|
100
|
+
var css_248z$2 = "/*! tailwindcss v4.0.14 | MIT License | https://tailwindcss.com */\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --tw-color-red-500: oklch(0.637 0.237 25.331);\n --tw-color-red-600: oklch(0.577 0.245 27.325);\n --tw-color-green-500: oklch(0.723 0.219 149.579);\n --tw-color-slate-200: oklch(0.929 0.013 255.508);\n --tw-color-slate-300: oklch(0.869 0.022 252.894);\n --tw-color-gray-200: oklch(0.928 0.006 264.531);\n --tw-color-gray-400: oklch(0.707 0.022 261.325);\n --tw-color-gray-500: oklch(0.551 0.027 264.364);\n --tw-color-gray-600: oklch(0.446 0.03 256.802);\n --tw-color-zinc-500: oklch(0.552 0.016 285.938);\n --tw-color-zinc-800: oklch(0.274 0.006 286.033);\n --tw-color-white: #fff;\n --tw-spacing: 0.25rem;\n --tw-container-xs: 20rem;\n --tw-container-xl: 36rem;\n --tw-container-2xl: 42rem;\n --tw-container-3xl: 48rem;\n --tw-container-6xl: 72rem;\n --tw-text-xs: 0.75rem;\n --tw-text-xs--line-height: calc(1 / 0.75);\n --tw-text-sm: 0.875rem;\n --tw-text-sm--line-height: calc(1.25 / 0.875);\n --tw-text-base: 1rem;\n --tw-text-base--line-height: calc(1.5 / 1);\n --tw-text-lg: 1.125rem;\n --tw-text-lg--line-height: calc(1.75 / 1.125);\n --tw-text-xl: 1.25rem;\n --tw-text-xl--line-height: calc(1.75 / 1.25);\n --tw-text-2xl: 1.5rem;\n --tw-text-2xl--line-height: calc(2 / 1.5);\n --tw-text-3xl: 1.875rem;\n --tw-text-3xl--line-height: calc(2.25 / 1.875);\n --tw-text-6xl: 3.75rem;\n --tw-text-6xl--line-height: 1;\n --tw-font-weight-normal: 400;\n --tw-font-weight-medium: 500;\n --tw-font-weight-semibold: 600;\n --tw-font-weight-bold: 700;\n --tw-leading-relaxed: 1.625;\n --tw-radius-md: 0.375rem;\n --tw-radius-lg: 0.5rem;\n --tw-radius-xl: 0.75rem;\n --tw-radius-2xl: 1rem;\n --tw-drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12);\n --tw-ease-in: cubic-bezier(0.4, 0, 1, 1);\n --tw-aspect-video: 16 / 9;\n --tw-default-transition-duration: 150ms;\n --tw-default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var( --default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" );\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var( --default-font-variation-settings, normal );\n -webkit-tap-highlight-color: transparent;\n }\n body {\n line-height: inherit;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var( --default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace );\n font-feature-settings: var( --default-mono-font-feature-settings, normal );\n font-variation-settings: var( --default-mono-font-variation-settings, normal );\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n color: color-mix(in oklab, currentColor 50%, transparent);\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .tw\\:\\@container {\n container-type: inline-size;\n }\n .tw\\:pointer-events-auto {\n pointer-events: auto;\n }\n .tw\\:pointer-events-none {\n pointer-events: none;\n }\n .tw\\:absolute {\n position: absolute;\n }\n .tw\\:fixed {\n position: fixed;\n }\n .tw\\:relative {\n position: relative;\n }\n .tw\\:inset-0 {\n inset: calc(var(--tw-spacing) * 0);\n }\n .tw\\:inset-y-0 {\n inset-block: calc(var(--tw-spacing) * 0);\n }\n .tw\\:-top-2 {\n top: calc(var(--tw-spacing) * -2);\n }\n .tw\\:top-0 {\n top: calc(var(--tw-spacing) * 0);\n }\n .tw\\:top-1 {\n top: calc(var(--tw-spacing) * 1);\n }\n .tw\\:top-2 {\n top: calc(var(--tw-spacing) * 2);\n }\n .tw\\:top-4 {\n top: calc(var(--tw-spacing) * 4);\n }\n .tw\\:top-14 {\n top: calc(var(--tw-spacing) * 14);\n }\n .tw\\:-right-2 {\n right: calc(var(--tw-spacing) * -2);\n }\n .tw\\:right-0 {\n right: calc(var(--tw-spacing) * 0);\n }\n .tw\\:right-1 {\n right: calc(var(--tw-spacing) * 1);\n }\n .tw\\:right-2 {\n right: calc(var(--tw-spacing) * 2);\n }\n .tw\\:right-4 {\n right: calc(var(--tw-spacing) * 4);\n }\n .tw\\:right-5 {\n right: calc(var(--tw-spacing) * 5);\n }\n .tw\\:right-6 {\n right: calc(var(--tw-spacing) * 6);\n }\n .tw\\:bottom-0 {\n bottom: calc(var(--tw-spacing) * 0);\n }\n .tw\\:bottom-4 {\n bottom: calc(var(--tw-spacing) * 4);\n }\n .tw\\:bottom-24\\! {\n bottom: calc(var(--tw-spacing) * 24) !important;\n }\n .tw\\:-left-6 {\n left: calc(var(--tw-spacing) * -6);\n }\n .tw\\:left-0 {\n left: calc(var(--tw-spacing) * 0);\n }\n .tw\\:left-0\\! {\n left: calc(var(--tw-spacing) * 0) !important;\n }\n .tw\\:left-1\\/2 {\n left: calc(1/2 * 100%);\n }\n .tw\\:left-4 {\n left: calc(var(--tw-spacing) * 4);\n }\n .tw\\:left-auto\\! {\n left: auto !important;\n }\n .tw\\:z-1 {\n z-index: 1;\n }\n .tw\\:z-500 {\n z-index: 500;\n }\n .tw\\:z-999 {\n z-index: 999;\n }\n .tw\\:z-1000 {\n z-index: 1000;\n }\n .tw\\:z-2000 {\n z-index: 2000;\n }\n .tw\\:z-3000 {\n z-index: 3000;\n }\n .tw\\:z-4000 {\n z-index: 4000;\n }\n .tw\\:z-9998 {\n z-index: 9998;\n }\n .tw\\:z-10000 {\n z-index: 10000;\n }\n .tw\\:z-10000\\! {\n z-index: 10000 !important;\n }\n .tw\\:z-10035 {\n z-index: 10035;\n }\n .tw\\:col-span-1 {\n grid-column: span 1 / span 1;\n }\n .tw\\:float-left {\n float: left;\n }\n .tw\\:float-right {\n float: right;\n }\n .tw\\:m-1 {\n margin: calc(var(--tw-spacing) * 1);\n }\n .tw\\:m-2 {\n margin: calc(var(--tw-spacing) * 2);\n }\n .tw\\:m-4 {\n margin: calc(var(--tw-spacing) * 4);\n }\n .tw\\:m-4\\! {\n margin: calc(var(--tw-spacing) * 4) !important;\n }\n .tw\\:m-auto {\n margin: auto;\n }\n .tw\\:mx-0\\.5 {\n margin-inline: calc(var(--tw-spacing) * 0.5);\n }\n .tw\\:mx-1 {\n margin-inline: calc(var(--tw-spacing) * 1);\n }\n .tw\\:mx-2 {\n margin-inline: calc(var(--tw-spacing) * 2);\n }\n .tw\\:mx-4 {\n margin-inline: calc(var(--tw-spacing) * 4);\n }\n .tw\\:mx-6 {\n margin-inline: calc(var(--tw-spacing) * 6);\n }\n .tw\\:my-0\\! {\n margin-block: calc(var(--tw-spacing) * 0) !important;\n }\n .tw\\:my-1 {\n margin-block: calc(var(--tw-spacing) * 1);\n }\n .tw\\:my-2 {\n margin-block: calc(var(--tw-spacing) * 2);\n }\n .tw\\:my-4 {\n margin-block: calc(var(--tw-spacing) * 4);\n }\n .tw\\:my-10 {\n margin-block: calc(var(--tw-spacing) * 10);\n }\n .tw\\:-mt-2 {\n margin-top: calc(var(--tw-spacing) * -2);\n }\n .tw\\:mt-0 {\n margin-top: calc(var(--tw-spacing) * 0);\n }\n .tw\\:mt-1 {\n margin-top: calc(var(--tw-spacing) * 1);\n }\n .tw\\:mt-1\\.5 {\n margin-top: calc(var(--tw-spacing) * 1.5);\n }\n .tw\\:mt-2 {\n margin-top: calc(var(--tw-spacing) * 2);\n }\n .tw\\:mt-3 {\n margin-top: calc(var(--tw-spacing) * 3);\n }\n .tw\\:mt-4 {\n margin-top: calc(var(--tw-spacing) * 4);\n }\n .tw\\:mt-5 {\n margin-top: calc(var(--tw-spacing) * 5);\n }\n .tw\\:mt-5\\.5 {\n margin-top: calc(var(--tw-spacing) * 5.5);\n }\n .tw\\:mt-6 {\n margin-top: calc(var(--tw-spacing) * 6);\n }\n .tw\\:mt-8 {\n margin-top: calc(var(--tw-spacing) * 8);\n }\n .tw\\:mt-12 {\n margin-top: calc(var(--tw-spacing) * 12);\n }\n .tw\\:mt-16 {\n margin-top: calc(var(--tw-spacing) * 16);\n }\n .tw\\:-mr-4 {\n margin-right: calc(var(--tw-spacing) * -4);\n }\n .tw\\:-mr-6 {\n margin-right: calc(var(--tw-spacing) * -6);\n }\n .tw\\:mr-1 {\n margin-right: calc(var(--tw-spacing) * 1);\n }\n .tw\\:mr-2 {\n margin-right: calc(var(--tw-spacing) * 2);\n }\n .tw\\:mr-4 {\n margin-right: calc(var(--tw-spacing) * 4);\n }\n .tw\\:mr-5 {\n margin-right: calc(var(--tw-spacing) * 5);\n }\n .tw\\:-mb-1 {\n margin-bottom: calc(var(--tw-spacing) * -1);\n }\n .tw\\:-mb-2 {\n margin-bottom: calc(var(--tw-spacing) * -2);\n }\n .tw\\:-mb-4 {\n margin-bottom: calc(var(--tw-spacing) * -4);\n }\n .tw\\:mb-0 {\n margin-bottom: calc(var(--tw-spacing) * 0);\n }\n .tw\\:mb-1 {\n margin-bottom: calc(var(--tw-spacing) * 1);\n }\n .tw\\:mb-2 {\n margin-bottom: calc(var(--tw-spacing) * 2);\n }\n .tw\\:mb-3 {\n margin-bottom: calc(var(--tw-spacing) * 3);\n }\n .tw\\:mb-4 {\n margin-bottom: calc(var(--tw-spacing) * 4);\n }\n .tw\\:mb-6 {\n margin-bottom: calc(var(--tw-spacing) * 6);\n }\n .tw\\:mb-10 {\n margin-bottom: calc(var(--tw-spacing) * 10);\n }\n .tw\\:ml-1 {\n margin-left: calc(var(--tw-spacing) * 1);\n }\n .tw\\:ml-2 {\n margin-left: calc(var(--tw-spacing) * 2);\n }\n .tw\\:ml-3 {\n margin-left: calc(var(--tw-spacing) * 3);\n }\n .tw\\:ml-4 {\n margin-left: calc(var(--tw-spacing) * 4);\n }\n .tw\\:ml-14 {\n margin-left: calc(var(--tw-spacing) * 14);\n }\n .tw\\:ml-48 {\n margin-left: calc(var(--tw-spacing) * 48);\n }\n .tw\\:block {\n display: block;\n }\n .tw\\:flex {\n display: flex;\n }\n .tw\\:grid {\n display: grid;\n }\n .tw\\:hidden {\n display: none;\n }\n .tw\\:inline {\n display: inline;\n }\n .tw\\:inline-block {\n display: inline-block;\n }\n .tw\\:inline-flex {\n display: inline-flex;\n }\n .tw\\:table {\n display: table;\n }\n .tw\\:\\!h-\\[calc\\(100dvh-280px\\)\\] {\n height: calc(100dvh - 280px) !important;\n }\n .tw\\:h-2 {\n height: calc(var(--tw-spacing) * 2);\n }\n .tw\\:h-3 {\n height: calc(var(--tw-spacing) * 3);\n }\n .tw\\:h-3\\/4 {\n height: calc(3/4 * 100%);\n }\n .tw\\:h-4 {\n height: calc(var(--tw-spacing) * 4);\n }\n .tw\\:h-5 {\n height: calc(var(--tw-spacing) * 5);\n }\n .tw\\:h-6 {\n height: calc(var(--tw-spacing) * 6);\n }\n .tw\\:h-8 {\n height: calc(var(--tw-spacing) * 8);\n }\n .tw\\:h-10 {\n height: calc(var(--tw-spacing) * 10);\n }\n .tw\\:h-12 {\n height: calc(var(--tw-spacing) * 12);\n }\n .tw\\:h-16 {\n height: calc(var(--tw-spacing) * 16);\n }\n .tw\\:h-20 {\n height: calc(var(--tw-spacing) * 20);\n }\n .tw\\:h-24 {\n height: calc(var(--tw-spacing) * 24);\n }\n .tw\\:h-28 {\n height: calc(var(--tw-spacing) * 28);\n }\n .tw\\:h-32 {\n height: calc(var(--tw-spacing) * 32);\n }\n .tw\\:h-36 {\n height: calc(var(--tw-spacing) * 36);\n }\n .tw\\:h-40 {\n height: calc(var(--tw-spacing) * 40);\n }\n .tw\\:h-48 {\n height: calc(var(--tw-spacing) * 48);\n }\n .tw\\:h-64 {\n height: calc(var(--tw-spacing) * 64);\n }\n .tw\\:h-\\[2em\\] {\n height: 2em;\n }\n .tw\\:h-\\[calc\\(50\\%-0\\.75em\\)\\] {\n height: calc(50% - 0.75em);\n }\n .tw\\:h-\\[calc\\(50\\%-1\\.5em\\)\\] {\n height: calc(50% - 1.5em);\n }\n .tw\\:h-\\[calc\\(100\\%-1rem\\)\\] {\n height: calc(100% - 1rem);\n }\n .tw\\:h-\\[calc\\(100dvh-22px\\)\\] {\n height: calc(100dvh - 22px);\n }\n .tw\\:h-\\[calc\\(100dvh-64px\\)\\] {\n height: calc(100dvh - 64px);\n }\n .tw\\:h-\\[calc\\(100dvh-268px\\)\\] {\n height: calc(100dvh - 268px);\n }\n .tw\\:h-fit {\n height: fit-content;\n }\n .tw\\:h-full {\n height: 100%;\n }\n .tw\\:max-h-64 {\n max-height: calc(var(--tw-spacing) * 64);\n }\n .tw\\:max-h-124 {\n max-height: calc(var(--tw-spacing) * 124);\n }\n .tw\\:max-h-136 {\n max-height: calc(var(--tw-spacing) * 136);\n }\n .tw\\:max-h-\\[1000px\\] {\n max-height: 1000px;\n }\n .tw\\:max-h-\\[calc\\(100dvh-96px\\)\\] {\n max-height: calc(100dvh - 96px);\n }\n .tw\\:max-h-\\[calc\\(100dvh-152px\\)\\] {\n max-height: calc(100dvh - 152px);\n }\n .tw\\:max-h-full {\n max-height: 100%;\n }\n .tw\\:min-h-0 {\n min-height: calc(var(--tw-spacing) * 0);\n }\n .tw\\:min-h-36 {\n min-height: calc(var(--tw-spacing) * 36);\n }\n .tw\\:min-h-42 {\n min-height: calc(var(--tw-spacing) * 42);\n }\n .tw\\:min-h-56 {\n min-height: calc(var(--tw-spacing) * 56);\n }\n .tw\\:min-h-80 {\n min-height: calc(var(--tw-spacing) * 80);\n }\n .tw\\:min-h-\\[5em\\] {\n min-height: 5em;\n }\n .tw\\:min-h-\\[21px\\] {\n min-height: 21px;\n }\n .tw\\:w-1 {\n width: calc(var(--tw-spacing) * 1);\n }\n .tw\\:w-2 {\n width: calc(var(--tw-spacing) * 2);\n }\n .tw\\:w-4 {\n width: calc(var(--tw-spacing) * 4);\n }\n .tw\\:w-5 {\n width: calc(var(--tw-spacing) * 5);\n }\n .tw\\:w-6 {\n width: calc(var(--tw-spacing) * 6);\n }\n .tw\\:w-8 {\n width: calc(var(--tw-spacing) * 8);\n }\n .tw\\:w-10 {\n width: calc(var(--tw-spacing) * 10);\n }\n .tw\\:w-12 {\n width: calc(var(--tw-spacing) * 12);\n }\n .tw\\:w-14 {\n width: calc(var(--tw-spacing) * 14);\n }\n .tw\\:w-16 {\n width: calc(var(--tw-spacing) * 16);\n }\n .tw\\:w-20 {\n width: calc(var(--tw-spacing) * 20);\n }\n .tw\\:w-28 {\n width: calc(var(--tw-spacing) * 28);\n }\n .tw\\:w-36 {\n width: calc(var(--tw-spacing) * 36);\n }\n .tw\\:w-48 {\n width: calc(var(--tw-spacing) * 48);\n }\n .tw\\:w-52 {\n width: calc(var(--tw-spacing) * 52);\n }\n .tw\\:w-80 {\n width: calc(var(--tw-spacing) * 80);\n }\n .tw\\:w-83 {\n width: calc(var(--tw-spacing) * 83);\n }\n .tw\\:w-96 {\n width: calc(var(--tw-spacing) * 96);\n }\n .tw\\:w-\\[1px\\] {\n width: 1px;\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: fit-content;\n }\n .tw\\:w-full {\n width: 100%;\n }\n .tw\\:w-xl {\n width: var(--tw-container-xl);\n }\n .tw\\:max-w-3xl {\n max-width: var(--tw-container-3xl);\n }\n .tw\\:max-w-69 {\n max-width: calc(var(--tw-spacing) * 69);\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-\\[calc\\(100\\%-60px\\)\\] {\n max-width: calc(100% - 60px);\n }\n .tw\\:max-w-full {\n max-width: 100%;\n }\n .tw\\:max-w-xl {\n max-width: var(--tw-container-xl);\n }\n .tw\\:max-w-xs {\n max-width: var(--tw-container-xs);\n }\n .tw\\:min-w-0 {\n min-width: calc(var(--tw-spacing) * 0);\n }\n .tw\\:min-w-80 {\n min-width: calc(var(--tw-spacing) * 80);\n }\n .tw\\:min-w-\\[8rem\\] {\n min-width: 8rem;\n }\n .tw\\:min-w-\\[10\\.4em\\] {\n min-width: 10.4em;\n }\n .tw\\:min-w-fit {\n min-width: fit-content;\n }\n .tw\\:flex-1 {\n flex: 1;\n }\n .tw\\:flex-none {\n flex: none;\n }\n .tw\\:shrink {\n flex-shrink: 1;\n }\n .tw\\:flex-grow {\n flex-grow: 1;\n }\n .tw\\:grow {\n flex-grow: 1;\n }\n .tw\\:basis-1\\/5 {\n flex-basis: calc(1/5 * 100%);\n }\n .tw\\:basis-2\\/5 {\n flex-basis: calc(2/5 * 100%);\n }\n .tw\\:-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .tw\\:-translate-x-full {\n --tw-translate-x: -100%;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .tw\\:translate-x-0 {\n --tw-translate-x: calc(var(--tw-spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .tw\\:translate-x-1\\/3 {\n --tw-translate-x: calc(1/3 * 100%);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .tw\\:-translate-y-1\\/3 {\n --tw-translate-y: calc(calc(1/3 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .tw\\:rotate-180 {\n rotate: 180deg;\n }\n .tw\\:transform {\n transform: var(--tw-rotate-x) var(--tw-rotate-y) var(--tw-rotate-z) var(--tw-skew-x) var(--tw-skew-y);\n }\n .tw\\:animate-none {\n animation: none;\n }\n .tw\\:cursor-not-allowed {\n cursor: not-allowed;\n }\n .tw\\:cursor-pointer {\n cursor: pointer;\n }\n .tw\\:cursor-text {\n cursor: text;\n }\n .tw\\:resize-none {\n resize: none;\n }\n .tw\\:list-none {\n list-style-type: none;\n }\n .tw\\:columns-1 {\n columns: 1;\n }\n .tw\\:break-inside-avoid {\n break-inside: avoid;\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-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n .tw\\:grid-cols-6 {\n grid-template-columns: repeat(6, minmax(0, 1fr));\n }\n .tw\\:flex-col {\n flex-direction: column;\n }\n .tw\\:flex-row {\n flex-direction: row;\n }\n .tw\\:flex-nowrap {\n flex-wrap: nowrap;\n }\n .tw\\:flex-wrap {\n flex-wrap: wrap;\n }\n .tw\\:place-content-center {\n place-content: center;\n }\n .tw\\:place-content-end {\n place-content: end;\n }\n .tw\\:place-items-center {\n place-items: center;\n }\n .tw\\:place-items-end {\n place-items: end;\n }\n .tw\\:items-center {\n align-items: center;\n }\n .tw\\:justify-between {\n justify-content: space-between;\n }\n .tw\\:justify-center {\n justify-content: center;\n }\n .tw\\:justify-end {\n justify-content: flex-end;\n }\n .tw\\:justify-normal {\n justify-content: normal;\n }\n .tw\\:justify-start {\n justify-content: flex-start;\n }\n .tw\\:gap-2 {\n gap: calc(var(--tw-spacing) * 2);\n }\n .tw\\:gap-4 {\n gap: calc(var(--tw-spacing) * 4);\n }\n .tw\\:gap-6 {\n gap: calc(var(--tw-spacing) * 6);\n }\n .tw\\:space-y-2 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--tw-spacing) * 2) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--tw-spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .tw\\:space-y-4 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--tw-spacing) * 4) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--tw-spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .tw\\:space-y-6 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--tw-spacing) * 6) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--tw-spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .tw\\:space-x-2 {\n :where(& > :not(:last-child)) {\n --tw-space-x-reverse: 0;\n margin-inline-start: calc(calc(var(--tw-spacing) * 2) * var(--tw-space-x-reverse));\n margin-inline-end: calc(calc(var(--tw-spacing) * 2) * calc(1 - var(--tw-space-x-reverse)));\n }\n }\n .tw\\:space-x-3 {\n :where(& > :not(:last-child)) {\n --tw-space-x-reverse: 0;\n margin-inline-start: calc(calc(var(--tw-spacing) * 3) * var(--tw-space-x-reverse));\n margin-inline-end: calc(calc(var(--tw-spacing) * 3) * calc(1 - var(--tw-space-x-reverse)));\n }\n }\n .tw\\:place-self-center {\n place-self: center;\n }\n .tw\\:place-self-end {\n place-self: end;\n }\n .tw\\:self-center {\n align-self: center;\n }\n .tw\\:truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .tw\\:overflow-auto {\n overflow: auto;\n }\n .tw\\:overflow-hidden {\n overflow: hidden;\n }\n .tw\\:overflow-scroll {\n overflow: scroll;\n }\n .tw\\:overflow-x-auto {\n overflow-x: auto;\n }\n .tw\\:overflow-x-hidden {\n overflow-x: hidden;\n }\n .tw\\:overflow-y-auto {\n overflow-y: auto;\n }\n .tw\\:rounded {\n border-radius: 0.25rem;\n }\n .tw\\:rounded-2xl {\n border-radius: var(--tw-radius-2xl);\n }\n .tw\\:rounded-full {\n border-radius: calc(infinity * 1px);\n }\n .tw\\:rounded-lg {\n border-radius: var(--tw-radius-lg);\n }\n .tw\\:rounded-md {\n border-radius: var(--tw-radius-md);\n }\n .tw\\:rounded-none {\n border-radius: 0;\n }\n .tw\\:rounded-none\\! {\n border-radius: 0 !important;\n }\n .tw\\:rounded-xl {\n border-radius: var(--tw-radius-xl);\n }\n .tw\\:rounded-tr-md {\n border-top-right-radius: var(--tw-radius-md);\n }\n .tw\\:rounded-b-none {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n }\n .tw\\:rounded-br-md {\n border-bottom-right-radius: var(--tw-radius-md);\n }\n .tw\\:border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .tw\\:border-0 {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n .tw\\:border-1 {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .tw\\:border-4 {\n border-style: var(--tw-border-style);\n border-width: 4px;\n }\n .tw\\:border-\\[1px\\] {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .tw\\:border-dashed {\n --tw-border-style: dashed;\n border-style: dashed;\n }\n .tw\\:border-none {\n --tw-border-style: none;\n border-style: none;\n }\n .tw\\:border-current\\/10 {\n border-color: color-mix(in oklab, currentColor 10%, transparent);\n }\n .tw\\:border-current\\/50 {\n border-color: color-mix(in oklab, currentColor 50%, transparent);\n }\n .tw\\:bg-gray-200 {\n background-color: var(--tw-color-gray-200);\n }\n .tw\\:bg-red-500 {\n background-color: var(--tw-color-red-500);\n }\n .tw\\:bg-slate-200 {\n background-color: var(--tw-color-slate-200);\n }\n .tw\\:bg-transparent {\n background-color: transparent;\n }\n .tw\\:bg-white {\n background-color: var(--tw-color-white);\n }\n .tw\\:fill-current {\n fill: currentColor;\n }\n .tw\\:stroke-3 {\n stroke-width: 3;\n }\n .tw\\:stroke-\\[2\\.5\\] {\n stroke-width: 2.5;\n }\n .tw\\:object-cover {\n object-fit: cover;\n }\n .tw\\:p-0 {\n padding: calc(var(--tw-spacing) * 0);\n }\n .tw\\:p-0\\! {\n padding: calc(var(--tw-spacing) * 0) !important;\n }\n .tw\\:p-1 {\n padding: calc(var(--tw-spacing) * 1);\n }\n .tw\\:p-2 {\n padding: calc(var(--tw-spacing) * 2);\n }\n .tw\\:p-3 {\n padding: calc(var(--tw-spacing) * 3);\n }\n .tw\\:p-4 {\n padding: calc(var(--tw-spacing) * 4);\n }\n .tw\\:p-4\\! {\n padding: calc(var(--tw-spacing) * 4) !important;\n }\n .tw\\:p-6 {\n padding: calc(var(--tw-spacing) * 6);\n }\n .tw\\:p-9\\! {\n padding: calc(var(--tw-spacing) * 9) !important;\n }\n .tw\\:p-\\[1px\\] {\n padding: 1px;\n }\n .tw\\:px-0 {\n padding-inline: calc(var(--tw-spacing) * 0);\n }\n .tw\\:px-1 {\n padding-inline: calc(var(--tw-spacing) * 1);\n }\n .tw\\:px-1\\.5 {\n padding-inline: calc(var(--tw-spacing) * 1.5);\n }\n .tw\\:px-2 {\n padding-inline: calc(var(--tw-spacing) * 2);\n }\n .tw\\:px-4 {\n padding-inline: calc(var(--tw-spacing) * 4);\n }\n .tw\\:px-6 {\n padding-inline: calc(var(--tw-spacing) * 6);\n }\n .tw\\:px-8 {\n padding-inline: calc(var(--tw-spacing) * 8);\n }\n .tw\\:py-0\\.5 {\n padding-block: calc(var(--tw-spacing) * 0.5);\n }\n .tw\\:py-1 {\n padding-block: calc(var(--tw-spacing) * 1);\n }\n .tw\\:py-2 {\n padding-block: calc(var(--tw-spacing) * 2);\n }\n .tw\\:ps-2\\! {\n padding-inline-start: calc(var(--tw-spacing) * 2) !important;\n }\n .tw\\:pe-2\\! {\n padding-inline-end: calc(var(--tw-spacing) * 2) !important;\n }\n .tw\\:pt-0 {\n padding-top: calc(var(--tw-spacing) * 0);\n }\n .tw\\:pt-1 {\n padding-top: calc(var(--tw-spacing) * 1);\n }\n .tw\\:pt-2 {\n padding-top: calc(var(--tw-spacing) * 2);\n }\n .tw\\:pt-4 {\n padding-top: calc(var(--tw-spacing) * 4);\n }\n .tw\\:pt-6 {\n padding-top: calc(var(--tw-spacing) * 6);\n }\n .tw\\:pr-1 {\n padding-right: calc(var(--tw-spacing) * 1);\n }\n .tw\\:pr-4 {\n padding-right: calc(var(--tw-spacing) * 4);\n }\n .tw\\:pr-12 {\n padding-right: calc(var(--tw-spacing) * 12);\n }\n .tw\\:pb-0 {\n padding-bottom: calc(var(--tw-spacing) * 0);\n }\n .tw\\:pb-1 {\n padding-bottom: calc(var(--tw-spacing) * 1);\n }\n .tw\\:pb-2 {\n padding-bottom: calc(var(--tw-spacing) * 2);\n }\n .tw\\:pb-4 {\n padding-bottom: calc(var(--tw-spacing) * 4);\n }\n .tw\\:pb-6 {\n padding-bottom: calc(var(--tw-spacing) * 6);\n }\n .tw\\:pl-2 {\n padding-left: calc(var(--tw-spacing) * 2);\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: var(--tw-text-2xl);\n line-height: var(--tw-leading, var(--tw-text-2xl--line-height));\n }\n .tw\\:text-3xl {\n font-size: var(--tw-text-3xl);\n line-height: var(--tw-leading, var(--tw-text-3xl--line-height));\n }\n .tw\\:text-6xl {\n font-size: var(--tw-text-6xl);\n line-height: var(--tw-leading, var(--tw-text-6xl--line-height));\n }\n .tw\\:text-base {\n font-size: var(--tw-text-base);\n line-height: var(--tw-leading, var(--tw-text-base--line-height));\n }\n .tw\\:text-lg {\n font-size: var(--tw-text-lg);\n line-height: var(--tw-leading, var(--tw-text-lg--line-height));\n }\n .tw\\:text-sm {\n font-size: var(--tw-text-sm);\n line-height: var(--tw-leading, var(--tw-text-sm--line-height));\n }\n .tw\\:text-xl {\n font-size: var(--tw-text-xl);\n line-height: var(--tw-leading, var(--tw-text-xl--line-height));\n }\n .tw\\:text-xs {\n font-size: var(--tw-text-xs);\n line-height: var(--tw-leading, var(--tw-text-xs--line-height));\n }\n .tw\\:leading-3 {\n --tw-leading: calc(var(--tw-spacing) * 3);\n line-height: calc(var(--tw-spacing) * 3);\n }\n .tw\\:leading-5 {\n --tw-leading: calc(var(--tw-spacing) * 5);\n line-height: calc(var(--tw-spacing) * 5);\n }\n .tw\\:font-bold {\n --tw-font-weight: var(--tw-font-weight-bold);\n font-weight: var(--tw-font-weight-bold);\n }\n .tw\\:font-medium {\n --tw-font-weight: var(--tw-font-weight-medium);\n font-weight: var(--tw-font-weight-medium);\n }\n .tw\\:font-normal {\n --tw-font-weight: var(--tw-font-weight-normal);\n font-weight: var(--tw-font-weight-normal);\n }\n .tw\\:font-semibold {\n --tw-font-weight: var(--tw-font-weight-semibold);\n font-weight: var(--tw-font-weight-semibold);\n }\n .tw\\:text-ellipsis {\n text-overflow: ellipsis;\n }\n .tw\\:whitespace-nowrap {\n white-space: nowrap;\n }\n .tw\\:text-current {\n color: currentColor;\n }\n .tw\\:text-gray-400 {\n color: var(--tw-color-gray-400);\n }\n .tw\\:text-gray-500 {\n color: var(--tw-color-gray-500);\n }\n .tw\\:text-gray-600 {\n color: var(--tw-color-gray-600);\n }\n .tw\\:text-green-500 {\n color: var(--tw-color-green-500);\n }\n .tw\\:text-red-500 {\n color: var(--tw-color-red-500);\n }\n .tw\\:text-white {\n color: var(--tw-color-white);\n }\n .tw\\:text-zinc-500 {\n color: var(--tw-color-zinc-500);\n }\n .tw\\:normal-case {\n text-transform: none;\n }\n .tw\\:italic {\n font-style: italic;\n }\n .tw\\:opacity-0 {\n opacity: 0%;\n }\n .tw\\:opacity-50 {\n opacity: 50%;\n }\n .tw\\:opacity-60 {\n opacity: 60%;\n }\n .tw\\:opacity-100 {\n opacity: 100%;\n }\n .tw\\:shadow {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .tw\\:shadow-2xl {\n --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .tw\\:shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .tw\\:shadow-md {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .tw\\:shadow-xl {\n --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .tw\\:drop-shadow-md {\n --tw-drop-shadow: drop-shadow(var(--tw-drop-shadow-md));\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\\:transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter;\n transition-timing-function: var(--tw-ease, var(--tw-default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--tw-default-transition-duration));\n }\n .tw\\:transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--tw-default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--tw-default-transition-duration));\n }\n .tw\\:transition-opacity {\n transition-property: opacity;\n transition-timing-function: var(--tw-ease, var(--tw-default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--tw-default-transition-duration));\n }\n .tw\\:transition-none {\n transition-property: none;\n }\n .tw\\:delay-400 {\n transition-delay: 400ms;\n }\n .tw\\:duration-200 {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n .tw\\:duration-300 {\n --tw-duration: 300ms;\n transition-duration: 300ms;\n }\n .tw\\:duration-500 {\n --tw-duration: 500ms;\n transition-duration: 500ms;\n }\n .tw\\:ease-in {\n --tw-ease: var(--tw-ease-in);\n transition-timing-function: var(--tw-ease-in);\n }\n .tw\\:hover\\:cursor-pointer {\n &:hover {\n @media (hover: hover) {\n cursor: pointer;\n }\n }\n }\n .tw\\:hover\\:bg-red-600 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--tw-color-red-600);\n }\n }\n }\n .tw\\:hover\\:bg-slate-300 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--tw-color-slate-300);\n }\n }\n }\n .tw\\:hover\\:bg-transparent {\n &:hover {\n @media (hover: hover) {\n background-color: transparent;\n }\n }\n }\n .tw\\:hover\\:font-bold {\n &:hover {\n @media (hover: hover) {\n --tw-font-weight: var(--tw-font-weight-bold);\n font-weight: var(--tw-font-weight-bold);\n }\n }\n }\n .tw\\:hover\\:underline {\n &:hover {\n @media (hover: hover) {\n text-decoration-line: underline;\n }\n }\n }\n .tw\\:focus\\:ring-0 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentColor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .tw\\:focus\\:outline-hidden {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .tw\\:focus\\:outline-none {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n .tw\\:sm\\:left-auto\\! {\n @media (width >= 40rem) {\n left: auto !important;\n }\n }\n .tw\\:sm\\:w-2xl {\n @media (width >= 40rem) {\n width: var(--tw-container-2xl);\n }\n }\n .tw\\:sm\\:grid-cols-2 {\n @media (width >= 40rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .tw\\:md\\:mb-0 {\n @media (width >= 48rem) {\n margin-bottom: calc(var(--tw-spacing) * 0);\n }\n }\n .tw\\:md\\:flex {\n @media (width >= 48rem) {\n display: flex;\n }\n }\n .tw\\:md\\:hidden {\n @media (width >= 48rem) {\n display: none;\n }\n }\n .tw\\:md\\:max-h-full {\n @media (width >= 48rem) {\n max-height: 100%;\n }\n }\n .tw\\:md\\:w-1\\/2 {\n @media (width >= 48rem) {\n width: calc(1/2 * 100%);\n }\n }\n .tw\\:md\\:w-\\[calc\\(50\\%-32px\\)\\] {\n @media (width >= 48rem) {\n width: calc(50% - 32px);\n }\n }\n .tw\\:md\\:columns-2 {\n @media (width >= 48rem) {\n columns: 2;\n }\n }\n .tw\\:md\\:grid-cols-1 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n }\n .tw\\:md\\:grid-cols-2 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .tw\\:md\\:space-x-4 {\n @media (width >= 48rem) {\n :where(& > :not(:last-child)) {\n --tw-space-x-reverse: 0;\n margin-inline-start: calc(calc(var(--tw-spacing) * 4) * var(--tw-space-x-reverse));\n margin-inline-end: calc(calc(var(--tw-spacing) * 4) * calc(1 - var(--tw-space-x-reverse)));\n }\n }\n }\n .tw\\:md\\:text-2xl {\n @media (width >= 48rem) {\n font-size: var(--tw-text-2xl);\n line-height: var(--tw-leading, var(--tw-text-2xl--line-height));\n }\n }\n .tw\\:lg\\:columns-3 {\n @media (width >= 64rem) {\n columns: 3;\n }\n }\n .tw\\:lg\\:grid-cols-1 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n }\n .tw\\:xl\\:max-w-6xl {\n @media (width >= 80rem) {\n max-width: var(--tw-container-6xl);\n }\n }\n .tw\\:xl\\:grid-cols-1 {\n @media (width >= 80rem) {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n }\n .tw\\:xl\\:text-3xl {\n @media (width >= 80rem) {\n font-size: var(--tw-text-3xl);\n line-height: var(--tw-leading, var(--tw-text-3xl--line-height));\n }\n }\n .tw\\:2xl\\:columns-4 {\n @media (width >= 96rem) {\n columns: 4;\n }\n }\n .tw\\:2xl\\:grid-cols-2 {\n @media (width >= 96rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .tw\\:\\@sm\\:block {\n @container (width >= 24rem) {\n display: block;\n }\n }\n .tw\\:\\@sm\\:grid-cols-2 {\n @container (width >= 24rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .tw\\:\\@sm\\:overflow-visible {\n @container (width >= 24rem) {\n overflow: visible;\n }\n }\n .tw\\:\\@md\\:grid-cols-3 {\n @container (width >= 28rem) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n }\n .tw\\:\\@lg\\:grid-cols-4 {\n @container (width >= 32rem) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n }\n .tw\\:dark\\:bg-zinc-800 {\n @media (prefers-color-scheme: dark) {\n background-color: var(--tw-color-zinc-800);\n }\n }\n}\n@layer markdown {\n .markdown {\n h1 {\n margin-block: calc(var(--tw-spacing) * 4);\n font-size: var(--tw-text-2xl);\n line-height: var(--tw-leading, var(--tw-text-2xl--line-height));\n --tw-font-weight: var(--tw-font-weight-bold);\n font-weight: var(--tw-font-weight-bold);\n }\n h2 {\n margin-block: calc(var(--tw-spacing) * 3);\n font-size: var(--tw-text-xl);\n line-height: var(--tw-leading, var(--tw-text-xl--line-height));\n --tw-font-weight: var(--tw-font-weight-bold);\n font-weight: var(--tw-font-weight-bold);\n }\n h3, h4 {\n margin-block: calc(var(--tw-spacing) * 2);\n font-size: var(--tw-text-lg);\n line-height: var(--tw-leading, var(--tw-text-lg--line-height));\n --tw-font-weight: var(--tw-font-weight-bold);\n font-weight: var(--tw-font-weight-bold);\n }\n h5, h6 {\n margin-block: calc(var(--tw-spacing) * 2);\n font-size: var(--tw-text-base);\n line-height: var(--tw-leading, var(--tw-text-base--line-height));\n --tw-font-weight: var(--tw-font-weight-bold);\n font-weight: var(--tw-font-weight-bold);\n }\n p {\n margin-block: calc(var(--tw-spacing) * 1);\n --tw-leading: var(--tw-leading-relaxed);\n line-height: var(--tw-leading-relaxed);\n }\n ul, ol {\n margin-block: calc(var(--tw-spacing) * 2);\n padding-left: calc(var(--tw-spacing) * 6);\n }\n ul li {\n list-style-position: outside;\n list-style-type: disc;\n }\n ol li {\n list-style-position: outside;\n list-style-type: decimal;\n }\n li > p {\n margin-block: calc(var(--tw-spacing) * 0);\n display: inline-block;\n }\n hr {\n margin-block: calc(var(--tw-spacing) * 4);\n border-color: currentColor;\n }\n img {\n max-width: 100%;\n border-radius: 0.25rem;\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n a {\n --tw-font-weight: var(--tw-font-weight-bold);\n font-weight: var(--tw-font-weight-bold);\n text-decoration-line: underline;\n }\n iframe {\n aspect-ratio: var(--tw-aspect-video);\n width: 100%;\n }\n .hashtag {\n cursor: pointer;\n --tw-font-weight: var(--tw-font-weight-bold);\n font-weight: var(--tw-font-weight-bold);\n color: #faa;\n text-decoration: none;\n }\n }\n}\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: rotateX(0);\n}\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: rotateY(0);\n}\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: rotateZ(0);\n}\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false;\n initial-value: skewX(0);\n}\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false;\n initial-value: skewY(0);\n}\n@property --tw-space-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-space-x-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-leading {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-blur {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-brightness {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-contrast {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-grayscale {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-hue-rotate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-invert {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-opacity {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-saturate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-sepia {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-drop-shadow {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-blur {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-brightness {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-contrast {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-grayscale {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-hue-rotate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-invert {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-opacity {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-saturate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-sepia {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ease {\n syntax: \"*\";\n inherits: false;\n}\n";
|
101
|
+
styleInject(css_248z$2);
|
102
|
+
|
103
|
+
var css_248z$1 = "\n\n.editor-wrapper div {\n min-height: 0;\n flex: 1;\n outline: none;\n}\n\n.tiptap p.is-editor-empty:first-child::before {\n color: var(--color-base-content);\n opacity: 0.5;\n content: attr(data-placeholder);\n float: left;\n height: 0;\n pointer-events: none;\n}\n\n/* Bubble menu */\n.bubble-menu {\n background-color: var(--color-base-100);\n border: 1px solid var(--color-base-200);\n border-radius: 0.7rem;\n box-shadow: var(--shadow);\n display: flex;\n padding: 0.2rem;\n \n button {\n background-color: unset;\n \n &:hover {\n background-color: var(--color-base-300);\n }\n \n &.is-active {\n background-color: var(--color-base-200);\n \n &:hover {\n background-color: var(--color-base-300);\n }\n }\n }\n }\n ";
|
104
|
+
styleInject(css_248z$1);
|
105
|
+
|
106
|
+
var css_248z = ".yarl__portal_open {\n z-index: 10050;\n}";
|
107
|
+
styleInject(css_248z);
|
108
|
+
|
109
|
+
const QuestContext = React.createContext({
|
110
|
+
open: false,
|
111
|
+
setQuestsOpen: () => { },
|
112
|
+
});
|
113
|
+
function useQuestsManager(initialOpen) {
|
114
|
+
const [open, setOpen] = React.useState(initialOpen);
|
115
|
+
const setQuestsOpen = React.useCallback((questOpen) => {
|
116
|
+
setOpen(questOpen);
|
117
|
+
}, []);
|
118
|
+
return { open, setQuestsOpen };
|
119
|
+
}
|
120
|
+
const QuestsProvider = ({ initialOpen, children, }) => (jsxRuntime.jsx(QuestContext.Provider, { value: useQuestsManager(initialOpen), children: children }));
|
121
|
+
const useQuestsOpen = () => {
|
122
|
+
const { open } = React.useContext(QuestContext);
|
123
|
+
return open;
|
124
|
+
};
|
125
|
+
const useSetQuestOpen = () => {
|
126
|
+
const { setQuestsOpen } = React.useContext(QuestContext);
|
127
|
+
return setQuestsOpen;
|
128
|
+
};
|
129
|
+
|
130
|
+
const PoupFormContext = React.createContext({
|
131
|
+
popupForm: {},
|
132
|
+
setPopupForm: () => {
|
133
|
+
/* empty function */
|
134
|
+
},
|
135
|
+
});
|
136
|
+
function usePopupFormManager() {
|
137
|
+
const [popupForm, setPopupForm] = React.useState(null);
|
138
|
+
return { popupForm, setPopupForm };
|
139
|
+
}
|
140
|
+
const PopupFormProvider = ({ children }) => (jsxRuntime.jsx(PoupFormContext.Provider, { value: usePopupFormManager(), children: children }));
|
141
|
+
const usePopupForm = () => {
|
142
|
+
const { popupForm, setPopupForm } = React.useContext(PoupFormContext);
|
143
|
+
return { popupForm, setPopupForm };
|
144
|
+
};
|
145
|
+
|
146
|
+
// Helper context to determine if the ContextWrapper is already present.
|
147
|
+
const ContextCheckContext = React.createContext(false);
|
148
|
+
const CloseButton = ({ closeToast }) => (jsxRuntime.jsx("button", { className: 'tw:btn tw:btn-sm tw:btn-circle tw:btn-ghost tw:absolute tw:right-2 tw:top-2 tw:focus:outline-hidden', onClick: closeToast, children: "\u2715" }));
|
149
|
+
const ContextWrapper = ({ children }) => {
|
150
|
+
const isWrapped = React.useContext(ContextCheckContext);
|
151
|
+
const isInsideRouter = reactRouterDom.useInRouterContext();
|
152
|
+
let returnValue = children;
|
153
|
+
if (!isWrapped) {
|
154
|
+
returnValue = (jsxRuntime.jsx(ContextCheckContext.Provider, { value: true, children: jsxRuntime.jsx(Wrappers, { children: returnValue }) }));
|
155
|
+
}
|
156
|
+
if (!isInsideRouter) {
|
157
|
+
returnValue = jsxRuntime.jsx(reactRouterDom.BrowserRouter, { children: returnValue });
|
158
|
+
}
|
159
|
+
return returnValue;
|
160
|
+
};
|
161
|
+
// eslint-disable-next-line react/prop-types
|
162
|
+
const Wrappers = ({ children }) => {
|
163
|
+
const queryClient = new reactQuery.QueryClient();
|
164
|
+
return (jsxRuntime.jsx(TagView.PermissionsProvider, { initialPermissions: [], children: jsxRuntime.jsx(TagView.TagsProvider, { initialTags: [], children: jsxRuntime.jsx(TagView.LayersProvider, { initialLayers: [], children: jsxRuntime.jsx(TagView.FilterProvider, { initialTags: [], children: jsxRuntime.jsx(TagView.ItemsProvider, { initialItems: [], children: jsxRuntime.jsx(TagView.SelectPositionProvider, { children: jsxRuntime.jsx(TagView.LeafletRefsProvider, { initialLeafletRefs: {}, children: jsxRuntime.jsx(reactQuery.QueryClientProvider, { client: queryClient, children: jsxRuntime.jsx(TagView.AppStateProvider, { children: jsxRuntime.jsx(TagView.ClusterRefProvider, { children: jsxRuntime.jsx(PopupFormProvider, { children: jsxRuntime.jsxs(QuestsProvider, { initialOpen: true, children: [jsxRuntime.jsx(reactToastify.ToastContainer, { position: 'top-right', autoClose: 2000, hideProgressBar: true, newestOnTop: false, closeOnClick: true, rtl: false, pauseOnFocusLoss: true, draggable: true, pauseOnHover: true, theme: 'light', closeButton: CloseButton }), children] }) }) }) }) }) }) }) }) }) }) }) }));
|
165
|
+
};
|
166
|
+
|
167
|
+
const useTheme = (defaultTheme = 'default') => {
|
168
|
+
React.useEffect(() => {
|
169
|
+
const savedTheme = localStorage.getItem('theme');
|
170
|
+
const initialTheme = savedTheme ? JSON.parse(savedTheme) : defaultTheme;
|
171
|
+
if (initialTheme !== 'default') {
|
172
|
+
document.documentElement.setAttribute('data-theme', defaultTheme);
|
173
|
+
localStorage.setItem('theme', JSON.stringify(initialTheme));
|
174
|
+
}
|
175
|
+
}, [defaultTheme]);
|
176
|
+
};
|
177
|
+
|
178
|
+
function containsUUID(str) {
|
179
|
+
const uuidRegex = /[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i;
|
180
|
+
return uuidRegex.test(str);
|
181
|
+
}
|
182
|
+
|
183
|
+
var PlusSVG = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgY2xhc3M9InctNSBoLTUiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEyIDQuNXYxNW03LjUtNy41aC0xNSI+PC9wYXRoPjwvc3ZnPg==';
|
184
|
+
|
185
|
+
function AddButton({ triggerAction, }) {
|
186
|
+
const layers = TagView.useLayers();
|
187
|
+
const hasUserPermission = TagView.useHasUserPermission();
|
188
|
+
const canAddItems = () => {
|
189
|
+
let canAdd = false;
|
190
|
+
layers.map((layer) => {
|
191
|
+
if (layer.api?.createItem &&
|
192
|
+
hasUserPermission(layer.api.collectionName, 'create', undefined, layer) &&
|
193
|
+
layer.listed)
|
194
|
+
canAdd = true;
|
195
|
+
return null;
|
196
|
+
});
|
197
|
+
return canAdd;
|
198
|
+
};
|
199
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: canAddItems() ? (jsxRuntime.jsxs("div", { className: 'tw:dropdown tw:dropdown-top tw:dropdown-end tw:dropdown-hover tw:z-500 tw:absolute tw:right-4 tw:bottom-4', children: [jsxRuntime.jsx("label", { tabIndex: 0, className: 'tw:z-500 tw:btn tw:btn-circle tw:btn-lg tw:shadow tw:bg-base-100', children: jsxRuntime.jsx(SVG, { src: PlusSVG, className: 'tw:h-5 tw:w-5' }) }), jsxRuntime.jsx("ul", { tabIndex: 0, className: 'tw:dropdown-content tw:pr-1 tw:list-none', children: layers.map((layer) => layer.api?.createItem &&
|
200
|
+
hasUserPermission(layer.api.collectionName, 'create', undefined, layer) &&
|
201
|
+
layer.listed && (jsxRuntime.jsx("li", { children: jsxRuntime.jsx("a", { children: jsxRuntime.jsx("div", { className: 'tw:tooltip tw:tooltip-left', "data-tip": layer.menuText, children: jsxRuntime.jsx("button", { tabIndex: 0, className: 'tw:z-500 tw:border-0 tw:pl-2 tw:p-0 tw:mb-3 tw:w-10 tw:h-10 tw:cursor-pointer tw:rounded-full tw:mouse tw:drop-shadow-md tw:transition tw:ease-in tw:duration-200 tw:focus:outline-hidden', style: { backgroundColor: layer.menuColor || '#777' }, onClick: () => {
|
202
|
+
triggerAction(layer);
|
203
|
+
}, onTouchEnd: (e) => {
|
204
|
+
triggerAction(layer);
|
205
|
+
e.preventDefault();
|
206
|
+
}, children: jsxRuntime.jsx("img", { src: layer.menuIcon, className: 'tw:h-6 tw:w-6 tw:text-white', style: { filter: 'invert(100%) brightness(200%)' } }) }) }) }) }, layer.name))) })] })) : ('') }));
|
207
|
+
}
|
208
|
+
|
209
|
+
const Control = ({ position, children, zIndex, absolute, }) => {
|
210
|
+
const controlContainerRef = React.createRef();
|
211
|
+
React.useEffect(() => {
|
212
|
+
if (controlContainerRef.current !== null) {
|
213
|
+
leaflet.DomEvent.disableClickPropagation(controlContainerRef.current);
|
214
|
+
leaflet.DomEvent.disableScrollPropagation(controlContainerRef.current);
|
215
|
+
}
|
216
|
+
}, [controlContainerRef]);
|
217
|
+
return (jsxRuntime.jsx("div", { ref: controlContainerRef, style: { zIndex }, className: `${absolute && 'tw:absolute'} tw:z-999 tw:flex-col ${position === 'topLeft' && 'tw:top-4 tw:left-4'} ${position === 'bottomLeft' && 'tw:bottom-4 tw:left-4'} ${position === 'topRight' && 'tw:bottom-4 tw:right-4'} ${position === 'bottomRight' && 'tw:bottom-4 tw:right-4'}`, children: children }));
|
218
|
+
};
|
219
|
+
|
220
|
+
function FunnelIcon({
|
221
|
+
title,
|
222
|
+
titleId,
|
223
|
+
...props
|
224
|
+
}, svgRef) {
|
225
|
+
return /*#__PURE__*/React__namespace.createElement("svg", Object.assign({
|
226
|
+
xmlns: "http://www.w3.org/2000/svg",
|
227
|
+
fill: "none",
|
228
|
+
viewBox: "0 0 24 24",
|
229
|
+
strokeWidth: 1.5,
|
230
|
+
stroke: "currentColor",
|
231
|
+
"aria-hidden": "true",
|
232
|
+
"data-slot": "icon",
|
233
|
+
ref: svgRef,
|
234
|
+
"aria-labelledby": titleId
|
235
|
+
}, props), title ? /*#__PURE__*/React__namespace.createElement("title", {
|
236
|
+
id: titleId
|
237
|
+
}, title) : null, /*#__PURE__*/React__namespace.createElement("path", {
|
238
|
+
strokeLinecap: "round",
|
239
|
+
strokeLinejoin: "round",
|
240
|
+
d: "M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 0 1-.659 1.591l-5.432 5.432a2.25 2.25 0 0 0-.659 1.591v2.927a2.25 2.25 0 0 1-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 0 0-.659-1.591L3.659 7.409A2.25 2.25 0 0 1 3 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0 1 12 3Z"
|
241
|
+
}));
|
242
|
+
}
|
243
|
+
const ForwardRef$4 = /*#__PURE__*/ React__namespace.forwardRef(FunnelIcon);
|
244
|
+
|
245
|
+
function FilterControl() {
|
246
|
+
const [open, setOpen] = React.useState(false);
|
247
|
+
const groupTypes = [
|
248
|
+
{ text: 'Regional Gruppe', value: 'Regional-Gruppe' },
|
249
|
+
{ text: 'Themen Gruppe', value: 'Themen-Gruppe' },
|
250
|
+
{ text: 'liebevoll.jetzt', value: 'liebevoll.jetzt' },
|
251
|
+
];
|
252
|
+
React.useEffect(() => {
|
253
|
+
groupTypes.map((layer) => addVisibleGroupType(layer.value));
|
254
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
255
|
+
}, []);
|
256
|
+
const isGroupTypeVisible = TagView.useIsGroupTypeVisible();
|
257
|
+
const toggleVisibleGroupType = TagView.useToggleVisibleGroupType();
|
258
|
+
const addVisibleGroupType = TagView.useAddVisibleGroupType();
|
259
|
+
const visibleGroupTypes = TagView.useVisibleGroupType();
|
260
|
+
return (jsxRuntime.jsx("div", { className: 'tw:card tw:bg-base-100 tw:shadow-xl tw:mt-2 tw:w-fit', children: open ? (jsxRuntime.jsxs("div", { className: 'tw:card-body tw:pr-4 tw:min-w-[8rem] tw:p-2 tw:w-fit tw:transition-all tw:duration-300', children: [jsxRuntime.jsx("label", { className: 'tw:btn tw:btn-sm tw:rounded-2xl tw:btn-circle tw:btn-ghost tw:hover:bg-transparent tw:absolute tw:right-0 tw:top-0 tw:text-gray-600', onClick: () => {
|
261
|
+
setOpen(false);
|
262
|
+
}, children: jsxRuntime.jsx("p", { className: 'tw:text-center ', children: "\u2715" }) }), jsxRuntime.jsx("ul", { className: 'tw:flex-row', children: groupTypes.map((groupType) => (jsxRuntime.jsx("li", { children: jsxRuntime.jsxs("label", { htmlFor: groupType.value, className: 'tw:label tw:justify-normal tw:pt-1 tw:pb-1', children: [jsxRuntime.jsx("input", { id: groupType.value, onChange: () => toggleVisibleGroupType(groupType.value), type: 'checkbox', className: 'tw:checkbox tw:checkbox-xs tw:checkbox-success', checked: isGroupTypeVisible(groupType.value) }), jsxRuntime.jsx("span", { className: 'tw:text-sm tw:label-text tw:mx-2 tw:cursor-pointer', children: groupType.text })] }) }, groupType.value))) })] })) : (jsxRuntime.jsxs("div", { className: 'tw:indicator', children: [visibleGroupTypes.length < groupTypes.length && (jsxRuntime.jsx("span", { className: 'tw:indicator-item tw:badge tw:badge-success tw:h-4 tw:p-2 tw:translate-x-1/3 tw:-translate-y-1/3 tw:border-0' })), jsxRuntime.jsx("div", { className: 'tw:card-body tw:hover:bg-slate-300 tw:card tw:p-2 tw:h-10 tw:w-10 tw:transition-all tw:duration-300 tw:hover:cursor-pointer', onClick: () => {
|
263
|
+
setOpen(true);
|
264
|
+
}, children: jsxRuntime.jsx(ForwardRef$4, { className: 'size-6 tw:stroke-[2.5]' }) })] })) }));
|
265
|
+
}
|
266
|
+
|
267
|
+
function HeartIcon({
|
268
|
+
title,
|
269
|
+
titleId,
|
270
|
+
...props
|
271
|
+
}, svgRef) {
|
272
|
+
return /*#__PURE__*/React__namespace.createElement("svg", Object.assign({
|
273
|
+
xmlns: "http://www.w3.org/2000/svg",
|
274
|
+
fill: "none",
|
275
|
+
viewBox: "0 0 24 24",
|
276
|
+
strokeWidth: 1.5,
|
277
|
+
stroke: "currentColor",
|
278
|
+
"aria-hidden": "true",
|
279
|
+
"data-slot": "icon",
|
280
|
+
ref: svgRef,
|
281
|
+
"aria-labelledby": titleId
|
282
|
+
}, props), title ? /*#__PURE__*/React__namespace.createElement("title", {
|
283
|
+
id: titleId
|
284
|
+
}, title) : null, /*#__PURE__*/React__namespace.createElement("path", {
|
285
|
+
strokeLinecap: "round",
|
286
|
+
strokeLinejoin: "round",
|
287
|
+
d: "M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12Z"
|
288
|
+
}));
|
289
|
+
}
|
290
|
+
const ForwardRef$3 = /*#__PURE__*/ React__namespace.forwardRef(HeartIcon);
|
291
|
+
|
292
|
+
const GratitudeControl = () => {
|
293
|
+
const navigate = reactRouterDom.useNavigate();
|
294
|
+
const { isAuthenticated } = TagView.useAuth();
|
295
|
+
if (isAuthenticated) {
|
296
|
+
return (jsxRuntime.jsx("div", { className: 'tw:card tw:bg-base-100 tw:shadow-xl tw:mt-2 tw:w-fit', children: jsxRuntime.jsx("div", { className: 'tw:card-body tw:hover:bg-slate-300 tw:card tw:p-2 tw:h-10 tw:w-10 tw:transition-all tw:duration-300 tw:hover:cursor-pointer', onClick: () => {
|
297
|
+
navigate('/select-user');
|
298
|
+
}, children: jsxRuntime.jsx(ForwardRef$3, { className: 'tw:stroke-[2.5]' }) }) }));
|
299
|
+
}
|
300
|
+
else
|
301
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
302
|
+
};
|
303
|
+
|
304
|
+
var LayerSVG = 'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPScxLjEnIHZpZXdCb3g9JzAgMCAyMCAyMCcgc3Ryb2tlLXdpZHRoPSIyIiB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPgogICAgPHBhdGgKICAgICAgICBpZD0nc3ZnXzEnCiAgICAgICAgZmlsbD0nY3VycmVudENvbG9yJwogICAgICAgIGQ9J20yLjc1NTY1LDExLjkwNzI3bC0xLjAzODUyLDAuMjgzNzJjLTAuNzc3MTgsMC4zODg1OSAtMC43NzcxOCwxLjAxMzggMCwxLjQwMjNsNy4wMTU2LDMuNTA3OGMwLjc3NzE4LDAuMzg4NTkgMi4wMjc1LDAuMzg4NTkgMi44MDQ3LDBsNy4wMTU2LC0zLjUwNzhjMC43NzcxOCwtMC4zODg1OSAwLjc3NzE4LC0xLjAxMzggMCwtMS40MDIzbC0wLjYzMzExLC0wLjQ4NjQzbC00LjY3NzE4LDIuMjM2MjRjLTEuNTQ1MiwwLjc3MjYyIC0zLjMxODc3LDEuNTgzNDMgLTQuODY0MDcsMC44MTA4MWwtNS42MjMwMiwtMi44NDQzNHonCiAgICAvPgogICAgPHBhdGgKICAgICAgICBpZD0nc3ZnXzInCiAgICAgICAgc3Ryb2tlPSdjdXJyZW50Q29sb3InCiAgICAgICAgZmlsbD0nbm9uZScKICAgICAgICBkPSdtMTEuMjQ3LDQuMzA4NTFsNi4yMzQ5LDMuMDg3N2MwLjY5MDgzLDAuMzQyMTEgMC42OTA4MywwLjg5Mjk1IDAsMS4yMzUxbC02LjIzNDksMy4wODc3Yy0wLjY5MDgzLDAuMzQyMTEgLTEuODAzMSwwLjM0MjEyIC0yLjQ5NCwwbC02LjIzNDksLTMuMDg3N2MtMC42OTA4MywtMC4zNDIxMSAtMC42OTA4MywtMC44OTI5NSAwLC0xLjIzNTFsNi4yMzQ5LC0zLjA4NzdjMC42OTA4MywtMC4zNDIxMSAxLjgwMzEsLTAuMzQyMTEgMi40OTQsMHonCiAgICAvPgo8L3N2Zz4=';
|
305
|
+
|
306
|
+
function LayerControl({ expandLayerControl = false }) {
|
307
|
+
const [open, setOpen] = React.useState(expandLayerControl);
|
308
|
+
const layers = TagView.useLayers();
|
309
|
+
const isLayerVisible = TagView.useIsLayerVisible();
|
310
|
+
const toggleVisibleLayer = TagView.useToggleVisibleLayer();
|
311
|
+
return (jsxRuntime.jsx("div", { className: 'tw:card tw:bg-base-100 tw:shadow-xl tw:mt-2 tw:w-fit', children: open ? (jsxRuntime.jsxs("div", { className: 'tw:card-body tw:pr-4 tw:min-w-[8rem] tw:p-2 tw:transition-all tw:w-fit tw:duration-300', children: [jsxRuntime.jsx("label", { className: 'tw:btn tw:btn-sm tw:rounded-2xl tw:btn-circle tw:btn-ghost tw:hover:bg-transparent tw:absolute tw:right-0 tw:top-0 tw:text-gray-600', onClick: () => {
|
312
|
+
setOpen(false);
|
313
|
+
}, children: jsxRuntime.jsx("p", { className: 'tw:text-center ', children: "\u2715" }) }), jsxRuntime.jsx("ul", { className: 'tw:flex-row', children: layers.map((layer) => layer.listed && (jsxRuntime.jsx("li", { children: jsxRuntime.jsxs("label", { htmlFor: layer.name, className: 'tw:label tw:justify-normal tw:pt-1 tw:pb-1 tw:text-base-content', children: [jsxRuntime.jsx("input", { id: layer.name, onChange: () => toggleVisibleLayer(layer), type: 'checkbox', className: 'tw:checkbox tw:checkbox-xs tw:checkbox-success', checked: isLayerVisible(layer) }), jsxRuntime.jsx("span", { className: 'tw:text-sm tw:label-text tw:mx-2 tw:cursor-pointer', children: layer.name })] }) }, layer.name))) })] })) : (jsxRuntime.jsx("div", { className: 'tw:card-body tw:hover:bg-slate-300 tw:card tw:p-2 tw:h-10 tw:w-10 tw:transition-all tw:duration-300 tw:hover:cursor-pointer', onClick: () => {
|
314
|
+
setOpen(true);
|
315
|
+
}, children: jsxRuntime.jsx(SVG, { src: LayerSVG }) })) }));
|
316
|
+
}
|
317
|
+
|
318
|
+
function FlagIcon({
|
319
|
+
title,
|
320
|
+
titleId,
|
321
|
+
...props
|
322
|
+
}, svgRef) {
|
323
|
+
return /*#__PURE__*/React__namespace.createElement("svg", Object.assign({
|
324
|
+
xmlns: "http://www.w3.org/2000/svg",
|
325
|
+
fill: "none",
|
326
|
+
viewBox: "0 0 24 24",
|
327
|
+
strokeWidth: 1.5,
|
328
|
+
stroke: "currentColor",
|
329
|
+
"aria-hidden": "true",
|
330
|
+
"data-slot": "icon",
|
331
|
+
ref: svgRef,
|
332
|
+
"aria-labelledby": titleId
|
333
|
+
}, props), title ? /*#__PURE__*/React__namespace.createElement("title", {
|
334
|
+
id: titleId
|
335
|
+
}, title) : null, /*#__PURE__*/React__namespace.createElement("path", {
|
336
|
+
strokeLinecap: "round",
|
337
|
+
strokeLinejoin: "round",
|
338
|
+
d: "M3 3v1.5M3 21v-6m0 0 2.77-.693a9 9 0 0 1 6.208.682l.108.054a9 9 0 0 0 6.086.71l3.114-.732a48.524 48.524 0 0 1-.005-10.499l-3.11.732a9 9 0 0 1-6.085-.711l-.108-.054a9 9 0 0 0-6.208-.682L3 4.5M3 15V4.5"
|
339
|
+
}));
|
340
|
+
}
|
341
|
+
const ForwardRef$2 = /*#__PURE__*/ React__namespace.forwardRef(FlagIcon);
|
342
|
+
|
343
|
+
function MagnifyingGlassIcon({
|
344
|
+
title,
|
345
|
+
titleId,
|
346
|
+
...props
|
347
|
+
}, svgRef) {
|
348
|
+
return /*#__PURE__*/React__namespace.createElement("svg", Object.assign({
|
349
|
+
xmlns: "http://www.w3.org/2000/svg",
|
350
|
+
fill: "none",
|
351
|
+
viewBox: "0 0 24 24",
|
352
|
+
strokeWidth: 1.5,
|
353
|
+
stroke: "currentColor",
|
354
|
+
"aria-hidden": "true",
|
355
|
+
"data-slot": "icon",
|
356
|
+
ref: svgRef,
|
357
|
+
"aria-labelledby": titleId
|
358
|
+
}, props), title ? /*#__PURE__*/React__namespace.createElement("title", {
|
359
|
+
id: titleId
|
360
|
+
}, title) : null, /*#__PURE__*/React__namespace.createElement("path", {
|
361
|
+
strokeLinecap: "round",
|
362
|
+
strokeLinejoin: "round",
|
363
|
+
d: "m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"
|
364
|
+
}));
|
365
|
+
}
|
366
|
+
const ForwardRef$1 = /*#__PURE__*/ React__namespace.forwardRef(MagnifyingGlassIcon);
|
367
|
+
|
368
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
369
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
370
|
+
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
371
|
+
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
372
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
373
|
+
const useTimeout = (callback, delay) => {
|
374
|
+
const callbackRef = React.useRef(callback);
|
375
|
+
const timeoutRef = React.useRef();
|
376
|
+
React.useEffect(() => {
|
377
|
+
callbackRef.current = callback;
|
378
|
+
}, [callback]);
|
379
|
+
const set = React.useCallback(() => {
|
380
|
+
timeoutRef.current = setTimeout(() => callbackRef.current(), delay);
|
381
|
+
}, [delay]);
|
382
|
+
const clear = React.useCallback(() => {
|
383
|
+
timeoutRef.current && clearTimeout(timeoutRef.current);
|
384
|
+
}, []);
|
385
|
+
React.useEffect(() => {
|
386
|
+
set();
|
387
|
+
return clear;
|
388
|
+
}, [delay, set, clear]);
|
389
|
+
const reset = React.useCallback(() => {
|
390
|
+
clear();
|
391
|
+
set();
|
392
|
+
}, [clear, set]);
|
393
|
+
return { reset, clear };
|
394
|
+
};
|
395
|
+
|
396
|
+
const useDebounce = (callback, delay, deps) => {
|
397
|
+
const { reset, clear } = useTimeout(callback, delay);
|
398
|
+
React.useEffect(reset, [...deps, reset]);
|
399
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
400
|
+
React.useEffect(clear, []);
|
401
|
+
};
|
402
|
+
|
403
|
+
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
404
|
+
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
405
|
+
const createSvg = (shape, markerColor, borderColor) => {
|
406
|
+
const svgMap = {
|
407
|
+
circle: '<svg width="33" height="44" viewBox="0 0 35 45" xmlns="http://www.w3.org/2000/svg"><path d="M17.5 2.746c-8.284 0-15 6.853-15 15.307 0 .963.098 1.902.265 2.816a15.413 15.413 0 002.262 5.684l.134.193 12.295 17.785 12.439-17.863.056-.08a15.422 15.422 0 002.343-6.112c.123-.791.206-1.597.206-2.423 0-8.454-6.716-15.307-15-15.307" fill="' +
|
408
|
+
markerColor +
|
409
|
+
'" /><path d="M17.488 2.748c-8.284 0-15 6.853-15 15.307 0 .963.098 1.902.265 2.816a15.413 15.413 0 002.262 5.684l.134.193 12.295 17.785 12.44-17.863.055-.08a15.422 15.422 0 002.343-6.112c.124-.791.206-1.597.206-2.423 0-8.454-6.716-15.307-15-15.307m0 1.071c7.68 0 13.929 6.386 13.929 14.236 0 .685-.064 1.423-.193 2.258-.325 2.075-1.059 3.99-2.164 5.667l-.055.078-11.557 16.595L6.032 26.14l-.12-.174a14.256 14.256 0 01-2.105-5.29 14.698 14.698 0 01-.247-2.62c0-7.851 6.249-14.237 13.928-14.237" fill="' +
|
410
|
+
borderColor +
|
411
|
+
'" opacity="1" /></svg>',
|
412
|
+
square: '<svg width="33" height="44" viewBox="0 0 35 45" xmlns="http://www.w3.org/2000/svg"><path d="M28.205 3.217H6.777c-2.367 0-4.286 1.87-4.286 4.179v19.847c0 2.308 1.919 4.179 4.286 4.179h5.357l5.337 13.58 5.377-13.58h5.357c2.366 0 4.285-1.87 4.285-4.179V7.396c0-2.308-1.919-4.179-4.285-4.179" fill="' +
|
413
|
+
markerColor +
|
414
|
+
'" /><g opacity="1" transform="matrix(1.0714 0 0 -1.0714 -233.22 146.783)"><path d="M244 134h-20c-2.209 0-4-1.746-4-3.9v-18.525c0-2.154 1.791-3.9 4-3.9h5L233.982 95 239 107.675h5c2.209 0 4 1.746 4 3.9V130.1c0 2.154-1.791 3.9-4 3.9m0-1c1.654 0 3-1.301 3-2.9v-18.525c0-1.599-1.346-2.9-3-2.9h-5.68l-.25-.632-4.084-10.318-4.055 10.316-.249.634H224c-1.654 0-3 1.301-3 2.9V130.1c0 1.599 1.346 2.9 3 2.9h20" fill="' +
|
415
|
+
borderColor +
|
416
|
+
'" /></g></svg>',
|
417
|
+
star: '<svg width="34" height="44" viewBox="0 0 35 45" xmlns="http://www.w3.org/2000/svg"><path d="M32.92 16.93l-3.525-3.525V8.419a1.983 1.983 0 00-1.983-1.982h-4.985L18.9 2.91a1.984 1.984 0 00-2.803 0l-3.524 3.526H7.588a1.983 1.983 0 00-1.982 1.982v4.986L2.081 16.93a1.982 1.982 0 000 2.803l3.525 3.526v4.984c0 1.096.888 1.983 1.982 1.983h4.986L17.457 45l4.97-14.773h4.985a1.983 1.983 0 001.983-1.983V23.26l3.525-3.526a1.982 1.982 0 000-2.803" fill="' +
|
418
|
+
markerColor +
|
419
|
+
'" /><g opacity=".15" transform="matrix(1.0667 0 0 -1.0667 -347.3 97.26)"><path d="M342 89c-.476 0-.951-.181-1.314-.544l-3.305-3.305h-4.673a1.858 1.858 0 01-1.859-1.858v-4.674l-3.305-3.305a1.857 1.857 0 010-2.627l3.305-3.305v-4.674a1.86 1.86 0 011.859-1.859h4.673L341.959 49l4.659 13.849h4.674a1.86 1.86 0 011.859 1.859v4.674l3.305 3.305a1.858 1.858 0 010 2.627l-3.305 3.305v4.674a1.859 1.859 0 01-1.859 1.858h-4.674l-3.304 3.305A1.851 1.851 0 01342 89m0-1a.853.853 0 00.607-.251l3.304-3.305.293-.293h5.088a.86.86 0 00.859-.858v-5.088l3.598-3.598A.852.852 0 00356 74a.85.85 0 00-.251-.606l-3.598-3.598v-5.088a.86.86 0 00-.859-.859h-5.393l-.229-.681-3.702-11.006-3.637 11.001-.227.686h-5.396a.86.86 0 00-.859.859v5.088l-3.598 3.598c-.162.162-.251.377-.251.606s.089.445.251.607l3.598 3.598v5.088a.86.86 0 00.859.858h5.087l3.598 3.598A.853.853 0 00342 88" fill="#231f20" /></g></svg>',
|
420
|
+
penta: '<svg width="33" height="44" viewBox="0 0 35 45" xmlns="http://www.w3.org/2000/svg"><path d="M1.872 17.35L9.679 2.993h15.615L33.1 17.35 17.486 44.992z" fill="' +
|
421
|
+
markerColor +
|
422
|
+
'" /><g opacity=".15" transform="matrix(1.0769 0 0 -1.0769 -272.731 48.23)"><path d="M276.75 42h-14.5L255 28.668 269.5 3 284 28.668zm-.595-1l6.701-12.323L269.5 5.033l-13.356 23.644L262.845 41z" fill="#231f20" /></g></svg>',
|
423
|
+
};
|
424
|
+
// eslint-disable-next-line security/detect-object-injection
|
425
|
+
return svgMap[shape];
|
426
|
+
};
|
427
|
+
const MarkerIconFactory = (shape, color1, color2, icon, assetsURL) => {
|
428
|
+
if (icon)
|
429
|
+
return leaflet.divIcon({
|
430
|
+
html: `<div class="svg-container">${createSvg(shape, color1, color2)}<img class="overlay-svg" style="width: ${icon.size ? icon.size : '12.5'}px; filter: invert(1) brightness(2);" src="${`${assetsURL ?? ''}` + icon.image}"></div>`,
|
431
|
+
iconAnchor: [17, 40],
|
432
|
+
popupAnchor: [0, -40],
|
433
|
+
iconSize: new leaflet.Point(40, 46),
|
434
|
+
className: 'leaflet-data-marker',
|
435
|
+
shadowAnchor: [0, 0],
|
436
|
+
});
|
437
|
+
else
|
438
|
+
return leaflet.divIcon({
|
439
|
+
html: `<div class="svg-container">${createSvg(shape, color1, color2)}<svg fill="#fff" class="overlay-svg" width="13"xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256z"/></svg></div>`,
|
440
|
+
iconAnchor: [17, 40],
|
441
|
+
popupAnchor: [0, -40],
|
442
|
+
iconSize: new leaflet.Point(40, 46),
|
443
|
+
className: 'leaflet-data-marker',
|
444
|
+
shadowAnchor: [0, 0],
|
445
|
+
});
|
446
|
+
};
|
447
|
+
|
448
|
+
var TargetSVG = 'data:image/svg+xml;base64,PHN2ZwogICAgZmlsbD0nY3VycmVudENvbG9yJwogICAgdmlld0JveD0nMCAwIDMyIDMyJwogICAgdmVyc2lvbj0nMS4xJwogICAgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJwo+CiAgPHBhdGggZD0nTTMwIDE0Ljc1aC0yLjgyNGMtMC42MDgtNS4yMTktNC43MDctOS4zMTgtOS44NzQtOS45MjFsLTAuMDUzLTAuMDA1di0yLjgyNGMwLTAuNjktMC41Ni0xLjI1LTEuMjUtMS4yNXMtMS4yNSAwLjU2LTEuMjUgMS4yNXYwIDIuODI0Yy01LjIxOSAwLjYwOC05LjMxOCA0LjcwNy05LjkyMSA5Ljg3NGwtMC4wMDUgMC4wNTNoLTIuODI0Yy0wLjY5IDAtMS4yNSAwLjU2LTEuMjUgMS4yNXMwLjU2IDEuMjUgMS4yNSAxLjI1djBoMi44MjRjMC42MDggNS4yMTkgNC43MDcgOS4zMTggOS44NzQgOS45MjFsMC4wNTMgMC4wMDV2Mi44MjRjMCAwLjY5IDAuNTYgMS4yNSAxLjI1IDEuMjVzMS4yNS0wLjU2IDEuMjUtMS4yNXYwLTIuODI0YzUuMjE5LTAuNjA4IDkuMzE4LTQuNzA3IDkuOTIxLTkuODc0bDAuMDA1LTAuMDUzaDIuODI0YzAuNjkgMCAxLjI1LTAuNTYgMS4yNS0xLjI1cy0wLjU2LTEuMjUtMS4yNS0xLjI1djB6TTE3LjI1IDI0LjYyNHYtMi42MjRjMC0wLjY5LTAuNTYtMS4yNS0xLjI1LTEuMjVzLTEuMjUgMC41Ni0xLjI1IDEuMjV2MCAyLjYyNGMtMy44MjEtMC41Ny02LjgwMy0zLjU1My03LjM2OC03LjMyNmwtMC4wMDYtMC4wNDhoMi42MjRjMC42OSAwIDEuMjUtMC41NiAxLjI1LTEuMjVzLTAuNTYtMS4yNS0xLjI1LTEuMjV2MGgtMi42MjRjMC41Ny0zLjgyMSAzLjU1My02LjgwNCA3LjMyNi03LjM2OGwwLjA0OC0wLjAwNnYyLjYyNGMwIDAuNjkgMC41NiAxLjI1IDEuMjUgMS4yNXMxLjI1LTAuNTYgMS4yNS0xLjI1djAtMi42MjRjMy44MjEgMC41NyA2LjgwMyAzLjU1MyA3LjM2OCA3LjMyNmwwLjAwNiAwLjA0OGgtMi42MjRjLTAuNjkgMC0xLjI1IDAuNTYtMS4yNSAxLjI1czAuNTYgMS4yNSAxLjI1IDEuMjV2MGgyLjYyNGMtMC41NzEgMy44MjEtMy41NTMgNi44MDMtNy4zMjYgNy4zNjhsLTAuMDQ4IDAuMDA2eic+PC9wYXRoPgo8L3N2Zz4=';
|
449
|
+
|
450
|
+
// Converts leaflet.locatecontrol to a React Component
|
451
|
+
const LocateControl = () => {
|
452
|
+
const map = reactLeaflet.useMap();
|
453
|
+
// prevent react18 from calling useEffect twice
|
454
|
+
const init = React.useRef(false);
|
455
|
+
const [lc, setLc] = React.useState(null);
|
456
|
+
const [active, setActive] = React.useState(false);
|
457
|
+
const [loading, setLoading] = React.useState(false);
|
458
|
+
React.useEffect(() => {
|
459
|
+
if (!init.current) {
|
460
|
+
// @ts-ignore
|
461
|
+
setLc(leaflet.control.locate().addTo(map));
|
462
|
+
init.current = true;
|
463
|
+
}
|
464
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
465
|
+
}, []);
|
466
|
+
reactLeaflet.useMapEvents({
|
467
|
+
locationfound: () => {
|
468
|
+
setLoading(false);
|
469
|
+
setActive(true);
|
470
|
+
},
|
471
|
+
});
|
472
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx("div", { className: 'tw:card tw:flex-none tw:h-12 tw:w-12 tw:bg-base-100 tw:shadow-xl tw:items-center tw:justify-center tw:hover:bg-slate-300 tw:hover:cursor-pointer tw:transition-all tw:duration-300 tw:ml-2', children: jsxRuntime.jsx("div", { className: 'tw:card-body tw:card tw:p-2 tw:h-10 tw:w-10 ', onClick: () => {
|
473
|
+
if (active) {
|
474
|
+
lc.stop();
|
475
|
+
setActive(false);
|
476
|
+
}
|
477
|
+
else {
|
478
|
+
lc.start();
|
479
|
+
setLoading(true);
|
480
|
+
}
|
481
|
+
}, children: loading ? (jsxRuntime.jsx("span", { className: 'tw:loading tw:loading-spinner tw:loading-md tw:mt-1' })) : (jsxRuntime.jsx(SVG, { src: TargetSVG, className: 'tw:mt-1 tw:p-[1px]', style: { fill: `${active ? '#fc8702' : 'currentColor'}` } })) }) }) }));
|
482
|
+
};
|
483
|
+
|
484
|
+
function Bars3Icon({
|
485
|
+
title,
|
486
|
+
titleId,
|
487
|
+
...props
|
488
|
+
}, svgRef) {
|
489
|
+
return /*#__PURE__*/React__namespace.createElement("svg", Object.assign({
|
490
|
+
xmlns: "http://www.w3.org/2000/svg",
|
491
|
+
viewBox: "0 0 16 16",
|
492
|
+
fill: "currentColor",
|
493
|
+
"aria-hidden": "true",
|
494
|
+
"data-slot": "icon",
|
495
|
+
ref: svgRef,
|
496
|
+
"aria-labelledby": titleId
|
497
|
+
}, props), title ? /*#__PURE__*/React__namespace.createElement("title", {
|
498
|
+
id: titleId
|
499
|
+
}, title) : null, /*#__PURE__*/React__namespace.createElement("path", {
|
500
|
+
fillRule: "evenodd",
|
501
|
+
d: "M2 3.75A.75.75 0 0 1 2.75 3h10.5a.75.75 0 0 1 0 1.5H2.75A.75.75 0 0 1 2 3.75ZM2 8a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H2.75A.75.75 0 0 1 2 8Zm0 4.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1-.75-.75Z",
|
502
|
+
clipRule: "evenodd"
|
503
|
+
}));
|
504
|
+
}
|
505
|
+
const ForwardRef = /*#__PURE__*/ React__namespace.forwardRef(Bars3Icon);
|
506
|
+
|
507
|
+
// Converts leaflet.locatecontrol to a React Component
|
508
|
+
const SidebarControl = () => {
|
509
|
+
const appState = TagView.useAppState();
|
510
|
+
const setAppState = TagView.useSetAppState();
|
511
|
+
const toggleSidebar = () => {
|
512
|
+
setAppState({ sideBarOpen: !appState.sideBarOpen });
|
513
|
+
};
|
514
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx("div", { className: 'tw:card tw:justify-center tw:items-center tw:bg-base-100 tw:flex-none tw:shadow-xl tw:px-0 tw:hover:bg-slate-300 tw:hover:cursor-pointer tw:transition-all tw:duration-300 tw:mr-2 tw:h-12 tw:w-12 ', onClick: () => toggleSidebar(), children: jsxRuntime.jsx(ForwardRef, { className: 'tw:inline-block tw:w-5 tw:h-5' }) }) }));
|
515
|
+
};
|
516
|
+
|
517
|
+
const SearchControl = () => {
|
518
|
+
const windowDimensions = TagView.useWindowDimensions();
|
519
|
+
const [popupOpen, setPopupOpen] = React.useState(false);
|
520
|
+
const [value, setValue] = React.useState('');
|
521
|
+
const [geoResults, setGeoResults] = React.useState([]);
|
522
|
+
const [tagsResults, setTagsResults] = React.useState([]);
|
523
|
+
const [itemsResults, setItemsResults] = React.useState([]);
|
524
|
+
const [hideSuggestions, setHideSuggestions] = React.useState(true);
|
525
|
+
const map = reactLeaflet.useMap();
|
526
|
+
const tags = TagView.useTags();
|
527
|
+
const items = TagView.useItems();
|
528
|
+
const leafletRefs = TagView.useLeafletRefs();
|
529
|
+
const addFilterTag = TagView.useAddFilterTag();
|
530
|
+
const appState = TagView.useAppState();
|
531
|
+
reactLeaflet.useMapEvents({
|
532
|
+
popupopen: () => {
|
533
|
+
setPopupOpen(true);
|
534
|
+
},
|
535
|
+
popupclose: () => {
|
536
|
+
setPopupOpen(false);
|
537
|
+
},
|
538
|
+
});
|
539
|
+
const navigate = reactRouterDom.useNavigate();
|
540
|
+
useDebounce(() => {
|
541
|
+
const searchGeo = async () => {
|
542
|
+
try {
|
543
|
+
const { data } = await axios.get(`https://photon.komoot.io/api/?q=${value}&limit=5`);
|
544
|
+
setGeoResults(data.features);
|
545
|
+
// eslint-disable-next-line no-catch-all/no-catch-all
|
546
|
+
}
|
547
|
+
catch (error) {
|
548
|
+
// eslint-disable-next-line no-console
|
549
|
+
console.log(error);
|
550
|
+
}
|
551
|
+
};
|
552
|
+
searchGeo();
|
553
|
+
setItemsResults(items.filter((item) => {
|
554
|
+
return (value.length > 2 &&
|
555
|
+
((item.layer?.listed && item.name.toLowerCase().includes(value.toLowerCase())) ||
|
556
|
+
item.text?.toLowerCase().includes(value.toLowerCase())));
|
557
|
+
}));
|
558
|
+
let phrase = value;
|
559
|
+
if (value.startsWith('#'))
|
560
|
+
phrase = value.substring(1);
|
561
|
+
setTagsResults(tags.filter((tag) => tag.name.toLowerCase().includes(phrase.toLowerCase())));
|
562
|
+
}, 500, [value]);
|
563
|
+
const hide = async () => {
|
564
|
+
setTimeout(() => {
|
565
|
+
setHideSuggestions(true);
|
566
|
+
}, 200);
|
567
|
+
};
|
568
|
+
const searchInput = React.useRef(null);
|
569
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: !(windowDimensions.height < 500 && popupOpen && hideSuggestions) && (jsxRuntime.jsxs("div", { className: 'tw:w-[calc(100vw-2rem)] tw:max-w-[22rem] ', children: [jsxRuntime.jsxs("div", { className: 'tw:flex tw:flex-row', children: [appState.embedded && jsxRuntime.jsx(SidebarControl, {}), jsxRuntime.jsxs("div", { className: 'tw:relative tw:shrink tw:max-w-69 tw:w-full', children: [jsxRuntime.jsx("input", { type: 'text', placeholder: 'search ...', autoComplete: 'off', value: value, className: 'tw:input tw:input-bordered tw:h-12 tw:grow tw:shadow-xl tw:rounded-box tw:pr-12 tw:w-full', ref: searchInput, onChange: (e) => setValue(e.target.value), onFocus: () => {
|
570
|
+
setHideSuggestions(false);
|
571
|
+
if (windowDimensions.width < 500)
|
572
|
+
map.closePopup();
|
573
|
+
}, onBlur: () => hide() }), value.length > 0 && (jsxRuntime.jsx("button", { className: 'tw:btn tw:btn-sm tw:btn-circle tw:absolute tw:right-2 tw:top-2', onClick: () => setValue(''), children: "\u2715" }))] }), jsxRuntime.jsx(LocateControl, {})] }), hideSuggestions ||
|
574
|
+
(Array.from(geoResults).length === 0 &&
|
575
|
+
itemsResults.length === 0 &&
|
576
|
+
tagsResults.length === 0 &&
|
577
|
+
!isGeoCoordinate(value)) ||
|
578
|
+
value.length === 0 ? ('') : (jsxRuntime.jsxs("div", { className: 'tw:card tw:card-body tw:bg-base-100 tw:p-4 tw:mt-2 tw:shadow-xl tw:overflow-y-auto tw:max-h-[calc(100dvh-152px)] tw:absolute tw:z-3000 tw:w-83', children: [tagsResults.length > 0 && (jsxRuntime.jsx("div", { className: 'tw:flex tw:flex-wrap', children: tagsResults.slice(0, 3).map((tag) => (jsxRuntime.jsx("div", { className: 'tw:rounded-2xl tw:text-white tw:p-1 tw:px-4 tw:shadow-md tw:card tw:mr-2 tw:mb-2 tw:cursor-pointer', style: { backgroundColor: tag.color }, onClick: () => {
|
579
|
+
addFilterTag(tag);
|
580
|
+
}, children: jsxRuntime.jsxs("b", { children: ["#", TagView.decodeTag(tag.name)] }) }, tag.name))) })), itemsResults.length > 0 && tagsResults.length > 0 && (jsxRuntime.jsx("hr", { className: 'tw:opacity-50' })), itemsResults.slice(0, 5).map((item) => (jsxRuntime.jsxs("div", { className: 'tw:cursor-pointer tw:hover:font-bold tw:flex tw:flex-row', onClick: () => {
|
581
|
+
const marker = Object.entries(leafletRefs).find((r) => r[1].item === item)?.[1]
|
582
|
+
.marker;
|
583
|
+
if (marker) {
|
584
|
+
navigate(`/${item.id}?${new URLSearchParams(window.location.search)}`);
|
585
|
+
}
|
586
|
+
else {
|
587
|
+
navigate('item/' + item.id + '?' + new URLSearchParams(window.location.search));
|
588
|
+
}
|
589
|
+
}, children: [item.layer?.menuIcon ? (jsxRuntime.jsx(SVG, { src: item.layer.menuIcon, className: 'tw:text-current tw:mr-2 tw:mt-0 tw:w-5 tw:h-5', preProcessor: (code) => {
|
590
|
+
code = code.replace(/fill=".*?"/g, 'fill="currentColor"');
|
591
|
+
code = code.replace(/stroke=".*?"/g, 'stroke="currentColor"');
|
592
|
+
return code;
|
593
|
+
} })) : (jsxRuntime.jsx("div", { className: 'tw:w-5' })), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: 'tw:text-sm tw:overflow-hidden tw:text-ellipsis tw:whitespace-nowrap tw:max-w-[17rem]', children: item.name }), jsxRuntime.jsx("div", { className: 'tw:text-xs tw:overflow-hidden tw:text-ellipsis tw:whitespace-nowrap tw:max-w-[17rem]', children: item.text })] })] }, item.id))), Array.from(geoResults).length > 0 &&
|
594
|
+
(itemsResults.length > 0 || tagsResults.length > 0) && (jsxRuntime.jsx("hr", { className: 'tw:opacity-50' })), Array.from(geoResults).map((geo) => (jsxRuntime.jsxs("div", { className: 'tw:flex tw:flex-row tw:hover:font-bold tw:cursor-pointer', onClick: () => {
|
595
|
+
searchInput.current?.blur();
|
596
|
+
leaflet.marker(new leaflet.LatLng(geo.geometry.coordinates[1], geo.geometry.coordinates[0]), {
|
597
|
+
icon: MarkerIconFactory('circle', '#777', 'RGBA(35, 31, 32, 0.2)'),
|
598
|
+
})
|
599
|
+
.addTo(map)
|
600
|
+
.bindPopup(`<h3 class="tw:text-base tw:font-bold">${geo?.properties.name ? geo?.properties.name : value}<h3>${capitalizeFirstLetter(geo?.properties?.osm_value)}`)
|
601
|
+
.openPopup()
|
602
|
+
.addEventListener('popupclose', (e) => {
|
603
|
+
// eslint-disable-next-line no-console
|
604
|
+
console.log(e.target.remove());
|
605
|
+
});
|
606
|
+
if (geo.properties.extent)
|
607
|
+
map.fitBounds(new leaflet.LatLngBounds(new leaflet.LatLng(geo.properties.extent[1], geo.properties.extent[0]), new leaflet.LatLng(geo.properties.extent[3], geo.properties.extent[2])));
|
608
|
+
else
|
609
|
+
map.setView(new leaflet.LatLng(geo.geometry.coordinates[1], geo.geometry.coordinates[0]), 15, { duration: 1 });
|
610
|
+
hide();
|
611
|
+
}, children: [jsxRuntime.jsx(ForwardRef$1, { className: 'tw:text-current tw:mr-2 tw:mt-0 tw:w-5' }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: 'tw:text-sm tw:overflow-hidden tw:text-ellipsis tw:whitespace-nowrap tw:max-w-[17rem]', children: geo?.properties.name ? geo?.properties.name : value }), jsxRuntime.jsxs("div", { className: 'tw:text-xs tw:overflow-hidden tw:text-ellipsis tw:whitespace-nowrap tw:max-w-[17rem]', children: [geo?.properties?.city && `${capitalizeFirstLetter(geo?.properties?.city)}, `, ' ', geo?.properties?.osm_value &&
|
612
|
+
geo?.properties?.osm_value !== 'yes' &&
|
613
|
+
geo?.properties?.osm_value !== 'primary' &&
|
614
|
+
geo?.properties?.osm_value !== 'path' &&
|
615
|
+
geo?.properties?.osm_value !== 'secondary' &&
|
616
|
+
geo?.properties?.osm_value !== 'residential' &&
|
617
|
+
geo?.properties?.osm_value !== 'unclassified' &&
|
618
|
+
`${capitalizeFirstLetter(geo?.properties?.osm_value)}, `, ' ', geo.properties.state && `${geo.properties.state}, `, ' ', geo.properties.country && geo.properties.country] })] })] }, Math.random()))), isGeoCoordinate(value) && (jsxRuntime.jsxs("div", { className: 'tw:flex tw:flex-row tw:hover:font-bold tw:cursor-pointer', onClick: () => {
|
619
|
+
leaflet.marker(new leaflet.LatLng(extractCoordinates(value)[0], extractCoordinates(value)[1]), {
|
620
|
+
icon: MarkerIconFactory('circle', '#777', 'RGBA(35, 31, 32, 0.2)'),
|
621
|
+
})
|
622
|
+
.addTo(map)
|
623
|
+
.bindPopup(`<h3 class="tw:text-base tw:font-bold">${extractCoordinates(value)[0]}, ${extractCoordinates(value)[1]}</h3>`)
|
624
|
+
.openPopup()
|
625
|
+
.addEventListener('popupclose', (e) => {
|
626
|
+
// eslint-disable-next-line no-console
|
627
|
+
console.log(e.target.remove());
|
628
|
+
});
|
629
|
+
map.setView(new leaflet.LatLng(extractCoordinates(value)[0], extractCoordinates(value)[1]), 15, { duration: 1 });
|
630
|
+
}, children: [jsxRuntime.jsx(ForwardRef$2, { className: 'tw:text-current tw:mr-2 tw:mt-0 tw:w-4' }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: 'tw:text-sm tw:overflow-hidden tw:text-ellipsis tw:whitespace-nowrap tw:max-w-[17rem]', children: value }), jsxRuntime.jsx("div", { className: 'tw:text-xs tw:overflow-hidden tw:text-ellipsis tw:whitespace-nowrap tw:max-w-[17rem]', children: 'Coordiante' })] })] }))] }))] })) }));
|
631
|
+
};
|
632
|
+
function isGeoCoordinate(input) {
|
633
|
+
const geokoordinatenRegex =
|
634
|
+
// eslint-disable-next-line security/detect-unsafe-regex
|
635
|
+
/^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$/;
|
636
|
+
return geokoordinatenRegex.test(input);
|
637
|
+
}
|
638
|
+
function extractCoordinates(input) {
|
639
|
+
const result = input.split(',');
|
640
|
+
if (result) {
|
641
|
+
const latitude = parseFloat(result[0]);
|
642
|
+
const longitude = parseFloat(result[1]);
|
643
|
+
if (!isNaN(latitude) && !isNaN(longitude)) {
|
644
|
+
return [latitude, longitude];
|
645
|
+
}
|
646
|
+
}
|
647
|
+
return null; // Invalid input or error
|
648
|
+
}
|
649
|
+
function capitalizeFirstLetter(string) {
|
650
|
+
return string.charAt(0).toUpperCase() + string.slice(1);
|
651
|
+
}
|
652
|
+
|
653
|
+
const TagsControl = () => {
|
654
|
+
const filterTags = TagView.useFilterTags();
|
655
|
+
const removeFilterTag = TagView.useRemoveFilterTag();
|
656
|
+
return (jsxRuntime.jsx("div", { className: 'tw:flex tw:flex-wrap tw:mt-4 tw:w-[calc(100vw-2rem)] tw:max-w-xs', children: filterTags.map((tag) => (jsxRuntime.jsxs("div", { className: 'tw:rounded-2xl tw:text-white tw:p-2 tw:px-4 tw:shadow-xl tw:card tw:mr-2 tw:mb-2', style: { backgroundColor: tag.color }, children: [jsxRuntime.jsx("div", { className: 'tw:card-actions tw:justify-end', children: jsxRuntime.jsx("label", { className: 'tw:btn tw:btn-xs tw:btn-circle tw:absolute tw:-right-2 tw:-top-2 tw:bg-white tw:text-gray-600', onClick: () => removeFilterTag(tag.name), children: "\u2715" }) }), jsxRuntime.jsxs("b", { children: ["#", TagView.decodeTag(tag.name)] })] }, tag.id))) }));
|
657
|
+
};
|
658
|
+
|
659
|
+
const SelectPosition = ({ setSelectNewItemPosition, selectNewItemPosition, }) => {
|
660
|
+
return (jsxRuntime.jsxs("div", { className: 'tw:animate-pulseGrow tw:button tw:z-1000 tw:absolute tw:right-5 tw:top-4 tw:drop-shadow-md', children: [jsxRuntime.jsx("label", { className: 'tw:btn tw:btn-sm tw:rounded-2xl tw:btn-circle tw:btn-ghost tw:hover:bg-transparent tw:absolute tw:right-0 tw:top-0 tw:text-gray-600', onClick: () => {
|
661
|
+
setSelectNewItemPosition(null);
|
662
|
+
}, children: jsxRuntime.jsx("p", { className: 'tw:text-center ', children: "\u2715" }) }), jsxRuntime.jsx("div", { className: 'tw:alert tw:bg-base-100 tw:text-base-content', children: jsxRuntime.jsxs("div", { children: [selectNewItemPosition && 'text' in selectNewItemPosition && (jsxRuntime.jsxs("span", { className: 'tw:text-lg', children: ["Select new position of ", jsxRuntime.jsx("b", { children: selectNewItemPosition.name }), " on the map!"] })), selectNewItemPosition && 'menuIcon' in selectNewItemPosition && (jsxRuntime.jsx("span", { className: 'tw:text-lg', children: "Select position on the map!" }))] }) })] }));
|
663
|
+
};
|
664
|
+
|
665
|
+
function UtopiaMapInner({ children, geo, showFilterControl = false, showGratitudeControl = false, showLayerControl = true, showThemeControl = false, defaultTheme = '', donationWidget, expandLayerControl, }) {
|
666
|
+
const selectNewItemPosition = TagView.useSelectPosition();
|
667
|
+
const setSelectNewItemPosition = TagView.useSetSelectPosition();
|
668
|
+
const setClusterRef = TagView.useSetClusterRef();
|
669
|
+
const clusterRef = TagView.useClusterRef();
|
670
|
+
const setMapClicked = TagView.useSetMapClicked();
|
671
|
+
const { setPopupForm } = usePopupForm();
|
672
|
+
const layers = TagView.useLayers();
|
673
|
+
const addVisibleLayer = TagView.useAddVisibleLayer();
|
674
|
+
const leafletRefs = TagView.useLeafletRefs();
|
675
|
+
const location = reactRouterDom.useLocation();
|
676
|
+
const map = reactLeaflet.useMap();
|
677
|
+
useTheme(defaultTheme);
|
678
|
+
React.useEffect(() => {
|
679
|
+
layers.forEach((layer) => addVisibleLayer(layer));
|
680
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
681
|
+
}, [layers]);
|
682
|
+
const setAppState = TagView.useSetAppState();
|
683
|
+
React.useEffect(() => {
|
684
|
+
setAppState({ showThemeControl });
|
685
|
+
}, [setAppState, showThemeControl]);
|
686
|
+
const init = React.useRef(false);
|
687
|
+
React.useEffect(() => {
|
688
|
+
if (!init.current) {
|
689
|
+
donationWidget &&
|
690
|
+
setTimeout(() => {
|
691
|
+
reactToastify.toast(jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(TagView.TextView, { itemId: '', rawText: '## Do you like this Map?' }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx(TagView.TextView, { itemId: '', rawText: 'Support us building free opensource maps for communities and help us grow 🌱☀️' }), jsxRuntime.jsx("a", { href: 'https://opencollective.com/utopia-project', children: jsxRuntime.jsx("div", { className: 'tw:btn tw:btn-sm tw:float-right tw:btn-primary', children: "Donate" }) })] })] }), { autoClose: false });
|
692
|
+
}, 600000);
|
693
|
+
init.current = true;
|
694
|
+
}
|
695
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
696
|
+
}, []);
|
697
|
+
function MapEventListener() {
|
698
|
+
reactLeaflet.useMapEvents({
|
699
|
+
click: (e) => {
|
700
|
+
resetMetaTags();
|
701
|
+
// eslint-disable-next-line no-console
|
702
|
+
console.log(e.latlng.lat + ',' + e.latlng.lng);
|
703
|
+
if (selectNewItemPosition) {
|
704
|
+
setMapClicked({ position: e.latlng, setItemFormPopup: setPopupForm });
|
705
|
+
}
|
706
|
+
},
|
707
|
+
moveend: () => { },
|
708
|
+
});
|
709
|
+
return null;
|
710
|
+
}
|
711
|
+
reactLeaflet.useMapEvents({
|
712
|
+
popupopen: (e) => {
|
713
|
+
const item = Object.entries(leafletRefs).find((r) => r[1].popup === e.popup)?.[1].item;
|
714
|
+
if (window.location.pathname.split('/')[1] !== item?.id) {
|
715
|
+
const params = new URLSearchParams(window.location.search);
|
716
|
+
if (!location.pathname.includes('/item/')) {
|
717
|
+
window.history.pushState({}, '', `/${item?.id}` + `${params.toString() !== '' ? `?${params}` : ''}`);
|
718
|
+
}
|
719
|
+
let title = '';
|
720
|
+
if (item?.name)
|
721
|
+
title = item.name;
|
722
|
+
document.title = `${document.title.split('-')[0]} - ${title}`;
|
723
|
+
}
|
724
|
+
},
|
725
|
+
});
|
726
|
+
const openPopup = () => {
|
727
|
+
if (!containsUUID(window.location.pathname)) {
|
728
|
+
map.closePopup();
|
729
|
+
}
|
730
|
+
else {
|
731
|
+
if (window.location.pathname.split('/')[1]) {
|
732
|
+
const id = window.location.pathname.split('/')[1];
|
733
|
+
// eslint-disable-next-line security/detect-object-injection
|
734
|
+
const ref = leafletRefs[id];
|
735
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
736
|
+
if (ref) {
|
737
|
+
clusterRef.hasLayer(ref.marker) &&
|
738
|
+
clusterRef?.zoomToShowLayer(ref.marker, () => {
|
739
|
+
ref.marker.openPopup();
|
740
|
+
});
|
741
|
+
let title = '';
|
742
|
+
if (ref.item.name)
|
743
|
+
title = ref.item.name;
|
744
|
+
document.title = `${document.title.split('-')[0]} - ${title}`;
|
745
|
+
document
|
746
|
+
.querySelector('meta[property="og:title"]')
|
747
|
+
?.setAttribute('content', ref.item.name);
|
748
|
+
document
|
749
|
+
.querySelector('meta[property="og:description"]')
|
750
|
+
?.setAttribute('content', ref.item.text ?? '');
|
751
|
+
}
|
752
|
+
}
|
753
|
+
}
|
754
|
+
};
|
755
|
+
React.useEffect(() => {
|
756
|
+
openPopup();
|
757
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
758
|
+
}, [leafletRefs, location]);
|
759
|
+
const resetMetaTags = () => {
|
760
|
+
const params = new URLSearchParams(window.location.search);
|
761
|
+
if (!containsUUID(window.location.pathname)) {
|
762
|
+
window.history.pushState({}, '', '/' + `${params.toString() !== '' ? `?${params}` : ''}`);
|
763
|
+
}
|
764
|
+
document.title = document.title.split('-')[0];
|
765
|
+
document.querySelector('meta[property="og:title"]')?.setAttribute('content', document.title);
|
766
|
+
document
|
767
|
+
.querySelector('meta[property="og:description"]')
|
768
|
+
?.setAttribute('content', `${document.querySelector('meta[name="description"]')?.getAttribute('content')}`);
|
769
|
+
};
|
770
|
+
const onEachFeature = (feature, layer) => {
|
771
|
+
if (feature.properties) {
|
772
|
+
layer.bindPopup(feature.properties.name);
|
773
|
+
}
|
774
|
+
};
|
775
|
+
const addFilterTag = TagView.useAddFilterTag();
|
776
|
+
const resetFilterTags = TagView.useResetFilterTags();
|
777
|
+
const tags = TagView.useTags();
|
778
|
+
const filterTags = TagView.useFilterTags();
|
779
|
+
React.useEffect(() => {
|
780
|
+
const params = new URLSearchParams(location.search);
|
781
|
+
const urlTags = params.get('tags');
|
782
|
+
const decodedTags = urlTags ? decodeURIComponent(urlTags) : '';
|
783
|
+
const decodedTagsArray = decodedTags.split(';').filter(Boolean);
|
784
|
+
const urlDiffersFromState = decodedTagsArray.some((ut) => !filterTags.find((ft) => ut.toLowerCase() === ft.name.toLowerCase())) ||
|
785
|
+
filterTags.some((ft) => !decodedTagsArray.find((ut) => ut.toLowerCase() === ft.name.toLowerCase()));
|
786
|
+
if (urlDiffersFromState) {
|
787
|
+
resetFilterTags();
|
788
|
+
decodedTagsArray.forEach((urlTag) => {
|
789
|
+
const match = tags.find((t) => t.name.toLowerCase() === urlTag.toLowerCase());
|
790
|
+
if (match)
|
791
|
+
addFilterTag(match);
|
792
|
+
});
|
793
|
+
}
|
794
|
+
}, [location, tags, filterTags, addFilterTag, resetFilterTags]);
|
795
|
+
const toggleVisibleLayer = TagView.useToggleVisibleLayer();
|
796
|
+
const allLayers = TagView.useLayers();
|
797
|
+
const initializedRef = React.useRef(false);
|
798
|
+
React.useEffect(() => {
|
799
|
+
if (initializedRef.current || allLayers.length === 0)
|
800
|
+
return;
|
801
|
+
const params = new URLSearchParams(location.search);
|
802
|
+
const urlLayersParam = params.get('layers');
|
803
|
+
if (!urlLayersParam) {
|
804
|
+
initializedRef.current = true;
|
805
|
+
return;
|
806
|
+
}
|
807
|
+
const urlLayerNames = urlLayersParam.split(',').filter(Boolean);
|
808
|
+
const layerNamesToHide = allLayers
|
809
|
+
.map((l) => l.name)
|
810
|
+
.filter((name) => !urlLayerNames.includes(name));
|
811
|
+
layerNamesToHide.forEach((name) => {
|
812
|
+
const match = allLayers.find((l) => l.name === name);
|
813
|
+
if (match)
|
814
|
+
toggleVisibleLayer(match);
|
815
|
+
});
|
816
|
+
initializedRef.current = true;
|
817
|
+
}, [location, allLayers, toggleVisibleLayer]);
|
818
|
+
return (jsxRuntime.jsxs("div", { className: `tw:h-full ${selectNewItemPosition != null ? 'crosshair-cursor-enabled' : ''}`, children: [jsxRuntime.jsx(reactRouterDom.Outlet, {}), jsxRuntime.jsxs(Control, { position: 'topLeft', zIndex: '1000', absolute: true, children: [jsxRuntime.jsx(SearchControl, {}), jsxRuntime.jsx(TagsControl, {})] }), jsxRuntime.jsxs(Control, { position: 'bottomLeft', zIndex: '999', absolute: true, children: [showFilterControl && jsxRuntime.jsx(FilterControl, {}), showLayerControl && jsxRuntime.jsx(LayerControl, { expandLayerControl: expandLayerControl ?? false }), showGratitudeControl && jsxRuntime.jsx(GratitudeControl, {})] }), jsxRuntime.jsx(reactLeaflet.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' }), jsxRuntime.jsx(MarkerClusterGroup, { ref: (r) => setClusterRef(r), showCoverageOnHover: true, chunkedLoading: true, maxClusterRadius: 50, removeOutsideVisibleBounds: false, children: children }), geo && (jsxRuntime.jsx(reactLeaflet.GeoJSON, { data: geo, onEachFeature: onEachFeature, eventHandlers: {
|
819
|
+
click: (e) => {
|
820
|
+
if (selectNewItemPosition) {
|
821
|
+
e.layer.closePopup();
|
822
|
+
setMapClicked({ position: e.latlng, setItemFormPopup: setPopupForm });
|
823
|
+
}
|
824
|
+
},
|
825
|
+
} })), jsxRuntime.jsx(MapEventListener, {}), jsxRuntime.jsx(AddButton, { triggerAction: setSelectNewItemPosition }), selectNewItemPosition != null && (jsxRuntime.jsx(SelectPosition, { selectNewItemPosition: selectNewItemPosition, setSelectNewItemPosition: setSelectNewItemPosition }))] }));
|
826
|
+
}
|
827
|
+
|
828
|
+
/**
|
829
|
+
* This component creates the map.
|
830
|
+
* ```tsx
|
831
|
+
* <UtopiaMap center={[50.6, 9.5]} zoom={5} height="100dvh" width="100dvw" />
|
832
|
+
* ```
|
833
|
+
* You can define its {@link Layer | `Layers`} as supcomponents.
|
834
|
+
* ```tsx
|
835
|
+
* <UtopiaMap center={[50.6, 15.5]} zoom={5} height="100dvh" width="100dvw">
|
836
|
+
* <Layer
|
837
|
+
* name="events"
|
838
|
+
* markerIcon="calendar"
|
839
|
+
* markerShape="square"
|
840
|
+
* markerDefaultColor="#700"
|
841
|
+
* data={events}
|
842
|
+
* />
|
843
|
+
* <Layer
|
844
|
+
* name="places"
|
845
|
+
* markerIcon="point"
|
846
|
+
* markerShape="circle"
|
847
|
+
* markerDefaultColor="#007"
|
848
|
+
* data={places}
|
849
|
+
* />
|
850
|
+
* </UtopiaMap>
|
851
|
+
* ```
|
852
|
+
* You can also pass {@link Tags | `Tags`} or {@link Permissions | `Permissions`} as subcomponents.
|
853
|
+
* ```tsx
|
854
|
+
* <UtopiaMap center={[50.6, 15.5]} zoom={5} height="100dvh" width="100dvw">
|
855
|
+
* ...
|
856
|
+
* <Tags data={tags} />
|
857
|
+
* <Permissions data={permissions} />
|
858
|
+
* </UtopiaMap>
|
859
|
+
* ```
|
860
|
+
* @category Map
|
861
|
+
*/
|
862
|
+
function UtopiaMap({ height = '500px', width = '100%', center = [50.6, 9.5], zoom = 10, children, geo, showFilterControl = false, showGratitudeControl = false, showLayerControl = true, showZoomControl = false, showThemeControl = false, defaultTheme, donationWidget, expandLayerControl, }) {
|
863
|
+
return (jsxRuntime.jsx(ContextWrapper, { children: jsxRuntime.jsx(reactLeaflet.MapContainer, { style: { height, width }, center: new leaflet.LatLng(center[0], center[1]), zoom: zoom, zoomControl: showZoomControl, maxZoom: 19, children: jsxRuntime.jsx(UtopiaMapInner, { geo: geo, showFilterControl: showFilterControl, showGratitudeControl: showGratitudeControl, showLayerControl: showLayerControl, donationWidget: donationWidget, showThemeControl: showThemeControl, defaultTheme: defaultTheme, expandLayerControl: expandLayerControl, children: children }) }) }));
|
864
|
+
}
|
865
|
+
|
866
|
+
const LayerContext = React.createContext({
|
867
|
+
name: '',
|
868
|
+
markerDefaultColor: '',
|
869
|
+
markerDefaultColor2: '',
|
870
|
+
markerShape: '',
|
871
|
+
menuText: '',
|
872
|
+
});
|
873
|
+
|
874
|
+
/**
|
875
|
+
* @category Map
|
876
|
+
*/
|
877
|
+
const Layer = ({ data, children, name = 'places', menuIcon = 'MapPinIcon', menuText = 'add new place', menuColor = '#2E7D32', markerIcon, markerShape = 'circle', markerDefaultColor = '#777', markerDefaultColor2 = 'RGBA(35, 31, 32, 0.2)', api, itemType, userProfileLayer = false, customEditLink, customEditParameter,
|
878
|
+
// eslint-disable-next-line camelcase
|
879
|
+
public_edit_items, listed = true, }) => {
|
880
|
+
const setItemsApi = TagView.useSetItemsApi();
|
881
|
+
const setItemsData = TagView.useSetItemsData();
|
882
|
+
const addTag = TagView.useAddTag();
|
883
|
+
const [newTagsToAdd] = React.useState([]);
|
884
|
+
const [tagsReady] = React.useState(false);
|
885
|
+
React.useEffect(() => {
|
886
|
+
data &&
|
887
|
+
setItemsData({
|
888
|
+
data,
|
889
|
+
children,
|
890
|
+
name,
|
891
|
+
menuIcon,
|
892
|
+
menuText,
|
893
|
+
menuColor,
|
894
|
+
markerIcon,
|
895
|
+
markerShape,
|
896
|
+
markerDefaultColor,
|
897
|
+
markerDefaultColor2,
|
898
|
+
api,
|
899
|
+
itemType,
|
900
|
+
userProfileLayer,
|
901
|
+
// Can we just use editCallback for all cases?
|
902
|
+
customEditLink,
|
903
|
+
customEditParameter,
|
904
|
+
// eslint-disable-next-line camelcase
|
905
|
+
public_edit_items,
|
906
|
+
listed,
|
907
|
+
});
|
908
|
+
api &&
|
909
|
+
setItemsApi({
|
910
|
+
data,
|
911
|
+
children,
|
912
|
+
name,
|
913
|
+
menuIcon,
|
914
|
+
menuText,
|
915
|
+
menuColor,
|
916
|
+
markerIcon,
|
917
|
+
markerShape,
|
918
|
+
markerDefaultColor,
|
919
|
+
markerDefaultColor2,
|
920
|
+
api,
|
921
|
+
itemType,
|
922
|
+
userProfileLayer,
|
923
|
+
customEditLink,
|
924
|
+
customEditParameter,
|
925
|
+
// eslint-disable-next-line camelcase
|
926
|
+
public_edit_items,
|
927
|
+
listed,
|
928
|
+
});
|
929
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
930
|
+
}, [data, api]);
|
931
|
+
React.useEffect(() => {
|
932
|
+
if (tagsReady) {
|
933
|
+
const processedTags = {};
|
934
|
+
newTagsToAdd.map((newtag) => {
|
935
|
+
if (!processedTags[newtag.name]) {
|
936
|
+
processedTags[newtag.name] = true;
|
937
|
+
addTag(newtag);
|
938
|
+
}
|
939
|
+
return null;
|
940
|
+
});
|
941
|
+
}
|
942
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
943
|
+
}, [tagsReady]);
|
944
|
+
return (jsxRuntime.jsx(LayerContext.Provider, { value: {
|
945
|
+
name,
|
946
|
+
markerDefaultColor,
|
947
|
+
markerDefaultColor2,
|
948
|
+
markerShape,
|
949
|
+
markerIcon,
|
950
|
+
menuText,
|
951
|
+
}, children: children }));
|
952
|
+
};
|
953
|
+
|
954
|
+
/**
|
955
|
+
* This Components injects Tags comming from an {@link ItemsApi | `API`}
|
956
|
+
* ```tsx
|
957
|
+
* <Tags api={tagsApi} />
|
958
|
+
* ```
|
959
|
+
* or from on {@link Tag| `Array`}
|
960
|
+
* ```tsx
|
961
|
+
* <Tags data={tags} />
|
962
|
+
* ```
|
963
|
+
* Can be child of {@link AppShell | `AppShell`}
|
964
|
+
* ```tsx
|
965
|
+
* <AppShell>
|
966
|
+
* ...
|
967
|
+
* <Tags api={tagsApi} />
|
968
|
+
* </AppShell>
|
969
|
+
* ```
|
970
|
+
* Or child of {@link UtopiaMap | `UtopiaMap`}
|
971
|
+
* ```tsx
|
972
|
+
* <UtopiaMap>
|
973
|
+
* ...
|
974
|
+
* <Tags api={tagsApi} />
|
975
|
+
* </UtopiaMap>
|
976
|
+
* ```
|
977
|
+
* @category Map
|
978
|
+
*/
|
979
|
+
function Tags({ data, api }) {
|
980
|
+
const setTagData = TagView.useSetTagData();
|
981
|
+
const setTagApi = TagView.useSetTagApi();
|
982
|
+
React.useEffect(() => {
|
983
|
+
data && setTagData(data);
|
984
|
+
api && setTagApi(api);
|
985
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
986
|
+
}, [api, data]);
|
987
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
988
|
+
}
|
989
|
+
|
990
|
+
/**
|
991
|
+
* This Components injects Permissions comming from an {@link ItemsApi | `API`}
|
992
|
+
* ```tsx
|
993
|
+
* <Permissions api={itemsApiInstance} adminRole="8141dee8-8e10-48d0-baf1-680aea271298" />
|
994
|
+
* ```
|
995
|
+
* or from on {@link Permission| `Array`}
|
996
|
+
* ```tsx
|
997
|
+
* <Permissions data={permissions} adminRole="8141dee8-8e10-48d0-baf1-680aea271298" />
|
998
|
+
* ```
|
999
|
+
* Can be child of {@link AppShell | `AppShell`}
|
1000
|
+
* ```tsx
|
1001
|
+
* <AppShell>
|
1002
|
+
* ...
|
1003
|
+
* <Permissions api={itemsApiInstance} adminRole="8141dee8-8e10-48d0-baf1-680aea271298" />
|
1004
|
+
* </AppShell>
|
1005
|
+
* ```
|
1006
|
+
* Or child of {@link UtopiaMap | `UtopiaMap`}
|
1007
|
+
* ```tsx
|
1008
|
+
* <UtopiaMap>
|
1009
|
+
* ...
|
1010
|
+
* <Permissions api={itemsApiInstance} adminRole="8141dee8-8e10-48d0-baf1-680aea271298" />
|
1011
|
+
* </UtopiaMap>
|
1012
|
+
* ```
|
1013
|
+
* @category Map
|
1014
|
+
*/
|
1015
|
+
function Permissions({ data, api, adminRole, }) {
|
1016
|
+
const setPermissionData = TagView.useSetPermissionData();
|
1017
|
+
const setPermissionApi = TagView.useSetPermissionApi();
|
1018
|
+
const setAdminRole = TagView.useSetAdminRole();
|
1019
|
+
const { user } = TagView.useAuth();
|
1020
|
+
React.useEffect(() => {
|
1021
|
+
adminRole && setAdminRole(adminRole);
|
1022
|
+
data && setPermissionData(data);
|
1023
|
+
api && setPermissionApi(api);
|
1024
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
1025
|
+
}, [api, data, adminRole, user]);
|
1026
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
1027
|
+
}
|
1028
|
+
|
1029
|
+
const themes = [
|
1030
|
+
'default',
|
1031
|
+
'light',
|
1032
|
+
'dark',
|
1033
|
+
'valentine',
|
1034
|
+
'retro',
|
1035
|
+
'aqua',
|
1036
|
+
'cyberpunk',
|
1037
|
+
'caramellatte',
|
1038
|
+
'abyss',
|
1039
|
+
'silk',
|
1040
|
+
];
|
1041
|
+
const ThemeControl = () => {
|
1042
|
+
const [theme, setTheme] = React.useState(() => {
|
1043
|
+
const savedTheme = localStorage.getItem('theme');
|
1044
|
+
return savedTheme ? JSON.parse(savedTheme) : 'default';
|
1045
|
+
});
|
1046
|
+
React.useEffect(() => {
|
1047
|
+
if (theme !== 'default') {
|
1048
|
+
localStorage.setItem('theme', JSON.stringify(theme));
|
1049
|
+
}
|
1050
|
+
else
|
1051
|
+
localStorage.removeItem('theme');
|
1052
|
+
document.documentElement.setAttribute('data-theme', theme);
|
1053
|
+
}, [theme]);
|
1054
|
+
return (jsxRuntime.jsxs("div", { className: 'tw:dropdown tw:mr-2', children: [jsxRuntime.jsxs("div", { tabIndex: 0, role: 'button', className: 'tw:btn tw:m-1', children: ["Theme", jsxRuntime.jsx("svg", { width: '12px', height: '12px', className: 'tw:inline-block tw:h-2 tw:w-2 tw:fill-current tw:opacity-60', xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 2048 2048', children: jsxRuntime.jsx("path", { d: 'M1799 349l242 241-1017 1017L7 590l242-241 775 775 775-775z' }) })] }), jsxRuntime.jsx("ul", { tabIndex: 0, className: 'tw:dropdown-content tw:bg-base-200 tw:rounded-box tw:z-1 tw:w-36 tw:p-2 tw:shadow-2xl', children: themes.map((t) => (jsxRuntime.jsx("li", { children: jsxRuntime.jsx("input", { className: `tw:btn ${theme === t ? 'tw:bg-base-300' : ''} tw:btn-sm tw:btn-block tw:btn-ghost tw:justify-start`, type: 'radio', name: 'theme', value: t, checked: theme === t, onChange: () => setTheme(t), "aria-label": t.toLowerCase() }) }, t))) })] }));
|
1055
|
+
};
|
1056
|
+
|
1057
|
+
const UserControl = () => {
|
1058
|
+
const { isAuthenticated, user, logout } = TagView.useAuth();
|
1059
|
+
const appState = TagView.useAppState();
|
1060
|
+
const [userProfile, setUserProfile] = React.useState({});
|
1061
|
+
const items = TagView.useItems();
|
1062
|
+
React.useEffect(() => {
|
1063
|
+
const profile = user && items.find((i) => i.user_created?.id === user.id && i.layer?.userProfileLayer);
|
1064
|
+
profile
|
1065
|
+
? setUserProfile(profile)
|
1066
|
+
: setUserProfile({ id: 'new', name: user?.first_name ?? '', text: '' });
|
1067
|
+
}, [user, items]);
|
1068
|
+
const onLogout = async () => {
|
1069
|
+
await reactToastify.toast.promise(logout(), {
|
1070
|
+
success: {
|
1071
|
+
render() {
|
1072
|
+
return 'Bye bye';
|
1073
|
+
},
|
1074
|
+
// other options
|
1075
|
+
icon: '👋',
|
1076
|
+
},
|
1077
|
+
error: {
|
1078
|
+
render({ data }) {
|
1079
|
+
return JSON.stringify(data);
|
1080
|
+
},
|
1081
|
+
},
|
1082
|
+
pending: 'logging out ..',
|
1083
|
+
});
|
1084
|
+
};
|
1085
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: isAuthenticated ? (jsxRuntime.jsxs("div", { className: 'tw:flex tw:mr-2', children: [jsxRuntime.jsxs(reactRouterDom.Link, { to: `${userProfile.id && '/item/' + userProfile.id}`, className: 'tw:flex tw:items-center', children: [userProfile.image && (jsxRuntime.jsx("div", { className: 'tw:avatar', children: jsxRuntime.jsx("div", { className: 'tw:w-10 tw:rounded-full', children: jsxRuntime.jsx("img", { src: appState.assetsApi.url + userProfile.image }) }) })), jsxRuntime.jsx("div", { className: 'tw:ml-2 tw:mr-2', children: userProfile.name || user?.first_name })] }), jsxRuntime.jsxs("div", { className: 'tw:dropdown tw:dropdown-end', children: [jsxRuntime.jsx("label", { tabIndex: 0, className: 'tw:btn tw:btn-ghost tw:btn-square', children: jsxRuntime.jsx(TagView.ForwardRef, { className: 'tw:h-5 tw:w-5' }) }), jsxRuntime.jsxs("ul", { tabIndex: 0, className: 'tw:menu tw:menu-compact tw:dropdown-content tw:mt-4 tw:p-2 tw:shadow tw:bg-base-100 tw:rounded-box tw:w-52 tw:z-10000!', children: [jsxRuntime.jsx("li", { children: jsxRuntime.jsx(reactRouterDom.Link, { to: `${userProfile.id && '/edit-item/' + userProfile.id}`, children: "Profile" }) }), jsxRuntime.jsx("li", { children: jsxRuntime.jsx(reactRouterDom.Link, { to: '/user-settings', children: "Settings" }) }), jsxRuntime.jsx("li", { children: jsxRuntime.jsx("a", { onClick: () => {
|
1086
|
+
void onLogout();
|
1087
|
+
}, children: "Logout" }) })] })] })] })) : (jsxRuntime.jsxs("div", { className: 'tw:mr-2 tw:flex tw:items-center', children: [jsxRuntime.jsxs("div", { className: 'tw:hidden tw:md:flex', children: [jsxRuntime.jsx(reactRouterDom.Link, { to: '/login', children: jsxRuntime.jsx("div", { className: 'tw:self-center tw:btn tw:btn-ghost tw:mr-2', children: "Login" }) }), jsxRuntime.jsx(reactRouterDom.Link, { to: '/signup', children: jsxRuntime.jsx("div", { className: 'tw:btn tw:btn-ghost tw:mr-2', children: "Sign Up" }) })] }), jsxRuntime.jsxs("div", { className: 'tw:dropdown tw:dropdown-end', children: [jsxRuntime.jsx("label", { tabIndex: 1, className: 'tw:btn tw:btn-ghost tw:md:hidden', children: jsxRuntime.jsx(TagView.ForwardRef, { className: 'tw:h-5 tw:w-5' }) }), jsxRuntime.jsxs("ul", { tabIndex: 1, className: 'tw:menu tw:dropdown-content tw:mt-4 tw:p-2 tw:shadow tw:bg-base-100 tw:rounded-box tw:w-52 tw:z-10000!', children: [jsxRuntime.jsx("li", { children: jsxRuntime.jsx(reactRouterDom.Link, { to: '/login', children: "Login" }) }), jsxRuntime.jsx("li", { children: jsxRuntime.jsx(reactRouterDom.Link, { to: '/signup', children: "Sign Up" }) })] })] })] })) }));
|
1088
|
+
};
|
1089
|
+
|
1090
|
+
function NavBar({ appName }) {
|
1091
|
+
const appState = TagView.useAppState();
|
1092
|
+
const setAppState = TagView.useSetAppState();
|
1093
|
+
const toggleSidebar = () => {
|
1094
|
+
setAppState({ sideBarOpen: !appState.sideBarOpen });
|
1095
|
+
};
|
1096
|
+
const nameRef = React.useRef(null);
|
1097
|
+
const [nameWidth, setNameWidth] = React.useState(0);
|
1098
|
+
React.useEffect(() => {
|
1099
|
+
!appState.embedded && nameRef.current && setNameWidth(nameRef.current.scrollWidth);
|
1100
|
+
}, [nameRef, appName, appState.embedded]);
|
1101
|
+
if (!appState.embedded) {
|
1102
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs("div", { className: 'tw:navbar tw:bg-base-100 tw:z-9998 tw:shadow-xl tw:relative tw:p-0', children: [jsxRuntime.jsx("button", { className: 'tw:btn tw:btn-square tw:btn-ghost tw:ml-3', "aria-controls": '#sidenav', "aria-haspopup": 'true', onClick: () => toggleSidebar(), children: jsxRuntime.jsx(ForwardRef, { className: 'tw:inline-block tw:w-5 tw:h-5' }) }), jsxRuntime.jsx("div", { className: 'tw:flex-1 tw:mr-2', children: jsxRuntime.jsxs("div", { className: 'tw:flex-1 tw:truncate tw:grid tw:grid-flow-col', style: { maxWidth: nameWidth + 62 }, children: [jsxRuntime.jsx(reactRouterDom.Link, { className: 'tw:btn tw:btn-ghost tw:px-2 tw:normal-case tw:text-xl tw:flex-1 tw:truncate', to: '/', children: jsxRuntime.jsx("h1", { ref: nameRef, className: 'tw:truncate', children: appName }) }), jsxRuntime.jsx("button", { className: 'tw:btn tw:px-2 tw:btn-ghost', onClick: () => window.my_modal_3.showModal(), children: jsxRuntime.jsx(QuestionMarkIcon, { className: 'tw:h-5 tw:w-5' }) })] }) }), appState.showThemeControl && jsxRuntime.jsx(ThemeControl, {}), jsxRuntime.jsx(UserControl, {})] }) }));
|
1103
|
+
}
|
1104
|
+
else
|
1105
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
1106
|
+
}
|
1107
|
+
|
1108
|
+
const SetAppState = ({ assetsApi, embedded, openCollectiveApiKey, }) => {
|
1109
|
+
const setAppState = TagView.useSetAppState();
|
1110
|
+
React.useEffect(() => {
|
1111
|
+
setAppState({ assetsApi });
|
1112
|
+
}, [assetsApi, setAppState]);
|
1113
|
+
React.useEffect(() => {
|
1114
|
+
setAppState({ embedded });
|
1115
|
+
}, [embedded, setAppState]);
|
1116
|
+
React.useEffect(() => {
|
1117
|
+
setAppState({ openCollectiveApiKey });
|
1118
|
+
}, [openCollectiveApiKey, setAppState]);
|
1119
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
1120
|
+
};
|
1121
|
+
|
1122
|
+
/**
|
1123
|
+
* @category AppShell
|
1124
|
+
*/
|
1125
|
+
function AppShell({ appName, children, assetsApi, embedded, openCollectiveApiKey, }) {
|
1126
|
+
return (jsxRuntime.jsx(ContextWrapper, { children: jsxRuntime.jsxs("div", { className: 'tw:flex tw:flex-col tw:h-full', children: [jsxRuntime.jsx(SetAppState, { assetsApi: assetsApi, embedded: embedded, openCollectiveApiKey: openCollectiveApiKey }), jsxRuntime.jsx(NavBar, { appName: appName }), jsxRuntime.jsx("div", { id: 'app-content', className: 'tw:flex', children: children })] }) }));
|
1127
|
+
}
|
1128
|
+
|
1129
|
+
function SidebarSubmenu({ submenu, name, icon, }) {
|
1130
|
+
const location = reactRouterDom.useLocation();
|
1131
|
+
const [isExpanded, setIsExpanded] = React.useState(false);
|
1132
|
+
/** Open Submenu list if path found in routes, this is for directly loading submenu routes first time */
|
1133
|
+
React.useEffect(() => {
|
1134
|
+
if (submenu?.filter((m) => {
|
1135
|
+
return m.path === location.pathname;
|
1136
|
+
})[0])
|
1137
|
+
setIsExpanded(true);
|
1138
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
1139
|
+
}, []);
|
1140
|
+
return (jsxRuntime.jsxs("div", { className: 'flex-col', children: [jsxRuntime.jsxs("div", { className: 'w-full', onClick: () => setIsExpanded(!isExpanded), children: [icon, " ", jsxRuntime.jsxs("span", { children: [name, " "] }), jsxRuntime.jsx(ChevronDownIcon, { className: 'w-5 h-5 mt-1 float-right delay-400 duration-500 transition-all ' +
|
1141
|
+
(isExpanded ? 'rotate-180' : '') })] }), jsxRuntime.jsx("div", { className: ' w-full' + (isExpanded ? '' : 'hidden'), children: jsxRuntime.jsx("ul", { className: 'menu menu-compact', children: submenu?.map((m, k) => {
|
1142
|
+
return (jsxRuntime.jsx("li", { children: jsxRuntime.jsxs(reactRouterDom.Link, { to: m.path, className: '', children: [m.icon, jsxRuntime.jsx("span", { className: '', "data-te-sidenav-slim": 'false', children: m.name }), location.pathname === m.path ? (jsxRuntime.jsx("span", { className: 'absolute mt-1 mb-1 inset-y-0 left-0 w-1 rounded-tr-md rounded-br-md bg-primary ', "aria-hidden": 'true' })) : null] }) }, k));
|
1143
|
+
}) }) })] }));
|
1144
|
+
}
|
1145
|
+
|
1146
|
+
/**
|
1147
|
+
* @category AppShell
|
1148
|
+
*/
|
1149
|
+
function SideBar({ routes, bottomRoutes }) {
|
1150
|
+
const location = reactRouterDom.useLocation();
|
1151
|
+
const params = new URLSearchParams(window.location.search);
|
1152
|
+
const appState = TagView.useAppState();
|
1153
|
+
const setAppState = TagView.useSetAppState();
|
1154
|
+
const toggleSidebarOpen = () => {
|
1155
|
+
setAppState({ sideBarOpen: !appState.sideBarOpen });
|
1156
|
+
};
|
1157
|
+
const toggleSidebarSlim = () => {
|
1158
|
+
setAppState({ sideBarSlim: !appState.sideBarSlim });
|
1159
|
+
};
|
1160
|
+
return (jsxRuntime.jsx("nav", { id: 'sidenav', className: `${appState.sideBarOpen ? 'tw:translate-x-0' : 'tw:-translate-x-full'}
|
1161
|
+
${appState.sideBarSlim ? 'tw:w-14' : 'tw:w-48'}
|
1162
|
+
${appState.embedded ? 'tw:mt-5.5 tw:h-[calc(100dvh-22px)]' : 'tw:mt-16 tw:h-[calc(100dvh-64px)]'}
|
1163
|
+
tw:fixed tw:left-0 tw:transition-all tw:duration-300 tw:top-0 tw:z-10035
|
1164
|
+
tw:overflow-hidden tw:shadow-xl tw:dark:bg-zinc-800`, children: jsxRuntime.jsxs("div", { className: `tw:flex tw:flex-col ${appState.embedded ? 'tw:h-full' : 'tw:h-[calc(100dvh-64px)]'}`, children: [jsxRuntime.jsx("ul", { className: 'tw:menu tw:w-full tw:bg-base-100 tw:text-base-content tw:p-0', children: routes.map((route, k) => {
|
1165
|
+
return (jsxRuntime.jsx("li", { className: '', children: route.submenu ? (jsxRuntime.jsx(SidebarSubmenu, { ...route })) : (jsxRuntime.jsxs(reactRouterDom.NavLink, { end: true, target: route.blank ? '_blank' : '_self',
|
1166
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
1167
|
+
to: `${route.path}${params && '?' + params.toString()}`, className: ({ isActive }) => `${isActive ? 'tw:font-semibold tw:bg-base-200 tw:rounded-none!' : 'tw:font-normal tw:rounded-none!'}`, onClick: () => {
|
1168
|
+
if (screen.width < 640 && !appState.sideBarSlim)
|
1169
|
+
toggleSidebarOpen();
|
1170
|
+
}, children: [route.icon, jsxRuntime.jsx("span", { className: `${appState.sideBarSlim ? 'tw:hidden' : ''}`, "data-te-sidenav-slim": 'false', children: route.name }), (location.pathname.includes(route.path) && route.path.length > 1) ||
|
1171
|
+
location.pathname === route.path ? (jsxRuntime.jsx("span", { className: 'tw:absolute tw:inset-y-0 tw:left-0 tw:w-1 tw:rounded-tr-md tw:rounded-br-md tw:bg-primary ', "aria-hidden": 'true' })) : null] })) }, k));
|
1172
|
+
}) }), jsxRuntime.jsx("div", { id: 'slim-toggler', className: 'tw:w-full tw:bg-base-100 tw:flex-1 tw:grid tw:place-items-end', "aria-haspopup": 'true', children: jsxRuntime.jsxs("div", { className: 'tw:w-full', children: [jsxRuntime.jsx("ul", { className: 'tw:menu tw:w-full tw:bg-base-100 tw:text-base-content tw:p-0 tw:mb-0', "data-te-sidenav-menu-ref": true, children: bottomRoutes?.map((route, k) => {
|
1173
|
+
return (jsxRuntime.jsx("li", { className: '', children: route.submenu ? (jsxRuntime.jsx(SidebarSubmenu, { ...route })) : (jsxRuntime.jsxs(reactRouterDom.NavLink, { end: true, target: route.blank ? '_blank' : '_self', to: route.path, className: ({ isActive }) => `${isActive ? 'tw:font-semibold tw:bg-base-200 tw:rounded-none!' : 'tw:font-normal tw:rounded-none!'}`, onClick: () => {
|
1174
|
+
if (screen.width < 640 && !appState.sideBarSlim)
|
1175
|
+
toggleSidebarOpen();
|
1176
|
+
}, children: [route.icon, jsxRuntime.jsx("span", { className: `${appState.sideBarSlim ? 'tw:hidden' : ''}`, "data-te-sidenav-slim": 'false', children: route.name }), (location.pathname.includes(route.path) && route.path.length > 1) ||
|
1177
|
+
location.pathname === route.path ? (jsxRuntime.jsx("span", { className: 'tw:absolute tw:inset-y-0 tw:left-0 tw:w-1 tw:rounded-tr-md tw:rounded-br-md tw:bg-primary ', "aria-hidden": 'true' })) : null] })) }, k));
|
1178
|
+
}) }), jsxRuntime.jsx(ChevronRightIcon, { className: 'tw:w-5 tw:h-5 tw:mb-4 tw:mr-5 tw:mt-2 tw:cursor-pointer tw:float-right tw:delay-400 tw:duration-500 tw:transition-all ' +
|
1179
|
+
(!appState.sideBarSlim ? 'tw:rotate-180' : ''), onClick: () => toggleSidebarSlim() })] }) })] }) }));
|
1180
|
+
}
|
1181
|
+
|
1182
|
+
/**
|
1183
|
+
* @category AppShell
|
1184
|
+
*/
|
1185
|
+
function Content({ children }) {
|
1186
|
+
const appState = TagView.useAppState();
|
1187
|
+
return (jsxRuntime.jsx("div", { className: `${appState.sideBarOpen && !appState.sideBarSlim ? 'tw:ml-48' : appState.sideBarOpen && appState.sideBarSlim ? 'tw:ml-14' : ''} tw:w-full tw:h-full tw:bg-base-200 tw:relative tw:transition-all tw:duration-300`, children: children }));
|
1188
|
+
}
|
1189
|
+
|
1190
|
+
/**
|
1191
|
+
* @category Auth
|
1192
|
+
*/
|
1193
|
+
function LoginPage() {
|
1194
|
+
const [email, setEmail] = React.useState('');
|
1195
|
+
const [password, setPassword] = React.useState('');
|
1196
|
+
const { login, loading } = TagView.useAuth();
|
1197
|
+
const navigate = reactRouterDom.useNavigate();
|
1198
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
1199
|
+
const onLogin = async () => {
|
1200
|
+
await reactToastify.toast.promise(login({ email, password }), {
|
1201
|
+
success: {
|
1202
|
+
render({ data }) {
|
1203
|
+
navigate('/');
|
1204
|
+
return `Hi ${data?.first_name ? data.first_name : 'Traveler'}`;
|
1205
|
+
},
|
1206
|
+
// other options
|
1207
|
+
icon: '✌️',
|
1208
|
+
},
|
1209
|
+
error: {
|
1210
|
+
render({ data }) {
|
1211
|
+
return `${data}`;
|
1212
|
+
},
|
1213
|
+
autoClose: 10000,
|
1214
|
+
},
|
1215
|
+
pending: 'logging in ...',
|
1216
|
+
});
|
1217
|
+
};
|
1218
|
+
React.useEffect(() => {
|
1219
|
+
const keyDownHandler = (event) => {
|
1220
|
+
if (event.key === 'Enter') {
|
1221
|
+
event.preventDefault();
|
1222
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
1223
|
+
onLogin();
|
1224
|
+
}
|
1225
|
+
};
|
1226
|
+
document.addEventListener('keydown', keyDownHandler);
|
1227
|
+
return () => {
|
1228
|
+
document.removeEventListener('keydown', keyDownHandler);
|
1229
|
+
};
|
1230
|
+
}, [onLogin]);
|
1231
|
+
return (jsxRuntime.jsxs(TagView.MapOverlayPage, { backdrop: true, className: 'tw:max-w-xs tw:h-fit', children: [jsxRuntime.jsx("h2", { className: 'tw:text-2xl tw:font-semibold tw:mb-2 tw:text-center', children: "Login" }), jsxRuntime.jsx("input", { type: 'email', placeholder: 'E-Mail', value: email, onChange: (e) => setEmail(e.target.value), className: 'tw:input tw:input-bordered tw:w-full tw:max-w-xs' }), jsxRuntime.jsx("input", { type: 'password', placeholder: 'Password', onChange: (e) => setPassword(e.target.value), className: 'tw:input tw:input-bordered tw:w-full tw:max-w-xs' }), jsxRuntime.jsx("div", { className: 'tw:text-right tw:text-primary', children: jsxRuntime.jsx(reactRouterDom.Link, { to: '/reset-password', children: jsxRuntime.jsx("span", { className: 'tw:text-sm tw:inline-block tw:hover:text-primary tw:hover:underline tw:hover:cursor-pointer tw:transition tw:duration-200', children: "Forgot Password?" }) }) }), jsxRuntime.jsx("div", { className: 'tw:card-actions', children: jsxRuntime.jsx("button", { className: loading
|
1232
|
+
? 'tw:btn tw:btn-disabled tw:btn-block tw:btn-primary'
|
1233
|
+
: 'tw:btn tw:btn-primary tw:btn-block',
|
1234
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
1235
|
+
onClick: () => onLogin(), children: loading ? jsxRuntime.jsx("span", { className: 'tw:loading tw:loading-spinner' }) : 'Login' }) })] }));
|
1236
|
+
}
|
1237
|
+
|
1238
|
+
/**
|
1239
|
+
* @category Auth
|
1240
|
+
*/
|
1241
|
+
function SignupPage() {
|
1242
|
+
const [email, setEmail] = React.useState('');
|
1243
|
+
const [userName, setUserName] = React.useState('');
|
1244
|
+
const [password, setPassword] = React.useState('');
|
1245
|
+
const { register, loading } = TagView.useAuth();
|
1246
|
+
const navigate = reactRouterDom.useNavigate();
|
1247
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
1248
|
+
const onRegister = async () => {
|
1249
|
+
await reactToastify.toast.promise(register({ email, password }, userName), {
|
1250
|
+
success: {
|
1251
|
+
render({ data }) {
|
1252
|
+
navigate('/');
|
1253
|
+
return `Hi ${data?.first_name ? data.first_name : 'Traveler'}`;
|
1254
|
+
},
|
1255
|
+
// other options
|
1256
|
+
icon: '✌️',
|
1257
|
+
},
|
1258
|
+
error: {
|
1259
|
+
render({ data }) {
|
1260
|
+
return `${data}`;
|
1261
|
+
},
|
1262
|
+
autoClose: 10000,
|
1263
|
+
},
|
1264
|
+
pending: 'creating new user ...',
|
1265
|
+
});
|
1266
|
+
};
|
1267
|
+
React.useEffect(() => {
|
1268
|
+
const keyDownHandler = (event) => {
|
1269
|
+
if (event.key === 'Enter') {
|
1270
|
+
event.preventDefault();
|
1271
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
1272
|
+
onRegister();
|
1273
|
+
}
|
1274
|
+
};
|
1275
|
+
document.addEventListener('keydown', keyDownHandler);
|
1276
|
+
return () => {
|
1277
|
+
document.removeEventListener('keydown', keyDownHandler);
|
1278
|
+
};
|
1279
|
+
}, [onRegister]);
|
1280
|
+
return (jsxRuntime.jsxs(TagView.MapOverlayPage, { backdrop: true, className: 'tw:max-w-xs tw:h-fit', children: [jsxRuntime.jsx("h2", { className: 'tw:text-2xl tw:font-semibold tw:mb-2 tw:text-center', children: "Sign Up" }), jsxRuntime.jsx("input", { type: 'text', placeholder: 'Name', value: userName, onChange: (e) => setUserName(e.target.value), className: 'tw:input tw:input-bordered tw:w-full tw:max-w-xs' }), jsxRuntime.jsx("input", { type: 'email', placeholder: 'E-Mail', value: email, onChange: (e) => setEmail(e.target.value), className: 'tw:input tw:input-bordered tw:w-full tw:max-w-xs' }), jsxRuntime.jsx("input", { type: 'password', placeholder: 'Password', onChange: (e) => setPassword(e.target.value), className: 'tw:input tw:input-bordered tw:w-full tw:max-w-xs' }), jsxRuntime.jsx("div", { className: 'tw:card-actions tw:mt-4', children: jsxRuntime.jsx("button", { className: loading
|
1281
|
+
? 'tw:btn tw:btn-disabled tw:btn-block tw:btn-primary'
|
1282
|
+
: 'tw:btn tw:btn-primary tw:btn-block',
|
1283
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
1284
|
+
onClick: () => onRegister(), children: loading ? jsxRuntime.jsx("span", { className: 'tw:loading tw:loading-spinner' }) : 'Sign Up' }) })] }));
|
1285
|
+
}
|
1286
|
+
|
1287
|
+
/**
|
1288
|
+
* @category Auth
|
1289
|
+
*/
|
1290
|
+
function RequestPasswordPage({ resetUrl }) {
|
1291
|
+
const [email, setEmail] = React.useState('');
|
1292
|
+
const { requestPasswordReset, loading } = TagView.useAuth();
|
1293
|
+
const navigate = reactRouterDom.useNavigate();
|
1294
|
+
const onReset = async () => {
|
1295
|
+
await reactToastify.toast.promise(requestPasswordReset(email, resetUrl), {
|
1296
|
+
success: {
|
1297
|
+
render() {
|
1298
|
+
navigate('/');
|
1299
|
+
return 'Check your mailbox';
|
1300
|
+
},
|
1301
|
+
// other options
|
1302
|
+
icon: '📬',
|
1303
|
+
},
|
1304
|
+
error: {
|
1305
|
+
render({ data }) {
|
1306
|
+
return `${data}`;
|
1307
|
+
},
|
1308
|
+
},
|
1309
|
+
pending: 'sending email ...',
|
1310
|
+
});
|
1311
|
+
};
|
1312
|
+
return (jsxRuntime.jsxs(TagView.MapOverlayPage, { backdrop: true, className: 'tw:max-w-xs tw:h-fit', children: [jsxRuntime.jsx("h2", { className: 'tw:text-2xl tw:font-semibold tw:mb-2 tw:text-center', children: "Reset Password" }), jsxRuntime.jsx("input", { type: 'email', placeholder: 'E-Mail', value: email, onChange: (e) => setEmail(e.target.value), className: 'tw:input tw:input-bordered tw:w-full tw:max-w-xs' }), jsxRuntime.jsx("div", { className: 'tw:card-actions tw:mt-4', children: jsxRuntime.jsx("button", { className: loading
|
1313
|
+
? 'tw:btn tw:btn-disabled tw:btn-block tw:btn-primary'
|
1314
|
+
: 'tw:btn tw:btn-primary tw:btn-block',
|
1315
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
1316
|
+
onClick: () => onReset(), children: loading ? jsxRuntime.jsx("span", { className: 'tw:loading tw:loading-spinner' }) : 'Send' }) })] }));
|
1317
|
+
}
|
1318
|
+
|
1319
|
+
/**
|
1320
|
+
* @category Auth
|
1321
|
+
*/
|
1322
|
+
function SetNewPasswordPage() {
|
1323
|
+
const [password, setPassword] = React.useState('');
|
1324
|
+
const { passwordReset, loading } = TagView.useAuth();
|
1325
|
+
const navigate = reactRouterDom.useNavigate();
|
1326
|
+
const onReset = async () => {
|
1327
|
+
const token = window.location.search.split('token=')[1];
|
1328
|
+
await reactToastify.toast.promise(passwordReset(token, password), {
|
1329
|
+
success: {
|
1330
|
+
render() {
|
1331
|
+
navigate('/');
|
1332
|
+
return 'New password set';
|
1333
|
+
},
|
1334
|
+
},
|
1335
|
+
error: {
|
1336
|
+
render({ data }) {
|
1337
|
+
return `${data}`;
|
1338
|
+
},
|
1339
|
+
},
|
1340
|
+
pending: 'setting password ...',
|
1341
|
+
});
|
1342
|
+
};
|
1343
|
+
return (jsxRuntime.jsxs(TagView.MapOverlayPage, { backdrop: true, className: 'tw:max-w-xs tw:h-fit', children: [jsxRuntime.jsx("h2", { className: 'tw:text-2xl tw:font-semibold tw:mb-2 tw:text-center', children: "Set new Password" }), jsxRuntime.jsx("input", { type: 'password', placeholder: 'Password', onChange: (e) => setPassword(e.target.value), className: 'tw:input tw:input-bordered tw:w-full tw:max-w-xs' }), jsxRuntime.jsx("div", { className: 'tw:card-actions tw:mt-4', children: jsxRuntime.jsx("button", { className: loading
|
1344
|
+
? 'tw:btn tw:btn-disabled tw:btn-block tw:btn-primary'
|
1345
|
+
: 'tw:btn tw:btn-primary tw:btn-block',
|
1346
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
1347
|
+
onClick: () => onReset(), children: loading ? jsxRuntime.jsx("span", { className: 'tw:loading tw:loading-spinner' }) : 'Set' }) })] }));
|
1348
|
+
}
|
1349
|
+
|
1350
|
+
/**
|
1351
|
+
* @category Gaming
|
1352
|
+
*/
|
1353
|
+
function Modal({ children, showOnStartup, }) {
|
1354
|
+
React.useEffect(() => {
|
1355
|
+
if (showOnStartup) {
|
1356
|
+
window.my_modal_3.showModal();
|
1357
|
+
}
|
1358
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
1359
|
+
}, []);
|
1360
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs("dialog", { id: 'my_modal_3', className: 'tw:modal tw:transition-all tw:duration-300', children: [jsxRuntime.jsxs("form", { method: 'dialog', className: 'tw:modal-box tw:transition-none', children: [jsxRuntime.jsx("button", { className: 'tw:btn tw:btn-sm tw:btn-circle tw:btn-ghost tw:absolute tw:right-2 tw:top-2 tw:focus:outline-hidden', children: "\u2715" }), children] }), jsxRuntime.jsx("form", { method: 'dialog', className: 'tw:modal-backdrop', children: jsxRuntime.jsx("button", { children: "close" }) })] }) }));
|
1361
|
+
}
|
1362
|
+
|
1363
|
+
/**
|
1364
|
+
* @category Gaming
|
1365
|
+
*/
|
1366
|
+
function Quests() {
|
1367
|
+
const questsOpen = useQuestsOpen();
|
1368
|
+
const setQuestsOpen = useSetQuestOpen();
|
1369
|
+
const { isAuthenticated, user } = TagView.useAuth();
|
1370
|
+
React.useEffect(() => {
|
1371
|
+
setQuestsOpen(false);
|
1372
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
1373
|
+
}, []);
|
1374
|
+
const [profile, setProfie] = React.useState();
|
1375
|
+
const items = TagView.useItems();
|
1376
|
+
React.useEffect(() => {
|
1377
|
+
setProfie(items.find((i) => i.user_created?.id === user?.id &&
|
1378
|
+
i.layer?.userProfileLayer &&
|
1379
|
+
i.user_created?.id != null));
|
1380
|
+
}, [items, user]);
|
1381
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: questsOpen ? (jsxRuntime.jsx("div", { className: 'tw:card tw:w-48 tw:bg-base-100 tw:shadow-xl tw:absolute tw:bottom-4 tw:left-4 tw:z-2000', children: jsxRuntime.jsxs("div", { className: 'tw:card-body tw:p-4 tw:pt-0', children: [jsxRuntime.jsx("div", { className: 'tw:card-actions tw:justify-end', children: jsxRuntime.jsx("label", { className: 'tw:btn tw:btn-sm tw:btn-circle tw:btn-ghost tw:absolute tw:right-1 tw:top-1', onClick: () => setQuestsOpen(false), children: "\u2715" }) }), jsxRuntime.jsxs("h2", { className: 'tw:card-title tw:m-auto ', children: ["Level 1", jsxRuntime.jsx(QuestionMarkIcon, {})] }), jsxRuntime.jsxs("ul", { className: 'tw:flex-row', children: [jsxRuntime.jsx("li", { children: jsxRuntime.jsxs("label", { className: 'tw:label tw:justify-normal tw:pt-1 tw:pb-0', children: [jsxRuntime.jsx("input", { type: 'checkbox', readOnly: true, className: 'tw:checkbox tw:checkbox-xs tw:checkbox-success', checked: isAuthenticated || false }), jsxRuntime.jsx("span", { className: 'tw:text-sm tw:label-text tw:mx-2', children: "Sign Up" })] }) }), jsxRuntime.jsx("li", { children: jsxRuntime.jsxs("label", { className: 'tw:label tw:justify-normal tw:pt-1 tw:pb-0', children: [jsxRuntime.jsx("input", { type: 'checkbox', readOnly: true, className: 'tw:checkbox tw:checkbox-xs tw:checkbox-success', checked: !!profile?.text }), jsxRuntime.jsx("span", { className: 'tw:text-sm tw:label-text tw:mx-2', children: "Fill Profile" })] }) }), jsxRuntime.jsx("li", { children: jsxRuntime.jsxs("label", { className: 'tw:label tw:justify-normal tw:pt-1 tw:pb-0', children: [jsxRuntime.jsx("input", { type: 'checkbox', readOnly: true, className: 'tw:checkbox tw:checkbox-xs tw:checkbox-success', checked: !!profile?.image }), jsxRuntime.jsx("span", { className: 'tw:text-sm tw:label-text tw:mx-2', children: "Upload Avatar" })] }) })] }), ' '] }) })) : ('') }));
|
1382
|
+
}
|
1383
|
+
|
1384
|
+
function Subtitle({ styleClass, children }) {
|
1385
|
+
return jsxRuntime.jsx("div", { className: `tw:text-xl tw:font-semibold ${styleClass}`, children: children });
|
1386
|
+
}
|
1387
|
+
|
1388
|
+
/**
|
1389
|
+
* @category Templates
|
1390
|
+
*/
|
1391
|
+
function TitleCard({ title, hideTitle, children, topMargin, TopSideButtons, className, }) {
|
1392
|
+
return (jsxRuntime.jsxs("div", { className: 'card tw:w-full tw:p-6 tw:bg-base-100 tw:shadow-xl tw:h-fit tw:mb-4 ' +
|
1393
|
+
(className ?? '') +
|
1394
|
+
' ' +
|
1395
|
+
(topMargin ?? 'tw:mt-6'), children: [!hideTitle && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs(Subtitle, { styleClass: TopSideButtons ? 'tw:inline-block' : '', children: [title, TopSideButtons && (jsxRuntime.jsx("div", { className: 'tw:inline-block tw:float-right', children: TopSideButtons }))] }), jsxRuntime.jsx("div", { className: 'divider tw:mt-2' })] })), jsxRuntime.jsx("div", { className: 'tw:h-full tw:bg-transparent tw:w-full tw:pb-6 tw:bg-base-100', children: children })] }));
|
1396
|
+
}
|
1397
|
+
|
1398
|
+
/**
|
1399
|
+
* @category Templates
|
1400
|
+
*/
|
1401
|
+
function CardPage({ title, hideTitle, children, parents, }) {
|
1402
|
+
return (jsxRuntime.jsx("main", { className: 'tw:flex-1 tw:overflow-y-auto tw:overflow-x-hidden tw:pt-2 tw:px-6 tw:min-w-80 tw:flex tw:justify-center', children: jsxRuntime.jsxs("div", { className: 'tw:w-full tw:xl:max-w-6xl ', children: [jsxRuntime.jsx("div", { className: 'tw:text-sm breadcrumbs', children: jsxRuntime.jsxs("ul", { children: [jsxRuntime.jsx("li", { children: jsxRuntime.jsx(reactRouterDom.Link, { to: '/', children: "Home" }) }), parents?.map((b, i) => (jsxRuntime.jsx("li", { children: jsxRuntime.jsx(reactRouterDom.Link, { to: b.path, children: b.name }) }, i))), jsxRuntime.jsx("li", { children: title })] }) }), jsxRuntime.jsx(TitleCard, { hideTitle: hideTitle, title: title, topMargin: 'tw:my-2', className: ' tw:mb-4', children: children })] }) }));
|
1403
|
+
}
|
1404
|
+
|
1405
|
+
/**
|
1406
|
+
* @category Templates
|
1407
|
+
*/
|
1408
|
+
const SelectUser = () => {
|
1409
|
+
const appState = TagView.useAppState();
|
1410
|
+
const items = TagView.useItems();
|
1411
|
+
const users = items.filter((i) => i.layer?.userProfileLayer);
|
1412
|
+
const [selectedUsers, setSelectedUsers] = React.useState([]);
|
1413
|
+
return (jsxRuntime.jsxs(TagView.MapOverlayPage, { backdrop: true, className: 'tw:h-3/4 tw:w-80', children: [jsxRuntime.jsx("div", { className: 'tw:text-center tw:text-xl tw:font-bold tw:mb-4', children: "Gratitude to ..." }), jsxRuntime.jsx("div", { className: 'tw:overflow-x-auto tw:w-full fade', children: jsxRuntime.jsx("table", { className: 'tw:table tw:w-full', children: jsxRuntime.jsx("tbody", { children: users.map((u, k) => {
|
1414
|
+
return (jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("td", { children: jsxRuntime.jsx("input", { type: 'checkbox', onChange: () => setSelectedUsers((prev) => [...prev, u.id]), className: 'checkbox checkbox-sm' }) }), jsxRuntime.jsx("td", { children: jsxRuntime.jsxs("div", { className: 'tw:flex tw:items-center tw:space-x-3', children: [u.image ? (jsxRuntime.jsx("div", { className: 'tw:avatar', children: jsxRuntime.jsx("div", { className: 'tw:mask tw:mask-circle tw:w-8 tw:h-8', children: jsxRuntime.jsx("img", { src: appState.assetsApi.url + u.image + '?width=40&heigth=40', alt: 'Avatar' }) }) })) : (jsxRuntime.jsx("div", { className: 'tw:mask tw:mask-circle tw:text-xl tw:md:text-2xl tw:bg-slate-200 tw:rounded-full tw:w-8 tw:h-8' })), jsxRuntime.jsx("div", { children: jsxRuntime.jsx("div", { className: 'tw:font-bold', children: u.name }) })] }) })] }, k));
|
1415
|
+
}) }) }) }), jsxRuntime.jsx("div", { className: 'tw:w-full tw:grid tw:mt-4', children: jsxRuntime.jsx(reactRouterDom.Link, { className: 'tw:place-self-center ', to: '/attestation-form' + '?to=' + selectedUsers.map((u) => u, ','), children: jsxRuntime.jsx("button", { className: 'tw:btn tw:px-8', children: "Next" }) }) })] }));
|
1416
|
+
};
|
1417
|
+
|
1418
|
+
/**
|
1419
|
+
* @category Map
|
1420
|
+
*/
|
1421
|
+
const PopupTextAreaInput$1 = ({ dataField, placeholder, style, item, }) => {
|
1422
|
+
return (jsxRuntime.jsx(TagView.TextAreaInput, { defaultValue: item?.text ? item.text : '', dataField: dataField, placeholder: placeholder, inputStyle: style }));
|
1423
|
+
};
|
1424
|
+
|
1425
|
+
/**
|
1426
|
+
* @category Map
|
1427
|
+
*/
|
1428
|
+
const PopupTextInput$1 = ({ dataField, placeholder, style, item, }) => {
|
1429
|
+
return (jsxRuntime.jsx(TagView.TextInput, { defaultValue: item?.name ? item.name : '', dataField: dataField, placeholder: placeholder, inputStyle: style, type: 'text', containerStyle: 'tw:mt-4 tw:mb-2' }));
|
1430
|
+
};
|
1431
|
+
|
1432
|
+
/**
|
1433
|
+
* @category Map
|
1434
|
+
*/
|
1435
|
+
const PopupCheckboxInput$1 = ({ dataField, label, item, }) => {
|
1436
|
+
return (jsxRuntime.jsxs("label", { htmlFor: item?.id, className: 'tw:label tw:justify-normal tw:pt-1 tw:pb-1', children: [jsxRuntime.jsx("input", { id: item?.id, type: 'checkbox', name: dataField, className: 'tw:checkbox tw:checkbox-xs tw:checkbox-success', checked: item?.public_edit }), jsxRuntime.jsx("span", { className: 'tw:text-sm tw:label-text tw:mx-2 tw:cursor-pointer', children: label })] }));
|
1437
|
+
};
|
1438
|
+
|
1439
|
+
/**
|
1440
|
+
* @category Map
|
1441
|
+
*/
|
1442
|
+
const PopupButton$1 = ({ url, parameterField, text, item, }) => {
|
1443
|
+
const params = new URLSearchParams(window.location.search);
|
1444
|
+
const getItemTags = TagView.useGetItemTags();
|
1445
|
+
return (jsxRuntime.jsx(reactRouterDom.Link, { to: `${url}/${parameterField ? item?.id : ''}?${params}`, children: jsxRuntime.jsx("button", { style: {
|
1446
|
+
backgroundColor: `${item?.color ?? (item && (getItemTags(item) && getItemTags(item)[0] && getItemTags(item)[0].color ? getItemTags(item)[0].color : (item?.layer?.markerDefaultColor ?? '#000')))}`,
|
1447
|
+
}, className: 'tw:btn tw:text-white tw:btn-sm tw:float-right tw:mt-1', children: text }) }));
|
1448
|
+
};
|
1449
|
+
|
1450
|
+
function PlusButton({ layer, triggerAction, color, collection = 'items', }) {
|
1451
|
+
const hasUserPermission = TagView.useHasUserPermission();
|
1452
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: hasUserPermission(collection, 'create', undefined, layer) && (jsxRuntime.jsx("button", { tabIndex: 0, className: 'tw:btn tw:btn-circle tw:shadow tw:z-3000 tw:absolute tw:right-4 tw:bottom-4', onClick: () => {
|
1453
|
+
triggerAction();
|
1454
|
+
}, style: { backgroundColor: color, color: '#fff' }, children: jsxRuntime.jsx(TagView.ForwardRef$1, { className: 'tw:w-5 tw:h-5 tw:stroke-[2.5]' }) })) }));
|
1455
|
+
}
|
1456
|
+
|
1457
|
+
const DateUserInfo = ({ item }) => {
|
1458
|
+
const [infoExpanded, setInfoExpanded] = React.useState(false);
|
1459
|
+
return (jsxRuntime.jsxs("div", { className: 'tw:flex tw:-mb-1 tw:flex-row tw:mr-2 tw:-mt-2', onClick: (e) => e.stopPropagation(), children: [infoExpanded ? (jsxRuntime.jsx("p", { className: 'tw:italic tw:min-h-[21px] tw:my-0! tw:text-gray-500', onClick: () => setInfoExpanded(false), children: `${item.date_updated && item.date_updated !== item.date_created ? 'updated' : 'posted'} ${item.user_created?.first_name ? `by ${item.user_created.first_name}` : ''} ${item.date_updated ? TagView.timeAgo(item.date_updated) : TagView.timeAgo(item.date_created)}` })) : (jsxRuntime.jsx("p", { className: 'tw:my-0! tw:min-h-[21px] tw:font-bold tw:cursor-pointer tw:text-gray-500', onClick: () => setInfoExpanded(true), children: "\u24D8" })), jsxRuntime.jsx("div", { className: 'tw:grow ' })] }));
|
1460
|
+
};
|
1461
|
+
|
1462
|
+
const ItemCard = ({ i, loading, url, deleteCallback, }) => {
|
1463
|
+
const navigate = reactRouterDom.useNavigate();
|
1464
|
+
const windowDimensions = TagView.useWindowDimensions();
|
1465
|
+
const map = reactLeaflet.useMap();
|
1466
|
+
const setSelectPosition = TagView.useSetSelectPosition();
|
1467
|
+
return (jsxRuntime.jsxs("div", { 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: () => {
|
1468
|
+
// We could have an onClick callback instead
|
1469
|
+
const params = new URLSearchParams(window.location.search);
|
1470
|
+
if (windowDimensions.width < 786 && i.position)
|
1471
|
+
navigate('/' + i.id + `${params.size > 0 ? `?${params.toString()}` : ''}`);
|
1472
|
+
else
|
1473
|
+
navigate(url + i.id + `${params.size > 0 ? `?${params.toString()}` : ''}`);
|
1474
|
+
}, children: [jsxRuntime.jsx(TagView.HeaderView, { loading: loading, item: i, api: i.layer?.api, editCallback: () => navigate('/edit-item/' + i.id), setPositionCallback: () => {
|
1475
|
+
map.closePopup();
|
1476
|
+
setSelectPosition(i);
|
1477
|
+
navigate('/');
|
1478
|
+
}, deleteCallback: () => deleteCallback(i) }), jsxRuntime.jsxs("div", { className: 'tw:overflow-y-auto tw:overflow-x-hidden tw:max-h-64 fade', children: [i.layer?.itemType.show_start_end && jsxRuntime.jsx(TagView.StartEndView, { item: i }), i.layer?.itemType.show_text && jsxRuntime.jsx(TagView.TextView, { truncate: true, text: i.text, itemId: i.id })] }), jsxRuntime.jsx(DateUserInfo, { item: i })] }));
|
1479
|
+
};
|
1480
|
+
|
1481
|
+
/**
|
1482
|
+
* @category Templates
|
1483
|
+
*/
|
1484
|
+
const OverlayItemsIndexPage = ({ url, layerName, parameterField, }) => {
|
1485
|
+
const [loading, setLoading] = React.useState(false);
|
1486
|
+
const [addItemPopupOpen, setAddItemPopupOpen] = React.useState(false);
|
1487
|
+
const tabRef = React.useRef(null);
|
1488
|
+
function scroll() {
|
1489
|
+
tabRef.current?.scrollIntoView();
|
1490
|
+
}
|
1491
|
+
React.useEffect(() => {
|
1492
|
+
if (addItemPopupOpen) {
|
1493
|
+
scroll();
|
1494
|
+
}
|
1495
|
+
}, [addItemPopupOpen]);
|
1496
|
+
const tags = TagView.useTags();
|
1497
|
+
const addTag = TagView.useAddTag();
|
1498
|
+
const { user } = TagView.useAuth();
|
1499
|
+
const items = TagView.useItems();
|
1500
|
+
const addItem = TagView.useAddItem();
|
1501
|
+
const removeItem = TagView.useRemoveItem();
|
1502
|
+
const layers = TagView.useLayers();
|
1503
|
+
const filterTags = TagView.useFilterTags();
|
1504
|
+
const getItemTags = TagView.useGetItemTags();
|
1505
|
+
const layer = layers.find((l) => l.name === layerName);
|
1506
|
+
const submitNewItem = async (evt) => {
|
1507
|
+
evt.preventDefault();
|
1508
|
+
const formItem = {};
|
1509
|
+
Array.from(evt.target).forEach((input) => {
|
1510
|
+
if (input.name) {
|
1511
|
+
formItem[input.name] = input.value;
|
1512
|
+
}
|
1513
|
+
});
|
1514
|
+
setLoading(true);
|
1515
|
+
if (formItem.text) {
|
1516
|
+
formItem.text
|
1517
|
+
.toLocaleLowerCase()
|
1518
|
+
.match(TagView.hashTagRegex)
|
1519
|
+
?.map((tag) => {
|
1520
|
+
if (!tags.find((t) => t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase())) {
|
1521
|
+
addTag({ id: crypto.randomUUID(), name: tag.slice(1), color: TagView.randomColor() });
|
1522
|
+
}
|
1523
|
+
return null;
|
1524
|
+
});
|
1525
|
+
}
|
1526
|
+
const uuid = crypto.randomUUID();
|
1527
|
+
let success = false;
|
1528
|
+
try {
|
1529
|
+
await layer?.api?.createItem({ ...formItem, id: uuid });
|
1530
|
+
success = true;
|
1531
|
+
// eslint-disable-next-line no-catch-all/no-catch-all
|
1532
|
+
}
|
1533
|
+
catch (error) {
|
1534
|
+
reactToastify.toast.error(error.toString());
|
1535
|
+
}
|
1536
|
+
if (success) {
|
1537
|
+
reactToastify.toast.success('New item created');
|
1538
|
+
}
|
1539
|
+
addItem({ ...formItem, user_created: user ?? undefined, id: uuid, layer, public_edit: !user });
|
1540
|
+
setLoading(false);
|
1541
|
+
setAddItemPopupOpen(false);
|
1542
|
+
};
|
1543
|
+
const deleteItem = async (item) => {
|
1544
|
+
setLoading(true);
|
1545
|
+
let success = false;
|
1546
|
+
try {
|
1547
|
+
await layer?.api?.deleteItem(item.id);
|
1548
|
+
success = true;
|
1549
|
+
// eslint-disable-next-line no-catch-all/no-catch-all
|
1550
|
+
}
|
1551
|
+
catch (error) {
|
1552
|
+
reactToastify.toast.error(error.toString());
|
1553
|
+
}
|
1554
|
+
if (success) {
|
1555
|
+
reactToastify.toast.success('Item deleted');
|
1556
|
+
}
|
1557
|
+
removeItem(item);
|
1558
|
+
setLoading(false);
|
1559
|
+
};
|
1560
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(TagView.MapOverlayPage, { className: 'tw:rounded-none tw:overflow-y-auto tw:bg-base-200 tw:p-4!', children: jsxRuntime.jsxs("div", { className: 'tw:flex tw:flex-col tw:h-full', children: [jsxRuntime.jsx("div", { className: 'tw:flex-none', children: jsxRuntime.jsxs(Control, { position: 'topLeft', zIndex: '1000', absolute: false, children: [jsxRuntime.jsx(SearchControl, {}), jsxRuntime.jsx(TagsControl, {})] }) }), jsxRuntime.jsx("div", { className: 'tw:overflow-scroll fade tw:flex-1', children: jsxRuntime.jsxs("div", { className: 'tw:columns-1 tw:md:columns-2 tw:lg:columns-3 tw:2xl:columns-4 tw:gap-6 tw:pt-4', children: [items
|
1561
|
+
.filter((i) => i.layer?.name === layerName)
|
1562
|
+
.filter((item) => filterTags.length === 0
|
1563
|
+
? item
|
1564
|
+
: filterTags.some((tag) => getItemTags(item).some((filterTag) => filterTag.name.toLocaleLowerCase() === tag.name.toLocaleLowerCase())))
|
1565
|
+
.sort((a, b) => {
|
1566
|
+
// Convert date_created to milliseconds, handle undefined by converting to lowest possible date (0 milliseconds)
|
1567
|
+
const dateA = a.date_updated
|
1568
|
+
? new Date(a.date_updated).getTime()
|
1569
|
+
: a.date_created
|
1570
|
+
? new Date(a.date_created).getTime()
|
1571
|
+
: 0;
|
1572
|
+
const dateB = b.date_updated
|
1573
|
+
? new Date(b.date_updated).getTime()
|
1574
|
+
: b.date_created
|
1575
|
+
? new Date(b.date_created).getTime()
|
1576
|
+
: 0;
|
1577
|
+
return dateB - dateA; // Subtracts milliseconds which are numbers
|
1578
|
+
})
|
1579
|
+
.map((i, k) => (jsxRuntime.jsx("div", { className: 'tw:break-inside-avoid tw:mb-6', children: jsxRuntime.jsx(ItemCard, { i: i, loading: loading, url: url, deleteCallback: () => deleteItem(i) }) }, k))), addItemPopupOpen && (jsxRuntime.jsx("form", { ref: tabRef, autoComplete: 'off', onSubmit: (e) => submitNewItem(e), children: jsxRuntime.jsxs("div", { className: 'tw:cursor-pointer tw:break-inside-avoid card tw:border-[1px] tw:border-base-300 card-body tw:shadow-xl tw:bg-base-100 tw:text-base-content tw:p-6 tw:mb-10', children: [jsxRuntime.jsx("label", { className: 'tw:btn tw:btn-sm tw:rounded-2xl tw:btn-circle tw:btn-ghost tw:hover:bg-transparent tw:absolute tw:right-0 tw:top-0 tw:text-gray-600', onClick: () => setAddItemPopupOpen(false), children: jsxRuntime.jsx("p", { className: 'tw:text-center', children: "\u2715" }) }), jsxRuntime.jsx("div", { className: 'tw:flex tw:justify-center tw:mb-4', children: jsxRuntime.jsx("b", { className: 'tw:text-xl tw:text-center tw:font-bold', children: layer?.menuText }) }), jsxRuntime.jsx(TagView.TextInput, { type: 'text', placeholder: 'Name', dataField: 'name', defaultValue: '', inputStyle: '' }), layer?.itemType.show_start_end_input && (jsxRuntime.jsx(TagView.PopupStartEndInput, { containerStyle: 'tw:mt-3', showLabels: false })), jsxRuntime.jsx("div", { className: 'tw:flex tw:justify-center', children: jsxRuntime.jsx("button", { className: loading
|
1580
|
+
? 'btn btn-disabled tw:mt-5 tw:place-self-center'
|
1581
|
+
: 'btn tw:mt-5 tw:place-self-center', type: 'submit', children: loading ? jsxRuntime.jsx("span", { className: 'loading loading-spinner' }) : 'Save' }) })] }) }))] }) })] }) }), !layer?.userProfileLayer && (jsxRuntime.jsx(PlusButton, { layer: layer, triggerAction: () => {
|
1582
|
+
setAddItemPopupOpen(true);
|
1583
|
+
scroll();
|
1584
|
+
}, color: '#777', collection: 'items' }))] }));
|
1585
|
+
};
|
1586
|
+
|
1587
|
+
const EmojiPicker = ({ selectedEmoji, selectedColor, selectedShape, setSelectedEmoji, setSelectedColor, setSelectedShape, }) => {
|
1588
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
1589
|
+
const emojis = [
|
1590
|
+
'❤️',
|
1591
|
+
'🙏',
|
1592
|
+
'👍',
|
1593
|
+
'🌻',
|
1594
|
+
'✨',
|
1595
|
+
'☀️',
|
1596
|
+
'🔥',
|
1597
|
+
'🪵',
|
1598
|
+
'💧',
|
1599
|
+
'🎶',
|
1600
|
+
'🎨',
|
1601
|
+
'🍄',
|
1602
|
+
'📝',
|
1603
|
+
'✉️',
|
1604
|
+
'🧩',
|
1605
|
+
'💡',
|
1606
|
+
'🎓',
|
1607
|
+
'💬',
|
1608
|
+
'🛠',
|
1609
|
+
'💻',
|
1610
|
+
'🕹',
|
1611
|
+
'🖨',
|
1612
|
+
'🚐',
|
1613
|
+
'🛒',
|
1614
|
+
'⚽️',
|
1615
|
+
'🧵',
|
1616
|
+
'👀',
|
1617
|
+
'🌱',
|
1618
|
+
'🏕',
|
1619
|
+
'💪',
|
1620
|
+
'🎁',
|
1621
|
+
'🏹',
|
1622
|
+
'🥕',
|
1623
|
+
'🥇',
|
1624
|
+
'🥈',
|
1625
|
+
'🥉',
|
1626
|
+
];
|
1627
|
+
const shapes = ['squircle', 'circle', 'hexagon-2'];
|
1628
|
+
const colors = [
|
1629
|
+
'#FF99C8',
|
1630
|
+
'#fff0d6',
|
1631
|
+
'#FCF6BD',
|
1632
|
+
'#D0F4DE',
|
1633
|
+
'#A9DEF9',
|
1634
|
+
'#E4C1F9',
|
1635
|
+
'#de324c',
|
1636
|
+
'#f4895f',
|
1637
|
+
'#f8e16f',
|
1638
|
+
'#95cf92',
|
1639
|
+
'#369acc',
|
1640
|
+
'#9656a2',
|
1641
|
+
];
|
1642
|
+
const toggleDropdown = () => {
|
1643
|
+
setIsOpen(!isOpen);
|
1644
|
+
};
|
1645
|
+
const selectEmoji = (emoji) => {
|
1646
|
+
setSelectedEmoji(emoji);
|
1647
|
+
setIsOpen(false);
|
1648
|
+
};
|
1649
|
+
const selectShape = (shape) => {
|
1650
|
+
setSelectedShape(shape);
|
1651
|
+
setIsOpen(false);
|
1652
|
+
};
|
1653
|
+
const selectColor = (color) => {
|
1654
|
+
setSelectedColor(color);
|
1655
|
+
setIsOpen(false);
|
1656
|
+
};
|
1657
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { onClick: toggleDropdown, className: `tw:cursor-pointer ${selectedEmoji === 'select badge' ? 'tw:text-sm tw:p-9! tw:text-center ' : 'tw:text-6xl'} tw:mask tw:mask-${selectedShape} tw:p-6`, style: { backgroundColor: selectedColor }, children: selectedEmoji }), isOpen && (jsxRuntime.jsxs("div", { className: 'tw:absolute tw:z-3000 tw:top-0 tw:left-1/2 tw:transform tw:-translate-x-1/2 tw:mt-12 tw:bg-base-100 tw:rounded-2xl tw:shadow-lg tw:p-2 tw:w-full', children: [jsxRuntime.jsx("div", { className: 'tw:grid tw:grid-cols-6 tw:gap-2 tw:pb-2', children: emojis.map((emoji) => (jsxRuntime.jsx("button", { onClick: () => selectEmoji(emoji), className: `tw:cursor-pointer tw:text-2xl tw:p-2 tw:hover:bg-base-200 tw:rounded-md ${emoji === selectedEmoji ? 'tw:bg-base-300' : ''}`, children: emoji }, emoji))) }), jsxRuntime.jsx("hr", {}), jsxRuntime.jsx("div", { className: 'tw:grid tw:grid-cols-3 tw:gap-2 tw:py-2', children: shapes.map((shape) => (jsxRuntime.jsx("div", { className: `tw:cursor-pointer tw:hover:bg-base-200 tw:rounded-md tw:p-2 ${shape === selectedShape ? 'tw:bg-base-300' : ''}`, onClick: () => selectShape(shape), children: jsxRuntime.jsx("div", { className: `tw:h-12 tw:w-full tw:mask ${shape === 'squircle' ? 'tw:mask-squircle' : shape === 'circle' ? 'tw:mask-circle' : 'tw:mask-hexagon-2'} tw:bg-neutral-content` }) }, shape))) }), jsxRuntime.jsx("hr", {}), jsxRuntime.jsx("div", { className: 'tw:grid tw:grid-cols-6 tw:gap-2 tw:py-2 tw:px-6', children: colors.map((color) => (jsxRuntime.jsx("div", { className: `tw:cursor-pointer tw:hover:bg-base-200 tw:rounded-md tw:p-2 tw:flex tw:justify-center tw:items-center ${color === selectedColor ? 'tw:bg-base-300' : ''}`, onClick: () => selectColor(color), children: jsxRuntime.jsx("div", { className: `tw:h-8 tw:w-8 tw:rounded-full`, style: { backgroundColor: color } }) }, color))) })] }))] }));
|
1658
|
+
};
|
1659
|
+
|
1660
|
+
/**
|
1661
|
+
* @category Templates
|
1662
|
+
*/
|
1663
|
+
const AttestationForm = ({ api }) => {
|
1664
|
+
const items = TagView.useItems();
|
1665
|
+
const appState = TagView.useAppState();
|
1666
|
+
const [users, setUsers] = React.useState();
|
1667
|
+
const navigate = reactRouterDom.useNavigate();
|
1668
|
+
React.useEffect(() => {
|
1669
|
+
const params = new URLSearchParams(location.search);
|
1670
|
+
const toUserIds = params.get('to');
|
1671
|
+
setUsers(items.filter((i) => toUserIds?.includes(i.id)));
|
1672
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
1673
|
+
}, [items, location]);
|
1674
|
+
const [inputValue, setInputValue] = React.useState('');
|
1675
|
+
const inputRef = React.useRef(null);
|
1676
|
+
React.useEffect(() => {
|
1677
|
+
if (inputRef.current) {
|
1678
|
+
inputRef.current.style.width = 'auto';
|
1679
|
+
inputRef.current.style.width = `${inputRef.current.scrollWidth + 20}px`;
|
1680
|
+
}
|
1681
|
+
}, [inputValue]);
|
1682
|
+
const handleChange = (event) => {
|
1683
|
+
setInputValue(event.target.value);
|
1684
|
+
};
|
1685
|
+
const sendAttestation = () => {
|
1686
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
1687
|
+
const to = [];
|
1688
|
+
users?.map((u) => to.push({ directus_users_id: u.user_created?.id }));
|
1689
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
1690
|
+
api?.createItem &&
|
1691
|
+
reactToastify.toast
|
1692
|
+
.promise(api.createItem({
|
1693
|
+
text: inputValue,
|
1694
|
+
emoji: selectedEmoji,
|
1695
|
+
color: selectedColor,
|
1696
|
+
shape: selectedShape,
|
1697
|
+
to,
|
1698
|
+
}), {
|
1699
|
+
pending: 'creating attestation ...',
|
1700
|
+
success: 'Attestation created',
|
1701
|
+
error: {
|
1702
|
+
render({ data }) {
|
1703
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
1704
|
+
return `${data}`;
|
1705
|
+
},
|
1706
|
+
},
|
1707
|
+
})
|
1708
|
+
.then(() => navigate('/item/' +
|
1709
|
+
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
1710
|
+
items.find((i) =>
|
1711
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
1712
|
+
i.user_created?.id === to[0].directus_users_id &&
|
1713
|
+
i.layer?.userProfileLayer === true)?.id +
|
1714
|
+
'?tab=2'));
|
1715
|
+
};
|
1716
|
+
const [selectedEmoji, setSelectedEmoji] = React.useState('select badge');
|
1717
|
+
const [selectedShape, setSelectedShape] = React.useState('circle');
|
1718
|
+
const [selectedColor, setSelectedColor] = React.useState('#fff0d6');
|
1719
|
+
return (jsxRuntime.jsxs(TagView.MapOverlayPage, { backdrop: true, className: 'tw:h-fit tw:min-h-56 tw:w-96', children: [jsxRuntime.jsx("div", { className: 'tw:text-center tw:text-xl tw:font-bold', children: "Gratitude" }), jsxRuntime.jsx("div", { className: 'tw:text-center tw:text-base tw:text-gray-400', children: "to" }), jsxRuntime.jsx("div", { className: 'tw:flex tw:flex-row tw:justify-center tw:items-center tw:flex-wrap', children: users?.map((u, k) => (jsxRuntime.jsxs("div", { className: 'tw:flex tw:items-center tw:space-x-3 tw:mx-2 tw:my-1', children: [u.image ? (jsxRuntime.jsx("div", { className: 'tw:avatar', children: jsxRuntime.jsx("div", { className: 'tw:mask tw:mask-circle tw:w-8 tw:h-8', children: jsxRuntime.jsx("img", { src: appState.assetsApi.url + u.image + '?width=40&heigth=40', alt: 'Avatar' }) }) })) : (jsxRuntime.jsx("div", { className: 'tw:mask tw:mask-circle tw:text-xl tw:md:text-2xl tw:bg-slate-200 tw:rounded-full tw:w-8 tw:h-8' })), jsxRuntime.jsx("div", { children: jsxRuntime.jsx("div", { className: 'tw:font-bold', children: u.name }) })] }, k)), ', ') }), jsxRuntime.jsxs("div", { className: 'tw:w-full', children: [jsxRuntime.jsx("div", { className: 'tw:flex tw:justify-center tw:items-center', children: jsxRuntime.jsx("div", { className: ' tw:flex tw:justify-center tw:items-center tw:w-28 tw:h-28 tw:m-4', children: jsxRuntime.jsx(EmojiPicker, { selectedEmoji: selectedEmoji, selectedColor: selectedColor, selectedShape: selectedShape, setSelectedEmoji: setSelectedEmoji, setSelectedColor: setSelectedColor, setSelectedShape: setSelectedShape }) }) }), jsxRuntime.jsx("div", { className: 'tw:flex tw:justify-center tw:items-center', children: jsxRuntime.jsx("input", { ref: inputRef, value: inputValue, onChange: handleChange, type: 'text', placeholder: '... and say some words', className: 'input tw:min-w-0 tw:w-fit tw:resize-none tw:overflow-hidden tw:text-center ' }) })] }), jsxRuntime.jsx("div", { className: 'tw:w-full tw:grid tw:mt-4', children: jsxRuntime.jsx("button", { onClick: sendAttestation, className: 'tw:btn tw:place-self-center tw:px-8', children: "Next" }) })] }));
|
1720
|
+
};
|
1721
|
+
|
1722
|
+
function groupAndCount(arr) {
|
1723
|
+
const grouped = arr.reduce((acc, obj) => {
|
1724
|
+
const found = acc.find((item) => JSON.stringify(item.object) === JSON.stringify(obj));
|
1725
|
+
if (found) {
|
1726
|
+
found.count += 1;
|
1727
|
+
}
|
1728
|
+
else {
|
1729
|
+
acc.push({ object: obj, count: 1 });
|
1730
|
+
}
|
1731
|
+
return acc;
|
1732
|
+
}, []);
|
1733
|
+
return grouped.sort((a, b) => b.count - a.count);
|
1734
|
+
}
|
1735
|
+
/**
|
1736
|
+
* @category Templates
|
1737
|
+
*/
|
1738
|
+
const MarketView = () => {
|
1739
|
+
const [offers, setOffers] = React.useState([]);
|
1740
|
+
const [needs, setNeeds] = React.useState([]);
|
1741
|
+
const navigate = reactRouterDom.useNavigate();
|
1742
|
+
const items = TagView.useItems();
|
1743
|
+
const tags = TagView.useTags();
|
1744
|
+
React.useEffect(() => {
|
1745
|
+
setOffers([]);
|
1746
|
+
setNeeds([]);
|
1747
|
+
for (const item of items) {
|
1748
|
+
item.offers?.forEach((o) => {
|
1749
|
+
const tag = tags.find((t) => t.id === o.tags_id);
|
1750
|
+
tag && setOffers((current) => [...current, tag]);
|
1751
|
+
});
|
1752
|
+
item.needs?.forEach((n) => {
|
1753
|
+
const tag = tags.find((t) => t.id === n.tags_id);
|
1754
|
+
tag && setNeeds((current) => [...current, tag]);
|
1755
|
+
});
|
1756
|
+
}
|
1757
|
+
// eslint-disable-next-line no-console
|
1758
|
+
console.log(offers);
|
1759
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
1760
|
+
}, [items]);
|
1761
|
+
return (jsxRuntime.jsx(TagView.MapOverlayPage, { className: 'tw:rounded-none tw:overflow-y-auto tw:bg-base-200 tw:p-4!', children: jsxRuntime.jsxs("div", { className: 'tw:grid tw:grid-cols-1 tw:md:grid-cols-2', children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("p", { className: 'tw:text-lg tw:font-bold', children: "Offers" }), jsxRuntime.jsx("div", { className: 'tw:flex tw:flex-wrap', children: groupAndCount(offers).map((o) => (jsxRuntime.jsx(TagView.TagView, { onClick: () => navigate(`/?tags=${o.object.name}`), tag: o.object, count: o.count }, o.object.id))) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("p", { className: 'tw:text-lg tw:font-bold', children: "Needs" }), jsxRuntime.jsx("div", { className: 'tw:flex tw:flex-wrap', children: groupAndCount(needs).map((o) => (jsxRuntime.jsx(TagView.TagView, { onClick: () => navigate(`/?tags=${o.object.name}`), tag: o.object, count: o.count }, o.object.id))) })] })] }) }));
|
1762
|
+
};
|
1763
|
+
|
1764
|
+
const LoadingMapOverlay = () => {
|
1765
|
+
return (jsxRuntime.jsx(TagView.MapOverlayPage, { backdrop: true, className: 'tw:max-w-xs tw:h-64 tw:bg-transparent', card: false, children: jsxRuntime.jsx("div", { className: 'tw:flex tw:justify-center tw:items-center tw:h-full', children: jsxRuntime.jsx("div", { className: 'tw:loading tw:loading-spinner tw:loading-xl' }) }) }));
|
1766
|
+
};
|
1767
|
+
|
1768
|
+
const ItemContext = React.createContext(undefined);
|
1769
|
+
|
1770
|
+
function templateify(Component) {
|
1771
|
+
const TemplateComponent = (props) => {
|
1772
|
+
const item = React.useContext(ItemContext);
|
1773
|
+
return jsxRuntime.jsx(Component, { ...props, item: item });
|
1774
|
+
};
|
1775
|
+
return TemplateComponent;
|
1776
|
+
}
|
1777
|
+
|
1778
|
+
function ItemFormPopup(props) {
|
1779
|
+
const layerContext = React.useContext(LayerContext);
|
1780
|
+
const { menuText, name: activeLayerName } = layerContext;
|
1781
|
+
const { popupForm, setPopupForm } = usePopupForm();
|
1782
|
+
const [spinner, setSpinner] = React.useState(false);
|
1783
|
+
const formRef = React.useRef(null);
|
1784
|
+
const map = reactLeaflet.useMap();
|
1785
|
+
const addItem = TagView.useAddItem();
|
1786
|
+
const updateItem = TagView.useUpdateItem();
|
1787
|
+
const items = TagView.useItems();
|
1788
|
+
const tags = TagView.useTags();
|
1789
|
+
const addTag = TagView.useAddTag();
|
1790
|
+
const resetFilterTags = TagView.useResetFilterTags();
|
1791
|
+
const { user } = TagView.useAuth();
|
1792
|
+
const handleSubmit = async (evt) => {
|
1793
|
+
if (!popupForm) {
|
1794
|
+
throw new Error('Popup form is not defined');
|
1795
|
+
}
|
1796
|
+
const formItem = {};
|
1797
|
+
Array.from(evt.target).forEach((input) => {
|
1798
|
+
if (input.name) {
|
1799
|
+
formItem[input.name] = input.value;
|
1800
|
+
}
|
1801
|
+
});
|
1802
|
+
formItem.position = {
|
1803
|
+
type: 'Point',
|
1804
|
+
coordinates: [popupForm.position.lng, popupForm.position.lat],
|
1805
|
+
};
|
1806
|
+
evt.preventDefault();
|
1807
|
+
const name = formItem.name ? formItem.name : user?.first_name;
|
1808
|
+
if (!name) {
|
1809
|
+
reactToastify.toast.error('Name is must be defined');
|
1810
|
+
return;
|
1811
|
+
}
|
1812
|
+
setSpinner(true);
|
1813
|
+
formItem.text &&
|
1814
|
+
formItem.text
|
1815
|
+
.toLocaleLowerCase()
|
1816
|
+
.match(TagView.hashTagRegex)
|
1817
|
+
?.map((tag) => {
|
1818
|
+
if (!tags.find((t) => t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase())) {
|
1819
|
+
addTag({ id: crypto.randomUUID(), name: tag.slice(1), color: TagView.randomColor() });
|
1820
|
+
}
|
1821
|
+
return null;
|
1822
|
+
});
|
1823
|
+
if (popupForm.item) {
|
1824
|
+
let success = false;
|
1825
|
+
try {
|
1826
|
+
await popupForm.layer.api?.updateItem({ ...formItem, id: popupForm.item.id });
|
1827
|
+
success = true;
|
1828
|
+
// eslint-disable-next-line no-catch-all/no-catch-all
|
1829
|
+
}
|
1830
|
+
catch (error) {
|
1831
|
+
reactToastify.toast.error(error.toString());
|
1832
|
+
}
|
1833
|
+
if (success) {
|
1834
|
+
updateItem({ ...popupForm.item, ...formItem });
|
1835
|
+
reactToastify.toast.success('Item updated');
|
1836
|
+
}
|
1837
|
+
setSpinner(false);
|
1838
|
+
map.closePopup();
|
1839
|
+
}
|
1840
|
+
else {
|
1841
|
+
const item = items.find((i) => i.user_created?.id === user?.id && i.layer === popupForm.layer);
|
1842
|
+
const uuid = crypto.randomUUID();
|
1843
|
+
let success = false;
|
1844
|
+
try {
|
1845
|
+
popupForm.layer.userProfileLayer &&
|
1846
|
+
item &&
|
1847
|
+
(await popupForm.layer.api?.updateItem({ ...formItem, id: item.id }));
|
1848
|
+
(!popupForm.layer.userProfileLayer || !item) &&
|
1849
|
+
(await popupForm.layer.api?.createItem({
|
1850
|
+
...formItem,
|
1851
|
+
name,
|
1852
|
+
id: uuid,
|
1853
|
+
}));
|
1854
|
+
success = true;
|
1855
|
+
// eslint-disable-next-line no-catch-all/no-catch-all
|
1856
|
+
}
|
1857
|
+
catch (error) {
|
1858
|
+
reactToastify.toast.error(error.toString());
|
1859
|
+
}
|
1860
|
+
if (success) {
|
1861
|
+
if (popupForm.layer.userProfileLayer && item)
|
1862
|
+
updateItem({ ...item, ...formItem });
|
1863
|
+
if (!popupForm.layer.userProfileLayer || !item) {
|
1864
|
+
addItem({
|
1865
|
+
...formItem,
|
1866
|
+
name: (formItem.name ? formItem.name : user?.first_name) ?? '',
|
1867
|
+
user_created: user ?? undefined,
|
1868
|
+
id: uuid,
|
1869
|
+
layer: popupForm.layer,
|
1870
|
+
public_edit: !user,
|
1871
|
+
});
|
1872
|
+
}
|
1873
|
+
reactToastify.toast.success('New item created');
|
1874
|
+
resetFilterTags();
|
1875
|
+
}
|
1876
|
+
setSpinner(false);
|
1877
|
+
map.closePopup();
|
1878
|
+
}
|
1879
|
+
setPopupForm(null);
|
1880
|
+
};
|
1881
|
+
const resetPopup = () => {
|
1882
|
+
if (formRef.current) {
|
1883
|
+
formRef.current.reset();
|
1884
|
+
}
|
1885
|
+
};
|
1886
|
+
React.useEffect(() => {
|
1887
|
+
resetPopup();
|
1888
|
+
}, [popupForm?.position]);
|
1889
|
+
return (popupForm &&
|
1890
|
+
popupForm.layer.name === activeLayerName && (jsxRuntime.jsx(reactLeaflet.Popup, { minWidth: 275, maxWidth: 275, autoPanPadding: [20, 80], eventHandlers: {
|
1891
|
+
remove: () => {
|
1892
|
+
setTimeout(function () {
|
1893
|
+
resetPopup();
|
1894
|
+
}, 100);
|
1895
|
+
},
|
1896
|
+
}, position: popupForm.position, children: jsxRuntime.jsxs("form", { ref: formRef, onReset: resetPopup, autoComplete: 'off', onSubmit: (e) => handleSubmit(e), children: [popupForm.item ? (jsxRuntime.jsx("div", { className: 'tw:h-3' })) : (jsxRuntime.jsx("div", { className: 'tw:flex tw:justify-center', children: jsxRuntime.jsx("b", { className: 'tw:text-xl tw:text-center tw:font-bold', children: menuText }) })), props.children ? (jsxRuntime.jsx(ItemContext.Provider, { value: popupForm.item, children: props.children })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(TagView.TextInput, { type: 'text', placeholder: 'Name', dataField: 'name', defaultValue: popupForm.item ? popupForm.item.name : '', inputStyle: '' }), jsxRuntime.jsx(TagView.TextAreaInput, { placeholder: 'Text', dataField: 'text', defaultValue: popupForm.item?.text ?? '', inputStyle: 'tw:h-40 tw:mt-5' }, popupForm.position.toString())] })), jsxRuntime.jsx("div", { className: 'tw:flex tw:justify-center', children: jsxRuntime.jsx("button", { className: spinner
|
1897
|
+
? 'tw:btn tw:btn-disabled tw:mt-5 tw:place-self-center'
|
1898
|
+
: 'tw:btn tw:mt-5 tw:place-self-center', type: 'submit', children: spinner ? jsxRuntime.jsx("span", { className: 'tw:loading tw:loading-spinner' }) : 'Save' }) })] }) })));
|
1899
|
+
}
|
1900
|
+
|
1901
|
+
/**
|
1902
|
+
* @category Item
|
1903
|
+
*/
|
1904
|
+
const PopupForm = ({ children }) => {
|
1905
|
+
return jsxRuntime.jsx(ItemFormPopup, { children: children });
|
1906
|
+
};
|
1907
|
+
|
1908
|
+
// eslint-disable-next-line react/display-name
|
1909
|
+
const ItemViewPopup = React.forwardRef((props, ref) => {
|
1910
|
+
const map = reactLeaflet.useMap();
|
1911
|
+
const [loading, setLoading] = React.useState(false);
|
1912
|
+
const removeItem = TagView.useRemoveItem();
|
1913
|
+
const updadateItem = TagView.useUpdateItem();
|
1914
|
+
const navigate = reactRouterDom.useNavigate();
|
1915
|
+
const setSelectPosition = TagView.useSetSelectPosition();
|
1916
|
+
const { setPopupForm } = usePopupForm();
|
1917
|
+
const [infoExpanded, setInfoExpanded] = React.useState(false);
|
1918
|
+
const handleEdit = (event) => {
|
1919
|
+
event.stopPropagation();
|
1920
|
+
map.closePopup();
|
1921
|
+
if (!props.item.layer) {
|
1922
|
+
throw new Error('Layer is not defined');
|
1923
|
+
}
|
1924
|
+
setPopupForm({
|
1925
|
+
position: new leaflet.LatLng(props.item.position?.coordinates[1], props.item.position?.coordinates[0]),
|
1926
|
+
layer: props.item.layer,
|
1927
|
+
item: props.item,
|
1928
|
+
});
|
1929
|
+
};
|
1930
|
+
const handleDelete = async (event) => {
|
1931
|
+
event.stopPropagation();
|
1932
|
+
setLoading(true);
|
1933
|
+
let success = false;
|
1934
|
+
try {
|
1935
|
+
!props.item.layer?.userProfileLayer &&
|
1936
|
+
(await props.item.layer?.api?.deleteItem(props.item.id));
|
1937
|
+
props.item.layer?.userProfileLayer &&
|
1938
|
+
(await props.item.layer.api?.updateItem({ id: props.item.id, position: null }));
|
1939
|
+
success = true;
|
1940
|
+
// eslint-disable-next-line no-catch-all/no-catch-all
|
1941
|
+
}
|
1942
|
+
catch (error) {
|
1943
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
1944
|
+
reactToastify.toast.error(error.toString());
|
1945
|
+
}
|
1946
|
+
if (success) {
|
1947
|
+
!props.item.layer?.userProfileLayer && removeItem(props.item);
|
1948
|
+
props.item.layer?.userProfileLayer && updadateItem({ ...props.item, position: undefined });
|
1949
|
+
reactToastify.toast.success('Item deleted');
|
1950
|
+
}
|
1951
|
+
setLoading(false);
|
1952
|
+
map.closePopup();
|
1953
|
+
const params = new URLSearchParams(window.location.search);
|
1954
|
+
window.history.pushState({}, '', '/' + `${params ? `?${params}` : ''}`);
|
1955
|
+
navigate('/');
|
1956
|
+
};
|
1957
|
+
return (jsxRuntime.jsx(reactLeaflet.Popup, { ref: ref, maxHeight: 377, minWidth: 275, maxWidth: 275, autoPanPadding: [20, 80], children: jsxRuntime.jsxs("div", { className: 'tw:bg-base-100 tw:text-base-content', children: [jsxRuntime.jsx(TagView.HeaderView, { api: props.item.layer?.api, item: props.item, editCallback: handleEdit, deleteCallback: handleDelete, setPositionCallback: () => {
|
1958
|
+
map.closePopup();
|
1959
|
+
setSelectPosition(props.item);
|
1960
|
+
navigate('/');
|
1961
|
+
}, loading: loading }), jsxRuntime.jsx("div", { className: 'tw:overflow-y-auto tw:overflow-x-hidden tw:max-h-64 fade', children: props.children ?? jsxRuntime.jsx(TagView.TextView, { text: props.item.text, itemId: props.item.id }) }), jsxRuntime.jsxs("div", { className: 'tw:flex tw:-mb-1 tw:flex-row tw:mr-2 tw:mt-1', children: [infoExpanded ? (jsxRuntime.jsx("p", { className: 'tw:italic tw:min-h-[21px] tw:my-0! tw:opacity-50', children: `${props.item.date_updated && props.item.date_updated !== props.item.date_created ? 'updated' : 'posted'} ${props.item && props.item.user_created && props.item.user_created.first_name ? `by ${props.item.user_created.first_name}` : ''} ${props.item.date_updated ? TagView.timeAgo(props.item.date_updated) : TagView.timeAgo(props.item.date_created)}` })) : (jsxRuntime.jsx("p", { className: 'tw:my-0! tw:min-h-[21px] tw:font-bold tw:cursor-pointer tw:text-gray-500', onClick: () => setInfoExpanded(true), children: "\u24D8" })), jsxRuntime.jsx("div", { className: 'tw:grow' })] })] }) }));
|
1962
|
+
});
|
1963
|
+
|
1964
|
+
/**
|
1965
|
+
* @category Item
|
1966
|
+
*/
|
1967
|
+
const PopupView = ({ children }) => {
|
1968
|
+
const layerContext = React.useContext(LayerContext);
|
1969
|
+
const { name, markerDefaultColor, markerDefaultColor2, markerShape, markerIcon } = layerContext;
|
1970
|
+
const filterTags = TagView.useFilterTags();
|
1971
|
+
const appState = TagView.useAppState();
|
1972
|
+
const items = TagView.useItems();
|
1973
|
+
const getItemTags = TagView.useGetItemTags();
|
1974
|
+
const addMarker = TagView.useAddMarker();
|
1975
|
+
const addPopup = TagView.useAddPopup();
|
1976
|
+
const leafletRefs = TagView.useLeafletRefs();
|
1977
|
+
const allTagsLoaded = TagView.useAllTagsLoaded();
|
1978
|
+
const allItemsLoaded = TagView.useAllItemsLoaded();
|
1979
|
+
const setMarkerClicked = TagView.useSetMarkerClicked();
|
1980
|
+
const selectPosition = TagView.useSelectPosition();
|
1981
|
+
const tags = TagView.useTags();
|
1982
|
+
const [newTagsToAdd, setNewTagsToAdd] = React.useState([]);
|
1983
|
+
const [tagsReady, setTagsReady] = React.useState(false);
|
1984
|
+
const isLayerVisible = TagView.useIsLayerVisible();
|
1985
|
+
const isGroupTypeVisible = TagView.useIsGroupTypeVisible();
|
1986
|
+
const visibleGroupTypes = TagView.useVisibleGroupType();
|
1987
|
+
const visibleItems = React.useMemo(() => items
|
1988
|
+
.filter((item) => item.layer?.name === name)
|
1989
|
+
.filter((item) => filterTags.length === 0
|
1990
|
+
? item
|
1991
|
+
: filterTags.some((tag) => getItemTags(item).some((filterTag) => filterTag.name.toLocaleLowerCase() === tag.name.toLocaleLowerCase())))
|
1992
|
+
.filter((item) => item.layer && isLayerVisible(item.layer))
|
1993
|
+
.filter((item) => (item.group_type && isGroupTypeVisible(item.group_type)) ||
|
1994
|
+
visibleGroupTypes.length === 0), [
|
1995
|
+
filterTags,
|
1996
|
+
getItemTags,
|
1997
|
+
isGroupTypeVisible,
|
1998
|
+
isLayerVisible,
|
1999
|
+
items,
|
2000
|
+
name,
|
2001
|
+
visibleGroupTypes.length,
|
2002
|
+
]);
|
2003
|
+
return visibleItems.map((item) => {
|
2004
|
+
if (!(item.position?.coordinates[0] && item.position.coordinates[1]))
|
2005
|
+
return null;
|
2006
|
+
if (item.tags) {
|
2007
|
+
item.text += '\n\n';
|
2008
|
+
item.tags.map((tag) => {
|
2009
|
+
if (!item.text?.includes(`#${TagView.encodeTag(tag)}`)) {
|
2010
|
+
item.text += `#${TagView.encodeTag(tag)}`;
|
2011
|
+
}
|
2012
|
+
return item.text;
|
2013
|
+
});
|
2014
|
+
}
|
2015
|
+
if (allTagsLoaded && allItemsLoaded) {
|
2016
|
+
item.text?.match(TagView.hashTagRegex)?.map((tag) => {
|
2017
|
+
if (!tags.find((t) => t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase()) &&
|
2018
|
+
!newTagsToAdd.find((t) => t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase())) {
|
2019
|
+
const newTag = {
|
2020
|
+
id: crypto.randomUUID(),
|
2021
|
+
name: tag.slice(1),
|
2022
|
+
color: TagView.randomColor(),
|
2023
|
+
};
|
2024
|
+
setNewTagsToAdd((current) => [...current, newTag]);
|
2025
|
+
}
|
2026
|
+
return null;
|
2027
|
+
});
|
2028
|
+
!tagsReady && setTagsReady(true);
|
2029
|
+
}
|
2030
|
+
const itemTags = getItemTags(item);
|
2031
|
+
const latitude = item.position.coordinates[1];
|
2032
|
+
const longitude = item.position.coordinates[0];
|
2033
|
+
let color1 = markerDefaultColor;
|
2034
|
+
let color2 = markerDefaultColor2;
|
2035
|
+
if (item.color) {
|
2036
|
+
color1 = item.color;
|
2037
|
+
}
|
2038
|
+
else if (itemTags[0]) {
|
2039
|
+
color1 = itemTags[0].color;
|
2040
|
+
}
|
2041
|
+
if (itemTags[0] && item.color) {
|
2042
|
+
color2 = itemTags[0].color;
|
2043
|
+
}
|
2044
|
+
else if (itemTags[1]) {
|
2045
|
+
color2 = itemTags[1].color;
|
2046
|
+
}
|
2047
|
+
return (jsxRuntime.jsx(ItemContext.Provider, { value: item, children: jsxRuntime.jsxs(reactLeaflet.Marker, { ref: (r) => {
|
2048
|
+
if (!(item.id in leafletRefs && leafletRefs[item.id].marker === r)) {
|
2049
|
+
r && addMarker(item, r);
|
2050
|
+
}
|
2051
|
+
}, eventHandlers: {
|
2052
|
+
click: () => {
|
2053
|
+
selectPosition && setMarkerClicked(item);
|
2054
|
+
},
|
2055
|
+
}, icon: MarkerIconFactory(markerShape, color1, color2, item.markerIcon ?? markerIcon, appState.assetsApi.url), position: [latitude, longitude], children: [jsxRuntime.jsx(ItemViewPopup, { ref: (r) => {
|
2056
|
+
if (!(item.id in leafletRefs && leafletRefs[item.id].popup === r)) {
|
2057
|
+
r && addPopup(item, r);
|
2058
|
+
}
|
2059
|
+
}, item: item, children: children }), jsxRuntime.jsx(reactLeaflet.Tooltip, { offset: [0, -38], direction: 'top', children: item.name })] }) }, item.id));
|
2060
|
+
});
|
2061
|
+
};
|
2062
|
+
|
2063
|
+
const TextView = templateify(TagView.TextView);
|
2064
|
+
const StartEndView = templateify(TagView.StartEndView);
|
2065
|
+
const PopupTextInput = templateify(PopupTextInput$1);
|
2066
|
+
const PopupButton = templateify(PopupButton$1);
|
2067
|
+
const PopupCheckboxInput = templateify(PopupCheckboxInput$1);
|
2068
|
+
const PopupTextAreaInput = templateify(PopupTextAreaInput$1);
|
2069
|
+
const PopupStartEndInput = templateify(TagView.PopupStartEndInput);
|
2070
|
+
|
2071
|
+
exports.AuthProvider = TagView.AuthProvider;
|
2072
|
+
exports.MapOverlayPage = TagView.MapOverlayPage;
|
2073
|
+
exports.TextAreaInput = TagView.TextAreaInput;
|
2074
|
+
exports.TextInput = TagView.TextInput;
|
2075
|
+
exports.SVG = SVG;
|
2076
|
+
exports.AppShell = AppShell;
|
2077
|
+
exports.AttestationForm = AttestationForm;
|
2078
|
+
exports.CardPage = CardPage;
|
2079
|
+
exports.Content = Content;
|
2080
|
+
exports.Layer = Layer;
|
2081
|
+
exports.LoadingMapOverlay = LoadingMapOverlay;
|
2082
|
+
exports.LoginPage = LoginPage;
|
2083
|
+
exports.MarketView = MarketView;
|
2084
|
+
exports.Modal = Modal;
|
2085
|
+
exports.OverlayItemsIndexPage = OverlayItemsIndexPage;
|
2086
|
+
exports.Permissions = Permissions;
|
2087
|
+
exports.PopupButton = PopupButton;
|
2088
|
+
exports.PopupCheckboxInput = PopupCheckboxInput;
|
2089
|
+
exports.PopupForm = PopupForm;
|
2090
|
+
exports.PopupStartEndInput = PopupStartEndInput;
|
2091
|
+
exports.PopupTextAreaInput = PopupTextAreaInput;
|
2092
|
+
exports.PopupTextInput = PopupTextInput;
|
2093
|
+
exports.PopupView = PopupView;
|
2094
|
+
exports.Quests = Quests;
|
2095
|
+
exports.RequestPasswordPage = RequestPasswordPage;
|
2096
|
+
exports.SelectUser = SelectUser;
|
2097
|
+
exports.SetNewPasswordPage = SetNewPasswordPage;
|
2098
|
+
exports.SideBar = SideBar;
|
2099
|
+
exports.SignupPage = SignupPage;
|
2100
|
+
exports.StartEndView = StartEndView;
|
2101
|
+
exports.Tags = Tags;
|
2102
|
+
exports.TextView = TextView;
|
2103
|
+
exports.TitleCard = TitleCard;
|
2104
|
+
exports.UtopiaMap = UtopiaMap;
|
2105
|
+
//# sourceMappingURL=index.cjs.js.map
|