@0xsquid/deposit-widget 0.0.2-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +4062 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.esm.js +4042 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/types/DepositWidget.d.ts +8 -0
- package/dist/types/components/ViewTransition.d.ts +8 -0
- package/dist/types/components/shared/buttons/button.d.ts +4 -0
- package/dist/types/components/shared/icons/types.d.ts +4 -0
- package/dist/types/components/shared/icons/user-round.d.ts +3 -0
- package/dist/types/components/shared/navigation/base-navbar.d.ts +4 -0
- package/dist/types/components/shared/navigation/sub-navbar.d.ts +7 -0
- package/dist/types/components/token-badge-icon.d.ts +7 -0
- package/dist/types/components/token-list-item.d.ts +14 -0
- package/dist/types/components/view-container.d.ts +2 -0
- package/dist/types/constants.d.ts +2 -0
- package/dist/types/hooks/ui/useMainCTAButtonState.d.ts +9 -0
- package/dist/types/hooks/use-auto-select-token.d.ts +2 -0
- package/dist/types/hooks/use-deposit-route.d.ts +8 -0
- package/dist/types/hooks/use-token-selection.d.ts +6 -0
- package/dist/types/hooks/use-transaction-history.d.ts +7 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/services/assets-service.d.ts +7 -0
- package/dist/types/services/wallet-history/format.d.ts +11 -0
- package/dist/types/services/wallet-history/format.test.d.ts +2 -0
- package/dist/types/services/wallet-history/get-main-explorer-url.d.ts +24 -0
- package/dist/types/services/wallet-history/get-wallet-history.d.ts +3 -0
- package/dist/types/services/wallet-history/types.d.ts +67 -0
- package/dist/types/services/wallet-history/validation.d.ts +3 -0
- package/dist/types/store/use-deposit-store.d.ts +10 -0
- package/dist/types/store/use-input-mode.d.ts +6 -0
- package/dist/types/store/useRouter.d.ts +13 -0
- package/dist/types/types.d.ts +44 -0
- package/dist/types/utils/format-date.d.ts +3 -0
- package/dist/types/utils/format-date.test.d.ts +2 -0
- package/dist/types/utils/transaction.d.ts +11 -0
- package/dist/types/views/connect-wallet/connect-wallet-view.d.ts +7 -0
- package/dist/types/views/connect-wallet/wallet-list-item.d.ts +10 -0
- package/dist/types/views/main/amount-input.d.ts +11 -0
- package/dist/types/views/main/connect-prompt.d.ts +2 -0
- package/dist/types/views/main/deposit-amount-input.d.ts +2 -0
- package/dist/types/views/main/deposit-form.d.ts +2 -0
- package/dist/types/views/main/main-cta-button.d.ts +2 -0
- package/dist/types/views/main/main-view.d.ts +2 -0
- package/dist/types/views/main/navbar/actions.d.ts +2 -0
- package/dist/types/views/main/navbar/icon.d.ts +2 -0
- package/dist/types/views/main/navbar/navbar.d.ts +2 -0
- package/dist/types/views/main/navbar/title.d.ts +11 -0
- package/dist/types/views/main/recipient/account.d.ts +15 -0
- package/dist/types/views/main/recipient/recipient.d.ts +2 -0
- package/dist/types/views/main/token-selector.d.ts +2 -0
- package/dist/types/views/qr-code.d.ts +2 -0
- package/dist/types/views/render-view.d.ts +4 -0
- package/dist/types/views/select-chain/chain-type-meta.d.ts +8 -0
- package/dist/types/views/select-chain/select-chain-view.d.ts +7 -0
- package/dist/types/views/select-token.d.ts +2 -0
- package/dist/types/views/transaction-history/activity-list-item.d.ts +5 -0
- package/dist/types/views/transaction-history/transaction-history-view.d.ts +2 -0
- package/dist/types/views/transaction-progress/helpers.d.ts +15 -0
- package/dist/types/views/transaction-progress/transaction-progress-view.d.ts +2 -0
- package/dist/types/views/transaction-progress/use-transaction-progress.d.ts +18 -0
- package/package.json +102 -0
|
@@ -0,0 +1,4062 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var reactHooks = require('@0xsquid/react-hooks');
|
|
6
|
+
var ui = require('@0xsquid/ui');
|
|
7
|
+
var zustand = require('zustand');
|
|
8
|
+
var Fuse = require('fuse.js');
|
|
9
|
+
var reactWindow = require('react-window');
|
|
10
|
+
|
|
11
|
+
function _interopNamespaceDefault(e) {
|
|
12
|
+
var n = Object.create(null);
|
|
13
|
+
if (e) {
|
|
14
|
+
Object.keys(e).forEach(function (k) {
|
|
15
|
+
if (k !== 'default') {
|
|
16
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
17
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () { return e[k]; }
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
n.default = e;
|
|
25
|
+
return Object.freeze(n);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
29
|
+
|
|
30
|
+
var css_248z = "#squid-style-container .tw-font-geistvariable {\n font-feature-settings:\n \"ss01\" on,\n \"ss03\" on;\n }\n #squid-style-container .tw-timeline-gradient-mask {\n -webkit-mask-image: linear-gradient(\n to bottom,\n transparent 0%,\n black calc(50% - 15px),\n black calc(50% + 15px),\n transparent 100%\n );\n mask-image: linear-gradient(\n to bottom,\n transparent 0%,\n black calc(50% - 15px),\n black calc(50% + 15px),\n transparent 100%\n );\n }\n #squid-style-container input.date-input-no-icon::-webkit-inner-spin-button,\n #squid-style-container input.date-input-no-icon::-webkit-calendar-picker-indicator {\n display: none;\n -webkit-appearance: none;\n }\n /* boost badge colour swapping */\n #squid-style-container .boost-badge {\n --boost-badge-badge-color: var(--st-color-royal-500);\n --boost-badge-text-color: var(--st-color-grey-900);\n --boost-badge-shadow-color: #e4fe53;\n }\n [data-squid-theme-type=\"dark\"] #squid-style-container .boost-badge {\n --boost-badge-badge-color: #e4fe53;\n --boost-badge-shadow-color: var(--st-color-royal-500);\n }\n /* styling for React DayPicker */\n #squid-style-container :root .rdp {\n margin: 0 !important;\n --rdp-accent-color: var(--st-color-material-light-thin);\n --rdp-background-color: transparent;\n }\n #squid-style-container :root .rdp-month,\n #squid-style-container :root .rdp-table {\n width: 100%;\n }\n #squid-style-container :root .rdp-table {\n border-spacing: 2px;\n }\n #squid-style-container :root .rdp-nav {\n width: 28.5%;\n }\n #squid-style-container :root .rdp-nav button {\n width: 50%;\n }\n #squid-style-container :root .rdp-head_cell,\n #squid-style-container :root .rdp-cell {\n flex-grow: 1;\n width: auto;\n height: auto;\n }\n #squid-style-container :root .rdp-head_cell,\n #squid-style-container :root .rdp-cell {\n font-size:\n var(--st-font-size-caption);\n }\n #squid-style-container :root .rdp-head_cell,\n #squid-style-container :root .rdp-cell {\n font-weight:\n var(--st-font-weight-caption);\n }\n #squid-style-container :root .rdp-head_cell {\n height:\n 2.5rem;\n }\n #squid-style-container :root .rdp-day {\n width: 100%;\n }\n #squid-style-container :root .rdp-caption_label {\n font-weight: normal;\n }\n #squid-style-container :root .rdp-day,\n #squid-style-container :root .rdp-day_range_end.rdp-day_range_start {\n border-radius:\n 0.3125rem !important;\n }\n #squid-style-container :root .day-picker-from .rdp-day_range_start,\n #squid-style-container :root .day-picker-to .rdp-day_range_end {\n background-color:\n var(--st-color-royal-500);\n }\n #squid-style-container :root .day-picker-from .rdp-day_range_start,\n #squid-style-container :root .day-picker-to .rdp-day_range_end {\n --tw-text-opacity:\n 1;\n color:\n rgb(255 255 255 / var(--tw-text-opacity));\n }\n #squid-style-container :root .rdp-button:hover:not([disabled]):not(.rdp-nav_button) {\n border: 2px solid var(--st-color-royal-500);\n }\n /* Storybook */\n #squid-style-container .sb-show-main.sb-main-centered #storybook-root {\n padding: 0;\n margin: 0;\n width: 100%;\n }\n @media (min-width: 480px) {\n #squid-style-container .sb-show-main.sb-main-centered #storybook-root {\n margin:\n auto;\n }\n }\n @media (min-width: 480px) {\n #squid-style-container .sb-show-main.sb-main-centered #storybook-root {\n width:\n auto;\n }\n }\n\n@font-face {\n font-family: \"DMSansVariable\";\n\n src:\n local(\"DMSansVariable\"),\n url(\"data:font/woff2;base64,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\") format(\"woff2\");\n\n font-display: swap;\n}\n\n/* ! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com */\n\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.squid-style-container--preflight *,\n.squid-style-container--preflight ::before,\n.squid-style-container--preflight ::after {\n box-sizing: border-box;\n /* 1 */\n border-width: 0;\n /* 2 */\n border-style: solid;\n /* 2 */\n border-color: #e5e7eb;\n /* 2 */\n }\n\n.squid-style-container--preflight ::before,\n.squid-style-container--preflight ::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\n.squid-style-container--preflight html,\n.squid-style-container--preflight :host {\n line-height: 1.5;\n /* 1 */\n -webkit-text-size-adjust: 100%;\n /* 2 */\n -moz-tab-size: 4;\n /* 3 */\n -o-tab-size: 4;\n tab-size: 4;\n /* 3 */\n font-family: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n /* 4 */\n font-feature-settings: normal;\n /* 5 */\n font-variation-settings: normal;\n /* 6 */\n -webkit-tap-highlight-color: transparent;\n /* 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\n.squid-style-container--preflight body {\n margin: 0;\n /* 1 */\n line-height: inherit;\n /* 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\n.squid-style-container--preflight hr {\n height: 0;\n /* 1 */\n color: inherit;\n /* 2 */\n border-top-width: 1px;\n /* 3 */\n }\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\n.squid-style-container--preflight abbr: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\n.squid-style-container--preflight h1,\n.squid-style-container--preflight h2,\n.squid-style-container--preflight h3,\n.squid-style-container--preflight h4,\n.squid-style-container--preflight h5,\n.squid-style-container--preflight h6 {\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\n.squid-style-container--preflight a {\n color: inherit;\n text-decoration: inherit;\n }\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\n.squid-style-container--preflight b,\n.squid-style-container--preflight strong {\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\n.squid-style-container--preflight code,\n.squid-style-container--preflight kbd,\n.squid-style-container--preflight samp,\n.squid-style-container--preflight pre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n /* 1 */\n font-feature-settings: normal;\n /* 2 */\n font-variation-settings: normal;\n /* 3 */\n font-size: 1em;\n /* 4 */\n }\n\n/*\nAdd the correct font size in all browsers.\n*/\n\n.squid-style-container--preflight small {\n font-size: 80%;\n }\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\n.squid-style-container--preflight sub,\n.squid-style-container--preflight sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n\n.squid-style-container--preflight sub {\n bottom: -0.25em;\n }\n\n.squid-style-container--preflight sup {\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\n.squid-style-container--preflight table {\n text-indent: 0;\n /* 1 */\n border-color: inherit;\n /* 2 */\n border-collapse: collapse;\n /* 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\n.squid-style-container--preflight button,\n.squid-style-container--preflight input,\n.squid-style-container--preflight optgroup,\n.squid-style-container--preflight select,\n.squid-style-container--preflight textarea {\n font-family: inherit;\n /* 1 */\n font-feature-settings: inherit;\n /* 1 */\n font-variation-settings: inherit;\n /* 1 */\n font-size: 100%;\n /* 1 */\n font-weight: inherit;\n /* 1 */\n line-height: inherit;\n /* 1 */\n color: inherit;\n /* 1 */\n margin: 0;\n /* 2 */\n padding: 0;\n /* 3 */\n }\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\n.squid-style-container--preflight button,\n.squid-style-container--preflight select {\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\n.squid-style-container--preflight button,\n.squid-style-container--preflight [type='button'],\n.squid-style-container--preflight [type='reset'],\n.squid-style-container--preflight [type='submit'] {\n -webkit-appearance: button;\n /* 1 */\n background-color: transparent;\n /* 2 */\n background-image: none;\n /* 2 */\n }\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n.squid-style-container--preflight :-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.squid-style-container--preflight :-moz-ui-invalid {\n box-shadow: none;\n }\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\n.squid-style-container--preflight progress {\n vertical-align: baseline;\n }\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n.squid-style-container--preflight ::-webkit-inner-spin-button,\n.squid-style-container--preflight ::-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.squid-style-container--preflight [type='search'] {\n -webkit-appearance: textfield;\n /* 1 */\n outline-offset: -2px;\n /* 2 */\n }\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n.squid-style-container--preflight ::-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.squid-style-container--preflight ::-webkit-file-upload-button {\n -webkit-appearance: button;\n /* 1 */\n font: inherit;\n /* 2 */\n }\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\n.squid-style-container--preflight summary {\n display: list-item;\n }\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\n.squid-style-container--preflight blockquote,\n.squid-style-container--preflight dl,\n.squid-style-container--preflight dd,\n.squid-style-container--preflight h1,\n.squid-style-container--preflight h2,\n.squid-style-container--preflight h3,\n.squid-style-container--preflight h4,\n.squid-style-container--preflight h5,\n.squid-style-container--preflight h6,\n.squid-style-container--preflight hr,\n.squid-style-container--preflight figure,\n.squid-style-container--preflight p,\n.squid-style-container--preflight pre {\n margin: 0;\n }\n\n.squid-style-container--preflight fieldset {\n margin: 0;\n padding: 0;\n }\n\n.squid-style-container--preflight legend {\n padding: 0;\n }\n\n.squid-style-container--preflight ol,\n.squid-style-container--preflight ul,\n.squid-style-container--preflight menu {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n/*\nReset default styling for dialogs.\n*/\n\n.squid-style-container--preflight dialog {\n padding: 0;\n }\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\n.squid-style-container--preflight textarea {\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\n.squid-style-container--preflight input::-moz-placeholder, .squid-style-container--preflight textarea::-moz-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n }\n\n.squid-style-container--preflight input::placeholder,\n.squid-style-container--preflight textarea::placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n }\n\n/*\nSet the default cursor for buttons.\n*/\n\n.squid-style-container--preflight button,\n.squid-style-container--preflight [role=\"button\"] {\n cursor: pointer;\n }\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n\n.squid-style-container--preflight :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\n.squid-style-container--preflight img,\n.squid-style-container--preflight svg,\n.squid-style-container--preflight video,\n.squid-style-container--preflight canvas,\n.squid-style-container--preflight audio,\n.squid-style-container--preflight iframe,\n.squid-style-container--preflight embed,\n.squid-style-container--preflight object {\n display: block;\n /* 1 */\n vertical-align: middle;\n /* 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\n.squid-style-container--preflight img,\n.squid-style-container--preflight video {\n max-width: 100%;\n height: auto;\n }\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n\n.squid-style-container--preflight [hidden] {\n display: none;\n }\n\n.squid-style-container--preflight *, .squid-style-container--preflight ::before, .squid-style-container--preflight ::after {\n --tw-border-spacing-x:\n 0;\n --tw-border-spacing-y:\n 0;\n --tw-translate-x:\n 0;\n --tw-translate-y:\n 0;\n --tw-rotate:\n 0;\n --tw-skew-x:\n 0;\n --tw-skew-y:\n 0;\n --tw-scale-x:\n 1;\n --tw-scale-y:\n 1;\n --tw-pan-x:\n ;\n --tw-pan-y:\n ;\n --tw-pinch-zoom:\n ;\n --tw-scroll-snap-strictness:\n proximity;\n --tw-gradient-from-position:\n ;\n --tw-gradient-via-position:\n ;\n --tw-gradient-to-position:\n ;\n --tw-ordinal:\n ;\n --tw-slashed-zero:\n ;\n --tw-numeric-figure:\n ;\n --tw-numeric-spacing:\n ;\n --tw-numeric-fraction:\n ;\n --tw-ring-inset:\n ;\n --tw-ring-offset-width:\n 0px;\n --tw-ring-offset-color:\n #fff;\n --tw-ring-color:\n rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow:\n 0 0 #0000;\n --tw-ring-shadow:\n 0 0 #0000;\n --tw-shadow:\n 0 0 #0000;\n --tw-shadow-colored:\n 0 0 #0000;\n --tw-blur:\n ;\n --tw-brightness:\n ;\n --tw-contrast:\n ;\n --tw-grayscale:\n ;\n --tw-hue-rotate:\n ;\n --tw-invert:\n ;\n --tw-saturate:\n ;\n --tw-sepia:\n ;\n --tw-drop-shadow:\n ;\n --tw-backdrop-blur:\n ;\n --tw-backdrop-brightness:\n ;\n --tw-backdrop-contrast:\n ;\n --tw-backdrop-grayscale:\n ;\n --tw-backdrop-hue-rotate:\n ;\n --tw-backdrop-invert:\n ;\n --tw-backdrop-opacity:\n ;\n --tw-backdrop-saturate:\n ;\n --tw-backdrop-sepia:\n ;\n }\n\n.squid-style-container--preflight ::backdrop {\n --tw-border-spacing-x:\n 0;\n --tw-border-spacing-y:\n 0;\n --tw-translate-x:\n 0;\n --tw-translate-y:\n 0;\n --tw-rotate:\n 0;\n --tw-skew-x:\n 0;\n --tw-skew-y:\n 0;\n --tw-scale-x:\n 1;\n --tw-scale-y:\n 1;\n --tw-pan-x:\n ;\n --tw-pan-y:\n ;\n --tw-pinch-zoom:\n ;\n --tw-scroll-snap-strictness:\n proximity;\n --tw-gradient-from-position:\n ;\n --tw-gradient-via-position:\n ;\n --tw-gradient-to-position:\n ;\n --tw-ordinal:\n ;\n --tw-slashed-zero:\n ;\n --tw-numeric-figure:\n ;\n --tw-numeric-spacing:\n ;\n --tw-numeric-fraction:\n ;\n --tw-ring-inset:\n ;\n --tw-ring-offset-width:\n 0px;\n --tw-ring-offset-color:\n #fff;\n --tw-ring-color:\n rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow:\n 0 0 #0000;\n --tw-ring-shadow:\n 0 0 #0000;\n --tw-shadow:\n 0 0 #0000;\n --tw-shadow-colored:\n 0 0 #0000;\n --tw-blur:\n ;\n --tw-brightness:\n ;\n --tw-contrast:\n ;\n --tw-grayscale:\n ;\n --tw-hue-rotate:\n ;\n --tw-invert:\n ;\n --tw-saturate:\n ;\n --tw-sepia:\n ;\n --tw-drop-shadow:\n ;\n --tw-backdrop-blur:\n ;\n --tw-backdrop-brightness:\n ;\n --tw-backdrop-contrast:\n ;\n --tw-backdrop-grayscale:\n ;\n --tw-backdrop-hue-rotate:\n ;\n --tw-backdrop-invert:\n ;\n --tw-backdrop-opacity:\n ;\n --tw-backdrop-saturate:\n ;\n --tw-backdrop-sepia:\n ;\n }\n\n.squid-style-container :is(.tw-sr-only) {\n position:\n absolute;\n width:\n 1px;\n height:\n 1px;\n padding:\n 0;\n margin:\n -1px;\n overflow:\n hidden;\n clip:\n rect(0, 0, 0, 0);\n white-space:\n nowrap;\n border-width:\n 0;\n}\n\n.squid-style-container :is(.tw-pointer-events-none) {\n pointer-events:\n none;\n}\n\n.squid-style-container :is(.tw-visible) {\n visibility:\n visible;\n}\n\n.squid-style-container :is(.tw-invisible) {\n visibility:\n hidden;\n}\n\n.squid-style-container :is(.\\!tw-static) {\n position:\n static !important;\n}\n\n.squid-style-container :is(.tw-fixed) {\n position:\n fixed;\n}\n\n.squid-style-container :is(.tw-absolute) {\n position:\n absolute;\n}\n\n.squid-style-container :is(.tw-relative) {\n position:\n relative;\n}\n\n.squid-style-container :is(.tw-inset-0) {\n inset:\n 0px;\n}\n\n.squid-style-container :is(.tw-inset-x-0) {\n left:\n 0px;\n right:\n 0px;\n}\n\n.squid-style-container :is(.tw-inset-y-0) {\n top:\n 0px;\n bottom:\n 0px;\n}\n\n.squid-style-container :is(.\\!tw-right-\\[calc\\(100\\%\\+3px\\)\\]) {\n right:\n calc(100% + 3px) !important;\n}\n\n.squid-style-container :is(.-tw-bottom-0) {\n bottom:\n -0px;\n}\n\n.squid-style-container :is(.-tw-bottom-1) {\n bottom:\n -0.25rem;\n}\n\n.squid-style-container :is(.-tw-bottom-\\[1px\\]) {\n bottom:\n -1px;\n}\n\n.squid-style-container :is(.-tw-bottom-\\[3px\\]) {\n bottom:\n -3px;\n}\n\n.squid-style-container :is(.-tw-bottom-\\[calc\\(100\\%\\+5px\\)\\]) {\n bottom:\n calc(calc(100% + 5px) * -1);\n}\n\n.squid-style-container :is(.-tw-left-1) {\n left:\n -0.25rem;\n}\n\n.squid-style-container :is(.-tw-left-\\[2px\\]) {\n left:\n -2px;\n}\n\n.squid-style-container :is(.-tw-left-\\[4px\\]) {\n left:\n -4px;\n}\n\n.squid-style-container :is(.-tw-left-\\[5px\\]) {\n left:\n -5px;\n}\n\n.squid-style-container :is(.-tw-right-0) {\n right:\n -0px;\n}\n\n.squid-style-container :is(.-tw-right-\\[1px\\]) {\n right:\n -1px;\n}\n\n.squid-style-container :is(.-tw-right-\\[3px\\]) {\n right:\n -3px;\n}\n\n.squid-style-container :is(.-tw-right-squid-xxs) {\n right:\n -0.3125rem;\n}\n\n.squid-style-container :is(.-tw-top-0) {\n top:\n -0px;\n}\n\n.squid-style-container :is(.-tw-top-\\[2px\\]) {\n top:\n -2px;\n}\n\n.squid-style-container :is(.-tw-top-\\[35px\\]) {\n top:\n -35px;\n}\n\n.squid-style-container :is(.-tw-top-\\[4px\\]) {\n top:\n -4px;\n}\n\n.squid-style-container :is(.-tw-top-squid-xxs) {\n top:\n -0.3125rem;\n}\n\n.squid-style-container :is(.tw-bottom-0) {\n bottom:\n 0px;\n}\n\n.squid-style-container :is(.tw-bottom-\\[50px\\]) {\n bottom:\n 50px;\n}\n\n.squid-style-container :is(.tw-bottom-full) {\n bottom:\n 100%;\n}\n\n.squid-style-container :is(.tw-left-0) {\n left:\n 0px;\n}\n\n.squid-style-container :is(.tw-left-1\\/2) {\n left:\n 50%;\n}\n\n.squid-style-container :is(.tw-left-\\[17px\\]) {\n left:\n 17px;\n}\n\n.squid-style-container :is(.tw-left-\\[1px\\]) {\n left:\n 1px;\n}\n\n.squid-style-container :is(.tw-left-\\[26px\\]) {\n left:\n 26px;\n}\n\n.squid-style-container :is(.tw-left-\\[2px\\]) {\n left:\n 2px;\n}\n\n.squid-style-container :is(.tw-left-\\[54px\\]) {\n left:\n 54px;\n}\n\n.squid-style-container :is(.tw-left-squid-s) {\n left:\n 0.9375rem;\n}\n\n.squid-style-container :is(.tw-right-0) {\n right:\n 0px;\n}\n\n.squid-style-container :is(.tw-right-1) {\n right:\n 0.25rem;\n}\n\n.squid-style-container :is(.tw-right-1\\.5) {\n right:\n 0.375rem;\n}\n\n.squid-style-container :is(.tw-right-\\[50px\\]) {\n right:\n 50px;\n}\n\n.squid-style-container :is(.tw-right-\\[unset\\]) {\n right:\n unset;\n}\n\n.squid-style-container :is(.tw-right-full) {\n right:\n 100%;\n}\n\n.squid-style-container :is(.tw-right-squid-m) {\n right:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-right-squid-s) {\n right:\n 0.9375rem;\n}\n\n.squid-style-container :is(.tw-right-squid-xs) {\n right:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-right-squid-xxs) {\n right:\n 0.3125rem;\n}\n\n.squid-style-container :is(.tw-top-0) {\n top:\n 0px;\n}\n\n.squid-style-container :is(.tw-top-1\\/2) {\n top:\n 50%;\n}\n\n.squid-style-container :is(.tw-top-\\[50px\\]) {\n top:\n 50px;\n}\n\n.squid-style-container :is(.tw-top-\\[calc\\(100\\%\\+5px\\)\\]) {\n top:\n calc(100% + 5px);\n}\n\n.squid-style-container :is(.tw-top-full) {\n top:\n 100%;\n}\n\n.squid-style-container :is(.tw-top-squid-xs) {\n top:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-top-squid-xxs) {\n top:\n 0.3125rem;\n}\n\n.squid-style-container :is(.-tw-z-40) {\n z-index:\n -40;\n}\n\n.squid-style-container :is(.tw-z-0) {\n z-index:\n 0;\n}\n\n.squid-style-container :is(.tw-z-10) {\n z-index:\n 10;\n}\n\n.squid-style-container :is(.tw-z-20) {\n z-index:\n 20;\n}\n\n.squid-style-container :is(.tw-z-30) {\n z-index:\n 30;\n}\n\n.squid-style-container :is(.tw-z-40) {\n z-index:\n 40;\n}\n\n.squid-style-container :is(.tw-z-\\[1\\]) {\n z-index:\n 1;\n}\n\n.squid-style-container :is(.tw-z-\\[5\\]) {\n z-index:\n 5;\n}\n\n.squid-style-container :is(.tw-mx-auto) {\n margin-left:\n auto;\n margin-right:\n auto;\n}\n\n.squid-style-container :is(.tw-mx-squid-xxs) {\n margin-left:\n 0.3125rem;\n margin-right:\n 0.3125rem;\n}\n\n.squid-style-container :is(.tw-my-squid-s) {\n margin-top:\n 0.9375rem;\n margin-bottom:\n 0.9375rem;\n}\n\n.squid-style-container :is(.tw-my-squid-xs) {\n margin-top:\n 0.625rem;\n margin-bottom:\n 0.625rem;\n}\n\n.squid-style-container :is(.-tw-mb-1) {\n margin-bottom:\n -0.25rem;\n}\n\n.squid-style-container :is(.-tw-ml-1) {\n margin-left:\n -0.25rem;\n}\n\n.squid-style-container :is(.-tw-ml-2) {\n margin-left:\n -0.5rem;\n}\n\n.squid-style-container :is(.-tw-mt-2) {\n margin-top:\n -0.5rem;\n}\n\n.squid-style-container :is(.tw-mb-squid-xs) {\n margin-bottom:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-ml-0) {\n margin-left:\n 0px;\n}\n\n.squid-style-container :is(.tw-ml-0\\.5) {\n margin-left:\n 0.125rem;\n}\n\n.squid-style-container :is(.tw-ml-auto) {\n margin-left:\n auto;\n}\n\n.squid-style-container :is(.tw-mr-1) {\n margin-right:\n 0.25rem;\n}\n\n.squid-style-container :is(.tw-mr-1\\.5) {\n margin-right:\n 0.375rem;\n}\n\n.squid-style-container :is(.tw-mr-squid-xl) {\n margin-right:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-mt-0) {\n margin-top:\n 0px;\n}\n\n.squid-style-container :is(.tw-mt-0\\.5) {\n margin-top:\n 0.125rem;\n}\n\n.squid-style-container :is(.tw-mt-2) {\n margin-top:\n 0.5rem;\n}\n\n.squid-style-container :is(.tw-mt-auto) {\n margin-top:\n auto;\n}\n\n.squid-style-container :is(.tw-mt-squid-s) {\n margin-top:\n 0.9375rem;\n}\n\n.squid-style-container :is(.tw-block) {\n display:\n block;\n}\n\n.squid-style-container :is(.tw-inline-block) {\n display:\n inline-block;\n}\n\n.squid-style-container :is(.tw-flex) {\n display:\n flex;\n}\n\n.squid-style-container :is(.tw-inline-flex) {\n display:\n inline-flex;\n}\n\n.squid-style-container :is(.tw-grid) {\n display:\n grid;\n}\n\n.squid-style-container :is(.tw-hidden) {\n display:\n none;\n}\n\n.squid-style-container :is(.tw-aspect-square) {\n aspect-ratio:\n 1 / 1;\n}\n\n.squid-style-container :is(.tw-size-10) {\n width:\n 2.5rem;\n height:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-size-12) {\n width:\n 3rem;\n height:\n 3rem;\n}\n\n.squid-style-container :is(.tw-size-3) {\n width:\n 0.75rem;\n height:\n 0.75rem;\n}\n\n.squid-style-container :is(.tw-size-8) {\n width:\n 2rem;\n height:\n 2rem;\n}\n\n.squid-style-container :is(.tw-size-\\[22\\.5rem\\]) {\n width:\n 22.5rem;\n height:\n 22.5rem;\n}\n\n.squid-style-container :is(.tw-size-full) {\n width:\n 100%;\n height:\n 100%;\n}\n\n.squid-style-container :is(.tw-size-squid-xl) {\n width:\n 2.5rem;\n height:\n 2.5rem;\n}\n\n.squid-style-container :is(.\\!tw-h-6) {\n height:\n 1.5rem !important;\n}\n\n.squid-style-container :is(.\\!tw-h-8) {\n height:\n 2rem !important;\n}\n\n.squid-style-container :is(.\\!tw-h-\\[30px\\]) {\n height:\n 30px !important;\n}\n\n.squid-style-container :is(.\\!tw-h-full) {\n height:\n 100% !important;\n}\n\n.squid-style-container :is(.tw-h-0) {\n height:\n 0px;\n}\n\n.squid-style-container :is(.tw-h-0\\.5) {\n height:\n 0.125rem;\n}\n\n.squid-style-container :is(.tw-h-10) {\n height:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-h-12) {\n height:\n 3rem;\n}\n\n.squid-style-container :is(.tw-h-14) {\n height:\n 3.5rem;\n}\n\n.squid-style-container :is(.tw-h-16) {\n height:\n 4rem;\n}\n\n.squid-style-container :is(.tw-h-2) {\n height:\n 0.5rem;\n}\n\n.squid-style-container :is(.tw-h-2\\.5) {\n height:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-h-20) {\n height:\n 5rem;\n}\n\n.squid-style-container :is(.tw-h-3) {\n height:\n 0.75rem;\n}\n\n.squid-style-container :is(.tw-h-32) {\n height:\n 8rem;\n}\n\n.squid-style-container :is(.tw-h-4) {\n height:\n 1rem;\n}\n\n.squid-style-container :is(.tw-h-5) {\n height:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-h-6) {\n height:\n 1.5rem;\n}\n\n.squid-style-container :is(.tw-h-8) {\n height:\n 2rem;\n}\n\n.squid-style-container :is(.tw-h-\\[0\\.8em\\]) {\n height:\n 0.8em;\n}\n\n.squid-style-container :is(.tw-h-\\[100px\\]) {\n height:\n 100px;\n}\n\n.squid-style-container :is(.tw-h-\\[130px\\]) {\n height:\n 130px;\n}\n\n.squid-style-container :is(.tw-h-\\[13px\\]) {\n height:\n 13px;\n}\n\n.squid-style-container :is(.tw-h-\\[14px\\]) {\n height:\n 14px;\n}\n\n.squid-style-container :is(.tw-h-\\[160px\\]) {\n height:\n 160px;\n}\n\n.squid-style-container :is(.tw-h-\\[16px\\]) {\n height:\n 16px;\n}\n\n.squid-style-container :is(.tw-h-\\[17px\\]) {\n height:\n 17px;\n}\n\n.squid-style-container :is(.tw-h-\\[21px\\]) {\n height:\n 21px;\n}\n\n.squid-style-container :is(.tw-h-\\[26px\\]) {\n height:\n 26px;\n}\n\n.squid-style-container :is(.tw-h-\\[30px\\]) {\n height:\n 30px;\n}\n\n.squid-style-container :is(.tw-h-\\[31px\\]) {\n height:\n 31px;\n}\n\n.squid-style-container :is(.tw-h-\\[4\\.5rem\\]) {\n height:\n 4.5rem;\n}\n\n.squid-style-container :is(.tw-h-\\[40px\\]) {\n height:\n 40px;\n}\n\n.squid-style-container :is(.tw-h-\\[42px\\]) {\n height:\n 42px;\n}\n\n.squid-style-container :is(.tw-h-\\[45px\\]) {\n height:\n 45px;\n}\n\n.squid-style-container :is(.tw-h-\\[46px\\]) {\n height:\n 46px;\n}\n\n.squid-style-container :is(.tw-h-\\[470px\\]) {\n height:\n 470px;\n}\n\n.squid-style-container :is(.tw-h-\\[50px\\]) {\n height:\n 50px;\n}\n\n.squid-style-container :is(.tw-h-\\[52px\\]) {\n height:\n 52px;\n}\n\n.squid-style-container :is(.tw-h-\\[55px\\]) {\n height:\n 55px;\n}\n\n.squid-style-container :is(.tw-h-\\[60px\\]) {\n height:\n 60px;\n}\n\n.squid-style-container :is(.tw-h-\\[65px\\]) {\n height:\n 65px;\n}\n\n.squid-style-container :is(.tw-h-\\[69px\\]) {\n height:\n 69px;\n}\n\n.squid-style-container :is(.tw-h-\\[71px\\]) {\n height:\n 71px;\n}\n\n.squid-style-container :is(.tw-h-\\[80px\\]) {\n height:\n 80px;\n}\n\n.squid-style-container :is(.tw-h-\\[94px\\]) {\n height:\n 94px;\n}\n\n.squid-style-container :is(.tw-h-button) {\n height:\n 3.75rem;\n}\n\n.squid-style-container :is(.tw-h-fit) {\n height:\n -moz-fit-content;\n height:\n fit-content;\n}\n\n.squid-style-container :is(.tw-h-full) {\n height:\n 100%;\n}\n\n.squid-style-container :is(.tw-h-list-item-large) {\n height:\n 3.125rem;\n}\n\n.squid-style-container :is(.tw-h-list-item-small) {\n height:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-h-px) {\n height:\n 1px;\n}\n\n.squid-style-container :is(.tw-h-squid-l) {\n height:\n 1.875rem;\n}\n\n.squid-style-container :is(.tw-h-squid-m) {\n height:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-h-squid-xl) {\n height:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-h-squid-xl2) {\n height:\n 3.125rem;\n}\n\n.squid-style-container :is(.tw-h-squid-xs) {\n height:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-h-squid-xxl) {\n height:\n 3.75rem;\n}\n\n.squid-style-container :is(.tw-h-widget-card) {\n height:\n 30rem;\n}\n\n.squid-style-container :is(.\\!tw-max-h-squid-xl) {\n max-height:\n 2.5rem !important;\n}\n\n.squid-style-container :is(.tw-max-h-0) {\n max-height:\n 0px;\n}\n\n.squid-style-container :is(.tw-max-h-20) {\n max-height:\n 5rem;\n}\n\n.squid-style-container :is(.tw-max-h-\\[120px\\]) {\n max-height:\n 120px;\n}\n\n.squid-style-container :is(.tw-max-h-\\[415px\\]) {\n max-height:\n 415px;\n}\n\n.squid-style-container :is(.tw-max-h-\\[470px\\]) {\n max-height:\n 470px;\n}\n\n.squid-style-container :is(.tw-max-h-\\[55px\\]) {\n max-height:\n 55px;\n}\n\n.squid-style-container :is(.tw-max-h-\\[80vh\\]) {\n max-height:\n 80vh;\n}\n\n.squid-style-container :is(.tw-max-h-full) {\n max-height:\n 100%;\n}\n\n.squid-style-container :is(.tw-max-h-list-item-small) {\n max-height:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-max-h-modal-compact) {\n max-height:\n 631px;\n}\n\n.squid-style-container :is(.tw-max-h-squid-m) {\n max-height:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-max-h-squid-xl) {\n max-height:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-min-h-10) {\n min-height:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-min-h-12) {\n min-height:\n 3rem;\n}\n\n.squid-style-container :is(.tw-min-h-14) {\n min-height:\n 3.5rem;\n}\n\n.squid-style-container :is(.tw-min-h-\\[30px\\]) {\n min-height:\n 30px;\n}\n\n.squid-style-container :is(.tw-min-h-\\[55px\\]) {\n min-height:\n 55px;\n}\n\n.squid-style-container :is(.tw-min-h-\\[631px\\]) {\n min-height:\n 631px;\n}\n\n.squid-style-container :is(.tw-min-h-\\[95px\\]) {\n min-height:\n 95px;\n}\n\n.squid-style-container :is(.tw-min-h-button) {\n min-height:\n 3.75rem;\n}\n\n.squid-style-container :is(.tw-min-h-card-small) {\n min-height:\n 580px;\n}\n\n.squid-style-container :is(.tw-min-h-squid-l) {\n min-height:\n 1.875rem;\n}\n\n.squid-style-container :is(.tw-min-h-squid-m) {\n min-height:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-min-h-squid-xl) {\n min-height:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-min-h-squid-xxl) {\n min-height:\n 3.75rem;\n}\n\n.squid-style-container :is(.\\!tw-w-6) {\n width:\n 1.5rem !important;\n}\n\n.squid-style-container :is(.\\!tw-w-\\[72px\\]) {\n width:\n 72px !important;\n}\n\n.squid-style-container :is(.\\!tw-w-fit) {\n width:\n -moz-fit-content !important;\n width:\n fit-content !important;\n}\n\n.squid-style-container :is(.tw-w-0) {\n width:\n 0px;\n}\n\n.squid-style-container :is(.tw-w-0\\.5) {\n width:\n 0.125rem;\n}\n\n.squid-style-container :is(.tw-w-1) {\n width:\n 0.25rem;\n}\n\n.squid-style-container :is(.tw-w-10) {\n width:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-w-20) {\n width:\n 5rem;\n}\n\n.squid-style-container :is(.tw-w-32) {\n width:\n 8rem;\n}\n\n.squid-style-container :is(.tw-w-4) {\n width:\n 1rem;\n}\n\n.squid-style-container :is(.tw-w-40) {\n width:\n 10rem;\n}\n\n.squid-style-container :is(.tw-w-48) {\n width:\n 12rem;\n}\n\n.squid-style-container :is(.tw-w-5) {\n width:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-w-56) {\n width:\n 14rem;\n}\n\n.squid-style-container :is(.tw-w-6) {\n width:\n 1.5rem;\n}\n\n.squid-style-container :is(.tw-w-8) {\n width:\n 2rem;\n}\n\n.squid-style-container :is(.tw-w-\\[108px\\]) {\n width:\n 108px;\n}\n\n.squid-style-container :is(.tw-w-\\[120px\\]) {\n width:\n 120px;\n}\n\n.squid-style-container :is(.tw-w-\\[157px\\]) {\n width:\n 157px;\n}\n\n.squid-style-container :is(.tw-w-\\[160px\\]) {\n width:\n 160px;\n}\n\n.squid-style-container :is(.tw-w-\\[16px\\]) {\n width:\n 16px;\n}\n\n.squid-style-container :is(.tw-w-\\[22px\\]) {\n width:\n 22px;\n}\n\n.squid-style-container :is(.tw-w-\\[26px\\]) {\n width:\n 26px;\n}\n\n.squid-style-container :is(.tw-w-\\[2px\\]) {\n width:\n 2px;\n}\n\n.squid-style-container :is(.tw-w-\\[30px\\]) {\n width:\n 30px;\n}\n\n.squid-style-container :is(.tw-w-\\[31px\\]) {\n width:\n 31px;\n}\n\n.squid-style-container :is(.tw-w-\\[36px\\]) {\n width:\n 36px;\n}\n\n.squid-style-container :is(.tw-w-\\[40px\\]) {\n width:\n 40px;\n}\n\n.squid-style-container :is(.tw-w-\\[42px\\]) {\n width:\n 42px;\n}\n\n.squid-style-container :is(.tw-w-\\[44px\\]) {\n width:\n 44px;\n}\n\n.squid-style-container :is(.tw-w-\\[52px\\]) {\n width:\n 52px;\n}\n\n.squid-style-container :is(.tw-w-\\[54px\\]) {\n width:\n 54px;\n}\n\n.squid-style-container :is(.tw-w-\\[56\\%\\]) {\n width:\n 56%;\n}\n\n.squid-style-container :is(.tw-w-\\[67\\%\\]) {\n width:\n 67%;\n}\n\n.squid-style-container :is(.tw-w-\\[69px\\]) {\n width:\n 69px;\n}\n\n.squid-style-container :is(.tw-w-\\[70px\\]) {\n width:\n 70px;\n}\n\n.squid-style-container :is(.tw-w-\\[72px\\]) {\n width:\n 72px;\n}\n\n.squid-style-container :is(.tw-w-\\[78\\.75rem\\]) {\n width:\n 78.75rem;\n}\n\n.squid-style-container :is(.tw-w-\\[80px\\]) {\n width:\n 80px;\n}\n\n.squid-style-container :is(.tw-w-\\[92px\\]) {\n width:\n 92px;\n}\n\n.squid-style-container :is(.tw-w-\\[94px\\]) {\n width:\n 94px;\n}\n\n.squid-style-container :is(.tw-w-\\[calc\\(100\\%\\+20px\\)\\]) {\n width:\n calc(100% + 20px);\n}\n\n.squid-style-container :is(.tw-w-fit) {\n width:\n -moz-fit-content;\n width:\n fit-content;\n}\n\n.squid-style-container :is(.tw-w-full) {\n width:\n 100%;\n}\n\n.squid-style-container :is(.tw-w-max) {\n width:\n -moz-max-content;\n width:\n max-content;\n}\n\n.squid-style-container :is(.tw-w-modal-compact) {\n width:\n 373px;\n}\n\n.squid-style-container :is(.tw-w-squid-l) {\n width:\n 1.875rem;\n}\n\n.squid-style-container :is(.tw-w-squid-m) {\n width:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-w-squid-s) {\n width:\n 0.9375rem;\n}\n\n.squid-style-container :is(.tw-w-squid-xl) {\n width:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-w-squid-xxl) {\n width:\n 3.75rem;\n}\n\n.squid-style-container :is(.tw-w-widget-card) {\n width:\n 23.75rem;\n}\n\n.squid-style-container :is(.\\!tw-min-w-0) {\n min-width:\n 0px !important;\n}\n\n.squid-style-container :is(.tw-min-w-0) {\n min-width:\n 0px;\n}\n\n.squid-style-container :is(.tw-min-w-4) {\n min-width:\n 1rem;\n}\n\n.squid-style-container :is(.tw-min-w-8) {\n min-width:\n 2rem;\n}\n\n.squid-style-container :is(.tw-min-w-\\[135px\\]) {\n min-width:\n 135px;\n}\n\n.squid-style-container :is(.tw-min-w-\\[160px\\]) {\n min-width:\n 160px;\n}\n\n.squid-style-container :is(.tw-min-w-\\[30px\\]) {\n min-width:\n 30px;\n}\n\n.squid-style-container :is(.tw-min-w-\\[60px\\]) {\n min-width:\n 60px;\n}\n\n.squid-style-container :is(.tw-min-w-fit) {\n min-width:\n -moz-fit-content;\n min-width:\n fit-content;\n}\n\n.squid-style-container :is(.tw-min-w-list-item-small) {\n min-width:\n 21.25rem;\n}\n\n.squid-style-container :is(.tw-min-w-squid-xl) {\n min-width:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-min-w-squid-xxl) {\n min-width:\n 3.75rem;\n}\n\n.squid-style-container :is(.\\!tw-max-w-full) {\n max-width:\n 100% !important;\n}\n\n.squid-style-container :is(.tw-max-w-96) {\n max-width:\n 24rem;\n}\n\n.squid-style-container :is(.tw-max-w-\\[100vw\\]) {\n max-width:\n 100vw;\n}\n\n.squid-style-container :is(.tw-max-w-\\[260px\\]) {\n max-width:\n 260px;\n}\n\n.squid-style-container :is(.tw-max-w-\\[320px\\]) {\n max-width:\n 320px;\n}\n\n.squid-style-container :is(.tw-max-w-\\[35ch\\]) {\n max-width:\n 35ch;\n}\n\n.squid-style-container :is(.tw-max-w-\\[44px\\]) {\n max-width:\n 44px;\n}\n\n.squid-style-container :is(.tw-max-w-\\[80px\\]) {\n max-width:\n 80px;\n}\n\n.squid-style-container :is(.tw-max-w-\\[calc\\(100\\%-3\\.125rem\\)\\]) {\n max-width:\n calc(100% - 3.125rem);\n}\n\n.squid-style-container :is(.tw-max-w-\\[calc\\(100\\%-30px\\)\\]) {\n max-width:\n calc(100% - 30px);\n}\n\n.squid-style-container :is(.tw-max-w-\\[calc\\(100\\%-60px\\)\\]) {\n max-width:\n calc(100% - 60px);\n}\n\n.squid-style-container :is(.tw-max-w-\\[calc\\(100\\%-80px\\)\\]) {\n max-width:\n calc(100% - 80px);\n}\n\n.squid-style-container :is(.tw-max-w-fit) {\n max-width:\n -moz-fit-content;\n max-width:\n fit-content;\n}\n\n.squid-style-container :is(.tw-max-w-full) {\n max-width:\n 100%;\n}\n\n.squid-style-container :is(.tw-max-w-modal-compact) {\n max-width:\n 373px;\n}\n\n.squid-style-container :is(.tw-flex-1) {\n flex:\n 1 1 0%;\n}\n\n.squid-style-container :is(.tw-flex-shrink-0) {\n flex-shrink:\n 0;\n}\n\n.squid-style-container :is(.tw-shrink-0) {\n flex-shrink:\n 0;\n}\n\n.squid-style-container :is(.tw-flex-grow) {\n flex-grow:\n 1;\n}\n\n.squid-style-container :is(.tw-grow) {\n flex-grow:\n 1;\n}\n\n.squid-style-container :is(.tw-grow-0) {\n flex-grow:\n 0;\n}\n\n.squid-style-container :is(.tw-origin-center) {\n transform-origin:\n center;\n}\n\n.squid-style-container :is(.-tw-translate-x-1\\/2) {\n --tw-translate-x:\n -50%;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.-tw-translate-x-\\[1px\\]) {\n --tw-translate-x:\n -1px;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.-tw-translate-y-1\\/2) {\n --tw-translate-y:\n -50%;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.-tw-translate-y-\\[1px\\]) {\n --tw-translate-y:\n -1px;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-translate-x-1\\/2) {\n --tw-translate-x:\n 50%;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-translate-x-1\\/3) {\n --tw-translate-x:\n 33.333333%;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-translate-x-\\[-8px\\]) {\n --tw-translate-x:\n -8px;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-translate-y-\\[calc\\(-50\\%\\+20px\\)\\]) {\n --tw-translate-y:\n calc(-50% + 20px);\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.-tw-rotate-90) {\n --tw-rotate:\n -90deg;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-rotate-0) {\n --tw-rotate:\n 0deg;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-rotate-180) {\n --tw-rotate:\n 180deg;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-rotate-90) {\n --tw-rotate:\n 90deg;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-scale-75) {\n --tw-scale-x:\n .75;\n --tw-scale-y:\n .75;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n@keyframes tw-blur-in {\n 0% {\n backdrop-filter:\n blur(0px);\n }\n\n 100% {\n backdrop-filter:\n blur(20px) saturate(150%);\n background-color:\n var(--st-color-modal-backdrop);\n }\n}\n\n.squid-style-container :is(.tw-animate-blur-in) {\n animation:\n tw-blur-in var(--squid-animation-blur-in-duration, 0s) cubic-bezier(.165,.84,.44,1) both;\n}\n\n@keyframes tw-blur-out {\n 0% {\n backdrop-filter:\n blur(20px) saturate(150%);\n background-color:\n var(--st-color-modal-backdrop);\n }\n\n 100% {\n backdrop-filter:\n blur(0px);\n }\n}\n\n.squid-style-container :is(.tw-animate-blur-out) {\n animation:\n tw-blur-out var(--squid-animation-blur-out-duration, 0s) cubic-bezier(.165,.84,.44,1) both;\n}\n\n@keyframes tw-collapse-route {\n 0% {\n height:\n 100%;\n }\n\n 100% {\n height:\n 60px;\n }\n}\n\n.squid-style-container :is(.tw-animate-collapse-route) {\n animation:\n tw-collapse-route var(--squid-animation-collapse-to-bottom-duration, 0s) linear both;\n}\n\n@keyframes tw-expand-route {\n 0% {\n height:\n 60px;\n }\n\n 100% {\n height:\n 100%;\n }\n}\n\n.squid-style-container :is(.tw-animate-expand-route) {\n animation:\n tw-expand-route var(--squid-animation-expand-to-top-duration, 0s) linear both;\n}\n\n@keyframes tw-fade-in {\n 0% {\n opacity:\n 0;\n }\n\n 100% {\n opacity:\n 1;\n }\n}\n\n.squid-style-container :is(.tw-animate-fade-in) {\n animation:\n tw-fade-in var(--squid-animation-fade-in-duration, 0s) ease-out both;\n}\n\n@keyframes tw-fade-out {\n 0% {\n opacity:\n 1;\n }\n\n 100% {\n opacity:\n 0;\n }\n}\n\n.squid-style-container :is(.tw-animate-fade-out) {\n animation:\n tw-fade-out var(--squid-animation-fade-out-duration, 0s) ease-out both;\n}\n\n@keyframes tw-move-loading-cover-to-right {\n 0% {\n transform:\n translateX(-64%);\n }\n\n 100% {\n transform:\n translateX(0%);\n }\n}\n\n.squid-style-container :is(.tw-animate-move-loading-cover-to-right) {\n animation:\n tw-move-loading-cover-to-right 1.4s linear infinite;\n}\n\n@keyframes tw-pulse {\n 50% {\n opacity:\n .5;\n }\n}\n\n.squid-style-container :is(.tw-animate-pulse) {\n animation:\n tw-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n\n@keyframes tw-scale-and-fade-down {\n 0% {\n transform:\n scale(1);\n opacity:\n 1;\n }\n\n 100% {\n transform:\n scale(0.9);\n opacity:\n 0.5;\n }\n}\n\n.squid-style-container :is(.tw-animate-scale-and-fade-down) {\n animation:\n tw-scale-and-fade-down var(--squid-animation-scale-and-fade-down-duration, 0s) linear both;\n}\n\n@keyframes tw-scale-and-fade-up {\n 0% {\n transform:\n scale(0.9);\n opacity:\n 0.5;\n }\n\n 100% {\n transform:\n scale(1);\n opacity:\n 1;\n }\n}\n\n.squid-style-container :is(.tw-animate-scale-and-fade-up) {\n animation:\n tw-scale-and-fade-up var(--squid-animation-scale-and-fade-up-duration, 0s) linear both;\n}\n\n@keyframes tw-shimmer {\n 0% {\n background-position:\n 100% center;\n }\n\n 100% {\n background-position:\n -100% center;\n }\n}\n\n.squid-style-container :is(.tw-animate-shimmer) {\n animation:\n tw-shimmer 1.5s linear infinite;\n}\n\n@keyframes tw-slide-in-left {\n 0% {\n transform:\n translateX(-100%);\n }\n\n 100% {\n transform:\n translateX(0);\n }\n}\n\n.squid-style-container :is(.tw-animate-slide-in-left) {\n animation:\n tw-slide-in-left 250ms cubic-bezier(0.25, 0.1, 0.25, 1) forwards;\n}\n\n@keyframes tw-slide-in-right {\n 0% {\n transform:\n translateX(100%);\n }\n\n 100% {\n transform:\n translateX(0);\n }\n}\n\n.squid-style-container :is(.tw-animate-slide-in-right) {\n animation:\n tw-slide-in-right 250ms cubic-bezier(0.25, 0.1, 0.25, 1) forwards;\n}\n\n@keyframes tw-slide-out-left {\n 0% {\n transform:\n translateX(0);\n }\n\n 100% {\n transform:\n translateX(-100%);\n }\n}\n\n.squid-style-container :is(.tw-animate-slide-out-left) {\n animation:\n tw-slide-out-left 250ms cubic-bezier(0.25, 0.1, 0.25, 1) forwards;\n}\n\n@keyframes tw-slide-out-right {\n 0% {\n transform:\n translateX(0);\n }\n\n 100% {\n transform:\n translateX(100%);\n }\n}\n\n.squid-style-container :is(.tw-animate-slide-out-right) {\n animation:\n tw-slide-out-right 250ms cubic-bezier(0.25, 0.1, 0.25, 1) forwards;\n}\n\n@keyframes tw-slide-to-bottom {\n 0% {\n transform:\n translate3d(0, 0, 0);\n }\n\n 100% {\n transform:\n translate3d(0, 650px, 0);\n }\n}\n\n.squid-style-container :is(.tw-animate-slide-to-bottom) {\n animation:\n tw-slide-to-bottom var(--squid-animation-slide-to-bottom-duration, 0s) cubic-bezier(.165,.84,.44,1) both;\n}\n\n@keyframes tw-slide-to-bottom-and-fade-out {\n 0% {\n transform:\n translate3d(0, 0, 0);\n opacity:\n 1;\n }\n\n 100% {\n transform:\n translate3d(0, 650px, 0);\n opacity:\n 0;\n }\n}\n\n.squid-style-container :is(.tw-animate-slide-to-bottom-and-fade-out) {\n animation:\n tw-slide-to-bottom-and-fade-out var(--squid-animation-slide-to-bottom-duration, 0s) cubic-bezier(.165,.84,.44,1) both;\n}\n\n@keyframes tw-slide-to-top {\n 0% {\n transform:\n translate3d(0, 650px, 0);\n }\n\n 100% {\n transform:\n translate3d(0, 0, 0);\n }\n}\n\n.squid-style-container :is(.tw-animate-slide-to-top) {\n animation:\n tw-slide-to-top var(--squid-animation-slide-to-top-duration, 0s) cubic-bezier(.165,.84,.44,1) both;\n}\n\n@keyframes tw-slide-to-top-and-fade-in {\n 0% {\n transform:\n translate3d(0, 650px, 0);\n opacity:\n 0;\n }\n\n 100% {\n transform:\n translate3d(0, 0, 0);\n opacity:\n 1;\n }\n}\n\n.squid-style-container :is(.tw-animate-slide-to-top-and-fade-in) {\n animation:\n tw-slide-to-top-and-fade-in var(--squid-animation-slide-to-top-duration, 0s) cubic-bezier(.165,.84,.44,1) both;\n}\n\n@keyframes tw-rotate-360 {\n to {\n transform:\n rotate(360deg);\n }\n}\n\n.squid-style-container :is(.tw-animate-squid-animated-loader) {\n animation:\n tw-rotate-360 var(--squid-loader-rotate-duration) linear infinite;\n}\n\n@keyframes tw-squid-animated-loader-dash-grow {\n 0% {\n stroke-dasharray:\n 62.827;\n stroke-dashoffset:\n 0;\n }\n\n 100% {\n stroke-dasharray:\n 4141.884;\n stroke-dashoffset:\n -20.942;\n }\n}\n\n.squid-style-container :is(.tw-animate-squid-animated-loader-dash-grow) {\n animation:\n tw-squid-animated-loader-dash-grow var(--squid-loader-rotate-duration) infinite alternate ease-in-out;\n}\n\n.squid-style-container :is(.tw-cursor-default) {\n cursor:\n default;\n}\n\n.squid-style-container :is(.tw-cursor-help) {\n cursor:\n help;\n}\n\n.squid-style-container :is(.tw-cursor-not-allowed) {\n cursor:\n not-allowed;\n}\n\n.squid-style-container :is(.tw-cursor-pointer) {\n cursor:\n pointer;\n}\n\n.squid-style-container :is(.tw-cursor-text) {\n cursor:\n text;\n}\n\n.squid-style-container :is(.tw-select-none) {\n -webkit-user-select:\n none;\n -moz-user-select:\n none;\n user-select:\n none;\n}\n\n.squid-style-container :is(.tw-grid-cols-7) {\n grid-template-columns:\n repeat(7, minmax(0, 1fr));\n}\n\n.squid-style-container :is(.tw-grid-cols-\\[100px\\,1fr\\,100px\\]) {\n grid-template-columns:\n 100px 1fr 100px;\n}\n\n.squid-style-container :is(.tw-grid-cols-\\[40px\\,1fr\\,60px\\]) {\n grid-template-columns:\n 40px 1fr 60px;\n}\n\n.squid-style-container :is(.tw-grid-rows-\\[1fr\\]) {\n grid-template-rows:\n 1fr;\n}\n\n.squid-style-container :is(.tw-flex-row) {\n flex-direction:\n row;\n}\n\n.squid-style-container :is(.tw-flex-row-reverse) {\n flex-direction:\n row-reverse;\n}\n\n.squid-style-container :is(.tw-flex-col) {\n flex-direction:\n column;\n}\n\n.squid-style-container :is(.tw-flex-col-reverse) {\n flex-direction:\n column-reverse;\n}\n\n.squid-style-container :is(.tw-flex-wrap) {\n flex-wrap:\n wrap;\n}\n\n.squid-style-container :is(.tw-content-center) {\n align-content:\n center;\n}\n\n.squid-style-container :is(.tw-items-start) {\n align-items:\n flex-start;\n}\n\n.squid-style-container :is(.tw-items-end) {\n align-items:\n flex-end;\n}\n\n.squid-style-container :is(.tw-items-center) {\n align-items:\n center;\n}\n\n.squid-style-container :is(.tw-justify-start) {\n justify-content:\n flex-start;\n}\n\n.squid-style-container :is(.tw-justify-end) {\n justify-content:\n flex-end;\n}\n\n.squid-style-container :is(.tw-justify-center) {\n justify-content:\n center;\n}\n\n.squid-style-container :is(.tw-justify-between) {\n justify-content:\n space-between;\n}\n\n.squid-style-container :is(.tw-justify-stretch) {\n justify-content:\n stretch;\n}\n\n.squid-style-container :is(.tw-gap-0) {\n gap:\n 0px;\n}\n\n.squid-style-container :is(.tw-gap-0\\.5) {\n gap:\n 0.125rem;\n}\n\n.squid-style-container :is(.tw-gap-1) {\n gap:\n 0.25rem;\n}\n\n.squid-style-container :is(.tw-gap-1\\.5) {\n gap:\n 0.375rem;\n}\n\n.squid-style-container :is(.tw-gap-2) {\n gap:\n 0.5rem;\n}\n\n.squid-style-container :is(.tw-gap-2\\.5) {\n gap:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-gap-3) {\n gap:\n 0.75rem;\n}\n\n.squid-style-container :is(.tw-gap-4) {\n gap:\n 1rem;\n}\n\n.squid-style-container :is(.tw-gap-5) {\n gap:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-gap-\\[1px\\]) {\n gap:\n 1px;\n}\n\n.squid-style-container :is(.tw-gap-\\[2px\\]) {\n gap:\n 2px;\n}\n\n.squid-style-container :is(.tw-gap-\\[3px\\]) {\n gap:\n 3px;\n}\n\n.squid-style-container :is(.tw-gap-\\[5px\\]) {\n gap:\n 5px;\n}\n\n.squid-style-container :is(.tw-gap-squid-m) {\n gap:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-gap-squid-s) {\n gap:\n 0.9375rem;\n}\n\n.squid-style-container :is(.tw-gap-squid-xs) {\n gap:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-gap-squid-xxs) {\n gap:\n 0.3125rem;\n}\n\n.squid-style-container :is(.tw-gap-x-squid-xs) {\n -moz-column-gap:\n 0.625rem;\n column-gap:\n 0.625rem;\n}\n\n.squid-style-container :is(.-tw-space-x-4 > :not([hidden]) ~ :not([hidden])) {\n --tw-space-x-reverse:\n 0;\n margin-right:\n calc(-1rem * var(--tw-space-x-reverse));\n margin-left:\n calc(-1rem * calc(1 - var(--tw-space-x-reverse)));\n}\n\n.squid-style-container :is(.-tw-space-x-\\[18px\\] > :not([hidden]) ~ :not([hidden])) {\n --tw-space-x-reverse:\n 0;\n margin-right:\n calc(-18px * var(--tw-space-x-reverse));\n margin-left:\n calc(-18px * calc(1 - var(--tw-space-x-reverse)));\n}\n\n.squid-style-container :is(.-tw-space-x-squid-m > :not([hidden]) ~ :not([hidden])) {\n --tw-space-x-reverse:\n 0;\n margin-right:\n calc(-1.25rem * var(--tw-space-x-reverse));\n margin-left:\n calc(-1.25rem * calc(1 - var(--tw-space-x-reverse)));\n}\n\n.squid-style-container :is(.tw-space-x-\\[--image-stack-spacing\\] > :not([hidden]) ~ :not([hidden])) {\n --tw-space-x-reverse:\n 0;\n margin-right:\n calc(var(--image-stack-spacing) * var(--tw-space-x-reverse));\n margin-left:\n calc(var(--image-stack-spacing) * calc(1 - var(--tw-space-x-reverse)));\n}\n\n.squid-style-container :is(.tw-divide-y > :not([hidden]) ~ :not([hidden])) {\n --tw-divide-y-reverse:\n 0;\n border-top-width:\n calc(1px * calc(1 - var(--tw-divide-y-reverse)));\n border-bottom-width:\n calc(1px * var(--tw-divide-y-reverse));\n}\n\n.squid-style-container :is(.tw-divide-material-light-thin > :not([hidden]) ~ :not([hidden])) {\n border-color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.tw-self-end) {\n align-self:\n flex-end;\n}\n\n.squid-style-container :is(.tw-self-center) {\n align-self:\n center;\n}\n\n.squid-style-container :is(.tw-self-stretch) {\n align-self:\n stretch;\n}\n\n.squid-style-container :is(.tw-overflow-auto) {\n overflow:\n auto;\n}\n\n.squid-style-container :is(.tw-overflow-hidden) {\n overflow:\n hidden;\n}\n\n.squid-style-container :is(.tw-overflow-y-auto) {\n overflow-y:\n auto;\n}\n\n.squid-style-container :is(.tw-overflow-x-hidden) {\n overflow-x:\n hidden;\n}\n\n.squid-style-container :is(.tw-truncate) {\n overflow:\n hidden;\n text-overflow:\n ellipsis;\n white-space:\n nowrap;\n}\n\n.squid-style-container :is(.tw-whitespace-nowrap) {\n white-space:\n nowrap;\n}\n\n.squid-style-container :is(.tw-text-nowrap) {\n text-wrap:\n nowrap;\n}\n\n.squid-style-container :is(.tw-text-balance) {\n text-wrap:\n balance;\n}\n\n.squid-style-container :is(.\\!tw-rounded-input) {\n border-radius:\n var(--st-border-radius-input) !important;\n}\n\n.squid-style-container :is(.\\!tw-rounded-lg) {\n border-radius:\n 0.5rem !important;\n}\n\n.squid-style-container :is(.\\!tw-rounded-squid-m) {\n border-radius:\n 1.25rem !important;\n}\n\n.squid-style-container :is(.tw-rounded) {\n border-radius:\n 0.25rem;\n}\n\n.squid-style-container :is(.tw-rounded-2xl) {\n border-radius:\n 1rem;\n}\n\n.squid-style-container :is(.tw-rounded-3xl) {\n border-radius:\n 1.5rem;\n}\n\n.squid-style-container :is(.tw-rounded-\\[1px\\]) {\n border-radius:\n 1px;\n}\n\n.squid-style-container :is(.tw-rounded-\\[20px\\]) {\n border-radius:\n 20px;\n}\n\n.squid-style-container :is(.tw-rounded-\\[25px\\]) {\n border-radius:\n 25px;\n}\n\n.squid-style-container :is(.tw-rounded-button-lg-primary) {\n border-radius:\n var(--st-border-radius-button-lg-primary);\n}\n\n.squid-style-container :is(.tw-rounded-button-lg-secondary) {\n border-radius:\n var(--st-border-radius-button-lg-secondary);\n}\n\n.squid-style-container :is(.tw-rounded-button-lg-tertiary) {\n border-radius:\n var(--st-border-radius-button-lg-tertiary);\n}\n\n.squid-style-container :is(.tw-rounded-button-md-primary) {\n border-radius:\n var(--st-border-radius-button-md-primary);\n}\n\n.squid-style-container :is(.tw-rounded-button-md-secondary) {\n border-radius:\n var(--st-border-radius-button-md-secondary);\n}\n\n.squid-style-container :is(.tw-rounded-button-md-tertiary) {\n border-radius:\n var(--st-border-radius-button-md-tertiary);\n}\n\n.squid-style-container :is(.tw-rounded-button-sm-primary) {\n border-radius:\n var(--st-border-radius-button-sm-primary);\n}\n\n.squid-style-container :is(.tw-rounded-button-sm-secondary) {\n border-radius:\n var(--st-border-radius-button-sm-secondary);\n}\n\n.squid-style-container :is(.tw-rounded-button-sm-tertiary) {\n border-radius:\n var(--st-border-radius-button-sm-tertiary);\n}\n\n.squid-style-container :is(.tw-rounded-full) {\n border-radius:\n 9999px;\n}\n\n.squid-style-container :is(.tw-rounded-input) {\n border-radius:\n var(--st-border-radius-input);\n}\n\n.squid-style-container :is(.tw-rounded-lg) {\n border-radius:\n 0.5rem;\n}\n\n.squid-style-container :is(.tw-rounded-md) {\n border-radius:\n 0.375rem;\n}\n\n.squid-style-container :is(.tw-rounded-menu-lg) {\n border-radius:\n var(--st-border-radius-menu-lg);\n}\n\n.squid-style-container :is(.tw-rounded-menu-sm) {\n border-radius:\n var(--st-border-radius-menu-sm);\n}\n\n.squid-style-container :is(.tw-rounded-modal) {\n border-radius:\n var(--st-border-radius-modal);\n}\n\n.squid-style-container :is(.tw-rounded-none) {\n border-radius:\n 0px;\n}\n\n.squid-style-container :is(.tw-rounded-sm) {\n border-radius:\n 0.125rem;\n}\n\n.squid-style-container :is(.tw-rounded-squid-l) {\n border-radius:\n 1.875rem;\n}\n\n.squid-style-container :is(.tw-rounded-squid-m) {\n border-radius:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-rounded-squid-s) {\n border-radius:\n 0.9375rem;\n}\n\n.squid-style-container :is(.tw-rounded-squid-xl) {\n border-radius:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-rounded-squid-xs) {\n border-radius:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-rounded-squid-xxl) {\n border-radius:\n 3.75rem;\n}\n\n.squid-style-container :is(.tw-rounded-squid-xxs) {\n border-radius:\n 0.3125rem;\n}\n\n.squid-style-container :is(.tw-rounded-xl) {\n border-radius:\n 0.75rem;\n}\n\n.squid-style-container :is(.tw-rounded-bl-full) {\n border-bottom-left-radius:\n 9999px;\n}\n\n.squid-style-container :is(.tw-rounded-br-full) {\n border-bottom-right-radius:\n 9999px;\n}\n\n.squid-style-container :is(.tw-rounded-tl-full) {\n border-top-left-radius:\n 9999px;\n}\n\n.squid-style-container :is(.tw-rounded-tl-modal) {\n border-top-left-radius:\n var(--st-border-radius-modal);\n}\n\n.squid-style-container :is(.tw-rounded-tr-full) {\n border-top-right-radius:\n 9999px;\n}\n\n.squid-style-container :is(.tw-rounded-tr-modal) {\n border-top-right-radius:\n var(--st-border-radius-modal);\n}\n\n.squid-style-container :is(.tw-border) {\n border-width:\n 1px;\n}\n\n.squid-style-container :is(.tw-border-0) {\n border-width:\n 0px;\n}\n\n.squid-style-container :is(.tw-border-2) {\n border-width:\n 2px;\n}\n\n.squid-style-container :is(.tw-border-y) {\n border-top-width:\n 1px;\n border-bottom-width:\n 1px;\n}\n\n.squid-style-container :is(.tw-border-b) {\n border-bottom-width:\n 1px;\n}\n\n.squid-style-container :is(.tw-border-l-0) {\n border-left-width:\n 0px;\n}\n\n.squid-style-container :is(.tw-border-t) {\n border-top-width:\n 1px;\n}\n\n.squid-style-container :is(.tw-border-t-0) {\n border-top-width:\n 0px;\n}\n\n.squid-style-container :is(.tw-border-t-\\[4px\\]) {\n border-top-width:\n 4px;\n}\n\n.squid-style-container :is(.tw-border-solid) {\n border-style:\n solid;\n}\n\n.squid-style-container :is(.\\!tw-border-transparent) {\n border-color:\n transparent !important;\n}\n\n.squid-style-container :is(.tw-border-grey-500) {\n border-color:\n var(--st-color-grey-500);\n}\n\n.squid-style-container :is(.tw-border-grey-800) {\n border-color:\n var(--st-color-grey-800);\n}\n\n.squid-style-container :is(.tw-border-grey-900) {\n border-color:\n var(--st-color-grey-900);\n}\n\n.squid-style-container :is(.tw-border-material-dark-average) {\n border-color:\n var(--st-color-material-dark-average);\n}\n\n.squid-style-container :is(.tw-border-material-light-thin) {\n border-color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.tw-border-transparent) {\n border-color:\n transparent;\n}\n\n.squid-style-container :is(.tw-border-white) {\n --tw-border-opacity:\n 1;\n border-color:\n rgb(255 255 255 / var(--tw-border-opacity));\n}\n\n.squid-style-container :is(.tw-border-y-material-light-thin) {\n border-top-color:\n var(--st-color-material-light-thin);\n border-bottom-color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.tw-border-b-material-dark-thin) {\n border-bottom-color:\n var(--st-color-material-dark-thin);\n}\n\n.squid-style-container :is(.tw-border-t-material-light-thin) {\n border-top-color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.\\!tw-bg-grey-300) {\n background-color:\n var(--st-color-grey-300) !important;\n}\n\n.squid-style-container :is(.\\!tw-bg-grey-500) {\n background-color:\n var(--st-color-grey-500) !important;\n}\n\n.squid-style-container :is(.\\!tw-bg-grey-600) {\n background-color:\n var(--st-color-grey-600) !important;\n}\n\n.squid-style-container :is(.\\!tw-bg-grey-800) {\n background-color:\n var(--st-color-grey-800) !important;\n}\n\n.squid-style-container :is(.\\!tw-bg-grey-900) {\n background-color:\n var(--st-color-grey-900) !important;\n}\n\n.squid-style-container :is(.\\!tw-bg-material-light-thick) {\n background-color:\n var(--st-color-material-light-thick) !important;\n}\n\n.squid-style-container :is(.\\!tw-bg-royal-500) {\n background-color:\n var(--st-color-royal-500) !important;\n}\n\n.squid-style-container :is(.\\!tw-bg-status-negative) {\n background-color:\n var(--st-color-status-negative) !important;\n}\n\n.squid-style-container :is(.\\!tw-bg-status-partial) {\n background-color:\n var(--st-color-status-partial) !important;\n}\n\n.squid-style-container :is(.\\!tw-bg-status-positive) {\n background-color:\n var(--st-color-status-positive) !important;\n}\n\n.squid-style-container :is(.\\!tw-bg-transparent) {\n background-color:\n transparent !important;\n}\n\n.squid-style-container :is(.tw-bg-\\[currentColor\\]) {\n background-color:\n currentColor;\n}\n\n.squid-style-container :is(.tw-bg-animation-bg) {\n background-color:\n var(--st-color-animation-bg);\n}\n\n.squid-style-container :is(.tw-bg-button-lg-primary-bg) {\n background-color:\n var(--st-color-button-lg-primary-bg);\n}\n\n.squid-style-container :is(.tw-bg-button-lg-secondary-bg) {\n background-color:\n var(--st-color-button-lg-secondary-bg);\n}\n\n.squid-style-container :is(.tw-bg-button-lg-tertiary-bg) {\n background-color:\n var(--st-color-button-lg-tertiary-bg);\n}\n\n.squid-style-container :is(.tw-bg-button-md-primary-bg) {\n background-color:\n var(--st-color-button-md-primary-bg);\n}\n\n.squid-style-container :is(.tw-bg-button-md-secondary-bg) {\n background-color:\n var(--st-color-button-md-secondary-bg);\n}\n\n.squid-style-container :is(.tw-bg-button-md-tertiary-bg) {\n background-color:\n var(--st-color-button-md-tertiary-bg);\n}\n\n.squid-style-container :is(.tw-bg-button-sm-primary-bg) {\n background-color:\n var(--st-color-button-sm-primary-bg);\n}\n\n.squid-style-container :is(.tw-bg-button-sm-secondary-bg) {\n background-color:\n var(--st-color-button-sm-secondary-bg);\n}\n\n.squid-style-container :is(.tw-bg-button-sm-tertiary-bg) {\n background-color:\n var(--st-color-button-sm-tertiary-bg);\n}\n\n.squid-style-container :is(.tw-bg-current) {\n background-color:\n currentColor;\n}\n\n.squid-style-container :is(.tw-bg-grey-100) {\n background-color:\n var(--st-color-grey-100);\n}\n\n.squid-style-container :is(.tw-bg-grey-300) {\n background-color:\n var(--st-color-grey-300);\n}\n\n.squid-style-container :is(.tw-bg-grey-500) {\n background-color:\n var(--st-color-grey-500);\n}\n\n.squid-style-container :is(.tw-bg-grey-600) {\n background-color:\n var(--st-color-grey-600);\n}\n\n.squid-style-container :is(.tw-bg-grey-700) {\n background-color:\n var(--st-color-grey-700);\n}\n\n.squid-style-container :is(.tw-bg-grey-800) {\n background-color:\n var(--st-color-grey-800);\n}\n\n.squid-style-container :is(.tw-bg-grey-900) {\n background-color:\n var(--st-color-grey-900);\n}\n\n.squid-style-container :is(.tw-bg-highlight-700) {\n background-color:\n var(--st-color-highlight-700);\n}\n\n.squid-style-container :is(.tw-bg-input-bg) {\n background-color:\n var(--st-color-input-bg);\n}\n\n.squid-style-container :is(.tw-bg-material-dark-average) {\n background-color:\n var(--st-color-material-dark-average);\n}\n\n.squid-style-container :is(.tw-bg-material-dark-thick) {\n background-color:\n var(--st-color-material-dark-thick);\n}\n\n.squid-style-container :is(.tw-bg-material-dark-thin) {\n background-color:\n var(--st-color-material-dark-thin);\n}\n\n.squid-style-container :is(.tw-bg-material-light-average) {\n background-color:\n var(--st-color-material-light-average);\n}\n\n.squid-style-container :is(.tw-bg-material-light-thin) {\n background-color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.tw-bg-menu-backdrop) {\n background-color:\n var(--st-color-menu-backdrop);\n}\n\n.squid-style-container :is(.tw-bg-menu-bg) {\n background-color:\n var(--st-color-menu-bg);\n}\n\n.squid-style-container :is(.tw-bg-royal-400) {\n background-color:\n var(--st-color-royal-400);\n}\n\n.squid-style-container :is(.tw-bg-royal-500) {\n background-color:\n var(--st-color-royal-500);\n}\n\n.squid-style-container :is(.tw-bg-status-negative) {\n background-color:\n var(--st-color-status-negative);\n}\n\n.squid-style-container :is(.tw-bg-status-partial) {\n background-color:\n var(--st-color-status-partial);\n}\n\n.squid-style-container :is(.tw-bg-status-positive) {\n background-color:\n var(--st-color-status-positive);\n}\n\n.squid-style-container :is(.tw-bg-transparent) {\n background-color:\n transparent;\n}\n\n.squid-style-container :is(.tw-bg-cta-button-light) {\n background-image:\n linear-gradient(0deg, color(display-p3 1 1 1 / 0.00) 0%, color(display-p3 1 1 1 / 0.05) 66%, color(display-p3 1 1 1 / 0.10) 100%);\n}\n\n.squid-style-container :is(.tw-bg-dark-cover) {\n background-image:\n linear-gradient(90deg, var(--st-color-material-dark-thick) 45.4%, transparent 50.85%, var(--st-color-material-dark-thick) 55.61%);\n}\n\n.squid-style-container :is(.tw-bg-gradient-to-b) {\n background-image:\n linear-gradient(to bottom, var(--tw-gradient-stops));\n}\n\n.squid-style-container :is(.tw-bg-gradient-to-t) {\n background-image:\n linear-gradient(to top, var(--tw-gradient-stops));\n}\n\n.squid-style-container :is(.tw-bg-shimmer) {\n background-image:\n linear-gradient(90deg, currentColor 0%, currentColor 50%, rgba(251, 251, 253, 0.4) 57.5%, currentColor 65%, currentColor 100%);\n}\n\n.squid-style-container :is(.tw-bg-shimmer-dark) {\n background-image:\n linear-gradient(90deg, color-mix(in srgb, var(--st-color-grey-900) 40%, transparent) 0%, var(--st-color-grey-900) 10%, color-mix(in srgb, var(--st-color-grey-900) 40%, transparent) 60%);\n}\n\n.squid-style-container :is(.tw-bg-shimmer-light) {\n background-image:\n linear-gradient(90deg, color-mix(in srgb, var(--st-color-grey-100) 40%, transparent) 0%, var(--st-color-grey-100) 10%, color-mix(in srgb, var(--st-color-grey-100) 40%, transparent) 60%);\n}\n\n.squid-style-container :is(.tw-bg-shimmer-overlay-light) {\n background-image:\n linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.7) 50%, transparent 100%);\n}\n\n.squid-style-container :is(.tw-from-current) {\n --tw-gradient-from:\n currentColor var(--tw-gradient-from-position);\n --tw-gradient-to:\n rgb(255 255 255 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops:\n var(--tw-gradient-from), var(--tw-gradient-to);\n}\n\n.squid-style-container :is(.tw-from-grey-500) {\n --tw-gradient-from:\n var(--st-color-grey-500) var(--tw-gradient-from-position);\n --tw-gradient-to:\n rgb(255 255 255 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops:\n var(--tw-gradient-from), var(--tw-gradient-to);\n}\n\n.squid-style-container :is(.tw-from-grey-700) {\n --tw-gradient-from:\n var(--st-color-grey-700) var(--tw-gradient-from-position);\n --tw-gradient-to:\n rgb(255 255 255 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops:\n var(--tw-gradient-from), var(--tw-gradient-to);\n}\n\n.squid-style-container :is(.tw-from-grey-800) {\n --tw-gradient-from:\n var(--st-color-grey-800) var(--tw-gradient-from-position);\n --tw-gradient-to:\n rgb(255 255 255 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops:\n var(--tw-gradient-from), var(--tw-gradient-to);\n}\n\n.squid-style-container :is(.tw-to-grey-800) {\n --tw-gradient-to:\n var(--st-color-grey-800) var(--tw-gradient-to-position);\n}\n\n.squid-style-container :is(.tw-to-grey-900) {\n --tw-gradient-to:\n var(--st-color-grey-900) var(--tw-gradient-to-position);\n}\n\n.squid-style-container :is(.tw-bg-\\[length\\:200\\%_100\\%\\]) {\n background-size:\n 200% 100%;\n}\n\n.squid-style-container :is(.tw-bg-clip-text) {\n -webkit-background-clip:\n text;\n background-clip:\n text;\n}\n\n.squid-style-container :is(.tw-fill-current) {\n fill:\n currentColor;\n}\n\n.squid-style-container :is(.tw-fill-grey-300) {\n fill:\n var(--st-color-grey-300);\n}\n\n.squid-style-container :is(.tw-stroke-grey-100) {\n stroke:\n var(--st-color-grey-100);\n}\n\n.squid-style-container :is(.tw-stroke-grey-300) {\n stroke:\n var(--st-color-grey-300);\n}\n\n.squid-style-container :is(.tw-stroke-grey-900) {\n stroke:\n var(--st-color-grey-900);\n}\n\n.squid-style-container :is(.tw-object-contain) {\n -o-object-fit:\n contain;\n object-fit:\n contain;\n}\n\n.squid-style-container :is(.tw-object-cover) {\n -o-object-fit:\n cover;\n object-fit:\n cover;\n}\n\n.squid-style-container :is(.\\!tw-p-0) {\n padding:\n 0px !important;\n}\n\n.squid-style-container :is(.\\!tw-p-3) {\n padding:\n 0.75rem !important;\n}\n\n.squid-style-container :is(.tw-p-0) {\n padding:\n 0px;\n}\n\n.squid-style-container :is(.tw-p-0\\.5) {\n padding:\n 0.125rem;\n}\n\n.squid-style-container :is(.tw-p-1) {\n padding:\n 0.25rem;\n}\n\n.squid-style-container :is(.tw-p-2) {\n padding:\n 0.5rem;\n}\n\n.squid-style-container :is(.tw-p-\\[3px\\]) {\n padding:\n 3px;\n}\n\n.squid-style-container :is(.tw-p-squid-m) {\n padding:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-p-squid-xs) {\n padding:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-p-squid-xxs) {\n padding:\n 0.3125rem;\n}\n\n.squid-style-container :is(.\\!tw-px-4) {\n padding-left:\n 1rem !important;\n padding-right:\n 1rem !important;\n}\n\n.squid-style-container :is(.\\!tw-py-0) {\n padding-top:\n 0px !important;\n padding-bottom:\n 0px !important;\n}\n\n.squid-style-container :is(.tw-px-0) {\n padding-left:\n 0px;\n padding-right:\n 0px;\n}\n\n.squid-style-container :is(.tw-px-0\\.5) {\n padding-left:\n 0.125rem;\n padding-right:\n 0.125rem;\n}\n\n.squid-style-container :is(.tw-px-1) {\n padding-left:\n 0.25rem;\n padding-right:\n 0.25rem;\n}\n\n.squid-style-container :is(.tw-px-2) {\n padding-left:\n 0.5rem;\n padding-right:\n 0.5rem;\n}\n\n.squid-style-container :is(.tw-px-2\\.5) {\n padding-left:\n 0.625rem;\n padding-right:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-px-3) {\n padding-left:\n 0.75rem;\n padding-right:\n 0.75rem;\n}\n\n.squid-style-container :is(.tw-px-4) {\n padding-left:\n 1rem;\n padding-right:\n 1rem;\n}\n\n.squid-style-container :is(.tw-px-5) {\n padding-left:\n 1.25rem;\n padding-right:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-px-\\[3px\\]) {\n padding-left:\n 3px;\n padding-right:\n 3px;\n}\n\n.squid-style-container :is(.tw-px-squid-l) {\n padding-left:\n 1.875rem;\n padding-right:\n 1.875rem;\n}\n\n.squid-style-container :is(.tw-px-squid-m) {\n padding-left:\n 1.25rem;\n padding-right:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-px-squid-s) {\n padding-left:\n 0.9375rem;\n padding-right:\n 0.9375rem;\n}\n\n.squid-style-container :is(.tw-px-squid-xs) {\n padding-left:\n 0.625rem;\n padding-right:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-px-squid-xxs) {\n padding-left:\n 0.3125rem;\n padding-right:\n 0.3125rem;\n}\n\n.squid-style-container :is(.tw-py-0) {\n padding-top:\n 0px;\n padding-bottom:\n 0px;\n}\n\n.squid-style-container :is(.tw-py-0\\.5) {\n padding-top:\n 0.125rem;\n padding-bottom:\n 0.125rem;\n}\n\n.squid-style-container :is(.tw-py-1) {\n padding-top:\n 0.25rem;\n padding-bottom:\n 0.25rem;\n}\n\n.squid-style-container :is(.tw-py-1\\.5) {\n padding-top:\n 0.375rem;\n padding-bottom:\n 0.375rem;\n}\n\n.squid-style-container :is(.tw-py-2) {\n padding-top:\n 0.5rem;\n padding-bottom:\n 0.5rem;\n}\n\n.squid-style-container :is(.tw-py-2\\.5) {\n padding-top:\n 0.625rem;\n padding-bottom:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-py-3) {\n padding-top:\n 0.75rem;\n padding-bottom:\n 0.75rem;\n}\n\n.squid-style-container :is(.tw-py-5) {\n padding-top:\n 1.25rem;\n padding-bottom:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-py-\\[1px\\]) {\n padding-top:\n 1px;\n padding-bottom:\n 1px;\n}\n\n.squid-style-container :is(.tw-py-\\[5px\\]) {\n padding-top:\n 5px;\n padding-bottom:\n 5px;\n}\n\n.squid-style-container :is(.tw-py-squid-m) {\n padding-top:\n 1.25rem;\n padding-bottom:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-py-squid-s) {\n padding-top:\n 0.9375rem;\n padding-bottom:\n 0.9375rem;\n}\n\n.squid-style-container :is(.tw-py-squid-xl) {\n padding-top:\n 2.5rem;\n padding-bottom:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-py-squid-xs) {\n padding-top:\n 0.625rem;\n padding-bottom:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-py-squid-xxs) {\n padding-top:\n 0.3125rem;\n padding-bottom:\n 0.3125rem;\n}\n\n.squid-style-container :is(.\\!tw-pt-0) {\n padding-top:\n 0px !important;\n}\n\n.squid-style-container :is(.tw-pb-3) {\n padding-bottom:\n 0.75rem;\n}\n\n.squid-style-container :is(.tw-pb-4) {\n padding-bottom:\n 1rem;\n}\n\n.squid-style-container :is(.tw-pb-8) {\n padding-bottom:\n 2rem;\n}\n\n.squid-style-container :is(.tw-pb-squid-l) {\n padding-bottom:\n 1.875rem;\n}\n\n.squid-style-container :is(.tw-pb-squid-m) {\n padding-bottom:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-pb-squid-s) {\n padding-bottom:\n 0.9375rem;\n}\n\n.squid-style-container :is(.tw-pb-squid-xs) {\n padding-bottom:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-pb-squid-xxs) {\n padding-bottom:\n 0.3125rem;\n}\n\n.squid-style-container :is(.tw-pl-1) {\n padding-left:\n 0.25rem;\n}\n\n.squid-style-container :is(.tw-pl-2) {\n padding-left:\n 0.5rem;\n}\n\n.squid-style-container :is(.tw-pl-7) {\n padding-left:\n 1.75rem;\n}\n\n.squid-style-container :is(.tw-pl-\\[40px\\]) {\n padding-left:\n 40px;\n}\n\n.squid-style-container :is(.tw-pl-\\[60px\\]) {\n padding-left:\n 60px;\n}\n\n.squid-style-container :is(.tw-pl-\\[7px\\]) {\n padding-left:\n 7px;\n}\n\n.squid-style-container :is(.tw-pl-squid-l) {\n padding-left:\n 1.875rem;\n}\n\n.squid-style-container :is(.tw-pl-squid-m) {\n padding-left:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-pl-squid-xs) {\n padding-left:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-pl-squid-xxs) {\n padding-left:\n 0.3125rem;\n}\n\n.squid-style-container :is(.tw-pr-1) {\n padding-right:\n 0.25rem;\n}\n\n.squid-style-container :is(.tw-pr-2) {\n padding-right:\n 0.5rem;\n}\n\n.squid-style-container :is(.tw-pr-2\\.5) {\n padding-right:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-pr-4) {\n padding-right:\n 1rem;\n}\n\n.squid-style-container :is(.tw-pr-\\[30px\\]) {\n padding-right:\n 30px;\n}\n\n.squid-style-container :is(.tw-pr-\\[40px\\]) {\n padding-right:\n 40px;\n}\n\n.squid-style-container :is(.tw-pr-\\[70px\\]) {\n padding-right:\n 70px;\n}\n\n.squid-style-container :is(.tw-pr-squid-m) {\n padding-right:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-pr-squid-xl) {\n padding-right:\n 2.5rem;\n}\n\n.squid-style-container :is(.tw-pr-squid-xs) {\n padding-right:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-pt-1) {\n padding-top:\n 0.25rem;\n}\n\n.squid-style-container :is(.tw-pt-2) {\n padding-top:\n 0.5rem;\n}\n\n.squid-style-container :is(.tw-pt-3) {\n padding-top:\n 0.75rem;\n}\n\n.squid-style-container :is(.tw-pt-\\[1px\\]) {\n padding-top:\n 1px;\n}\n\n.squid-style-container :is(.tw-pt-squid-m) {\n padding-top:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-pt-squid-xs) {\n padding-top:\n 0.625rem;\n}\n\n.squid-style-container :is(.tw-pt-squid-xxs) {\n padding-top:\n 0.3125rem;\n}\n\n.squid-style-container :is(.tw-text-left) {\n text-align:\n left;\n}\n\n.squid-style-container :is(.tw-text-center) {\n text-align:\n center;\n}\n\n.squid-style-container :is(.tw-text-right) {\n text-align:\n right;\n}\n\n.squid-style-container :is(.tw-font-squid-main) {\n font-family:\n var(--st-font-family-squid-main);\n}\n\n.squid-style-container :is(.tw-text-2xl) {\n font-size:\n 1.5rem;\n line-height:\n 2rem;\n}\n\n.squid-style-container :is(.tw-text-5xl) {\n font-size:\n 3rem;\n line-height:\n 1;\n}\n\n.squid-style-container :is(.tw-text-\\[4\\.40625rem\\]) {\n font-size:\n 4.40625rem;\n}\n\n.squid-style-container :is(.tw-text-base) {\n font-size:\n 1rem;\n line-height:\n 1.5rem;\n}\n\n.squid-style-container :is(.tw-text-body-large) {\n font-size:\n var(--st-font-size-body-large);\n}\n\n.squid-style-container :is(.tw-text-body-medium) {\n font-size:\n var(--st-font-size-body-medium);\n}\n\n.squid-style-container :is(.tw-text-body-small) {\n font-size:\n var(--st-font-size-body-small);\n}\n\n.squid-style-container :is(.tw-text-caption) {\n font-size:\n var(--st-font-size-caption);\n}\n\n.squid-style-container :is(.tw-text-heading-large) {\n font-size:\n var(--st-font-size-heading-large);\n}\n\n.squid-style-container :is(.tw-text-heading-medium) {\n font-size:\n var(--st-font-size-heading-medium);\n}\n\n.squid-style-container :is(.tw-text-heading-small) {\n font-size:\n var(--st-font-size-heading-small);\n}\n\n.squid-style-container :is(.tw-text-lg) {\n font-size:\n 1.125rem;\n line-height:\n 1.75rem;\n}\n\n.squid-style-container :is(.tw-text-sm) {\n font-size:\n 0.875rem;\n line-height:\n 1.25rem;\n}\n\n.squid-style-container :is(.tw-text-xs) {\n font-size:\n 0.75rem;\n line-height:\n 1rem;\n}\n\n.squid-style-container :is(.\\!tw-font-bold) {\n font-weight:\n 700 !important;\n}\n\n.squid-style-container :is(.\\!tw-font-medium) {\n font-weight:\n 500 !important;\n}\n\n.squid-style-container :is(.tw-font-body-large) {\n font-weight:\n var(--st-font-weight-body-large);\n}\n\n.squid-style-container :is(.tw-font-body-medium) {\n font-weight:\n var(--st-font-weight-body-medium);\n}\n\n.squid-style-container :is(.tw-font-body-small) {\n font-weight:\n var(--st-font-weight-body-small);\n}\n\n.squid-style-container :is(.tw-font-caption) {\n font-weight:\n var(--st-font-weight-caption);\n}\n\n.squid-style-container :is(.tw-font-heading-large) {\n font-weight:\n var(--st-font-weight-heading-large);\n}\n\n.squid-style-container :is(.tw-font-heading-medium) {\n font-weight:\n var(--st-font-weight-heading-medium);\n}\n\n.squid-style-container :is(.tw-font-heading-small) {\n font-weight:\n var(--st-font-weight-heading-small);\n}\n\n.squid-style-container :is(.tw-font-medium) {\n font-weight:\n 500;\n}\n\n.squid-style-container :is(.tw-normal-case) {\n text-transform:\n none;\n}\n\n.squid-style-container :is(.\\!tw-leading-\\[10px\\]) {\n line-height:\n 10px !important;\n}\n\n.squid-style-container :is(.\\!tw-leading-\\[13px\\]) {\n line-height:\n 13px !important;\n}\n\n.squid-style-container :is(.\\!tw-leading-\\[16px\\]) {\n line-height:\n 16px !important;\n}\n\n.squid-style-container :is(.\\!tw-leading-\\[17px\\]) {\n line-height:\n 17px !important;\n}\n\n.squid-style-container :is(.\\!tw-leading-\\[18px\\]) {\n line-height:\n 18px !important;\n}\n\n.squid-style-container :is(.\\!tw-leading-\\[1\\]) {\n line-height:\n 1 !important;\n}\n\n.squid-style-container :is(.\\!tw-leading-\\[25px\\]) {\n line-height:\n 25px !important;\n}\n\n.squid-style-container :is(.\\!tw-leading-\\[9px\\]) {\n line-height:\n 9px !important;\n}\n\n.squid-style-container :is(.tw-leading-3) {\n line-height:\n .75rem;\n}\n\n.squid-style-container :is(.tw-leading-6) {\n line-height:\n 1.5rem;\n}\n\n.squid-style-container :is(.tw-leading-\\[0\\.7\\]) {\n line-height:\n 0.7;\n}\n\n.squid-style-container :is(.tw-leading-\\[0\\]) {\n line-height:\n 0;\n}\n\n.squid-style-container :is(.tw-leading-\\[10px\\]) {\n line-height:\n 10px;\n}\n\n.squid-style-container :is(.tw-leading-\\[13px\\]) {\n line-height:\n 13px;\n}\n\n.squid-style-container :is(.tw-leading-\\[1\\]) {\n line-height:\n 1;\n}\n\n.squid-style-container :is(.tw-leading-\\[inherit\\]) {\n line-height:\n inherit;\n}\n\n.squid-style-container :is(.tw-leading-body-large) {\n line-height:\n 39.34px;\n}\n\n.squid-style-container :is(.tw-leading-body-medium) {\n line-height:\n 31.5px;\n}\n\n.squid-style-container :is(.tw-leading-body-small) {\n line-height:\n 25.62px;\n}\n\n.squid-style-container :is(.tw-leading-caption) {\n line-height:\n 19.6px;\n}\n\n.squid-style-container :is(.tw-leading-heading-large) {\n line-height:\n 66.97px;\n}\n\n.squid-style-container :is(.tw-leading-heading-medium) {\n line-height:\n 49.3px;\n}\n\n.squid-style-container :is(.tw-leading-heading-small) {\n line-height:\n 38.5px;\n}\n\n.squid-style-container :is(.tw-tracking-body-large) {\n letter-spacing:\n -0.843px;\n}\n\n.squid-style-container :is(.tw-tracking-body-medium) {\n letter-spacing:\n -0.675px;\n}\n\n.squid-style-container :is(.tw-tracking-body-small) {\n letter-spacing:\n -0.366px;\n}\n\n.squid-style-container :is(.tw-tracking-heading-large) {\n letter-spacing:\n -3.525px;\n}\n\n.squid-style-container :is(.tw-tracking-heading-medium) {\n letter-spacing:\n -2.465px;\n}\n\n.squid-style-container :is(.tw-tracking-heading-small) {\n letter-spacing:\n -1.05px;\n}\n\n.squid-style-container :is(.\\!tw-text-\\[transparent\\]) {\n color:\n transparent !important;\n}\n\n.squid-style-container :is(.\\!tw-text-grey-500) {\n color:\n var(--st-color-grey-500) !important;\n}\n\n.squid-style-container :is(.\\!tw-text-grey-600) {\n color:\n var(--st-color-grey-600) !important;\n}\n\n.squid-style-container :is(.\\!tw-text-grey-800) {\n color:\n var(--st-color-grey-800) !important;\n}\n\n.squid-style-container :is(.\\!tw-text-grey-900) {\n color:\n var(--st-color-grey-900) !important;\n}\n\n.squid-style-container :is(.\\!tw-text-material-light-thick) {\n color:\n var(--st-color-material-light-thick) !important;\n}\n\n.squid-style-container :is(.tw-text-button-lg-primary-text) {\n color:\n var(--st-color-button-lg-primary-text);\n}\n\n.squid-style-container :is(.tw-text-button-lg-secondary-text) {\n color:\n var(--st-color-button-lg-secondary-text);\n}\n\n.squid-style-container :is(.tw-text-button-lg-tertiary-text) {\n color:\n var(--st-color-button-lg-tertiary-text);\n}\n\n.squid-style-container :is(.tw-text-button-md-primary-text) {\n color:\n var(--st-color-button-md-primary-text);\n}\n\n.squid-style-container :is(.tw-text-button-md-secondary-text) {\n color:\n var(--st-color-button-md-secondary-text);\n}\n\n.squid-style-container :is(.tw-text-button-md-tertiary-text) {\n color:\n var(--st-color-button-md-tertiary-text);\n}\n\n.squid-style-container :is(.tw-text-button-sm-primary-text) {\n color:\n var(--st-color-button-sm-primary-text);\n}\n\n.squid-style-container :is(.tw-text-button-sm-secondary-text) {\n color:\n var(--st-color-button-sm-secondary-text);\n}\n\n.squid-style-container :is(.tw-text-button-sm-tertiary-text) {\n color:\n var(--st-color-button-sm-tertiary-text);\n}\n\n.squid-style-container :is(.tw-text-grey-100) {\n color:\n var(--st-color-grey-100);\n}\n\n.squid-style-container :is(.tw-text-grey-200) {\n color:\n var(--st-color-grey-200);\n}\n\n.squid-style-container :is(.tw-text-grey-300) {\n color:\n var(--st-color-grey-300);\n}\n\n.squid-style-container :is(.tw-text-grey-400) {\n color:\n var(--st-color-grey-400);\n}\n\n.squid-style-container :is(.tw-text-grey-500) {\n color:\n var(--st-color-grey-500);\n}\n\n.squid-style-container :is(.tw-text-grey-600) {\n color:\n var(--st-color-grey-600);\n}\n\n.squid-style-container :is(.tw-text-grey-700) {\n color:\n var(--st-color-grey-700);\n}\n\n.squid-style-container :is(.tw-text-grey-900) {\n color:\n var(--st-color-grey-900);\n}\n\n.squid-style-container :is(.tw-text-input-placeholder) {\n color:\n var(--st-color-input-placeholder);\n}\n\n.squid-style-container :is(.tw-text-input-text) {\n color:\n var(--st-color-input-text);\n}\n\n.squid-style-container :is(.tw-text-material-light-average) {\n color:\n var(--st-color-material-light-average);\n}\n\n.squid-style-container :is(.tw-text-material-light-thick) {\n color:\n var(--st-color-material-light-thick);\n}\n\n.squid-style-container :is(.tw-text-material-light-thin) {\n color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.tw-text-menu-text) {\n color:\n var(--st-color-menu-text);\n}\n\n.squid-style-container :is(.tw-text-royal-400) {\n color:\n var(--st-color-royal-400);\n}\n\n.squid-style-container :is(.tw-text-royal-500) {\n color:\n var(--st-color-royal-500);\n}\n\n.squid-style-container :is(.tw-text-status-negative) {\n color:\n var(--st-color-status-negative);\n}\n\n.squid-style-container :is(.tw-text-status-partial) {\n color:\n var(--st-color-status-partial);\n}\n\n.squid-style-container :is(.tw-text-status-positive) {\n color:\n var(--st-color-status-positive);\n}\n\n.squid-style-container :is(.tw-text-transparent) {\n color:\n transparent;\n}\n\n.squid-style-container :is(.tw-placeholder-grey-100)::-moz-placeholder {\n color:\n var(--st-color-grey-100);\n}\n\n.squid-style-container :is(.tw-placeholder-grey-100)::placeholder {\n color:\n var(--st-color-grey-100);\n}\n\n.squid-style-container :is(.tw-placeholder-material-light-average)::-moz-placeholder {\n color:\n var(--st-color-material-light-average);\n}\n\n.squid-style-container :is(.tw-placeholder-material-light-average)::placeholder {\n color:\n var(--st-color-material-light-average);\n}\n\n.squid-style-container :is(.tw-placeholder-royal-500)::-moz-placeholder {\n color:\n var(--st-color-royal-500);\n}\n\n.squid-style-container :is(.tw-placeholder-royal-500)::placeholder {\n color:\n var(--st-color-royal-500);\n}\n\n.squid-style-container :is(.\\!tw-opacity-100) {\n opacity:\n 1 !important;\n}\n\n.squid-style-container :is(.tw-opacity-0) {\n opacity:\n 0;\n}\n\n.squid-style-container :is(.tw-opacity-100) {\n opacity:\n 1;\n}\n\n.squid-style-container :is(.tw-opacity-33) {\n opacity:\n 0.33;\n}\n\n.squid-style-container :is(.tw-opacity-40) {\n opacity:\n 0.4;\n}\n\n.squid-style-container :is(.tw-opacity-50) {\n opacity:\n 0.5;\n}\n\n.squid-style-container :is(.tw-opacity-66) {\n opacity:\n 0.66;\n}\n\n.squid-style-container :is(.tw-shadow-container) {\n --tw-shadow:\n var(--st-box-shadow-container);\n --tw-shadow-colored:\n var(--st-box-shadow-container);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.squid-style-container :is(.tw-shadow-cta-button-light) {\n --tw-shadow:\n 0 1px 4px 1px color(display-p3 1 1 1 / 0.30) inset, 0 1px 3px 0 color(display-p3 0 0 0 / 0.05), 0 2px 5px 0 color(display-p3 0 0 0 / 0.08);\n --tw-shadow-colored:\n inset 0 1px 4px 1px var(--tw-shadow-color), 0 1px 3px 0 var(--tw-shadow-color), 0 2px 5px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.squid-style-container :is(.tw-shadow-elevation-dark-1) {\n --tw-shadow:\n 0px 1px 2px 0px rgba(0, 0, 0, 0.15);\n --tw-shadow-colored:\n 0px 1px 2px 0px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.squid-style-container :is(.tw-shadow-elevation-light-1) {\n --tw-shadow:\n 0px 1px 2px 0px #0000001A;\n --tw-shadow-colored:\n 0px 1px 2px 0px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.squid-style-container :is(.tw-shadow-elevation-light-2) {\n --tw-shadow:\n 0px 2px 5px 1px rgba(0, 0, 0, 0.10), 0px 5px 20px -1px rgba(0, 0, 0, 0.10);\n --tw-shadow-colored:\n 0px 2px 5px 1px var(--tw-shadow-color), 0px 5px 20px -1px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.squid-style-container :is(.tw-shadow-elevation-light-3) {\n --tw-shadow:\n 0px 2px 4px 0px rgba(0, 0, 0, 0.10), 0px 5px 50px -1px rgba(0, 0, 0, 0.20);\n --tw-shadow-colored:\n 0px 2px 4px 0px var(--tw-shadow-color), 0px 5px 50px -1px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.squid-style-container :is(.tw-shadow-icon-light) {\n --tw-shadow:\n 0 0 2px 1px color(display-p3 0 0 0 / 0.05), 0 1px 2px 0 color(display-p3 0 0 0 / 0.05), 0 2px 8px 0 color(display-p3 0 0 0 / 0.10);\n --tw-shadow-colored:\n 0 0 2px 1px var(--tw-shadow-color), 0 1px 2px 0 var(--tw-shadow-color), 0 2px 8px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.squid-style-container :is(.tw-shadow-widget-card-light) {\n --tw-shadow:\n 0 0 1px 1px color(display-p3 0 0 0 / 0.10), 0 8px 20px 0 color(display-p3 0 0 0 / 0.05), 0 16px 40px -2px color(display-p3 0 0 0 / 0.05);\n --tw-shadow-colored:\n 0 0 1px 1px var(--tw-shadow-color), 0 8px 20px 0 var(--tw-shadow-color), 0 16px 40px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.squid-style-container :is(.tw-outline-none) {\n outline:\n 2px solid transparent;\n outline-offset:\n 2px;\n}\n\n.squid-style-container :is(.tw-outline) {\n outline-style:\n solid;\n}\n\n.squid-style-container :is(.tw-outline-1) {\n outline-width:\n 1px;\n}\n\n.squid-style-container :is(.tw-outline-2) {\n outline-width:\n 2px;\n}\n\n.squid-style-container :is(.tw-outline-\\[0\\.25rem\\]) {\n outline-width:\n 0.25rem;\n}\n\n.squid-style-container :is(.-tw-outline-offset-1) {\n outline-offset:\n -1px;\n}\n\n.squid-style-container :is(.-tw-outline-offset-2) {\n outline-offset:\n -2px;\n}\n\n.squid-style-container :is(.-tw-outline-offset-\\[1px\\]) {\n outline-offset:\n -1px;\n}\n\n.squid-style-container :is(.tw-outline-offset-2) {\n outline-offset:\n 2px;\n}\n\n.squid-style-container :is(.tw-outline-offset-\\[0\\.375rem\\]) {\n outline-offset:\n 0.375rem;\n}\n\n.squid-style-container :is(.\\!tw-outline-button-md-tertiary-bg) {\n outline-color:\n var(--st-color-button-md-tertiary-bg) !important;\n}\n\n.squid-style-container :is(.\\!tw-outline-material-dark-average) {\n outline-color:\n var(--st-color-material-dark-average) !important;\n}\n\n.squid-style-container :is(.\\!tw-outline-status-negative) {\n outline-color:\n var(--st-color-status-negative) !important;\n}\n\n.squid-style-container :is(.tw-outline-grey-900) {\n outline-color:\n var(--st-color-grey-900);\n}\n\n.squid-style-container :is(.tw-outline-material-light-thick) {\n outline-color:\n var(--st-color-material-light-thick);\n}\n\n.squid-style-container :is(.tw-outline-material-light-thin) {\n outline-color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.tw-outline-royal-500) {\n outline-color:\n var(--st-color-royal-500);\n}\n\n.squid-style-container :is(.tw-outline-status-negative) {\n outline-color:\n var(--st-color-status-negative);\n}\n\n.squid-style-container :is(.tw-blur-sm) {\n --tw-blur:\n blur(4px);\n filter:\n var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.squid-style-container :is(.tw-backdrop-blur-2xl) {\n --tw-backdrop-blur:\n blur(40px);\n backdrop-filter:\n var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n\n.squid-style-container :is(.tw-backdrop-blur\\/10) {\n --tw-backdrop-blur:\n blur(10px);\n backdrop-filter:\n var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n\n.squid-style-container :is(.tw-transition-\\[border-width\\]) {\n transition-property:\n border-width;\n transition-timing-function:\n cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration:\n 150ms;\n}\n\n.squid-style-container :is(.tw-transition-\\[width\\,height\\]) {\n transition-property:\n width,height;\n transition-timing-function:\n cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration:\n 150ms;\n}\n\n.squid-style-container :is(.tw-transition-all) {\n transition-property:\n all;\n transition-timing-function:\n cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration:\n 150ms;\n}\n\n.squid-style-container :is(.tw-transition-colors) {\n transition-property:\n color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function:\n cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration:\n 150ms;\n}\n\n.squid-style-container :is(.tw-transition-opacity) {\n transition-property:\n opacity;\n transition-timing-function:\n cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration:\n 150ms;\n}\n\n.squid-style-container :is(.tw-transition-transform) {\n transition-property:\n transform;\n transition-timing-function:\n cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration:\n 150ms;\n}\n\n.squid-style-container :is(.tw-duration-1000) {\n transition-duration:\n 1000ms;\n}\n\n.squid-style-container :is(.tw-duration-150) {\n transition-duration:\n 150ms;\n}\n\n.squid-style-container :is(.tw-duration-200) {\n transition-duration:\n 200ms;\n}\n\n.squid-style-container :is(.tw-duration-300) {\n transition-duration:\n 300ms;\n}\n\n.squid-style-container :is(.tw-duration-generic) {\n transition-duration:\n 300;\n}\n\n.squid-style-container :is(.tw-will-change-transform) {\n will-change:\n transform;\n}\n\n.squid-style-container :is(.tw-focus-visible-within-outline:has(:focus-visible)) {\n outline-style:\n solid;\n outline-width:\n 2px;\n outline-color:\n var(--st-color-royal-500);\n}\n\n.squid-style-container :is(.tw-scrollbar-hidden) {\n scrollbar-width:\n none;\n}\n\n.squid-style-container :is(.tw-highlight-adjacent:has(button:hover)>button:first-child) {\n background-color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.tw-highlight-adjacent:has(*:hover) .tw-hide-on-parent-hover) {\n opacity:\n 0;\n}\n\n.squid-style-container :is(.tw-h-d-screen) {\n height:\n 100dvh;\n}\n\n.squid-style-container :is(.tw-mask) {\n -webkit-mask-image:\n linear-gradient(to bottom, transparent 0%, black 20%, black 80%, transparent 100%), linear-gradient(to right, transparent 0%, black 8px, black calc(100% - 8px), transparent 100%);\n mask-image:\n linear-gradient(to bottom, transparent 0%, black 20%, black 80%, transparent 100%), linear-gradient(to right, transparent 0%, black 8px, black calc(100% - 8px), transparent 100%);\n -webkit-mask-composite:\n source-in, xor;\n mask-composite:\n intersect;\n}\n\n.squid-style-container :is(.tw-assets-drip-mask) {\n clip-path:\n path(\"M15 69C11.1612 69 7.32233 67.5355 4.3934 64.6066C1.46448 61.6777 1.65526e-05 57.8389 1.40518e-10 54.0001C-1.65518e-05 50.1612 1.46445 46.3224 4.3934 43.3934C4.78897 42.9978 5.18905 42.6091 5.58521 42.2242C8.12297 39.7584 10.5 37.4488 10.5 34.5C10.5 31.5512 8.12297 29.2416 5.58521 26.7758C5.18905 26.3909 4.78897 26.0022 4.3934 25.6066C1.46445 22.6776 -1.65518e-05 18.8388 1.4052e-10 14.9999V14.9999C1.40521e-10 6.7157 6.71576 0 15 0V0C23.2842 0 30 6.7157 30 14.9999V14.9999C30 18.8388 28.5356 22.6776 25.6066 25.6066C25.2128 26.0001 24.8146 26.387 24.4201 26.7701C21.8805 29.237 19.5 31.5492 19.5 34.5C19.5 37.4508 21.8805 39.763 24.4201 42.2299C24.8146 42.613 25.2128 42.9999 25.6066 43.3934C28.5356 46.3224 30 50.1612 30 54.0001C30 57.8389 28.5355 61.6777 25.6066 64.6066C22.6777 67.5355 18.8388 69 15 69Z\");\n}\n\n.squid-style-container :is(.tw-assets-drip-horizontal-mask) {\n clip-path:\n path(\"M0 20C0 14.8816 1.95262 9.76311 5.85786 5.85786C9.76309 1.95264 14.8815 2.20702e-05 19.9999 1.87356e-10C25.1184 -2.20691e-05 30.2369 1.9526 34.1421 5.85786C34.6696 6.38529 35.1879 6.91873 35.7011 7.44695C38.9888 10.8306 42.0683 14 46 14C49.9317 14 53.0112 10.8306 56.2989 7.44695C56.8121 6.91873 57.3304 6.38529 57.8579 5.85786C61.7631 1.9526 66.8816 -2.20691e-05 72.0001 1.87356e-10V1.87356e-10C83.0457 1.87356e-10 92 8.95436 92 20V20C92 31.0456 83.0457 40 72.0001 40V40C66.8816 40 61.7631 38.0474 57.8579 34.1421C57.3331 33.6171 56.8174 33.0861 56.3065 32.5602C53.0174 29.174 49.9344 26 46 26C42.0656 26 38.9826 29.174 35.6935 32.5602C35.1826 33.0861 34.6669 33.6171 34.1421 34.1421C30.2369 38.0474 25.1184 40 19.9999 40C14.8815 40 9.76309 38.0474 5.85786 34.1421C1.95262 30.2369 0 25.1184 0 20Z\");\n}\n\n.squid-style-container :is(.tw-assets-drip-border-mask) {\n clip-path:\n path(\"M31 16C31 7.71576 24.2842 1 16 1C7.71576 1 1 7.71576 1 16L1.00391 16.3594C1.09246 20.0776 2.55603 23.7689 5.39355 26.6064C5.789 27.0019 6.18891 27.3906 6.58496 27.7754C9.12272 30.2412 11.5 32.5512 11.5 35.5C11.5 38.4488 9.12272 40.7588 6.58496 43.2246L5.39355 44.3936L5.12305 44.6709C2.37442 47.5625 1 51.2812 1 55C1.00002 58.8388 2.46464 62.6775 5.39355 65.6064C8.32249 68.5354 12.1612 70 16 70C19.8388 70 23.6775 68.5354 26.6064 65.6064C29.5354 62.6775 31 58.8388 31 55C31 51.2812 29.6256 47.5625 26.877 44.6709L26.6064 44.3936C26.2127 44 25.8143 43.6126 25.4199 43.2295C22.8804 40.7627 20.5 38.4507 20.5 35.5C20.5 32.918 22.3225 30.825 24.4795 28.6895L25.4199 27.7705C25.8143 27.3874 26.2127 27 26.6064 26.6064C29.444 23.7689 30.9075 20.0776 30.9961 16.3594L31 16ZM31.9951 16.3838C31.9005 20.3483 30.3398 24.2871 27.3135 27.3135C26.9139 27.7128 26.5107 28.1051 26.1172 28.4873C24.8318 29.7358 23.6688 30.8696 22.8164 32.042C21.9748 33.1997 21.5 34.3116 21.5 35.5C21.5 36.6884 21.9748 37.8003 22.8164 38.958C23.6688 40.1304 24.8318 41.2642 26.1172 42.5127C26.5107 42.8949 26.9139 43.2872 27.3135 43.6865C30.4375 46.8105 32 50.9068 32 55C32 59.0932 30.4375 63.1895 27.3135 66.3135C24.1895 69.4375 20.0932 71 16 71C11.9068 71 7.81052 69.4375 4.68652 66.3135C1.56254 63.1895 1.76493e-05 59.0932 0 55C9.20296e-07 50.9068 1.56253 46.8105 4.68652 43.6865C5.08802 43.285 5.49335 42.891 5.88867 42.5068C7.17298 41.259 8.33434 40.1264 9.18555 38.9551C10.0261 37.7984 10.5 36.6875 10.5 35.5C10.5 34.3125 10.0261 33.2016 9.18555 32.0449C8.33434 30.8736 7.17298 29.741 5.88867 28.4932C5.49335 28.109 5.08802 27.715 4.68652 27.3135C1.56253 24.1895 9.20364e-07 20.0932 0 16C0 7.16347 7.16349 0 16 0C24.8365 0 32 7.16347 32 16L31.9951 16.3838Z\");\n}\n\n.squid-style-container :is(.tw-assets-drip-border-horizontal-mask) {\n clip-path:\n path(\"M0 21C0 15.6272 2.05008 10.2507 6.15039 6.15039C10.2507 2.0501 15.6272 2.31668e-05 21 0C26.3728 7.38704e-07 31.7493 2.05008 35.8496 6.15039C36.3829 6.68367 36.9056 7.22269 37.418 7.75C39.0769 9.45736 40.6078 11.0285 42.1973 12.1836C43.772 13.3279 45.321 14 47 14V15C43.5599 15 40.7723 12.5735 37.9268 9.7002L36.7012 8.44727C36.4446 8.18317 36.1864 7.91765 35.9268 7.65234L35.1426 6.85742C31.3593 3.07414 26.4369 1.12401 21.4795 1.00586L21 1C15.8816 1.00002 10.7626 2.9522 6.85742 6.85742C2.95218 10.7627 1 15.8816 1 21C1 26.1184 2.95218 31.2373 6.85742 35.1426C10.6407 38.9259 15.5631 40.876 20.5205 40.9941L21 41C25.9584 41 30.917 39.1678 34.7725 35.5029L35.1426 35.1426C35.4049 34.8801 35.6645 34.6156 35.9229 34.3516L36.6934 33.5605C39.9825 30.1743 43.0656 27 47 27C50.9344 27 54.0175 30.1743 57.3066 33.5605C57.8174 34.0864 58.3328 34.6176 58.8574 35.1426C62.7627 39.0478 67.8816 41 73 41C84.0456 41 93 32.0456 93 21C93 9.95436 84.0456 1 73 1C67.8816 1 62.7627 2.95218 58.8574 6.85742C58.33 7.38484 57.8121 7.91905 57.2988 8.44727L56.0732 9.7002C53.2277 12.5735 50.4401 15 47 15V14C48.679 14 50.228 13.3279 51.8027 12.1836C53.3922 11.0285 54.9231 9.45736 56.582 7.75C57.0944 7.22269 57.6171 6.68367 58.1504 6.15039C62.2507 2.05008 67.6272 1.22412e-06 73 0C84.5979 0 94 9.40208 94 21C94 32.4167 84.8895 41.7057 73.542 41.9932L73 42C67.6272 42 62.2507 39.9499 58.1504 35.8496V35.8486C57.6199 35.3178 57.0988 34.7818 56.5889 34.2568C54.9294 32.5484 53.3983 30.9758 51.8076 29.8193C50.2313 28.6734 48.6803 28 47 28C45.3197 28 43.7687 28.6734 42.1924 29.8193C40.6017 30.9758 39.0706 32.5484 37.4111 34.2568C36.9012 34.7818 36.3801 35.3178 35.8496 35.8486V35.8496C31.7493 39.9499 26.3728 42 21 42C15.6272 42 10.2507 39.9499 6.15039 35.8496C2.05008 31.7493 0 26.3728 0 21Z\");\n}\n\n.squid-style-container :is(.tw-assets-button-mask) {\n -webkit-mask-image:\n url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNzIiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA3MiA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTAgMjBDMCAxNC44ODE2IDEuOTUyNjIgOS43NjMxMSA1Ljg1Nzg2IDUuODU3ODZDOS43NjMwOSAxLjk1MjY0IDE0Ljg4MTUgMi4yMDcwMmUtMDUgMTkuOTk5OSAxLjg3MzU2ZS0xMEMyNS4xMTg0IC0yLjIwNjkxZS0wNSAzMC4yMzY5IDEuOTUyNiAzNC4xNDIxIDUuODU3ODZDMzQuNjY5NiA2LjM4NTI5IDM1LjE4NzkgNi45MTg3MyAzNS43MDExIDcuNDQ2OTVDMzguOTg4OCAxMC44MzA2IDQyLjA2ODMgMTQgNDYgMTRDNDkuOTMxNyAxNCA1My4wMTEyIDEwLjgzMDYgNTYuMjk4OSA3LjQ0Njk1QzU2LjgxMjEgNi45MTg3MyA1Ny4zMzA0IDYuMzg1MjkgNTcuODU3OSA1Ljg1Nzg2QzYxLjc2MzEgMS45NTI2IDY2Ljg4MTYgLTIuMjA2OTFlLTA1IDcyLjAwMDEgMS44NzM1NmUtMTBWNDBDNjYuODgxNiA0MCA2MS43NjMxIDM4LjA0NzQgNTcuODU3OSAzNC4xNDIxQzU3LjMzMzEgMzMuNjE3MSA1Ni44MTc0IDMzLjA4NjEgNTYuMzA2NSAzMi41NjAyQzUzLjAxNzQgMjkuMTc0IDQ5LjkzNDQgMjYgNDYgMjZDNDIuMDY1NiAyNiAzOC45ODI2IDI5LjE3NCAzNS42OTM1IDMyLjU2MDJDMzUuMTgyNiAzMy4wODYxIDM0LjY2NjkgMzMuNjE3MSAzNC4xNDIxIDM0LjE0MjFDMzAuMjM2OSAzOC4wNDc0IDI1LjExODQgNDAgMTkuOTk5OSA0MEMxNC44ODE1IDQwIDkuNzYzMDkgMzguMDQ3NCA1Ljg1Nzg2IDM0LjE0MjFDMS45NTI2MiAzMC4yMzY5IDAgMjUuMTE4NCAwIDIwWiIgZmlsbD0iI0ZCRkJGRCIgc3R5bGU9ImZpbGw6I0ZCRkJGRDtmaWxsOmNvbG9yKGRpc3BsYXktcDMgMC45ODQwIDAuOTg2MSAwLjk5MDQpO2ZpbGwtb3BhY2l0eToxOyIvPgo8L3N2Zz4=\");\n mask-image:\n url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNzIiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA3MiA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTAgMjBDMCAxNC44ODE2IDEuOTUyNjIgOS43NjMxMSA1Ljg1Nzg2IDUuODU3ODZDOS43NjMwOSAxLjk1MjY0IDE0Ljg4MTUgMi4yMDcwMmUtMDUgMTkuOTk5OSAxLjg3MzU2ZS0xMEMyNS4xMTg0IC0yLjIwNjkxZS0wNSAzMC4yMzY5IDEuOTUyNiAzNC4xNDIxIDUuODU3ODZDMzQuNjY5NiA2LjM4NTI5IDM1LjE4NzkgNi45MTg3MyAzNS43MDExIDcuNDQ2OTVDMzguOTg4OCAxMC44MzA2IDQyLjA2ODMgMTQgNDYgMTRDNDkuOTMxNyAxNCA1My4wMTEyIDEwLjgzMDYgNTYuMjk4OSA3LjQ0Njk1QzU2LjgxMjEgNi45MTg3MyA1Ny4zMzA0IDYuMzg1MjkgNTcuODU3OSA1Ljg1Nzg2QzYxLjc2MzEgMS45NTI2IDY2Ljg4MTYgLTIuMjA2OTFlLTA1IDcyLjAwMDEgMS44NzM1NmUtMTBWNDBDNjYuODgxNiA0MCA2MS43NjMxIDM4LjA0NzQgNTcuODU3OSAzNC4xNDIxQzU3LjMzMzEgMzMuNjE3MSA1Ni44MTc0IDMzLjA4NjEgNTYuMzA2NSAzMi41NjAyQzUzLjAxNzQgMjkuMTc0IDQ5LjkzNDQgMjYgNDYgMjZDNDIuMDY1NiAyNiAzOC45ODI2IDI5LjE3NCAzNS42OTM1IDMyLjU2MDJDMzUuMTgyNiAzMy4wODYxIDM0LjY2NjkgMzMuNjE3MSAzNC4xNDIxIDM0LjE0MjFDMzAuMjM2OSAzOC4wNDc0IDI1LjExODQgNDAgMTkuOTk5OSA0MEMxNC44ODE1IDQwIDkuNzYzMDkgMzguMDQ3NCA1Ljg1Nzg2IDM0LjE0MjFDMS45NTI2MiAzMC4yMzY5IDAgMjUuMTE4NCAwIDIwWiIgZmlsbD0iI0ZCRkJGRCIgc3R5bGU9ImZpbGw6I0ZCRkJGRDtmaWxsOmNvbG9yKGRpc3BsYXktcDMgMC45ODQwIDAuOTg2MSAwLjk5MDQpO2ZpbGwtb3BhY2l0eToxOyIvPgo8L3N2Zz4=\");\n -webkit-mask-repeat:\n no-repeat;\n mask-repeat:\n no-repeat;\n}\n\n.squid-style-container :is(li) {\n list-style-type:\n none;\n}\n\n.squid-style-container :is(.tw-squid-property-gradient-bg-odd-container .tw-squid-property-row-bg:nth-child(odd) > :is(div, button)) {\n background:\n linear-gradient(\n 91deg,\n /* grey-100 with 0.05 opacity */ var(--st-color-grey-100-005) 0%,\n transparent 100%\n );\n}\n\n.squid-style-container :is(.tw-squid-property-gradient-bg-even-container .tw-squid-property-row-bg:nth-child(even) > :is(div, button)) {\n background:\n linear-gradient(\n 91deg,\n /* grey-100 with 0.05 opacity */ var(--st-color-grey-100-005) 0%,\n transparent 100%\n );\n}\n\n.squid-style-container :is(:focus-visible) {\n outline-style:\n solid;\n outline-width:\n 2px;\n outline-color:\n var(--st-color-royal-500);\n}\n\n.squid-style-container :is(:invalid) {\n outline-color:\n var(--st-color-status-negative);\n}\n\n.squid-style-container :is(:disabled) {\n cursor:\n not-allowed;\n}\n\n.squid-style-container :is(*), .squid-style-container :is(*)::before, .squid-style-container :is(*)::after {\n box-sizing:\n border-box;\n}\n\n.squid-style-container :is(input)::-webkit-outer-spin-button, .squid-style-container :is(input)::-webkit-inner-spin-button {\n -webkit-appearance:\n none;\n margin:\n 0;\n}\n\n.squid-style-container :is(input[type='number']) {\n -moz-appearance:\n textfield;\n}\n\n.squid-style-container :is(#squid-lottie-animation #keystroke) {\n stroke:\n var(--st-color-animation-text);\n}\n\n.squid-style-container :is(#squid-lottie-animation #keyfill) {\n fill:\n var(--st-color-animation-bg);\n}\n\n@keyframes tw-squid-animated-loader-dash-grow {\n 0% {\n stroke-dasharray:\n 62.827;\n stroke-dashoffset:\n 0;\n }\n\n 100% {\n stroke-dasharray:\n 4141.884;\n stroke-dashoffset:\n -20.942;\n }\n}\n\n.squid-style-container :is(.tw-squid-animated-loader-dash) {\n animation:\n tw-squid-animated-loader-dash-grow var(--squid-loader-rotate-duration) infinite alternate ease-in-out;\n stroke-dasharray:\n 20.942, 62.827;\n stroke-dashoffset:\n 0;\n}\n\n.\\[--gradient-middle-color\\:rgba\\(255\\2c 255\\2c 255\\2c 0\\.5\\)\\] {\n --gradient-middle-color:\n rgba(255,255,255,0.5);\n}\n\n.\\[--gradient-middle-color\\:transparent\\] {\n --gradient-middle-color:\n transparent;\n}\n\n.\\[--mid-color\\:transparent\\] {\n --mid-color:\n transparent;\n}\n\n.\\[text-wrap\\:pretty\\] {\n text-wrap:\n pretty;\n}\n\n.squid-style-container :is(.selection\\:tw-bg-input-selection *)::-moz-selection {\n background-color:\n var(--st-color-input-selection);\n}\n\n.squid-style-container :is(.selection\\:tw-bg-input-selection *)::selection {\n background-color:\n var(--st-color-input-selection);\n}\n\n.squid-style-container :is(.selection\\:tw-bg-input-selection)::-moz-selection {\n background-color:\n var(--st-color-input-selection);\n}\n\n.squid-style-container :is(.selection\\:tw-bg-input-selection)::selection {\n background-color:\n var(--st-color-input-selection);\n}\n\n.squid-style-container :is(.placeholder\\:tw-text-lg)::-moz-placeholder {\n font-size:\n 1.125rem;\n line-height:\n 1.75rem;\n}\n\n.squid-style-container :is(.placeholder\\:tw-text-lg)::placeholder {\n font-size:\n 1.125rem;\n line-height:\n 1.75rem;\n}\n\n.squid-style-container :is(.placeholder\\:tw-text-grey-600)::-moz-placeholder {\n color:\n var(--st-color-grey-600);\n}\n\n.squid-style-container :is(.placeholder\\:tw-text-grey-600)::placeholder {\n color:\n var(--st-color-grey-600);\n}\n\n.squid-style-container :is(.placeholder\\:tw-text-input-placeholder)::-moz-placeholder {\n color:\n var(--st-color-input-placeholder);\n}\n\n.squid-style-container :is(.placeholder\\:tw-text-input-placeholder)::placeholder {\n color:\n var(--st-color-input-placeholder);\n}\n\n.squid-style-container :is(.before\\:tw-absolute)::before {\n content:\n var(--tw-content);\n position:\n absolute;\n}\n\n.squid-style-container :is(.before\\:-tw-inset-\\[3px\\])::before {\n content:\n var(--tw-content);\n inset:\n -3px;\n}\n\n.squid-style-container :is(.before\\:tw-inset-0)::before {\n content:\n var(--tw-content);\n inset:\n 0px;\n}\n\n.squid-style-container :is(.before\\:-tw-z-\\[1\\])::before {\n content:\n var(--tw-content);\n z-index:\n -1;\n}\n\n.squid-style-container :is(.before\\:tw-z-\\[1\\])::before {\n content:\n var(--tw-content);\n z-index:\n 1;\n}\n\n.squid-style-container :is(.before\\:tw-h-full)::before {\n content:\n var(--tw-content);\n height:\n 100%;\n}\n\n.squid-style-container :is(.before\\:tw-w-\\[calc\\(100\\%\\+3px\\)\\])::before {\n content:\n var(--tw-content);\n width:\n calc(100% + 3px);\n}\n\n.squid-style-container :is(.before\\:tw-w-full)::before {\n content:\n var(--tw-content);\n width:\n 100%;\n}\n\n.squid-style-container :is(.before\\:tw-translate-x-\\[3px\\])::before {\n content:\n var(--tw-content);\n --tw-translate-x:\n 3px;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.before\\:tw-rounded-full)::before {\n content:\n var(--tw-content);\n border-radius:\n 9999px;\n}\n\n.squid-style-container :is(.before\\:tw-rounded-menu-lg)::before {\n content:\n var(--tw-content);\n border-radius:\n var(--st-border-radius-menu-lg);\n}\n\n.squid-style-container :is(.before\\:tw-rounded-menu-sm)::before {\n content:\n var(--tw-content);\n border-radius:\n var(--st-border-radius-menu-sm);\n}\n\n.squid-style-container :is(.before\\:tw-rounded-br-full)::before {\n content:\n var(--tw-content);\n border-bottom-right-radius:\n 9999px;\n}\n\n.squid-style-container :is(.before\\:tw-rounded-tr-full)::before {\n content:\n var(--tw-content);\n border-top-right-radius:\n 9999px;\n}\n\n.squid-style-container :is(.before\\:tw-border-2)::before {\n content:\n var(--tw-content);\n border-width:\n 2px;\n}\n\n.squid-style-container :is(.before\\:tw-border-l-0)::before {\n content:\n var(--tw-content);\n border-left-width:\n 0px;\n}\n\n.squid-style-container :is(.before\\:tw-border-transparent)::before {\n content:\n var(--tw-content);\n border-color:\n transparent;\n}\n\n.squid-style-container :is(.before\\:tw-backdrop-blur\\/20)::before {\n content:\n var(--tw-content);\n --tw-backdrop-blur:\n blur(20px);\n backdrop-filter:\n var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n\n.squid-style-container :is(.before\\:tw-backdrop-saturate-150)::before {\n content:\n var(--tw-content);\n --tw-backdrop-saturate:\n saturate(1.5);\n backdrop-filter:\n var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n\n.squid-style-container :is(.after\\:tw-absolute)::after {\n content:\n var(--tw-content);\n position:\n absolute;\n}\n\n.squid-style-container :is(.after\\:-tw-inset-\\[5px\\])::after {\n content:\n var(--tw-content);\n inset:\n -5px;\n}\n\n.squid-style-container :is(.after\\:tw-left-0)::after {\n content:\n var(--tw-content);\n left:\n 0px;\n}\n\n.squid-style-container :is(.after\\:tw-top-0)::after {\n content:\n var(--tw-content);\n top:\n 0px;\n}\n\n.squid-style-container :is(.after\\:tw-z-0)::after {\n content:\n var(--tw-content);\n z-index:\n 0;\n}\n\n.squid-style-container :is(.after\\:tw-block)::after {\n content:\n var(--tw-content);\n display:\n block;\n}\n\n.squid-style-container :is(.after\\:tw-h-full)::after {\n content:\n var(--tw-content);\n height:\n 100%;\n}\n\n.squid-style-container :is(.after\\:tw-w-\\[230\\%\\])::after {\n content:\n var(--tw-content);\n width:\n 230%;\n}\n\n.squid-style-container :is(.after\\:tw-w-\\[calc\\(100\\%\\+4px\\)\\])::after {\n content:\n var(--tw-content);\n width:\n calc(100% + 4px);\n}\n\n.squid-style-container :is(.after\\:tw-translate-x-\\[6px\\])::after {\n content:\n var(--tw-content);\n --tw-translate-x:\n 6px;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n@keyframes tw-loading-gradient-scroll {\n 0% {\n content:\n var(--tw-content);\n transform:\n translateX(-56%);\n }\n\n 100% {\n content:\n var(--tw-content);\n transform:\n translateX(0);\n }\n}\n\n.squid-style-container :is(.after\\:tw-animate-loading-gradient-scroll)::after {\n content:\n var(--tw-content);\n animation:\n tw-loading-gradient-scroll 1s ease-in-out both infinite;\n}\n\n.squid-style-container :is(.after\\:tw-rounded-full)::after {\n content:\n var(--tw-content);\n border-radius:\n 9999px;\n}\n\n.squid-style-container :is(.after\\:tw-rounded-br-full)::after {\n content:\n var(--tw-content);\n border-bottom-right-radius:\n 9999px;\n}\n\n.squid-style-container :is(.after\\:tw-rounded-tr-full)::after {\n content:\n var(--tw-content);\n border-top-right-radius:\n 9999px;\n}\n\n.squid-style-container :is(.after\\:tw-border-4)::after {\n content:\n var(--tw-content);\n border-width:\n 4px;\n}\n\n.squid-style-container :is(.after\\:tw-border-l-0)::after {\n content:\n var(--tw-content);\n border-left-width:\n 0px;\n}\n\n.squid-style-container :is(.after\\:tw-border-transparent)::after {\n content:\n var(--tw-content);\n border-color:\n transparent;\n}\n\n.squid-style-container :is(.after\\:tw-bg-loading-gradient)::after {\n content:\n var(--tw-content);\n background-image:\n linear-gradient(\n to right,\n var(--st-color-material-light-thin) 43%,\n var(--mid-color) 52%,\n var(--st-color-material-light-thin) 56%\n );\n}\n\n.squid-style-container :is(.after\\:tw-content-\\[\\'\\'\\])::after {\n --tw-content:\n '';\n content:\n var(--tw-content);\n}\n\n.squid-style-container :is(.last\\:tw-border-b:last-child) {\n border-bottom-width:\n 1px;\n}\n\n.squid-style-container :is(.placeholder-shown\\:tw-text-grey-600:-moz-placeholder-shown) {\n color:\n var(--st-color-grey-600);\n}\n\n.squid-style-container :is(.placeholder-shown\\:tw-text-grey-600:placeholder-shown) {\n color:\n var(--st-color-grey-600);\n}\n\n.squid-style-container :is(.invalid\\:tw-outline-status-negative:invalid) {\n outline-color:\n var(--st-color-status-negative);\n}\n\n.squid-style-container :is(.focus-within\\:tw-bg-material-light-thin:focus-within) {\n background-color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.hover\\:tw-border-material-light-average:hover) {\n border-color:\n var(--st-color-material-light-average);\n}\n\n.squid-style-container :is(.hover\\:tw-bg-grey-300:hover) {\n background-color:\n var(--st-color-grey-300);\n}\n\n.squid-style-container :is(.hover\\:tw-bg-grey-800:hover) {\n background-color:\n var(--st-color-grey-800);\n}\n\n.squid-style-container :is(.hover\\:tw-bg-material-light-thin:hover) {\n background-color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.hover\\:tw-bg-royal-500:hover) {\n background-color:\n var(--st-color-royal-500);\n}\n\n.squid-style-container :is(.hover\\:tw-text-grey-100:hover) {\n color:\n var(--st-color-grey-100);\n}\n\n.squid-style-container :is(.hover\\:tw-text-grey-500:hover) {\n color:\n var(--st-color-grey-500);\n}\n\n.squid-style-container :is(.hover\\:tw-text-grey-900:hover) {\n color:\n var(--st-color-grey-900);\n}\n\n.squid-style-container :is(.hover\\:tw-opacity-100:hover) {\n opacity:\n 1;\n}\n\n.squid-style-container :is(.hover\\:before\\:tw-border-grey-900:hover)::before {\n content:\n var(--tw-content);\n border-color:\n var(--st-color-grey-900);\n}\n\n.squid-style-container :is(.hover\\:after\\:tw-border-material-light-average:hover)::after {\n content:\n var(--tw-content);\n border-color:\n var(--st-color-material-light-average);\n}\n\n.squid-style-container :is(.focus\\:tw-bg-material-light-thin:focus) {\n background-color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.focus\\:tw-text-royal-500:focus) {\n color:\n var(--st-color-royal-500);\n}\n\n.squid-style-container :is(.focus\\:tw-placeholder-royal-500:focus)::-moz-placeholder {\n color:\n var(--st-color-royal-500);\n}\n\n.squid-style-container :is(.focus\\:tw-placeholder-royal-500:focus)::placeholder {\n color:\n var(--st-color-royal-500);\n}\n\n.squid-style-container :is(.focus\\:tw-opacity-100:focus) {\n opacity:\n 1;\n}\n\n.squid-style-container :is(.focus\\:tw-outline-none:focus) {\n outline:\n 2px solid transparent;\n outline-offset:\n 2px;\n}\n\n.squid-style-container :is(.focus-visible\\:tw-opacity-100:focus-visible) {\n opacity:\n 1;\n}\n\n.squid-style-container :is(.focus-visible\\:tw-outline-status-partial:focus-visible) {\n outline-color:\n var(--st-color-status-partial);\n}\n\n.squid-style-container :is(.disabled\\:tw-cursor-not-allowed:disabled) {\n cursor:\n not-allowed;\n}\n\n.squid-style-container :is(.disabled\\:tw-bg-grey-800:disabled) {\n background-color:\n var(--st-color-grey-800);\n}\n\n.squid-style-container :is(.disabled\\:tw-text-grey-600:disabled) {\n color:\n var(--st-color-grey-600);\n}\n\n.squid-style-container :is(.tw-group\\/account:focus-within .group-focus-within\\/account\\:tw-scale-100) {\n --tw-scale-x:\n 1;\n --tw-scale-y:\n 1;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-group\\/account:focus-within .group-focus-within\\/account\\:tw-scale-75) {\n --tw-scale-x:\n .75;\n --tw-scale-y:\n .75;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-group\\/amount-input:focus-within .group-focus-within\\/amount-input\\:tw-text-royal-500) {\n color:\n var(--st-color-royal-500);\n}\n\n.squid-style-container :is(.tw-group\\/account:focus-within .group-focus-within\\/account\\:tw-opacity-0) {\n opacity:\n 0;\n}\n\n.squid-style-container :is(.tw-group\\/account:focus-within .group-focus-within\\/account\\:tw-opacity-100) {\n opacity:\n 1;\n}\n\n.squid-style-container :is(.tw-group\\/account:focus-within .group-focus-within\\/account\\:tw-blur-0) {\n --tw-blur:\n blur(0);\n filter:\n var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.squid-style-container :is(.tw-group\\/account:focus-within .group-focus-within\\/account\\:tw-blur-sm) {\n --tw-blur:\n blur(4px);\n filter:\n var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.squid-style-container :is(.tw-group\\/assets-button:hover .group-hover\\/assets-button\\:tw-block) {\n display:\n block;\n}\n\n.squid-style-container :is(.tw-group\\/base-button:hover .group-hover\\/base-button\\:tw-block) {\n display:\n block;\n}\n\n.squid-style-container :is(.tw-group\\/list-item:hover .group-hover\\/list-item\\:tw-block) {\n display:\n block;\n}\n\n.squid-style-container :is(.tw-group\\/token-detail-fav-icon:hover .group-hover\\/token-detail-fav-icon\\:tw-block) {\n display:\n block;\n}\n\n.squid-style-container :is(.tw-group\\/token-item:hover .group-hover\\/token-item\\:tw-inline) {\n display:\n inline;\n}\n\n.squid-style-container :is(.tw-group\\/history-item:hover .group-hover\\/history-item\\:tw-hidden) {\n display:\n none;\n}\n\n.squid-style-container :is(.tw-group\\/token-detail-fav-icon:hover .group-hover\\/token-detail-fav-icon\\:tw-hidden) {\n display:\n none;\n}\n\n.squid-style-container :is(.tw-group\\/token-item:hover .group-hover\\/token-item\\:tw-hidden) {\n display:\n none;\n}\n\n.squid-style-container :is(.tw-group\\/explorer:hover .group-hover\\/explorer\\:tw-w-4) {\n width:\n 1rem;\n}\n\n.squid-style-container :is(.tw-group\\/wallet:hover .group-hover\\/wallet\\:tw-w-4) {\n width:\n 1rem;\n}\n\n.squid-style-container :is(.tw-group\\/wallet:hover .group-hover\\/wallet\\:-tw-translate-x-1) {\n --tw-translate-x:\n -0.25rem;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-group\\/flip-button:hover .group-hover\\/flip-button\\:tw-rotate-180) {\n --tw-rotate:\n 180deg;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-group\\/account:hover .group-hover\\/account\\:tw-scale-100) {\n --tw-scale-x:\n 1;\n --tw-scale-y:\n 1;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-group\\/account:hover .group-hover\\/account\\:tw-scale-75) {\n --tw-scale-x:\n .75;\n --tw-scale-y:\n .75;\n transform:\n translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.squid-style-container :is(.tw-group\\/chain-filter:hover .group-hover\\/chain-filter\\:tw-bg-material-light-thin) {\n background-color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.tw-group\\/tab-button:hover .group-hover\\/tab-button\\:tw-bg-material-light-thin) {\n background-color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.tw-group\\/swap-step-item-button:hover .group-hover\\/swap-step-item-button\\:tw-from-grey-600) {\n --tw-gradient-from:\n var(--st-color-grey-600) var(--tw-gradient-from-position);\n --tw-gradient-to:\n rgb(255 255 255 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops:\n var(--tw-gradient-from), var(--tw-gradient-to);\n}\n\n.squid-style-container :is(.tw-group\\/stops-button:hover .group-hover\\/stops-button\\:tw-to-material-light-blend-grey-900) {\n --tw-gradient-to:\n var(--st-color-material-light-blend-grey-900) var(--tw-gradient-to-position);\n}\n\n.squid-style-container :is(.tw-group\\/account:hover .group-hover\\/account\\:tw-opacity-0) {\n opacity:\n 0;\n}\n\n.squid-style-container :is(.tw-group\\/account:hover .group-hover\\/account\\:tw-opacity-100) {\n opacity:\n 1;\n}\n\n.squid-style-container :is(.tw-group\\/explorer:hover .group-hover\\/explorer\\:tw-opacity-100) {\n opacity:\n 1;\n}\n\n.squid-style-container :is(.tw-group\\/history-item:hover .group-hover\\/history-item\\:tw-opacity-0) {\n opacity:\n 0;\n}\n\n.squid-style-container :is(.tw-group\\/list-item:hover .group-hover\\/list-item\\:tw-opacity-0) {\n opacity:\n 0;\n}\n\n.squid-style-container :is(.tw-group\\/list-item:hover .group-hover\\/list-item\\:tw-opacity-100) {\n opacity:\n 1;\n}\n\n.squid-style-container :is(.tw-group\\/wallet:hover .group-hover\\/wallet\\:tw-opacity-100) {\n opacity:\n 1;\n}\n\n.squid-style-container :is(.tw-group\\/accounts-button:hover .group-hover\\/accounts-button\\:\\!tw-outline-material-light-blend-grey-800) {\n outline-color:\n var(--st-color-material-light-blend-grey-800) !important;\n}\n\n.squid-style-container :is(.tw-group\\/account:hover .group-hover\\/account\\:tw-blur-0) {\n --tw-blur:\n blur(0);\n filter:\n var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.squid-style-container :is(.tw-group\\/account:hover .group-hover\\/account\\:tw-blur-sm) {\n --tw-blur:\n blur(4px);\n filter:\n var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.squid-style-container :is(.tw-group\\/assets-button:hover .group-hover\\/assets-button\\:before\\:tw-border-grey-900)::before {\n content:\n var(--tw-content);\n border-color:\n var(--st-color-grey-900);\n}\n\n.squid-style-container :is(.tw-group\\/assets-button:hover .group-hover\\/assets-button\\:after\\:tw-border-material-light-average)::after {\n content:\n var(--tw-content);\n border-color:\n var(--st-color-material-light-average);\n}\n\n.squid-style-container :is(.tw-group\\/list-item:focus .group-focus\\/list-item\\:tw-opacity-100) {\n opacity:\n 1;\n}\n\n.squid-style-container :is(.tw-peer\\/history-item:hover ~ .peer-hover\\/history-item\\:tw-opacity-100) {\n opacity:\n 1;\n}\n\n.squid-style-container :is(.tw-peer:focus ~ .peer-focus\\:tw-hidden) {\n display:\n none;\n}\n\n.squid-style-container :is(.tw-peer:focus ~ .peer-focus\\:tw-opacity-0) {\n opacity:\n 0;\n}\n\n.squid-style-container :is(.aria-disabled\\:tw-bg-grey-600[aria-disabled=\"true\"]) {\n background-color:\n var(--st-color-grey-600);\n}\n\n.squid-style-container :is(.aria-disabled\\:tw-text-grey-800[aria-disabled=\"true\"]) {\n color:\n var(--st-color-grey-800);\n}\n\n.data-\\[squid-theme-type\\=dark\\]\\:\\[--mid-color\\:var\\(--st-color-material-light-average\\)\\][data-squid-theme-type=dark] {\n --mid-color:\n var(--st-color-material-light-average);\n}\n\n.squid-style-container :is(.tw-group[data-squid-theme-type=dark] .group-data-\\[squid-theme-type\\=dark\\]\\:tw-bg-grey-100) {\n background-color:\n var(--st-color-grey-100);\n}\n\n.squid-style-container :is(.tw-group[data-squid-theme-type=dark] .group-data-\\[squid-theme-type\\=dark\\]\\:tw-bg-grey-700) {\n background-color:\n var(--st-color-grey-700);\n}\n\n.squid-style-container :is(.tw-group[data-squid-theme-type=light] .group-data-\\[squid-theme-type\\=light\\]\\:tw-bg-grey-900) {\n background-color:\n var(--st-color-grey-900);\n}\n\n.squid-style-container :is(.tw-group[data-squid-theme-type=dark] .group-data-\\[squid-theme-type\\=dark\\]\\:tw-bg-shimmer-light) {\n background-image:\n linear-gradient(90deg, color-mix(in srgb, var(--st-color-grey-100) 40%, transparent) 0%, var(--st-color-grey-100) 10%, color-mix(in srgb, var(--st-color-grey-100) 40%, transparent) 60%);\n}\n\n.squid-style-container :is(.tw-group[data-squid-theme-type=light] .group-data-\\[squid-theme-type\\=light\\]\\:tw-bg-shimmer-dark) {\n background-image:\n linear-gradient(90deg, color-mix(in srgb, var(--st-color-grey-900) 40%, transparent) 0%, var(--st-color-grey-900) 10%, color-mix(in srgb, var(--st-color-grey-900) 40%, transparent) 60%);\n}\n\n.squid-style-container :is(.tw-group[data-squid-theme-type=dark] .group-data-\\[squid-theme-type\\=dark\\]\\:tw-text-grey-100) {\n color:\n var(--st-color-grey-100);\n}\n\n.squid-style-container :is(.tw-group[data-squid-theme-type=dark] .group-data-\\[squid-theme-type\\=dark\\]\\:tw-text-royal-700) {\n color:\n var(--st-color-royal-700);\n}\n\n.squid-style-container :is(.tw-group[data-squid-theme-type=light] .group-data-\\[squid-theme-type\\=light\\]\\:tw-text-grey-900) {\n color:\n var(--st-color-grey-900);\n}\n\n.squid-style-container :is(.tw-group[data-squid-theme-type=dark] .group-data-\\[squid-theme-type\\=dark\\]\\:tw-shadow-elevation-dark-2) {\n --tw-shadow:\n 0px 2px 5px 1px rgba(0, 0, 0, 0.20), 0px 5px 20px -1px rgba(0, 0, 0, 0.33);\n --tw-shadow-colored:\n 0px 2px 5px 1px var(--tw-shadow-color), 0px 5px 20px -1px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.squid-style-container :is(.tw-group[data-squid-theme-type=light] .group-data-\\[squid-theme-type\\=light\\]\\:tw-shadow-elevation-light-2) {\n --tw-shadow:\n 0px 2px 5px 1px rgba(0, 0, 0, 0.10), 0px 5px 20px -1px rgba(0, 0, 0, 0.10);\n --tw-shadow-colored:\n 0px 2px 5px 1px var(--tw-shadow-color), 0px 5px 20px -1px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.tw-group[data-squid-theme-type='dark'] .group-data-\\[squid-theme-type\\=\\'dark\\'\\]\\:\\[--gradient-middle-color\\:rgba\\(255\\2c 255\\2c 255\\2c 0\\.5\\)\\] {\n --gradient-middle-color:\n rgba(255,255,255,0.5);\n}\n\n@media (min-width: 360px) {\n .squid-style-container :is(.mobile-xs\\:tw-flex) {\n display:\n flex;\n }\n\n .squid-style-container :is(.mobile-xs\\:tw-w-modal-compact) {\n width:\n 373px;\n }\n\n .squid-style-container :is(.mobile-xs\\:tw-justify-normal) {\n justify-content:\n normal;\n }\n}\n\n@media (min-width: 480px) {\n .squid-style-container :is(.mobile-lg\\:tw-mr-squid-m) {\n margin-right:\n 1.25rem;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-block) {\n display:\n block;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-h-auto) {\n height:\n auto;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-max-h-card-large) {\n max-height:\n 660px;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-max-h-modal-large) {\n max-height:\n 600px;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-w-\\[190px\\]) {\n width:\n 190px;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-w-\\[50px\\]) {\n width:\n 50px;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-w-card-large) {\n width:\n 480px;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-w-full) {\n width:\n 100%;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-w-modal-extra-large) {\n width:\n 440px;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-w-modal-large) {\n width:\n 400px;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-w-squid-xl) {\n width:\n 2.5rem;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-min-w-modal-large) {\n min-width:\n 400px;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-max-w-card-large) {\n max-width:\n 480px;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-max-w-modal-large) {\n max-width:\n 400px;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-rounded-container) {\n border-radius:\n var(--st-border-radius-container);\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-px-squid-l) {\n padding-left:\n 1.875rem;\n padding-right:\n 1.875rem;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-px-squid-m) {\n padding-left:\n 1.25rem;\n padding-right:\n 1.25rem;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-px-squid-xxs) {\n padding-left:\n 0.3125rem;\n padding-right:\n 0.3125rem;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-pl-squid-l) {\n padding-left:\n 1.875rem;\n }\n\n .squid-style-container :is(.mobile-lg\\:tw-pr-squid-xxl) {\n padding-right:\n 3.75rem;\n }\n}\n\n@media (min-height: 650px) {\n .squid-style-container :is(.mobile-xs-height\\:tw-flex) {\n display:\n flex;\n }\n\n .squid-style-container :is(.mobile-xs-height\\:tw-h-\\[160px\\]) {\n height:\n 160px;\n }\n\n .squid-style-container :is(.mobile-xs-height\\:tw-h-\\[195px\\]) {\n height:\n 195px;\n }\n\n .squid-style-container :is(.mobile-xs-height\\:tw-h-\\[535px\\]) {\n height:\n 535px;\n }\n\n .squid-style-container :is(.mobile-xs-height\\:tw-max-h-\\[535px\\]) {\n max-height:\n 535px;\n }\n\n .squid-style-container :is(.mobile-xs-height\\:tw-min-h-card-large) {\n min-height:\n 660px;\n }\n\n .squid-style-container :is(.mobile-xs-height\\:tw-w-\\[unset\\]) {\n width:\n unset;\n }\n\n .squid-style-container :is(.mobile-xs-height\\:tw-flex-col) {\n flex-direction:\n column;\n }\n\n .squid-style-container :is(.mobile-xs-height\\:tw-pb-squid-s) {\n padding-bottom:\n 0.9375rem;\n }\n\n .squid-style-container :is(.mobile-xs-height\\:tw-pr-squid-m) {\n padding-right:\n 1.25rem;\n }\n}\n\n@media (min-height: 670px) {\n .squid-style-container :is(.mobile-sm-height\\:tw-h-\\[75px\\]) {\n height:\n 75px;\n }\n\n .squid-style-container :is(.mobile-sm-height\\:tw-py-squid-s) {\n padding-top:\n 0.9375rem;\n padding-bottom:\n 0.9375rem;\n }\n}\n\n.squid-style-container :is(.dark\\:tw-border-b-material-light-thin:where([data-squid-theme-type=dark], [data-squid-theme-type=dark] *)) {\n border-bottom-color:\n var(--st-color-material-light-thin);\n}\n\n.squid-style-container :is(.dark\\:tw-bg-material-dark-thick:where([data-squid-theme-type=dark], [data-squid-theme-type=dark] *)) {\n background-color:\n var(--st-color-material-dark-thick);\n}\n\n.squid-style-container :is(.dark\\:tw-bg-cta-button-dark:where([data-squid-theme-type=dark], [data-squid-theme-type=dark] *)) {\n background-image:\n linear-gradient(0deg, color(display-p3 0 0 0 / 0.00) 0%, color(display-p3 0 0 0 / 0.04) 66%, color(display-p3 0 0 0 / 0.06) 100%);\n}\n\n.squid-style-container :is(.dark\\:tw-bg-shimmer-overlay-dark:where([data-squid-theme-type=dark], [data-squid-theme-type=dark] *)) {\n background-image:\n linear-gradient(90deg, transparent 0%, rgba(0,0,0,0.6) 50%, transparent 100%);\n}\n\n.squid-style-container :is(.dark\\:tw-shadow-cta-button-dark:where([data-squid-theme-type=dark], [data-squid-theme-type=dark] *)) {\n --tw-shadow:\n 0 1px 4px 1px color(display-p3 0 0 0 / 0.10) inset, 0 1px 3px 0 color(display-p3 0 0 0 / 0.07), 0 2px 5px 0 color(display-p3 0 0 0 / 0.10);\n --tw-shadow-colored:\n inset 0 1px 4px 1px var(--tw-shadow-color), 0 1px 3px 0 var(--tw-shadow-color), 0 2px 5px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.squid-style-container :is(.dark\\:tw-shadow-icon-dark:where([data-squid-theme-type=dark], [data-squid-theme-type=dark] *)) {\n --tw-shadow:\n 0 0 2px 1px color(display-p3 1 1 1 / 0.03), 0 1px 2px 0 color(display-p3 1 1 1 / 0.03), 0 2px 8px 0 color(display-p3 1 1 1 / 0.05);\n --tw-shadow-colored:\n 0 0 2px 1px var(--tw-shadow-color), 0 1px 2px 0 var(--tw-shadow-color), 0 2px 8px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.squid-style-container :is(.dark\\:tw-shadow-widget-card-dark:where([data-squid-theme-type=dark], [data-squid-theme-type=dark] *)) {\n --tw-shadow:\n 0 0 1px 1px color(display-p3 1 1 1 / 0.08), 0 8px 20px 0 color(display-p3 0 0 0 / 0.6), 0 16px 40px -2px color(display-p3 0 0 0 / 0.5);\n --tw-shadow-colored:\n 0 0 1px 1px var(--tw-shadow-color), 0 8px 20px 0 var(--tw-shadow-color), 0 16px 40px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.squid-style-container :is(.disabled\\:dark\\:tw-bg-grey-800:where([data-squid-theme-type=dark], [data-squid-theme-type=dark] *):disabled) {\n background-color:\n var(--st-color-grey-800);\n}\n\n.squid-style-container :is(.disabled\\:dark\\:tw-text-grey-500:where([data-squid-theme-type=dark], [data-squid-theme-type=dark] *):disabled) {\n color:\n var(--st-color-grey-500);\n}\n\n.squid-style-container :is(.\\[\\&\\>\\*\\]\\:tw-h-full>*) {\n height:\n 100%;\n}\n\n.squid-style-container :is(.\\[\\&\\>path\\]\\:tw-stroke-\\[3\\]>path) {\n stroke-width:\n 3;\n}\n\n.squid-style-container :is(.\\[\\&_svg_path\\]\\:tw-stroke-\\[6\\] svg path) {\n stroke-width:\n 6;\n}\n";
|
|
31
|
+
|
|
32
|
+
const INITIAL_VIEW = { id: "main" };
|
|
33
|
+
const selectCurrentView = (state) => state.stack[state.stack.length - 1] ?? INITIAL_VIEW;
|
|
34
|
+
const useRouter = zustand.create((set) => ({
|
|
35
|
+
stack: [INITIAL_VIEW],
|
|
36
|
+
direction: null,
|
|
37
|
+
push: (view) => set((state) => {
|
|
38
|
+
if (selectCurrentView(state).id === view.id)
|
|
39
|
+
return state;
|
|
40
|
+
return {
|
|
41
|
+
stack: [...state.stack, view],
|
|
42
|
+
direction: "forward",
|
|
43
|
+
};
|
|
44
|
+
}),
|
|
45
|
+
pop: () => set((state) => {
|
|
46
|
+
if (state.stack.length <= 1)
|
|
47
|
+
return state;
|
|
48
|
+
return {
|
|
49
|
+
stack: state.stack.slice(0, -1),
|
|
50
|
+
direction: "backward",
|
|
51
|
+
};
|
|
52
|
+
}),
|
|
53
|
+
popToRoot: () => set((state) => {
|
|
54
|
+
if (state.stack.length <= 1)
|
|
55
|
+
return state;
|
|
56
|
+
return {
|
|
57
|
+
stack: [INITIAL_VIEW],
|
|
58
|
+
direction: "backward",
|
|
59
|
+
};
|
|
60
|
+
}),
|
|
61
|
+
}));
|
|
62
|
+
|
|
63
|
+
const VIEW_TRANSITION_DURATION_MS = 250;
|
|
64
|
+
|
|
65
|
+
const ENTER_CLASS = {
|
|
66
|
+
forward: "tw-animate-slide-in-right",
|
|
67
|
+
backward: "tw-animate-slide-in-left",
|
|
68
|
+
};
|
|
69
|
+
const EXIT_CLASS = {
|
|
70
|
+
forward: "tw-animate-slide-out-left",
|
|
71
|
+
backward: "tw-animate-slide-out-right",
|
|
72
|
+
};
|
|
73
|
+
function ViewTransition({ viewId, children }) {
|
|
74
|
+
const direction = useRouter((s) => s.direction);
|
|
75
|
+
const prevChildrenRef = React.useRef(children);
|
|
76
|
+
const [exiting, setExiting] = React.useState(null);
|
|
77
|
+
const [activeId, setActiveId] = React.useState(viewId);
|
|
78
|
+
// Detect view change during render (React "derive state from props" pattern)
|
|
79
|
+
if (viewId !== activeId) {
|
|
80
|
+
setExiting({ viewId: activeId, element: prevChildrenRef.current });
|
|
81
|
+
setActiveId(viewId);
|
|
82
|
+
}
|
|
83
|
+
// Keep ref in sync with latest children for the active view
|
|
84
|
+
prevChildrenRef.current = children;
|
|
85
|
+
// Safety timeout: clear exiting slot if onAnimationEnd doesn't fire
|
|
86
|
+
React.useEffect(() => {
|
|
87
|
+
if (!exiting)
|
|
88
|
+
return;
|
|
89
|
+
const timer = setTimeout(() => setExiting(null), VIEW_TRANSITION_DURATION_MS + 50);
|
|
90
|
+
return () => clearTimeout(timer);
|
|
91
|
+
}, [exiting]);
|
|
92
|
+
const handleAnimationEnd = (e) => {
|
|
93
|
+
if (e.target !== e.currentTarget)
|
|
94
|
+
return;
|
|
95
|
+
setExiting(null);
|
|
96
|
+
};
|
|
97
|
+
const isAnimating = exiting !== null;
|
|
98
|
+
return (jsxRuntime.jsxs("div", { className: "tw-relative tw-flex-1 tw-overflow-hidden tw-w-full", children: [exiting && direction && (jsxRuntime.jsx("div", { className: `tw-absolute tw-inset-0 tw-flex tw-flex-col tw-will-change-transform ${EXIT_CLASS[direction]}`, children: exiting.element }, exiting.viewId)), jsxRuntime.jsx("div", { className: ui.cn("tw-absolute tw-inset-0 tw-flex tw-flex-col tw-will-change-transform", isAnimating && direction && ENTER_CLASS[direction]), onAnimationEnd: isAnimating ? handleAnimationEnd : undefined, children: children }, viewId)] }));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function BaseNavBar({ className, ...props }) {
|
|
102
|
+
return (jsxRuntime.jsx("nav", { ...props, className: ui.cn("tw-flex tw-py-3 tw-px-4 tw-items-center tw-self-stretch tw-h-16", className) }));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function SubNavBar({ title, input }) {
|
|
106
|
+
const pop = useRouter((s) => s.pop);
|
|
107
|
+
return (jsxRuntime.jsxs(BaseNavBar, { className: "tw-gap-2", children: [jsxRuntime.jsx(ui.IconButton, { onClick: pop, icon: jsxRuntime.jsx(ui.ArrowLeftIcon, { className: "tw-text-grey-100 [&>path]:tw-stroke-[3]", size: "1.5rem" }) }), input ? (jsxRuntime.jsxs("div", { className: "tw-flex tw-relative tw-flex-1 tw-items-center", children: [jsxRuntime.jsx(ui.SearchIcon, { size: "1rem", className: "tw-absolute tw-left-0 tw-top-1/2 -tw-translate-y-1/2 tw-text-material-light-average tw-pl-2 tw-w-fit" }), jsxRuntime.jsx("input", { className: "tw-flex tw-h-8 tw-text-grey-100 tw-py-1 tw-pl-7 tw-pr-2 tw-items-center tw-gap-1 tw-flex-1 tw-rounded-squid-s tw-border tw-border-material-light-thin tw-bg-grey-800 placeholder:tw-text-lg tw-placeholder-material-light-average", ...input }), jsxRuntime.jsx("span", { className: "tw-size-squid-xl" })] })) : title ? (jsxRuntime.jsx("span", { className: "tw-text-grey-100 tw-text-lg tw-font-squid-main tw-font-medium", children: title })) : null] }));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function WalletListItem({ wallet, isConnecting, showAsMultiChain, parentProps, ...props }) {
|
|
111
|
+
const isInstalled = wallet.isInstalled?.();
|
|
112
|
+
return (jsxRuntime.jsx("li", { className: "tw-self-stretch", ...parentProps, children: jsxRuntime.jsxs("button", { className: "tw-group/wallet tw-flex tw-min-h-14 tw-h-14 tw-px-4 tw-items-center tw-gap-3 tw-self-stretch tw-w-full hover:tw-bg-material-light-thin", disabled: isConnecting, ...props, children: [jsxRuntime.jsx("div", { className: "tw-flex tw-size-squid-xl tw-justify-center tw-items-center tw-aspect-square tw-rounded-xl tw-shadow-icon-light dark:tw-shadow-icon-dark", children: wallet.icon && (jsxRuntime.jsx("img", { src: wallet.icon, alt: wallet.name, className: "tw-size-full tw-rounded-xl" })) }), jsxRuntime.jsx("span", { className: "tw-flex tw-flex-col tw-justify-center tw-items-start tw-gap-2 tw-flex-1 tw-self-stretch tw-text-grey-200 tw-text-lg", children: wallet.name }), isConnecting ? (jsxRuntime.jsx(ui.Loader, { size: "20", className: "tw-text-grey-100" })) : (jsxRuntime.jsxs("div", { className: "tw-flex tw-items-center", children: [isInstalled && (jsxRuntime.jsx("div", { className: ui.cn("tw-flex tw-py-squid-s tw-flex-col tw-justify-center tw-items-end tw-self-stretch tw-text-material-light-thick tw-text-base tw-transition-transform tw-duration-200", showAsMultiChain && "group-hover/wallet:-tw-translate-x-1"), children: "Installed" })), showAsMultiChain && (jsxRuntime.jsx(ui.ChevronLargeRightIcon, { className: "tw-text-material-light-thick tw-transition-all tw-duration-200 tw-w-0 tw-opacity-0 group-hover/wallet:tw-w-4 group-hover/wallet:tw-opacity-100", size: "0.75rem" }))] }))] }) }));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function ViewContainer({ className, ...props }) {
|
|
116
|
+
return (jsxRuntime.jsx("section", { ...props, className: ui.cn("tw-flex tw-flex-col tw-items-center tw-flex-1 tw-self-stretch tw-border-t tw-border-grey-800 tw-py-1 tw-overflow-auto tw-h-full tw-scrollbar-hidden", className) }));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function getAugmentedNamespace(n) {
|
|
120
|
+
if (n.__esModule) return n;
|
|
121
|
+
var f = n.default;
|
|
122
|
+
if (typeof f == "function") {
|
|
123
|
+
var a = function a () {
|
|
124
|
+
if (this instanceof a) {
|
|
125
|
+
return Reflect.construct(f, arguments, this.constructor);
|
|
126
|
+
}
|
|
127
|
+
return f.apply(this, arguments);
|
|
128
|
+
};
|
|
129
|
+
a.prototype = f.prototype;
|
|
130
|
+
} else a = {};
|
|
131
|
+
Object.defineProperty(a, '__esModule', {value: true});
|
|
132
|
+
Object.keys(n).forEach(function (k) {
|
|
133
|
+
var d = Object.getOwnPropertyDescriptor(n, k);
|
|
134
|
+
Object.defineProperty(a, k, d.get ? d : {
|
|
135
|
+
enumerable: true,
|
|
136
|
+
get: function () {
|
|
137
|
+
return n[k];
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
return a;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
var dist = {};
|
|
145
|
+
|
|
146
|
+
var chains = {};
|
|
147
|
+
|
|
148
|
+
var hasRequiredChains;
|
|
149
|
+
|
|
150
|
+
function requireChains () {
|
|
151
|
+
if (hasRequiredChains) return chains;
|
|
152
|
+
hasRequiredChains = 1;
|
|
153
|
+
Object.defineProperty(chains, "__esModule", { value: true });
|
|
154
|
+
chains.CosmosChainFeatures = chains.NetworkIdentifier = chains.ChainName = chains.ChainType = void 0;
|
|
155
|
+
var ChainType;
|
|
156
|
+
(function (ChainType) {
|
|
157
|
+
ChainType["EVM"] = "evm";
|
|
158
|
+
ChainType["COSMOS"] = "cosmos";
|
|
159
|
+
ChainType["BTC"] = "bitcoin";
|
|
160
|
+
ChainType["SOLANA"] = "solana";
|
|
161
|
+
ChainType["SUI"] = "sui";
|
|
162
|
+
ChainType["XRPL"] = "xrpl";
|
|
163
|
+
ChainType["STELLAR"] = "stellar";
|
|
164
|
+
})(ChainType || (chains.ChainType = ChainType = {}));
|
|
165
|
+
var ChainName;
|
|
166
|
+
(function (ChainName) {
|
|
167
|
+
ChainName["ARBITRUM"] = "Arbitrum";
|
|
168
|
+
ChainName["ARBITRUM2"] = "arbitrum";
|
|
169
|
+
ChainName["AURORA"] = "aurora";
|
|
170
|
+
ChainName["AVALANCHE"] = "Avalanche";
|
|
171
|
+
ChainName["BASE"] = "base";
|
|
172
|
+
ChainName["BINANCE"] = "binance";
|
|
173
|
+
ChainName["CELO"] = "celo";
|
|
174
|
+
ChainName["CENTRIFUGE"] = "centrifuge";
|
|
175
|
+
ChainName["CITREA"] = "citrea";
|
|
176
|
+
ChainName["ETHEREUM"] = "Ethereum";
|
|
177
|
+
ChainName["ETHEREUM2"] = "Ethereum-2";
|
|
178
|
+
ChainName["FANTOM"] = "Fantom";
|
|
179
|
+
ChainName["FILECOIN"] = "filecoin";
|
|
180
|
+
ChainName["FILECOIN2"] = "filecoin-2";
|
|
181
|
+
ChainName["HEDERA"] = "hedera";
|
|
182
|
+
ChainName["IMMUTABLE_ZKEVM"] = "immutable";
|
|
183
|
+
ChainName["KAVA"] = "kava";
|
|
184
|
+
ChainName["MANTLE"] = "mantle";
|
|
185
|
+
ChainName["MANTRA"] = "mantra";
|
|
186
|
+
ChainName["MONAD"] = "monad";
|
|
187
|
+
ChainName["MOONBEAM"] = "Moonbeam";
|
|
188
|
+
ChainName["OPTIMISM"] = "optimism";
|
|
189
|
+
ChainName["POLYGON_ZKEVM"] = "polygon-zkevm";
|
|
190
|
+
ChainName["POLYGON"] = "Polygon";
|
|
191
|
+
ChainName["LINEA"] = "linea";
|
|
192
|
+
ChainName["SCROLL"] = "scroll";
|
|
193
|
+
ChainName["BLAST"] = "blast";
|
|
194
|
+
ChainName["FRAXTAL"] = "fraxtal";
|
|
195
|
+
ChainName["BERACHAIN"] = "berachain";
|
|
196
|
+
ChainName["GNOSIS"] = "gnosis";
|
|
197
|
+
ChainName["SONIC"] = "sonic";
|
|
198
|
+
ChainName["SONEIUM"] = "soneium";
|
|
199
|
+
ChainName["PEAQ"] = "peaq";
|
|
200
|
+
ChainName["HYPER_EVM"] = "hyper-evm";
|
|
201
|
+
ChainName["TEMPO"] = "tempo";
|
|
202
|
+
// Cosmos
|
|
203
|
+
ChainName["AGORIC"] = "agoric";
|
|
204
|
+
ChainName["ASSETMANTLE"] = "assetmantle";
|
|
205
|
+
ChainName["AXELARNET"] = "axelarnet";
|
|
206
|
+
ChainName["CARBON"] = "carbon";
|
|
207
|
+
ChainName["COMDEX"] = "comdex";
|
|
208
|
+
ChainName["COSMOS"] = "cosmoshub";
|
|
209
|
+
ChainName["CRESCENT"] = "crescent";
|
|
210
|
+
ChainName["EVMOS"] = "evmos";
|
|
211
|
+
ChainName["FETCH"] = "fetch";
|
|
212
|
+
ChainName["INJECTIVE"] = "injective";
|
|
213
|
+
ChainName["JUNO"] = "juno";
|
|
214
|
+
ChainName["KI"] = "ki";
|
|
215
|
+
ChainName["KUJIRA"] = "kujira";
|
|
216
|
+
ChainName["NEUTRON"] = "neutron";
|
|
217
|
+
ChainName["NOBLE"] = "noble";
|
|
218
|
+
ChainName["OSMOSIS"] = "osmosis";
|
|
219
|
+
ChainName["OSMOSIS7"] = "osmosis-7";
|
|
220
|
+
ChainName["REGEN"] = "regen";
|
|
221
|
+
ChainName["SEI"] = "sei";
|
|
222
|
+
ChainName["SECRETSNIP"] = "secret-snip";
|
|
223
|
+
ChainName["STARGAZE"] = "stargaze";
|
|
224
|
+
ChainName["STRIDE"] = "stride";
|
|
225
|
+
ChainName["TERRA2"] = "terra-2";
|
|
226
|
+
ChainName["UMEE"] = "umee";
|
|
227
|
+
ChainName["DYDX"] = "dydx";
|
|
228
|
+
ChainName["ACRECHAIN"] = "acre";
|
|
229
|
+
ChainName["ARCHWAY"] = "archway";
|
|
230
|
+
ChainName["BITCANNA"] = "bitcanna";
|
|
231
|
+
ChainName["BITSONG"] = "bitsong";
|
|
232
|
+
ChainName["CHEQD"] = "cheqd";
|
|
233
|
+
ChainName["CELESTIA"] = "celestia";
|
|
234
|
+
ChainName["COREUM"] = "coreum";
|
|
235
|
+
ChainName["DECENTR"] = "decentr";
|
|
236
|
+
ChainName["DESMOS"] = "desmos";
|
|
237
|
+
ChainName["DIG"] = "dig";
|
|
238
|
+
ChainName["DYMENSION"] = "dymension";
|
|
239
|
+
ChainName["IRISNET"] = "irisnet";
|
|
240
|
+
ChainName["IXO"] = "impacthub";
|
|
241
|
+
ChainName["JACKAL"] = "jackal";
|
|
242
|
+
ChainName["LUM"] = "lumnetwork";
|
|
243
|
+
ChainName["LIKECOIN"] = "likecoin";
|
|
244
|
+
ChainName["KAVA_IBC"] = "kava-ibc";
|
|
245
|
+
ChainName["NOLUS"] = "nolus";
|
|
246
|
+
ChainName["XPLA"] = "xpla";
|
|
247
|
+
ChainName["AKASH"] = "akash";
|
|
248
|
+
ChainName["CHIHUAHUA"] = "chihuahua";
|
|
249
|
+
ChainName["CRONOS"] = "cronos";
|
|
250
|
+
ChainName["GRAVITYBRIDGE"] = "gravitybridge";
|
|
251
|
+
ChainName["MARS"] = "mars";
|
|
252
|
+
ChainName["MIGALOO"] = "migaloo";
|
|
253
|
+
ChainName["PERSISTENCE"] = "persistence";
|
|
254
|
+
ChainName["OMNIFLIXHUB"] = "omniflixhub";
|
|
255
|
+
ChainName["QUICKSILVER"] = "quicksilver";
|
|
256
|
+
ChainName["SOMMELIER"] = "sommelier";
|
|
257
|
+
ChainName["TERRA"] = "terra";
|
|
258
|
+
ChainName["TERITORI"] = "teritori";
|
|
259
|
+
ChainName["SENTINEL"] = "sentinel";
|
|
260
|
+
ChainName["HUMANS"] = "humans";
|
|
261
|
+
ChainName["CHAIN4ENERGY"] = "c4e";
|
|
262
|
+
ChainName["SAGA"] = "saga";
|
|
263
|
+
ChainName["NIBIRU"] = "nibiru";
|
|
264
|
+
ChainName["LAVA"] = "lava";
|
|
265
|
+
ChainName["KYVE"] = "kyve";
|
|
266
|
+
ChainName["XION"] = "xion";
|
|
267
|
+
ChainName["SAGA_HUB"] = "hub";
|
|
268
|
+
ChainName["SAGA_DEX"] = "saga_evm";
|
|
269
|
+
ChainName["SAGA_MARIA"] = "maria";
|
|
270
|
+
ChainName["SAGA_NIRVANA"] = "nirvana";
|
|
271
|
+
ChainName["SAGA_FLIPPANDO"] = "flippandomainnet";
|
|
272
|
+
ChainName["SAGA_SOUNDMONEY"] = "soundmoney";
|
|
273
|
+
ChainName["SAGA_NGMI"] = "ngmi";
|
|
274
|
+
ChainName["SAGA_DCHAIN"] = "dchain";
|
|
275
|
+
ChainName["ELYS"] = "elys";
|
|
276
|
+
ChainName["ALLORA"] = "allora";
|
|
277
|
+
ChainName["BABYLON"] = "babylon";
|
|
278
|
+
// BTC
|
|
279
|
+
ChainName["BITCOIN"] = "bitcoin";
|
|
280
|
+
// SOL
|
|
281
|
+
ChainName["SOLANA"] = "solana";
|
|
282
|
+
// SUI
|
|
283
|
+
ChainName["SUI"] = "sui";
|
|
284
|
+
// XRPL
|
|
285
|
+
ChainName["XRPL"] = "xrpl";
|
|
286
|
+
ChainName["XRPL_EVM"] = "xrpl-evm";
|
|
287
|
+
// STELLAR
|
|
288
|
+
ChainName["STELLAR"] = "stellar";
|
|
289
|
+
// TESTNETS
|
|
290
|
+
ChainName["ETHEREUM_SEPOLIA"] = "ethereum-sepolia";
|
|
291
|
+
ChainName["SUI_TESTNET"] = "sui-testnet";
|
|
292
|
+
ChainName["STELLAR_TESTNET"] = "stellar-testnet";
|
|
293
|
+
})(ChainName || (chains.ChainName = ChainName = {}));
|
|
294
|
+
var NetworkIdentifier;
|
|
295
|
+
(function (NetworkIdentifier) {
|
|
296
|
+
// EVM
|
|
297
|
+
NetworkIdentifier["ETHEREUM"] = "ethereum";
|
|
298
|
+
NetworkIdentifier["AVALANCHE"] = "avalanche";
|
|
299
|
+
NetworkIdentifier["ARBITRUM"] = "arbitrum";
|
|
300
|
+
NetworkIdentifier["AURORA"] = "aurora";
|
|
301
|
+
NetworkIdentifier["BASE"] = "base";
|
|
302
|
+
NetworkIdentifier["BINANCE"] = "binance";
|
|
303
|
+
NetworkIdentifier["CELO"] = "celo";
|
|
304
|
+
NetworkIdentifier["CITREA"] = "citrea";
|
|
305
|
+
NetworkIdentifier["FANTOM"] = "fantom";
|
|
306
|
+
NetworkIdentifier["FILECOIN"] = "filecoin";
|
|
307
|
+
NetworkIdentifier["HEDERA"] = "hedera";
|
|
308
|
+
NetworkIdentifier["IMMUTABLE_ZKEVM"] = "immutable";
|
|
309
|
+
NetworkIdentifier["KAVA"] = "kava";
|
|
310
|
+
NetworkIdentifier["MANTLE"] = "mantle";
|
|
311
|
+
NetworkIdentifier["MANTRA"] = "mantra";
|
|
312
|
+
NetworkIdentifier["MONAD"] = "monad";
|
|
313
|
+
NetworkIdentifier["MOONBEAM"] = "moonbeam";
|
|
314
|
+
NetworkIdentifier["OPTIMISM"] = "optimism";
|
|
315
|
+
NetworkIdentifier["POLYGON"] = "polygon";
|
|
316
|
+
NetworkIdentifier["LINEA"] = "linea";
|
|
317
|
+
NetworkIdentifier["SCROLL"] = "scroll";
|
|
318
|
+
NetworkIdentifier["BLAST"] = "blast";
|
|
319
|
+
NetworkIdentifier["FRAXTAL"] = "fraxtal";
|
|
320
|
+
NetworkIdentifier["BERACHAIN"] = "berachain";
|
|
321
|
+
NetworkIdentifier["GNOSIS"] = "gnosis";
|
|
322
|
+
NetworkIdentifier["SONIC"] = "sonic";
|
|
323
|
+
NetworkIdentifier["SONEIUM"] = "soneium";
|
|
324
|
+
NetworkIdentifier["PEAQ"] = "peaq";
|
|
325
|
+
NetworkIdentifier["HYPER_EVM"] = "hyper-evm";
|
|
326
|
+
NetworkIdentifier["TEMPO"] = "tempo";
|
|
327
|
+
// COSMOS
|
|
328
|
+
NetworkIdentifier["AGORIC"] = "agoric";
|
|
329
|
+
NetworkIdentifier["ASSETMANTLE"] = "assetmantle";
|
|
330
|
+
NetworkIdentifier["AXELAR"] = "axelar";
|
|
331
|
+
NetworkIdentifier["AXELARNET"] = "axelarnet";
|
|
332
|
+
NetworkIdentifier["CARBON"] = "carbon";
|
|
333
|
+
NetworkIdentifier["COMDEX"] = "comdex";
|
|
334
|
+
NetworkIdentifier["COSMOS"] = "cosmoshub";
|
|
335
|
+
NetworkIdentifier["CRESCENT"] = "crescent";
|
|
336
|
+
NetworkIdentifier["EVMOS"] = "evmos";
|
|
337
|
+
NetworkIdentifier["FETCH"] = "fetch";
|
|
338
|
+
NetworkIdentifier["INJECTIVE"] = "injective";
|
|
339
|
+
NetworkIdentifier["JUNO"] = "juno";
|
|
340
|
+
NetworkIdentifier["KI"] = "ki";
|
|
341
|
+
NetworkIdentifier["KUJIRA"] = "kujira";
|
|
342
|
+
NetworkIdentifier["NOBLE"] = "noble";
|
|
343
|
+
NetworkIdentifier["NEUTRON"] = "neutron";
|
|
344
|
+
NetworkIdentifier["OSMOSIS"] = "osmosis";
|
|
345
|
+
NetworkIdentifier["REGEN"] = "regen";
|
|
346
|
+
NetworkIdentifier["SEI"] = "sei";
|
|
347
|
+
NetworkIdentifier["SECRETSNIP"] = "secret-snip";
|
|
348
|
+
NetworkIdentifier["STARGAZE"] = "stargaze";
|
|
349
|
+
NetworkIdentifier["STRIDE"] = "stride";
|
|
350
|
+
NetworkIdentifier["TERRA2"] = "terra-2";
|
|
351
|
+
NetworkIdentifier["UMEE"] = "umee";
|
|
352
|
+
NetworkIdentifier["DYDX"] = "dydx";
|
|
353
|
+
NetworkIdentifier["ACRECHAIN"] = "acre";
|
|
354
|
+
NetworkIdentifier["ARCHWAY"] = "archway";
|
|
355
|
+
NetworkIdentifier["BITCANNA"] = "bitcanna";
|
|
356
|
+
NetworkIdentifier["BITSONG"] = "bitsong";
|
|
357
|
+
NetworkIdentifier["CHEQD"] = "cheqd";
|
|
358
|
+
NetworkIdentifier["CELESTIA"] = "celestia";
|
|
359
|
+
NetworkIdentifier["COREUM"] = "coreum";
|
|
360
|
+
NetworkIdentifier["DECENTR"] = "decentr";
|
|
361
|
+
NetworkIdentifier["DESMOS"] = "desmos";
|
|
362
|
+
NetworkIdentifier["DYMENSION"] = "dymension";
|
|
363
|
+
NetworkIdentifier["IRISNET"] = "irisnet";
|
|
364
|
+
NetworkIdentifier["IXO"] = "impacthub";
|
|
365
|
+
NetworkIdentifier["JACKAL"] = "jackal";
|
|
366
|
+
NetworkIdentifier["LUM"] = "lumnetwork";
|
|
367
|
+
NetworkIdentifier["LIKECOIN"] = "likecoin";
|
|
368
|
+
NetworkIdentifier["KAVA_IBC"] = "kava-ibc";
|
|
369
|
+
NetworkIdentifier["NOLUS"] = "nolus";
|
|
370
|
+
NetworkIdentifier["XPLA"] = "xpla";
|
|
371
|
+
NetworkIdentifier["AKASH"] = "akash";
|
|
372
|
+
NetworkIdentifier["CHIHUAHUA"] = "chihuahua";
|
|
373
|
+
NetworkIdentifier["CRONOS"] = "cronos";
|
|
374
|
+
NetworkIdentifier["GRAVITYBRIDGE"] = "gravitybridge";
|
|
375
|
+
NetworkIdentifier["MARS"] = "mars";
|
|
376
|
+
NetworkIdentifier["MIGALOO"] = "migaloo";
|
|
377
|
+
NetworkIdentifier["PERSISTENCE"] = "persistence";
|
|
378
|
+
NetworkIdentifier["OMNIFLIXHUB"] = "omniflixhub";
|
|
379
|
+
NetworkIdentifier["QUICKSILVER"] = "quicksilver";
|
|
380
|
+
NetworkIdentifier["SOMMELIER"] = "sommelier";
|
|
381
|
+
NetworkIdentifier["TERRA"] = "terra";
|
|
382
|
+
NetworkIdentifier["TERITORI"] = "teritori";
|
|
383
|
+
NetworkIdentifier["SENTINEL"] = "sentinel";
|
|
384
|
+
NetworkIdentifier["HUMANS"] = "humans";
|
|
385
|
+
NetworkIdentifier["CHAIN4ENERGY"] = "c4e";
|
|
386
|
+
NetworkIdentifier["SAGA"] = "saga";
|
|
387
|
+
NetworkIdentifier["NIBIRU"] = "nibiru";
|
|
388
|
+
NetworkIdentifier["LAVA"] = "lava";
|
|
389
|
+
NetworkIdentifier["KYVE"] = "kyve";
|
|
390
|
+
NetworkIdentifier["XION"] = "xion";
|
|
391
|
+
NetworkIdentifier["SAGA_HUB"] = "hub";
|
|
392
|
+
NetworkIdentifier["SAGA_DEX"] = "saga_evm";
|
|
393
|
+
NetworkIdentifier["SAGA_MARIA"] = "maria";
|
|
394
|
+
NetworkIdentifier["SAGA_NIRVANA"] = "nirvana";
|
|
395
|
+
NetworkIdentifier["SAGA_FLIPPANDO"] = "flippandomainnet";
|
|
396
|
+
NetworkIdentifier["SAGA_SOUNDMONEY"] = "soundmoney";
|
|
397
|
+
NetworkIdentifier["SAGA_NGMI"] = "ngmi";
|
|
398
|
+
NetworkIdentifier["SAGA_DCHAIN"] = "dchain";
|
|
399
|
+
NetworkIdentifier["ELYS"] = "elys";
|
|
400
|
+
NetworkIdentifier["ALLORA"] = "allora";
|
|
401
|
+
NetworkIdentifier["BABYLON"] = "babylon";
|
|
402
|
+
// BTC
|
|
403
|
+
NetworkIdentifier["BITCOIN"] = "bitcoin";
|
|
404
|
+
// SOL
|
|
405
|
+
NetworkIdentifier["SOLANA"] = "solana";
|
|
406
|
+
// SUI
|
|
407
|
+
NetworkIdentifier["SUI"] = "sui";
|
|
408
|
+
// XRPL
|
|
409
|
+
NetworkIdentifier["XRPL"] = "xrpl";
|
|
410
|
+
NetworkIdentifier["XRPL_EVM"] = "xrpl-evm";
|
|
411
|
+
// STELLAR
|
|
412
|
+
NetworkIdentifier["STELLAR"] = "stellar";
|
|
413
|
+
// TESTNETS
|
|
414
|
+
NetworkIdentifier["ETHEREUM_SEPOLIA"] = "ethereum-sepolia";
|
|
415
|
+
NetworkIdentifier["SUI_TESTNET"] = "sui-testnet";
|
|
416
|
+
NetworkIdentifier["XRPL_TESTNET"] = "xrpl-testnet";
|
|
417
|
+
NetworkIdentifier["XRPL_EVM_TESTNET"] = "xrpl-evm-testnet";
|
|
418
|
+
NetworkIdentifier["STELLAR_TESTNET"] = "stellar-testnet";
|
|
419
|
+
})(NetworkIdentifier || (chains.NetworkIdentifier = NetworkIdentifier = {}));
|
|
420
|
+
var CosmosChainFeatures;
|
|
421
|
+
(function (CosmosChainFeatures) {
|
|
422
|
+
CosmosChainFeatures["PACKET_FORWARD_MIDDLEWARE"] = "packet-forward-middleware";
|
|
423
|
+
CosmosChainFeatures["LEGACY_IBC"] = "legacy-ibc";
|
|
424
|
+
CosmosChainFeatures["COSMWASM"] = "cosmwasm";
|
|
425
|
+
})(CosmosChainFeatures || (chains.CosmosChainFeatures = CosmosChainFeatures = {}));
|
|
426
|
+
|
|
427
|
+
return chains;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
var bridges = {};
|
|
431
|
+
|
|
432
|
+
var hasRequiredBridges;
|
|
433
|
+
|
|
434
|
+
function requireBridges () {
|
|
435
|
+
if (hasRequiredBridges) return bridges;
|
|
436
|
+
hasRequiredBridges = 1;
|
|
437
|
+
Object.defineProperty(bridges, "__esModule", { value: true });
|
|
438
|
+
bridges.BridgeProvider = bridges.BridgeType = void 0;
|
|
439
|
+
var BridgeType;
|
|
440
|
+
(function (BridgeType) {
|
|
441
|
+
BridgeType["AXELAR_GMP"] = "axelar-gmp";
|
|
442
|
+
BridgeType["AXELAR_ITS"] = "axelar-its";
|
|
443
|
+
BridgeType["CCTP"] = "cctp";
|
|
444
|
+
BridgeType["NOBLE_CCTP"] = "noble-cctp";
|
|
445
|
+
BridgeType["IBC"] = "ibc";
|
|
446
|
+
BridgeType["CHAINFLIP"] = "chainflip";
|
|
447
|
+
BridgeType["RFQ"] = "rfq";
|
|
448
|
+
BridgeType["ITB"] = "immutable-token-bridge";
|
|
449
|
+
BridgeType["CORAL_V2"] = "coral-v2";
|
|
450
|
+
})(BridgeType || (bridges.BridgeType = BridgeType = {}));
|
|
451
|
+
var BridgeProvider;
|
|
452
|
+
(function (BridgeProvider) {
|
|
453
|
+
BridgeProvider["AXELAR"] = "Axelar";
|
|
454
|
+
BridgeProvider["CCTP"] = "CCTP";
|
|
455
|
+
BridgeProvider["NOBLE_CCTP"] = "Noble CCTP";
|
|
456
|
+
BridgeProvider["IBC"] = "IBC";
|
|
457
|
+
BridgeProvider["PFM"] = "IBC Packet forward middleware";
|
|
458
|
+
BridgeProvider["CHAINFLIP"] = "Chainflip";
|
|
459
|
+
BridgeProvider["RFQ"] = "Squid Intents";
|
|
460
|
+
BridgeProvider["IMMUTABLE"] = "Immutable";
|
|
461
|
+
})(BridgeProvider || (bridges.BridgeProvider = BridgeProvider = {}));
|
|
462
|
+
|
|
463
|
+
return bridges;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
var dexes = {};
|
|
467
|
+
|
|
468
|
+
var hasRequiredDexes;
|
|
469
|
+
|
|
470
|
+
function requireDexes () {
|
|
471
|
+
if (hasRequiredDexes) return dexes;
|
|
472
|
+
hasRequiredDexes = 1;
|
|
473
|
+
Object.defineProperty(dexes, "__esModule", { value: true });
|
|
474
|
+
dexes.DexType = dexes.DexName = void 0;
|
|
475
|
+
// identifiers for dexes
|
|
476
|
+
var DexName;
|
|
477
|
+
(function (DexName) {
|
|
478
|
+
DexName["AGNI_V3"] = "Agni V3";
|
|
479
|
+
DexName["AERODROME_SOLIDLY"] = "Aerodrome Solidly";
|
|
480
|
+
DexName["AERODROME_V3"] = "Aerodrome V3";
|
|
481
|
+
DexName["APESWAP_V2"] = "Apeswap V2";
|
|
482
|
+
DexName["APESWAP_V3"] = "Apeswap V3";
|
|
483
|
+
DexName["ASTROPORT"] = "Astroport";
|
|
484
|
+
DexName["BALANCER_V2"] = "Balancer V2";
|
|
485
|
+
DexName["BASESWAP_V2"] = "Baseswap V2";
|
|
486
|
+
DexName["BASESWAP_V3"] = "Baseswap V3";
|
|
487
|
+
DexName["BEAMSWAP_V2"] = "Beamswap V2";
|
|
488
|
+
DexName["BEAMSWAP_V3"] = "Beamswap V3";
|
|
489
|
+
DexName["BEAMSWAP_SADDLE"] = "Beamswap Saddle";
|
|
490
|
+
DexName["BEETS_V2"] = "Beets V2";
|
|
491
|
+
DexName["CAMELOT_V2"] = "Camelot V2";
|
|
492
|
+
DexName["CAMELOT_V3"] = "Camelot V3";
|
|
493
|
+
DexName["CURVE_V2"] = "Curve V2";
|
|
494
|
+
DexName["ELLIPSIS"] = "Ellipsis";
|
|
495
|
+
DexName["EQUILIBRE"] = "Equilibre";
|
|
496
|
+
DexName["EQUALIZER"] = "Equalizer";
|
|
497
|
+
DexName["ETHEREX_V3"] = "Etherex V3";
|
|
498
|
+
DexName["FRAXSWAP_V2"] = "Fraxswap V2";
|
|
499
|
+
DexName["FUSIONX_V2"] = "FusionX V2";
|
|
500
|
+
DexName["FUSIONX_V3"] = "FusionX V3";
|
|
501
|
+
DexName["GLIQUID_V4"] = "Gliquid V4";
|
|
502
|
+
DexName["GMX"] = "GMX";
|
|
503
|
+
DexName["HONEYSWAP_V2"] = "Honeyswap V2";
|
|
504
|
+
DexName["HORIZON_V2"] = "Horizon V2";
|
|
505
|
+
DexName["HORIZON_V3"] = "Horizon V3";
|
|
506
|
+
DexName["HYBRA_V2"] = "Hybra V2";
|
|
507
|
+
DexName["HYBRA_V3"] = "Hybra V3";
|
|
508
|
+
DexName["HYPERSWAP_V2"] = "Hyperswap V2";
|
|
509
|
+
DexName["HYPERSWAP_V3"] = "Hyperswap V3";
|
|
510
|
+
DexName["JUICESWAP"] = "JuiceSwap";
|
|
511
|
+
DexName["KYBERSWAP"] = "KyberSwap";
|
|
512
|
+
DexName["KYBERSWAP_AGGREGATOR"] = "kyberswap Aggregator";
|
|
513
|
+
DexName["KYO_V2"] = "Kyo V2";
|
|
514
|
+
DexName["KYO_V3"] = "Kyo V3";
|
|
515
|
+
DexName["KINETIX_V3"] = "Kinetix V3";
|
|
516
|
+
DexName["KITTENSWAP_V2"] = "Kittenswap V2";
|
|
517
|
+
DexName["KITTENSWAP_V3"] = "Kittenswap V3";
|
|
518
|
+
DexName["KODIAK_V3"] = "Kodiak V3";
|
|
519
|
+
DexName["LAMINAR_V3"] = "Laminar V3";
|
|
520
|
+
DexName["LYNEX_V3"] = "Lynex V3";
|
|
521
|
+
DexName["LOTUS_V3"] = "Lotus V3";
|
|
522
|
+
DexName["MACHINE_X_V3"] = "MachineX V3";
|
|
523
|
+
DexName["MENTO_V2"] = "Mento V2";
|
|
524
|
+
DexName["MOAI_V3"] = "Moai V3";
|
|
525
|
+
DexName["NILE_SOLIDLY"] = "Nile Solidly";
|
|
526
|
+
DexName["NILE_V3"] = "Nile V3";
|
|
527
|
+
DexName["OKU_V2"] = "Oku V2";
|
|
528
|
+
DexName["OPENOCEAN"] = "OpenOcean";
|
|
529
|
+
DexName["OSMOSIS"] = "Osmosis";
|
|
530
|
+
DexName["OKU_V3"] = "Oku V3";
|
|
531
|
+
DexName["PANCAKESWAP_V2"] = "Pancakeswap V2";
|
|
532
|
+
DexName["PANCAKESWAP_V3"] = "Pancakeswap V3";
|
|
533
|
+
DexName["PANCAKESWAP_STABLE"] = "Pancakeswap Stable";
|
|
534
|
+
DexName["PANGOLIN_V2"] = "Pangolin V2";
|
|
535
|
+
DexName["PHARAOH_SOLIDLY"] = "Pharaoh Solidly";
|
|
536
|
+
DexName["PHARAOH_V3"] = "Pharaoh V3";
|
|
537
|
+
DexName["PLATYPUS"] = "Platypus";
|
|
538
|
+
DexName["PRINTR"] = "Printr";
|
|
539
|
+
DexName["PROJECT_X_V3"] = "Project X V3";
|
|
540
|
+
DexName["QUICKSWAP_V2"] = "Quickswap V2";
|
|
541
|
+
DexName["QUICKSWAP_V3"] = "Quickswap V3";
|
|
542
|
+
DexName["RAMSES_SOLIDLY"] = "Ramses Solidly";
|
|
543
|
+
DexName["RA_V3"] = "Ra V3";
|
|
544
|
+
DexName["RAMSES_V3"] = "Ramses V3";
|
|
545
|
+
DexName["SATSUMA"] = "Satsuma";
|
|
546
|
+
DexName["SAUCERSWAP_V2"] = "Saucerswap V2";
|
|
547
|
+
DexName["SHADOW_V2"] = "Shadow V2";
|
|
548
|
+
DexName["SHADOW_V3"] = "Shadow V3";
|
|
549
|
+
DexName["SONEX_V3"] = "Sonex V3";
|
|
550
|
+
DexName["SPOOKYSWAP_V2"] = "Spookyswap V2";
|
|
551
|
+
DexName["STELLASWAP_V2"] = "Stellaswap V2";
|
|
552
|
+
DexName["STELLASWAP_V3"] = "Stellaswap V3";
|
|
553
|
+
DexName["STELLASWAP_V4"] = "Stellaswap V4";
|
|
554
|
+
DexName["STELLASWAP_SADDLE"] = "Stellaswap Saddle";
|
|
555
|
+
DexName["SURGE_V3"] = "Surge V3";
|
|
556
|
+
DexName["SUSHISWAP_V2"] = "Sushiswap V2";
|
|
557
|
+
DexName["SUSHISWAP_V3"] = "Sushiswap V3";
|
|
558
|
+
DexName["SWAPBASED_V2"] = "Swapbased V2";
|
|
559
|
+
DexName["SYNTHSWAP_V2"] = "SynthSwap V2";
|
|
560
|
+
DexName["SYNTHSWAP_V3"] = "SynthSwap V3";
|
|
561
|
+
DexName["SKYDROME"] = "Skydrome";
|
|
562
|
+
DexName["SWAPR_V3"] = "Swapr V3";
|
|
563
|
+
DexName["THENA_SOLIDLY"] = "Thena Solidly";
|
|
564
|
+
DexName["THENA_V3"] = "Thena V3";
|
|
565
|
+
DexName["TRADERJOE_V2"] = "Trader Joe V2";
|
|
566
|
+
DexName["TRADERJOE_V21"] = "Trader Joe V2.1";
|
|
567
|
+
DexName["TRADERJOE_V22"] = "Trader Joe V2.2";
|
|
568
|
+
DexName["TRIDENT"] = "Trident";
|
|
569
|
+
DexName["THRUSTER_V3"] = "Thruster V3";
|
|
570
|
+
DexName["THRUSTER_V2"] = "Thruster V2";
|
|
571
|
+
DexName["UBESWAP_V2"] = "Ubeswap V2";
|
|
572
|
+
DexName["UBESWAP_V3"] = "Ubeswap V3";
|
|
573
|
+
DexName["UNISWAP_V2"] = "Uniswap V2";
|
|
574
|
+
DexName["UNISWAP_V3"] = "Uniswap V3";
|
|
575
|
+
DexName["WAGMI_V3"] = "Wagmi V3";
|
|
576
|
+
DexName["WIGOSWAP_V2"] = "Wigoswap V2";
|
|
577
|
+
DexName["WOMBAT"] = "Wombat";
|
|
578
|
+
DexName["VELODROME_SOLIDLY"] = "Velodrome Solidly";
|
|
579
|
+
DexName["VELODROME_V2"] = "Velodrome V2";
|
|
580
|
+
DexName["VELODROME_V3"] = "Velodrome V3";
|
|
581
|
+
DexName["VELOCIMETER"] = "Velocimeter";
|
|
582
|
+
DexName["ZYBERSWAP_V2"] = "Zyberswap V2";
|
|
583
|
+
DexName["ZYBERSWAP_V3"] = "Zyberswap V3";
|
|
584
|
+
})(DexName || (dexes.DexName = DexName = {}));
|
|
585
|
+
// identifiers dex adapters
|
|
586
|
+
var DexType;
|
|
587
|
+
(function (DexType) {
|
|
588
|
+
// EVM
|
|
589
|
+
DexType["ALGEBRA"] = "algebra";
|
|
590
|
+
DexType["ALGEBRA_V4"] = "algebra-v4";
|
|
591
|
+
DexType["BALANCER_V2"] = "balancer-v2";
|
|
592
|
+
DexType["CURVE"] = "curve";
|
|
593
|
+
DexType["GMX"] = "gmx";
|
|
594
|
+
DexType["KYBERSWAP_ELASTIC"] = "kyberswap-elastic";
|
|
595
|
+
DexType["PLATYPUS"] = "platypus";
|
|
596
|
+
DexType["PANCAKESWAP_STABLE"] = "pancakeswap-stable";
|
|
597
|
+
DexType["PRINTR"] = "printr";
|
|
598
|
+
DexType["SADDLE"] = "saddle";
|
|
599
|
+
DexType["SLIPSTREAM"] = "slipstream";
|
|
600
|
+
DexType["SOLIDLY"] = "solidly";
|
|
601
|
+
DexType["TRADERJOE_V21"] = "traderjoe-v21";
|
|
602
|
+
DexType["TRADERJOE_V22"] = "traderjoe-v22";
|
|
603
|
+
DexType["TRIDENT"] = "trident";
|
|
604
|
+
DexType["WOMBAT"] = "wombat";
|
|
605
|
+
DexType["UNISWAP_V2"] = "uniswap-v2";
|
|
606
|
+
DexType["UNISWAP_V3"] = "uniswap-v3";
|
|
607
|
+
DexType["MENTO_V2"] = "mento-v2";
|
|
608
|
+
// COSMOS
|
|
609
|
+
DexType["OSMOSIS"] = "osmosis";
|
|
610
|
+
DexType["ASTROPORT"] = "astroport";
|
|
611
|
+
// ONCE WE START ADDING DEXES WE WILL BE MOVING THEM ABOVE
|
|
612
|
+
/*
|
|
613
|
+
DUALITY = "Duality",
|
|
614
|
+
*/
|
|
615
|
+
})(DexType || (dexes.DexType = DexType = {}));
|
|
616
|
+
|
|
617
|
+
return dexes;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
var errors = {};
|
|
621
|
+
|
|
622
|
+
var hasRequiredErrors;
|
|
623
|
+
|
|
624
|
+
function requireErrors () {
|
|
625
|
+
if (hasRequiredErrors) return errors;
|
|
626
|
+
hasRequiredErrors = 1;
|
|
627
|
+
Object.defineProperty(errors, "__esModule", { value: true });
|
|
628
|
+
errors.ErrorType = void 0;
|
|
629
|
+
var ErrorType;
|
|
630
|
+
(function (ErrorType) {
|
|
631
|
+
ErrorType["SCHEMA_VALIDATION_ERROR"] = "SCHEMA_VALIDATION_ERROR";
|
|
632
|
+
ErrorType["PATH_FINDER_ERROR"] = "PATH_FINDER_ERROR";
|
|
633
|
+
ErrorType["QUOTE_ERROR"] = "QUOTE_ERROR";
|
|
634
|
+
ErrorType["ROUTE_ERROR"] = "ROUTE_ERROR";
|
|
635
|
+
ErrorType["BAD_REQUEST"] = "BAD_REQUEST";
|
|
636
|
+
ErrorType["UNKNOWN_ERROR"] = "UNKNOWN_ERROR";
|
|
637
|
+
ErrorType["RATE_LIMIT"] = "RATE_LIMIT";
|
|
638
|
+
ErrorType["MAINTENANCE"] = "MAINTENANCE";
|
|
639
|
+
ErrorType["UNAUTHORIZED"] = "UNAUTHORIZED";
|
|
640
|
+
ErrorType["INTERNAL_ERROR"] = "INTERNAL_ERROR";
|
|
641
|
+
})(ErrorType || (errors.ErrorType = ErrorType = {}));
|
|
642
|
+
|
|
643
|
+
return errors;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
var tokens = {};
|
|
647
|
+
|
|
648
|
+
var hasRequiredTokens;
|
|
649
|
+
|
|
650
|
+
function requireTokens () {
|
|
651
|
+
if (hasRequiredTokens) return tokens;
|
|
652
|
+
hasRequiredTokens = 1;
|
|
653
|
+
Object.defineProperty(tokens, "__esModule", { value: true });
|
|
654
|
+
tokens.Volatility = void 0;
|
|
655
|
+
var Volatility;
|
|
656
|
+
(function (Volatility) {
|
|
657
|
+
Volatility[Volatility["SUPER_STABLE"] = 0] = "SUPER_STABLE";
|
|
658
|
+
Volatility[Volatility["STABLE"] = 1] = "STABLE";
|
|
659
|
+
Volatility[Volatility["HIGH_CAP"] = 2] = "HIGH_CAP";
|
|
660
|
+
Volatility[Volatility["VOLATILE"] = 3] = "VOLATILE";
|
|
661
|
+
})(Volatility || (tokens.Volatility = Volatility = {}));
|
|
662
|
+
|
|
663
|
+
return tokens;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
var fees = {};
|
|
667
|
+
|
|
668
|
+
var hasRequiredFees;
|
|
669
|
+
|
|
670
|
+
function requireFees () {
|
|
671
|
+
if (hasRequiredFees) return fees;
|
|
672
|
+
hasRequiredFees = 1;
|
|
673
|
+
Object.defineProperty(fees, "__esModule", { value: true });
|
|
674
|
+
fees.GasCostType = fees.FeeType = void 0;
|
|
675
|
+
var FeeType;
|
|
676
|
+
(function (FeeType) {
|
|
677
|
+
FeeType["AXELAR_FEE"] = "Axelar fee";
|
|
678
|
+
FeeType["GAS_RECEIVER_FEE"] = "Gas receiver fee";
|
|
679
|
+
FeeType["BOOST_FEE"] = "Boost fee";
|
|
680
|
+
FeeType["INTEGRATOR_FEE"] = "Integrator fee";
|
|
681
|
+
FeeType["CHAINFLIP_FEE"] = "Chainflip fee";
|
|
682
|
+
FeeType["EXECUTION_FEE"] = "Execution fee";
|
|
683
|
+
FeeType["SETTLEMENT_FEE"] = "Settlement fee";
|
|
684
|
+
FeeType["SERVICE_FEE"] = "Service fee";
|
|
685
|
+
})(FeeType || (fees.FeeType = FeeType = {}));
|
|
686
|
+
var GasCostType;
|
|
687
|
+
(function (GasCostType) {
|
|
688
|
+
GasCostType["EXECUTE_CALL"] = "executeCall";
|
|
689
|
+
GasCostType["JITO_TIP_FEE"] = "jitoTipFee";
|
|
690
|
+
})(GasCostType || (fees.GasCostType = GasCostType = {}));
|
|
691
|
+
|
|
692
|
+
return fees;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
var quote = {};
|
|
696
|
+
|
|
697
|
+
var hasRequiredQuote;
|
|
698
|
+
|
|
699
|
+
function requireQuote () {
|
|
700
|
+
if (hasRequiredQuote) return quote;
|
|
701
|
+
hasRequiredQuote = 1;
|
|
702
|
+
Object.defineProperty(quote, "__esModule", { value: true });
|
|
703
|
+
|
|
704
|
+
return quote;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
var routes = {};
|
|
708
|
+
|
|
709
|
+
var hasRequiredRoutes;
|
|
710
|
+
|
|
711
|
+
function requireRoutes () {
|
|
712
|
+
if (hasRequiredRoutes) return routes;
|
|
713
|
+
hasRequiredRoutes = 1;
|
|
714
|
+
Object.defineProperty(routes, "__esModule", { value: true });
|
|
715
|
+
routes.ActionStage = routes.FEES_ENUM = routes.ActionType = void 0;
|
|
716
|
+
var ActionType;
|
|
717
|
+
(function (ActionType) {
|
|
718
|
+
ActionType["SWAP"] = "swap";
|
|
719
|
+
ActionType["WRAP"] = "wrap";
|
|
720
|
+
ActionType["BRIDGE"] = "bridge";
|
|
721
|
+
ActionType["IBC_TRANSFER"] = "ibc-transfer";
|
|
722
|
+
ActionType["CUSTOM"] = "custom";
|
|
723
|
+
ActionType["FEE"] = "fee";
|
|
724
|
+
ActionType["RFQ"] = "rfq";
|
|
725
|
+
})(ActionType || (routes.ActionType = ActionType = {}));
|
|
726
|
+
var FEES_ENUM;
|
|
727
|
+
(function (FEES_ENUM) {
|
|
728
|
+
FEES_ENUM["PLATFORM"] = "PLATFORM";
|
|
729
|
+
FEES_ENUM["INTEGRATOR"] = "INTEGRATOR";
|
|
730
|
+
FEES_ENUM["CHAIN"] = "CHAIN";
|
|
731
|
+
FEES_ENUM["TOKEN"] = "TOKEN";
|
|
732
|
+
FEES_ENUM["TIER"] = "TIER";
|
|
733
|
+
})(FEES_ENUM || (routes.FEES_ENUM = FEES_ENUM = {}));
|
|
734
|
+
var ActionStage;
|
|
735
|
+
(function (ActionStage) {
|
|
736
|
+
ActionStage[ActionStage["EVM_SOURCE"] = 0] = "EVM_SOURCE";
|
|
737
|
+
ActionStage[ActionStage["EVM_DESTINATION"] = 1] = "EVM_DESTINATION";
|
|
738
|
+
ActionStage[ActionStage["EVM_TRANSIENT"] = 2] = "EVM_TRANSIENT";
|
|
739
|
+
ActionStage[ActionStage["EVM_ONLY"] = 3] = "EVM_ONLY";
|
|
740
|
+
ActionStage[ActionStage["COSMOS_SOURCE"] = 4] = "COSMOS_SOURCE";
|
|
741
|
+
ActionStage[ActionStage["COSMOS_DESTINATION"] = 5] = "COSMOS_DESTINATION";
|
|
742
|
+
ActionStage[ActionStage["COSMOS_TRANSIENT"] = 6] = "COSMOS_TRANSIENT";
|
|
743
|
+
ActionStage[ActionStage["COSMOS_ONLY"] = 7] = "COSMOS_ONLY";
|
|
744
|
+
ActionStage[ActionStage["BTC_SOURCE"] = 8] = "BTC_SOURCE";
|
|
745
|
+
ActionStage[ActionStage["BTC_DESTINATION"] = 9] = "BTC_DESTINATION";
|
|
746
|
+
ActionStage[ActionStage["SOLANA_SOURCE"] = 10] = "SOLANA_SOURCE";
|
|
747
|
+
ActionStage[ActionStage["SOLANA_DESTINATION"] = 11] = "SOLANA_DESTINATION";
|
|
748
|
+
ActionStage[ActionStage["SOLANA_ONLY"] = 12] = "SOLANA_ONLY";
|
|
749
|
+
ActionStage[ActionStage["SUI_SOURCE"] = 13] = "SUI_SOURCE";
|
|
750
|
+
ActionStage[ActionStage["SUI_DESTINATION"] = 14] = "SUI_DESTINATION";
|
|
751
|
+
ActionStage[ActionStage["XRPL_SOURCE"] = 15] = "XRPL_SOURCE";
|
|
752
|
+
ActionStage[ActionStage["XRPL_DESTINATION"] = 16] = "XRPL_DESTINATION";
|
|
753
|
+
ActionStage[ActionStage["STELLAR_SOURCE"] = 17] = "STELLAR_SOURCE";
|
|
754
|
+
ActionStage[ActionStage["STELLAR_DESTINATION"] = 18] = "STELLAR_DESTINATION";
|
|
755
|
+
})(ActionStage || (routes.ActionStage = ActionStage = {}));
|
|
756
|
+
|
|
757
|
+
return routes;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
var squid = {};
|
|
761
|
+
|
|
762
|
+
var hasRequiredSquid;
|
|
763
|
+
|
|
764
|
+
function requireSquid () {
|
|
765
|
+
if (hasRequiredSquid) return squid;
|
|
766
|
+
hasRequiredSquid = 1;
|
|
767
|
+
Object.defineProperty(squid, "__esModule", { value: true });
|
|
768
|
+
squid.SuiCoralCallType = squid.CosmosCallType = squid.SquidCallType = squid.SquidRouteType = squid.SquidDataType = void 0;
|
|
769
|
+
var SquidDataType;
|
|
770
|
+
(function (SquidDataType) {
|
|
771
|
+
SquidDataType["OnChainExecution"] = "ON_CHAIN_EXECUTION";
|
|
772
|
+
SquidDataType["OnChainExecutionWithSignature"] = "ON_CHAIN_EXECUTION_WITH_SIGNATURE";
|
|
773
|
+
SquidDataType["ChainflipDepositAddress"] = "CHAINFLIP_DEPOSIT_ADDRESS";
|
|
774
|
+
SquidDataType["DepositAddressCalldata"] = "DEPOSIT_ADDRESS_CALLDATA";
|
|
775
|
+
SquidDataType["DepositAddressWithMemo"] = "DEPOSIT_ADDRESS_WITH_MEMO";
|
|
776
|
+
SquidDataType["DepositAddressWithSignature"] = "DEPOSIT_ADDRESS_WITH_SIGNATURE";
|
|
777
|
+
})(SquidDataType || (squid.SquidDataType = SquidDataType = {}));
|
|
778
|
+
var SquidRouteType;
|
|
779
|
+
(function (SquidRouteType) {
|
|
780
|
+
SquidRouteType["CALL_BRIDGE_CALL"] = "CALL_BRIDGE_CALL";
|
|
781
|
+
SquidRouteType["CALL_BRIDGE"] = "CALL_BRIDGE";
|
|
782
|
+
SquidRouteType["BRIDGE_CALL"] = "BRIDGE_CALL";
|
|
783
|
+
SquidRouteType["BRIDGE"] = "BRIDGE";
|
|
784
|
+
SquidRouteType["EVM_ONLY"] = "EVM_ONLY";
|
|
785
|
+
SquidRouteType["COSMOS_ONLY"] = "COSMOS_ONLY";
|
|
786
|
+
SquidRouteType["SOLANA_ONLY"] = "SOLANA_ONLY";
|
|
787
|
+
SquidRouteType["RFQ"] = "RFQ";
|
|
788
|
+
SquidRouteType["CORAL_V2"] = "CORAL_V2";
|
|
789
|
+
SquidRouteType["FUND_AND_RUN_MULTICALL"] = "FUND_AND_RUN_MULTICALL";
|
|
790
|
+
})(SquidRouteType || (squid.SquidRouteType = SquidRouteType = {}));
|
|
791
|
+
var SquidCallType;
|
|
792
|
+
(function (SquidCallType) {
|
|
793
|
+
SquidCallType[SquidCallType["DEFAULT"] = 0] = "DEFAULT";
|
|
794
|
+
SquidCallType[SquidCallType["FULL_TOKEN_BALANCE"] = 1] = "FULL_TOKEN_BALANCE";
|
|
795
|
+
SquidCallType[SquidCallType["FULL_NATIVE_BALANCE"] = 2] = "FULL_NATIVE_BALANCE";
|
|
796
|
+
SquidCallType[SquidCallType["COLLECT_TOKEN_BALANCE"] = 3] = "COLLECT_TOKEN_BALANCE";
|
|
797
|
+
})(SquidCallType || (squid.SquidCallType = SquidCallType = {}));
|
|
798
|
+
var CosmosCallType;
|
|
799
|
+
(function (CosmosCallType) {
|
|
800
|
+
CosmosCallType[CosmosCallType["MULTICALL"] = 0] = "MULTICALL";
|
|
801
|
+
CosmosCallType[CosmosCallType["IBC_TRANSFER"] = 1] = "IBC_TRANSFER";
|
|
802
|
+
CosmosCallType[CosmosCallType["PFM"] = 2] = "PFM";
|
|
803
|
+
CosmosCallType[CosmosCallType["GMP"] = 3] = "GMP";
|
|
804
|
+
CosmosCallType[CosmosCallType["CCTP"] = 4] = "CCTP";
|
|
805
|
+
})(CosmosCallType || (squid.CosmosCallType = CosmosCallType = {}));
|
|
806
|
+
var SuiCoralCallType;
|
|
807
|
+
(function (SuiCoralCallType) {
|
|
808
|
+
SuiCoralCallType[SuiCoralCallType["DEFAULT"] = 0] = "DEFAULT";
|
|
809
|
+
})(SuiCoralCallType || (squid.SuiCoralCallType = SuiCoralCallType = {}));
|
|
810
|
+
|
|
811
|
+
return squid;
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
var status = {};
|
|
815
|
+
|
|
816
|
+
var hasRequiredStatus;
|
|
817
|
+
|
|
818
|
+
function requireStatus () {
|
|
819
|
+
if (hasRequiredStatus) return status;
|
|
820
|
+
hasRequiredStatus = 1;
|
|
821
|
+
Object.defineProperty(status, "__esModule", { value: true });
|
|
822
|
+
status.SendTokenStatus = status.CCTPStatus = status.RouteActionStatus = status.AxelarRouteAction = status.SquidTransactionStatus = void 0;
|
|
823
|
+
var SquidTransactionStatus;
|
|
824
|
+
(function (SquidTransactionStatus) {
|
|
825
|
+
SquidTransactionStatus["SUCCESS"] = "success";
|
|
826
|
+
SquidTransactionStatus["NEEDS_GAS"] = "needs_gas";
|
|
827
|
+
SquidTransactionStatus["ONGOING"] = "ongoing";
|
|
828
|
+
SquidTransactionStatus["PARTIAL_SUCCESS"] = "partial_success";
|
|
829
|
+
SquidTransactionStatus["NOT_FOUND"] = "not_found";
|
|
830
|
+
SquidTransactionStatus["FAILED_DESTINATION"] = "failed_on_destination";
|
|
831
|
+
SquidTransactionStatus["REFUNDED"] = "refunded";
|
|
832
|
+
})(SquidTransactionStatus || (status.SquidTransactionStatus = SquidTransactionStatus = {}));
|
|
833
|
+
var AxelarRouteAction;
|
|
834
|
+
(function (AxelarRouteAction) {
|
|
835
|
+
AxelarRouteAction["CALL"] = "call";
|
|
836
|
+
AxelarRouteAction["EXECUTED"] = "executed";
|
|
837
|
+
AxelarRouteAction["IBC_TRANSFER"] = "ibc_transfer";
|
|
838
|
+
AxelarRouteAction["SEND"] = "send";
|
|
839
|
+
AxelarRouteAction["VOTE"] = "vote";
|
|
840
|
+
AxelarRouteAction["IBC_SEND"] = "ibc_send";
|
|
841
|
+
AxelarRouteAction["GAS_PAID"] = "gas_paid";
|
|
842
|
+
AxelarRouteAction["APPROVED"] = "approved";
|
|
843
|
+
})(AxelarRouteAction || (status.AxelarRouteAction = AxelarRouteAction = {}));
|
|
844
|
+
var RouteActionStatus;
|
|
845
|
+
(function (RouteActionStatus) {
|
|
846
|
+
RouteActionStatus["SUCCESS"] = "success";
|
|
847
|
+
RouteActionStatus["FAILURE"] = "failure";
|
|
848
|
+
RouteActionStatus["NOT_FOUND"] = "not_found";
|
|
849
|
+
RouteActionStatus["UNKNOWN"] = "unknown";
|
|
850
|
+
RouteActionStatus["AWAITING"] = "awaiting";
|
|
851
|
+
RouteActionStatus["REFUNDED"] = "refunded";
|
|
852
|
+
})(RouteActionStatus || (status.RouteActionStatus = RouteActionStatus = {}));
|
|
853
|
+
var CCTPStatus;
|
|
854
|
+
(function (CCTPStatus) {
|
|
855
|
+
CCTPStatus["ERROR"] = "error";
|
|
856
|
+
CCTPStatus["COMPLETE"] = "complete";
|
|
857
|
+
CCTPStatus["PENDING"] = "pending";
|
|
858
|
+
})(CCTPStatus || (status.CCTPStatus = CCTPStatus = {}));
|
|
859
|
+
var SendTokenStatus;
|
|
860
|
+
(function (SendTokenStatus) {
|
|
861
|
+
SendTokenStatus["ASSET_SENT"] = "asset_sent";
|
|
862
|
+
SendTokenStatus["EXECUTED"] = "executed";
|
|
863
|
+
})(SendTokenStatus || (status.SendTokenStatus = SendTokenStatus = {}));
|
|
864
|
+
|
|
865
|
+
return status;
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
var wrappers = {};
|
|
869
|
+
|
|
870
|
+
var hasRequiredWrappers;
|
|
871
|
+
|
|
872
|
+
function requireWrappers () {
|
|
873
|
+
if (hasRequiredWrappers) return wrappers;
|
|
874
|
+
hasRequiredWrappers = 1;
|
|
875
|
+
Object.defineProperty(wrappers, "__esModule", { value: true });
|
|
876
|
+
wrappers.WrapDirection = wrappers.WrapperName = wrappers.WrapperType = void 0;
|
|
877
|
+
var WrapperType;
|
|
878
|
+
(function (WrapperType) {
|
|
879
|
+
WrapperType["WRAPPED_NATIVE"] = "WrappedNative";
|
|
880
|
+
WrapperType["OVERNIGHT"] = "Overnight";
|
|
881
|
+
WrapperType["DEUS"] = "Deus";
|
|
882
|
+
WrapperType["WSTETH"] = "WstETH";
|
|
883
|
+
WrapperType["WRAPPED_MAI"] = "WrappedMAI";
|
|
884
|
+
WrapperType["WRAPPED_USDY"] = "WrappedUSDY";
|
|
885
|
+
WrapperType["CONVERTER_DAI_USDS"] = "ConverterDAIUSDS";
|
|
886
|
+
WrapperType["CONVERTER_MKR_SKY"] = "ConverterMKRSKY";
|
|
887
|
+
WrapperType["SAUCERSWAP_WRAPPED_HBAR"] = "SaucerSwapWrappedHBAR";
|
|
888
|
+
})(WrapperType || (wrappers.WrapperType = WrapperType = {}));
|
|
889
|
+
var WrapperName;
|
|
890
|
+
(function (WrapperName) {
|
|
891
|
+
WrapperName["WRAPPED_NATIVE"] = "Native Wrapper";
|
|
892
|
+
WrapperName["OVERNIGHT"] = "Overnight Finance";
|
|
893
|
+
WrapperName["DEUS"] = "DEUS Finance";
|
|
894
|
+
WrapperName["WSTETH"] = "Lido Wrapped stETH";
|
|
895
|
+
WrapperName["WRAPPED_MAI"] = "QiDAO Wrapped MAI";
|
|
896
|
+
WrapperName["WRAPPED_USDY"] = "Ondo Finance";
|
|
897
|
+
WrapperName["SKY_PROTOCOL_USDS"] = "DAI USDS Converter";
|
|
898
|
+
WrapperName["SKY_PROTOCOL_SKY"] = "MKR SKY Converter";
|
|
899
|
+
WrapperName["SAUCERSWAP_HBAR_WRAPPER"] = "SaucerSwap HBAR Wrapper";
|
|
900
|
+
})(WrapperName || (wrappers.WrapperName = WrapperName = {}));
|
|
901
|
+
var WrapDirection;
|
|
902
|
+
(function (WrapDirection) {
|
|
903
|
+
WrapDirection["WRAP"] = "wrap";
|
|
904
|
+
WrapDirection["UNWRAP"] = "unwrap";
|
|
905
|
+
})(WrapDirection || (wrappers.WrapDirection = WrapDirection = {}));
|
|
906
|
+
|
|
907
|
+
return wrappers;
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
var path = {};
|
|
911
|
+
|
|
912
|
+
var hasRequiredPath;
|
|
913
|
+
|
|
914
|
+
function requirePath () {
|
|
915
|
+
if (hasRequiredPath) return path;
|
|
916
|
+
hasRequiredPath = 1;
|
|
917
|
+
Object.defineProperty(path, "__esModule", { value: true });
|
|
918
|
+
path.PathFeature = void 0;
|
|
919
|
+
var PathFeature;
|
|
920
|
+
(function (PathFeature) {
|
|
921
|
+
PathFeature["includeCoralPaths"] = "1";
|
|
922
|
+
PathFeature["onlyCoralPaths"] = "2";
|
|
923
|
+
PathFeature["includeCoralV2Paths"] = "3";
|
|
924
|
+
PathFeature["onlyCoralV2Paths"] = "4";
|
|
925
|
+
PathFeature["includeCoralV2PreHooks"] = "5";
|
|
926
|
+
PathFeature["includeCoralV2PostHooks"] = "6";
|
|
927
|
+
PathFeature["isExactOutput"] = "7";
|
|
928
|
+
// Add more features as needed
|
|
929
|
+
})(PathFeature || (path.PathFeature = PathFeature = {}));
|
|
930
|
+
|
|
931
|
+
return path;
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
var compliance = {};
|
|
935
|
+
|
|
936
|
+
var hasRequiredCompliance;
|
|
937
|
+
|
|
938
|
+
function requireCompliance () {
|
|
939
|
+
if (hasRequiredCompliance) return compliance;
|
|
940
|
+
hasRequiredCompliance = 1;
|
|
941
|
+
Object.defineProperty(compliance, "__esModule", { value: true });
|
|
942
|
+
compliance.TRMIdentifier = void 0;
|
|
943
|
+
var TRMIdentifier;
|
|
944
|
+
(function (TRMIdentifier) {
|
|
945
|
+
TRMIdentifier["ALGORAND"] = "algorand";
|
|
946
|
+
TRMIdentifier["ARBITRUM"] = "arbitrum";
|
|
947
|
+
TRMIdentifier["AVALANCHE"] = "avalanche_c_chain";
|
|
948
|
+
TRMIdentifier["BASE"] = "base";
|
|
949
|
+
TRMIdentifier["BERACHAIN"] = "berachain";
|
|
950
|
+
TRMIdentifier["BINANCE"] = "binance";
|
|
951
|
+
TRMIdentifier["BINANCE_SMART_CHAIN"] = "binance_smart_chain";
|
|
952
|
+
TRMIdentifier["BITCOIN"] = "bitcoin";
|
|
953
|
+
TRMIdentifier["BITCOIN_CASH"] = "bitcoin_cash";
|
|
954
|
+
TRMIdentifier["BYTOM"] = "bytom";
|
|
955
|
+
TRMIdentifier["CARDANO"] = "cardano";
|
|
956
|
+
TRMIdentifier["CELO"] = "celo";
|
|
957
|
+
TRMIdentifier["COSMOS"] = "cosmos";
|
|
958
|
+
TRMIdentifier["DASH"] = "dash";
|
|
959
|
+
TRMIdentifier["DOGECOIN"] = "dogecoin";
|
|
960
|
+
TRMIdentifier["ELASTOS"] = "elastos";
|
|
961
|
+
TRMIdentifier["ETHEREUM"] = "ethereum";
|
|
962
|
+
TRMIdentifier["ETHEREUM_CLASSIC"] = "ethereum_classic";
|
|
963
|
+
TRMIdentifier["ELROND"] = "elrond";
|
|
964
|
+
TRMIdentifier["FANTOM"] = "fantom";
|
|
965
|
+
TRMIdentifier["FILECOIN"] = "filecoin";
|
|
966
|
+
TRMIdentifier["HEDERA"] = "hedera";
|
|
967
|
+
TRMIdentifier["ICON"] = "icon";
|
|
968
|
+
TRMIdentifier["IOST"] = "iost";
|
|
969
|
+
TRMIdentifier["IOTA"] = "iota";
|
|
970
|
+
TRMIdentifier["KLAYTN"] = "klaytn";
|
|
971
|
+
TRMIdentifier["LISK"] = "lisk";
|
|
972
|
+
TRMIdentifier["LITECOIN"] = "litecoin";
|
|
973
|
+
TRMIdentifier["MONERO"] = "monero";
|
|
974
|
+
TRMIdentifier["NEBULAS"] = "nebulas";
|
|
975
|
+
TRMIdentifier["NEO"] = "neo";
|
|
976
|
+
TRMIdentifier["OASIS"] = "oasis";
|
|
977
|
+
TRMIdentifier["OMNI"] = "omni";
|
|
978
|
+
TRMIdentifier["ONTOLOGY"] = "ontology";
|
|
979
|
+
TRMIdentifier["OPTIMISM"] = "optimism";
|
|
980
|
+
TRMIdentifier["PAI"] = "pai";
|
|
981
|
+
TRMIdentifier["POLKADOT"] = "polkadot";
|
|
982
|
+
TRMIdentifier["POLYGON"] = "polygon";
|
|
983
|
+
TRMIdentifier["QTUM"] = "qtum";
|
|
984
|
+
TRMIdentifier["XRPLEDGER"] = "ripple";
|
|
985
|
+
TRMIdentifier["SOLANA"] = "solana";
|
|
986
|
+
TRMIdentifier["STEEM"] = "steem";
|
|
987
|
+
TRMIdentifier["STELLAR"] = "stellar";
|
|
988
|
+
TRMIdentifier["TEZOS"] = "tezos";
|
|
989
|
+
TRMIdentifier["TRON"] = "tron";
|
|
990
|
+
TRMIdentifier["ZCASH"] = "zcash";
|
|
991
|
+
TRMIdentifier["ZILLIQA"] = "zilliqa";
|
|
992
|
+
})(TRMIdentifier || (compliance.TRMIdentifier = TRMIdentifier = {}));
|
|
993
|
+
|
|
994
|
+
return compliance;
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
var rfq = {};
|
|
998
|
+
|
|
999
|
+
var hasRequiredRfq;
|
|
1000
|
+
|
|
1001
|
+
function requireRfq () {
|
|
1002
|
+
if (hasRequiredRfq) return rfq;
|
|
1003
|
+
hasRequiredRfq = 1;
|
|
1004
|
+
Object.defineProperty(rfq, "__esModule", { value: true });
|
|
1005
|
+
rfq.LayerZeroEndpoint = rfq.CoralMessageProvider = rfq.HubEventType = rfq.SpokeEventType = void 0;
|
|
1006
|
+
var SpokeEventType;
|
|
1007
|
+
(function (SpokeEventType) {
|
|
1008
|
+
SpokeEventType["ORDER_CREATED"] = "OrderCreated";
|
|
1009
|
+
SpokeEventType["ORDER_FILLED"] = "OrderFilled";
|
|
1010
|
+
SpokeEventType["ORDER_REFUNDED"] = "OrderRefunded";
|
|
1011
|
+
SpokeEventType["SETTLEMENT_FORWARDED"] = "SettlementForwarded";
|
|
1012
|
+
SpokeEventType["TOKENS_RELEASED"] = "TokensReleased";
|
|
1013
|
+
})(SpokeEventType || (rfq.SpokeEventType = SpokeEventType = {}));
|
|
1014
|
+
var HubEventType;
|
|
1015
|
+
(function (HubEventType) {
|
|
1016
|
+
HubEventType["SETTLEMENT_FILLED"] = "SettlementFilled";
|
|
1017
|
+
HubEventType["SETTLEMENT_PROCESSED"] = "SettlementProcessed";
|
|
1018
|
+
})(HubEventType || (rfq.HubEventType = HubEventType = {}));
|
|
1019
|
+
var CoralMessageProvider;
|
|
1020
|
+
(function (CoralMessageProvider) {
|
|
1021
|
+
CoralMessageProvider["UNSUPPORTED"] = "Unsupported";
|
|
1022
|
+
CoralMessageProvider["AXELAR"] = "Axelar";
|
|
1023
|
+
CoralMessageProvider["LAYER_ZERO"] = "LayerZero";
|
|
1024
|
+
})(CoralMessageProvider || (rfq.CoralMessageProvider = CoralMessageProvider = {}));
|
|
1025
|
+
var LayerZeroEndpoint;
|
|
1026
|
+
(function (LayerZeroEndpoint) {
|
|
1027
|
+
LayerZeroEndpoint["DEFAULT"] = "0";
|
|
1028
|
+
LayerZeroEndpoint["ETHEREUM"] = "30101";
|
|
1029
|
+
LayerZeroEndpoint["OPTIMISM"] = "30111";
|
|
1030
|
+
LayerZeroEndpoint["BINANCE"] = "30102";
|
|
1031
|
+
LayerZeroEndpoint["GNOSIS"] = "30145";
|
|
1032
|
+
LayerZeroEndpoint["POLYGON"] = "30109";
|
|
1033
|
+
LayerZeroEndpoint["SONIC"] = "30332";
|
|
1034
|
+
LayerZeroEndpoint["FANTOM"] = "30112";
|
|
1035
|
+
LayerZeroEndpoint["HYPER_EVM"] = "30367";
|
|
1036
|
+
LayerZeroEndpoint["SONEIUM"] = "30340";
|
|
1037
|
+
LayerZeroEndpoint["PEAQ"] = "30302";
|
|
1038
|
+
LayerZeroEndpoint["BASE"] = "30184";
|
|
1039
|
+
LayerZeroEndpoint["ARBITRUM"] = "30110";
|
|
1040
|
+
LayerZeroEndpoint["CELO"] = "30125";
|
|
1041
|
+
LayerZeroEndpoint["AVALANCHE"] = "30106";
|
|
1042
|
+
LayerZeroEndpoint["LINEA"] = "30183";
|
|
1043
|
+
LayerZeroEndpoint["BERACHAIN"] = "30362";
|
|
1044
|
+
LayerZeroEndpoint["BLAST"] = "30243";
|
|
1045
|
+
})(LayerZeroEndpoint || (rfq.LayerZeroEndpoint = LayerZeroEndpoint = {}));
|
|
1046
|
+
|
|
1047
|
+
return rfq;
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
var gas = {};
|
|
1051
|
+
|
|
1052
|
+
var hasRequiredGas;
|
|
1053
|
+
|
|
1054
|
+
function requireGas () {
|
|
1055
|
+
if (hasRequiredGas) return gas;
|
|
1056
|
+
hasRequiredGas = 1;
|
|
1057
|
+
Object.defineProperty(gas, "__esModule", { value: true });
|
|
1058
|
+
|
|
1059
|
+
return gas;
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
var featureFlag = {};
|
|
1063
|
+
|
|
1064
|
+
var hasRequiredFeatureFlag;
|
|
1065
|
+
|
|
1066
|
+
function requireFeatureFlag () {
|
|
1067
|
+
if (hasRequiredFeatureFlag) return featureFlag;
|
|
1068
|
+
hasRequiredFeatureFlag = 1;
|
|
1069
|
+
Object.defineProperty(featureFlag, "__esModule", { value: true });
|
|
1070
|
+
featureFlag.FeatureFlagType = void 0;
|
|
1071
|
+
var FeatureFlagType;
|
|
1072
|
+
(function (FeatureFlagType) {
|
|
1073
|
+
FeatureFlagType["MaintenanceMode"] = "maintenance";
|
|
1074
|
+
FeatureFlagType["Bitcoin"] = "bitcoin";
|
|
1075
|
+
FeatureFlagType["BitcoinCoralV2"] = "bitcoinCoralV2";
|
|
1076
|
+
FeatureFlagType["Solana"] = "solana";
|
|
1077
|
+
FeatureFlagType["SolanaCoralV2"] = "solanaCoralV2";
|
|
1078
|
+
FeatureFlagType["Chainflip"] = "chainflip";
|
|
1079
|
+
FeatureFlagType["Coral"] = "coral";
|
|
1080
|
+
FeatureFlagType["CoralOnly"] = "coralOnly";
|
|
1081
|
+
FeatureFlagType["CoralV2"] = "coralV2";
|
|
1082
|
+
FeatureFlagType["CoralV2PostHooks"] = "coralV2PostHooks";
|
|
1083
|
+
FeatureFlagType["CoralV2PreHooks"] = "coralV2PreHooks";
|
|
1084
|
+
FeatureFlagType["ChainflipMultihop"] = "chainflipMultihop";
|
|
1085
|
+
FeatureFlagType["SagaRoutes"] = "sagaRoutes";
|
|
1086
|
+
FeatureFlagType["BypassCompliance"] = "bypassCompliance";
|
|
1087
|
+
FeatureFlagType["Ripple"] = "ripple";
|
|
1088
|
+
FeatureFlagType["RippleCoralV2"] = "rippleCoralV2";
|
|
1089
|
+
FeatureFlagType["Megabridge"] = "megabridge";
|
|
1090
|
+
FeatureFlagType["Stellar"] = "stellar";
|
|
1091
|
+
FeatureFlagType["StellarCoralV2"] = "stellarCoralV2";
|
|
1092
|
+
FeatureFlagType["Mantra"] = "mantra";
|
|
1093
|
+
FeatureFlagType["HederaPilot"] = "hederaPilot";
|
|
1094
|
+
FeatureFlagType["Citrea"] = "citrea";
|
|
1095
|
+
FeatureFlagType["HederaCoralV2"] = "hederaCoralV2";
|
|
1096
|
+
FeatureFlagType["HederaBlocked"] = "hederaBlocked";
|
|
1097
|
+
FeatureFlagType["AddressQuoteRateLimit"] = "addressQuoteRateLimit";
|
|
1098
|
+
FeatureFlagType["ExactOutputRouting"] = "exactOutputRouting";
|
|
1099
|
+
FeatureFlagType["Tempo"] = "tempo";
|
|
1100
|
+
FeatureFlagType["TempoCoralV2"] = "tempoCoralV2";
|
|
1101
|
+
FeatureFlagType["AddressValidation"] = "addressValidation";
|
|
1102
|
+
})(FeatureFlagType || (featureFlag.FeatureFlagType = FeatureFlagType = {}));
|
|
1103
|
+
|
|
1104
|
+
return featureFlag;
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
var depositAddress = {};
|
|
1108
|
+
|
|
1109
|
+
var hasRequiredDepositAddress;
|
|
1110
|
+
|
|
1111
|
+
function requireDepositAddress () {
|
|
1112
|
+
if (hasRequiredDepositAddress) return depositAddress;
|
|
1113
|
+
hasRequiredDepositAddress = 1;
|
|
1114
|
+
Object.defineProperty(depositAddress, "__esModule", { value: true });
|
|
1115
|
+
|
|
1116
|
+
return depositAddress;
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
var hasRequiredDist;
|
|
1120
|
+
|
|
1121
|
+
function requireDist () {
|
|
1122
|
+
if (hasRequiredDist) return dist;
|
|
1123
|
+
hasRequiredDist = 1;
|
|
1124
|
+
(function (exports$1) {
|
|
1125
|
+
var __createBinding = (dist && dist.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
1126
|
+
if (k2 === undefined) k2 = k;
|
|
1127
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
1128
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
1129
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
1130
|
+
}
|
|
1131
|
+
Object.defineProperty(o, k2, desc);
|
|
1132
|
+
}) : (function(o, m, k, k2) {
|
|
1133
|
+
if (k2 === undefined) k2 = k;
|
|
1134
|
+
o[k2] = m[k];
|
|
1135
|
+
}));
|
|
1136
|
+
var __exportStar = (dist && dist.__exportStar) || function(m, exports$1) {
|
|
1137
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports$1, p)) __createBinding(exports$1, m, p);
|
|
1138
|
+
};
|
|
1139
|
+
Object.defineProperty(exports$1, "__esModule", { value: true });
|
|
1140
|
+
__exportStar(requireChains(), exports$1);
|
|
1141
|
+
__exportStar(requireBridges(), exports$1);
|
|
1142
|
+
__exportStar(requireDexes(), exports$1);
|
|
1143
|
+
__exportStar(requireErrors(), exports$1);
|
|
1144
|
+
__exportStar(requireTokens(), exports$1);
|
|
1145
|
+
__exportStar(requireFees(), exports$1);
|
|
1146
|
+
__exportStar(requireQuote(), exports$1);
|
|
1147
|
+
__exportStar(requireRoutes(), exports$1);
|
|
1148
|
+
__exportStar(requireSquid(), exports$1);
|
|
1149
|
+
__exportStar(requireStatus(), exports$1);
|
|
1150
|
+
__exportStar(requireWrappers(), exports$1);
|
|
1151
|
+
__exportStar(requirePath(), exports$1);
|
|
1152
|
+
__exportStar(requireCompliance(), exports$1);
|
|
1153
|
+
__exportStar(requireRfq(), exports$1);
|
|
1154
|
+
__exportStar(requireGas(), exports$1);
|
|
1155
|
+
__exportStar(requireFeatureFlag(), exports$1);
|
|
1156
|
+
__exportStar(requireDepositAddress(), exports$1);
|
|
1157
|
+
|
|
1158
|
+
} (dist));
|
|
1159
|
+
return dist;
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
var distExports = requireDist();
|
|
1163
|
+
|
|
1164
|
+
const CHAIN_TYPE_META = {
|
|
1165
|
+
[distExports.ChainType.EVM]: {
|
|
1166
|
+
icon: "https://raw.githubusercontent.com/0xsquid/assets/main/images/webp128/chains/ethereum.webp",
|
|
1167
|
+
name: "Ethereum",
|
|
1168
|
+
},
|
|
1169
|
+
[distExports.ChainType.COSMOS]: {
|
|
1170
|
+
icon: "https://raw.githubusercontent.com/0xsquid/assets/main/squid-brand-assets/custom-chain-icons/cosmos.webp",
|
|
1171
|
+
name: "Cosmos",
|
|
1172
|
+
},
|
|
1173
|
+
[distExports.ChainType.BTC]: {
|
|
1174
|
+
icon: "https://raw.githubusercontent.com/0xsquid/assets/main/images/webp128/chains/bitcoin.webp",
|
|
1175
|
+
name: "Bitcoin",
|
|
1176
|
+
},
|
|
1177
|
+
[distExports.ChainType.SOLANA]: {
|
|
1178
|
+
icon: "https://raw.githubusercontent.com/0xsquid/assets/main/images/webp128/chains/solana.webp",
|
|
1179
|
+
name: "Solana",
|
|
1180
|
+
},
|
|
1181
|
+
[distExports.ChainType.SUI]: {
|
|
1182
|
+
icon: "https://raw.githubusercontent.com/0xsquid/assets/main/images/webp128/chains/sui.webp",
|
|
1183
|
+
name: "Sui",
|
|
1184
|
+
},
|
|
1185
|
+
[distExports.ChainType.XRPL]: {
|
|
1186
|
+
icon: "https://raw.githubusercontent.com/0xsquid/assets/main/images/webp128/chains/xrpl.webp",
|
|
1187
|
+
name: "XRPL",
|
|
1188
|
+
},
|
|
1189
|
+
[distExports.ChainType.STELLAR]: {
|
|
1190
|
+
icon: "https://raw.githubusercontent.com/0xsquid/assets/main/images/webp128/chains/stellar.webp",
|
|
1191
|
+
name: "Stellar",
|
|
1192
|
+
},
|
|
1193
|
+
};
|
|
1194
|
+
|
|
1195
|
+
const WALLET_PRIORITY_LIST = [
|
|
1196
|
+
"walletConnect",
|
|
1197
|
+
"metamask",
|
|
1198
|
+
"phantom",
|
|
1199
|
+
"rabby",
|
|
1200
|
+
"trustwallet",
|
|
1201
|
+
];
|
|
1202
|
+
function walletSupportsChainType(wallet, chainType) {
|
|
1203
|
+
if (wallet.isMultiChain) {
|
|
1204
|
+
return wallet.supportedNetworks.some((n) => n.chainType === chainType);
|
|
1205
|
+
}
|
|
1206
|
+
return wallet.type === chainType;
|
|
1207
|
+
}
|
|
1208
|
+
function ConnectWalletView({ chainType }) {
|
|
1209
|
+
const { wallets } = reactHooks.useWallets();
|
|
1210
|
+
const { connectWallet, connectingWalletState } = reactHooks.useWallet();
|
|
1211
|
+
const pop = useRouter((s) => s.pop);
|
|
1212
|
+
const push = useRouter((s) => s.push);
|
|
1213
|
+
const [search, setSearch] = React.useState("");
|
|
1214
|
+
const requiredChainType = chainType;
|
|
1215
|
+
const connectingConnectorId = connectingWalletState.status === reactHooks.ConnectingWalletStatus.CONNECTING
|
|
1216
|
+
? connectingWalletState.wallet?.connectorId
|
|
1217
|
+
: undefined;
|
|
1218
|
+
const isMultiChainWallet = React.useCallback((wallet) => !requiredChainType &&
|
|
1219
|
+
wallet.isMultiChain &&
|
|
1220
|
+
wallet.supportedNetworks.length > 1 &&
|
|
1221
|
+
!!wallet.isInstalled?.(), [requiredChainType]);
|
|
1222
|
+
const onWalletClicked = async (wallet) => {
|
|
1223
|
+
if (isMultiChainWallet(wallet)) {
|
|
1224
|
+
push({ id: "select-chain", wallet });
|
|
1225
|
+
return;
|
|
1226
|
+
}
|
|
1227
|
+
try {
|
|
1228
|
+
const selectedChainTypes = requiredChainType
|
|
1229
|
+
? [requiredChainType]
|
|
1230
|
+
: undefined;
|
|
1231
|
+
const connected = await connectWallet({ wallet, selectedChainTypes });
|
|
1232
|
+
if (connected) {
|
|
1233
|
+
pop();
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
catch (error) {
|
|
1237
|
+
console.error("Failed to connect wallet:", error);
|
|
1238
|
+
}
|
|
1239
|
+
};
|
|
1240
|
+
const sortedWallets = React.useMemo(() => wallets.toSorted((a, b) => {
|
|
1241
|
+
if (requiredChainType) {
|
|
1242
|
+
const aSupports = walletSupportsChainType(a, requiredChainType);
|
|
1243
|
+
const bSupports = walletSupportsChainType(b, requiredChainType);
|
|
1244
|
+
if (aSupports !== bSupports)
|
|
1245
|
+
return aSupports ? -1 : 1;
|
|
1246
|
+
}
|
|
1247
|
+
return reactHooks.sortWallets(a, b, {
|
|
1248
|
+
isMobile: false,
|
|
1249
|
+
priorityList: WALLET_PRIORITY_LIST,
|
|
1250
|
+
});
|
|
1251
|
+
}), [wallets, requiredChainType]);
|
|
1252
|
+
const fuse = React.useMemo(() => new Fuse(sortedWallets, {
|
|
1253
|
+
isCaseSensitive: false,
|
|
1254
|
+
includeScore: false,
|
|
1255
|
+
minMatchCharLength: 1,
|
|
1256
|
+
threshold: 0.4,
|
|
1257
|
+
keys: ["name"],
|
|
1258
|
+
}), [sortedWallets]);
|
|
1259
|
+
const walletsToDisplay = React.useMemo(() => {
|
|
1260
|
+
if (search.length === 0)
|
|
1261
|
+
return sortedWallets;
|
|
1262
|
+
return fuse.search(search).map((result) => result.item);
|
|
1263
|
+
}, [fuse, search, sortedWallets]);
|
|
1264
|
+
const chainTypeWallets = React.useMemo(() => {
|
|
1265
|
+
if (!requiredChainType)
|
|
1266
|
+
return walletsToDisplay;
|
|
1267
|
+
return walletsToDisplay.filter((w) => walletSupportsChainType(w, requiredChainType));
|
|
1268
|
+
}, [walletsToDisplay, requiredChainType]);
|
|
1269
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(SubNavBar, { input: {
|
|
1270
|
+
placeholder: requiredChainType
|
|
1271
|
+
? `Select ${CHAIN_TYPE_META[requiredChainType].name} wallet`
|
|
1272
|
+
: "Select wallet",
|
|
1273
|
+
onChange: (e) => setSearch(e.target.value),
|
|
1274
|
+
autoComplete: "off",
|
|
1275
|
+
autoCorrect: "off",
|
|
1276
|
+
spellCheck: false,
|
|
1277
|
+
} }), jsxRuntime.jsx(ViewContainer, { children: jsxRuntime.jsx("ul", { className: "tw-flex tw-flex-col tw-items-start tw-flex-1 tw-self-stretch", children: chainTypeWallets.map((wallet) => (jsxRuntime.jsx(WalletListItem, { wallet: wallet, isConnecting: wallet.connectorId === connectingConnectorId, showAsMultiChain: isMultiChainWallet(wallet), onClick: () => onWalletClicked(wallet) }, wallet.connectorId))) }) })] }));
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
function Button(props) {
|
|
1281
|
+
return (jsxRuntime.jsx("button", { ...props, className: ui.cn("tw-flex tw-justify-center tw-items-center tw-flex-1 tw-self-stretch tw-rounded-2xl tw-text-lg tw-text-grey-900 tw-bg-grey-100 tw-bg-cta-button-light dark:tw-bg-cta-button-dark tw-shadow-cta-button-light dark:tw-shadow-cta-button-dark",
|
|
1282
|
+
// disabled
|
|
1283
|
+
"disabled:tw-cursor-not-allowed disabled:tw-bg-grey-800 disabled:tw-text-grey-600 disabled:dark:tw-bg-grey-800 disabled:dark:tw-text-grey-500", props.className) }));
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
const useDepositStore = zustand.create((set) => ({
|
|
1287
|
+
config: null,
|
|
1288
|
+
setConfig: (config) => set({ config }),
|
|
1289
|
+
}));
|
|
1290
|
+
const useIsPaymentMode = () => useDepositStore((s) => s.config?.mode === "payment");
|
|
1291
|
+
const usePaymentAmount = () => useDepositStore((s) => s.config?.mode === "payment" ? s.config.amount : null);
|
|
1292
|
+
|
|
1293
|
+
function formatRouteError(message) {
|
|
1294
|
+
if (message === "Low liquidity, please reduce swap amount and try again") {
|
|
1295
|
+
return "Low liquidity, select a different token or reduce the amount";
|
|
1296
|
+
}
|
|
1297
|
+
return message;
|
|
1298
|
+
}
|
|
1299
|
+
function useDepositRoute() {
|
|
1300
|
+
const config = useDepositStore((s) => s.config);
|
|
1301
|
+
const { fromChain, fromToken, toChain, toToken, fromAmount, toAmount } = reactHooks.useSwap();
|
|
1302
|
+
const { connectedAddress } = reactHooks.useMultiChainWallet(fromChain);
|
|
1303
|
+
const sourceAddress = connectedAddress.address;
|
|
1304
|
+
const currentView = useRouter(selectCurrentView);
|
|
1305
|
+
const quoteOnly = !sourceAddress || !config?.destinationAddress;
|
|
1306
|
+
const enabled = currentView.id === "main" &&
|
|
1307
|
+
Boolean(fromChain && fromToken && toChain && toToken && (fromAmount || toAmount));
|
|
1308
|
+
const { routeData, showLoading, squidRouteError } = reactHooks.useGetRouteWrapper({
|
|
1309
|
+
quoteOnly,
|
|
1310
|
+
enabled,
|
|
1311
|
+
});
|
|
1312
|
+
const quotedSourceAmount = routeData && fromToken
|
|
1313
|
+
? reactHooks.formatBNToReadable(routeData.estimate.fromAmount, fromToken.decimals)
|
|
1314
|
+
: undefined;
|
|
1315
|
+
return {
|
|
1316
|
+
routeData,
|
|
1317
|
+
quotedSourceAmount,
|
|
1318
|
+
showLoading,
|
|
1319
|
+
routeErrorMessage: squidRouteError
|
|
1320
|
+
? formatRouteError(reactHooks.getSquidRouteErrorMessage(squidRouteError))
|
|
1321
|
+
: undefined,
|
|
1322
|
+
};
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
function getMainExplorerUrl(transaction) {
|
|
1326
|
+
if (transaction.statusResponse?.coralTransactionUrl) {
|
|
1327
|
+
return {
|
|
1328
|
+
url: transaction.statusResponse.coralTransactionUrl,
|
|
1329
|
+
name: "Squidscan",
|
|
1330
|
+
};
|
|
1331
|
+
}
|
|
1332
|
+
if (transaction.statusResponse?.axelarTransactionUrl) {
|
|
1333
|
+
return {
|
|
1334
|
+
url: transaction.statusResponse.axelarTransactionUrl,
|
|
1335
|
+
name: "Axelarscan",
|
|
1336
|
+
};
|
|
1337
|
+
}
|
|
1338
|
+
const chainflipScanUrl = transaction.statusResponse?.toChain?.transactionUrl;
|
|
1339
|
+
if (chainflipScanUrl &&
|
|
1340
|
+
reactHooks.isChainflipBridgeTransaction(transaction.actions ?? [])) {
|
|
1341
|
+
return { url: chainflipScanUrl, name: "Chainflip" };
|
|
1342
|
+
}
|
|
1343
|
+
if (transaction.sourceTxExplorerUrl) {
|
|
1344
|
+
return {
|
|
1345
|
+
url: transaction.sourceTxExplorerUrl,
|
|
1346
|
+
name: transaction.sourceChain?.networkName
|
|
1347
|
+
? `${transaction.sourceChain.networkName} explorer`
|
|
1348
|
+
: "Source explorer",
|
|
1349
|
+
};
|
|
1350
|
+
}
|
|
1351
|
+
if (transaction.statusResponse?.transactionUrl) {
|
|
1352
|
+
return {
|
|
1353
|
+
url: transaction.statusResponse.transactionUrl,
|
|
1354
|
+
name: transaction.sourceChain?.networkName
|
|
1355
|
+
? `${transaction.sourceChain.networkName} explorer`
|
|
1356
|
+
: "Source explorer",
|
|
1357
|
+
};
|
|
1358
|
+
}
|
|
1359
|
+
return undefined;
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1362
|
+
var DepositStatus;
|
|
1363
|
+
(function (DepositStatus) {
|
|
1364
|
+
DepositStatus[DepositStatus["CONFIRMING"] = 0] = "CONFIRMING";
|
|
1365
|
+
DepositStatus[DepositStatus["PROCESSING"] = 1] = "PROCESSING";
|
|
1366
|
+
DepositStatus[DepositStatus["COMPLETED"] = 2] = "COMPLETED";
|
|
1367
|
+
DepositStatus[DepositStatus["PARTIAL_SUCCESS"] = 3] = "PARTIAL_SUCCESS";
|
|
1368
|
+
DepositStatus[DepositStatus["REJECTED"] = 4] = "REJECTED";
|
|
1369
|
+
DepositStatus[DepositStatus["FAILED"] = 5] = "FAILED";
|
|
1370
|
+
})(DepositStatus || (DepositStatus = {}));
|
|
1371
|
+
function useTransactionProgress() {
|
|
1372
|
+
const currentTransaction = reactHooks.useTransactionStore((state) => state.currentTransaction);
|
|
1373
|
+
const { routeData } = useDepositRoute();
|
|
1374
|
+
const { fromChain } = reactHooks.useSwap();
|
|
1375
|
+
const { estimatedRouteDuration } = reactHooks.useEstimate(routeData);
|
|
1376
|
+
const config = useDepositStore((s) => s.config);
|
|
1377
|
+
const { latestStatus, transactionStatusQuery } = reactHooks.useSwapTransactionStatus({
|
|
1378
|
+
transaction: {
|
|
1379
|
+
fromAddress: currentTransaction?.fromAddress ?? "",
|
|
1380
|
+
fromChain: currentTransaction?.fromChain?.chainId ?? "",
|
|
1381
|
+
toChain: currentTransaction?.toChain?.chainId ?? "",
|
|
1382
|
+
transactionId: currentTransaction?.transactionId ?? "",
|
|
1383
|
+
status: currentTransaction?.status ?? reactHooks.TransactionStatus.PENDING,
|
|
1384
|
+
bridgeType: reactHooks.getBridgeType(routeData?.estimate.actions),
|
|
1385
|
+
actions: routeData?.estimate.actions,
|
|
1386
|
+
transactionIdForStatus: currentTransaction?.transactionIdForStatus,
|
|
1387
|
+
quoteId: currentTransaction?.quoteId,
|
|
1388
|
+
depositTxVerificationSignature: currentTransaction?.depositTxVerificationSignature,
|
|
1389
|
+
},
|
|
1390
|
+
});
|
|
1391
|
+
const status = React.useMemo(() => {
|
|
1392
|
+
if (currentTransaction === undefined) {
|
|
1393
|
+
return DepositStatus.CONFIRMING;
|
|
1394
|
+
}
|
|
1395
|
+
if (currentTransaction.error?.type === reactHooks.TransactionErrorType.REJECTED_BY_USER) {
|
|
1396
|
+
return DepositStatus.REJECTED;
|
|
1397
|
+
}
|
|
1398
|
+
if (currentTransaction.sourceStatus === "error") {
|
|
1399
|
+
return DepositStatus.FAILED;
|
|
1400
|
+
}
|
|
1401
|
+
if (latestStatus === reactHooks.TransactionStatus.SUCCESS) {
|
|
1402
|
+
return DepositStatus.COMPLETED;
|
|
1403
|
+
}
|
|
1404
|
+
if (latestStatus === reactHooks.TransactionStatus.PARTIAL_SUCCESS ||
|
|
1405
|
+
latestStatus === reactHooks.TransactionStatus.REFUNDED) {
|
|
1406
|
+
return DepositStatus.PARTIAL_SUCCESS;
|
|
1407
|
+
}
|
|
1408
|
+
if (latestStatus === reactHooks.TransactionStatus.ERROR) {
|
|
1409
|
+
return DepositStatus.FAILED;
|
|
1410
|
+
}
|
|
1411
|
+
if (latestStatus === reactHooks.TransactionStatus.ONGOING ||
|
|
1412
|
+
latestStatus === reactHooks.TransactionStatus.INITIAL_LOADING ||
|
|
1413
|
+
latestStatus === reactHooks.TransactionStatus.PENDING) {
|
|
1414
|
+
return DepositStatus.PROCESSING;
|
|
1415
|
+
}
|
|
1416
|
+
return DepositStatus.CONFIRMING;
|
|
1417
|
+
}, [currentTransaction, latestStatus]);
|
|
1418
|
+
const explorerLink = getMainExplorerUrl({
|
|
1419
|
+
routeType: currentTransaction?.routeType,
|
|
1420
|
+
transactionId: currentTransaction?.transactionId,
|
|
1421
|
+
sourceTxExplorerUrl: currentTransaction?.sourceTxExplorerUrl,
|
|
1422
|
+
statusResponse: transactionStatusQuery.data,
|
|
1423
|
+
actions: routeData?.estimate.actions?.map(reactHooks.simplifyRouteAction),
|
|
1424
|
+
sourceChain: fromChain,
|
|
1425
|
+
});
|
|
1426
|
+
return {
|
|
1427
|
+
status,
|
|
1428
|
+
explorerLink,
|
|
1429
|
+
estimatedTime: estimatedRouteDuration
|
|
1430
|
+
? `~${estimatedRouteDuration.format()}`
|
|
1431
|
+
: undefined,
|
|
1432
|
+
recipient: {
|
|
1433
|
+
name: config?.integrator.name ?? "Recipient",
|
|
1434
|
+
address: config?.destinationAddress ?? "",
|
|
1435
|
+
},
|
|
1436
|
+
};
|
|
1437
|
+
}
|
|
1438
|
+
|
|
1439
|
+
function getStatusTitle(status, isPaymentMode) {
|
|
1440
|
+
const action = isPaymentMode ? "Payment" : "Deposit";
|
|
1441
|
+
switch (status) {
|
|
1442
|
+
case DepositStatus.CONFIRMING:
|
|
1443
|
+
return "Confirm transaction";
|
|
1444
|
+
case DepositStatus.PROCESSING:
|
|
1445
|
+
return `${action} in progress`;
|
|
1446
|
+
case DepositStatus.COMPLETED:
|
|
1447
|
+
return `${action} complete`;
|
|
1448
|
+
case DepositStatus.PARTIAL_SUCCESS:
|
|
1449
|
+
return `${action} failed to complete`;
|
|
1450
|
+
case DepositStatus.REJECTED:
|
|
1451
|
+
return `${action} rejected`;
|
|
1452
|
+
case DepositStatus.FAILED:
|
|
1453
|
+
return `${action} failed`;
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
function getStatusDescription(status, { amount, symbol, recipientName, isPaymentMode, }) {
|
|
1457
|
+
const verb = isPaymentMode ? "paid" : "deposited";
|
|
1458
|
+
switch (status) {
|
|
1459
|
+
case DepositStatus.CONFIRMING:
|
|
1460
|
+
return "Authenticate the transaction in your wallet.";
|
|
1461
|
+
case DepositStatus.PROCESSING:
|
|
1462
|
+
return "Feel free to dismiss this dialog.";
|
|
1463
|
+
case DepositStatus.COMPLETED:
|
|
1464
|
+
return `You ${verb} ${amount} ${symbol} to ${recipientName} successfully.`;
|
|
1465
|
+
case DepositStatus.PARTIAL_SUCCESS:
|
|
1466
|
+
return "You received a refund to your wallet.";
|
|
1467
|
+
case DepositStatus.REJECTED:
|
|
1468
|
+
return "You declined the transaction in your wallet.";
|
|
1469
|
+
case DepositStatus.FAILED:
|
|
1470
|
+
return "Your tokens were safely returned to your wallet.";
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
function getButtonLabel(status) {
|
|
1474
|
+
switch (status) {
|
|
1475
|
+
case DepositStatus.CONFIRMING:
|
|
1476
|
+
return "Cancel";
|
|
1477
|
+
case DepositStatus.PROCESSING:
|
|
1478
|
+
case DepositStatus.COMPLETED:
|
|
1479
|
+
return "Ok, done";
|
|
1480
|
+
case DepositStatus.PARTIAL_SUCCESS:
|
|
1481
|
+
return "Ok, go back";
|
|
1482
|
+
case DepositStatus.REJECTED:
|
|
1483
|
+
case DepositStatus.FAILED:
|
|
1484
|
+
return "Ok, go back";
|
|
1485
|
+
}
|
|
1486
|
+
}
|
|
1487
|
+
function TimeDetail({ status, timer, estimatedTimeDisplay, }) {
|
|
1488
|
+
switch (status) {
|
|
1489
|
+
case DepositStatus.PROCESSING:
|
|
1490
|
+
return estimatedTimeDisplay ? (jsxRuntime.jsx(ui.Transfer, { from: timer, to: estimatedTimeDisplay })) : (jsxRuntime.jsx(ui.CaptionText, { children: timer }));
|
|
1491
|
+
case DepositStatus.COMPLETED:
|
|
1492
|
+
case DepositStatus.PARTIAL_SUCCESS:
|
|
1493
|
+
return jsxRuntime.jsx(ui.CaptionText, { children: timer });
|
|
1494
|
+
default:
|
|
1495
|
+
return jsxRuntime.jsx(ui.CaptionText, { children: estimatedTimeDisplay ?? "—" });
|
|
1496
|
+
}
|
|
1497
|
+
}
|
|
1498
|
+
|
|
1499
|
+
const progressAnimations = {
|
|
1500
|
+
[DepositStatus.CONFIRMING]: ui.transactionPendingAnimation,
|
|
1501
|
+
[DepositStatus.PROCESSING]: ui.transactionProcessingAnimation,
|
|
1502
|
+
[DepositStatus.COMPLETED]: ui.transactionSuccessAnimation,
|
|
1503
|
+
[DepositStatus.PARTIAL_SUCCESS]: ui.transactionHalfSuccessAnimation,
|
|
1504
|
+
[DepositStatus.REJECTED]: ui.transactionRejectedAnimation,
|
|
1505
|
+
[DepositStatus.FAILED]: ui.transactionFailureAnimation,
|
|
1506
|
+
};
|
|
1507
|
+
function TransactionProgressView() {
|
|
1508
|
+
const popToRoot = useRouter((s) => s.popToRoot);
|
|
1509
|
+
const isPaymentMode = useIsPaymentMode();
|
|
1510
|
+
const config = useDepositStore((s) => s.config);
|
|
1511
|
+
const { fromToken, toToken } = reactHooks.useSwap();
|
|
1512
|
+
const { routeData } = useDepositRoute();
|
|
1513
|
+
const { fromAmountFormatted: rawFromAmount, toAmount } = reactHooks.useEstimate(routeData);
|
|
1514
|
+
const { cancelSwap } = reactHooks.useExecuteTransaction(routeData);
|
|
1515
|
+
const { status, estimatedTime, recipient, explorerLink } = useTransactionProgress();
|
|
1516
|
+
const { timer, startTimer, stopTimer } = ui.useTimer({ immediateStart: false });
|
|
1517
|
+
React.useEffect(() => {
|
|
1518
|
+
if (status === DepositStatus.PROCESSING) {
|
|
1519
|
+
startTimer();
|
|
1520
|
+
}
|
|
1521
|
+
else if (status === DepositStatus.COMPLETED ||
|
|
1522
|
+
status === DepositStatus.PARTIAL_SUCCESS ||
|
|
1523
|
+
status === DepositStatus.REJECTED ||
|
|
1524
|
+
status === DepositStatus.FAILED) {
|
|
1525
|
+
stopTimer();
|
|
1526
|
+
}
|
|
1527
|
+
}, [status, startTimer, stopTimer]);
|
|
1528
|
+
const actionLabel = isPaymentMode ? "Payment" : "Deposit";
|
|
1529
|
+
const fromAmountFormatted = reactHooks.formatTokenAmount(rawFromAmount ?? "0", {
|
|
1530
|
+
exact: false,
|
|
1531
|
+
});
|
|
1532
|
+
const toAmountFormatted = reactHooks.formatTokenAmount(toAmount ?? "0", {
|
|
1533
|
+
exact: false,
|
|
1534
|
+
});
|
|
1535
|
+
const handleClose = () => {
|
|
1536
|
+
if (status === DepositStatus.CONFIRMING) {
|
|
1537
|
+
cancelSwap();
|
|
1538
|
+
}
|
|
1539
|
+
popToRoot();
|
|
1540
|
+
};
|
|
1541
|
+
const title = getStatusTitle(status, isPaymentMode);
|
|
1542
|
+
const description = getStatusDescription(status, {
|
|
1543
|
+
amount: toAmountFormatted,
|
|
1544
|
+
symbol: toToken?.symbol ?? "",
|
|
1545
|
+
recipientName: recipient.name,
|
|
1546
|
+
isPaymentMode,
|
|
1547
|
+
});
|
|
1548
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(SubNavBar, { title: actionLabel }), jsxRuntime.jsxs(ViewContainer, { className: "!tw-py-0", children: [jsxRuntime.jsx("div", { className: "tw-flex tw-h-20 tw-w-full tw-items-center tw-justify-center tw-bg-animation-bg [&_svg_path]:tw-stroke-[6]", children: jsxRuntime.jsx(ui.AnimationWrapper, { style: { height: "100%", maxHeight: "100%", width: "auto" }, autoplay: true, loop: true, src: progressAnimations[status] }) }), jsxRuntime.jsxs("header", { className: "tw-flex tw-w-full tw-flex-col tw-gap-squid-xs tw-px-squid-m tw-py-squid-s", children: [jsxRuntime.jsx("div", { className: "tw-flex tw-items-center tw-gap-2", children: jsxRuntime.jsx(ui.BodyText, { size: "large", className: "tw-text-grey-300", children: title }) }), jsxRuntime.jsx(ui.CaptionText, { className: "tw-text-grey-500", children: description })] }), jsxRuntime.jsxs("ul", { className: "tw-flex tw-w-full tw-flex-col tw-items-center tw-justify-center tw-gap-squid-xxs tw-rounded-squid-l tw-pb-squid-s tw-pt-squid-xs tw-squid-property-gradient-bg-odd-container", children: [jsxRuntime.jsx(ui.PropertyListItem, { icon: jsxRuntime.jsx(ui.ArrowRightUpCircleIcon, {}), label: "You send", detail: jsxRuntime.jsxs(ui.IconLabel, { src: reactHooks.getTokenImage(fromToken) ?? "", rounded: "full", children: [fromAmountFormatted, " ", fromToken?.symbol] }) }), jsxRuntime.jsx(ui.PropertyListItem, { icon: jsxRuntime.jsx(ui.ArrowRightDownCircleIcon, {}), label: `${actionLabel} amount`, detail: jsxRuntime.jsxs(ui.IconLabel, { src: reactHooks.getTokenImage(toToken) ?? "", rounded: "full", children: [toAmountFormatted, " ", toToken?.symbol] }) }), jsxRuntime.jsx(ui.PropertyListItem, { icon: jsxRuntime.jsx(ui.WalletFilledIcon, { size: "24" }), label: "Recipient", detail: jsxRuntime.jsxs("span", { className: "tw-flex tw-items-center tw-gap-squid-xxs", children: [config?.integrator.logoUrl && (jsxRuntime.jsx(ui.Image, { src: config.integrator.logoUrl, size: "medium", rounded: "full" })), recipient.name, jsxRuntime.jsxs("span", { className: "tw-text-material-light-thick", children: ["(", reactHooks.formatHash({
|
|
1549
|
+
hash: recipient.address,
|
|
1550
|
+
chainType: toToken?.type,
|
|
1551
|
+
}), ")"] })] }) }), jsxRuntime.jsx(ui.PropertyListItem, { icon: jsxRuntime.jsx(ui.TimeFliesIcon, {}), label: "Time", detail: jsxRuntime.jsx(TimeDetail, { status: status, timer: timer, estimatedTimeDisplay: estimatedTime }) })] }), jsxRuntime.jsxs("footer", { className: "tw-relative tw-flex tw-flex-col tw-p-2 tw-shrink-0 tw-self-stretch tw-mt-auto", children: [explorerLink && (jsxRuntime.jsxs("a", { href: explorerLink.url, target: "_blank", rel: "noopener noreferrer", className: "tw-group/explorer tw-w-fit tw-mx-auto tw-absolute tw-inset-x-0 tw-bottom-full tw-flex tw-justify-center tw-items-center tw-gap-1 tw-py-2 tw-text-sm tw-text-grey-300 hover:tw-text-grey-100 tw-transition-colors", children: ["View on ", explorerLink.name, jsxRuntime.jsx(ui.SquareArrowTopRightIcon, { size: "0.75rem", className: "tw-transition-all tw-duration-200 tw-w-0 tw-opacity-0 group-hover/explorer:tw-w-4 group-hover/explorer:tw-opacity-100" })] })), jsxRuntime.jsx(Button, { className: "tw-min-h-12", onClick: handleClose, children: getButtonLabel(status) })] })] })] }));
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
function Title() {
|
|
1555
|
+
const name = useDepositStore((s) => s.config?.integrator.name);
|
|
1556
|
+
const isPaymentMode = useIsPaymentMode();
|
|
1557
|
+
const paymentAmount = usePaymentAmount();
|
|
1558
|
+
const { toToken } = reactHooks.useSwap();
|
|
1559
|
+
const label = buildTitleLabel({
|
|
1560
|
+
isPaymentMode,
|
|
1561
|
+
paymentAmount,
|
|
1562
|
+
tokenSymbol: toToken?.symbol,
|
|
1563
|
+
tokenUsdPrice: toToken?.usdPrice,
|
|
1564
|
+
name,
|
|
1565
|
+
});
|
|
1566
|
+
return (jsxRuntime.jsx("div", { className: "tw-flex tw-py-1 tw-px-2 tw-items-center tw-gap-1 tw-flex-1 tw-self-stretch", children: jsxRuntime.jsx("span", { className: "tw-text-grey-100 tw-text-lg tw-font-squid-main tw-font-medium", children: label }) }));
|
|
1567
|
+
}
|
|
1568
|
+
function buildTitleLabel({ isPaymentMode, paymentAmount, tokenSymbol, tokenUsdPrice, name, }) {
|
|
1569
|
+
if (!isPaymentMode)
|
|
1570
|
+
return name ? `Deposit to ${name}` : "Deposit";
|
|
1571
|
+
if (paymentAmount && tokenSymbol) {
|
|
1572
|
+
const usdValue = tokenUsdPrice
|
|
1573
|
+
? reactHooks.convertTokenAmountToUSD(paymentAmount, tokenUsdPrice)
|
|
1574
|
+
: null;
|
|
1575
|
+
const amount = usdValue
|
|
1576
|
+
? reactHooks.formatUsdAmount(usdValue)
|
|
1577
|
+
: `${paymentAmount} ${tokenSymbol}`;
|
|
1578
|
+
return name ? `Pay ${amount} to ${name}` : `Pay ${amount}`;
|
|
1579
|
+
}
|
|
1580
|
+
return name ? `Pay ${name}` : "Pay";
|
|
1581
|
+
}
|
|
1582
|
+
|
|
1583
|
+
function ConnectPrompt() {
|
|
1584
|
+
const isPaymentMode = useIsPaymentMode();
|
|
1585
|
+
const logoUrl = useDepositStore((s) => s.config?.integrator.logoUrl);
|
|
1586
|
+
const name = useDepositStore((s) => s.config?.integrator.name);
|
|
1587
|
+
const paymentAmount = usePaymentAmount();
|
|
1588
|
+
const { toToken } = reactHooks.useSwap();
|
|
1589
|
+
const label = buildTitleLabel({
|
|
1590
|
+
isPaymentMode,
|
|
1591
|
+
paymentAmount,
|
|
1592
|
+
tokenSymbol: toToken?.symbol,
|
|
1593
|
+
tokenUsdPrice: toToken?.usdPrice,
|
|
1594
|
+
name,
|
|
1595
|
+
});
|
|
1596
|
+
const purposeCopy = `To ${isPaymentMode ? "pay" : "deposit crypto"} you'll need to connect your wallet first.`;
|
|
1597
|
+
return (jsxRuntime.jsxs("div", { className: "tw-flex tw-pt-3 tw-pb-8 tw-px-4 tw-flex-col tw-justify-end tw-items-center tw-gap-4 tw-flex-1 tw-self-stretch tw-relative", children: [jsxRuntime.jsx("div", { className: "tw-w-32", children: logoUrl && jsxRuntime.jsx("img", { className: "tw-rounded-full tw-w-full", src: logoUrl }) }), jsxRuntime.jsxs("div", { className: "tw-flex tw-pt-2 tw-pb-4 tw-flex-col tw-justify-end tw-items-center tw-gap-4 tw-self-center", children: [jsxRuntime.jsx("span", { className: "tw-text-grey-100 tw-font-medium tw-text-2xl tw-leading-3", children: label }), jsxRuntime.jsx("span", { className: "tw-text-center tw-text-material-light-average tw-font-medium tw-leading-6 tw-text-lg tw-text-balance", children: purposeCopy }), jsxRuntime.jsx("span", { className: "tw-text-material-light-thick tw-font-medium tw-leading-3 tw-text-lg", children: "Learn more" })] })] }));
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
function useTokenSelection() {
|
|
1601
|
+
const { fromToken: token, fromChain: chain } = reactHooks.useSwap();
|
|
1602
|
+
const { connectedAddress } = reactHooks.useMultiChainWallet(chain);
|
|
1603
|
+
const { balance } = reactHooks.useMultiChainBalance({
|
|
1604
|
+
chain,
|
|
1605
|
+
token: token ?? undefined,
|
|
1606
|
+
userAddress: connectedAddress.address,
|
|
1607
|
+
});
|
|
1608
|
+
return { token, chain, balance };
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
const useInputMode = zustand.create((set) => ({
|
|
1612
|
+
mode: ui.UserInputType.USD,
|
|
1613
|
+
setMode: (mode) => set({ mode }),
|
|
1614
|
+
}));
|
|
1615
|
+
|
|
1616
|
+
const placeholder = "0";
|
|
1617
|
+
const BASE_FONT_PX = 48; // tw-text-5xl = 3rem
|
|
1618
|
+
const WRAPPER_PAD_X = 20; // tw-px-squid-xs = 0.625rem × 2
|
|
1619
|
+
const MIN_SCALE = 0.5;
|
|
1620
|
+
function AmountInput({ balance = "0", token, onAmountChange, forcedAmount, maxUsdDecimals = 2, formatIfVerySmall = {
|
|
1621
|
+
token: "0.001",
|
|
1622
|
+
usd: "0.01",
|
|
1623
|
+
}, inputModeButton, debounceInput = true, allowMaxButton = true, readOnly = false, errorMessage, loading = false, forcedUsdDisplay, }) {
|
|
1624
|
+
const inputRef = React.useRef(null);
|
|
1625
|
+
const inputValueSpyRef = React.useRef(null);
|
|
1626
|
+
const inputWidthSpyRef = React.useRef(null);
|
|
1627
|
+
const wrapperRef = React.useRef(null);
|
|
1628
|
+
const { userInputType, inputValue, handleInputChange, handleSwitchInputMode, isTokenAmountVerySmall, isUsdAmountVerySmall, amountFormatted, onBalanceButtonClick, } = ui.useNumericInput({
|
|
1629
|
+
onAmountChange,
|
|
1630
|
+
token,
|
|
1631
|
+
balance,
|
|
1632
|
+
debounceInput,
|
|
1633
|
+
forcedAmount,
|
|
1634
|
+
formatIfVerySmall,
|
|
1635
|
+
inputModeButton,
|
|
1636
|
+
maxUsdDecimals,
|
|
1637
|
+
direction: "from",
|
|
1638
|
+
initialInputMode: ui.UserInputType.USD,
|
|
1639
|
+
});
|
|
1640
|
+
const setInputMode = useInputMode((s) => s.setMode);
|
|
1641
|
+
React.useEffect(() => {
|
|
1642
|
+
setInputMode(userInputType);
|
|
1643
|
+
}, [userInputType, setInputMode]);
|
|
1644
|
+
const displayedNumber = userInputType === ui.UserInputType.USD && forcedUsdDisplay && !inputValue
|
|
1645
|
+
? forcedUsdDisplay
|
|
1646
|
+
: inputValue || placeholder;
|
|
1647
|
+
const fullDisplayedNumber = userInputType === ui.UserInputType.USD
|
|
1648
|
+
? `$${displayedNumber}`
|
|
1649
|
+
: displayedNumber;
|
|
1650
|
+
React.useEffect(() => {
|
|
1651
|
+
const spy = inputValueSpyRef.current;
|
|
1652
|
+
const wrapper = wrapperRef.current;
|
|
1653
|
+
const row = wrapper?.parentElement;
|
|
1654
|
+
if (!spy || !wrapper || !row)
|
|
1655
|
+
return;
|
|
1656
|
+
const apply = () => {
|
|
1657
|
+
const containerWidth = row.clientWidth - WRAPPER_PAD_X;
|
|
1658
|
+
const spyWidth = spy.getBoundingClientRect().width;
|
|
1659
|
+
if (containerWidth === 0 || spyWidth === 0)
|
|
1660
|
+
return;
|
|
1661
|
+
// Scale against the full visible value, including the "$" prefix in USD
|
|
1662
|
+
// mode, so read-only/payment values don't overflow by the prefix width.
|
|
1663
|
+
const scale = Math.min(1, Math.max(MIN_SCALE, containerWidth / spyWidth));
|
|
1664
|
+
wrapper.style.fontSize = `${BASE_FONT_PX * scale}px`;
|
|
1665
|
+
if (inputRef.current) {
|
|
1666
|
+
const inputWidthSpy = inputWidthSpyRef.current;
|
|
1667
|
+
// Editable USD renders "$" beside the input, so the input itself must
|
|
1668
|
+
// be sized from the number-only spy. Token mode can reuse full width.
|
|
1669
|
+
const inputWidth = userInputType === ui.UserInputType.USD && inputWidthSpy
|
|
1670
|
+
? inputWidthSpy.getBoundingClientRect().width
|
|
1671
|
+
: spyWidth;
|
|
1672
|
+
inputRef.current.style.width = `${inputWidth * scale}px`;
|
|
1673
|
+
}
|
|
1674
|
+
};
|
|
1675
|
+
const observer = new ResizeObserver(apply);
|
|
1676
|
+
observer.observe(spy);
|
|
1677
|
+
observer.observe(row);
|
|
1678
|
+
apply();
|
|
1679
|
+
return () => observer.disconnect();
|
|
1680
|
+
}, [readOnly, displayedNumber, fullDisplayedNumber, userInputType]);
|
|
1681
|
+
const wrapperClassName = ui.cn("tw-text-grey-100 tw-flex tw-items-center tw-overflow-hidden tw-px-squid-xs", readOnly
|
|
1682
|
+
? "tw-cursor-default"
|
|
1683
|
+
: "tw-cursor-text focus-within:tw-bg-material-light-thin hover:tw-bg-material-light-thin group-focus-within/amount-input:tw-text-royal-500");
|
|
1684
|
+
// em so the radius scales with the wrapper's font-size (which the
|
|
1685
|
+
// auto-shrink effect mutates) — keeps the corner proportional to the
|
|
1686
|
+
// shrunk height instead of looking pill-like at small font sizes.
|
|
1687
|
+
const wrapperStyle = { borderRadius: "0.4em" };
|
|
1688
|
+
const inputContent = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { ref: inputValueSpyRef, className: "tw-pointer-events-none tw-absolute tw-opacity-0 tw-text-5xl", children: fullDisplayedNumber }), jsxRuntime.jsx("span", { ref: inputWidthSpyRef, className: "tw-pointer-events-none tw-absolute tw-opacity-0 tw-text-5xl", children: displayedNumber }), readOnly ? (jsxRuntime.jsxs("span", { className: "tw-relative tw-py-2 tw-flex tw-items-center", children: [userInputType === ui.UserInputType.USD && jsxRuntime.jsx("span", { children: "$" }), jsxRuntime.jsx(ui.AnimateNumber, { isLoading: loading, number: displayedNumber, showMask: true }), loading && (jsxRuntime.jsx("span", { className: "tw-pointer-events-none tw-absolute tw-inset-0 tw-z-10 tw-overflow-hidden", children: jsxRuntime.jsx("span", { className: "tw-absolute tw-inset-0 tw-animate-shimmer tw-bg-[length:200%_100%] tw-bg-shimmer-overlay-light dark:tw-bg-shimmer-overlay-dark" }) }))] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [userInputType === ui.UserInputType.USD && jsxRuntime.jsx("span", { children: "$" }), jsxRuntime.jsx("input", { inputMode: "decimal", pattern: "[0-9.,]*", ref: inputRef, value: inputValue, onChange: handleInputChange, className: "tw-bg-transparent tw-placeholder-grey-100 tw-outline-none focus:tw-outline-none focus:tw-placeholder-royal-500", placeholder: placeholder })] }))] }));
|
|
1689
|
+
return (jsxRuntime.jsxs("section", { className: "tw-flex tw-flex-1 tw-flex-col tw-items-center tw-justify-center tw-self-stretch tw-gap-1 tw-relative tw-overflow-hidden", children: [jsxRuntime.jsx("div", { className: "tw-flex tw-w-full tw-items-center tw-justify-center tw-self-stretch tw-text-5xl tw-group/amount-input", children: readOnly ? (jsxRuntime.jsx("div", { ref: wrapperRef, className: wrapperClassName, style: wrapperStyle, children: inputContent })) : (jsxRuntime.jsx("label", { ref: wrapperRef, className: wrapperClassName, style: wrapperStyle, children: inputContent })) }), jsxRuntime.jsxs("div", { className: "tw-relative tw-flex tw-justify-center tw-self-stretch", children: [jsxRuntime.jsxs("footer", { className: "tw-flex tw-h-squid-m tw-items-center tw-justify-center tw-text-sm tw-text-material-light-thick tw-w-fit", children: [jsxRuntime.jsx(ui.Tooltip, { ...(userInputType === ui.UserInputType.TOKEN
|
|
1690
|
+
? inputModeButton?.tokenModeTooltip
|
|
1691
|
+
: inputModeButton?.usdModeTooltip), tooltipWidth: "max", childrenClassName: "tw-rounded-squid-s", containerClassName: "tw-rounded-squid-s tw-w-fit", children: jsxRuntime.jsxs("button", { onClick: () => {
|
|
1692
|
+
handleSwitchInputMode();
|
|
1693
|
+
inputRef.current?.focus();
|
|
1694
|
+
}, className: "tw-flex tw-flex-1 tw-items-center tw-gap-squid-xxs tw-rounded-squid-s tw-px-3 tw-py-0.5 hover:tw-bg-material-light-thin", children: [userInputType === ui.UserInputType.TOKEN ? (jsxRuntime.jsxs("span", { className: "tw-flex tw-items-center tw-justify-center", children: [jsxRuntime.jsxs(ui.CaptionText, { children: [isUsdAmountVerySmall ? "<" : "", "$"] }), jsxRuntime.jsx(ui.CaptionText, { children: forcedUsdDisplay && !inputValue
|
|
1695
|
+
? forcedUsdDisplay
|
|
1696
|
+
: isUsdAmountVerySmall
|
|
1697
|
+
? formatIfVerySmall.token
|
|
1698
|
+
: amountFormatted })] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs(ui.CaptionText, { children: [isTokenAmountVerySmall ? "<" : "", isTokenAmountVerySmall
|
|
1699
|
+
? formatIfVerySmall.token
|
|
1700
|
+
: amountFormatted] }), " ", jsxRuntime.jsx(ui.CaptionText, { children: token.symbol })] })), jsxRuntime.jsx("span", { className: "tw-flex tw-items-center tw-justify-center tw-rounded-full tw-size-3 tw-bg-material-light-thin tw-aspect-square", children: jsxRuntime.jsx(ui.ChevronTopSmallIcon, {}) })] }) }), allowMaxButton && Number(balance) > 0 && (jsxRuntime.jsx("button", { onClick: () => {
|
|
1701
|
+
onBalanceButtonClick();
|
|
1702
|
+
inputRef.current?.focus();
|
|
1703
|
+
}, className: "tw-rounded-squid-s tw-px-3 tw-py-0.5 hover:tw-bg-material-light-thin", children: jsxRuntime.jsx(ui.CaptionText, { children: "MAX" }) }))] }), errorMessage && (jsxRuntime.jsx(ui.CaptionText, { className: "tw-text-status-negative tw-text-center tw-absolute tw-top-full tw-mt-2 tw-left-0 tw-right-0 tw-px-4 [text-wrap:pretty]", children: errorMessage }))] })] }));
|
|
1704
|
+
}
|
|
1705
|
+
|
|
1706
|
+
function DepositAmountInput() {
|
|
1707
|
+
const { token, balance } = useTokenSelection();
|
|
1708
|
+
const { fromAmount, fromAmountChanged, toToken } = reactHooks.useSwap();
|
|
1709
|
+
const isPaymentMode = useIsPaymentMode();
|
|
1710
|
+
const paymentAmount = usePaymentAmount();
|
|
1711
|
+
const { quotedSourceAmount, routeErrorMessage, showLoading } = useDepositRoute();
|
|
1712
|
+
const displayedAmount = isPaymentMode ? quotedSourceAmount : fromAmount;
|
|
1713
|
+
const forcedUsdDisplay = isPaymentMode && paymentAmount && toToken?.usdPrice
|
|
1714
|
+
? reactHooks.convertTokenAmountToUSD(paymentAmount, toToken.usdPrice)
|
|
1715
|
+
: undefined;
|
|
1716
|
+
return (jsxRuntime.jsx(AmountInput, { onAmountChange: fromAmountChanged, balance: balance, forcedAmount: displayedAmount, forcedUsdDisplay: forcedUsdDisplay, allowMaxButton: !isPaymentMode, readOnly: isPaymentMode, loading: isPaymentMode && showLoading, errorMessage: routeErrorMessage, token: {
|
|
1717
|
+
decimals: token?.decimals ?? 0,
|
|
1718
|
+
symbol: token?.symbol ?? "",
|
|
1719
|
+
price: token?.usdPrice ?? 0,
|
|
1720
|
+
} }));
|
|
1721
|
+
}
|
|
1722
|
+
|
|
1723
|
+
function UserRoundIcon({ size = "1.5rem", ...props }) {
|
|
1724
|
+
return (jsxRuntime.jsxs("svg", { ...props, xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntime.jsx("circle", { cx: "12", cy: "8", r: "5" }), jsxRuntime.jsx("path", { d: "M20 21a8 8 0 0 0-16 0" })] }));
|
|
1725
|
+
}
|
|
1726
|
+
|
|
1727
|
+
function Account({ direction, address, name, icon, onDisconnect, }) {
|
|
1728
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [direction === "from" && (jsxRuntime.jsx(Avatar, { icon: icon, onDisconnect: onDisconnect })), jsxRuntime.jsxs("div", { className: ui.cn("tw-flex tw-flex-col tw-justify-center tw-gap-2 tw-flex-1 tw-self-stretch", direction === "from" ? "tw-items-start" : "tw-items-end"), children: [jsxRuntime.jsx("span", { className: "tw-text-grey-100 tw-text-lg tw-leading-3", children: name }), jsxRuntime.jsx("span", { className: "tw-text-material-light-thick tw-text-sm tw-leading-3 tw-whitespace-nowrap", children: address })] }), direction === "to" && jsxRuntime.jsx(Avatar, { icon: icon })] }));
|
|
1729
|
+
}
|
|
1730
|
+
function Avatar({ icon, onDisconnect }) {
|
|
1731
|
+
const Wrapper = onDisconnect ? "button" : "div";
|
|
1732
|
+
return (jsxRuntime.jsxs(Wrapper, { onClick: onDisconnect, className: ui.cn("tw-group/avatar tw-relative tw-flex tw-size-squid-xl tw-justify-center tw-items-center tw-aspect-square tw-rounded-full tw-shadow-icon-light dark:tw-shadow-icon-dark tw-transition-colors tw-duration-200", icon ? "tw-overflow-hidden" : "tw-p-2 tw-bg-grey-100 tw-text-grey-900", onDisconnect && "hover:tw-bg-grey-300"), children: [icon ? (jsxRuntime.jsx("img", { src: icon, alt: "", className: "tw-size-full tw-object-cover" })) : (jsxRuntime.jsx(UserRoundIcon, { size: "1.3rem", className: ui.cn("tw-transition-all tw-duration-200", onDisconnect &&
|
|
1733
|
+
"group-hover/account:tw-scale-75 group-hover/account:tw-blur-sm group-hover/account:tw-opacity-0 group-focus-within/account:tw-scale-75 group-focus-within/account:tw-blur-sm group-focus-within/account:tw-opacity-0") })), onDisconnect && (jsxRuntime.jsx(ui.PowerIcon, { size: "1.25rem", className: "tw-absolute tw-scale-75 tw-blur-sm tw-opacity-0 tw-transition-all tw-duration-200 group-hover/account:tw-scale-100 group-hover/account:tw-blur-0 group-hover/account:tw-opacity-100 group-focus-within/account:tw-scale-100 group-focus-within/account:tw-blur-0 group-focus-within/account:tw-opacity-100" }))] }));
|
|
1734
|
+
}
|
|
1735
|
+
|
|
1736
|
+
function Recipient() {
|
|
1737
|
+
const { chain } = useTokenSelection();
|
|
1738
|
+
const { connectedAddress } = reactHooks.useMultiChainWallet(chain);
|
|
1739
|
+
const fromAddress = connectedAddress.address;
|
|
1740
|
+
const { disconnectWallet } = reactHooks.useWallet();
|
|
1741
|
+
const config = useDepositStore((s) => s.config);
|
|
1742
|
+
const { findChain } = reactHooks.useSquidChains();
|
|
1743
|
+
const handleDisconnect = () => {
|
|
1744
|
+
if (chain?.chainType) {
|
|
1745
|
+
void disconnectWallet(chain.chainType);
|
|
1746
|
+
}
|
|
1747
|
+
};
|
|
1748
|
+
const fromLabel = fromAddress
|
|
1749
|
+
? reactHooks.formatHash({ hash: fromAddress, chainType: chain?.chainType })
|
|
1750
|
+
: "Not connected";
|
|
1751
|
+
const toLabel = config
|
|
1752
|
+
? reactHooks.formatHash({
|
|
1753
|
+
hash: config.destinationAddress,
|
|
1754
|
+
chainType: findChain(config.destinationToken.chainId)?.chainType,
|
|
1755
|
+
})
|
|
1756
|
+
: "";
|
|
1757
|
+
return (jsxRuntime.jsxs("div", { className: "tw-flex tw-h-squid-xl tw-items-center tw-gap-2 tw-w-full tw-px-3", children: [jsxRuntime.jsx("div", { className: "tw-group/account tw-flex tw-items-center tw-gap-2 tw-flex-1 tw-min-w-0 tw-self-stretch", children: jsxRuntime.jsx(Account, { direction: "from", name: "You", address: fromLabel, onDisconnect: fromAddress ? handleDisconnect : undefined }) }), jsxRuntime.jsxs("div", { className: "tw-flex tw-items-center tw-text-material-light-thick -tw-space-x-4 tw-shrink-0", children: [jsxRuntime.jsx(ui.ChevronRightIcon, { className: "tw-opacity-33" }), jsxRuntime.jsx(ui.ChevronRightIcon, { className: "tw-opacity-66" }), jsxRuntime.jsx(ui.ChevronRightIcon, { className: "" })] }), jsxRuntime.jsx("div", { className: "tw-flex tw-items-center tw-gap-2 tw-flex-1 tw-min-w-0 tw-self-stretch", children: jsxRuntime.jsx(Account, { direction: "to", name: config?.integrator.name ?? "Recipient", address: toLabel, icon: config?.integrator.logoUrl }) })] }));
|
|
1758
|
+
}
|
|
1759
|
+
|
|
1760
|
+
function TokenBadgeIcon({ tokenSrc, chainSrc }) {
|
|
1761
|
+
return (jsxRuntime.jsxs("div", { className: "tw-size-squid-xl tw-rounded-full tw-relative tw-shrink-0", children: [jsxRuntime.jsx(ui.Image, { src: tokenSrc, size: "xlarge", rounded: "full", shadow: true, border: "inset" }), chainSrc && (jsxRuntime.jsx("span", { className: "tw-absolute -tw-bottom-1 -tw-left-1", children: jsxRuntime.jsx(ui.Image, { src: chainSrc, size: "small", rounded: "xxs", style: { width: "1rem", height: "1rem" }, border: "outline-sm" }) }))] }));
|
|
1762
|
+
}
|
|
1763
|
+
|
|
1764
|
+
function TokenSelector() {
|
|
1765
|
+
const push = useRouter((s) => s.push);
|
|
1766
|
+
const { token, chain, balance } = useTokenSelection();
|
|
1767
|
+
const inputMode = useInputMode((s) => s.mode);
|
|
1768
|
+
const isUsdMode = inputMode === ui.UserInputType.USD;
|
|
1769
|
+
const balanceNum = +balance;
|
|
1770
|
+
const formattedBalance = balanceNum > 0
|
|
1771
|
+
? isUsdMode
|
|
1772
|
+
? reactHooks.formatUsdAmount(balanceNum * (token?.usdPrice ?? 0))
|
|
1773
|
+
: reactHooks.formatTokenAmount(balance, { exact: false })
|
|
1774
|
+
: undefined;
|
|
1775
|
+
return (jsxRuntime.jsxs("button", { onClick: () => push({ id: "select-token" }), className: "tw-flex tw-gap-2 tw-items-center tw-self-stretch hover:tw-bg-material-light-thin tw-px-3 tw-py-1.5 tw-rounded-3xl", children: [token && chain ? (jsxRuntime.jsx(TokenBadgeIcon, { tokenSrc: reactHooks.getTokenImage(token), chainSrc: chain.chainIconURI })) : (jsxRuntime.jsx("span", { className: "tw-text-grey-900 tw-text-lg tw-leading-3 tw-flex tw-items-center tw-justify-center tw-size-squid-xl tw-bg-royal-500 tw-rounded-full", children: jsxRuntime.jsx(ui.PlusIcon, { size: "1.6rem" }) })), jsxRuntime.jsx("div", { className: "tw-flex tw-flex-col tw-items-start tw-justify-center tw-gap-2 tw-self-stretch tw-flex-1", children: token ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: "tw-text-grey-100 tw-text-lg tw-font-medium tw-leading-3", children: token.name }), jsxRuntime.jsxs("div", { className: "tw-flex tw-justify-center tw-items-center tw-gap-1", children: [formattedBalance && (jsxRuntime.jsx("span", { className: "tw-text-sm tw-text-material-light-thick tw-leading-3", children: formattedBalance })), jsxRuntime.jsx("span", { className: "tw-text-sm tw-text-material-light-average tw-leading-3", children: token.symbol })] })] })) : (jsxRuntime.jsx("span", { className: "tw-text-grey-100 tw-text-lg tw-font-medium tw-leading-3", children: "Select a token" })) }), jsxRuntime.jsx("span", { className: "tw-size-8 tw-flex tw-items-center tw-justify-center", children: jsxRuntime.jsx(ui.ChevronDownSmallIcon, { className: "tw-text-material-light-thick", size: "1.6rem", strokeWidth: "1.2" }) })] }));
|
|
1776
|
+
}
|
|
1777
|
+
|
|
1778
|
+
function DepositForm() {
|
|
1779
|
+
return (jsxRuntime.jsxs("div", { className: "tw-flex tw-pb-3 tw-pt-1 tw-flex-col tw-items-center tw-flex-1 tw-self-stretch tw-gap-2 tw-px-1", children: [jsxRuntime.jsx(TokenSelector, {}), jsxRuntime.jsx(DepositAmountInput, {}), jsxRuntime.jsx(Recipient, {})] }));
|
|
1780
|
+
}
|
|
1781
|
+
|
|
1782
|
+
function useMainCTAButtonState() {
|
|
1783
|
+
const push = useRouter((store) => store.push);
|
|
1784
|
+
const { connectedWallets, isChainTypeConnected } = reactHooks.useWallet();
|
|
1785
|
+
const { token, chain, balance } = useTokenSelection();
|
|
1786
|
+
const { fromAmount: typedAmount, fromAmountChanged } = reactHooks.useSwap();
|
|
1787
|
+
const isPaymentMode = useIsPaymentMode();
|
|
1788
|
+
const isConnected = connectedWallets.length > 0;
|
|
1789
|
+
const { routeData, quotedSourceAmount, showLoading: isRouteLoading, } = useDepositRoute();
|
|
1790
|
+
const amount = isPaymentMode ? quotedSourceAmount : typedAmount;
|
|
1791
|
+
const { routeApproved, approveRoute } = reactHooks.useApproval({
|
|
1792
|
+
squidRoute: routeData,
|
|
1793
|
+
});
|
|
1794
|
+
const { executeSwap, isLoading: isExecuting } = reactHooks.useExecuteTransaction(routeData);
|
|
1795
|
+
const { minAmountValueWarnMsg, fromTokenPaysGasFees, isGasBalanceEnough } = reactHooks.useEstimate(routeData);
|
|
1796
|
+
if (!isConnected) {
|
|
1797
|
+
return {
|
|
1798
|
+
label: "Connect wallet",
|
|
1799
|
+
onClick: () => push({ id: "connect-wallet", chainType: null }),
|
|
1800
|
+
};
|
|
1801
|
+
}
|
|
1802
|
+
if (chain && !isChainTypeConnected(chain.chainType)) {
|
|
1803
|
+
return {
|
|
1804
|
+
label: "Connect wallet",
|
|
1805
|
+
onClick: () => push({ id: "connect-wallet", chainType: chain.chainType }),
|
|
1806
|
+
};
|
|
1807
|
+
}
|
|
1808
|
+
if (!token) {
|
|
1809
|
+
return {
|
|
1810
|
+
label: "Select a token",
|
|
1811
|
+
disabled: true,
|
|
1812
|
+
};
|
|
1813
|
+
}
|
|
1814
|
+
if (!amount || amount === "0") {
|
|
1815
|
+
return {
|
|
1816
|
+
label: "Enter amount",
|
|
1817
|
+
disabled: true,
|
|
1818
|
+
};
|
|
1819
|
+
}
|
|
1820
|
+
if (!balance || Number(amount) > Number(balance)) {
|
|
1821
|
+
return {
|
|
1822
|
+
label: "Insufficient balance",
|
|
1823
|
+
disabled: true,
|
|
1824
|
+
};
|
|
1825
|
+
}
|
|
1826
|
+
if (isRouteLoading) {
|
|
1827
|
+
return {
|
|
1828
|
+
label: "Getting quotes...",
|
|
1829
|
+
disabled: true,
|
|
1830
|
+
isLoading: true,
|
|
1831
|
+
};
|
|
1832
|
+
}
|
|
1833
|
+
if (!routeData) {
|
|
1834
|
+
return {
|
|
1835
|
+
label: "No route available",
|
|
1836
|
+
disabled: true,
|
|
1837
|
+
};
|
|
1838
|
+
}
|
|
1839
|
+
if (fromTokenPaysGasFees &&
|
|
1840
|
+
!isGasBalanceEnough &&
|
|
1841
|
+
minAmountValueWarnMsg !== undefined &&
|
|
1842
|
+
Number(minAmountValueWarnMsg) > 0) {
|
|
1843
|
+
return {
|
|
1844
|
+
label: "Fit gas",
|
|
1845
|
+
onClick: () => fromAmountChanged(minAmountValueWarnMsg),
|
|
1846
|
+
};
|
|
1847
|
+
}
|
|
1848
|
+
if (routeApproved.isLoading) {
|
|
1849
|
+
return {
|
|
1850
|
+
label: "Checking approval...",
|
|
1851
|
+
disabled: true,
|
|
1852
|
+
isLoading: true,
|
|
1853
|
+
};
|
|
1854
|
+
}
|
|
1855
|
+
if (routeApproved.data === false) {
|
|
1856
|
+
if (approveRoute.isLoading) {
|
|
1857
|
+
return {
|
|
1858
|
+
label: "Approving...",
|
|
1859
|
+
disabled: true,
|
|
1860
|
+
isLoading: true,
|
|
1861
|
+
};
|
|
1862
|
+
}
|
|
1863
|
+
return {
|
|
1864
|
+
label: `Approve ${token.symbol}`,
|
|
1865
|
+
onClick: () => approveRoute.mutate(),
|
|
1866
|
+
};
|
|
1867
|
+
}
|
|
1868
|
+
if (isExecuting) {
|
|
1869
|
+
return {
|
|
1870
|
+
label: isPaymentMode ? "Paying..." : "Depositing...",
|
|
1871
|
+
disabled: true,
|
|
1872
|
+
isLoading: true,
|
|
1873
|
+
};
|
|
1874
|
+
}
|
|
1875
|
+
return {
|
|
1876
|
+
label: isPaymentMode ? "Pay" : "Deposit",
|
|
1877
|
+
onClick: () => {
|
|
1878
|
+
void executeSwap();
|
|
1879
|
+
push({ id: "transaction-progress" });
|
|
1880
|
+
},
|
|
1881
|
+
};
|
|
1882
|
+
}
|
|
1883
|
+
|
|
1884
|
+
function MainCTAButton() {
|
|
1885
|
+
const { label, onClick, disabled } = useMainCTAButtonState();
|
|
1886
|
+
return (jsxRuntime.jsx("footer", { className: "tw-flex tw-h-16 tw-p-2 tw-items-start tw-shrink-0 tw-self-stretch", children: jsxRuntime.jsx(Button, { onClick: onClick, disabled: disabled, children: label }) }));
|
|
1887
|
+
}
|
|
1888
|
+
|
|
1889
|
+
function Actions() {
|
|
1890
|
+
const push = useRouter((s) => s.push);
|
|
1891
|
+
const { connectedWallets } = reactHooks.useWallet();
|
|
1892
|
+
const isConnected = connectedWallets.length > 0;
|
|
1893
|
+
if (!isConnected)
|
|
1894
|
+
return null;
|
|
1895
|
+
return (jsxRuntime.jsx("div", { className: "tw-flex tw-justify-end tw-items-center tw-gap-1", children: jsxRuntime.jsx(ui.IconButton, { onClick: () => push({ id: "transaction-history" }), icon: jsxRuntime.jsx(ui.ClockOutlineIcon, { className: "tw-text-material-light-thick", size: "1.5rem" }) }) }));
|
|
1896
|
+
}
|
|
1897
|
+
|
|
1898
|
+
function Icon() {
|
|
1899
|
+
const logoUrl = useDepositStore((s) => s.config?.integrator.logoUrl);
|
|
1900
|
+
return (jsxRuntime.jsx("div", { className: "tw-flex tw-size-10 tw-justify-center tw-items-center tw-rounded-squid-m tw-shadow-icon-light dark:tw-shadow-icon-dark tw-bg-grey-900", children: logoUrl && jsxRuntime.jsx("img", { className: "tw-rounded-full", src: logoUrl }) }));
|
|
1901
|
+
}
|
|
1902
|
+
|
|
1903
|
+
function NavBar() {
|
|
1904
|
+
return (jsxRuntime.jsxs(BaseNavBar, { className: "tw-justify-between", children: [jsxRuntime.jsx(Icon, {}), jsxRuntime.jsx(Title, {}), jsxRuntime.jsx(Actions, {})] }));
|
|
1905
|
+
}
|
|
1906
|
+
|
|
1907
|
+
function MainView() {
|
|
1908
|
+
const { connectedWallets } = reactHooks.useWallet();
|
|
1909
|
+
const isConnected = connectedWallets.length > 0;
|
|
1910
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [isConnected && jsxRuntime.jsx(NavBar, {}), jsxRuntime.jsxs(ViewContainer, { className: ui.cn(!isConnected && "tw-border-t-0"), children: [isConnected ? jsxRuntime.jsx(DepositForm, {}) : jsxRuntime.jsx(ConnectPrompt, {}), jsxRuntime.jsx(MainCTAButton, {})] })] }));
|
|
1911
|
+
}
|
|
1912
|
+
|
|
1913
|
+
function QrCodeView() {
|
|
1914
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(SubNavBar, { title: "QR Code" }), jsxRuntime.jsx("div", { className: "tw-flex tw-flex-1 tw-items-center tw-justify-center tw-self-stretch", children: jsxRuntime.jsx("span", { className: "tw-text-grey-100 tw-text-lg tw-font-medium", children: "QR Code" }) })] }));
|
|
1915
|
+
}
|
|
1916
|
+
|
|
1917
|
+
function SelectChainView({ wallet }) {
|
|
1918
|
+
const popToRoot = useRouter((s) => s.popToRoot);
|
|
1919
|
+
const { connectWallet, connectingWalletState } = reactHooks.useWallet();
|
|
1920
|
+
const [connectingChainType, setConnectingChainType] = React.useState(null);
|
|
1921
|
+
if (!wallet.isMultiChain)
|
|
1922
|
+
return null;
|
|
1923
|
+
const networks = wallet.supportedNetworks;
|
|
1924
|
+
const isConnecting = connectingWalletState.status === reactHooks.ConnectingWalletStatus.CONNECTING &&
|
|
1925
|
+
connectingWalletState.wallet?.connectorId === wallet.connectorId;
|
|
1926
|
+
const onChainSelected = async (chainType) => {
|
|
1927
|
+
setConnectingChainType(chainType);
|
|
1928
|
+
try {
|
|
1929
|
+
const connected = await connectWallet({
|
|
1930
|
+
wallet,
|
|
1931
|
+
selectedChainTypes: [chainType],
|
|
1932
|
+
});
|
|
1933
|
+
if (connected) {
|
|
1934
|
+
popToRoot();
|
|
1935
|
+
}
|
|
1936
|
+
}
|
|
1937
|
+
catch (error) {
|
|
1938
|
+
console.error("Failed to connect wallet:", error);
|
|
1939
|
+
setConnectingChainType(null);
|
|
1940
|
+
}
|
|
1941
|
+
};
|
|
1942
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(SubNavBar, { title: "Select network" }), jsxRuntime.jsxs("div", { className: "tw-flex tw-flex-col tw-items-center tw-gap-2 tw-px-4 tw-py-5 tw-border-b tw-border-grey-800", children: [wallet.icon && (jsxRuntime.jsx("img", { src: wallet.icon, alt: wallet.name, className: "tw-size-12 tw-rounded-xl" })), jsxRuntime.jsxs("div", { className: "tw-flex tw-flex-col tw-items-center tw-self-stretch", children: [jsxRuntime.jsxs("span", { className: "tw-text-material-light-thick tw-text-base tw-text-center", children: [wallet.name, " supports multiple ecosystems."] }), jsxRuntime.jsx("span", { className: "tw-text-material-light-thick tw-text-base tw-text-center", children: "Select one to connect." })] })] }), jsxRuntime.jsx("ul", { className: "tw-flex tw-flex-col tw-items-start tw-flex-1 tw-self-stretch tw-py-1 tw-overflow-auto", children: networks.map((network) => {
|
|
1943
|
+
const meta = CHAIN_TYPE_META[network.chainType];
|
|
1944
|
+
return (jsxRuntime.jsx("li", { className: "tw-self-stretch", children: jsxRuntime.jsxs("button", { className: "tw-flex tw-min-h-14 tw-h-14 tw-px-4 tw-items-center tw-gap-3 tw-self-stretch tw-w-full hover:tw-bg-material-light-thin", disabled: isConnecting, onClick: () => onChainSelected(network.chainType), children: [jsxRuntime.jsx("div", { className: "tw-flex tw-size-squid-xl tw-justify-center tw-items-center tw-aspect-square tw-rounded-xl tw-shadow-icon-light dark:tw-shadow-icon-dark", children: jsxRuntime.jsx("img", { src: meta.icon, alt: meta.name, className: "tw-size-full tw-rounded-xl" }) }), jsxRuntime.jsx("span", { className: "tw-text-grey-200 tw-text-lg tw-flex-1 tw-text-left", children: meta.name }), isConnecting && connectingChainType === network.chainType && (jsxRuntime.jsx(ui.Loader, { size: "20", className: "tw-text-grey-100" }))] }) }, network.chainType));
|
|
1945
|
+
}) })] }));
|
|
1946
|
+
}
|
|
1947
|
+
|
|
1948
|
+
function sortTokensByBalance(tokens) {
|
|
1949
|
+
return tokens.toSorted((a, b) => {
|
|
1950
|
+
const aUsd = +a.balance * +(a.usdPrice ?? 0);
|
|
1951
|
+
const bUsd = +b.balance * +(b.usdPrice ?? 0);
|
|
1952
|
+
if (aUsd !== bUsd)
|
|
1953
|
+
return bUsd - aUsd;
|
|
1954
|
+
return +(b.balance ?? 0) - +(a.balance ?? 0);
|
|
1955
|
+
});
|
|
1956
|
+
}
|
|
1957
|
+
function filterTokensByChain(tokens, chainId) {
|
|
1958
|
+
return chainId ? tokens.filter((token) => token.chainId === chainId) : tokens;
|
|
1959
|
+
}
|
|
1960
|
+
|
|
1961
|
+
function TokenListItem({ icon, chainIcon, symbol, name, balance, price, usdValue, disabled, isLoadingBalance, ...props }) {
|
|
1962
|
+
const showUsdOnHover = (usdValue ?? 0) > 0;
|
|
1963
|
+
return (jsxRuntime.jsx("li", { className: "tw-self-stretch", children: jsxRuntime.jsxs("button", { "aria-disabled": disabled, tabIndex: disabled ? -1 : undefined, title: disabled ? "Insufficient balance" : undefined, className: ui.cn("tw-group/token-item tw-flex tw-h-14 tw-px-4 tw-items-center tw-gap-2 tw-self-stretch tw-w-full hover:tw-bg-material-light-thin", disabled && "tw-opacity-40 tw-cursor-not-allowed"), ...props, children: [jsxRuntime.jsx(TokenBadgeIcon, { tokenSrc: icon, chainSrc: chainIcon }), jsxRuntime.jsxs("div", { className: "tw-flex tw-flex-col tw-justify-center tw-gap-0.5 tw-items-start tw-flex-1 tw-self-stretch tw-overflow-hidden -tw-mt-2", children: [jsxRuntime.jsx("span", { className: "tw-text-grey-100 tw-text-lg tw-truncate tw-max-w-full", children: name }), jsxRuntime.jsxs("div", { className: "tw-flex tw-justify-center tw-items-center tw-gap-1 tw-leading-[0.7]", children: [isLoadingBalance ? (jsxRuntime.jsx(ui.TextSkeleton, { width: "3em", className: "tw-h-3", isLoading: true })) : showUsdOnHover ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [balance && (jsxRuntime.jsx("span", { className: "tw-text-sm tw-text-material-light-thick tw-leading-[inherit] group-hover/token-item:tw-hidden", children: balance })), jsxRuntime.jsx("span", { className: "tw-text-sm tw-text-material-light-thick tw-leading-[inherit] tw-hidden group-hover/token-item:tw-inline", children: reactHooks.formatUsdAmount(usdValue) })] })) : (balance && (jsxRuntime.jsx("span", { className: "tw-text-sm tw-text-material-light-thick tw-leading-[inherit]", children: balance }))), jsxRuntime.jsx("span", { className: "tw-text-sm tw-text-material-light-average tw-leading-[inherit]", children: symbol })] })] }), jsxRuntime.jsx("div", { className: "tw-flex tw-items-start tw-justify-center tw-text-material-light-thick", children: reactHooks.formatUsdAmount(price) })] }) }));
|
|
1964
|
+
}
|
|
1965
|
+
|
|
1966
|
+
function isSameTx(tx, pending) {
|
|
1967
|
+
if (!tx.transactionId || !pending.transactionId)
|
|
1968
|
+
return false;
|
|
1969
|
+
return tx.transactionId.toLowerCase() === pending.transactionId.toLowerCase();
|
|
1970
|
+
}
|
|
1971
|
+
function isSameAddress(a, b) {
|
|
1972
|
+
return a.trim().toLowerCase() === b.trim().toLowerCase();
|
|
1973
|
+
}
|
|
1974
|
+
function matchesDestinationToken(toToken, destinationToken) {
|
|
1975
|
+
return (toToken.chainId === destinationToken.chainId &&
|
|
1976
|
+
isSameAddress(toToken.address, destinationToken.address));
|
|
1977
|
+
}
|
|
1978
|
+
function isPaymentTx(tx, paymentAmount, destinationTokenDecimals) {
|
|
1979
|
+
try {
|
|
1980
|
+
const expected = reactHooks.parseToBigInt(paymentAmount, destinationTokenDecimals);
|
|
1981
|
+
return tx.quote.route.estimate.toAmount === expected.toString();
|
|
1982
|
+
}
|
|
1983
|
+
catch {
|
|
1984
|
+
return false;
|
|
1985
|
+
}
|
|
1986
|
+
}
|
|
1987
|
+
|
|
1988
|
+
const selectedOutline = "tw-outline tw-outline-2 tw-outline-material-light-thick tw-outline-offset-2";
|
|
1989
|
+
function TokenRow({ index, style, tokens, chainIconMap, onSelect, paymentAmountUsd, isLoadingBalances, }) {
|
|
1990
|
+
const token = tokens[index];
|
|
1991
|
+
if (!token)
|
|
1992
|
+
return null;
|
|
1993
|
+
const balanceNum = +token.balance;
|
|
1994
|
+
const balanceUsd = balanceNum * (token.usdPrice ?? 0);
|
|
1995
|
+
const insufficientBalance = !isLoadingBalances &&
|
|
1996
|
+
paymentAmountUsd !== null &&
|
|
1997
|
+
balanceUsd < paymentAmountUsd;
|
|
1998
|
+
return (jsxRuntime.jsx("div", { style: style, children: jsxRuntime.jsx(TokenListItem, { balance: balanceNum > 0
|
|
1999
|
+
? reactHooks.formatTokenAmount(token.balance, { exact: false })
|
|
2000
|
+
: "", icon: reactHooks.getTokenImage(token), chainIcon: chainIconMap[token.chainId], name: token.name, price: token.usdPrice ?? 0, usdValue: balanceUsd, symbol: token.symbol, disabled: insufficientBalance, isLoadingBalance: isLoadingBalances, onClick: () => !insufficientBalance && onSelect(token) }) }));
|
|
2001
|
+
}
|
|
2002
|
+
function SelectTokenView() {
|
|
2003
|
+
const { tokens, isInitialLoading: isLoadingBalances } = reactHooks.useAllConnectedWalletBalances();
|
|
2004
|
+
const { chains } = reactHooks.useSquidChains();
|
|
2005
|
+
const { onSwapChange, toToken } = reactHooks.useSwap();
|
|
2006
|
+
const pop = useRouter((s) => s.pop);
|
|
2007
|
+
const destinationToken = useDepositStore((s) => s.config?.destinationToken);
|
|
2008
|
+
const paymentAmount = usePaymentAmount();
|
|
2009
|
+
const paymentAmountUsd = paymentAmount
|
|
2010
|
+
? Number(paymentAmount) * (toToken?.usdPrice ?? 0)
|
|
2011
|
+
: null;
|
|
2012
|
+
const onSelect = (token) => {
|
|
2013
|
+
onSwapChange({
|
|
2014
|
+
fromChainId: token.chainId,
|
|
2015
|
+
fromTokenAddress: token.address,
|
|
2016
|
+
});
|
|
2017
|
+
pop();
|
|
2018
|
+
};
|
|
2019
|
+
const searchRef = React.useRef(null);
|
|
2020
|
+
const [selectedChainId, setSelectedChainId] = React.useState(null);
|
|
2021
|
+
const [search, setSearch] = React.useState("");
|
|
2022
|
+
React.useEffect(() => {
|
|
2023
|
+
const timer = setTimeout(() => searchRef.current?.focus({ preventScroll: true }), VIEW_TRANSITION_DURATION_MS);
|
|
2024
|
+
return () => clearTimeout(timer);
|
|
2025
|
+
}, []);
|
|
2026
|
+
const chainIconMap = React.useMemo(() => Object.fromEntries(chains.map((c) => [c.chainId, c.chainIconURI])), [chains]);
|
|
2027
|
+
const filteredTokens = React.useMemo(() => {
|
|
2028
|
+
const viewableTokens = reactHooks.filterViewableTokens(tokens, {});
|
|
2029
|
+
const chainFiltered = filterTokensByChain(viewableTokens, selectedChainId);
|
|
2030
|
+
const withoutDestToken = destinationToken
|
|
2031
|
+
? chainFiltered.filter((t) => !(t.chainId === destinationToken.chainId &&
|
|
2032
|
+
isSameAddress(t.address, destinationToken.address)))
|
|
2033
|
+
: chainFiltered;
|
|
2034
|
+
const matched = search
|
|
2035
|
+
? reactHooks.searchTokens(search, withoutDestToken, chains)
|
|
2036
|
+
: withoutDestToken;
|
|
2037
|
+
return sortTokensByBalance(matched);
|
|
2038
|
+
}, [tokens, selectedChainId, search, chains, destinationToken]);
|
|
2039
|
+
const selectChain = (chainId) => {
|
|
2040
|
+
setSelectedChainId(chainId);
|
|
2041
|
+
searchRef.current?.focus();
|
|
2042
|
+
};
|
|
2043
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(SubNavBar, { input: {
|
|
2044
|
+
ref: searchRef,
|
|
2045
|
+
placeholder: "Select coin",
|
|
2046
|
+
value: search,
|
|
2047
|
+
onChange: (e) => setSearch(e.target.value),
|
|
2048
|
+
} }), jsxRuntime.jsxs(ViewContainer, { children: [jsxRuntime.jsxs("div", { role: "radiogroup", "aria-label": "Filter by chain", className: "tw-flex tw-h-14 tw-px-4 tw-items-center tw-justify-stretch tw-gap-3 tw-self-stretch tw-w-full tw-overflow-auto tw-min-h-14 tw-scrollbar-hidden", children: [jsxRuntime.jsx(ui.Button, { role: "radio", "aria-checked": selectedChainId === null, size: "sm", variant: "tertiary", className: ui.cn("!tw-p-3 !tw-h-8", selectedChainId === null && selectedOutline), onClick: () => selectChain(null), children: jsxRuntime.jsx("span", { className: "tw-text-xs", children: "ALL" }) }), chains.map((chain) => (jsxRuntime.jsx("button", { role: "radio", "aria-checked": selectedChainId === chain.chainId, className: ui.cn("tw-shrink-0 tw-rounded-squid-xs", selectedChainId === chain.chainId && selectedOutline), onClick: () => selectChain(chain.chainId), children: jsxRuntime.jsx(ui.Image, { size: "large", rounded: "xs", shadow: true, style: { width: "2rem", height: "2rem" }, src: chain.chainIconURI }) }, chain.chainId)))] }), filteredTokens.length > 0 ? (jsxRuntime.jsx(reactWindow.List, { tagName: "ul", className: "tw-scrollbar-hidden tw-flex-1 tw-self-stretch", style: { flex: "1 1 0" }, rowCount: filteredTokens.length, rowHeight: 56, rowComponent: TokenRow, rowProps: {
|
|
2049
|
+
tokens: filteredTokens,
|
|
2050
|
+
chainIconMap,
|
|
2051
|
+
onSelect,
|
|
2052
|
+
paymentAmountUsd,
|
|
2053
|
+
isLoadingBalances,
|
|
2054
|
+
}, overscanCount: 5 })) : (jsxRuntime.jsx("div", { className: "tw-flex tw-flex-1 tw-items-center tw-justify-center tw-self-stretch tw-px-4", children: jsxRuntime.jsx("span", { className: "tw-text-material-light-thick tw-text-lg tw-font-medium tw-text-center tw-truncate tw-max-w-full", children: search ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: ["No tokens matching \"", jsxRuntime.jsx("span", { className: "tw-text-grey-100", children: search }), "\""] })) : ("No tokens found") }) }))] })] }));
|
|
2055
|
+
}
|
|
2056
|
+
|
|
2057
|
+
class Subscribable {
|
|
2058
|
+
constructor() {
|
|
2059
|
+
this.listeners = new Set();
|
|
2060
|
+
this.subscribe = this.subscribe.bind(this);
|
|
2061
|
+
}
|
|
2062
|
+
|
|
2063
|
+
subscribe(listener) {
|
|
2064
|
+
const identity = {
|
|
2065
|
+
listener
|
|
2066
|
+
};
|
|
2067
|
+
this.listeners.add(identity);
|
|
2068
|
+
this.onSubscribe();
|
|
2069
|
+
return () => {
|
|
2070
|
+
this.listeners.delete(identity);
|
|
2071
|
+
this.onUnsubscribe();
|
|
2072
|
+
};
|
|
2073
|
+
}
|
|
2074
|
+
|
|
2075
|
+
hasListeners() {
|
|
2076
|
+
return this.listeners.size > 0;
|
|
2077
|
+
}
|
|
2078
|
+
|
|
2079
|
+
onSubscribe() {// Do nothing
|
|
2080
|
+
}
|
|
2081
|
+
|
|
2082
|
+
onUnsubscribe() {// Do nothing
|
|
2083
|
+
}
|
|
2084
|
+
|
|
2085
|
+
}
|
|
2086
|
+
|
|
2087
|
+
// TYPES
|
|
2088
|
+
// UTILS
|
|
2089
|
+
const isServer = typeof window === 'undefined' || 'Deno' in window;
|
|
2090
|
+
function noop() {
|
|
2091
|
+
return undefined;
|
|
2092
|
+
}
|
|
2093
|
+
function isValidTimeout(value) {
|
|
2094
|
+
return typeof value === 'number' && value >= 0 && value !== Infinity;
|
|
2095
|
+
}
|
|
2096
|
+
function difference(array1, array2) {
|
|
2097
|
+
return array1.filter(x => !array2.includes(x));
|
|
2098
|
+
}
|
|
2099
|
+
function replaceAt(array, index, value) {
|
|
2100
|
+
const copy = array.slice(0);
|
|
2101
|
+
copy[index] = value;
|
|
2102
|
+
return copy;
|
|
2103
|
+
}
|
|
2104
|
+
function timeUntilStale(updatedAt, staleTime) {
|
|
2105
|
+
return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0);
|
|
2106
|
+
}
|
|
2107
|
+
/**
|
|
2108
|
+
* This function returns `a` if `b` is deeply equal.
|
|
2109
|
+
* If not, it will replace any deeply equal children of `b` with those of `a`.
|
|
2110
|
+
* This can be used for structural sharing between JSON values for example.
|
|
2111
|
+
*/
|
|
2112
|
+
|
|
2113
|
+
function replaceEqualDeep(a, b) {
|
|
2114
|
+
if (a === b) {
|
|
2115
|
+
return a;
|
|
2116
|
+
}
|
|
2117
|
+
|
|
2118
|
+
const array = isPlainArray(a) && isPlainArray(b);
|
|
2119
|
+
|
|
2120
|
+
if (array || isPlainObject(a) && isPlainObject(b)) {
|
|
2121
|
+
const aSize = array ? a.length : Object.keys(a).length;
|
|
2122
|
+
const bItems = array ? b : Object.keys(b);
|
|
2123
|
+
const bSize = bItems.length;
|
|
2124
|
+
const copy = array ? [] : {};
|
|
2125
|
+
let equalItems = 0;
|
|
2126
|
+
|
|
2127
|
+
for (let i = 0; i < bSize; i++) {
|
|
2128
|
+
const key = array ? i : bItems[i];
|
|
2129
|
+
copy[key] = replaceEqualDeep(a[key], b[key]);
|
|
2130
|
+
|
|
2131
|
+
if (copy[key] === a[key]) {
|
|
2132
|
+
equalItems++;
|
|
2133
|
+
}
|
|
2134
|
+
}
|
|
2135
|
+
|
|
2136
|
+
return aSize === bSize && equalItems === aSize ? a : copy;
|
|
2137
|
+
}
|
|
2138
|
+
|
|
2139
|
+
return b;
|
|
2140
|
+
}
|
|
2141
|
+
/**
|
|
2142
|
+
* Shallow compare objects. Only works with objects that always have the same properties.
|
|
2143
|
+
*/
|
|
2144
|
+
|
|
2145
|
+
function shallowEqualObjects(a, b) {
|
|
2146
|
+
if (a && !b || b && !a) {
|
|
2147
|
+
return false;
|
|
2148
|
+
}
|
|
2149
|
+
|
|
2150
|
+
for (const key in a) {
|
|
2151
|
+
if (a[key] !== b[key]) {
|
|
2152
|
+
return false;
|
|
2153
|
+
}
|
|
2154
|
+
}
|
|
2155
|
+
|
|
2156
|
+
return true;
|
|
2157
|
+
}
|
|
2158
|
+
function isPlainArray(value) {
|
|
2159
|
+
return Array.isArray(value) && value.length === Object.keys(value).length;
|
|
2160
|
+
} // Copied from: https://github.com/jonschlinkert/is-plain-object
|
|
2161
|
+
|
|
2162
|
+
function isPlainObject(o) {
|
|
2163
|
+
if (!hasObjectPrototype(o)) {
|
|
2164
|
+
return false;
|
|
2165
|
+
} // If has modified constructor
|
|
2166
|
+
|
|
2167
|
+
|
|
2168
|
+
const ctor = o.constructor;
|
|
2169
|
+
|
|
2170
|
+
if (typeof ctor === 'undefined') {
|
|
2171
|
+
return true;
|
|
2172
|
+
} // If has modified prototype
|
|
2173
|
+
|
|
2174
|
+
|
|
2175
|
+
const prot = ctor.prototype;
|
|
2176
|
+
|
|
2177
|
+
if (!hasObjectPrototype(prot)) {
|
|
2178
|
+
return false;
|
|
2179
|
+
} // If constructor does not have an Object-specific method
|
|
2180
|
+
|
|
2181
|
+
|
|
2182
|
+
if (!prot.hasOwnProperty('isPrototypeOf')) {
|
|
2183
|
+
return false;
|
|
2184
|
+
} // Most likely a plain Object
|
|
2185
|
+
|
|
2186
|
+
|
|
2187
|
+
return true;
|
|
2188
|
+
}
|
|
2189
|
+
|
|
2190
|
+
function hasObjectPrototype(o) {
|
|
2191
|
+
return Object.prototype.toString.call(o) === '[object Object]';
|
|
2192
|
+
}
|
|
2193
|
+
function sleep(timeout) {
|
|
2194
|
+
return new Promise(resolve => {
|
|
2195
|
+
setTimeout(resolve, timeout);
|
|
2196
|
+
});
|
|
2197
|
+
}
|
|
2198
|
+
/**
|
|
2199
|
+
* Schedules a microtask.
|
|
2200
|
+
* This can be useful to schedule state updates after rendering.
|
|
2201
|
+
*/
|
|
2202
|
+
|
|
2203
|
+
function scheduleMicrotask(callback) {
|
|
2204
|
+
sleep(0).then(callback);
|
|
2205
|
+
}
|
|
2206
|
+
function replaceData(prevData, data, options) {
|
|
2207
|
+
// Use prev data if an isDataEqual function is defined and returns `true`
|
|
2208
|
+
if (options.isDataEqual != null && options.isDataEqual(prevData, data)) {
|
|
2209
|
+
return prevData;
|
|
2210
|
+
} else if (typeof options.structuralSharing === 'function') {
|
|
2211
|
+
return options.structuralSharing(prevData, data);
|
|
2212
|
+
} else if (options.structuralSharing !== false) {
|
|
2213
|
+
// Structurally share data between prev and new data if needed
|
|
2214
|
+
return replaceEqualDeep(prevData, data);
|
|
2215
|
+
}
|
|
2216
|
+
|
|
2217
|
+
return data;
|
|
2218
|
+
}
|
|
2219
|
+
|
|
2220
|
+
class FocusManager extends Subscribable {
|
|
2221
|
+
constructor() {
|
|
2222
|
+
super();
|
|
2223
|
+
|
|
2224
|
+
this.setup = onFocus => {
|
|
2225
|
+
// addEventListener does not exist in React Native, but window does
|
|
2226
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
2227
|
+
if (!isServer && window.addEventListener) {
|
|
2228
|
+
const listener = () => onFocus(); // Listen to visibillitychange and focus
|
|
2229
|
+
|
|
2230
|
+
|
|
2231
|
+
window.addEventListener('visibilitychange', listener, false);
|
|
2232
|
+
window.addEventListener('focus', listener, false);
|
|
2233
|
+
return () => {
|
|
2234
|
+
// Be sure to unsubscribe if a new handler is set
|
|
2235
|
+
window.removeEventListener('visibilitychange', listener);
|
|
2236
|
+
window.removeEventListener('focus', listener);
|
|
2237
|
+
};
|
|
2238
|
+
}
|
|
2239
|
+
|
|
2240
|
+
return;
|
|
2241
|
+
};
|
|
2242
|
+
}
|
|
2243
|
+
|
|
2244
|
+
onSubscribe() {
|
|
2245
|
+
if (!this.cleanup) {
|
|
2246
|
+
this.setEventListener(this.setup);
|
|
2247
|
+
}
|
|
2248
|
+
}
|
|
2249
|
+
|
|
2250
|
+
onUnsubscribe() {
|
|
2251
|
+
if (!this.hasListeners()) {
|
|
2252
|
+
var _this$cleanup;
|
|
2253
|
+
|
|
2254
|
+
(_this$cleanup = this.cleanup) == null ? void 0 : _this$cleanup.call(this);
|
|
2255
|
+
this.cleanup = undefined;
|
|
2256
|
+
}
|
|
2257
|
+
}
|
|
2258
|
+
|
|
2259
|
+
setEventListener(setup) {
|
|
2260
|
+
var _this$cleanup2;
|
|
2261
|
+
|
|
2262
|
+
this.setup = setup;
|
|
2263
|
+
(_this$cleanup2 = this.cleanup) == null ? void 0 : _this$cleanup2.call(this);
|
|
2264
|
+
this.cleanup = setup(focused => {
|
|
2265
|
+
if (typeof focused === 'boolean') {
|
|
2266
|
+
this.setFocused(focused);
|
|
2267
|
+
} else {
|
|
2268
|
+
this.onFocus();
|
|
2269
|
+
}
|
|
2270
|
+
});
|
|
2271
|
+
}
|
|
2272
|
+
|
|
2273
|
+
setFocused(focused) {
|
|
2274
|
+
const changed = this.focused !== focused;
|
|
2275
|
+
|
|
2276
|
+
if (changed) {
|
|
2277
|
+
this.focused = focused;
|
|
2278
|
+
this.onFocus();
|
|
2279
|
+
}
|
|
2280
|
+
}
|
|
2281
|
+
|
|
2282
|
+
onFocus() {
|
|
2283
|
+
this.listeners.forEach(({
|
|
2284
|
+
listener
|
|
2285
|
+
}) => {
|
|
2286
|
+
listener();
|
|
2287
|
+
});
|
|
2288
|
+
}
|
|
2289
|
+
|
|
2290
|
+
isFocused() {
|
|
2291
|
+
if (typeof this.focused === 'boolean') {
|
|
2292
|
+
return this.focused;
|
|
2293
|
+
} // document global can be unavailable in react native
|
|
2294
|
+
|
|
2295
|
+
|
|
2296
|
+
if (typeof document === 'undefined') {
|
|
2297
|
+
return true;
|
|
2298
|
+
}
|
|
2299
|
+
|
|
2300
|
+
return [undefined, 'visible', 'prerender'].includes(document.visibilityState);
|
|
2301
|
+
}
|
|
2302
|
+
|
|
2303
|
+
}
|
|
2304
|
+
const focusManager = new FocusManager();
|
|
2305
|
+
|
|
2306
|
+
const onlineEvents = ['online', 'offline'];
|
|
2307
|
+
class OnlineManager extends Subscribable {
|
|
2308
|
+
constructor() {
|
|
2309
|
+
super();
|
|
2310
|
+
|
|
2311
|
+
this.setup = onOnline => {
|
|
2312
|
+
// addEventListener does not exist in React Native, but window does
|
|
2313
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
2314
|
+
if (!isServer && window.addEventListener) {
|
|
2315
|
+
const listener = () => onOnline(); // Listen to online
|
|
2316
|
+
|
|
2317
|
+
|
|
2318
|
+
onlineEvents.forEach(event => {
|
|
2319
|
+
window.addEventListener(event, listener, false);
|
|
2320
|
+
});
|
|
2321
|
+
return () => {
|
|
2322
|
+
// Be sure to unsubscribe if a new handler is set
|
|
2323
|
+
onlineEvents.forEach(event => {
|
|
2324
|
+
window.removeEventListener(event, listener);
|
|
2325
|
+
});
|
|
2326
|
+
};
|
|
2327
|
+
}
|
|
2328
|
+
|
|
2329
|
+
return;
|
|
2330
|
+
};
|
|
2331
|
+
}
|
|
2332
|
+
|
|
2333
|
+
onSubscribe() {
|
|
2334
|
+
if (!this.cleanup) {
|
|
2335
|
+
this.setEventListener(this.setup);
|
|
2336
|
+
}
|
|
2337
|
+
}
|
|
2338
|
+
|
|
2339
|
+
onUnsubscribe() {
|
|
2340
|
+
if (!this.hasListeners()) {
|
|
2341
|
+
var _this$cleanup;
|
|
2342
|
+
|
|
2343
|
+
(_this$cleanup = this.cleanup) == null ? void 0 : _this$cleanup.call(this);
|
|
2344
|
+
this.cleanup = undefined;
|
|
2345
|
+
}
|
|
2346
|
+
}
|
|
2347
|
+
|
|
2348
|
+
setEventListener(setup) {
|
|
2349
|
+
var _this$cleanup2;
|
|
2350
|
+
|
|
2351
|
+
this.setup = setup;
|
|
2352
|
+
(_this$cleanup2 = this.cleanup) == null ? void 0 : _this$cleanup2.call(this);
|
|
2353
|
+
this.cleanup = setup(online => {
|
|
2354
|
+
if (typeof online === 'boolean') {
|
|
2355
|
+
this.setOnline(online);
|
|
2356
|
+
} else {
|
|
2357
|
+
this.onOnline();
|
|
2358
|
+
}
|
|
2359
|
+
});
|
|
2360
|
+
}
|
|
2361
|
+
|
|
2362
|
+
setOnline(online) {
|
|
2363
|
+
const changed = this.online !== online;
|
|
2364
|
+
|
|
2365
|
+
if (changed) {
|
|
2366
|
+
this.online = online;
|
|
2367
|
+
this.onOnline();
|
|
2368
|
+
}
|
|
2369
|
+
}
|
|
2370
|
+
|
|
2371
|
+
onOnline() {
|
|
2372
|
+
this.listeners.forEach(({
|
|
2373
|
+
listener
|
|
2374
|
+
}) => {
|
|
2375
|
+
listener();
|
|
2376
|
+
});
|
|
2377
|
+
}
|
|
2378
|
+
|
|
2379
|
+
isOnline() {
|
|
2380
|
+
if (typeof this.online === 'boolean') {
|
|
2381
|
+
return this.online;
|
|
2382
|
+
}
|
|
2383
|
+
|
|
2384
|
+
if (typeof navigator === 'undefined' || typeof navigator.onLine === 'undefined') {
|
|
2385
|
+
return true;
|
|
2386
|
+
}
|
|
2387
|
+
|
|
2388
|
+
return navigator.onLine;
|
|
2389
|
+
}
|
|
2390
|
+
|
|
2391
|
+
}
|
|
2392
|
+
const onlineManager = new OnlineManager();
|
|
2393
|
+
|
|
2394
|
+
function canFetch(networkMode) {
|
|
2395
|
+
return (networkMode != null ? networkMode : 'online') === 'online' ? onlineManager.isOnline() : true;
|
|
2396
|
+
}
|
|
2397
|
+
class CancelledError {
|
|
2398
|
+
constructor(options) {
|
|
2399
|
+
this.revert = options == null ? void 0 : options.revert;
|
|
2400
|
+
this.silent = options == null ? void 0 : options.silent;
|
|
2401
|
+
}
|
|
2402
|
+
|
|
2403
|
+
}
|
|
2404
|
+
function isCancelledError(value) {
|
|
2405
|
+
return value instanceof CancelledError;
|
|
2406
|
+
}
|
|
2407
|
+
|
|
2408
|
+
function createNotifyManager() {
|
|
2409
|
+
let queue = [];
|
|
2410
|
+
let transactions = 0;
|
|
2411
|
+
|
|
2412
|
+
let notifyFn = callback => {
|
|
2413
|
+
callback();
|
|
2414
|
+
};
|
|
2415
|
+
|
|
2416
|
+
let batchNotifyFn = callback => {
|
|
2417
|
+
callback();
|
|
2418
|
+
};
|
|
2419
|
+
|
|
2420
|
+
const batch = callback => {
|
|
2421
|
+
let result;
|
|
2422
|
+
transactions++;
|
|
2423
|
+
|
|
2424
|
+
try {
|
|
2425
|
+
result = callback();
|
|
2426
|
+
} finally {
|
|
2427
|
+
transactions--;
|
|
2428
|
+
|
|
2429
|
+
if (!transactions) {
|
|
2430
|
+
flush();
|
|
2431
|
+
}
|
|
2432
|
+
}
|
|
2433
|
+
|
|
2434
|
+
return result;
|
|
2435
|
+
};
|
|
2436
|
+
|
|
2437
|
+
const schedule = callback => {
|
|
2438
|
+
if (transactions) {
|
|
2439
|
+
queue.push(callback);
|
|
2440
|
+
} else {
|
|
2441
|
+
scheduleMicrotask(() => {
|
|
2442
|
+
notifyFn(callback);
|
|
2443
|
+
});
|
|
2444
|
+
}
|
|
2445
|
+
};
|
|
2446
|
+
/**
|
|
2447
|
+
* All calls to the wrapped function will be batched.
|
|
2448
|
+
*/
|
|
2449
|
+
|
|
2450
|
+
|
|
2451
|
+
const batchCalls = callback => {
|
|
2452
|
+
return (...args) => {
|
|
2453
|
+
schedule(() => {
|
|
2454
|
+
callback(...args);
|
|
2455
|
+
});
|
|
2456
|
+
};
|
|
2457
|
+
};
|
|
2458
|
+
|
|
2459
|
+
const flush = () => {
|
|
2460
|
+
const originalQueue = queue;
|
|
2461
|
+
queue = [];
|
|
2462
|
+
|
|
2463
|
+
if (originalQueue.length) {
|
|
2464
|
+
scheduleMicrotask(() => {
|
|
2465
|
+
batchNotifyFn(() => {
|
|
2466
|
+
originalQueue.forEach(callback => {
|
|
2467
|
+
notifyFn(callback);
|
|
2468
|
+
});
|
|
2469
|
+
});
|
|
2470
|
+
});
|
|
2471
|
+
}
|
|
2472
|
+
};
|
|
2473
|
+
/**
|
|
2474
|
+
* Use this method to set a custom notify function.
|
|
2475
|
+
* This can be used to for example wrap notifications with `React.act` while running tests.
|
|
2476
|
+
*/
|
|
2477
|
+
|
|
2478
|
+
|
|
2479
|
+
const setNotifyFunction = fn => {
|
|
2480
|
+
notifyFn = fn;
|
|
2481
|
+
};
|
|
2482
|
+
/**
|
|
2483
|
+
* Use this method to set a custom function to batch notifications together into a single tick.
|
|
2484
|
+
* By default React Query will use the batch function provided by ReactDOM or React Native.
|
|
2485
|
+
*/
|
|
2486
|
+
|
|
2487
|
+
|
|
2488
|
+
const setBatchNotifyFunction = fn => {
|
|
2489
|
+
batchNotifyFn = fn;
|
|
2490
|
+
};
|
|
2491
|
+
|
|
2492
|
+
return {
|
|
2493
|
+
batch,
|
|
2494
|
+
batchCalls,
|
|
2495
|
+
schedule,
|
|
2496
|
+
setNotifyFunction,
|
|
2497
|
+
setBatchNotifyFunction
|
|
2498
|
+
};
|
|
2499
|
+
} // SINGLETON
|
|
2500
|
+
|
|
2501
|
+
const notifyManager = createNotifyManager();
|
|
2502
|
+
|
|
2503
|
+
class QueryObserver extends Subscribable {
|
|
2504
|
+
constructor(client, options) {
|
|
2505
|
+
super();
|
|
2506
|
+
this.client = client;
|
|
2507
|
+
this.options = options;
|
|
2508
|
+
this.trackedProps = new Set();
|
|
2509
|
+
this.selectError = null;
|
|
2510
|
+
this.bindMethods();
|
|
2511
|
+
this.setOptions(options);
|
|
2512
|
+
}
|
|
2513
|
+
|
|
2514
|
+
bindMethods() {
|
|
2515
|
+
this.remove = this.remove.bind(this);
|
|
2516
|
+
this.refetch = this.refetch.bind(this);
|
|
2517
|
+
}
|
|
2518
|
+
|
|
2519
|
+
onSubscribe() {
|
|
2520
|
+
if (this.listeners.size === 1) {
|
|
2521
|
+
this.currentQuery.addObserver(this);
|
|
2522
|
+
|
|
2523
|
+
if (shouldFetchOnMount(this.currentQuery, this.options)) {
|
|
2524
|
+
this.executeFetch();
|
|
2525
|
+
}
|
|
2526
|
+
|
|
2527
|
+
this.updateTimers();
|
|
2528
|
+
}
|
|
2529
|
+
}
|
|
2530
|
+
|
|
2531
|
+
onUnsubscribe() {
|
|
2532
|
+
if (!this.hasListeners()) {
|
|
2533
|
+
this.destroy();
|
|
2534
|
+
}
|
|
2535
|
+
}
|
|
2536
|
+
|
|
2537
|
+
shouldFetchOnReconnect() {
|
|
2538
|
+
return shouldFetchOn(this.currentQuery, this.options, this.options.refetchOnReconnect);
|
|
2539
|
+
}
|
|
2540
|
+
|
|
2541
|
+
shouldFetchOnWindowFocus() {
|
|
2542
|
+
return shouldFetchOn(this.currentQuery, this.options, this.options.refetchOnWindowFocus);
|
|
2543
|
+
}
|
|
2544
|
+
|
|
2545
|
+
destroy() {
|
|
2546
|
+
this.listeners = new Set();
|
|
2547
|
+
this.clearStaleTimeout();
|
|
2548
|
+
this.clearRefetchInterval();
|
|
2549
|
+
this.currentQuery.removeObserver(this);
|
|
2550
|
+
}
|
|
2551
|
+
|
|
2552
|
+
setOptions(options, notifyOptions) {
|
|
2553
|
+
const prevOptions = this.options;
|
|
2554
|
+
const prevQuery = this.currentQuery;
|
|
2555
|
+
this.options = this.client.defaultQueryOptions(options);
|
|
2556
|
+
|
|
2557
|
+
if (process.env.NODE_ENV !== 'production' && typeof (options == null ? void 0 : options.isDataEqual) !== 'undefined') {
|
|
2558
|
+
this.client.getLogger().error("The isDataEqual option has been deprecated and will be removed in the next major version. You can achieve the same functionality by passing a function as the structuralSharing option");
|
|
2559
|
+
}
|
|
2560
|
+
|
|
2561
|
+
if (!shallowEqualObjects(prevOptions, this.options)) {
|
|
2562
|
+
this.client.getQueryCache().notify({
|
|
2563
|
+
type: 'observerOptionsUpdated',
|
|
2564
|
+
query: this.currentQuery,
|
|
2565
|
+
observer: this
|
|
2566
|
+
});
|
|
2567
|
+
}
|
|
2568
|
+
|
|
2569
|
+
if (typeof this.options.enabled !== 'undefined' && typeof this.options.enabled !== 'boolean') {
|
|
2570
|
+
throw new Error('Expected enabled to be a boolean');
|
|
2571
|
+
} // Keep previous query key if the user does not supply one
|
|
2572
|
+
|
|
2573
|
+
|
|
2574
|
+
if (!this.options.queryKey) {
|
|
2575
|
+
this.options.queryKey = prevOptions.queryKey;
|
|
2576
|
+
}
|
|
2577
|
+
|
|
2578
|
+
this.updateQuery();
|
|
2579
|
+
const mounted = this.hasListeners(); // Fetch if there are subscribers
|
|
2580
|
+
|
|
2581
|
+
if (mounted && shouldFetchOptionally(this.currentQuery, prevQuery, this.options, prevOptions)) {
|
|
2582
|
+
this.executeFetch();
|
|
2583
|
+
} // Update result
|
|
2584
|
+
|
|
2585
|
+
|
|
2586
|
+
this.updateResult(notifyOptions); // Update stale interval if needed
|
|
2587
|
+
|
|
2588
|
+
if (mounted && (this.currentQuery !== prevQuery || this.options.enabled !== prevOptions.enabled || this.options.staleTime !== prevOptions.staleTime)) {
|
|
2589
|
+
this.updateStaleTimeout();
|
|
2590
|
+
}
|
|
2591
|
+
|
|
2592
|
+
const nextRefetchInterval = this.computeRefetchInterval(); // Update refetch interval if needed
|
|
2593
|
+
|
|
2594
|
+
if (mounted && (this.currentQuery !== prevQuery || this.options.enabled !== prevOptions.enabled || nextRefetchInterval !== this.currentRefetchInterval)) {
|
|
2595
|
+
this.updateRefetchInterval(nextRefetchInterval);
|
|
2596
|
+
}
|
|
2597
|
+
}
|
|
2598
|
+
|
|
2599
|
+
getOptimisticResult(options) {
|
|
2600
|
+
const query = this.client.getQueryCache().build(this.client, options);
|
|
2601
|
+
const result = this.createResult(query, options);
|
|
2602
|
+
|
|
2603
|
+
if (shouldAssignObserverCurrentProperties(this, result, options)) {
|
|
2604
|
+
// this assigns the optimistic result to the current Observer
|
|
2605
|
+
// because if the query function changes, useQuery will be performing
|
|
2606
|
+
// an effect where it would fetch again.
|
|
2607
|
+
// When the fetch finishes, we perform a deep data cloning in order
|
|
2608
|
+
// to reuse objects references. This deep data clone is performed against
|
|
2609
|
+
// the `observer.currentResult.data` property
|
|
2610
|
+
// When QueryKey changes, we refresh the query and get new `optimistic`
|
|
2611
|
+
// result, while we leave the `observer.currentResult`, so when new data
|
|
2612
|
+
// arrives, it finds the old `observer.currentResult` which is related
|
|
2613
|
+
// to the old QueryKey. Which means that currentResult and selectData are
|
|
2614
|
+
// out of sync already.
|
|
2615
|
+
// To solve this, we move the cursor of the currentResult everytime
|
|
2616
|
+
// an observer reads an optimistic value.
|
|
2617
|
+
// When keeping the previous data, the result doesn't change until new
|
|
2618
|
+
// data arrives.
|
|
2619
|
+
this.currentResult = result;
|
|
2620
|
+
this.currentResultOptions = this.options;
|
|
2621
|
+
this.currentResultState = this.currentQuery.state;
|
|
2622
|
+
}
|
|
2623
|
+
|
|
2624
|
+
return result;
|
|
2625
|
+
}
|
|
2626
|
+
|
|
2627
|
+
getCurrentResult() {
|
|
2628
|
+
return this.currentResult;
|
|
2629
|
+
}
|
|
2630
|
+
|
|
2631
|
+
trackResult(result) {
|
|
2632
|
+
const trackedResult = {};
|
|
2633
|
+
Object.keys(result).forEach(key => {
|
|
2634
|
+
Object.defineProperty(trackedResult, key, {
|
|
2635
|
+
configurable: false,
|
|
2636
|
+
enumerable: true,
|
|
2637
|
+
get: () => {
|
|
2638
|
+
this.trackedProps.add(key);
|
|
2639
|
+
return result[key];
|
|
2640
|
+
}
|
|
2641
|
+
});
|
|
2642
|
+
});
|
|
2643
|
+
return trackedResult;
|
|
2644
|
+
}
|
|
2645
|
+
|
|
2646
|
+
getCurrentQuery() {
|
|
2647
|
+
return this.currentQuery;
|
|
2648
|
+
}
|
|
2649
|
+
|
|
2650
|
+
remove() {
|
|
2651
|
+
this.client.getQueryCache().remove(this.currentQuery);
|
|
2652
|
+
}
|
|
2653
|
+
|
|
2654
|
+
refetch({
|
|
2655
|
+
refetchPage,
|
|
2656
|
+
...options
|
|
2657
|
+
} = {}) {
|
|
2658
|
+
return this.fetch({ ...options,
|
|
2659
|
+
meta: {
|
|
2660
|
+
refetchPage
|
|
2661
|
+
}
|
|
2662
|
+
});
|
|
2663
|
+
}
|
|
2664
|
+
|
|
2665
|
+
fetchOptimistic(options) {
|
|
2666
|
+
const defaultedOptions = this.client.defaultQueryOptions(options);
|
|
2667
|
+
const query = this.client.getQueryCache().build(this.client, defaultedOptions);
|
|
2668
|
+
query.isFetchingOptimistic = true;
|
|
2669
|
+
return query.fetch().then(() => this.createResult(query, defaultedOptions));
|
|
2670
|
+
}
|
|
2671
|
+
|
|
2672
|
+
fetch(fetchOptions) {
|
|
2673
|
+
var _fetchOptions$cancelR;
|
|
2674
|
+
|
|
2675
|
+
return this.executeFetch({ ...fetchOptions,
|
|
2676
|
+
cancelRefetch: (_fetchOptions$cancelR = fetchOptions.cancelRefetch) != null ? _fetchOptions$cancelR : true
|
|
2677
|
+
}).then(() => {
|
|
2678
|
+
this.updateResult();
|
|
2679
|
+
return this.currentResult;
|
|
2680
|
+
});
|
|
2681
|
+
}
|
|
2682
|
+
|
|
2683
|
+
executeFetch(fetchOptions) {
|
|
2684
|
+
// Make sure we reference the latest query as the current one might have been removed
|
|
2685
|
+
this.updateQuery(); // Fetch
|
|
2686
|
+
|
|
2687
|
+
let promise = this.currentQuery.fetch(this.options, fetchOptions);
|
|
2688
|
+
|
|
2689
|
+
if (!(fetchOptions != null && fetchOptions.throwOnError)) {
|
|
2690
|
+
promise = promise.catch(noop);
|
|
2691
|
+
}
|
|
2692
|
+
|
|
2693
|
+
return promise;
|
|
2694
|
+
}
|
|
2695
|
+
|
|
2696
|
+
updateStaleTimeout() {
|
|
2697
|
+
this.clearStaleTimeout();
|
|
2698
|
+
|
|
2699
|
+
if (isServer || this.currentResult.isStale || !isValidTimeout(this.options.staleTime)) {
|
|
2700
|
+
return;
|
|
2701
|
+
}
|
|
2702
|
+
|
|
2703
|
+
const time = timeUntilStale(this.currentResult.dataUpdatedAt, this.options.staleTime); // The timeout is sometimes triggered 1 ms before the stale time expiration.
|
|
2704
|
+
// To mitigate this issue we always add 1 ms to the timeout.
|
|
2705
|
+
|
|
2706
|
+
const timeout = time + 1;
|
|
2707
|
+
this.staleTimeoutId = setTimeout(() => {
|
|
2708
|
+
if (!this.currentResult.isStale) {
|
|
2709
|
+
this.updateResult();
|
|
2710
|
+
}
|
|
2711
|
+
}, timeout);
|
|
2712
|
+
}
|
|
2713
|
+
|
|
2714
|
+
computeRefetchInterval() {
|
|
2715
|
+
var _this$options$refetch;
|
|
2716
|
+
|
|
2717
|
+
return typeof this.options.refetchInterval === 'function' ? this.options.refetchInterval(this.currentResult.data, this.currentQuery) : (_this$options$refetch = this.options.refetchInterval) != null ? _this$options$refetch : false;
|
|
2718
|
+
}
|
|
2719
|
+
|
|
2720
|
+
updateRefetchInterval(nextInterval) {
|
|
2721
|
+
this.clearRefetchInterval();
|
|
2722
|
+
this.currentRefetchInterval = nextInterval;
|
|
2723
|
+
|
|
2724
|
+
if (isServer || this.options.enabled === false || !isValidTimeout(this.currentRefetchInterval) || this.currentRefetchInterval === 0) {
|
|
2725
|
+
return;
|
|
2726
|
+
}
|
|
2727
|
+
|
|
2728
|
+
this.refetchIntervalId = setInterval(() => {
|
|
2729
|
+
if (this.options.refetchIntervalInBackground || focusManager.isFocused()) {
|
|
2730
|
+
this.executeFetch();
|
|
2731
|
+
}
|
|
2732
|
+
}, this.currentRefetchInterval);
|
|
2733
|
+
}
|
|
2734
|
+
|
|
2735
|
+
updateTimers() {
|
|
2736
|
+
this.updateStaleTimeout();
|
|
2737
|
+
this.updateRefetchInterval(this.computeRefetchInterval());
|
|
2738
|
+
}
|
|
2739
|
+
|
|
2740
|
+
clearStaleTimeout() {
|
|
2741
|
+
if (this.staleTimeoutId) {
|
|
2742
|
+
clearTimeout(this.staleTimeoutId);
|
|
2743
|
+
this.staleTimeoutId = undefined;
|
|
2744
|
+
}
|
|
2745
|
+
}
|
|
2746
|
+
|
|
2747
|
+
clearRefetchInterval() {
|
|
2748
|
+
if (this.refetchIntervalId) {
|
|
2749
|
+
clearInterval(this.refetchIntervalId);
|
|
2750
|
+
this.refetchIntervalId = undefined;
|
|
2751
|
+
}
|
|
2752
|
+
}
|
|
2753
|
+
|
|
2754
|
+
createResult(query, options) {
|
|
2755
|
+
const prevQuery = this.currentQuery;
|
|
2756
|
+
const prevOptions = this.options;
|
|
2757
|
+
const prevResult = this.currentResult;
|
|
2758
|
+
const prevResultState = this.currentResultState;
|
|
2759
|
+
const prevResultOptions = this.currentResultOptions;
|
|
2760
|
+
const queryChange = query !== prevQuery;
|
|
2761
|
+
const queryInitialState = queryChange ? query.state : this.currentQueryInitialState;
|
|
2762
|
+
const prevQueryResult = queryChange ? this.currentResult : this.previousQueryResult;
|
|
2763
|
+
const {
|
|
2764
|
+
state
|
|
2765
|
+
} = query;
|
|
2766
|
+
let {
|
|
2767
|
+
dataUpdatedAt,
|
|
2768
|
+
error,
|
|
2769
|
+
errorUpdatedAt,
|
|
2770
|
+
fetchStatus,
|
|
2771
|
+
status
|
|
2772
|
+
} = state;
|
|
2773
|
+
let isPreviousData = false;
|
|
2774
|
+
let isPlaceholderData = false;
|
|
2775
|
+
let data; // Optimistically set result in fetching state if needed
|
|
2776
|
+
|
|
2777
|
+
if (options._optimisticResults) {
|
|
2778
|
+
const mounted = this.hasListeners();
|
|
2779
|
+
const fetchOnMount = !mounted && shouldFetchOnMount(query, options);
|
|
2780
|
+
const fetchOptionally = mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions);
|
|
2781
|
+
|
|
2782
|
+
if (fetchOnMount || fetchOptionally) {
|
|
2783
|
+
fetchStatus = canFetch(query.options.networkMode) ? 'fetching' : 'paused';
|
|
2784
|
+
|
|
2785
|
+
if (!dataUpdatedAt) {
|
|
2786
|
+
status = 'loading';
|
|
2787
|
+
}
|
|
2788
|
+
}
|
|
2789
|
+
|
|
2790
|
+
if (options._optimisticResults === 'isRestoring') {
|
|
2791
|
+
fetchStatus = 'idle';
|
|
2792
|
+
}
|
|
2793
|
+
} // Keep previous data if needed
|
|
2794
|
+
|
|
2795
|
+
|
|
2796
|
+
if (options.keepPreviousData && !state.dataUpdatedAt && prevQueryResult != null && prevQueryResult.isSuccess && status !== 'error') {
|
|
2797
|
+
data = prevQueryResult.data;
|
|
2798
|
+
dataUpdatedAt = prevQueryResult.dataUpdatedAt;
|
|
2799
|
+
status = prevQueryResult.status;
|
|
2800
|
+
isPreviousData = true;
|
|
2801
|
+
} // Select data if needed
|
|
2802
|
+
else if (options.select && typeof state.data !== 'undefined') {
|
|
2803
|
+
// Memoize select result
|
|
2804
|
+
if (prevResult && state.data === (prevResultState == null ? void 0 : prevResultState.data) && options.select === this.selectFn) {
|
|
2805
|
+
data = this.selectResult;
|
|
2806
|
+
} else {
|
|
2807
|
+
try {
|
|
2808
|
+
this.selectFn = options.select;
|
|
2809
|
+
data = options.select(state.data);
|
|
2810
|
+
data = replaceData(prevResult == null ? void 0 : prevResult.data, data, options);
|
|
2811
|
+
this.selectResult = data;
|
|
2812
|
+
this.selectError = null;
|
|
2813
|
+
} catch (selectError) {
|
|
2814
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
2815
|
+
this.client.getLogger().error(selectError);
|
|
2816
|
+
}
|
|
2817
|
+
|
|
2818
|
+
this.selectError = selectError;
|
|
2819
|
+
}
|
|
2820
|
+
}
|
|
2821
|
+
} // Use query data
|
|
2822
|
+
else {
|
|
2823
|
+
data = state.data;
|
|
2824
|
+
} // Show placeholder data if needed
|
|
2825
|
+
|
|
2826
|
+
|
|
2827
|
+
if (typeof options.placeholderData !== 'undefined' && typeof data === 'undefined' && status === 'loading') {
|
|
2828
|
+
let placeholderData; // Memoize placeholder data
|
|
2829
|
+
|
|
2830
|
+
if (prevResult != null && prevResult.isPlaceholderData && options.placeholderData === (prevResultOptions == null ? void 0 : prevResultOptions.placeholderData)) {
|
|
2831
|
+
placeholderData = prevResult.data;
|
|
2832
|
+
} else {
|
|
2833
|
+
placeholderData = typeof options.placeholderData === 'function' ? options.placeholderData() : options.placeholderData;
|
|
2834
|
+
|
|
2835
|
+
if (options.select && typeof placeholderData !== 'undefined') {
|
|
2836
|
+
try {
|
|
2837
|
+
placeholderData = options.select(placeholderData);
|
|
2838
|
+
this.selectError = null;
|
|
2839
|
+
} catch (selectError) {
|
|
2840
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
2841
|
+
this.client.getLogger().error(selectError);
|
|
2842
|
+
}
|
|
2843
|
+
|
|
2844
|
+
this.selectError = selectError;
|
|
2845
|
+
}
|
|
2846
|
+
}
|
|
2847
|
+
}
|
|
2848
|
+
|
|
2849
|
+
if (typeof placeholderData !== 'undefined') {
|
|
2850
|
+
status = 'success';
|
|
2851
|
+
data = replaceData(prevResult == null ? void 0 : prevResult.data, placeholderData, options);
|
|
2852
|
+
isPlaceholderData = true;
|
|
2853
|
+
}
|
|
2854
|
+
}
|
|
2855
|
+
|
|
2856
|
+
if (this.selectError) {
|
|
2857
|
+
error = this.selectError;
|
|
2858
|
+
data = this.selectResult;
|
|
2859
|
+
errorUpdatedAt = Date.now();
|
|
2860
|
+
status = 'error';
|
|
2861
|
+
}
|
|
2862
|
+
|
|
2863
|
+
const isFetching = fetchStatus === 'fetching';
|
|
2864
|
+
const isLoading = status === 'loading';
|
|
2865
|
+
const isError = status === 'error';
|
|
2866
|
+
const result = {
|
|
2867
|
+
status,
|
|
2868
|
+
fetchStatus,
|
|
2869
|
+
isLoading,
|
|
2870
|
+
isSuccess: status === 'success',
|
|
2871
|
+
isError,
|
|
2872
|
+
isInitialLoading: isLoading && isFetching,
|
|
2873
|
+
data,
|
|
2874
|
+
dataUpdatedAt,
|
|
2875
|
+
error,
|
|
2876
|
+
errorUpdatedAt,
|
|
2877
|
+
failureCount: state.fetchFailureCount,
|
|
2878
|
+
failureReason: state.fetchFailureReason,
|
|
2879
|
+
errorUpdateCount: state.errorUpdateCount,
|
|
2880
|
+
isFetched: state.dataUpdateCount > 0 || state.errorUpdateCount > 0,
|
|
2881
|
+
isFetchedAfterMount: state.dataUpdateCount > queryInitialState.dataUpdateCount || state.errorUpdateCount > queryInitialState.errorUpdateCount,
|
|
2882
|
+
isFetching,
|
|
2883
|
+
isRefetching: isFetching && !isLoading,
|
|
2884
|
+
isLoadingError: isError && state.dataUpdatedAt === 0,
|
|
2885
|
+
isPaused: fetchStatus === 'paused',
|
|
2886
|
+
isPlaceholderData,
|
|
2887
|
+
isPreviousData,
|
|
2888
|
+
isRefetchError: isError && state.dataUpdatedAt !== 0,
|
|
2889
|
+
isStale: isStale(query, options),
|
|
2890
|
+
refetch: this.refetch,
|
|
2891
|
+
remove: this.remove
|
|
2892
|
+
};
|
|
2893
|
+
return result;
|
|
2894
|
+
}
|
|
2895
|
+
|
|
2896
|
+
updateResult(notifyOptions) {
|
|
2897
|
+
const prevResult = this.currentResult;
|
|
2898
|
+
const nextResult = this.createResult(this.currentQuery, this.options);
|
|
2899
|
+
this.currentResultState = this.currentQuery.state;
|
|
2900
|
+
this.currentResultOptions = this.options; // Only notify and update result if something has changed
|
|
2901
|
+
|
|
2902
|
+
if (shallowEqualObjects(nextResult, prevResult)) {
|
|
2903
|
+
return;
|
|
2904
|
+
}
|
|
2905
|
+
|
|
2906
|
+
this.currentResult = nextResult; // Determine which callbacks to trigger
|
|
2907
|
+
|
|
2908
|
+
const defaultNotifyOptions = {
|
|
2909
|
+
cache: true
|
|
2910
|
+
};
|
|
2911
|
+
|
|
2912
|
+
const shouldNotifyListeners = () => {
|
|
2913
|
+
if (!prevResult) {
|
|
2914
|
+
return true;
|
|
2915
|
+
}
|
|
2916
|
+
|
|
2917
|
+
const {
|
|
2918
|
+
notifyOnChangeProps
|
|
2919
|
+
} = this.options;
|
|
2920
|
+
const notifyOnChangePropsValue = typeof notifyOnChangeProps === 'function' ? notifyOnChangeProps() : notifyOnChangeProps;
|
|
2921
|
+
|
|
2922
|
+
if (notifyOnChangePropsValue === 'all' || !notifyOnChangePropsValue && !this.trackedProps.size) {
|
|
2923
|
+
return true;
|
|
2924
|
+
}
|
|
2925
|
+
|
|
2926
|
+
const includedProps = new Set(notifyOnChangePropsValue != null ? notifyOnChangePropsValue : this.trackedProps);
|
|
2927
|
+
|
|
2928
|
+
if (this.options.useErrorBoundary) {
|
|
2929
|
+
includedProps.add('error');
|
|
2930
|
+
}
|
|
2931
|
+
|
|
2932
|
+
return Object.keys(this.currentResult).some(key => {
|
|
2933
|
+
const typedKey = key;
|
|
2934
|
+
const changed = this.currentResult[typedKey] !== prevResult[typedKey];
|
|
2935
|
+
return changed && includedProps.has(typedKey);
|
|
2936
|
+
});
|
|
2937
|
+
};
|
|
2938
|
+
|
|
2939
|
+
if ((notifyOptions == null ? void 0 : notifyOptions.listeners) !== false && shouldNotifyListeners()) {
|
|
2940
|
+
defaultNotifyOptions.listeners = true;
|
|
2941
|
+
}
|
|
2942
|
+
|
|
2943
|
+
this.notify({ ...defaultNotifyOptions,
|
|
2944
|
+
...notifyOptions
|
|
2945
|
+
});
|
|
2946
|
+
}
|
|
2947
|
+
|
|
2948
|
+
updateQuery() {
|
|
2949
|
+
const query = this.client.getQueryCache().build(this.client, this.options);
|
|
2950
|
+
|
|
2951
|
+
if (query === this.currentQuery) {
|
|
2952
|
+
return;
|
|
2953
|
+
}
|
|
2954
|
+
|
|
2955
|
+
const prevQuery = this.currentQuery;
|
|
2956
|
+
this.currentQuery = query;
|
|
2957
|
+
this.currentQueryInitialState = query.state;
|
|
2958
|
+
this.previousQueryResult = this.currentResult;
|
|
2959
|
+
|
|
2960
|
+
if (this.hasListeners()) {
|
|
2961
|
+
prevQuery == null ? void 0 : prevQuery.removeObserver(this);
|
|
2962
|
+
query.addObserver(this);
|
|
2963
|
+
}
|
|
2964
|
+
}
|
|
2965
|
+
|
|
2966
|
+
onQueryUpdate(action) {
|
|
2967
|
+
const notifyOptions = {};
|
|
2968
|
+
|
|
2969
|
+
if (action.type === 'success') {
|
|
2970
|
+
notifyOptions.onSuccess = !action.manual;
|
|
2971
|
+
} else if (action.type === 'error' && !isCancelledError(action.error)) {
|
|
2972
|
+
notifyOptions.onError = true;
|
|
2973
|
+
}
|
|
2974
|
+
|
|
2975
|
+
this.updateResult(notifyOptions);
|
|
2976
|
+
|
|
2977
|
+
if (this.hasListeners()) {
|
|
2978
|
+
this.updateTimers();
|
|
2979
|
+
}
|
|
2980
|
+
}
|
|
2981
|
+
|
|
2982
|
+
notify(notifyOptions) {
|
|
2983
|
+
notifyManager.batch(() => {
|
|
2984
|
+
// First trigger the configuration callbacks
|
|
2985
|
+
if (notifyOptions.onSuccess) {
|
|
2986
|
+
var _this$options$onSucce, _this$options, _this$options$onSettl, _this$options2;
|
|
2987
|
+
|
|
2988
|
+
(_this$options$onSucce = (_this$options = this.options).onSuccess) == null ? void 0 : _this$options$onSucce.call(_this$options, this.currentResult.data);
|
|
2989
|
+
(_this$options$onSettl = (_this$options2 = this.options).onSettled) == null ? void 0 : _this$options$onSettl.call(_this$options2, this.currentResult.data, null);
|
|
2990
|
+
} else if (notifyOptions.onError) {
|
|
2991
|
+
var _this$options$onError, _this$options3, _this$options$onSettl2, _this$options4;
|
|
2992
|
+
|
|
2993
|
+
(_this$options$onError = (_this$options3 = this.options).onError) == null ? void 0 : _this$options$onError.call(_this$options3, this.currentResult.error);
|
|
2994
|
+
(_this$options$onSettl2 = (_this$options4 = this.options).onSettled) == null ? void 0 : _this$options$onSettl2.call(_this$options4, undefined, this.currentResult.error);
|
|
2995
|
+
} // Then trigger the listeners
|
|
2996
|
+
|
|
2997
|
+
|
|
2998
|
+
if (notifyOptions.listeners) {
|
|
2999
|
+
this.listeners.forEach(({
|
|
3000
|
+
listener
|
|
3001
|
+
}) => {
|
|
3002
|
+
listener(this.currentResult);
|
|
3003
|
+
});
|
|
3004
|
+
} // Then the cache listeners
|
|
3005
|
+
|
|
3006
|
+
|
|
3007
|
+
if (notifyOptions.cache) {
|
|
3008
|
+
this.client.getQueryCache().notify({
|
|
3009
|
+
query: this.currentQuery,
|
|
3010
|
+
type: 'observerResultsUpdated'
|
|
3011
|
+
});
|
|
3012
|
+
}
|
|
3013
|
+
});
|
|
3014
|
+
}
|
|
3015
|
+
|
|
3016
|
+
}
|
|
3017
|
+
|
|
3018
|
+
function shouldLoadOnMount(query, options) {
|
|
3019
|
+
return options.enabled !== false && !query.state.dataUpdatedAt && !(query.state.status === 'error' && options.retryOnMount === false);
|
|
3020
|
+
}
|
|
3021
|
+
|
|
3022
|
+
function shouldFetchOnMount(query, options) {
|
|
3023
|
+
return shouldLoadOnMount(query, options) || query.state.dataUpdatedAt > 0 && shouldFetchOn(query, options, options.refetchOnMount);
|
|
3024
|
+
}
|
|
3025
|
+
|
|
3026
|
+
function shouldFetchOn(query, options, field) {
|
|
3027
|
+
if (options.enabled !== false) {
|
|
3028
|
+
const value = typeof field === 'function' ? field(query) : field;
|
|
3029
|
+
return value === 'always' || value !== false && isStale(query, options);
|
|
3030
|
+
}
|
|
3031
|
+
|
|
3032
|
+
return false;
|
|
3033
|
+
}
|
|
3034
|
+
|
|
3035
|
+
function shouldFetchOptionally(query, prevQuery, options, prevOptions) {
|
|
3036
|
+
return options.enabled !== false && (query !== prevQuery || prevOptions.enabled === false) && (!options.suspense || query.state.status !== 'error') && isStale(query, options);
|
|
3037
|
+
}
|
|
3038
|
+
|
|
3039
|
+
function isStale(query, options) {
|
|
3040
|
+
return query.isStaleByTime(options.staleTime);
|
|
3041
|
+
} // this function would decide if we will update the observer's 'current'
|
|
3042
|
+
// properties after an optimistic reading via getOptimisticResult
|
|
3043
|
+
|
|
3044
|
+
|
|
3045
|
+
function shouldAssignObserverCurrentProperties(observer, optimisticResult, options) {
|
|
3046
|
+
// it is important to keep this condition like this for three reasons:
|
|
3047
|
+
// 1. It will get removed in the v5
|
|
3048
|
+
// 2. it reads: don't update the properties if we want to keep the previous
|
|
3049
|
+
// data.
|
|
3050
|
+
// 3. The opposite condition (!options.keepPreviousData) would fallthrough
|
|
3051
|
+
// and will result in a bad decision
|
|
3052
|
+
if (options.keepPreviousData) {
|
|
3053
|
+
return false;
|
|
3054
|
+
} // this means we want to put some placeholder data when pending and queryKey
|
|
3055
|
+
// changed.
|
|
3056
|
+
|
|
3057
|
+
|
|
3058
|
+
if (options.placeholderData !== undefined) {
|
|
3059
|
+
// re-assign properties only if current data is placeholder data
|
|
3060
|
+
// which means that data did not arrive yet, so, if there is some cached data
|
|
3061
|
+
// we need to "prepare" to receive it
|
|
3062
|
+
return optimisticResult.isPlaceholderData;
|
|
3063
|
+
} // if the newly created result isn't what the observer is holding as current,
|
|
3064
|
+
// then we'll need to update the properties as well
|
|
3065
|
+
|
|
3066
|
+
|
|
3067
|
+
if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) {
|
|
3068
|
+
return true;
|
|
3069
|
+
} // basically, just keep previous properties if nothing changed
|
|
3070
|
+
|
|
3071
|
+
|
|
3072
|
+
return false;
|
|
3073
|
+
}
|
|
3074
|
+
|
|
3075
|
+
class QueriesObserver extends Subscribable {
|
|
3076
|
+
constructor(client, queries) {
|
|
3077
|
+
super();
|
|
3078
|
+
this.client = client;
|
|
3079
|
+
this.queries = [];
|
|
3080
|
+
this.result = [];
|
|
3081
|
+
this.observers = [];
|
|
3082
|
+
this.observersMap = {};
|
|
3083
|
+
|
|
3084
|
+
if (queries) {
|
|
3085
|
+
this.setQueries(queries);
|
|
3086
|
+
}
|
|
3087
|
+
}
|
|
3088
|
+
|
|
3089
|
+
onSubscribe() {
|
|
3090
|
+
if (this.listeners.size === 1) {
|
|
3091
|
+
this.observers.forEach(observer => {
|
|
3092
|
+
observer.subscribe(result => {
|
|
3093
|
+
this.onUpdate(observer, result);
|
|
3094
|
+
});
|
|
3095
|
+
});
|
|
3096
|
+
}
|
|
3097
|
+
}
|
|
3098
|
+
|
|
3099
|
+
onUnsubscribe() {
|
|
3100
|
+
if (!this.listeners.size) {
|
|
3101
|
+
this.destroy();
|
|
3102
|
+
}
|
|
3103
|
+
}
|
|
3104
|
+
|
|
3105
|
+
destroy() {
|
|
3106
|
+
this.listeners = new Set();
|
|
3107
|
+
this.observers.forEach(observer => {
|
|
3108
|
+
observer.destroy();
|
|
3109
|
+
});
|
|
3110
|
+
}
|
|
3111
|
+
|
|
3112
|
+
setQueries(queries, notifyOptions) {
|
|
3113
|
+
this.queries = queries;
|
|
3114
|
+
notifyManager.batch(() => {
|
|
3115
|
+
const prevObservers = this.observers;
|
|
3116
|
+
const newObserverMatches = this.findMatchingObservers(this.queries); // set options for the new observers to notify of changes
|
|
3117
|
+
|
|
3118
|
+
newObserverMatches.forEach(match => match.observer.setOptions(match.defaultedQueryOptions, notifyOptions));
|
|
3119
|
+
const newObservers = newObserverMatches.map(match => match.observer);
|
|
3120
|
+
const newObserversMap = Object.fromEntries(newObservers.map(observer => [observer.options.queryHash, observer]));
|
|
3121
|
+
const newResult = newObservers.map(observer => observer.getCurrentResult());
|
|
3122
|
+
const hasIndexChange = newObservers.some((observer, index) => observer !== prevObservers[index]);
|
|
3123
|
+
|
|
3124
|
+
if (prevObservers.length === newObservers.length && !hasIndexChange) {
|
|
3125
|
+
return;
|
|
3126
|
+
}
|
|
3127
|
+
|
|
3128
|
+
this.observers = newObservers;
|
|
3129
|
+
this.observersMap = newObserversMap;
|
|
3130
|
+
this.result = newResult;
|
|
3131
|
+
|
|
3132
|
+
if (!this.hasListeners()) {
|
|
3133
|
+
return;
|
|
3134
|
+
}
|
|
3135
|
+
|
|
3136
|
+
difference(prevObservers, newObservers).forEach(observer => {
|
|
3137
|
+
observer.destroy();
|
|
3138
|
+
});
|
|
3139
|
+
difference(newObservers, prevObservers).forEach(observer => {
|
|
3140
|
+
observer.subscribe(result => {
|
|
3141
|
+
this.onUpdate(observer, result);
|
|
3142
|
+
});
|
|
3143
|
+
});
|
|
3144
|
+
this.notify();
|
|
3145
|
+
});
|
|
3146
|
+
}
|
|
3147
|
+
|
|
3148
|
+
getCurrentResult() {
|
|
3149
|
+
return this.result;
|
|
3150
|
+
}
|
|
3151
|
+
|
|
3152
|
+
getQueries() {
|
|
3153
|
+
return this.observers.map(observer => observer.getCurrentQuery());
|
|
3154
|
+
}
|
|
3155
|
+
|
|
3156
|
+
getObservers() {
|
|
3157
|
+
return this.observers;
|
|
3158
|
+
}
|
|
3159
|
+
|
|
3160
|
+
getOptimisticResult(queries) {
|
|
3161
|
+
return this.findMatchingObservers(queries).map(match => match.observer.getOptimisticResult(match.defaultedQueryOptions));
|
|
3162
|
+
}
|
|
3163
|
+
|
|
3164
|
+
findMatchingObservers(queries) {
|
|
3165
|
+
const prevObservers = this.observers;
|
|
3166
|
+
const prevObserversMap = new Map(prevObservers.map(observer => [observer.options.queryHash, observer]));
|
|
3167
|
+
const defaultedQueryOptions = queries.map(options => this.client.defaultQueryOptions(options));
|
|
3168
|
+
const matchingObservers = defaultedQueryOptions.flatMap(defaultedOptions => {
|
|
3169
|
+
const match = prevObserversMap.get(defaultedOptions.queryHash);
|
|
3170
|
+
|
|
3171
|
+
if (match != null) {
|
|
3172
|
+
return [{
|
|
3173
|
+
defaultedQueryOptions: defaultedOptions,
|
|
3174
|
+
observer: match
|
|
3175
|
+
}];
|
|
3176
|
+
}
|
|
3177
|
+
|
|
3178
|
+
return [];
|
|
3179
|
+
});
|
|
3180
|
+
const matchedQueryHashes = new Set(matchingObservers.map(match => match.defaultedQueryOptions.queryHash));
|
|
3181
|
+
const unmatchedQueries = defaultedQueryOptions.filter(defaultedOptions => !matchedQueryHashes.has(defaultedOptions.queryHash));
|
|
3182
|
+
const matchingObserversSet = new Set(matchingObservers.map(match => match.observer));
|
|
3183
|
+
const unmatchedObservers = prevObservers.filter(prevObserver => !matchingObserversSet.has(prevObserver));
|
|
3184
|
+
|
|
3185
|
+
const getObserver = options => {
|
|
3186
|
+
const defaultedOptions = this.client.defaultQueryOptions(options);
|
|
3187
|
+
const currentObserver = this.observersMap[defaultedOptions.queryHash];
|
|
3188
|
+
return currentObserver != null ? currentObserver : new QueryObserver(this.client, defaultedOptions);
|
|
3189
|
+
};
|
|
3190
|
+
|
|
3191
|
+
const newOrReusedObservers = unmatchedQueries.map((options, index) => {
|
|
3192
|
+
if (options.keepPreviousData) {
|
|
3193
|
+
// return previous data from one of the observers that no longer match
|
|
3194
|
+
const previouslyUsedObserver = unmatchedObservers[index];
|
|
3195
|
+
|
|
3196
|
+
if (previouslyUsedObserver !== undefined) {
|
|
3197
|
+
return {
|
|
3198
|
+
defaultedQueryOptions: options,
|
|
3199
|
+
observer: previouslyUsedObserver
|
|
3200
|
+
};
|
|
3201
|
+
}
|
|
3202
|
+
}
|
|
3203
|
+
|
|
3204
|
+
return {
|
|
3205
|
+
defaultedQueryOptions: options,
|
|
3206
|
+
observer: getObserver(options)
|
|
3207
|
+
};
|
|
3208
|
+
});
|
|
3209
|
+
|
|
3210
|
+
const sortMatchesByOrderOfQueries = (a, b) => defaultedQueryOptions.indexOf(a.defaultedQueryOptions) - defaultedQueryOptions.indexOf(b.defaultedQueryOptions);
|
|
3211
|
+
|
|
3212
|
+
return matchingObservers.concat(newOrReusedObservers).sort(sortMatchesByOrderOfQueries);
|
|
3213
|
+
}
|
|
3214
|
+
|
|
3215
|
+
onUpdate(observer, result) {
|
|
3216
|
+
const index = this.observers.indexOf(observer);
|
|
3217
|
+
|
|
3218
|
+
if (index !== -1) {
|
|
3219
|
+
this.result = replaceAt(this.result, index, result);
|
|
3220
|
+
this.notify();
|
|
3221
|
+
}
|
|
3222
|
+
}
|
|
3223
|
+
|
|
3224
|
+
notify() {
|
|
3225
|
+
notifyManager.batch(() => {
|
|
3226
|
+
this.listeners.forEach(({
|
|
3227
|
+
listener
|
|
3228
|
+
}) => {
|
|
3229
|
+
listener(this.result);
|
|
3230
|
+
});
|
|
3231
|
+
});
|
|
3232
|
+
}
|
|
3233
|
+
|
|
3234
|
+
}
|
|
3235
|
+
|
|
3236
|
+
var shim = {exports: {}};
|
|
3237
|
+
|
|
3238
|
+
var useSyncExternalStoreShim_production = {};
|
|
3239
|
+
|
|
3240
|
+
var require$$0 = /*@__PURE__*/getAugmentedNamespace(React__namespace);
|
|
3241
|
+
|
|
3242
|
+
/**
|
|
3243
|
+
* @license React
|
|
3244
|
+
* use-sync-external-store-shim.production.js
|
|
3245
|
+
*
|
|
3246
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3247
|
+
*
|
|
3248
|
+
* This source code is licensed under the MIT license found in the
|
|
3249
|
+
* LICENSE file in the root directory of this source tree.
|
|
3250
|
+
*/
|
|
3251
|
+
|
|
3252
|
+
var hasRequiredUseSyncExternalStoreShim_production;
|
|
3253
|
+
|
|
3254
|
+
function requireUseSyncExternalStoreShim_production () {
|
|
3255
|
+
if (hasRequiredUseSyncExternalStoreShim_production) return useSyncExternalStoreShim_production;
|
|
3256
|
+
hasRequiredUseSyncExternalStoreShim_production = 1;
|
|
3257
|
+
var React = require$$0;
|
|
3258
|
+
function is(x, y) {
|
|
3259
|
+
return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);
|
|
3260
|
+
}
|
|
3261
|
+
var objectIs = "function" === typeof Object.is ? Object.is : is,
|
|
3262
|
+
useState = React.useState,
|
|
3263
|
+
useEffect = React.useEffect,
|
|
3264
|
+
useLayoutEffect = React.useLayoutEffect,
|
|
3265
|
+
useDebugValue = React.useDebugValue;
|
|
3266
|
+
function useSyncExternalStore$2(subscribe, getSnapshot) {
|
|
3267
|
+
var value = getSnapshot(),
|
|
3268
|
+
_useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),
|
|
3269
|
+
inst = _useState[0].inst,
|
|
3270
|
+
forceUpdate = _useState[1];
|
|
3271
|
+
useLayoutEffect(
|
|
3272
|
+
function () {
|
|
3273
|
+
inst.value = value;
|
|
3274
|
+
inst.getSnapshot = getSnapshot;
|
|
3275
|
+
checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });
|
|
3276
|
+
},
|
|
3277
|
+
[subscribe, value, getSnapshot]
|
|
3278
|
+
);
|
|
3279
|
+
useEffect(
|
|
3280
|
+
function () {
|
|
3281
|
+
checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });
|
|
3282
|
+
return subscribe(function () {
|
|
3283
|
+
checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });
|
|
3284
|
+
});
|
|
3285
|
+
},
|
|
3286
|
+
[subscribe]
|
|
3287
|
+
);
|
|
3288
|
+
useDebugValue(value);
|
|
3289
|
+
return value;
|
|
3290
|
+
}
|
|
3291
|
+
function checkIfSnapshotChanged(inst) {
|
|
3292
|
+
var latestGetSnapshot = inst.getSnapshot;
|
|
3293
|
+
inst = inst.value;
|
|
3294
|
+
try {
|
|
3295
|
+
var nextValue = latestGetSnapshot();
|
|
3296
|
+
return !objectIs(inst, nextValue);
|
|
3297
|
+
} catch (error) {
|
|
3298
|
+
return true;
|
|
3299
|
+
}
|
|
3300
|
+
}
|
|
3301
|
+
function useSyncExternalStore$1(subscribe, getSnapshot) {
|
|
3302
|
+
return getSnapshot();
|
|
3303
|
+
}
|
|
3304
|
+
var shim =
|
|
3305
|
+
"undefined" === typeof window ||
|
|
3306
|
+
"undefined" === typeof window.document ||
|
|
3307
|
+
"undefined" === typeof window.document.createElement
|
|
3308
|
+
? useSyncExternalStore$1
|
|
3309
|
+
: useSyncExternalStore$2;
|
|
3310
|
+
useSyncExternalStoreShim_production.useSyncExternalStore =
|
|
3311
|
+
void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;
|
|
3312
|
+
return useSyncExternalStoreShim_production;
|
|
3313
|
+
}
|
|
3314
|
+
|
|
3315
|
+
var useSyncExternalStoreShim_development = {};
|
|
3316
|
+
|
|
3317
|
+
/**
|
|
3318
|
+
* @license React
|
|
3319
|
+
* use-sync-external-store-shim.development.js
|
|
3320
|
+
*
|
|
3321
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3322
|
+
*
|
|
3323
|
+
* This source code is licensed under the MIT license found in the
|
|
3324
|
+
* LICENSE file in the root directory of this source tree.
|
|
3325
|
+
*/
|
|
3326
|
+
|
|
3327
|
+
var hasRequiredUseSyncExternalStoreShim_development;
|
|
3328
|
+
|
|
3329
|
+
function requireUseSyncExternalStoreShim_development () {
|
|
3330
|
+
if (hasRequiredUseSyncExternalStoreShim_development) return useSyncExternalStoreShim_development;
|
|
3331
|
+
hasRequiredUseSyncExternalStoreShim_development = 1;
|
|
3332
|
+
"production" !== process.env.NODE_ENV &&
|
|
3333
|
+
(function () {
|
|
3334
|
+
function is(x, y) {
|
|
3335
|
+
return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);
|
|
3336
|
+
}
|
|
3337
|
+
function useSyncExternalStore$2(subscribe, getSnapshot) {
|
|
3338
|
+
didWarnOld18Alpha ||
|
|
3339
|
+
void 0 === React.startTransition ||
|
|
3340
|
+
((didWarnOld18Alpha = true),
|
|
3341
|
+
console.error(
|
|
3342
|
+
"You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release."
|
|
3343
|
+
));
|
|
3344
|
+
var value = getSnapshot();
|
|
3345
|
+
if (!didWarnUncachedGetSnapshot) {
|
|
3346
|
+
var cachedValue = getSnapshot();
|
|
3347
|
+
objectIs(value, cachedValue) ||
|
|
3348
|
+
(console.error(
|
|
3349
|
+
"The result of getSnapshot should be cached to avoid an infinite loop"
|
|
3350
|
+
),
|
|
3351
|
+
(didWarnUncachedGetSnapshot = true));
|
|
3352
|
+
}
|
|
3353
|
+
cachedValue = useState({
|
|
3354
|
+
inst: { value: value, getSnapshot: getSnapshot }
|
|
3355
|
+
});
|
|
3356
|
+
var inst = cachedValue[0].inst,
|
|
3357
|
+
forceUpdate = cachedValue[1];
|
|
3358
|
+
useLayoutEffect(
|
|
3359
|
+
function () {
|
|
3360
|
+
inst.value = value;
|
|
3361
|
+
inst.getSnapshot = getSnapshot;
|
|
3362
|
+
checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });
|
|
3363
|
+
},
|
|
3364
|
+
[subscribe, value, getSnapshot]
|
|
3365
|
+
);
|
|
3366
|
+
useEffect(
|
|
3367
|
+
function () {
|
|
3368
|
+
checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });
|
|
3369
|
+
return subscribe(function () {
|
|
3370
|
+
checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });
|
|
3371
|
+
});
|
|
3372
|
+
},
|
|
3373
|
+
[subscribe]
|
|
3374
|
+
);
|
|
3375
|
+
useDebugValue(value);
|
|
3376
|
+
return value;
|
|
3377
|
+
}
|
|
3378
|
+
function checkIfSnapshotChanged(inst) {
|
|
3379
|
+
var latestGetSnapshot = inst.getSnapshot;
|
|
3380
|
+
inst = inst.value;
|
|
3381
|
+
try {
|
|
3382
|
+
var nextValue = latestGetSnapshot();
|
|
3383
|
+
return !objectIs(inst, nextValue);
|
|
3384
|
+
} catch (error) {
|
|
3385
|
+
return true;
|
|
3386
|
+
}
|
|
3387
|
+
}
|
|
3388
|
+
function useSyncExternalStore$1(subscribe, getSnapshot) {
|
|
3389
|
+
return getSnapshot();
|
|
3390
|
+
}
|
|
3391
|
+
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
|
|
3392
|
+
"function" ===
|
|
3393
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&
|
|
3394
|
+
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
|
|
3395
|
+
var React = require$$0,
|
|
3396
|
+
objectIs = "function" === typeof Object.is ? Object.is : is,
|
|
3397
|
+
useState = React.useState,
|
|
3398
|
+
useEffect = React.useEffect,
|
|
3399
|
+
useLayoutEffect = React.useLayoutEffect,
|
|
3400
|
+
useDebugValue = React.useDebugValue,
|
|
3401
|
+
didWarnOld18Alpha = false,
|
|
3402
|
+
didWarnUncachedGetSnapshot = false,
|
|
3403
|
+
shim =
|
|
3404
|
+
"undefined" === typeof window ||
|
|
3405
|
+
"undefined" === typeof window.document ||
|
|
3406
|
+
"undefined" === typeof window.document.createElement
|
|
3407
|
+
? useSyncExternalStore$1
|
|
3408
|
+
: useSyncExternalStore$2;
|
|
3409
|
+
useSyncExternalStoreShim_development.useSyncExternalStore =
|
|
3410
|
+
void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;
|
|
3411
|
+
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
|
|
3412
|
+
"function" ===
|
|
3413
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
|
|
3414
|
+
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
|
|
3415
|
+
})();
|
|
3416
|
+
return useSyncExternalStoreShim_development;
|
|
3417
|
+
}
|
|
3418
|
+
|
|
3419
|
+
var hasRequiredShim;
|
|
3420
|
+
|
|
3421
|
+
function requireShim () {
|
|
3422
|
+
if (hasRequiredShim) return shim.exports;
|
|
3423
|
+
hasRequiredShim = 1;
|
|
3424
|
+
|
|
3425
|
+
if (process.env.NODE_ENV === 'production') {
|
|
3426
|
+
shim.exports = requireUseSyncExternalStoreShim_production();
|
|
3427
|
+
} else {
|
|
3428
|
+
shim.exports = requireUseSyncExternalStoreShim_development();
|
|
3429
|
+
}
|
|
3430
|
+
return shim.exports;
|
|
3431
|
+
}
|
|
3432
|
+
|
|
3433
|
+
var shimExports = requireShim();
|
|
3434
|
+
|
|
3435
|
+
const useSyncExternalStore = shimExports.useSyncExternalStore;
|
|
3436
|
+
|
|
3437
|
+
const defaultContext = /*#__PURE__*/React__namespace.createContext(undefined);
|
|
3438
|
+
const QueryClientSharingContext = /*#__PURE__*/React__namespace.createContext(false); // If we are given a context, we will use it.
|
|
3439
|
+
// Otherwise, if contextSharing is on, we share the first and at least one
|
|
3440
|
+
// instance of the context across the window
|
|
3441
|
+
// to ensure that if React Query is used across
|
|
3442
|
+
// different bundles or microfrontends they will
|
|
3443
|
+
// all use the same **instance** of context, regardless
|
|
3444
|
+
// of module scoping.
|
|
3445
|
+
|
|
3446
|
+
function getQueryClientContext(context, contextSharing) {
|
|
3447
|
+
if (context) {
|
|
3448
|
+
return context;
|
|
3449
|
+
}
|
|
3450
|
+
|
|
3451
|
+
if (contextSharing && typeof window !== 'undefined') {
|
|
3452
|
+
if (!window.ReactQueryClientContext) {
|
|
3453
|
+
window.ReactQueryClientContext = defaultContext;
|
|
3454
|
+
}
|
|
3455
|
+
|
|
3456
|
+
return window.ReactQueryClientContext;
|
|
3457
|
+
}
|
|
3458
|
+
|
|
3459
|
+
return defaultContext;
|
|
3460
|
+
}
|
|
3461
|
+
|
|
3462
|
+
const useQueryClient = ({
|
|
3463
|
+
context
|
|
3464
|
+
} = {}) => {
|
|
3465
|
+
const queryClient = React__namespace.useContext(getQueryClientContext(context, React__namespace.useContext(QueryClientSharingContext)));
|
|
3466
|
+
|
|
3467
|
+
if (!queryClient) {
|
|
3468
|
+
throw new Error('No QueryClient set, use QueryClientProvider to set one');
|
|
3469
|
+
}
|
|
3470
|
+
|
|
3471
|
+
return queryClient;
|
|
3472
|
+
};
|
|
3473
|
+
|
|
3474
|
+
const IsRestoringContext = /*#__PURE__*/React__namespace.createContext(false);
|
|
3475
|
+
const useIsRestoring = () => React__namespace.useContext(IsRestoringContext);
|
|
3476
|
+
IsRestoringContext.Provider;
|
|
3477
|
+
|
|
3478
|
+
function createValue() {
|
|
3479
|
+
let isReset = false;
|
|
3480
|
+
return {
|
|
3481
|
+
clearReset: () => {
|
|
3482
|
+
isReset = false;
|
|
3483
|
+
},
|
|
3484
|
+
reset: () => {
|
|
3485
|
+
isReset = true;
|
|
3486
|
+
},
|
|
3487
|
+
isReset: () => {
|
|
3488
|
+
return isReset;
|
|
3489
|
+
}
|
|
3490
|
+
};
|
|
3491
|
+
}
|
|
3492
|
+
|
|
3493
|
+
const QueryErrorResetBoundaryContext = /*#__PURE__*/React__namespace.createContext(createValue()); // HOOK
|
|
3494
|
+
|
|
3495
|
+
const useQueryErrorResetBoundary = () => React__namespace.useContext(QueryErrorResetBoundaryContext); // COMPONENT
|
|
3496
|
+
|
|
3497
|
+
function shouldThrowError(_useErrorBoundary, params) {
|
|
3498
|
+
// Allow useErrorBoundary function to override throwing behavior on a per-error basis
|
|
3499
|
+
if (typeof _useErrorBoundary === 'function') {
|
|
3500
|
+
return _useErrorBoundary(...params);
|
|
3501
|
+
}
|
|
3502
|
+
|
|
3503
|
+
return !!_useErrorBoundary;
|
|
3504
|
+
}
|
|
3505
|
+
|
|
3506
|
+
const ensurePreventErrorBoundaryRetry = (options, errorResetBoundary) => {
|
|
3507
|
+
if (options.suspense || options.useErrorBoundary) {
|
|
3508
|
+
// Prevent retrying failed query if the error boundary has not been reset yet
|
|
3509
|
+
if (!errorResetBoundary.isReset()) {
|
|
3510
|
+
options.retryOnMount = false;
|
|
3511
|
+
}
|
|
3512
|
+
}
|
|
3513
|
+
};
|
|
3514
|
+
const useClearResetErrorBoundary = errorResetBoundary => {
|
|
3515
|
+
React__namespace.useEffect(() => {
|
|
3516
|
+
errorResetBoundary.clearReset();
|
|
3517
|
+
}, [errorResetBoundary]);
|
|
3518
|
+
};
|
|
3519
|
+
const getHasError = ({
|
|
3520
|
+
result,
|
|
3521
|
+
errorResetBoundary,
|
|
3522
|
+
useErrorBoundary,
|
|
3523
|
+
query
|
|
3524
|
+
}) => {
|
|
3525
|
+
return result.isError && !errorResetBoundary.isReset() && !result.isFetching && shouldThrowError(useErrorBoundary, [result.error, query]);
|
|
3526
|
+
};
|
|
3527
|
+
|
|
3528
|
+
const ensureStaleTime = defaultedOptions => {
|
|
3529
|
+
if (defaultedOptions.suspense) {
|
|
3530
|
+
// Always set stale time when using suspense to prevent
|
|
3531
|
+
// fetching again when directly mounting after suspending
|
|
3532
|
+
if (typeof defaultedOptions.staleTime !== 'number') {
|
|
3533
|
+
defaultedOptions.staleTime = 1000;
|
|
3534
|
+
}
|
|
3535
|
+
}
|
|
3536
|
+
};
|
|
3537
|
+
const willFetch = (result, isRestoring) => result.isLoading && result.isFetching && !isRestoring;
|
|
3538
|
+
const shouldSuspend = (defaultedOptions, result, isRestoring) => (defaultedOptions == null ? void 0 : defaultedOptions.suspense) && willFetch(result, isRestoring);
|
|
3539
|
+
const fetchOptimistic = (defaultedOptions, observer, errorResetBoundary) => observer.fetchOptimistic(defaultedOptions).then(({
|
|
3540
|
+
data
|
|
3541
|
+
}) => {
|
|
3542
|
+
defaultedOptions.onSuccess == null ? void 0 : defaultedOptions.onSuccess(data);
|
|
3543
|
+
defaultedOptions.onSettled == null ? void 0 : defaultedOptions.onSettled(data, null);
|
|
3544
|
+
}).catch(error => {
|
|
3545
|
+
errorResetBoundary.clearReset();
|
|
3546
|
+
defaultedOptions.onError == null ? void 0 : defaultedOptions.onError(error);
|
|
3547
|
+
defaultedOptions.onSettled == null ? void 0 : defaultedOptions.onSettled(undefined, error);
|
|
3548
|
+
});
|
|
3549
|
+
|
|
3550
|
+
function useQueries({
|
|
3551
|
+
queries,
|
|
3552
|
+
context
|
|
3553
|
+
}) {
|
|
3554
|
+
const queryClient = useQueryClient({
|
|
3555
|
+
context
|
|
3556
|
+
});
|
|
3557
|
+
const isRestoring = useIsRestoring();
|
|
3558
|
+
const errorResetBoundary = useQueryErrorResetBoundary();
|
|
3559
|
+
const defaultedQueries = React__namespace.useMemo(() => queries.map(options => {
|
|
3560
|
+
const defaultedOptions = queryClient.defaultQueryOptions(options); // Make sure the results are already in fetching state before subscribing or updating options
|
|
3561
|
+
|
|
3562
|
+
defaultedOptions._optimisticResults = isRestoring ? 'isRestoring' : 'optimistic';
|
|
3563
|
+
return defaultedOptions;
|
|
3564
|
+
}), [queries, queryClient, isRestoring]);
|
|
3565
|
+
defaultedQueries.forEach(query => {
|
|
3566
|
+
ensureStaleTime(query);
|
|
3567
|
+
ensurePreventErrorBoundaryRetry(query, errorResetBoundary);
|
|
3568
|
+
});
|
|
3569
|
+
useClearResetErrorBoundary(errorResetBoundary);
|
|
3570
|
+
const [observer] = React__namespace.useState(() => new QueriesObserver(queryClient, defaultedQueries));
|
|
3571
|
+
const optimisticResult = observer.getOptimisticResult(defaultedQueries);
|
|
3572
|
+
useSyncExternalStore(React__namespace.useCallback(onStoreChange => isRestoring ? () => undefined : observer.subscribe(notifyManager.batchCalls(onStoreChange)), [observer, isRestoring]), () => observer.getCurrentResult(), () => observer.getCurrentResult());
|
|
3573
|
+
React__namespace.useEffect(() => {
|
|
3574
|
+
// Do not notify on updates because of changes in the options because
|
|
3575
|
+
// these changes should already be reflected in the optimistic result.
|
|
3576
|
+
observer.setQueries(defaultedQueries, {
|
|
3577
|
+
listeners: false
|
|
3578
|
+
});
|
|
3579
|
+
}, [defaultedQueries, observer]);
|
|
3580
|
+
const shouldAtLeastOneSuspend = optimisticResult.some((result, index) => shouldSuspend(defaultedQueries[index], result, isRestoring));
|
|
3581
|
+
const suspensePromises = shouldAtLeastOneSuspend ? optimisticResult.flatMap((result, index) => {
|
|
3582
|
+
const options = defaultedQueries[index];
|
|
3583
|
+
const queryObserver = observer.getObservers()[index];
|
|
3584
|
+
|
|
3585
|
+
if (options && queryObserver) {
|
|
3586
|
+
if (shouldSuspend(options, result, isRestoring)) {
|
|
3587
|
+
return fetchOptimistic(options, queryObserver, errorResetBoundary);
|
|
3588
|
+
} else if (willFetch(result, isRestoring)) {
|
|
3589
|
+
void fetchOptimistic(options, queryObserver, errorResetBoundary);
|
|
3590
|
+
}
|
|
3591
|
+
}
|
|
3592
|
+
|
|
3593
|
+
return [];
|
|
3594
|
+
}) : [];
|
|
3595
|
+
|
|
3596
|
+
if (suspensePromises.length > 0) {
|
|
3597
|
+
throw Promise.all(suspensePromises);
|
|
3598
|
+
}
|
|
3599
|
+
|
|
3600
|
+
const observerQueries = observer.getQueries();
|
|
3601
|
+
const firstSingleResultWhichShouldThrow = optimisticResult.find((result, index) => {
|
|
3602
|
+
var _defaultedQueries$ind, _defaultedQueries$ind2;
|
|
3603
|
+
|
|
3604
|
+
return getHasError({
|
|
3605
|
+
result,
|
|
3606
|
+
errorResetBoundary,
|
|
3607
|
+
useErrorBoundary: (_defaultedQueries$ind = (_defaultedQueries$ind2 = defaultedQueries[index]) == null ? void 0 : _defaultedQueries$ind2.useErrorBoundary) != null ? _defaultedQueries$ind : false,
|
|
3608
|
+
query: observerQueries[index]
|
|
3609
|
+
});
|
|
3610
|
+
});
|
|
3611
|
+
|
|
3612
|
+
if (firstSingleResultWhichShouldThrow != null && firstSingleResultWhichShouldThrow.error) {
|
|
3613
|
+
throw firstSingleResultWhichShouldThrow.error;
|
|
3614
|
+
}
|
|
3615
|
+
|
|
3616
|
+
return optimisticResult;
|
|
3617
|
+
}
|
|
3618
|
+
|
|
3619
|
+
const VALID_STATUSES = new Set([
|
|
3620
|
+
"ongoing",
|
|
3621
|
+
"success",
|
|
3622
|
+
"refunded",
|
|
3623
|
+
]);
|
|
3624
|
+
function isObject(value) {
|
|
3625
|
+
return typeof value === "object" && value !== null;
|
|
3626
|
+
}
|
|
3627
|
+
function isSquidTransactionToken(value) {
|
|
3628
|
+
if (!isObject(value))
|
|
3629
|
+
return false;
|
|
3630
|
+
return (typeof value.address === "string" &&
|
|
3631
|
+
typeof value.symbol === "string" &&
|
|
3632
|
+
typeof value.decimals === "number" &&
|
|
3633
|
+
typeof value.chainId === "string");
|
|
3634
|
+
}
|
|
3635
|
+
function isSquidTransaction(tx) {
|
|
3636
|
+
if (!isObject(tx))
|
|
3637
|
+
return false;
|
|
3638
|
+
if (typeof tx.createdAt !== "string" ||
|
|
3639
|
+
typeof tx.fromChainId !== "string" ||
|
|
3640
|
+
typeof tx.toChainId !== "string") {
|
|
3641
|
+
return false;
|
|
3642
|
+
}
|
|
3643
|
+
if (!isObject(tx.quote))
|
|
3644
|
+
return false;
|
|
3645
|
+
const quote = tx.quote;
|
|
3646
|
+
if (!isObject(quote.route))
|
|
3647
|
+
return false;
|
|
3648
|
+
const route = quote.route;
|
|
3649
|
+
if (!isObject(route.estimate))
|
|
3650
|
+
return false;
|
|
3651
|
+
const estimate = route.estimate;
|
|
3652
|
+
if (typeof estimate.fromAmount !== "string" ||
|
|
3653
|
+
typeof estimate.toAmount !== "string" ||
|
|
3654
|
+
!isSquidTransactionToken(estimate.fromToken) ||
|
|
3655
|
+
!isSquidTransactionToken(estimate.toToken)) {
|
|
3656
|
+
return false;
|
|
3657
|
+
}
|
|
3658
|
+
if (!isObject(tx.statusResponse))
|
|
3659
|
+
return false;
|
|
3660
|
+
const status = tx.statusResponse;
|
|
3661
|
+
if (typeof status.squidTransactionStatus !== "string" ||
|
|
3662
|
+
!VALID_STATUSES.has(status.squidTransactionStatus)) {
|
|
3663
|
+
return false;
|
|
3664
|
+
}
|
|
3665
|
+
return true;
|
|
3666
|
+
}
|
|
3667
|
+
|
|
3668
|
+
async function getWalletHistory(address, integratorId, apiUrl) {
|
|
3669
|
+
const url = new URL("/v2/history/wallet", apiUrl);
|
|
3670
|
+
url.searchParams.append("address", address);
|
|
3671
|
+
const response = await fetch(url, {
|
|
3672
|
+
headers: { "X-Integrator-Id": integratorId },
|
|
3673
|
+
});
|
|
3674
|
+
if (!response.ok) {
|
|
3675
|
+
throw new Error(`Failed to fetch wallet history: ${response.status}`);
|
|
3676
|
+
}
|
|
3677
|
+
const data = await response.json();
|
|
3678
|
+
if (!Array.isArray(data))
|
|
3679
|
+
return [];
|
|
3680
|
+
return data.filter(isSquidTransaction);
|
|
3681
|
+
}
|
|
3682
|
+
|
|
3683
|
+
function formatAmount(raw, decimals) {
|
|
3684
|
+
const readable = reactHooks.formatBNToReadable(raw, decimals);
|
|
3685
|
+
return reactHooks.formatTokenAmount(readable, { compact: true });
|
|
3686
|
+
}
|
|
3687
|
+
// Maps react-hooks' TransactionStatus (+ error variants) to our 3-state display.
|
|
3688
|
+
function mapLocalStatusToDisplayStatus(status) {
|
|
3689
|
+
if (status === "success" || status === "partial_success")
|
|
3690
|
+
return "success";
|
|
3691
|
+
if (status === "refunded" || status === "error")
|
|
3692
|
+
return "refunded";
|
|
3693
|
+
return "ongoing";
|
|
3694
|
+
}
|
|
3695
|
+
function fallbackId(tx) {
|
|
3696
|
+
const { estimate } = tx.quote.route;
|
|
3697
|
+
return `${tx.createdAt}-${estimate.fromToken.address}-${estimate.toToken.address}-${estimate.fromAmount}`;
|
|
3698
|
+
}
|
|
3699
|
+
function toFormattedTx(tx, sourceChain) {
|
|
3700
|
+
const { estimate } = tx.quote.route;
|
|
3701
|
+
const { fromToken, toToken } = estimate;
|
|
3702
|
+
return {
|
|
3703
|
+
id: tx.transactionId ?? fallbackId(tx),
|
|
3704
|
+
timestamp: tx.createdAt,
|
|
3705
|
+
status: tx.statusResponse.squidTransactionStatus,
|
|
3706
|
+
fromAmount: formatAmount(estimate.fromAmount, fromToken.decimals),
|
|
3707
|
+
toAmount: formatAmount(estimate.toAmount, toToken.decimals),
|
|
3708
|
+
fromToken: {
|
|
3709
|
+
symbol: fromToken.symbol,
|
|
3710
|
+
logo: reactHooks.getTokenImage({
|
|
3711
|
+
address: fromToken.address,
|
|
3712
|
+
chainId: tx.fromChainId,
|
|
3713
|
+
}),
|
|
3714
|
+
},
|
|
3715
|
+
fromChain: { logo: sourceChain?.chainIconURI ?? "" },
|
|
3716
|
+
toToken: { symbol: toToken.symbol },
|
|
3717
|
+
explorer: getMainExplorerUrl({
|
|
3718
|
+
transactionId: tx.transactionId,
|
|
3719
|
+
routeType: tx.routeType,
|
|
3720
|
+
sourceTxExplorerUrl: tx.sourceTxExplorerUrl,
|
|
3721
|
+
statusResponse: tx.statusResponse,
|
|
3722
|
+
actions: tx.actions,
|
|
3723
|
+
sourceChain,
|
|
3724
|
+
}),
|
|
3725
|
+
};
|
|
3726
|
+
}
|
|
3727
|
+
function pendingSwapToFormattedTx(pending, findToken, findChain) {
|
|
3728
|
+
const fromTokenMeta = findToken(pending.fromToken, pending.fromChain);
|
|
3729
|
+
const toTokenMeta = findToken(pending.toToken, pending.toChain);
|
|
3730
|
+
const fromReadable = fromTokenMeta
|
|
3731
|
+
? reactHooks.formatBNToReadable(pending.fromAmount, fromTokenMeta.decimals)
|
|
3732
|
+
: pending.fromAmount;
|
|
3733
|
+
const toReadable = toTokenMeta
|
|
3734
|
+
? reactHooks.formatBNToReadable(pending.toAmount, toTokenMeta.decimals)
|
|
3735
|
+
: pending.toAmount;
|
|
3736
|
+
return {
|
|
3737
|
+
id: pending.transactionId,
|
|
3738
|
+
timestamp: new Date(pending.timestamp).toISOString(),
|
|
3739
|
+
status: mapLocalStatusToDisplayStatus(pending.status),
|
|
3740
|
+
fromAmount: reactHooks.formatTokenAmount(fromReadable, { compact: true }),
|
|
3741
|
+
toAmount: reactHooks.formatTokenAmount(toReadable, { compact: true }),
|
|
3742
|
+
fromToken: {
|
|
3743
|
+
symbol: fromTokenMeta?.symbol ?? "",
|
|
3744
|
+
logo: reactHooks.getTokenImage({
|
|
3745
|
+
address: pending.fromToken,
|
|
3746
|
+
chainId: pending.fromChain,
|
|
3747
|
+
}),
|
|
3748
|
+
},
|
|
3749
|
+
fromChain: { logo: findChain(pending.fromChain)?.chainIconURI ?? "" },
|
|
3750
|
+
toToken: { symbol: toTokenMeta?.symbol ?? "" },
|
|
3751
|
+
explorer: getMainExplorerUrl({
|
|
3752
|
+
transactionId: pending.transactionId,
|
|
3753
|
+
routeType: pending.routeType,
|
|
3754
|
+
sourceTxExplorerUrl: pending.sourceTxExplorerUrl,
|
|
3755
|
+
statusResponse: pending.statusResponse,
|
|
3756
|
+
actions: pending.actions,
|
|
3757
|
+
sourceChain: findChain(pending.fromChain),
|
|
3758
|
+
}),
|
|
3759
|
+
};
|
|
3760
|
+
}
|
|
3761
|
+
function groupAndSortByDay(txs) {
|
|
3762
|
+
const byDay = new Map();
|
|
3763
|
+
for (const tx of txs) {
|
|
3764
|
+
const dayKey = new Date(tx.timestamp).toISOString().slice(0, 10);
|
|
3765
|
+
const bucket = byDay.get(dayKey) ?? [];
|
|
3766
|
+
bucket.push(tx);
|
|
3767
|
+
byDay.set(dayKey, bucket);
|
|
3768
|
+
}
|
|
3769
|
+
const groups = [];
|
|
3770
|
+
for (const [day, transactions] of byDay.entries()) {
|
|
3771
|
+
transactions.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
3772
|
+
groups.push({ day, transactions });
|
|
3773
|
+
}
|
|
3774
|
+
groups.sort((a, b) => new Date(b.day).getTime() - new Date(a.day).getTime());
|
|
3775
|
+
return groups;
|
|
3776
|
+
}
|
|
3777
|
+
|
|
3778
|
+
function useTransactionHistory() {
|
|
3779
|
+
const { connectedAddresses } = reactHooks.useWallet();
|
|
3780
|
+
const config = useDepositStore((s) => s.config);
|
|
3781
|
+
const integratorId = config?.integrator.id;
|
|
3782
|
+
const apiUrl = reactHooks.useConfigStore((s) => s.config.apiUrl);
|
|
3783
|
+
const pendingFromStore = reactHooks.useHistoryStore((s) => s.transactions);
|
|
3784
|
+
const { findToken, tokens } = reactHooks.useSquidTokens();
|
|
3785
|
+
const { findChain } = reactHooks.useSquidChains();
|
|
3786
|
+
const destinationToken = config?.destinationToken;
|
|
3787
|
+
const isPaymentMode = useIsPaymentMode();
|
|
3788
|
+
const paymentAmount = usePaymentAmount();
|
|
3789
|
+
const destinationTokenDecimals = destinationToken
|
|
3790
|
+
? tokens.find((t) => t.chainId === destinationToken.chainId &&
|
|
3791
|
+
isSameAddress(t.address, destinationToken.address))?.decimals
|
|
3792
|
+
: null;
|
|
3793
|
+
const addresses = React.useMemo(() => Array.from(new Set(Object.values(connectedAddresses).filter((a) => a != null && a.length > 0))), [connectedAddresses]);
|
|
3794
|
+
// Memoized so TanStack Query doesn't re-run the filter on every render.
|
|
3795
|
+
const select = React.useCallback((data) => {
|
|
3796
|
+
if (!destinationToken)
|
|
3797
|
+
return [];
|
|
3798
|
+
if (isPaymentMode &&
|
|
3799
|
+
(!paymentAmount || destinationTokenDecimals == null)) {
|
|
3800
|
+
return [];
|
|
3801
|
+
}
|
|
3802
|
+
return data.filter((tx) => {
|
|
3803
|
+
// validate destination token
|
|
3804
|
+
if (!matchesDestinationToken(tx.quote.route.estimate.toToken, destinationToken)) {
|
|
3805
|
+
return false;
|
|
3806
|
+
}
|
|
3807
|
+
if (isPaymentMode) {
|
|
3808
|
+
return isPaymentTx(tx, paymentAmount, destinationTokenDecimals);
|
|
3809
|
+
}
|
|
3810
|
+
return true;
|
|
3811
|
+
});
|
|
3812
|
+
}, [destinationToken, isPaymentMode, paymentAmount, destinationTokenDecimals]);
|
|
3813
|
+
const queries = useQueries({
|
|
3814
|
+
queries: addresses.map((address) => ({
|
|
3815
|
+
queryKey: ["deposit-widget", "tx-history", address, integratorId, apiUrl],
|
|
3816
|
+
queryFn: () => {
|
|
3817
|
+
if (!integratorId || !apiUrl) {
|
|
3818
|
+
throw new Error("integratorId and apiUrl are required to fetch wallet history");
|
|
3819
|
+
}
|
|
3820
|
+
return getWalletHistory(address, integratorId, apiUrl);
|
|
3821
|
+
},
|
|
3822
|
+
select,
|
|
3823
|
+
enabled: !!address && !!integratorId && !!apiUrl,
|
|
3824
|
+
staleTime: 30_000,
|
|
3825
|
+
})),
|
|
3826
|
+
});
|
|
3827
|
+
const isLoading = queries.some((q) => q.isLoading);
|
|
3828
|
+
const isError = queries.length > 0 && queries.every((q) => q.isError);
|
|
3829
|
+
return React.useMemo(() => {
|
|
3830
|
+
if (!destinationToken) {
|
|
3831
|
+
return { isLoading, isError, groups: [] };
|
|
3832
|
+
}
|
|
3833
|
+
const backendTxs = queries
|
|
3834
|
+
.map((q) => q.data)
|
|
3835
|
+
.flatMap((data) => data ?? []);
|
|
3836
|
+
// Overlay local pendings for the brief window where a tx resolved locally
|
|
3837
|
+
// but Squid's backend hasn't indexed it yet.
|
|
3838
|
+
const formatted = backendTxs.map((tx) => toFormattedTx(tx, findChain(tx.fromChainId)));
|
|
3839
|
+
const connectedAddressSet = new Set(addresses.map((a) => a.toLowerCase()));
|
|
3840
|
+
const expectedPayment = paymentAmount && destinationTokenDecimals != null
|
|
3841
|
+
? reactHooks.parseToBigInt(paymentAmount, destinationTokenDecimals).toString()
|
|
3842
|
+
: undefined;
|
|
3843
|
+
for (const { data: pendingTx, txType } of pendingFromStore) {
|
|
3844
|
+
if (txType !== reactHooks.HistoryTxType.SWAP)
|
|
3845
|
+
continue;
|
|
3846
|
+
// validate source address
|
|
3847
|
+
if (!connectedAddressSet.has(pendingTx.fromAddress.toLowerCase())) {
|
|
3848
|
+
continue;
|
|
3849
|
+
}
|
|
3850
|
+
// validate destination token
|
|
3851
|
+
if (!matchesDestinationToken({ address: pendingTx.toToken, chainId: pendingTx.toChain }, destinationToken)) {
|
|
3852
|
+
continue;
|
|
3853
|
+
}
|
|
3854
|
+
// skip if already indexed
|
|
3855
|
+
if (backendTxs.some((tx) => isSameTx(tx, pendingTx)))
|
|
3856
|
+
continue;
|
|
3857
|
+
const isPayment = expectedPayment != null && pendingTx.toAmount === expectedPayment;
|
|
3858
|
+
if (isPaymentMode !== isPayment)
|
|
3859
|
+
continue;
|
|
3860
|
+
formatted.unshift(pendingSwapToFormattedTx(pendingTx, findToken, findChain));
|
|
3861
|
+
}
|
|
3862
|
+
return {
|
|
3863
|
+
isLoading,
|
|
3864
|
+
isError,
|
|
3865
|
+
groups: groupAndSortByDay(formatted),
|
|
3866
|
+
};
|
|
3867
|
+
// `useQueries` returns a fresh outer array every render, so depending on
|
|
3868
|
+
// `queries` directly would bust this memo on every render. Spreading the
|
|
3869
|
+
// individual `q.data` refs sidesteps that — they're kept stable by
|
|
3870
|
+
// React Query's structural sharing across renders when the data is equal.
|
|
3871
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
3872
|
+
}, [
|
|
3873
|
+
destinationToken,
|
|
3874
|
+
addresses,
|
|
3875
|
+
isPaymentMode,
|
|
3876
|
+
paymentAmount,
|
|
3877
|
+
destinationTokenDecimals,
|
|
3878
|
+
findChain,
|
|
3879
|
+
findToken,
|
|
3880
|
+
pendingFromStore,
|
|
3881
|
+
isLoading,
|
|
3882
|
+
isError,
|
|
3883
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
3884
|
+
...queries.map((q) => q.data),
|
|
3885
|
+
]);
|
|
3886
|
+
}
|
|
3887
|
+
|
|
3888
|
+
function formatDateToHhMm(date) {
|
|
3889
|
+
return date.toLocaleTimeString("en-US", {
|
|
3890
|
+
hour: "2-digit",
|
|
3891
|
+
minute: "2-digit",
|
|
3892
|
+
});
|
|
3893
|
+
}
|
|
3894
|
+
function formatDayHeader(yyyyMmDd) {
|
|
3895
|
+
const [year = 0, month = 0, day] = yyyyMmDd.split("-").map(Number);
|
|
3896
|
+
const date = new Date(year, month - 1, day);
|
|
3897
|
+
const currentYear = new Date().getFullYear();
|
|
3898
|
+
if (year === currentYear) {
|
|
3899
|
+
return new Intl.DateTimeFormat("en-US", {
|
|
3900
|
+
month: "long",
|
|
3901
|
+
day: "numeric",
|
|
3902
|
+
}).format(date);
|
|
3903
|
+
}
|
|
3904
|
+
return new Intl.DateTimeFormat("en-US", {
|
|
3905
|
+
month: "long",
|
|
3906
|
+
day: "numeric",
|
|
3907
|
+
year: "numeric",
|
|
3908
|
+
}).format(date);
|
|
3909
|
+
}
|
|
3910
|
+
|
|
3911
|
+
function ActivityListItem({ fromAmount, fromToken, fromChain, toAmount, toToken, timestamp, status, explorer, }) {
|
|
3912
|
+
const isPaymentMode = useIsPaymentMode();
|
|
3913
|
+
return (jsxRuntime.jsx("li", { children: jsxRuntime.jsxs("a", { href: explorer?.url, target: explorer ? "_blank" : undefined, rel: explorer ? "noopener noreferrer" : undefined, title: explorer ? `View on ${explorer.name}` : undefined, className: ui.cn("tw-flex tw-h-[4.5rem] tw-px-4 tw-items-center tw-gap-3 tw-shrink-0", explorer && "hover:tw-bg-material-light-thin"), children: [jsxRuntime.jsx(TokenBadgeIcon, { tokenSrc: fromToken.logo, chainSrc: fromChain.logo }), jsxRuntime.jsxs("div", { className: "tw-flex tw-flex-col tw-items-start tw-gap-0.5 tw-flex-1 tw-min-w-0", children: [jsxRuntime.jsxs("div", { className: "tw-flex tw-items-center tw-gap-1 tw-self-stretch", children: [jsxRuntime.jsx(ui.BodyText, { size: "small", children: isPaymentMode ? "Payment" : "Deposit" }), explorer && (jsxRuntime.jsx(ui.SquareArrowTopRightIcon, { size: "0.875rem", className: "tw-text-grey-500" })), jsxRuntime.jsx(ui.BodyText, { size: "small", className: "tw-ml-auto", children: toAmount }), jsxRuntime.jsx(ui.BodyText, { size: "small", className: "tw-text-grey-400", children: toToken.symbol })] }), jsxRuntime.jsxs("div", { className: "tw-flex tw-justify-between tw-items-center tw-self-stretch", children: [jsxRuntime.jsx("div", { className: "tw-flex tw-items-center tw-gap-1", children: jsxRuntime.jsxs(ui.CaptionText, { className: "tw-text-grey-500", children: ["Paid ", fromAmount, " ", fromToken.symbol] }) }), status === "ongoing" ? (jsxRuntime.jsx(ui.Loader, { size: "1rem", strokeWidth: "4", className: "tw-text-royal-500" })) : status === "refunded" ? (jsxRuntime.jsx(ui.CaptionText, { className: "tw-text-status-negative", children: "Refunded" })) : (jsxRuntime.jsx(ui.CaptionText, { className: "tw-text-grey-500", children: formatDateToHhMm(new Date(timestamp)) }))] })] })] }) }));
|
|
3914
|
+
}
|
|
3915
|
+
|
|
3916
|
+
function TransactionHistoryView() {
|
|
3917
|
+
const { isLoading, isError, groups } = useTransactionHistory();
|
|
3918
|
+
const isPaymentMode = useIsPaymentMode();
|
|
3919
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(SubNavBar, { title: "Activity" }), jsxRuntime.jsx(ViewContainer, { children: isLoading ? (jsxRuntime.jsx("div", { className: "tw-flex tw-flex-1 tw-items-center tw-justify-center", children: jsxRuntime.jsx(ui.Loader, { size: "2rem", className: "tw-text-royal-500" }) })) : isError ? (jsxRuntime.jsx(Message, { children: "Error loading transactions" })) : groups.length === 0 ? (jsxRuntime.jsxs(Message, { children: ["Your ", isPaymentMode ? "payments" : "deposits", " will appear here"] })) : (jsxRuntime.jsx("div", { className: "tw-flex tw-flex-col tw-w-full", children: groups.map((group) => (jsxRuntime.jsxs("section", { className: "tw-flex tw-flex-col", children: [jsxRuntime.jsx(ui.SectionTitle, { title: formatDayHeader(group.day), className: "tw-bg-transparent" }), jsxRuntime.jsx("ul", { className: "tw-flex tw-flex-col", children: group.transactions.map((tx) => (jsxRuntime.jsx(ActivityListItem, { ...tx }, tx.id))) })] }, group.day))) })) })] }));
|
|
3920
|
+
}
|
|
3921
|
+
function Message({ children }) {
|
|
3922
|
+
return (jsxRuntime.jsx("div", { className: "tw-flex tw-flex-1 tw-items-center tw-justify-center tw-px-4 tw-text-center", children: jsxRuntime.jsx(ui.BodyText, { size: "small", className: "tw-text-material-light-thick", children: children }) }));
|
|
3923
|
+
}
|
|
3924
|
+
|
|
3925
|
+
function renderView(view) {
|
|
3926
|
+
switch (view.id) {
|
|
3927
|
+
case "main":
|
|
3928
|
+
return jsxRuntime.jsx(MainView, {});
|
|
3929
|
+
case "connect-wallet":
|
|
3930
|
+
return jsxRuntime.jsx(ConnectWalletView, { chainType: view.chainType });
|
|
3931
|
+
case "select-chain":
|
|
3932
|
+
return jsxRuntime.jsx(SelectChainView, { wallet: view.wallet });
|
|
3933
|
+
case "qr-code":
|
|
3934
|
+
return jsxRuntime.jsx(QrCodeView, {});
|
|
3935
|
+
case "select-token":
|
|
3936
|
+
return jsxRuntime.jsx(SelectTokenView, {});
|
|
3937
|
+
case "transaction-history":
|
|
3938
|
+
return jsxRuntime.jsx(TransactionHistoryView, {});
|
|
3939
|
+
case "transaction-progress":
|
|
3940
|
+
return jsxRuntime.jsx(TransactionProgressView, {});
|
|
3941
|
+
}
|
|
3942
|
+
}
|
|
3943
|
+
|
|
3944
|
+
const CHAIN_TYPE_PRIORITY = [
|
|
3945
|
+
distExports.ChainType.EVM,
|
|
3946
|
+
distExports.ChainType.SOLANA,
|
|
3947
|
+
distExports.ChainType.COSMOS,
|
|
3948
|
+
distExports.ChainType.SUI,
|
|
3949
|
+
distExports.ChainType.BTC,
|
|
3950
|
+
distExports.ChainType.XRPL,
|
|
3951
|
+
distExports.ChainType.STELLAR,
|
|
3952
|
+
];
|
|
3953
|
+
const DEFAULT_CHAIN_ID_BY_TYPE = {
|
|
3954
|
+
[distExports.ChainType.EVM]: reactHooks.CHAIN_IDS.ETHEREUM,
|
|
3955
|
+
[distExports.ChainType.COSMOS]: reactHooks.CHAIN_IDS.OSMOSIS,
|
|
3956
|
+
[distExports.ChainType.BTC]: reactHooks.CHAIN_IDS.BITCOIN,
|
|
3957
|
+
[distExports.ChainType.SOLANA]: reactHooks.CHAIN_IDS.SOLANA,
|
|
3958
|
+
[distExports.ChainType.SUI]: reactHooks.CHAIN_IDS.SUI,
|
|
3959
|
+
[distExports.ChainType.XRPL]: reactHooks.CHAIN_IDS.XRPL,
|
|
3960
|
+
[distExports.ChainType.STELLAR]: reactHooks.CHAIN_IDS.STELLAR,
|
|
3961
|
+
};
|
|
3962
|
+
function useAutoSelectToken() {
|
|
3963
|
+
const { fromToken: token, onSwapChange } = reactHooks.useSwap();
|
|
3964
|
+
const { connectedWalletsByChainType } = reactHooks.useWallet();
|
|
3965
|
+
const { findToken, tokens } = reactHooks.useSquidTokens();
|
|
3966
|
+
const hasAutoSelected = React.useRef(false);
|
|
3967
|
+
React.useEffect(() => {
|
|
3968
|
+
if (token != null) {
|
|
3969
|
+
hasAutoSelected.current = false;
|
|
3970
|
+
return;
|
|
3971
|
+
}
|
|
3972
|
+
if (hasAutoSelected.current)
|
|
3973
|
+
return;
|
|
3974
|
+
if (tokens.length === 0)
|
|
3975
|
+
return;
|
|
3976
|
+
const connectedChainType = CHAIN_TYPE_PRIORITY.find((ct) => {
|
|
3977
|
+
const walletState = connectedWalletsByChainType[ct];
|
|
3978
|
+
return !!walletState?.wallet && !!walletState?.address;
|
|
3979
|
+
});
|
|
3980
|
+
if (!connectedChainType)
|
|
3981
|
+
return;
|
|
3982
|
+
const nativeAddress = reactHooks.chainTypeToNativeTokenAddressMap[connectedChainType];
|
|
3983
|
+
const defaultChainId = DEFAULT_CHAIN_ID_BY_TYPE[connectedChainType];
|
|
3984
|
+
const nativeToken = findToken(nativeAddress, defaultChainId);
|
|
3985
|
+
if (nativeToken) {
|
|
3986
|
+
onSwapChange({
|
|
3987
|
+
fromChainId: nativeToken.chainId,
|
|
3988
|
+
fromTokenAddress: nativeToken.address,
|
|
3989
|
+
});
|
|
3990
|
+
hasAutoSelected.current = true;
|
|
3991
|
+
}
|
|
3992
|
+
}, [token, connectedWalletsByChainType, tokens, findToken, onSwapChange]);
|
|
3993
|
+
}
|
|
3994
|
+
|
|
3995
|
+
function DepositWidget({ config, }) {
|
|
3996
|
+
const { theme, themeType } = config;
|
|
3997
|
+
return (jsxRuntime.jsx(reactHooks.SquidProvider, { config: { integratorId: config.integrator.id, apiUrl: config.apiUrl }, placeholder: jsxRuntime.jsx(WidgetLayout, { theme: theme, themeType: themeType, children: jsxRuntime.jsx(WidgetSkeleton, {}) }), children: jsxRuntime.jsx(WidgetLayout, { theme: theme, themeType: themeType, children: jsxRuntime.jsx(DepositWidgetContent, { config: config }) }) }));
|
|
3998
|
+
}
|
|
3999
|
+
function DepositWidgetContent({ config, }) {
|
|
4000
|
+
const currentView = useRouter(selectCurrentView);
|
|
4001
|
+
const setConfig = useDepositStore((s) => s.setConfig);
|
|
4002
|
+
const { onSwapChange, toAmountChanged, fromAmountChanged } = reactHooks.useSwap();
|
|
4003
|
+
React.useEffect(() => {
|
|
4004
|
+
setConfig(config);
|
|
4005
|
+
}, [config, setConfig]);
|
|
4006
|
+
React.useEffect(() => {
|
|
4007
|
+
onSwapChange({
|
|
4008
|
+
toChainId: config.destinationToken.chainId,
|
|
4009
|
+
toTokenAddress: config.destinationToken.address,
|
|
4010
|
+
destinationAddress: { address: config.destinationAddress },
|
|
4011
|
+
});
|
|
4012
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
4013
|
+
}, [
|
|
4014
|
+
config.destinationAddress,
|
|
4015
|
+
config.destinationToken.chainId,
|
|
4016
|
+
config.destinationToken.address,
|
|
4017
|
+
]);
|
|
4018
|
+
const paymentAmount = usePaymentAmount();
|
|
4019
|
+
React.useEffect(() => {
|
|
4020
|
+
if (paymentAmount) {
|
|
4021
|
+
fromAmountChanged("");
|
|
4022
|
+
toAmountChanged(paymentAmount);
|
|
4023
|
+
}
|
|
4024
|
+
else {
|
|
4025
|
+
toAmountChanged("");
|
|
4026
|
+
fromAmountChanged("");
|
|
4027
|
+
}
|
|
4028
|
+
}, [paymentAmount, toAmountChanged, fromAmountChanged]);
|
|
4029
|
+
useAutoSelectToken();
|
|
4030
|
+
reactHooks.useAllConnectedWalletBalances(); // Pre-warm balance cache
|
|
4031
|
+
// Polls /v2/status for pending txs — also what registers them with Squid's backend for /history/wallet
|
|
4032
|
+
reactHooks.useAllTransactionsStatus({ enabled: true });
|
|
4033
|
+
return (jsxRuntime.jsx(ViewTransition, { viewId: currentView.id, children: renderView(currentView) }));
|
|
4034
|
+
}
|
|
4035
|
+
function WidgetLayout({ theme, themeType, children, }) {
|
|
4036
|
+
const mergedTheme = React.useMemo(() => {
|
|
4037
|
+
const base = themeType === "dark" ? ui.darkTheme : ui.lightTheme;
|
|
4038
|
+
const merged = { ...base.color, ...theme?.color };
|
|
4039
|
+
return {
|
|
4040
|
+
...base,
|
|
4041
|
+
...theme,
|
|
4042
|
+
fontFamily: {
|
|
4043
|
+
...base.fontFamily,
|
|
4044
|
+
"squid-main": '"DMSansVariable", sans-serif',
|
|
4045
|
+
// Integrator override wins.
|
|
4046
|
+
...theme?.fontFamily,
|
|
4047
|
+
},
|
|
4048
|
+
color: {
|
|
4049
|
+
...merged,
|
|
4050
|
+
"animation-bg": merged["grey-900"],
|
|
4051
|
+
"animation-text": merged["animation-bg"] ?? merged["grey-900"],
|
|
4052
|
+
},
|
|
4053
|
+
};
|
|
4054
|
+
}, [theme, themeType]);
|
|
4055
|
+
return (jsxRuntime.jsxs(ui.ThemeProvider, { theme: mergedTheme, themeType: themeType, children: [jsxRuntime.jsx("style", { id: "squid-deposit-widget-inline-style", dangerouslySetInnerHTML: { __html: css_248z } }), jsxRuntime.jsx("div", { className: "squid-style-container--preflight tw-bg-grey-900 tw-text-grey-100 tw-flex tw-w-widget-card tw-h-widget-card tw-flex-col tw-items-center tw-shrink-0 tw-rounded-3xl tw-border tw-border-grey-900 dark:tw-shadow-widget-card-dark tw-shadow-widget-card-light tw-font-medium", children: children })] }));
|
|
4056
|
+
}
|
|
4057
|
+
function WidgetSkeleton() {
|
|
4058
|
+
return (jsxRuntime.jsxs("div", { className: "tw-flex tw-flex-col tw-flex-1 tw-w-full tw-animate-pulse", children: [jsxRuntime.jsxs("div", { className: "tw-flex tw-pt-3 tw-pb-8 tw-px-4 tw-flex-col tw-justify-end tw-items-center tw-gap-4 tw-flex-1", children: [jsxRuntime.jsx("div", { className: "tw-w-32 tw-h-32 tw-rounded-full tw-bg-grey-800" }), jsxRuntime.jsxs("div", { className: "tw-flex tw-pt-2 tw-pb-4 tw-flex-col tw-items-center tw-gap-4", children: [jsxRuntime.jsx("div", { className: "tw-h-6 tw-w-48 tw-rounded tw-bg-grey-800" }), jsxRuntime.jsxs("div", { className: "tw-flex tw-flex-col tw-items-center tw-gap-2", children: [jsxRuntime.jsx("div", { className: "tw-h-4 tw-w-56 tw-rounded tw-bg-grey-800" }), jsxRuntime.jsx("div", { className: "tw-h-4 tw-w-40 tw-rounded tw-bg-grey-800" })] }), jsxRuntime.jsx("div", { className: "tw-h-4 tw-w-20 tw-rounded tw-bg-grey-800" })] })] }), jsxRuntime.jsx("div", { className: "tw-px-4 tw-pb-4", children: jsxRuntime.jsx("div", { className: "tw-h-12 tw-w-full tw-rounded-full tw-bg-grey-800" }) })] }));
|
|
4059
|
+
}
|
|
4060
|
+
|
|
4061
|
+
exports.DepositWidget = DepositWidget;
|
|
4062
|
+
//# sourceMappingURL=index.cjs.map
|