您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Improve your plane with the interface that offers experimental features.
// ==UserScript== // @name Experimental Flight Interface // @namespace https://github.com/Ferhatduran55/geofs-experimental-fi // @version 0.7.13 // @description Improve your plane with the interface that offers experimental features. // @author Ferhatduran55 // @match https://www.geo-fs.com/geofs.php?v=3.7 // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_listValues // @grant GM_info // @grant unsafeWindow // @license MIT // @homepage https://gf.zukizuki.org/scripts/488227 // @supportURL https://gf.zukizuki.org/scripts/488227/feedback // @run-at document-end // ==/UserScript== // dist/index.js (function () { 'use strict'; try{if(typeof document != 'undefined'){GM.addStyle("*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}/*\n! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com\n*//*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font-family by default.\n2. Use the user's configured `mono` font-feature-settings by default.\n3. Use the user's configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; /* 1 */\n font-feature-settings: normal; /* 2 */\n font-variation-settings: normal; /* 3 */\n font-size: 1em; /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden]:where(:not([hidden=\"until-found\"])) {\n display: none;\n}\r\n.container {\n width: 100%;\n}\r\n@media (min-width: 640px) {\n\n .container {\n max-width: 640px;\n }\n}\r\n@media (min-width: 768px) {\n\n .container {\n max-width: 768px;\n }\n}\r\n@media (min-width: 1024px) {\n\n .container {\n max-width: 1024px;\n }\n}\r\n@media (min-width: 1280px) {\n\n .container {\n max-width: 1280px;\n }\n}\r\n@media (min-width: 1536px) {\n\n .container {\n max-width: 1536px;\n }\n}\r\n.static {\n position: static;\n}\r\n.m-2 {\n margin: 0.5rem;\n}\r\n.mt-4 {\n margin-top: 1rem;\n}\r\n.flex {\n display: flex;\n}\r\n.h-5 {\n height: 1.25rem;\n}\r\n.w-11\\/12 {\n width: 91.666667%;\n}\r\n.w-5 {\n width: 1.25rem;\n}\r\n.w-fit {\n width: -moz-fit-content;\n width: fit-content;\n}\r\n.w-max {\n width: -moz-max-content;\n width: max-content;\n}\r\n.flex-auto {\n flex: 1 1 auto;\n}\r\n.flex-none {\n flex: none;\n}\r\n.flex-col {\n flex-direction: column;\n}\r\n.items-center {\n align-items: center;\n}\r\n.justify-between {\n justify-content: space-between;\n}\r\n.gap-2 {\n gap: 0.5rem;\n}\r\n.gap-4 {\n gap: 1rem;\n}\r\n.rounded-md {\n border-radius: 0.375rem;\n}\r\n.border-0 {\n border-width: 0px;\n}\r\n.bg-sky-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(2 132 199 / var(--tw-bg-opacity, 1));\n}\r\n.p-2 {\n padding: 0.5rem;\n}\r\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\r\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\r\n.pb-4 {\n padding-bottom: 1rem;\n}\r\n.pl-2 {\n padding-left: 0.5rem;\n}\r\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\r\n.font-medium {\n font-weight: 500;\n}\r\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\r\n.text-slate-500 {\n --tw-text-opacity: 1;\n color: rgb(100 116 139 / var(--tw-text-opacity, 1));\n}\r\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\r\n.shadow-md {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\r\n.transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\r\n.marker\\:content-none *::marker {\n --tw-content: none;\n content: var(--tw-content);\n}\r\n.marker\\:content-none::marker {\n --tw-content: none;\n content: var(--tw-content);\n}\r\n.hover\\:cursor-pointer:hover {\n cursor: pointer;\n}\r\n.hover\\:bg-sky-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(3 105 161 / var(--tw-bg-opacity, 1));\n}html[dir=\"ltr\"],\r\n[data-sonner-toaster][dir=\"ltr\"] {\r\n --toast-icon-margin-start: -3px;\r\n --toast-icon-margin-end: 4px;\r\n --toast-svg-margin-start: -1px;\r\n --toast-svg-margin-end: 0px;\r\n --toast-button-margin-start: auto;\r\n --toast-button-margin-end: 0;\r\n --toast-close-button-start: 0;\r\n --toast-close-button-end: unset;\r\n --toast-close-button-transform: translate(-35%, -35%);\r\n}\r\nhtml[dir=\"rtl\"],\r\n[data-sonner-toaster][dir=\"rtl\"] {\r\n --toast-icon-margin-start: 4px;\r\n --toast-icon-margin-end: -3px;\r\n --toast-svg-margin-start: 0px;\r\n --toast-svg-margin-end: -1px;\r\n --toast-button-margin-start: 0;\r\n --toast-button-margin-end: auto;\r\n --toast-close-button-start: unset;\r\n --toast-close-button-end: 0;\r\n --toast-close-button-transform: translate(35%, -35%);\r\n}\r\n[data-sonner-toaster] {\r\n position: fixed;\r\n width: var(--width);\r\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,\r\n Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif,\r\n Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;\r\n --gray1: hsl(0, 0%, 99%);\r\n --gray2: hsl(0, 0%, 97.3%);\r\n --gray3: hsl(0, 0%, 95.1%);\r\n --gray4: hsl(0, 0%, 93%);\r\n --gray5: hsl(0, 0%, 90.9%);\r\n --gray6: hsl(0, 0%, 88.7%);\r\n --gray7: hsl(0, 0%, 85.8%);\r\n --gray8: hsl(0, 0%, 78%);\r\n --gray9: hsl(0, 0%, 56.1%);\r\n --gray10: hsl(0, 0%, 52.3%);\r\n --gray11: hsl(0, 0%, 43.5%);\r\n --gray12: hsl(0, 0%, 9%);\r\n --border-radius: 8px;\r\n box-sizing: border-box;\r\n padding: 0;\r\n margin: 0;\r\n list-style: none;\r\n outline: none;\r\n z-index: 999999999;\r\n}\r\n[data-sonner-toaster][data-x-position=\"right\"] {\r\n right: max(var(--offset), env(safe-area-inset-right));\r\n}\r\n[data-sonner-toaster][data-x-position=\"left\"] {\r\n left: max(var(--offset), env(safe-area-inset-left));\r\n}\r\n[data-sonner-toaster][data-x-position=\"center\"] {\r\n left: 50%;\r\n transform: translateX(-50%);\r\n}\r\n[data-sonner-toaster][data-y-position=\"top\"] {\r\n top: max(var(--offset), env(safe-area-inset-top));\r\n}\r\n[data-sonner-toaster][data-y-position=\"bottom\"] {\r\n bottom: max(var(--offset), env(safe-area-inset-bottom));\r\n}\r\n[data-sonner-toast] {\r\n --y: translateY(100%);\r\n --lift-amount: calc(var(--lift) * var(--gap));\r\n z-index: var(--z-index);\r\n position: absolute;\r\n opacity: 0;\r\n transform: var(--y);\r\n touch-action: none;\r\n will-change: transform, opacity, height;\r\n transition: transform 400ms, opacity 400ms, height 400ms, box-shadow 200ms;\r\n box-sizing: border-box;\r\n outline: none;\r\n overflow-wrap: anywhere;\r\n}\r\n[data-sonner-toast][data-styled=\"true\"] {\r\n padding: 16px;\r\n background: var(--normal-bg);\r\n border: 1px solid var(--normal-border);\r\n color: var(--normal-text);\r\n border-radius: var(--border-radius);\r\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1);\r\n width: var(--width);\r\n font-size: 13px;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n}\r\n[data-sonner-toast]:focus-visible {\r\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1), 0 0 0 2px rgba(0, 0, 0, 0.2);\r\n}\r\n[data-sonner-toast][data-y-position=\"top\"] {\r\n top: 0;\r\n --y: translateY(-100%);\r\n --lift: 1;\r\n --lift-amount: calc(1 * var(--gap));\r\n}\r\n[data-sonner-toast][data-y-position=\"bottom\"] {\r\n bottom: 0;\r\n --y: translateY(100%);\r\n --lift: -1;\r\n --lift-amount: calc(var(--lift) * var(--gap));\r\n}\r\n[data-sonner-toast] [data-description] {\r\n font-weight: 400;\r\n line-height: 1.4;\r\n color: inherit;\r\n}\r\n[data-sonner-toast] [data-title] {\r\n font-weight: 500;\r\n line-height: 1.5;\r\n color: inherit;\r\n}\r\n[data-sonner-toast] [data-icon] {\r\n display: flex;\r\n height: 16px;\r\n width: 16px;\r\n position: relative;\r\n justify-content: flex-start;\r\n align-items: center;\r\n flex-shrink: 0;\r\n margin-left: var(--toast-icon-margin-start);\r\n margin-right: var(--toast-icon-margin-end);\r\n}\r\n[data-sonner-toast][data-promise=\"true\"] [data-icon] > svg {\r\n opacity: 0;\r\n transform: scale(0.8);\r\n transform-origin: center;\r\n animation: sonner-fade-in 300ms ease forwards;\r\n}\r\n[data-sonner-toast] [data-icon] > * {\r\n flex-shrink: 0;\r\n}\r\n[data-sonner-toast] [data-icon] svg {\r\n margin-left: var(--toast-svg-margin-start);\r\n margin-right: var(--toast-svg-margin-end);\r\n}\r\n[data-sonner-toast] [data-content] {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n}\r\n[data-sonner-toast] [data-button] {\r\n border-radius: 4px;\r\n padding-left: 8px;\r\n padding-right: 8px;\r\n height: 24px;\r\n font-size: 12px;\r\n color: var(--normal-bg);\r\n background: var(--normal-text);\r\n margin-left: var(--toast-button-margin-start);\r\n margin-right: var(--toast-button-margin-end);\r\n border: none;\r\n cursor: pointer;\r\n outline: none;\r\n display: flex;\r\n align-items: center;\r\n flex-shrink: 0;\r\n transition: opacity 400ms, box-shadow 200ms;\r\n}\r\n[data-sonner-toast] [data-button]:focus-visible {\r\n box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.4);\r\n}\r\n[data-sonner-toast] [data-button]:first-of-type {\r\n margin-left: var(--toast-button-margin-start);\r\n margin-right: var(--toast-button-margin-end);\r\n}\r\n[data-sonner-toast] [data-cancel] {\r\n color: var(--normal-text);\r\n background: rgba(0, 0, 0, 0.08);\r\n}\r\n[data-sonner-toast][data-theme=\"dark\"] [data-cancel] {\r\n background: rgba(255, 255, 255, 0.3);\r\n}\r\n[data-sonner-toast] [data-close-button] {\r\n position: absolute;\r\n left: var(--toast-close-button-start);\r\n right: var(--toast-close-button-end);\r\n top: 0;\r\n height: 20px;\r\n width: 20px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n padding: 0;\r\n background: var(--gray1);\r\n color: var(--gray12);\r\n border: 1px solid var(--gray4);\r\n transform: var(--toast-close-button-transform);\r\n border-radius: 50%;\r\n cursor: pointer;\r\n z-index: 1;\r\n transition: opacity 100ms, background 200ms, border-color 200ms;\r\n}\r\n[data-sonner-toast] [data-close-button]:focus-visible {\r\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1), 0 0 0 2px rgba(0, 0, 0, 0.2);\r\n}\r\n[data-sonner-toast] [data-disabled=\"true\"] {\r\n cursor: not-allowed;\r\n}\r\n[data-sonner-toast]:hover [data-close-button]:hover {\r\n background: var(--gray2);\r\n border-color: var(--gray5);\r\n}\r\n[data-sonner-toast][data-swiping=\"true\"]:before {\r\n content: \"\";\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n height: 100%;\r\n z-index: -1;\r\n}\r\n[data-sonner-toast][data-y-position=\"top\"][data-swiping=\"true\"]:before {\r\n bottom: 50%;\r\n transform: scaleY(3) translateY(50%);\r\n}\r\n[data-sonner-toast][data-y-position=\"bottom\"][data-swiping=\"true\"]:before {\r\n top: 50%;\r\n transform: scaleY(3) translateY(-50%);\r\n}\r\n[data-sonner-toast][data-swiping=\"false\"][data-removed=\"true\"]:before {\r\n content: \"\";\r\n position: absolute;\r\n inset: 0;\r\n transform: scaleY(2);\r\n}\r\n[data-sonner-toast]:after {\r\n content: \"\";\r\n position: absolute;\r\n left: 0;\r\n height: calc(var(--gap) + 1px);\r\n bottom: 100%;\r\n width: 100%;\r\n}\r\n[data-sonner-toast][data-mounted=\"true\"] {\r\n --y: translateY(0);\r\n opacity: 1;\r\n}\r\n[data-sonner-toast][data-expanded=\"false\"][data-front=\"false\"] {\r\n --scale: var(--toasts-before) * 0.05 + 1;\r\n --y: translateY(calc(var(--lift-amount) * var(--toasts-before)))\r\n scale(calc(-1 * var(--scale)));\r\n height: var(--front-toast-height);\r\n}\r\n[data-sonner-toast] > * {\r\n transition: opacity 400ms;\r\n}\r\n[data-sonner-toast][data-expanded=\"false\"][data-front=\"false\"][data-styled=\"true\"]\r\n > * {\r\n opacity: 0;\r\n}\r\n[data-sonner-toast][data-visible=\"false\"] {\r\n opacity: 0;\r\n pointer-events: none;\r\n}\r\n[data-sonner-toast][data-mounted=\"true\"][data-expanded=\"true\"] {\r\n --y: translateY(calc(var(--lift) * var(--offset)));\r\n height: var(--initial-height);\r\n}\r\n[data-sonner-toast][data-removed=\"true\"][data-front=\"true\"][data-swipe-out=\"false\"] {\r\n --y: translateY(calc(var(--lift) * -100%));\r\n opacity: 0;\r\n}\r\n[data-sonner-toast][data-removed=\"true\"][data-front=\"false\"][data-swipe-out=\"false\"][data-expanded=\"true\"] {\r\n --y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));\r\n opacity: 0;\r\n}\r\n[data-sonner-toast][data-removed=\"true\"][data-front=\"false\"][data-swipe-out=\"false\"][data-expanded=\"false\"] {\r\n --y: translateY(40%);\r\n opacity: 0;\r\n transition: transform 500ms, opacity 200ms;\r\n}\r\n[data-sonner-toast][data-removed=\"true\"][data-front=\"false\"]:before {\r\n height: calc(var(--initial-height) + 20%);\r\n}\r\n[data-sonner-toast][data-swiping=\"true\"] {\r\n transform: var(--y) translateY(var(--swipe-amount, 0px));\r\n transition: none;\r\n}\r\n[data-sonner-toast][data-swipe-out=\"true\"][data-y-position=\"bottom\"],\r\n[data-sonner-toast][data-swipe-out=\"true\"][data-y-position=\"top\"] {\r\n animation: swipe-out 200ms ease-out forwards;\r\n}\r\n@keyframes swipe-out {\r\n from {\r\n transform: translateY(\r\n calc(var(--lift) * var(--offset) + var(--swipe-amount))\r\n );\r\n opacity: 1;\r\n }\r\n to {\r\n transform: translateY(\r\n calc(\r\n var(--lift) * var(--offset) + var(--swipe-amount) + var(--lift) * -100%\r\n )\r\n );\r\n opacity: 0;\r\n }\r\n}\r\n@media (max-width: 600px) {\r\n [data-sonner-toaster] {\r\n position: fixed;\r\n --mobile-offset: 16px;\r\n right: var(--mobile-offset);\r\n left: var(--mobile-offset);\r\n width: 100%;\r\n }\r\n [data-sonner-toaster] [data-sonner-toast] {\r\n left: 0;\r\n right: 0;\r\n width: calc(100% - 32px);\r\n }\r\n [data-sonner-toaster][data-x-position=\"left\"] {\r\n left: var(--mobile-offset);\r\n }\r\n [data-sonner-toaster][data-y-position=\"bottom\"] {\r\n bottom: 20px;\r\n }\r\n [data-sonner-toaster][data-y-position=\"top\"] {\r\n top: 20px;\r\n }\r\n [data-sonner-toaster][data-x-position=\"center\"] {\r\n left: var(--mobile-offset);\r\n right: var(--mobile-offset);\r\n transform: none;\r\n }\r\n}\r\n[data-sonner-toaster][data-theme=\"light\"] {\r\n --normal-bg: #fff;\r\n --normal-border: var(--gray4);\r\n --normal-text: var(--gray12);\r\n --success-bg: hsl(143, 85%, 96%);\r\n --success-border: hsl(145, 92%, 91%);\r\n --success-text: hsl(140, 100%, 27%);\r\n --info-bg: hsl(208, 100%, 97%);\r\n --info-border: hsl(221, 91%, 91%);\r\n --info-text: hsl(210, 92%, 45%);\r\n --warning-bg: hsl(49, 100%, 97%);\r\n --warning-border: hsl(49, 91%, 91%);\r\n --warning-text: hsl(31, 92%, 45%);\r\n --error-bg: hsl(359, 100%, 97%);\r\n --error-border: hsl(359, 100%, 94%);\r\n --error-text: hsl(360, 100%, 45%);\r\n}\r\n[data-sonner-toaster][data-theme=\"light\"]\r\n [data-sonner-toast][data-invert=\"true\"] {\r\n --normal-bg: #000;\r\n --normal-border: hsl(0, 0%, 20%);\r\n --normal-text: var(--gray1);\r\n}\r\n[data-sonner-toaster][data-theme=\"dark\"]\r\n [data-sonner-toast][data-invert=\"true\"] {\r\n --normal-bg: #fff;\r\n --normal-border: var(--gray3);\r\n --normal-text: var(--gray12);\r\n}\r\n[data-sonner-toaster][data-theme=\"dark\"] {\r\n --normal-bg: #000;\r\n --normal-border: hsl(0, 0%, 20%);\r\n --normal-text: var(--gray1);\r\n --success-bg: hsl(150, 100%, 6%);\r\n --success-border: hsl(147, 100%, 12%);\r\n --success-text: hsl(150, 86%, 65%);\r\n --info-bg: hsl(215, 100%, 6%);\r\n --info-border: hsl(223, 100%, 12%);\r\n --info-text: hsl(216, 87%, 65%);\r\n --warning-bg: hsl(64, 100%, 6%);\r\n --warning-border: hsl(60, 100%, 12%);\r\n --warning-text: hsl(46, 87%, 65%);\r\n --error-bg: hsl(358, 76%, 10%);\r\n --error-border: hsl(357, 89%, 16%);\r\n --error-text: hsl(358, 100%, 81%);\r\n}\r\n[data-rich-colors=\"true\"] [data-sonner-toast][data-type=\"success\"] {\r\n background: var(--success-bg);\r\n border-color: var(--success-border);\r\n color: var(--success-text);\r\n}\r\n[data-rich-colors=\"true\"]\r\n [data-sonner-toast][data-type=\"success\"]\r\n [data-close-button] {\r\n background: var(--success-bg);\r\n border-color: var(--success-border);\r\n color: var(--success-text);\r\n}\r\n[data-rich-colors=\"true\"] [data-sonner-toast][data-type=\"info\"] {\r\n background: var(--info-bg);\r\n border-color: var(--info-border);\r\n color: var(--info-text);\r\n}\r\n[data-rich-colors=\"true\"]\r\n [data-sonner-toast][data-type=\"info\"]\r\n [data-close-button] {\r\n background: var(--info-bg);\r\n border-color: var(--info-border);\r\n color: var(--info-text);\r\n}\r\n[data-rich-colors=\"true\"] [data-sonner-toast][data-type=\"warning\"] {\r\n background: var(--warning-bg);\r\n border-color: var(--warning-border);\r\n color: var(--warning-text);\r\n}\r\n[data-rich-colors=\"true\"]\r\n [data-sonner-toast][data-type=\"warning\"]\r\n [data-close-button] {\r\n background: var(--warning-bg);\r\n border-color: var(--warning-border);\r\n color: var(--warning-text);\r\n}\r\n[data-rich-colors=\"true\"] [data-sonner-toast][data-type=\"error\"] {\r\n background: var(--error-bg);\r\n border-color: var(--error-border);\r\n color: var(--error-text);\r\n}\r\n[data-rich-colors=\"true\"]\r\n [data-sonner-toast][data-type=\"error\"]\r\n [data-close-button] {\r\n background: var(--error-bg);\r\n border-color: var(--error-border);\r\n color: var(--error-text);\r\n}\r\n.sonner-loading-wrapper {\r\n --size: 16px;\r\n height: var(--size);\r\n width: var(--size);\r\n position: absolute;\r\n inset: 0;\r\n z-index: 10;\r\n}\r\n.sonner-loading-wrapper[data-visible=\"false\"] {\r\n transform-origin: center;\r\n animation: sonner-fade-out 0.2s ease forwards;\r\n}\r\n.sonner-spinner {\r\n position: relative;\r\n top: 50%;\r\n left: 50%;\r\n height: var(--size);\r\n width: var(--size);\r\n}\r\n.sonner-loading-bar {\r\n animation: sonner-spin 1.2s linear infinite;\r\n background: var(--gray11);\r\n border-radius: 6px;\r\n height: 8%;\r\n left: -10%;\r\n position: absolute;\r\n top: -3.9%;\r\n width: 24%;\r\n}\r\n.sonner-loading-bar:nth-child(1) {\r\n animation-delay: -1.2s;\r\n transform: rotate(0.0001deg) translate(146%);\r\n}\r\n.sonner-loading-bar:nth-child(2) {\r\n animation-delay: -1.1s;\r\n transform: rotate(30deg) translate(146%);\r\n}\r\n.sonner-loading-bar:nth-child(3) {\r\n animation-delay: -1s;\r\n transform: rotate(60deg) translate(146%);\r\n}\r\n.sonner-loading-bar:nth-child(4) {\r\n animation-delay: -0.9s;\r\n transform: rotate(90deg) translate(146%);\r\n}\r\n.sonner-loading-bar:nth-child(5) {\r\n animation-delay: -0.8s;\r\n transform: rotate(120deg) translate(146%);\r\n}\r\n.sonner-loading-bar:nth-child(6) {\r\n animation-delay: -0.7s;\r\n transform: rotate(150deg) translate(146%);\r\n}\r\n.sonner-loading-bar:nth-child(7) {\r\n animation-delay: -0.6s;\r\n transform: rotate(180deg) translate(146%);\r\n}\r\n.sonner-loading-bar:nth-child(8) {\r\n animation-delay: -0.5s;\r\n transform: rotate(210deg) translate(146%);\r\n}\r\n.sonner-loading-bar:nth-child(9) {\r\n animation-delay: -0.4s;\r\n transform: rotate(240deg) translate(146%);\r\n}\r\n.sonner-loading-bar:nth-child(10) {\r\n animation-delay: -0.3s;\r\n transform: rotate(270deg) translate(146%);\r\n}\r\n.sonner-loading-bar:nth-child(11) {\r\n animation-delay: -0.2s;\r\n transform: rotate(300deg) translate(146%);\r\n}\r\n.sonner-loading-bar:nth-child(12) {\r\n animation-delay: -0.1s;\r\n transform: rotate(330deg) translate(146%);\r\n}\r\n@keyframes sonner-fade-in {\r\n 0% {\r\n opacity: 0;\r\n transform: scale(0.8);\r\n }\r\n 100% {\r\n opacity: 1;\r\n transform: scale(1);\r\n }\r\n}\r\n@keyframes sonner-fade-out {\r\n 0% {\r\n opacity: 1;\r\n transform: scale(1);\r\n }\r\n 100% {\r\n opacity: 0;\r\n transform: scale(0.8);\r\n }\r\n}\r\n@keyframes sonner-spin {\r\n 0% {\r\n opacity: 1;\r\n }\r\n 100% {\r\n opacity: 0.15;\r\n }\r\n}\r\n@media (prefers-reduced-motion) {\r\n [data-sonner-toast],\r\n [data-sonner-toast] > *,\r\n .sonner-loading-bar {\r\n transition: none !important;\r\n animation: none !important;\r\n }\r\n}\r\n.sonner-loader {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n transform-origin: center;\r\n transition: opacity 200ms, transform 200ms;\r\n}\r\n.sonner-loader[data-visible=\"false\"] {\r\n opacity: 0;\r\n transform: scale(0.8) translate(-50%, -50%);\r\n}");}}catch(e){console.error('vite-plugin-css-injected-by-js', e);} })(); const sharedConfig = { context: undefined, registry: undefined, effects: undefined, done: false, getContextId() { return getContextId(this.context.count); }, getNextContextId() { return getContextId(this.context.count++); } }; function getContextId(count) { const num = String(count), len = num.length - 1; return sharedConfig.context.id + (len ? String.fromCharCode(96 + len) : "") + num; } function setHydrateContext(context) { sharedConfig.context = context; } const IS_DEV = false; const equalFn = (a, b) => a === b; const $PROXY = Symbol("solid-proxy"); const SUPPORTS_PROXY = typeof Proxy === "function"; const $TRACK = Symbol("solid-track"); const signalOptions = { equals: equalFn }; let runEffects = runQueue; const STALE = 1; const PENDING = 2; const UNOWNED = { owned: null, cleanups: null, context: null, owner: null }; const NO_INIT = {}; var Owner = null; let Transition = null; let ExternalSourceConfig = null; let Listener = null; let Updates = null; let Effects = null; let ExecCount = 0; function createRoot(fn, detachedOwner) { const listener = Listener, owner = Owner, unowned = fn.length === 0, current = detachedOwner === undefined ? owner : detachedOwner, root = unowned ? UNOWNED : { owned: null, cleanups: null, context: current ? current.context : null, owner: current }, updateFn = unowned ? fn : () => fn(() => untrack(() => cleanNode(root))); Owner = root; Listener = null; try { return runUpdates(updateFn, true); } finally { Listener = listener; Owner = owner; } } function createSignal(value, options) { options = options ? Object.assign({}, signalOptions, options) : signalOptions; const s = { value, observers: null, observerSlots: null, comparator: options.equals || undefined }; const setter = value => { if (typeof value === "function") { value = value(s.value); } return writeSignal(s, value); }; return [readSignal.bind(s), setter]; } function createComputed(fn, value, options) { const c = createComputation(fn, value, true, STALE); updateComputation(c); } function createRenderEffect(fn, value, options) { const c = createComputation(fn, value, false, STALE); updateComputation(c); } function createEffect(fn, value, options) { runEffects = runUserEffects; const c = createComputation(fn, value, false, STALE), s = SuspenseContext && useContext(SuspenseContext); if (s) c.suspense = s; if (!options || !options.render) c.user = true; Effects ? Effects.push(c) : updateComputation(c); } function createMemo(fn, value, options) { options = options ? Object.assign({}, signalOptions, options) : signalOptions; const c = createComputation(fn, value, true, 0); c.observers = null; c.observerSlots = null; c.comparator = options.equals || undefined; updateComputation(c); return readSignal.bind(c); } function isPromise(v) { return v && typeof v === "object" && "then" in v; } function createResource(pSource, pFetcher, pOptions) { let source; let fetcher; let options; { source = true; fetcher = pSource; options = {}; } let pr = null, initP = NO_INIT, id = null, scheduled = false, resolved = "initialValue" in options, dynamic = typeof source === "function" && createMemo(source); const contexts = new Set(), [value, setValue] = (options.storage || createSignal)(options.initialValue), [error, setError] = createSignal(undefined), [track, trigger] = createSignal(undefined, { equals: false }), [state, setState] = createSignal(resolved ? "ready" : "unresolved"); if (sharedConfig.context) { id = sharedConfig.getNextContextId(); if (options.ssrLoadFrom === "initial") initP = options.initialValue; else if (sharedConfig.load && sharedConfig.has(id)) initP = sharedConfig.load(id); } function loadEnd(p, v, error, key) { if (pr === p) { pr = null; key !== undefined && (resolved = true); if ((p === initP || v === initP) && options.onHydrated) queueMicrotask(() => options.onHydrated(key, { value: v }) ); initP = NO_INIT; completeLoad(v, error); } return v; } function completeLoad(v, err) { runUpdates(() => { if (err === undefined) setValue(() => v); setState(err !== undefined ? "errored" : resolved ? "ready" : "unresolved"); setError(err); for (const c of contexts.keys()) c.decrement(); contexts.clear(); }, false); } function read() { const c = SuspenseContext && useContext(SuspenseContext), v = value(), err = error(); if (err !== undefined && !pr) throw err; if (Listener && !Listener.user && c) { createComputed(() => { track(); if (pr) { if (c.resolved && Transition) ; else if (!contexts.has(c)) { c.increment(); contexts.add(c); } } }); } return v; } function load(refetching = true) { if (refetching !== false && scheduled) return; scheduled = false; const lookup = dynamic ? dynamic() : source; if (lookup == null || lookup === false) { loadEnd(pr, untrack(value)); return; } const p = initP !== NO_INIT ? initP : untrack(() => fetcher(lookup, { value: value(), refetching }) ); if (!isPromise(p)) { loadEnd(pr, p, undefined, lookup); return p; } pr = p; if ("value" in p) { if (p.status === "success") loadEnd(pr, p.value, undefined, lookup); else loadEnd(pr, undefined, castError(p.value), lookup); return p; } scheduled = true; queueMicrotask(() => (scheduled = false)); runUpdates(() => { setState(resolved ? "refreshing" : "pending"); trigger(); }, false); return p.then( v => loadEnd(p, v, undefined, lookup), e => loadEnd(p, undefined, castError(e), lookup) ); } Object.defineProperties(read, { state: { get: () => state() }, error: { get: () => error() }, loading: { get() { const s = state(); return s === "pending" || s === "refreshing"; } }, latest: { get() { if (!resolved) return read(); const err = error(); if (err && !pr) throw err; return value(); } } }); if (dynamic) createComputed(() => load(false)); else load(false); return [ read, { refetch: load, mutate: setValue } ]; } function batch(fn) { return runUpdates(fn, false); } function untrack(fn) { if (Listener === null) return fn(); const listener = Listener; Listener = null; try { if (ExternalSourceConfig) ; return fn(); } finally { Listener = listener; } } function on(deps, fn, options) { const isArray = Array.isArray(deps); let prevInput; return prevValue => { let input; if (isArray) { input = Array(deps.length); for (let i = 0; i < deps.length; i++) input[i] = deps[i](); } else input = deps(); const result = untrack(() => fn(input, prevInput, prevValue)); prevInput = input; return result; }; } function onMount(fn) { createEffect(() => untrack(fn)); } function onCleanup(fn) { if (Owner === null); else if (Owner.cleanups === null) Owner.cleanups = [fn]; else Owner.cleanups.push(fn); return fn; } function getListener() { return Listener; } function getOwner() { return Owner; } function runWithOwner(o, fn) { const prev = Owner; const prevListener = Listener; Owner = o; Listener = null; try { return runUpdates(fn, true); } catch (err) { handleError(err); } finally { Owner = prev; Listener = prevListener; } } const [transPending, setTransPending] = /*@__PURE__*/ createSignal(false); function resumeEffects(e) { Effects.push.apply(Effects, e); e.length = 0; } function createContext(defaultValue, options) { const id = Symbol("context"); return { id, Provider: createProvider(id), defaultValue }; } function useContext(context) { let value; return Owner && Owner.context && (value = Owner.context[context.id]) !== undefined ? value : context.defaultValue; } function children(fn) { const children = createMemo(fn); const memo = createMemo(() => resolveChildren(children())); memo.toArray = () => { const c = memo(); return Array.isArray(c) ? c : c != null ? [c] : []; }; return memo; } let SuspenseContext; function getSuspenseContext() { return SuspenseContext || (SuspenseContext = createContext()); } function readSignal() { if (this.sources && (this.state)) { if ((this.state) === STALE) updateComputation(this); else { const updates = Updates; Updates = null; runUpdates(() => lookUpstream(this), false); Updates = updates; } } if (Listener) { const sSlot = this.observers ? this.observers.length : 0; if (!Listener.sources) { Listener.sources = [this]; Listener.sourceSlots = [sSlot]; } else { Listener.sources.push(this); Listener.sourceSlots.push(sSlot); } if (!this.observers) { this.observers = [Listener]; this.observerSlots = [Listener.sources.length - 1]; } else { this.observers.push(Listener); this.observerSlots.push(Listener.sources.length - 1); } } return this.value; } function writeSignal(node, value, isComp) { let current = node.value; if (!node.comparator || !node.comparator(current, value)) { node.value = value; if (node.observers && node.observers.length) { runUpdates(() => { for (let i = 0; i < node.observers.length; i += 1) { const o = node.observers[i]; const TransitionRunning = Transition && Transition.running; if (TransitionRunning && Transition.disposed.has(o)) ; if (TransitionRunning ? !o.tState : !o.state) { if (o.pure) Updates.push(o); else Effects.push(o); if (o.observers) markDownstream(o); } if (!TransitionRunning) o.state = STALE; } if (Updates.length > 10e5) { Updates = []; if (IS_DEV); throw new Error(); } }, false); } } return value; } function updateComputation(node) { if (!node.fn) return; cleanNode(node); const time = ExecCount; runComputation( node, node.value, time ); } function runComputation(node, value, time) { let nextValue; const owner = Owner, listener = Listener; Listener = Owner = node; try { nextValue = node.fn(value); } catch (err) { if (node.pure) { { node.state = STALE; node.owned && node.owned.forEach(cleanNode); node.owned = null; } } node.updatedAt = time + 1; return handleError(err); } finally { Listener = listener; Owner = owner; } if (!node.updatedAt || node.updatedAt <= time) { if (node.updatedAt != null && "observers" in node) { writeSignal(node, nextValue); } else node.value = nextValue; node.updatedAt = time; } } function createComputation(fn, init, pure, state = STALE, options) { const c = { fn, state: state, updatedAt: null, owned: null, sources: null, sourceSlots: null, cleanups: null, value: init, owner: Owner, context: Owner ? Owner.context : null, pure }; if (Owner === null); else if (Owner !== UNOWNED) { { if (!Owner.owned) Owner.owned = [c]; else Owner.owned.push(c); } } return c; } function runTop(node) { if ((node.state) === 0) return; if ((node.state) === PENDING) return lookUpstream(node); if (node.suspense && untrack(node.suspense.inFallback)) return node.suspense.effects.push(node); const ancestors = [node]; while ((node = node.owner) && (!node.updatedAt || node.updatedAt < ExecCount)) { if (node.state) ancestors.push(node); } for (let i = ancestors.length - 1; i >= 0; i--) { node = ancestors[i]; if ((node.state) === STALE) { updateComputation(node); } else if ((node.state) === PENDING) { const updates = Updates; Updates = null; runUpdates(() => lookUpstream(node, ancestors[0]), false); Updates = updates; } } } function runUpdates(fn, init) { if (Updates) return fn(); let wait = false; if (!init) Updates = []; if (Effects) wait = true; else Effects = []; ExecCount++; try { const res = fn(); completeUpdates(wait); return res; } catch (err) { if (!wait) Effects = null; Updates = null; handleError(err); } } function completeUpdates(wait) { if (Updates) { runQueue(Updates); Updates = null; } if (wait) return; const e = Effects; Effects = null; if (e.length) runUpdates(() => runEffects(e), false); } function runQueue(queue) { for (let i = 0; i < queue.length; i++) runTop(queue[i]); } function runUserEffects(queue) { let i, userLength = 0; for (i = 0; i < queue.length; i++) { const e = queue[i]; if (!e.user) runTop(e); else queue[userLength++] = e; } if (sharedConfig.context) { if (sharedConfig.count) { sharedConfig.effects || (sharedConfig.effects = []); sharedConfig.effects.push(...queue.slice(0, userLength)); return; } setHydrateContext(); } if (sharedConfig.effects && (sharedConfig.done || !sharedConfig.count)) { queue = [...sharedConfig.effects, ...queue]; userLength += sharedConfig.effects.length; delete sharedConfig.effects; } for (i = 0; i < userLength; i++) runTop(queue[i]); } function lookUpstream(node, ignore) { node.state = 0; for (let i = 0; i < node.sources.length; i += 1) { const source = node.sources[i]; if (source.sources) { const state = source.state; if (state === STALE) { if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount)) runTop(source); } else if (state === PENDING) lookUpstream(source, ignore); } } } function markDownstream(node) { for (let i = 0; i < node.observers.length; i += 1) { const o = node.observers[i]; if (!o.state) { o.state = PENDING; if (o.pure) Updates.push(o); else Effects.push(o); o.observers && markDownstream(o); } } } function cleanNode(node) { let i; if (node.sources) { while (node.sources.length) { const source = node.sources.pop(), index = node.sourceSlots.pop(), obs = source.observers; if (obs && obs.length) { const n = obs.pop(), s = source.observerSlots.pop(); if (index < obs.length) { n.sourceSlots[s] = index; obs[index] = n; source.observerSlots[index] = s; } } } } if (node.tOwned) { for (i = node.tOwned.length - 1; i >= 0; i--) cleanNode(node.tOwned[i]); delete node.tOwned; } if (node.owned) { for (i = node.owned.length - 1; i >= 0; i--) cleanNode(node.owned[i]); node.owned = null; } if (node.cleanups) { for (i = node.cleanups.length - 1; i >= 0; i--) node.cleanups[i](); node.cleanups = null; } node.state = 0; } function castError(err) { if (err instanceof Error) return err; return new Error(typeof err === "string" ? err : "Unknown error", { cause: err }); } function handleError(err, owner = Owner) { const error = castError(err); throw error; } function resolveChildren(children) { if (typeof children === "function" && !children.length) return resolveChildren(children()); if (Array.isArray(children)) { const results = []; for (let i = 0; i < children.length; i++) { const result = resolveChildren(children[i]); Array.isArray(result) ? results.push.apply(results, result) : results.push(result); } return results; } return children; } function createProvider(id, options) { return function provider(props) { let res; createRenderEffect( () => (res = untrack(() => { Owner.context = { ...Owner.context, [id]: props.value }; return children(() => props.children); })), undefined ); return res; }; } const FALLBACK = Symbol("fallback"); function dispose(d) { for (let i = 0; i < d.length; i++) d[i](); } function mapArray(list, mapFn, options = {}) { let items = [], mapped = [], disposers = [], len = 0, indexes = mapFn.length > 1 ? [] : null; onCleanup(() => dispose(disposers)); return () => { let newItems = list() || [], newLen = newItems.length, i, j; newItems[$TRACK]; return untrack(() => { let newIndices, newIndicesNext, temp, tempdisposers, tempIndexes, start, end, newEnd, item; if (newLen === 0) { if (len !== 0) { dispose(disposers); disposers = []; items = []; mapped = []; len = 0; indexes && (indexes = []); } if (options.fallback) { items = [FALLBACK]; mapped[0] = createRoot(disposer => { disposers[0] = disposer; return options.fallback(); }); len = 1; } } else if (len === 0) { mapped = new Array(newLen); for (j = 0; j < newLen; j++) { items[j] = newItems[j]; mapped[j] = createRoot(mapper); } len = newLen; } else { temp = new Array(newLen); tempdisposers = new Array(newLen); indexes && (tempIndexes = new Array(newLen)); for ( start = 0, end = Math.min(len, newLen); start < end && items[start] === newItems[start]; start++ ); for ( end = len - 1, newEnd = newLen - 1; end >= start && newEnd >= start && items[end] === newItems[newEnd]; end--, newEnd-- ) { temp[newEnd] = mapped[end]; tempdisposers[newEnd] = disposers[end]; indexes && (tempIndexes[newEnd] = indexes[end]); } newIndices = new Map(); newIndicesNext = new Array(newEnd + 1); for (j = newEnd; j >= start; j--) { item = newItems[j]; i = newIndices.get(item); newIndicesNext[j] = i === undefined ? -1 : i; newIndices.set(item, j); } for (i = start; i <= end; i++) { item = items[i]; j = newIndices.get(item); if (j !== undefined && j !== -1) { temp[j] = mapped[i]; tempdisposers[j] = disposers[i]; indexes && (tempIndexes[j] = indexes[i]); j = newIndicesNext[j]; newIndices.set(item, j); } else disposers[i](); } for (j = start; j < newLen; j++) { if (j in temp) { mapped[j] = temp[j]; disposers[j] = tempdisposers[j]; if (indexes) { indexes[j] = tempIndexes[j]; indexes[j](j); } } else mapped[j] = createRoot(mapper); } mapped = mapped.slice(0, (len = newLen)); items = newItems.slice(0); } return mapped; }); function mapper(disposer) { disposers[j] = disposer; if (indexes) { const [s, set] = createSignal(j); indexes[j] = set; return mapFn(newItems[j], s); } return mapFn(newItems[j]); } }; } function createComponent(Comp, props) { return untrack(() => Comp(props || {})); } function trueFn() { return true; } const propTraps = { get(_, property, receiver) { if (property === $PROXY) return receiver; return _.get(property); }, has(_, property) { if (property === $PROXY) return true; return _.has(property); }, set: trueFn, deleteProperty: trueFn, getOwnPropertyDescriptor(_, property) { return { configurable: true, enumerable: true, get() { return _.get(property); }, set: trueFn, deleteProperty: trueFn }; }, ownKeys(_) { return _.keys(); } }; function resolveSource(s) { return !(s = typeof s === "function" ? s() : s) ? {} : s; } function resolveSources() { for (let i = 0, length = this.length; i < length; ++i) { const v = this[i](); if (v !== undefined) return v; } } function mergeProps(...sources) { let proxy = false; for (let i = 0; i < sources.length; i++) { const s = sources[i]; proxy = proxy || (!!s && $PROXY in s); sources[i] = typeof s === "function" ? ((proxy = true), createMemo(s)) : s; } if (SUPPORTS_PROXY && proxy) { return new Proxy( { get(property) { for (let i = sources.length - 1; i >= 0; i--) { const v = resolveSource(sources[i])[property]; if (v !== undefined) return v; } }, has(property) { for (let i = sources.length - 1; i >= 0; i--) { if (property in resolveSource(sources[i])) return true; } return false; }, keys() { const keys = []; for (let i = 0; i < sources.length; i++) keys.push(...Object.keys(resolveSource(sources[i]))); return [...new Set(keys)]; } }, propTraps ); } const sourcesMap = {}; const defined = Object.create(null); for (let i = sources.length - 1; i >= 0; i--) { const source = sources[i]; if (!source) continue; const sourceKeys = Object.getOwnPropertyNames(source); for (let i = sourceKeys.length - 1; i >= 0; i--) { const key = sourceKeys[i]; if (key === "__proto__" || key === "constructor") continue; const desc = Object.getOwnPropertyDescriptor(source, key); if (!defined[key]) { defined[key] = desc.get ? { enumerable: true, configurable: true, get: resolveSources.bind((sourcesMap[key] = [desc.get.bind(source)])) } : desc.value !== undefined ? desc : undefined; } else { const sources = sourcesMap[key]; if (sources) { if (desc.get) sources.push(desc.get.bind(source)); else if (desc.value !== undefined) sources.push(() => desc.value); } } } } const target = {}; const definedKeys = Object.keys(defined); for (let i = definedKeys.length - 1; i >= 0; i--) { const key = definedKeys[i], desc = defined[key]; if (desc && desc.get) Object.defineProperty(target, key, desc); else target[key] = desc ? desc.value : undefined; } return target; } const narrowedError = name => `Stale read from <${name}>.`; function For(props) { const fallback = "fallback" in props && { fallback: () => props.fallback }; return createMemo(mapArray(() => props.each, props.children, fallback || undefined)); } function Show(props) { const keyed = props.keyed; const conditionValue = createMemo(() => props.when, undefined, undefined); const condition = keyed ? conditionValue : createMemo(conditionValue, undefined, { equals: (a, b) => !a === !b }); return createMemo( () => { const c = condition(); if (c) { const child = props.children; const fn = typeof child === "function" && child.length > 0; return fn ? untrack(() => child( keyed ? c : () => { if (!untrack(condition)) throw narrowedError("Show"); return conditionValue(); } ) ) : child; } return props.fallback; }, undefined, undefined ); } function Switch(props) { const chs = children(() => props.children); const switchFunc = createMemo(() => { const ch = chs(); const mps = Array.isArray(ch) ? ch : [ch]; let func = () => undefined; for (let i = 0; i < mps.length; i++) { const index = i; const mp = mps[i]; const prevFunc = func; const conditionValue = createMemo( () => (prevFunc() ? undefined : mp.when), undefined, undefined ); const condition = mp.keyed ? conditionValue : createMemo(conditionValue, undefined, { equals: (a, b) => !a === !b }); func = () => prevFunc() || (condition() ? [index, conditionValue, mp] : undefined); } return func; }); return createMemo( () => { const sel = switchFunc()(); if (!sel) return props.fallback; const [index, conditionValue, mp] = sel; const child = mp.children; const fn = typeof child === "function" && child.length > 0; return fn ? untrack(() => child( mp.keyed ? conditionValue() : () => { if (untrack(switchFunc)()?.[0] !== index) throw narrowedError("Match"); return conditionValue(); } ) ) : child; }, undefined, undefined ); } function Match(props) { return props; } const SuspenseListContext = /* #__PURE__ */ createContext(); function Suspense(props) { let counter = 0, show, ctx, p, flicker, error; const [inFallback, setFallback] = createSignal(false), SuspenseContext = getSuspenseContext(), store = { increment: () => { if (++counter === 1) setFallback(true); }, decrement: () => { if (--counter === 0) setFallback(false); }, inFallback, effects: [], resolved: false }, owner = getOwner(); if (sharedConfig.context && sharedConfig.load) { const key = sharedConfig.getContextId(); let ref = sharedConfig.load(key); if (ref) { if (typeof ref !== "object" || ref.status !== "success") p = ref; else sharedConfig.gather(key); } if (p && p !== "$$f") { const [s, set] = createSignal(undefined, { equals: false }); flicker = s; p.then( () => { if (sharedConfig.done) return set(); sharedConfig.gather(key); setHydrateContext(ctx); set(); setHydrateContext(); }, err => { error = err; set(); } ); } } const listContext = useContext(SuspenseListContext); if (listContext) show = listContext.register(store.inFallback); let dispose; onCleanup(() => dispose && dispose()); return createComponent(SuspenseContext.Provider, { value: store, get children() { return createMemo(() => { if (error) throw error; ctx = sharedConfig.context; if (flicker) { flicker(); return (flicker = undefined); } if (ctx && p === "$$f") setHydrateContext(); const rendered = createMemo(() => props.children); return createMemo(prev => { const inFallback = store.inFallback(), { showContent = true, showFallback = true } = show ? show() : {}; if ((!inFallback || (p && p !== "$$f")) && showContent) { store.resolved = true; dispose && dispose(); dispose = ctx = p = undefined; resumeEffects(store.effects); return rendered(); } if (!showFallback) return; if (dispose) return prev; return createRoot(disposer => { dispose = disposer; if (ctx) { setHydrateContext({ id: ctx.id + "F", count: 0 }); ctx = undefined; } return props.fallback; }, owner); }); }); } }); } const booleans = [ "allowfullscreen", "async", "autofocus", "autoplay", "checked", "controls", "default", "disabled", "formnovalidate", "hidden", "indeterminate", "inert", "ismap", "loop", "multiple", "muted", "nomodule", "novalidate", "open", "playsinline", "readonly", "required", "reversed", "seamless", "selected" ]; const Properties = /*#__PURE__*/ new Set([ "className", "value", "readOnly", "formNoValidate", "isMap", "noModule", "playsInline", ...booleans ]); const ChildProperties = /*#__PURE__*/ new Set([ "innerHTML", "textContent", "innerText", "children" ]); const Aliases = /*#__PURE__*/ Object.assign(Object.create(null), { className: "class", htmlFor: "for" }); const PropAliases = /*#__PURE__*/ Object.assign(Object.create(null), { class: "className", formnovalidate: { $: "formNoValidate", BUTTON: 1, INPUT: 1 }, ismap: { $: "isMap", IMG: 1 }, nomodule: { $: "noModule", SCRIPT: 1 }, playsinline: { $: "playsInline", VIDEO: 1 }, readonly: { $: "readOnly", INPUT: 1, TEXTAREA: 1 } }); function getPropAlias(prop, tagName) { const a = PropAliases[prop]; return typeof a === "object" ? (a[tagName] ? a["$"] : undefined) : a; } const DelegatedEvents = /*#__PURE__*/ new Set([ "beforeinput", "click", "dblclick", "contextmenu", "focusin", "focusout", "input", "keydown", "keyup", "mousedown", "mousemove", "mouseout", "mouseover", "mouseup", "pointerdown", "pointermove", "pointerout", "pointerover", "pointerup", "touchend", "touchmove", "touchstart" ]); function reconcileArrays(parentNode, a, b) { let bLength = b.length, aEnd = a.length, bEnd = bLength, aStart = 0, bStart = 0, after = a[aEnd - 1].nextSibling, map = null; while (aStart < aEnd || bStart < bEnd) { if (a[aStart] === b[bStart]) { aStart++; bStart++; continue; } while (a[aEnd - 1] === b[bEnd - 1]) { aEnd--; bEnd--; } if (aEnd === aStart) { const node = bEnd < bLength ? (bStart ? b[bStart - 1].nextSibling : b[bEnd - bStart]) : after; while (bStart < bEnd) parentNode.insertBefore(b[bStart++], node); } else if (bEnd === bStart) { while (aStart < aEnd) { if (!map || !map.has(a[aStart])) a[aStart].remove(); aStart++; } } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) { const node = a[--aEnd].nextSibling; parentNode.insertBefore(b[bStart++], a[aStart++].nextSibling); parentNode.insertBefore(b[--bEnd], node); a[aEnd] = b[bEnd]; } else { if (!map) { map = new Map(); let i = bStart; while (i < bEnd) map.set(b[i], i++); } const index = map.get(a[aStart]); if (index != null) { if (bStart < index && index < bEnd) { let i = aStart, sequence = 1, t; while (++i < aEnd && i < bEnd) { if ((t = map.get(a[i])) == null || t !== index + sequence) break; sequence++; } if (sequence > index - bStart) { const node = a[aStart]; while (bStart < index) parentNode.insertBefore(b[bStart++], node); } else parentNode.replaceChild(b[bStart++], a[aStart++]); } else aStart++; } else a[aStart++].remove(); } } } const $$EVENTS = "_$DX_DELEGATE"; function render(code, element, init, options = {}) { let disposer; createRoot(dispose => { disposer = dispose; element === document ? code() : insert(element, code(), element.firstChild ? null : undefined, init); }, options.owner); return () => { disposer(); element.textContent = ""; }; } function template(html, isImportNode, isSVG, isMathML) { let node; const create = () => { const t = document.createElement("template"); t.innerHTML = html; return t.content.firstChild; }; const fn = () => (node || (node = create())).cloneNode(true); fn.cloneNode = fn; return fn; } function delegateEvents(eventNames, document = window.document) { const e = document[$$EVENTS] || (document[$$EVENTS] = new Set()); for (let i = 0, l = eventNames.length; i < l; i++) { const name = eventNames[i]; if (!e.has(name)) { e.add(name); document.addEventListener(name, eventHandler); } } } function setAttribute(node, name, value) { if (isHydrating(node)) return; if (value == null) node.removeAttribute(name); else node.setAttribute(name, value); } function setBoolAttribute(node, name, value) { if (isHydrating(node)) return; value ? node.setAttribute(name, "") : node.removeAttribute(name); } function className(node, value) { if (isHydrating(node)) return; if (value == null) node.removeAttribute("class"); else node.className = value; } function addEventListener(node, name, handler, delegate) { if (delegate) { if (Array.isArray(handler)) { node[`$$${name}`] = handler[0]; node[`$$${name}Data`] = handler[1]; } else node[`$$${name}`] = handler; } else if (Array.isArray(handler)) { const handlerFn = handler[0]; node.addEventListener(name, (handler[0] = e => handlerFn.call(node, handler[1], e))); } else node.addEventListener(name, handler, typeof handler !== "function" && handler); } function classList(node, value, prev = {}) { const classKeys = Object.keys(value || {}), prevKeys = Object.keys(prev); let i, len; for (i = 0, len = prevKeys.length; i < len; i++) { const key = prevKeys[i]; if (!key || key === "undefined" || value[key]) continue; toggleClassKey(node, key, false); delete prev[key]; } for (i = 0, len = classKeys.length; i < len; i++) { const key = classKeys[i], classValue = !!value[key]; if (!key || key === "undefined" || prev[key] === classValue || !classValue) continue; toggleClassKey(node, key, true); prev[key] = classValue; } return prev; } function style(node, value, prev) { if (!value) return prev ? setAttribute(node, "style") : value; const nodeStyle = node.style; if (typeof value === "string") return (nodeStyle.cssText = value); typeof prev === "string" && (nodeStyle.cssText = prev = undefined); prev || (prev = {}); value || (value = {}); let v, s; for (s in prev) { value[s] == null && nodeStyle.removeProperty(s); delete prev[s]; } for (s in value) { v = value[s]; if (v !== prev[s]) { nodeStyle.setProperty(s, v); prev[s] = v; } } return prev; } function spread(node, props = {}, isSVG, skipChildren) { const prevProps = {}; { createRenderEffect( () => (prevProps.children = insertExpression(node, props.children, prevProps.children)) ); } createRenderEffect(() => typeof props.ref === "function" && use(props.ref, node)); createRenderEffect(() => assign(node, props, isSVG, true, prevProps, true)); return prevProps; } function use(fn, element, arg) { return untrack(() => fn(element, arg)); } function insert(parent, accessor, marker, initial) { if (marker !== undefined && !initial) initial = []; if (typeof accessor !== "function") return insertExpression(parent, accessor, initial, marker); createRenderEffect(current => insertExpression(parent, accessor(), current, marker), initial); } function assign(node, props, isSVG, skipChildren, prevProps = {}, skipRef = false) { props || (props = {}); for (const prop in prevProps) { if (!(prop in props)) { if (prop === "children") continue; prevProps[prop] = assignProp(node, prop, null, prevProps[prop], isSVG, skipRef, props); } } for (const prop in props) { if (prop === "children") { continue; } const value = props[prop]; prevProps[prop] = assignProp(node, prop, value, prevProps[prop], isSVG, skipRef, props); } } function isHydrating(node) { return !!sharedConfig.context && !sharedConfig.done && (!node || node.isConnected); } function toPropertyName(name) { return name.toLowerCase().replace(/-([a-z])/g, (_, w) => w.toUpperCase()); } function toggleClassKey(node, key, value) { const classNames = key.trim().split(/\s+/); for (let i = 0, nameLen = classNames.length; i < nameLen; i++) node.classList.toggle(classNames[i], value); } function assignProp(node, prop, value, prev, isSVG, skipRef, props) { let isCE, isProp, isChildProp, propAlias, forceProp; if (prop === "style") return style(node, value, prev); if (prop === "classList") return classList(node, value, prev); if (value === prev) return prev; if (prop === "ref") { if (!skipRef) value(node); } else if (prop.slice(0, 3) === "on:") { const e = prop.slice(3); prev && node.removeEventListener(e, prev, typeof prev !== "function" && prev); value && node.addEventListener(e, value, typeof value !== "function" && value); } else if (prop.slice(0, 10) === "oncapture:") { const e = prop.slice(10); prev && node.removeEventListener(e, prev, true); value && node.addEventListener(e, value, true); } else if (prop.slice(0, 2) === "on") { const name = prop.slice(2).toLowerCase(); const delegate = DelegatedEvents.has(name); if (!delegate && prev) { const h = Array.isArray(prev) ? prev[0] : prev; node.removeEventListener(name, h); } if (delegate || value) { addEventListener(node, name, value, delegate); delegate && delegateEvents([name]); } } else if (prop.slice(0, 5) === "attr:") { setAttribute(node, prop.slice(5), value); } else if (prop.slice(0, 5) === "bool:") { setBoolAttribute(node, prop.slice(5), value); } else if ( (forceProp = prop.slice(0, 5) === "prop:") || (isChildProp = ChildProperties.has(prop)) || (((propAlias = getPropAlias(prop, node.tagName)) || (isProp = Properties.has(prop)))) || (isCE = node.nodeName.includes("-") || "is" in props) ) { if (forceProp) { prop = prop.slice(5); isProp = true; } else if (isHydrating(node)) return value; if (prop === "class" || prop === "className") className(node, value); else if (isCE && !isProp && !isChildProp) node[toPropertyName(prop)] = value; else node[propAlias || prop] = value; } else { setAttribute(node, Aliases[prop] || prop, value); } return value; } function eventHandler(e) { if (sharedConfig.registry && sharedConfig.events) { if (sharedConfig.events.find(([el, ev]) => ev === e)) return; } let node = e.target; const key = `$$${e.type}`; const oriTarget = e.target; const oriCurrentTarget = e.currentTarget; const retarget = value => Object.defineProperty(e, "target", { configurable: true, value }); const handleNode = () => { const handler = node[key]; if (handler && !node.disabled) { const data = node[`${key}Data`]; data !== undefined ? handler.call(node, data, e) : handler.call(node, e); if (e.cancelBubble) return; } node.host && typeof node.host !== "string" && !node.host._$host && node.contains(e.target) && retarget(node.host); return true; }; const walkUpTree = () => { while (handleNode() && (node = node._$host || node.parentNode || node.host)); }; Object.defineProperty(e, "currentTarget", { configurable: true, get() { return node || document; } }); if (sharedConfig.registry && !sharedConfig.done) sharedConfig.done = _$HY.done = true; if (e.composedPath) { const path = e.composedPath(); retarget(path[0]); for (let i = 0; i < path.length - 2; i++) { node = path[i]; if (!handleNode()) break; if (node._$host) { node = node._$host; walkUpTree(); break; } if (node.parentNode === oriCurrentTarget) { break; } } } else walkUpTree(); retarget(oriTarget); } function insertExpression(parent, value, current, marker, unwrapArray) { const hydrating = isHydrating(parent); if (hydrating) { !current && (current = [...parent.childNodes]); let cleaned = []; for (let i = 0; i < current.length; i++) { const node = current[i]; if (node.nodeType === 8 && node.data.slice(0, 2) === "!$") node.remove(); else cleaned.push(node); } current = cleaned; } while (typeof current === "function") current = current(); if (value === current) return current; const t = typeof value, multi = marker !== undefined; parent = (multi && current[0] && current[0].parentNode) || parent; if (t === "string" || t === "number") { if (hydrating) return current; if (t === "number") { value = value.toString(); if (value === current) return current; } if (multi) { let node = current[0]; if (node && node.nodeType === 3) { node.data !== value && (node.data = value); } else node = document.createTextNode(value); current = cleanChildren(parent, current, marker, node); } else { if (current !== "" && typeof current === "string") { current = parent.firstChild.data = value; } else current = parent.textContent = value; } } else if (value == null || t === "boolean") { if (hydrating) return current; current = cleanChildren(parent, current, marker); } else if (t === "function") { createRenderEffect(() => { let v = value(); while (typeof v === "function") v = v(); current = insertExpression(parent, v, current, marker); }); return () => current; } else if (Array.isArray(value)) { const array = []; const currentArray = current && Array.isArray(current); if (normalizeIncomingArray(array, value, current, unwrapArray)) { createRenderEffect(() => (current = insertExpression(parent, array, current, marker, true))); return () => current; } if (hydrating) { if (!array.length) return current; if (marker === undefined) return (current = [...parent.childNodes]); let node = array[0]; if (node.parentNode !== parent) return current; const nodes = [node]; while ((node = node.nextSibling) !== marker) nodes.push(node); return (current = nodes); } if (array.length === 0) { current = cleanChildren(parent, current, marker); if (multi) return current; } else if (currentArray) { if (current.length === 0) { appendNodes(parent, array, marker); } else reconcileArrays(parent, current, array); } else { current && cleanChildren(parent); appendNodes(parent, array); } current = array; } else if (value.nodeType) { if (hydrating && value.parentNode) return (current = multi ? [value] : value); if (Array.isArray(current)) { if (multi) return (current = cleanChildren(parent, current, marker, value)); cleanChildren(parent, current, null, value); } else if (current == null || current === "" || !parent.firstChild) { parent.appendChild(value); } else parent.replaceChild(value, parent.firstChild); current = value; } else; return current; } function normalizeIncomingArray(normalized, array, current, unwrap) { let dynamic = false; for (let i = 0, len = array.length; i < len; i++) { let item = array[i], prev = current && current[normalized.length], t; if (item == null || item === true || item === false); else if ((t = typeof item) === "object" && item.nodeType) { normalized.push(item); } else if (Array.isArray(item)) { dynamic = normalizeIncomingArray(normalized, item, prev) || dynamic; } else if (t === "function") { if (unwrap) { while (typeof item === "function") item = item(); dynamic = normalizeIncomingArray( normalized, Array.isArray(item) ? item : [item], Array.isArray(prev) ? prev : [prev] ) || dynamic; } else { normalized.push(item); dynamic = true; } } else { const value = String(item); if (prev && prev.nodeType === 3 && prev.data === value) normalized.push(prev); else normalized.push(document.createTextNode(value)); } } return dynamic; } function appendNodes(parent, array, marker = null) { for (let i = 0, len = array.length; i < len; i++) parent.insertBefore(array[i], marker); } function cleanChildren(parent, current, marker, replacement) { if (marker === undefined) return (parent.textContent = ""); const node = replacement || document.createTextNode(""); if (current.length) { let inserted = false; for (let i = current.length - 1; i >= 0; i--) { const el = current[i]; if (node !== el) { const isParent = el.parentNode === parent; if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker); else isParent && el.remove(); } else inserted = true; } } else parent.insertBefore(node, marker); return [node]; } const SVG_NAMESPACE = "http://www.w3.org/2000/svg"; function createElement(tagName, isSVG = false) { return isSVG ? document.createElementNS(SVG_NAMESPACE, tagName) : document.createElement(tagName); } function Portal(props) { const { useShadow } = props, marker = document.createTextNode(""), mount = () => props.mount || document.body, owner = getOwner(); let content; let hydrating = !!sharedConfig.context; createEffect( () => { if (hydrating) getOwner().user = hydrating = false; content || (content = runWithOwner(owner, () => createMemo(() => props.children))); const el = mount(); if (el instanceof HTMLHeadElement) { const [clean, setClean] = createSignal(false); const cleanup = () => setClean(true); createRoot(dispose => insert(el, () => (!clean() ? content() : dispose()), null)); onCleanup(cleanup); } else { const container = createElement(props.isSVG ? "g" : "div", props.isSVG), renderRoot = useShadow && container.attachShadow ? container.attachShadow({ mode: "open" }) : container; Object.defineProperty(container, "_$host", { get() { return marker.parentNode; }, configurable: true }); insert(renderRoot, content); el.appendChild(container); props.ref && props.ref(container); onCleanup(() => el.removeChild(container)); } }, undefined, { render: !hydrating } ); return marker; } const $RAW = Symbol("store-raw"), $NODE = Symbol("store-node"), $HAS = Symbol("store-has"), $SELF = Symbol("store-self"); function wrap$1(value) { let p = value[$PROXY]; if (!p) { Object.defineProperty(value, $PROXY, { value: (p = new Proxy(value, proxyTraps$1)) }); if (!Array.isArray(value)) { const keys = Object.keys(value), desc = Object.getOwnPropertyDescriptors(value); for (let i = 0, l = keys.length; i < l; i++) { const prop = keys[i]; if (desc[prop].get) { Object.defineProperty(value, prop, { enumerable: desc[prop].enumerable, get: desc[prop].get.bind(p) }); } } } } return p; } function isWrappable(obj) { let proto; return ( obj != null && typeof obj === "object" && (obj[$PROXY] || !(proto = Object.getPrototypeOf(obj)) || proto === Object.prototype || Array.isArray(obj)) ); } function unwrap(item, set = new Set()) { let result, unwrapped, v, prop; if ((result = item != null && item[$RAW])) return result; if (!isWrappable(item) || set.has(item)) return item; if (Array.isArray(item)) { if (Object.isFrozen(item)) item = item.slice(0); else set.add(item); for (let i = 0, l = item.length; i < l; i++) { v = item[i]; if ((unwrapped = unwrap(v, set)) !== v) item[i] = unwrapped; } } else { if (Object.isFrozen(item)) item = Object.assign({}, item); else set.add(item); const keys = Object.keys(item), desc = Object.getOwnPropertyDescriptors(item); for (let i = 0, l = keys.length; i < l; i++) { prop = keys[i]; if (desc[prop].get) continue; v = item[prop]; if ((unwrapped = unwrap(v, set)) !== v) item[prop] = unwrapped; } } return item; } function getNodes(target, symbol) { let nodes = target[symbol]; if (!nodes) Object.defineProperty(target, symbol, { value: (nodes = Object.create(null)) }); return nodes; } function getNode(nodes, property, value) { if (nodes[property]) return nodes[property]; const [s, set] = createSignal(value, { equals: false, internal: true }); s.$ = set; return (nodes[property] = s); } function proxyDescriptor$1(target, property) { const desc = Reflect.getOwnPropertyDescriptor(target, property); if (!desc || desc.get || !desc.configurable || property === $PROXY || property === $NODE) return desc; delete desc.value; delete desc.writable; desc.get = () => target[$PROXY][property]; return desc; } function trackSelf(target) { getListener() && getNode(getNodes(target, $NODE), $SELF)(); } function ownKeys(target) { trackSelf(target); return Reflect.ownKeys(target); } const proxyTraps$1 = { get(target, property, receiver) { if (property === $RAW) return target; if (property === $PROXY) return receiver; if (property === $TRACK) { trackSelf(target); return receiver; } const nodes = getNodes(target, $NODE); const tracked = nodes[property]; let value = tracked ? tracked() : target[property]; if (property === $NODE || property === $HAS || property === "__proto__") return value; if (!tracked) { const desc = Object.getOwnPropertyDescriptor(target, property); if ( getListener() && (typeof value !== "function" || target.hasOwnProperty(property)) && !(desc && desc.get) ) value = getNode(nodes, property, value)(); } return isWrappable(value) ? wrap$1(value) : value; }, has(target, property) { if ( property === $RAW || property === $PROXY || property === $TRACK || property === $NODE || property === $HAS || property === "__proto__" ) return true; getListener() && getNode(getNodes(target, $HAS), property)(); return property in target; }, set() { return true; }, deleteProperty() { return true; }, ownKeys: ownKeys, getOwnPropertyDescriptor: proxyDescriptor$1 }; function setProperty(state, property, value, deleting = false) { if (!deleting && state[property] === value) return; const prev = state[property], len = state.length; if (value === undefined) { delete state[property]; if (state[$HAS] && state[$HAS][property] && prev !== undefined) state[$HAS][property].$(); } else { state[property] = value; if (state[$HAS] && state[$HAS][property] && prev === undefined) state[$HAS][property].$(); } let nodes = getNodes(state, $NODE), node; if ((node = getNode(nodes, property, prev))) node.$(() => value); if (Array.isArray(state) && state.length !== len) { for (let i = state.length; i < len; i++) (node = nodes[i]) && node.$(); (node = getNode(nodes, "length", len)) && node.$(state.length); } (node = nodes[$SELF]) && node.$(); } function mergeStoreNode(state, value) { const keys = Object.keys(value); for (let i = 0; i < keys.length; i += 1) { const key = keys[i]; setProperty(state, key, value[key]); } } function updateArray(current, next) { if (typeof next === "function") next = next(current); next = unwrap(next); if (Array.isArray(next)) { if (current === next) return; let i = 0, len = next.length; for (; i < len; i++) { const value = next[i]; if (current[i] !== value) setProperty(current, i, value); } setProperty(current, "length", len); } else mergeStoreNode(current, next); } function updatePath(current, path, traversed = []) { let part, prev = current; if (path.length > 1) { part = path.shift(); const partType = typeof part, isArray = Array.isArray(current); if (Array.isArray(part)) { for (let i = 0; i < part.length; i++) { updatePath(current, [part[i]].concat(path), traversed); } return; } else if (isArray && partType === "function") { for (let i = 0; i < current.length; i++) { if (part(current[i], i)) updatePath(current, [i].concat(path), traversed); } return; } else if (isArray && partType === "object") { const { from = 0, to = current.length - 1, by = 1 } = part; for (let i = from; i <= to; i += by) { updatePath(current, [i].concat(path), traversed); } return; } else if (path.length > 1) { updatePath(current[part], path, [part].concat(traversed)); return; } prev = current[part]; traversed = [part].concat(traversed); } let value = path[0]; if (typeof value === "function") { value = value(prev, traversed); if (value === prev) return; } if (part === undefined && value == undefined) return; value = unwrap(value); if (part === undefined || (isWrappable(prev) && isWrappable(value) && !Array.isArray(value))) { mergeStoreNode(prev, value); } else setProperty(current, part, value); } function createStore(...[store, options]) { const unwrappedStore = unwrap(store || {}); const isArray = Array.isArray(unwrappedStore); const wrappedStore = wrap$1(unwrappedStore); function setStore(...args) { batch(() => { isArray && args.length === 1 ? updateArray(unwrappedStore, args[0]) : updatePath(unwrappedStore, args); }); } return [wrappedStore, setStore]; } const $ROOT = Symbol("store-root"); function applyState(target, parent, property, merge, key) { const previous = parent[property]; if (target === previous) return; const isArray = Array.isArray(target); if ( property !== $ROOT && (!isWrappable(target) || !isWrappable(previous) || isArray !== Array.isArray(previous) || (key && target[key] !== previous[key])) ) { setProperty(parent, property, target); return; } if (isArray) { if ( target.length && previous.length && (!merge || (key && target[0] && target[0][key] != null)) ) { let i, j, start, end, newEnd, item, newIndicesNext, keyVal; for ( start = 0, end = Math.min(previous.length, target.length); start < end && (previous[start] === target[start] || (key && previous[start] && target[start] && previous[start][key] === target[start][key])); start++ ) { applyState(target[start], previous, start, merge, key); } const temp = new Array(target.length), newIndices = new Map(); for ( end = previous.length - 1, newEnd = target.length - 1; end >= start && newEnd >= start && (previous[end] === target[newEnd] || (key && previous[end] && target[newEnd] && previous[end][key] === target[newEnd][key])); end--, newEnd-- ) { temp[newEnd] = previous[end]; } if (start > newEnd || start > end) { for (j = start; j <= newEnd; j++) setProperty(previous, j, target[j]); for (; j < target.length; j++) { setProperty(previous, j, temp[j]); applyState(target[j], previous, j, merge, key); } if (previous.length > target.length) setProperty(previous, "length", target.length); return; } newIndicesNext = new Array(newEnd + 1); for (j = newEnd; j >= start; j--) { item = target[j]; keyVal = key && item ? item[key] : item; i = newIndices.get(keyVal); newIndicesNext[j] = i === undefined ? -1 : i; newIndices.set(keyVal, j); } for (i = start; i <= end; i++) { item = previous[i]; keyVal = key && item ? item[key] : item; j = newIndices.get(keyVal); if (j !== undefined && j !== -1) { temp[j] = previous[i]; j = newIndicesNext[j]; newIndices.set(keyVal, j); } } for (j = start; j < target.length; j++) { if (j in temp) { setProperty(previous, j, temp[j]); applyState(target[j], previous, j, merge, key); } else setProperty(previous, j, target[j]); } } else { for (let i = 0, len = target.length; i < len; i++) { applyState(target[i], previous, i, merge, key); } } if (previous.length > target.length) setProperty(previous, "length", target.length); return; } const targetKeys = Object.keys(target); for (let i = 0, len = targetKeys.length; i < len; i++) { applyState(target[targetKeys[i]], previous, targetKeys[i], merge, key); } const previousKeys = Object.keys(previous); for (let i = 0, len = previousKeys.length; i < len; i++) { if (target[previousKeys[i]] === undefined) setProperty(previous, previousKeys[i], undefined); } } function reconcile(value, options = {}) { const { merge, key = "id" } = options, v = unwrap(value); return state => { if (!isWrappable(state) || !isWrappable(v)) return v; const res = applyState( v, { [$ROOT]: state }, $ROOT, merge, key ); return res === undefined ? state : res; }; } const producers = new WeakMap(); const setterTraps = { get(target, property) { if (property === $RAW) return target; const value = target[property]; let proxy; return isWrappable(value) ? producers.get(value) || (producers.set(value, (proxy = new Proxy(value, setterTraps))), proxy) : value; }, set(target, property, value) { setProperty(target, property, unwrap(value)); return true; }, deleteProperty(target, property) { setProperty(target, property, undefined, true); return true; } }; function produce(fn) { return state => { if (isWrappable(state)) { let proxy; if (!(proxy = producers.get(state))) { producers.set(state, (proxy = new Proxy(state, setterTraps))); } fn(proxy); } return state; }; } var _tmpl$$5 = /* @__PURE__ */ template(`<div class=sonner-loading-wrapper><div class=sonner-spinner>`), _tmpl$2$4 = /* @__PURE__ */ template(`<div class=sonner-loading-bar>`), _tmpl$3$2 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 20 20"fill=currentColor height=20 width=20><path fill-rule=evenodd d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z"clip-rule=evenodd>`), _tmpl$4$2 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=currentColor height=20 width=20><path fill-rule=evenodd d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z"clip-rule=evenodd>`), _tmpl$5$1 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 20 20"fill=currentColor height=20 width=20><path fill-rule=evenodd d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z"clip-rule=evenodd>`), _tmpl$6$1 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 20 20"fill=currentColor height=20 width=20><path fill-rule=evenodd d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z"clip-rule=evenodd>`), _tmpl$7 = /* @__PURE__ */ template(`<div class=sonner-loader>`), _tmpl$8 = /* @__PURE__ */ template(`<button aria-label="Close toast"data-close-button><svg xmlns=http://www.w3.org/2000/svg width=12 height=12 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round><line x1=18 y1=6 x2=6 y2=18></line><line x1=6 y1=6 x2=18 y2=18>`), _tmpl$9 = /* @__PURE__ */ template(`<li aria-atomic=true role=status tabindex=0 data-sonner-toast>`), _tmpl$10 = /* @__PURE__ */ template(`<div data-icon>`), _tmpl$11 = /* @__PURE__ */ template(`<div data-description>`), _tmpl$12 = /* @__PURE__ */ template(`<div data-content><div data-title>`), _tmpl$13 = /* @__PURE__ */ template(`<button data-button data-cancel>`), _tmpl$14 = /* @__PURE__ */ template(`<button data-button>`), _tmpl$15 = /* @__PURE__ */ template(`<section tabindex=-1>`), _tmpl$16 = /* @__PURE__ */ template(`<ol tabindex=-1 data-sonner-toaster>`); function styleInject(css, { insertAt } = {}) { if (typeof document === "undefined") return; const head = document.head || document.getElementsByTagName("head")[0]; const style = document.createElement("style"); style.type = "text/css"; if (insertAt === "top") { if (head.firstChild) { head.insertBefore(style, head.firstChild); } else { head.appendChild(style); } } else { head.appendChild(style); } if (style.styleSheet) { style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); } } styleInject(':where(html[dir=ltr]),\n:where([data-sonner-toaster][dir=ltr]) {\n --toast-icon-margin-start: -3px;\n --toast-icon-margin-end: 4px;\n --toast-svg-margin-start: -1px;\n --toast-svg-margin-end: 0px;\n --toast-button-margin-start: auto;\n --toast-button-margin-end: 0;\n --toast-close-button-start: 0;\n --toast-close-button-end: unset;\n --toast-close-button-transform: translate(-35%, -35%);\n}\n:where(html[dir=rtl]),\n:where([data-sonner-toaster][dir=rtl]) {\n --toast-icon-margin-start: 4px;\n --toast-icon-margin-end: -3px;\n --toast-svg-margin-start: 0px;\n --toast-svg-margin-end: -1px;\n --toast-button-margin-start: 0;\n --toast-button-margin-end: auto;\n --toast-close-button-start: unset;\n --toast-close-button-end: 0;\n --toast-close-button-transform: translate(35%, -35%);\n}\n:where([data-sonner-toaster]) {\n position: fixed;\n width: var(--width);\n font-family:\n ui-sans-serif,\n system-ui,\n -apple-system,\n BlinkMacSystemFont,\n Segoe UI,\n Roboto,\n Helvetica Neue,\n Arial,\n Noto Sans,\n sans-serif,\n Apple Color Emoji,\n Segoe UI Emoji,\n Segoe UI Symbol,\n Noto Color Emoji;\n --gray1: hsl(0, 0%, 99%);\n --gray2: hsl(0, 0%, 97.3%);\n --gray3: hsl(0, 0%, 95.1%);\n --gray4: hsl(0, 0%, 93%);\n --gray5: hsl(0, 0%, 90.9%);\n --gray6: hsl(0, 0%, 88.7%);\n --gray7: hsl(0, 0%, 85.8%);\n --gray8: hsl(0, 0%, 78%);\n --gray9: hsl(0, 0%, 56.1%);\n --gray10: hsl(0, 0%, 52.3%);\n --gray11: hsl(0, 0%, 43.5%);\n --gray12: hsl(0, 0%, 9%);\n --border-radius: 8px;\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n list-style: none;\n outline: none;\n z-index: 999999999;\n}\n:where([data-sonner-toaster][data-x-position=right]) {\n right: max(var(--offset), env(safe-area-inset-right));\n}\n:where([data-sonner-toaster][data-x-position=left]) {\n left: max(var(--offset), env(safe-area-inset-left));\n}\n:where([data-sonner-toaster][data-x-position=center]) {\n left: 50%;\n transform: translateX(-50%);\n}\n:where([data-sonner-toaster][data-y-position=top]) {\n top: max(var(--offset), env(safe-area-inset-top));\n}\n:where([data-sonner-toaster][data-y-position=bottom]) {\n bottom: max(var(--offset), env(safe-area-inset-bottom));\n}\n:where([data-sonner-toast]) {\n --y: translateY(100%);\n --lift-amount: calc(var(--lift) * var(--gap));\n z-index: var(--z-index);\n position: absolute;\n opacity: 0;\n transform: var(--y);\n filter: blur(0);\n touch-action: none;\n transition:\n transform 400ms,\n opacity 400ms,\n height 400ms,\n box-shadow 200ms;\n box-sizing: border-box;\n outline: none;\n overflow-wrap: anywhere;\n}\n:where([data-sonner-toast][data-styled=true]) {\n padding: 16px;\n background: var(--normal-bg);\n border: 1px solid var(--normal-border);\n color: var(--normal-text);\n border-radius: var(--border-radius);\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1);\n width: var(--width);\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n:where([data-sonner-toast]:focus-visible) {\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1), 0 0 0 2px rgba(0, 0, 0, 0.2);\n}\n:where([data-sonner-toast][data-y-position=top]) {\n top: 0;\n --y: translateY(-100%);\n --lift: 1;\n --lift-amount: calc(1 * var(--gap));\n}\n:where([data-sonner-toast][data-y-position=bottom]) {\n bottom: 0;\n --y: translateY(100%);\n --lift: -1;\n --lift-amount: calc(var(--lift) * var(--gap));\n}\n:where([data-sonner-toast]) :where([data-description]) {\n font-weight: 400;\n line-height: 1.4;\n color: inherit;\n}\n:where([data-sonner-toast]) :where([data-title]) {\n font-weight: 500;\n line-height: 1.5;\n color: inherit;\n}\n:where([data-sonner-toast]) :where([data-icon]) {\n display: flex;\n height: 16px;\n width: 16px;\n position: relative;\n justify-content: flex-start;\n align-items: center;\n flex-shrink: 0;\n margin-left: var(--toast-icon-margin-start);\n margin-right: var(--toast-icon-margin-end);\n}\n:where([data-sonner-toast][data-promise=true]) :where([data-icon]) > svg {\n opacity: 0;\n transform: scale(0.8);\n transform-origin: center;\n animation: sonner-fade-in 300ms ease forwards;\n}\n:where([data-sonner-toast]) :where([data-icon]) > * {\n flex-shrink: 0;\n}\n:where([data-sonner-toast]) :where([data-icon]) svg {\n margin-left: var(--toast-svg-margin-start);\n margin-right: var(--toast-svg-margin-end);\n}\n:where([data-sonner-toast]) :where([data-content]) {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n[data-sonner-toast][data-styled=true] [data-button] {\n border-radius: 4px;\n padding-left: 8px;\n padding-right: 8px;\n height: 24px;\n font-size: 12px;\n color: var(--normal-bg);\n background: var(--normal-text);\n margin-left: var(--toast-button-margin-start);\n margin-right: var(--toast-button-margin-end);\n border: none;\n cursor: pointer;\n outline: none;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n transition: opacity 400ms, box-shadow 200ms;\n}\n:where([data-sonner-toast]) :where([data-button]):focus-visible {\n box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.4);\n}\n:where([data-sonner-toast]) :where([data-button]):first-of-type {\n margin-left: var(--toast-button-margin-start);\n margin-right: var(--toast-button-margin-end);\n}\n:where([data-sonner-toast]) :where([data-cancel]) {\n color: var(--normal-text);\n background: rgba(0, 0, 0, 0.08);\n}\n:where([data-sonner-toast][data-theme=dark]) :where([data-cancel]) {\n background: rgba(255, 255, 255, 0.3);\n}\n:where([data-sonner-toast]) :where([data-close-button]) {\n position: absolute;\n left: var(--toast-close-button-start);\n right: var(--toast-close-button-end);\n top: 0;\n height: 20px;\n width: 20px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 0;\n background: var(--gray1);\n color: var(--gray12);\n border: 1px solid var(--gray4);\n transform: var(--toast-close-button-transform);\n border-radius: 50%;\n cursor: pointer;\n z-index: 1;\n transition:\n opacity 100ms,\n background 200ms,\n border-color 200ms;\n}\n:where([data-sonner-toast]) :where([data-close-button]):focus-visible {\n box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1), 0 0 0 2px rgba(0, 0, 0, 0.2);\n}\n:where([data-sonner-toast]) :where([data-disabled=true]) {\n cursor: not-allowed;\n}\n:where([data-sonner-toast]):hover :where([data-close-button]):hover {\n background: var(--gray2);\n border-color: var(--gray5);\n}\n:where([data-sonner-toast][data-swiping=true])::before {\n content: "";\n position: absolute;\n left: 0;\n right: 0;\n height: 100%;\n z-index: -1;\n}\n:where([data-sonner-toast][data-y-position=top][data-swiping=true])::before {\n bottom: 50%;\n transform: scaleY(3) translateY(50%);\n}\n:where([data-sonner-toast][data-y-position=bottom][data-swiping=true])::before {\n top: 50%;\n transform: scaleY(3) translateY(-50%);\n}\n:where([data-sonner-toast][data-swiping=false][data-removed=true])::before {\n content: "";\n position: absolute;\n inset: 0;\n transform: scaleY(2);\n}\n:where([data-sonner-toast])::after {\n content: "";\n position: absolute;\n left: 0;\n height: calc(var(--gap) + 1px);\n bottom: 100%;\n width: 100%;\n}\n:where([data-sonner-toast][data-mounted=true]) {\n --y: translateY(0);\n opacity: 1;\n}\n:where([data-sonner-toast][data-expanded=false][data-front=false]) {\n --scale: var(--toasts-before) * 0.05 + 1;\n --y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));\n height: var(--front-toast-height);\n}\n:where([data-sonner-toast]) > * {\n transition: opacity 400ms;\n}\n:where([data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]) > * {\n opacity: 0;\n}\n:where([data-sonner-toast][data-visible=false]) {\n opacity: 0;\n pointer-events: none;\n}\n:where([data-sonner-toast][data-mounted=true][data-expanded=true]) {\n --y: translateY(calc(var(--lift) * var(--offset)));\n height: var(--initial-height);\n}\n:where([data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]) {\n --y: translateY(calc(var(--lift) * -100%));\n opacity: 0;\n}\n:where([data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]) {\n --y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));\n opacity: 0;\n}\n:where([data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]) {\n --y: translateY(40%);\n opacity: 0;\n transition: transform 500ms, opacity 200ms;\n}\n:where([data-sonner-toast][data-removed=true][data-front=false])::before {\n height: calc(var(--initial-height) + 20%);\n}\n[data-sonner-toast][data-swiping=true] {\n transform: var(--y) translateY(var(--swipe-amount, 0px));\n transition: none;\n}\n[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],\n[data-sonner-toast][data-swipe-out=true][data-y-position=top] {\n animation: swipe-out 200ms ease-out forwards;\n}\n@keyframes swipe-out {\n from {\n transform: translateY(calc(var(--lift) * var(--offset) + var(--swipe-amount)));\n opacity: 1;\n }\n to {\n transform: translateY(calc(var(--lift) * var(--offset) + var(--swipe-amount) + var(--lift) * -100%));\n opacity: 0;\n }\n}\n@media (max-width: 600px) {\n [data-sonner-toaster] {\n position: fixed;\n --mobile-offset: 16px;\n right: var(--mobile-offset);\n left: var(--mobile-offset);\n width: 100%;\n }\n [data-sonner-toaster] [data-sonner-toast] {\n left: 0;\n right: 0;\n width: calc(100% - var(--mobile-offset) * 2);\n }\n [data-sonner-toaster][data-x-position=left] {\n left: var(--mobile-offset);\n }\n [data-sonner-toaster][data-y-position=bottom] {\n bottom: 20px;\n }\n [data-sonner-toaster][data-y-position=top] {\n top: 20px;\n }\n [data-sonner-toaster][data-x-position=center] {\n left: var(--mobile-offset);\n right: var(--mobile-offset);\n transform: none;\n }\n}\n[data-sonner-toaster][data-theme=light] {\n --normal-bg: #fff;\n --normal-border: var(--gray4);\n --normal-text: var(--gray12);\n --success-bg: hsl(143, 85%, 96%);\n --success-border: hsl(145, 92%, 91%);\n --success-text: hsl(140, 100%, 27%);\n --info-bg: hsl(208, 100%, 97%);\n --info-border: hsl(221, 91%, 91%);\n --info-text: hsl(210, 92%, 45%);\n --warning-bg: hsl(49, 100%, 97%);\n --warning-border: hsl(49, 91%, 91%);\n --warning-text: hsl(31, 92%, 45%);\n --error-bg: hsl(359, 100%, 97%);\n --error-border: hsl(359, 100%, 94%);\n --error-text: hsl(360, 100%, 45%);\n}\n[data-sonner-toaster][data-theme=light] [data-sonner-toast][data-invert=true] {\n --normal-bg: #000;\n --normal-border: hsl(0, 0%, 20%);\n --normal-text: var(--gray1);\n}\n[data-sonner-toaster][data-theme=dark] [data-sonner-toast][data-invert=true] {\n --normal-bg: #fff;\n --normal-border: var(--gray3);\n --normal-text: var(--gray12);\n}\n[data-sonner-toaster][data-theme=dark] {\n --normal-bg: #000;\n --normal-border: hsl(0, 0%, 20%);\n --normal-text: var(--gray1);\n --success-bg: hsl(150, 100%, 6%);\n --success-border: hsl(147, 100%, 12%);\n --success-text: hsl(150, 86%, 65%);\n --info-bg: hsl(215, 100%, 6%);\n --info-border: hsl(223, 100%, 12%);\n --info-text: hsl(216, 87%, 65%);\n --warning-bg: hsl(64, 100%, 6%);\n --warning-border: hsl(60, 100%, 12%);\n --warning-text: hsl(46, 87%, 65%);\n --error-bg: hsl(358, 76%, 10%);\n --error-border: hsl(357, 89%, 16%);\n --error-text: hsl(358, 100%, 81%);\n}\n[data-rich-colors=true] [data-sonner-toast][data-type=success] {\n background: var(--success-bg);\n border-color: var(--success-border);\n color: var(--success-text);\n}\n[data-rich-colors=true] [data-sonner-toast][data-type=success] [data-close-button] {\n background: var(--success-bg);\n border-color: var(--success-border);\n color: var(--success-text);\n}\n[data-rich-colors=true] [data-sonner-toast][data-type=info] {\n background: var(--info-bg);\n border-color: var(--info-border);\n color: var(--info-text);\n}\n[data-rich-colors=true] [data-sonner-toast][data-type=info] [data-close-button] {\n background: var(--info-bg);\n border-color: var(--info-border);\n color: var(--info-text);\n}\n[data-rich-colors=true] [data-sonner-toast][data-type=warning] {\n background: var(--warning-bg);\n border-color: var(--warning-border);\n color: var(--warning-text);\n}\n[data-rich-colors=true] [data-sonner-toast][data-type=warning] [data-close-button] {\n background: var(--warning-bg);\n border-color: var(--warning-border);\n color: var(--warning-text);\n}\n[data-rich-colors=true] [data-sonner-toast][data-type=error] {\n background: var(--error-bg);\n border-color: var(--error-border);\n color: var(--error-text);\n}\n[data-rich-colors=true] [data-sonner-toast][data-type=error] [data-close-button] {\n background: var(--error-bg);\n border-color: var(--error-border);\n color: var(--error-text);\n}\n.sonner-loading-wrapper {\n --size: 16px;\n height: var(--size);\n width: var(--size);\n position: absolute;\n inset: 0;\n z-index: 10;\n}\n.sonner-loading-wrapper[data-visible=false] {\n transform-origin: center;\n animation: sonner-fade-out 0.2s ease forwards;\n}\n.sonner-spinner {\n position: relative;\n top: 50%;\n left: 50%;\n height: var(--size);\n width: var(--size);\n}\n.sonner-loading-bar {\n animation: sonner-spin 1.2s linear infinite;\n background: var(--gray11);\n border-radius: 6px;\n height: 8%;\n left: -10%;\n position: absolute;\n top: -3.9%;\n width: 24%;\n}\n.sonner-loading-bar:nth-child(1) {\n animation-delay: -1.2s;\n transform: rotate(0.0001deg) translate(146%);\n}\n.sonner-loading-bar:nth-child(2) {\n animation-delay: -1.1s;\n transform: rotate(30deg) translate(146%);\n}\n.sonner-loading-bar:nth-child(3) {\n animation-delay: -1s;\n transform: rotate(60deg) translate(146%);\n}\n.sonner-loading-bar:nth-child(4) {\n animation-delay: -0.9s;\n transform: rotate(90deg) translate(146%);\n}\n.sonner-loading-bar:nth-child(5) {\n animation-delay: -0.8s;\n transform: rotate(120deg) translate(146%);\n}\n.sonner-loading-bar:nth-child(6) {\n animation-delay: -0.7s;\n transform: rotate(150deg) translate(146%);\n}\n.sonner-loading-bar:nth-child(7) {\n animation-delay: -0.6s;\n transform: rotate(180deg) translate(146%);\n}\n.sonner-loading-bar:nth-child(8) {\n animation-delay: -0.5s;\n transform: rotate(210deg) translate(146%);\n}\n.sonner-loading-bar:nth-child(9) {\n animation-delay: -0.4s;\n transform: rotate(240deg) translate(146%);\n}\n.sonner-loading-bar:nth-child(10) {\n animation-delay: -0.3s;\n transform: rotate(270deg) translate(146%);\n}\n.sonner-loading-bar:nth-child(11) {\n animation-delay: -0.2s;\n transform: rotate(300deg) translate(146%);\n}\n.sonner-loading-bar:nth-child(12) {\n animation-delay: -0.1s;\n transform: rotate(330deg) translate(146%);\n}\n@keyframes sonner-fade-in {\n 0% {\n opacity: 0;\n transform: scale(0.8);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes sonner-fade-out {\n 0% {\n opacity: 1;\n transform: scale(1);\n }\n 100% {\n opacity: 0;\n transform: scale(0.8);\n }\n}\n@keyframes sonner-spin {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0.15;\n }\n}\n@media (prefers-reduced-motion) {\n [data-sonner-toast],\n [data-sonner-toast] > *,\n .sonner-loading-bar {\n transition: none !important;\n animation: none !important;\n }\n}\n.sonner-loader {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n transform-origin: center;\n transition: opacity 200ms, transform 200ms;\n}\n.sonner-loader[data-visible=false] {\n opacity: 0;\n transform: scale(0.8) translate(-50%, -50%);\n}\n'); var bars = Array(12).fill(0); function Loader(props) { return (() => { var _el$ = _tmpl$$5(), _el$2 = _el$.firstChild; insert(_el$2, createComponent(For, { each: bars, children: () => _tmpl$2$4() })); createRenderEffect(() => setAttribute(_el$, "data-visible", props.visible)); return _el$; })(); } function SuccessIcon() { return _tmpl$3$2(); } function WarningIcon() { return _tmpl$4$2(); } function InfoIcon() { return _tmpl$5$1(); } function ErrorIcon() { return _tmpl$6$1(); } function getAsset(type) { switch (type) { case "success": return SuccessIcon; case "info": return InfoIcon; case "warning": return WarningIcon; case "error": return ErrorIcon; default: return null; } } var toastsCounter = 0; var Observer = class { subscribers; toasts; constructor() { this.subscribers = []; this.toasts = []; } // We use arrow functions to maintain the correct `this` reference subscribe = (subscriber) => { this.subscribers.push(subscriber); return () => { const index = this.subscribers.indexOf(subscriber); this.subscribers.splice(index, 1); }; }; publish = (data) => { this.subscribers.forEach((subscriber) => subscriber(data)); }; addToast = (data) => { this.publish(data); this.toasts = [...this.toasts, data]; }; create = (data) => { const { message, ...rest } = data; const id = typeof data?.id === "number" || data.id && data.id?.length > 0 ? data.id : toastsCounter++; const alreadyExists = this.toasts.find((toast2) => { return toast2.id === id; }); if (alreadyExists) { this.toasts = this.toasts.map((toast2) => { if (toast2.id === id) { this.publish({ ...toast2, ...data, id, title: message }); return { ...toast2, ...data, id, title: message }; } return toast2; }); } else { this.addToast({ title: message, ...rest, id }); } return id; }; dismiss = (id) => { if (!id) { this.toasts.forEach((toast2) => { this.subscribers.forEach((subscriber) => subscriber({ id: toast2.id, dismiss: true })); }); } this.subscribers.forEach((subscriber) => subscriber({ id, dismiss: true })); return id; }; message = (message, data) => { return this.create({ ...data, message }); }; error = (message, data) => { return this.create({ ...data, message, type: "error" }); }; success = (message, data) => { return this.create({ ...data, type: "success", message }); }; info = (message, data) => { return this.create({ ...data, type: "info", message }); }; warning = (message, data) => { return this.create({ ...data, type: "warning", message }); }; promise = (promise, data) => { if (!data) { return; } let id; if (data.loading !== void 0) { id = this.create({ ...data, promise, type: "loading", message: data.loading }); } const p = promise instanceof Promise ? promise : promise(); let shouldDismiss = id !== void 0; p.then((response) => { if (response && typeof response.ok === "boolean" && !response.ok) { shouldDismiss = false; const message = typeof data.error === "function" ? data.error(`HTTP error! status: ${response.status}`) : data.error; this.create({ id, type: "error", message }); } else if (data.success !== void 0) { shouldDismiss = false; const message = typeof data.success === "function" ? data.success(response) : data.success; this.create({ id, type: "success", message }); } }).catch((error) => { if (data.error !== void 0) { shouldDismiss = false; const message = typeof data.error === "function" ? data.error(error) : data.error; this.create({ id, type: "error", message }); } }).finally(() => { if (shouldDismiss) { this.dismiss(id); id = void 0; } data.finally?.(); }); return id; }; loading = (message, data) => { return this.create({ ...data, type: "loading", message }); }; // We can't provide the toast we just created as a prop as we didn't create it yet, so we can create a default toast object, I just don't know how to use function in argument when calling()? custom = (jsx, data) => { const id = data?.id || toastsCounter++; this.publish({ jsx: jsx(id), id, ...data }); return id; }; }; var ToastState = new Observer(); function toastFunction(message, data) { const id = data?.id || toastsCounter++; ToastState.addToast({ title: message, ...data, id }); return id; } var basicToast = toastFunction; var toast = Object.assign(basicToast, { success: ToastState.success, info: ToastState.info, warning: ToastState.warning, error: ToastState.error, custom: ToastState.custom, message: ToastState.message, promise: ToastState.promise, dismiss: ToastState.dismiss, loading: ToastState.loading }); function useIsDocumentHidden() { const [isDocumentHidden, setIsDocumentHidden] = createSignal(false); onMount(() => { const callback = () => { setIsDocumentHidden(document.hidden); }; document.addEventListener("visibilitychange", callback); onCleanup(() => { window.removeEventListener("visibilitychange", callback); }); }); return isDocumentHidden; } var VISIBLE_TOASTS_AMOUNT = 3; var VIEWPORT_OFFSET = "32px"; var TOAST_LIFETIME = 4e3; var TOAST_WIDTH = 356; var GAP = 14; var SWIPE_TRESHOLD = 20; var TIME_BEFORE_UNMOUNT = 200; function _cn(...classes) { return classes.filter(Boolean).join(" "); } var Toast = (props) => { const [mounted, setMounted] = createSignal(false); const [removed, setRemoved] = createSignal(false); const [swiping, setSwiping] = createSignal(false); const [swipeOut, setSwipeOut] = createSignal(false); const [offsetBeforeRemove, setOffsetBeforeRemove] = createSignal(0); const [initialHeight, setInitialHeight] = createSignal(0); let toastRef; const isFront = () => props.index === 0; const isVisible = () => props.index + 1 <= props.visibleToasts; const toastType = () => props.toast.type; const toastClassname = () => props.toast.class || ""; const toastDescriptionClassname = () => props.toast.descriptionClass || ""; const propsWithDefaults = mergeProps({ gap: GAP }, props); const heightIndex = () => props.heights.findIndex((height) => height.toastId === props.toast.id) || 0; const duration = () => props.toast.duration || props.duration || TOAST_LIFETIME; let closeTimerStartTimeRef = 0; let lastCloseTimerStartTimeRef = 0; const [pointerStartRef, setPointerStartRef] = createSignal(null); const coords = () => props.position.split("-"); const toastsHeightBefore = () => { return props.heights.reduce((prev, curr, reducerIndex) => { if (reducerIndex >= heightIndex()) return prev; return prev + curr.height; }, 0); }; const isDocumentHidden = useIsDocumentHidden(); const invert = () => props.toast.invert || props.invert; const disabled = () => toastType() === "loading"; const offset = () => heightIndex() * propsWithDefaults.gap + toastsHeightBefore(); function getLoadingIcon() { if (props.icons?.loading) { return (() => { var _el$8 = _tmpl$7(); insert(_el$8, () => props.icons.loading); createRenderEffect(() => setAttribute(_el$8, "data-visible", toastType() === "loading")); return _el$8; })(); } return createComponent(Loader, { get visible() { return toastType() === "loading"; } }); } onMount(() => { setMounted(true); }); onMount(() => { const toastNode = toastRef; const originalHeight = toastNode.style.height; toastNode.style.height = "auto"; const newHeight = toastNode.getBoundingClientRect().height; toastNode.style.height = originalHeight; setInitialHeight(newHeight); createEffect(() => { props.setHeights((heights) => { const alreadyExists = heights.find((height) => height.toastId === props.toast.id); if (!alreadyExists) return [{ toastId: props.toast.id, height: newHeight, position: props.toast.position }, ...heights]; else return heights.map((height) => height.toastId === props.toast.id ? { ...height, height: newHeight } : height); }); }); }); const deleteToast = () => { setRemoved(true); setOffsetBeforeRemove(offset()); props.setHeights((h) => h.filter((height) => height.toastId !== props.toast.id)); setTimeout(() => { props.removeToast(props.toast); }, TIME_BEFORE_UNMOUNT); }; let remainingTime = duration(); createEffect(on(() => [props.expanded, props.interacting, props.toast, duration(), props.toast.promise, toastType(), props.pauseWhenPageIsHidden, isDocumentHidden()], ([expanded, interacting, toast2, duration2, promise, toastType2, pauseWhenPageIsHidden, isDocumentHidden2]) => { if (promise && toastType2 === "loading" || duration2 === Number.POSITIVE_INFINITY) return; let timeoutId; const pauseTimer = () => { if (lastCloseTimerStartTimeRef < closeTimerStartTimeRef) { const elapsedTime = (/* @__PURE__ */ new Date()).getTime() - closeTimerStartTimeRef; remainingTime = remainingTime - elapsedTime; } lastCloseTimerStartTimeRef = (/* @__PURE__ */ new Date()).getTime(); }; const startTimer = () => { closeTimerStartTimeRef = (/* @__PURE__ */ new Date()).getTime(); timeoutId = setTimeout(() => { toast2.onAutoClose?.(toast2); deleteToast(); }, remainingTime); }; if (expanded || interacting || pauseWhenPageIsHidden && isDocumentHidden2) pauseTimer(); else startTimer(); onCleanup(() => { clearTimeout(timeoutId); }); })); createEffect(on(() => props.toast.id, (toastId) => { const toastNode = toastRef; if (toastNode) { const height = toastNode.getBoundingClientRect().height; setInitialHeight(height); props.setHeights((h) => [{ toastId, height, position: props.toast.position }, ...h]); onCleanup(() => { props.setHeights((h) => h.filter((height2) => height2.toastId !== toastId)); }); } })); createEffect(on(() => props.toast.delete, (d) => { if (d) deleteToast(); })); return (() => { var _el$9 = _tmpl$9(); _el$9.$$pointermove = (event) => { if (!pointerStartRef()) return; const yPosition = event.clientY - pointerStartRef().y; const xPosition = event.clientX - pointerStartRef().x; const clamp = coords()[0] === "top" ? Math.min : Math.max; const clampedY = clamp(0, yPosition); const swipeStartThreshold = event.pointerType === "touch" ? 10 : 2; const isAllowedToSwipe = Math.abs(clampedY) > swipeStartThreshold; if (isAllowedToSwipe) { toastRef?.style.setProperty("--swipe-amount", `${yPosition}px`); } else if (Math.abs(xPosition) > swipeStartThreshold) { setPointerStartRef(null); } }; _el$9.$$pointerup = () => { if (swipeOut()) return; setPointerStartRef(null); const swipeAmount = Number(toastRef?.style.getPropertyValue("--swipe-amount").replace("px", "") || 0); if (Math.abs(swipeAmount) >= SWIPE_TRESHOLD) { setOffsetBeforeRemove(offset()); props.toast.onDismiss?.(props.toast); deleteToast(); setSwipeOut(true); return; } toastRef?.style.setProperty("--swipe-amount", "0px"); setSwiping(false); }; _el$9.$$pointerdown = (event) => { if (disabled()) return; setOffsetBeforeRemove(offset()); event.target.setPointerCapture(event.pointerId); if (event.target.tagName === "BUTTON") return; setSwiping(true); setPointerStartRef({ x: event.clientX, y: event.clientY }); }; var _ref$ = toastRef; typeof _ref$ === "function" ? use(_ref$, _el$9) : toastRef = _el$9; insert(_el$9, createComponent(Show, { get when() { return props.closeButton && !props.toast.jsx; }, get children() { var _el$10 = _tmpl$8(); addEventListener(_el$10, "click", disabled() ? void 0 : () => { deleteToast(); props.toast.onDismiss?.(props.toast); }, true); createRenderEffect((_p$) => { var _v$ = disabled(), _v$2 = _cn(props.classes?.closeButton, props.toast?.classes?.closeButton); _v$ !== _p$.e && setAttribute(_el$10, "data-disabled", _p$.e = _v$); _v$2 !== _p$.t && className(_el$10, _p$.t = _v$2); return _p$; }, { e: void 0, t: void 0 }); return _el$10; } }), null); insert(_el$9, createComponent(Show, { get when() { return props.toast.jsx || props.toast.title instanceof Element; }, get fallback() { return [createComponent(Show, { get when() { return toastType() || props.toast.icon || props.toast.promise; }, get children() { var _el$11 = _tmpl$10(); insert(_el$11, (() => { var _c$ = createMemo(() => !!(props.toast.promise || props.toast.type === "loading" && !props.toast.icon)); return () => _c$() ? props.toast.icon || getLoadingIcon() : null; })(), null); insert(_el$11, (() => { var _c$2 = createMemo(() => props.toast.type !== "loading"); return () => _c$2() ? props.toast.icon || props.icons?.[toastType()] || getAsset(toastType())() : null; })(), null); return _el$11; } }), (() => { var _el$12 = _tmpl$12(), _el$13 = _el$12.firstChild; insert(_el$13, () => props.toast.title); insert(_el$12, createComponent(Show, { get when() { return props.toast.description; }, get children() { var _el$14 = _tmpl$11(); insert(_el$14, () => props.toast.description); createRenderEffect(() => className(_el$14, _cn(props.descriptionClass, toastDescriptionClassname(), props.classes?.description, props.toast?.classes?.description))); return _el$14; } }), null); createRenderEffect(() => className(_el$13, _cn(props.classes?.title, props.toast?.classes?.title))); return _el$12; })(), createComponent(Show, { get when() { return props.toast.cancel; }, get children() { var _el$15 = _tmpl$13(); _el$15.$$click = () => { deleteToast(); if (props.toast.cancel?.onClick) props.toast.cancel.onClick(); }; insert(_el$15, () => props.toast.cancel.label); createRenderEffect((_p$) => { var _v$20 = props.toast.cancelButtonStyle || props.cancelButtonStyle, _v$21 = _cn(props.classes?.cancelButton, props.toast?.classes?.cancelButton); _p$.e = style(_el$15, _v$20, _p$.e); _v$21 !== _p$.t && className(_el$15, _p$.t = _v$21); return _p$; }, { e: void 0, t: void 0 }); return _el$15; } }), createComponent(Show, { get when() { return props.toast.action; }, get children() { var _el$16 = _tmpl$14(); _el$16.$$click = (event) => { props.toast.action?.onClick(event); if (event.defaultPrevented) return; deleteToast(); }; insert(_el$16, () => props.toast.action.label); createRenderEffect((_p$) => { var _v$22 = props.toast.actionButtonStyle || props.actionButtonStyle, _v$23 = _cn(props.classes?.actionButton, props.toast?.classes?.actionButton); _p$.e = style(_el$16, _v$22, _p$.e); _v$23 !== _p$.t && className(_el$16, _p$.t = _v$23); return _p$; }, { e: void 0, t: void 0 }); return _el$16; } })]; }, get children() { return props.toast.jsx || props.toast.title; } }), null); createRenderEffect((_p$) => { var _v$3 = props.toast.important ? "assertive" : "polite", _v$4 = _cn(props.class, toastClassname(), props.classes?.toast, props.toast?.classes?.toast, props.classes?.default, props.classes?.[toastType()], props.toast?.classes?.[toastType()]), _v$5 = !(props.toast.jsx || props.toast.unstyled || props.unstyled), _v$6 = mounted(), _v$7 = Boolean(props.toast.promise), _v$8 = removed(), _v$9 = isVisible(), _v$10 = coords()[0], _v$11 = coords()[1], _v$12 = props.index, _v$13 = isFront(), _v$14 = swiping(), _v$15 = toastType(), _v$16 = invert(), _v$17 = swipeOut(), _v$18 = Boolean(props.expanded || props.expandByDefault && mounted()), _v$19 = { "--index": props.index, "--toasts-before": props.index, "--z-index": props.toasts.length - props.index, "--offset": `${removed() ? offsetBeforeRemove() : offset()}px`, "--initial-height": props.expandByDefault ? "auto" : `${initialHeight()}px`, ...props.style, ...props.toast.style }; _v$3 !== _p$.e && setAttribute(_el$9, "aria-live", _p$.e = _v$3); _v$4 !== _p$.t && className(_el$9, _p$.t = _v$4); _v$5 !== _p$.a && setAttribute(_el$9, "data-styled", _p$.a = _v$5); _v$6 !== _p$.o && setAttribute(_el$9, "data-mounted", _p$.o = _v$6); _v$7 !== _p$.i && setAttribute(_el$9, "data-promise", _p$.i = _v$7); _v$8 !== _p$.n && setAttribute(_el$9, "data-removed", _p$.n = _v$8); _v$9 !== _p$.s && setAttribute(_el$9, "data-visible", _p$.s = _v$9); _v$10 !== _p$.h && setAttribute(_el$9, "data-y-position", _p$.h = _v$10); _v$11 !== _p$.r && setAttribute(_el$9, "data-x-position", _p$.r = _v$11); _v$12 !== _p$.d && setAttribute(_el$9, "data-index", _p$.d = _v$12); _v$13 !== _p$.l && setAttribute(_el$9, "data-front", _p$.l = _v$13); _v$14 !== _p$.u && setAttribute(_el$9, "data-swiping", _p$.u = _v$14); _v$15 !== _p$.c && setAttribute(_el$9, "data-type", _p$.c = _v$15); _v$16 !== _p$.w && setAttribute(_el$9, "data-invert", _p$.w = _v$16); _v$17 !== _p$.m && setAttribute(_el$9, "data-swipe-out", _p$.m = _v$17); _v$18 !== _p$.f && setAttribute(_el$9, "data-expanded", _p$.f = _v$18); _p$.y = style(_el$9, _v$19, _p$.y); return _p$; }, { e: void 0, t: void 0, a: void 0, o: void 0, i: void 0, n: void 0, s: void 0, h: void 0, r: void 0, d: void 0, l: void 0, u: void 0, c: void 0, w: void 0, m: void 0, f: void 0, y: void 0 }); return _el$9; })(); }; function getDocumentDirection() { if (typeof window === "undefined") return "ltr"; if (typeof document === "undefined") return "ltr"; const dirAttribute = document.documentElement.getAttribute("dir"); if (dirAttribute === "auto" || !dirAttribute) return window.getComputedStyle(document.documentElement).direction; return dirAttribute; } var Toaster$1 = (props) => { const propsWithDefaults = mergeProps({ position: "bottom-right", hotkey: ["altKey", "KeyT"], theme: "light", visibleToasts: VISIBLE_TOASTS_AMOUNT, dir: getDocumentDirection() }, props); const [toastsStore, setToastsStore] = createStore({ toasts: [] }); const possiblePositions = () => { return Array.from(new Set([propsWithDefaults.position].concat(toastsStore.toasts.filter((toast2) => toast2.position).map((toast2) => toast2.position)))); }; const [heights, setHeights] = createSignal([]); const [expanded, setExpanded] = createSignal(false); const [interacting, setInteracting] = createSignal(false); let listRef; const hotkeyLabel = () => propsWithDefaults.hotkey.join("+").replace(/Key/g, "").replace(/Digit/g, ""); const [lastFocusedElementRef, setLastFocusedElementRef] = createSignal(null); const [isFocusedWithinRef, setIsFocusedWithinRef] = createSignal(false); const [actualTheme, setActualTheme] = createSignal(propsWithDefaults.theme !== "system" ? propsWithDefaults.theme : typeof window !== "undefined" ? window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light" : "light"); const removeToast = (toast2) => setToastsStore("toasts", (toasts) => toasts.filter(({ id }) => id !== toast2.id)); onMount(() => { const unsub = ToastState.subscribe((toast2) => { if (toast2.dismiss) { setToastsStore("toasts", produce((_toasts) => { _toasts.forEach((t) => { if (t.id === toast2.id) t.delete = true; }); })); return; } const changedIndex = toastsStore.toasts.findIndex((t) => t.id === toast2.id); if (changedIndex !== -1) { setToastsStore("toasts", [changedIndex], reconcile(toast2)); return; } setToastsStore("toasts", produce((_toasts) => { _toasts.unshift(toast2); })); }); onCleanup(() => { unsub(); }); }); createEffect(on(() => propsWithDefaults.theme, (theme) => { if (theme !== "system") { setActualTheme(theme); return; } if (typeof window === "undefined") return; window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", ({ matches }) => { if (matches) setActualTheme("dark"); else setActualTheme("light"); }); })); createEffect(() => { if (toastsStore.toasts.length <= 1) setExpanded(false); }); onMount(() => { const handleKeyDown = (event) => { const isHotkeyPressed = propsWithDefaults.hotkey.every((key) => event[key] || event.code === key); if (isHotkeyPressed) { setExpanded(true); listRef?.focus(); } if (event.code === "Escape" && (document.activeElement === listRef || listRef?.contains(document.activeElement))) setExpanded(false); }; document.addEventListener("keydown", handleKeyDown); onCleanup(() => { document.removeEventListener("keydown", handleKeyDown); }); }); createEffect(on(() => listRef, (ref) => { if (ref) { onCleanup(() => { if (lastFocusedElementRef()) { lastFocusedElementRef()?.focus({ preventScroll: true }); setLastFocusedElementRef(null); setIsFocusedWithinRef(false); } }); } })); return createComponent(Show, { get when() { return toastsStore.toasts.length > 0; }, get children() { var _el$17 = _tmpl$15(); insert(_el$17, createComponent(For, { get each() { return possiblePositions(); }, children: (position, index) => { const [y, x] = position.split("-"); return (() => { var _el$18 = _tmpl$16(); _el$18.$$pointerup = () => setInteracting(false); _el$18.$$pointerdown = () => { setInteracting(true); }; _el$18.addEventListener("mouseleave", () => { if (!interacting()) setExpanded(false); }); _el$18.$$mousemove = () => setExpanded(true); _el$18.addEventListener("mouseenter", () => setExpanded(true)); _el$18.addEventListener("focus", (event) => { if (!isFocusedWithinRef()) { setIsFocusedWithinRef(true); setLastFocusedElementRef(event.relatedTarget); } }); _el$18.addEventListener("blur", (event) => { if (isFocusedWithinRef() && !event.currentTarget.contains(event.relatedTarget)) { setIsFocusedWithinRef(false); if (lastFocusedElementRef()) { lastFocusedElementRef()?.focus({ preventScroll: true }); setLastFocusedElementRef(null); } } }); var _ref$2 = listRef; typeof _ref$2 === "function" ? use(_ref$2, _el$18) : listRef = _el$18; setAttribute(_el$18, "data-y-position", y); setAttribute(_el$18, "data-x-position", x); insert(_el$18, createComponent(For, { get each() { return toastsStore.toasts.filter((toast2) => !toast2.position && index() === 0 || toast2.position === position); }, children: (toast2, index2) => createComponent(Toast, { get index() { return index2(); }, get icons() { return propsWithDefaults.icons; }, toast: toast2, get duration() { return propsWithDefaults.toastOptions?.duration ?? props.duration; }, get ["class"]() { return propsWithDefaults.toastOptions?.class; }, get classes() { return propsWithDefaults.toastOptions?.classes; }, get cancelButtonStyle() { return propsWithDefaults.toastOptions?.cancelButtonStyle; }, get actionButtonStyle() { return propsWithDefaults.toastOptions?.actionButtonStyle; }, get descriptionClass() { return propsWithDefaults.toastOptions?.descriptionClass; }, get invert() { return Boolean(propsWithDefaults.invert); }, get visibleToasts() { return propsWithDefaults.visibleToasts; }, get closeButton() { return Boolean(propsWithDefaults.closeButton); }, get interacting() { return interacting(); }, get position() { return propsWithDefaults.position; }, get style() { return propsWithDefaults.toastOptions?.style; }, get unstyled() { return propsWithDefaults.toastOptions?.unstyled; }, removeToast, get toasts() { return toastsStore.toasts; }, get heights() { return heights(); }, setHeights, get expandByDefault() { return Boolean(propsWithDefaults.expand); }, get gap() { return propsWithDefaults.gap; }, get expanded() { return expanded(); }, get pauseWhenPageIsHidden() { return propsWithDefaults.pauseWhenPageIsHidden; } }) })); createRenderEffect((_p$) => { var _v$24 = propsWithDefaults.dir === "auto" ? getDocumentDirection() : propsWithDefaults.dir, _v$25 = propsWithDefaults.class, _v$26 = actualTheme(), _v$27 = propsWithDefaults.richColors, _v$28 = { "--front-toast-height": `${heights()[0]?.height}px`, "--offset": typeof propsWithDefaults.offset === "number" ? `${propsWithDefaults.offset}px` : propsWithDefaults.offset || VIEWPORT_OFFSET, "--width": `${TOAST_WIDTH}px`, "--gap": `${GAP}px`, ...propsWithDefaults.style }; _v$24 !== _p$.e && setAttribute(_el$18, "dir", _p$.e = _v$24); _v$25 !== _p$.t && className(_el$18, _p$.t = _v$25); _v$26 !== _p$.a && setAttribute(_el$18, "data-theme", _p$.a = _v$26); _v$27 !== _p$.o && setAttribute(_el$18, "data-rich-colors", _p$.o = _v$27); _p$.i = style(_el$18, _v$28, _p$.i); return _p$; }, { e: void 0, t: void 0, a: void 0, o: void 0, i: void 0 }); return _el$18; })(); } })); createRenderEffect(() => setAttribute(_el$17, "aria-label", `Notifications ${hotkeyLabel()}`)); return _el$17; } }); }; /*! * Original code by Emil Kowalski * MIT Licensed, Copyright 2023 Emil Kowalski, see https://github.com/emilkowalski/sonner/blob/main/LICENSE.md for details * * Credits: * https://github.com/emilkowalski/sonner/blob/main/src/index.tsx */ delegateEvents(["pointerdown", "pointerup", "pointermove", "click", "mousemove"]); const propsData = [{ name: "Definition", options: { source: { target: "geofs.aircraft.instance", prop: "definition" }, reactive: true, reset: true, allowed: [{ name: "airbrakesTravelTime", type: "float" }, { name: "accessoriesTravelTime", type: "float" }, { name: "flapsTravelTime", type: "float" }, { name: "flapsSteps", type: "int" }, { name: "gearTravelTime", type: "float" }, { name: "zeroThrustAltitude", type: "int" }, { name: "zeroRPMAltitude", type: "int" }, { name: "mass", type: "int" }, { name: "minRPM", type: "int", comment: "not recommended" }, { name: "maxRPM", type: "int", comment: "not recommended" }], ignored: ["object", "function", "undefined", "null", "boolean", "symbol", "array"] } }, { name: "Engines", options: { source: { target: "geofs.aircraft.instance", prop: "engines" }, reactive: true, allowed: [{ name: "thrust", type: "int" }, { name: "afterBurnerThrust", type: "int" }, { name: "reverseThrust", type: "int" }], ignored: ["object", "function", "undefined", "null", "boolean", "symbol", "array"] } }, { name: "id", options: { source: { target: "geofs.aircraft.instance", prop: "id" }, reactive: true } }]; function getObjectFromPath(path) { const parts = path.split("."); let obj = unsafeWindow; for (let part of parts) { obj = obj[part]; if (obj === void 0) { throw new Error(`Path ${path} does not exist`); } } return obj; } class Reactive { static _options = { cloneAfterCreation: false, temp: null }; static _cache = {}; static set cache(value) { this._cache = value; } static get cache() { return this._cache; } static set options(value) { this._options = value; } static get options() { return this._options; } static parse(obj, propName, options = {}) { let target = obj; try { if (typeof obj === "string") { target = getObjectFromPath(obj); } else if (typeof obj === "object") { target = obj; } else { throw new Error("The first argument to parse must be an object or string path.", obj); } if (typeof propName !== "string") { throw new Error("The second argument to parse must be a string.", propName); } if (target === void 0) { throw new Error("Invalid target.", target); } if (propName === void 0) { throw new Error("Invalid property.", propName); } let value = target[propName]; if (value === void 0) { throw new Error("Invalid value.", value); } const [prop, setProp] = createSignal(value); const cloneAfterCreation = (() => options?.cloneAfterCreation !== void 0 ? options?.cloneAfterCreation : this._options?.cloneAfterCreation)(); if (prop === void 0 || setProp === void 0) { throw new Error("Signal not created."); } Object.defineProperty(target, propName, { get: function() { return prop(); }, set: function(newValue) { value = newValue; setProp(newValue); } }); if (Object.getOwnPropertyDescriptor(target, propName) === void 0) { throw new Error("Reactive property not created."); } if (cloneAfterCreation) { if (this._options.temp === null) { throw new Error("Temporary object not defined."); } if (this._cache[propName] !== void 0) { throw new Error("Property already exists in cache.", propName); } const [reactiveProp, setReactiveProp] = [prop, setProp]; if (reactiveProp === void 0 || setReactiveProp === void 0) { throw new Error("Reactive property not cloned."); } this._cache[propName] = true; Object.defineProperty(this._options.temp, propName, { get: function() { return reactiveProp(); }, set: function(newValue) { setReactiveProp(newValue); } }); if (Object.getOwnPropertyDescriptor(this._options.temp, propName) === void 0) { throw new Error("Reactive property clone not defined.", propName); } } return [prop, setProp]; } catch (e) { console.error(e); } } } class Props { static _reactive = Reactive; static _data = {}; static get reactive() { return this._reactive; } static set reactive(value) { this._reactive = value; } static async load(...arr) { return await new Promise((resolve, reject) => { try { if (!arr.length) { throw new Error("No props to load"); } if (!Array.isArray(arr)) { throw new Error("Props must be an array"); } for (const item of arr[0]) { const { name, options } = item; const { source } = options; if (options.reactive) { if (!options.source) { throw new Error("Reactive props require a source"); } if (!options.source.target || !options.source.prop) { throw new Error("Reactive props require a target and prop"); } this._reactive.parse(source.target, source.prop, options.source?.options); } Object.defineProperty(this, name, { get: function() { return this._data[name]; }, set: function(newValue) { this._data[name] = newValue; } }); this[name] = { allowed: options.allowed || [], ignored: options.ignored || [], reset: options.reset || false }; } resolve(true); } catch (e) { reject(e); } }); } } const toastOptions = { duration: 2e3, closeButton: true }; var _tmpl$$4 = /* @__PURE__ */ template(`<li class="flex gap-2"><label class="flex-none w-fit">:</label><input>`), _tmpl$2$3 = /* @__PURE__ */ template(`<br>`), _tmpl$3$1 = /* @__PURE__ */ template(`<span class="text-sm text-slate-500">`), _tmpl$4$1 = /* @__PURE__ */ template(`<li class="flex gap-2"><button class="w-fit m-2 border-0 rounded-md px-3 bg-sky-600 text-white shadow-md hover:bg-sky-700 hover:cursor-pointer">Reset</button><button class="w-fit m-2 border-0 rounded-md px-3 bg-sky-600 text-white shadow-md hover:bg-sky-700 hover:cursor-pointer">Save</button><button class="w-fit m-2 border-0 rounded-md px-3 bg-sky-600 text-white shadow-md hover:bg-sky-700 hover:cursor-pointer">Load`); const getDefinitions = async () => { return await new Promise((resolve, reject) => { try { const { allowed, ignored, reset } = Props.Definition; const definition = flightAssistant.instance.definition; if (!definition) throw new Error("No definition found."); const response = []; for (const item of Object.entries(definition)) { const [propName, prop] = item; const propType = typeof prop; if (ignored.includes(propType)) continue; const isAllowed = allowed.some((p) => p.name === propName); if (!isAllowed) continue; const syncType = allowed.find((p) => p.name === propName).type; if (!syncType) continue; const hasComment = allowed.find((p) => p.name === propName).comment; const isNum = ["int", "float", "number"].includes(syncType) || propType === "number"; const isInt = syncType === "int"; const isFloat = syncType === "float"; const isText = syncType === "string"; let props = {}; if (isText) { props.placeholder = "Text"; } else if (isNum) { props.min = isInt ? "0" : isFloat ? "0.0" : null; props.max = isInt ? parseInt(prop * 2) : isFloat ? parseFloat(prop * 2) : null; props.step = isInt ? "1" : isFloat ? "0.2" : null; props.placeholder = `Between ${props.min} and ${props.max}`; } if (reset) props["data-definitions-default"] = prop; props["data-definitions-propname"] = propName; props["data-definitions-type"] = syncType; response.push((() => { var _el$ = _tmpl$$4(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$2.nextSibling; setAttribute(_el$2, "for", `set${propName}`); insert(_el$2, propName, _el$3); insert(_el$2, hasComment ? [_tmpl$2$3(), (() => { var _el$6 = _tmpl$3$1(); insert(_el$6, hasComment); return _el$6; })()] : null, null); setAttribute(_el$4, "id", `set${propName}`); setAttribute(_el$4, "type", isNum ? "number" : isText ? "text" : null); spread(_el$4, mergeProps(props, { "class": "flex-auto w-max m-2 border-0 rounded-md p-2 shadow-md", "oninput": async (e) => { let that = e.target; let [min, max, value] = ["min", "max", "value"].map((e2) => isNum ? parseFloat(that[e2]) : that[e2]); let type = that.type; await new Promise((resolve2, reject2) => { if (type == "number" && value > min && value <= max) { let newMax = value * 2 * 100; e.target.max = newMax < 1 ? 10 : newMax; flightAssistant.instance.definition[propName] = value; that.placeholder = `Between ${min} and ${max}`; resolve2(`${propName} set to ${value}`); } else if (type == "text" && !value) { flightAssistant.instance.definition[propName] = value; resolve2(`${propName} set to ${value}`); } else { reject2(isNum ? `Value must be between ${min} and ${max}` : isText ? `Value must be text` : `Invalid value`); } }).then((msg) => toast.success(msg, toastOptions)).catch((msg) => toast.error(msg, toastOptions)); } }), false, false); return _el$; })()); } if (reset) { response.unshift((() => { var _el$7 = _tmpl$4$1(), _el$8 = _el$7.firstChild, _el$9 = _el$8.nextSibling, _el$10 = _el$9.nextSibling; _el$8.$$click = () => { const inputs = document.querySelectorAll("input[data-definitions-default]"); inputs.forEach((input) => { let prefix = "data-definitions-"; let value = input.getAttribute(`${prefix}default`); let propName = input.getAttribute(`${prefix}propname`); let type = input.getAttribute(`${prefix}type`); if (type === "int") value = parseInt(value); if (type === "float") value = parseFloat(value); input.value = value; flightAssistant.instance.definition[propName] = value; }); if (inputs.length) toast.success("Definitions reset", toastOptions); else toast.error("No definitions to reset", toastOptions); }; _el$9.$$click = () => { toast.info("Coming soon..", toastOptions); }; _el$10.$$click = () => { toast.info("Coming soon..", toastOptions); }; return _el$7; })()); } resolve(response); } catch (e) { reject(e); } }); }; delegateEvents(["click"]); var _tmpl$$3 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg width=16 height=16 viewBox="0 0 16 16"><path fill-rule=evenodd d="M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z">`); const GroupRotation = (props) => { return (() => { var _el$ = _tmpl$$3(); createRenderEffect((_p$) => { var _v$ = `w-5 h-5 text-gray-500 transition group-open/${props["group-open"]}:rotate-90`, _v$2 = props.fill || "currentColor"; _v$ !== _p$.e && setAttribute(_el$, "class", _p$.e = _v$); _v$2 !== _p$.t && setAttribute(_el$, "fill", _p$.t = _v$2); return _p$; }, { e: void 0, t: void 0 }); return _el$; })(); }; var _tmpl$$2 = /* @__PURE__ */ template(`<details><summary class="flex items-center justify-between gap-2 p-2 font-medium marker:content-none hover:cursor-pointer"><span class="flex gap-2"></span></summary><article class="px-4 pb-4"><ul class="flex flex-col gap-4 pl-2 mt-4">`), _tmpl$2$2 = /* @__PURE__ */ template(`<li class="flex gap-2"><label>:</label><input>`); const getEngines = async () => { return await new Promise((resolve, reject) => { try { const { allowed, ignored } = Props.Engines; const engines = flightAssistant.instance.engines; if (!engines) throw new Error("No engines found."); const response = []; for (let i = 0; i < engines.length; i++) { response.push((() => { var _el$ = _tmpl$$2(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$2.nextSibling, _el$5 = _el$4.firstChild; className(_el$, "group/engine" + i); insert(_el$3, createComponent(Switch, { get children() { return [createComponent(Match, { get when() { return engines[i].name; }, get children() { return engines[i].name; } }), createComponent(Match, { get when() { return !engines[i].name; }, get children() { return ["Engine ", i + 1]; } })]; } })); insert(_el$2, createComponent(GroupRotation, { "group-open": `engine${i}` }), null); insert(_el$5, createComponent(For, { get each() { return Object.entries(engines[i]); }, children: (item) => { const [propName, prop] = item; const propType = typeof prop; if (ignored.includes(propType)) return null; const isAllowed = allowed.some((p) => p.name === propName); if (!isAllowed) return null; const syncType = allowed.find((p) => p.name === propName).type; if (!syncType) return null; const isNum = ["int", "float", "number"].includes(syncType) || propType === "number"; const isInt = syncType === "int"; const isFloat = syncType === "float"; const isText = syncType === "string"; let props = {}; if (isText) { props.placeholder = "Text"; } else if (isNum) { props.min = isInt ? "0" : isFloat ? "0.0" : null; props.max = isInt ? parseInt(prop * 2) : isFloat ? parseFloat(prop * 2) : null; props.step = isInt ? "1" : isFloat ? "0.2" : null; props.placeholder = `Between ${props.min} and ${props.max}`; } return (() => { var _el$6 = _tmpl$2$2(), _el$7 = _el$6.firstChild, _el$8 = _el$7.firstChild, _el$9 = _el$7.nextSibling; insert(_el$7, propName, _el$8); setAttribute(_el$9, "type", isNum ? "number" : isText ? "text" : null); spread(_el$9, mergeProps({ get id() { return `set${engines[i].name}${propName}`; } }, props, { "class": "w-11/12 m-2 border-0 rounded-md p-2 shadow-md", "oninput": async (e) => { let that = e.target; let [min, max, value] = ["min", "max", "value"].map((e2) => isNum ? parseFloat(that[e2]) : that[e2]); let type = that.type; await new Promise((resolve2, reject2) => { if (type == "number" && value > min && value <= max) { let newMax = value * 2 * 100; e.target.max = newMax < 1 ? 10 : newMax; flightAssistant.instance.engines[i][propName] = value; that.placeholder = `Between ${min} and ${max}`; resolve2(`${engines[i].name}${propName} set to ${value}`); } else if (type == "text" && !value) { flightAssistant.instance.engines[i][propName] = value; resolve2(`${engines[i].name}${propName} set to ${value}`); } else { reject2(isNum ? `Value must be between ${min} and ${max}` : isText ? `Value must be text` : `Invalid value`); } }).then((msg) => toast.success(msg, toastOptions)).catch((msg) => toast.error(msg, toastOptions)); } }), false, false); createRenderEffect(() => setAttribute(_el$7, "for", `set${engines[i].name}${propName}`)); return _el$6; })(); } })); return _el$; })()); } resolve(response); } catch (e) { reject(e); } }); }; const Groups = () => [{ name: "definitions", title: "Definitions", icon: true, resource: createResource(getDefinitions), reference: null }, { name: "engines", title: "Engines", icon: true, resource: createResource(getEngines), reference: null }]; var _tmpl$$1 = /* @__PURE__ */ template(`<summary class="flex items-center justify-between gap-2 p-2 font-medium marker:content-none hover:cursor-pointer"><span class="flex gap-2">`), _tmpl$2$1 = /* @__PURE__ */ template(`<span>Loading...`), _tmpl$3 = /* @__PURE__ */ template(`<span>Error: `), _tmpl$4 = /* @__PURE__ */ template(`<article class="px-4 pb-4"><ul class="flex flex-col gap-4 pl-2 mt-4">`), _tmpl$5 = /* @__PURE__ */ template(`<div> Loading...`), _tmpl$6 = /* @__PURE__ */ template(`<details>`); const Summary = (props) => { return (() => { var _el$ = _tmpl$$1(), _el$2 = _el$.firstChild; insert(_el$2, () => props.title); insert(_el$, createComponent(GroupRotation, { get ["group-open"]() { return props.name; } }), null); return _el$; })(); }; const Article = (props) => { return (() => { var _el$3 = _tmpl$4(), _el$4 = _el$3.firstChild; var _ref$ = props.reference; typeof _ref$ === "function" ? use(_ref$, _el$4) : props.reference = _el$4; insert(_el$4, createComponent(Suspense, { get fallback() { return (() => { var _el$8 = _tmpl$5(), _el$9 = _el$8.firstChild; insert(_el$8, () => props.title, _el$9); return _el$8; })(); }, get children() { return createComponent(Switch, { get children() { return [createComponent(Match, { get when() { return props.resource?.loading; }, get children() { return _tmpl$2$1(); } }), createComponent(Match, { get when() { return props.resource?.error; }, get children() { var _el$6 = _tmpl$3(); _el$6.firstChild; insert(_el$6, () => props.resource.error, null); return _el$6; } }), createComponent(Match, { get when() { return props.resource(); }, get children() { return createComponent(For, { get each() { return props.resource(); }, children: (i) => { return i; } }); } })]; } }); } })); return _el$3; })(); }; const Details = (props) => { return (() => { var _el$10 = _tmpl$6(); insert(_el$10, createComponent(Summary, props), null); insert(_el$10, createComponent(Article, props), null); createRenderEffect(() => className(_el$10, "group/" + props.name)); return _el$10; })(); }; const Group = (props) => { try { if (!props.name || !props.resource) { throw new Error("Group component requires a name and resource prop."); } if (typeof props.resource !== "function") { throw new Error("Group component resource prop must be an function."); } let { name, resource } = props; let icon = props.icon || true; let title = props.title || name; let reference = props.reference || null; return createComponent(Details, { name, title, resource, icon, reference }); } catch (e) { console.error(e); return null; } }; const ui = { left: document.querySelector(".geofs-ui-left"), bottom: document.querySelector(".geofs-ui-bottom") }; var _tmpl$ = /* @__PURE__ */ template(`<ul class="geofs-list geofs-toggle-panel geofs-efi-list"data-noblur=true data-onshow={geofs.initializePreferencesPanel()} data-onhide={geofs.savePreferencesPanel()}>`), _tmpl$2 = /* @__PURE__ */ template(`<button class="mdl-button mdl-js-button geofs-f-standard-ui"id=geofs-efi-button tabindex=0 data-upgraded=,MaterialButton data-toggle-panel=.geofs-efi-list data-tooltip-classname=mdl-tooltip--top title="Experimental Flight Interface">CONFIG`); const MenuComponent = () => { const groups = Groups(); const [currentAircraftId, setCurrentAircraftId] = createSignal(); setCurrentAircraftId(flightAssistant.instance.id); const sameAircraftId = createMemo(() => flightAssistant.instance.id === currentAircraftId()); createEffect(() => { if (!sameAircraftId()) { setCurrentAircraftId(flightAssistant.instance.id); setTimeout(() => { for (let i = 0; i < groups.length; i++) { groups[i].resource[1].refetch(); } }, 1e3); } }); onMount(() => { for (let i = 0; i < groups.length; i++) { let { name, reference } = groups[i]; flightAssistant.refs[name] = reference; } }); return createComponent(For, { each: groups, children: (group) => { return createComponent(Group, { get name() { return group.name; }, get title() { return group.title; }, get icon() { return group.icon; }, get resource() { return group.resource[0]; }, get reference() { return group.reference; } }); } }); }; const ContainerComponent = () => { let ref; onMount(() => { flightAssistant.refs.container = ref; }); onCleanup(() => { flightAssistant.refs.container = null; }); return (() => { var _el$ = _tmpl$(); var _ref$ = ref; typeof _ref$ === "function" ? use(_ref$, _el$) : ref = _el$; insert(_el$, createComponent(MenuComponent, {})); return _el$; })(); }; const ButtonComponent = () => { let ref; onMount(() => { flightAssistant.refs.button = ref; }); onCleanup(() => { flightAssistant.refs.button = null; }); return (() => { var _el$2 = _tmpl$2(); var _ref$2 = ref; typeof _ref$2 === "function" ? use(_ref$2, _el$2) : ref = _el$2; return _el$2; })(); }; const Container = () => render(() => createComponent(ContainerComponent, {}), ui.left); const Button = () => render(() => createComponent(ButtonComponent, {}), ui.bottom); const Toaster = () => { return createComponent(Portal, { get mount() { return document.body; }, get children() { return createComponent(Toaster$1, { position: "top-right", gap: 8, expand: false, richColors: true }); } }); }; const App = () => { const flightAssistant = { version: GM.info.script.version, refs: {}, instance: {} }; Props.reactive.options = { cloneAfterCreation: true, temp: flightAssistant.instance }; unsafeWindow.executeOnEventDone("geofsStarted", function() { const starter = new Promise((resolve, reject) => { setTimeout(() => { try { Props.load(propsData); Container(); Button(); resolve("Assistant Started."); } catch (e) { reject(e); } }, 5e3); }); toast.promise(starter, { loading: "Assistant is starting..", success: (data) => data, error: (err) => `Error: ${err.message}` }); }); unsafeWindow.flightAssistant = flightAssistant; return createComponent(Toaster, {}); }; const root = document.body; render(() => createComponent(App, {}), root);