@openreceive/browser 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/{chunk-NVEGYGZ5.js → chunk-JR3DCSHN.js} +80 -19
- package/dist/headless.d.ts +109 -23
- package/dist/headless.js +29 -6
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/{status-C-zvqBau.d.ts → status-BZEGi6Ca.d.ts} +74 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ Part of [OpenReceive](https://openreceive.org). Start with the [Node quickstart]
|
|
|
15
15
|
(state machine, wizard/status/swap models, formatters, labels, styling
|
|
16
16
|
tokens). See the
|
|
17
17
|
[Headless checkout guide](https://github.com/openreceive/openreceive/blob/master/docs/guides/headless-checkout.md);
|
|
18
|
-
the
|
|
18
|
+
the buttons rails example is the flagship demo of this style.
|
|
19
19
|
|
|
20
20
|
There is no private subpath: `./headless` is both the integration surface and
|
|
21
21
|
the floor under `@openreceive/elements`, `@openreceive/react`, and the
|
|
@@ -46,7 +46,7 @@ files where the resolution lands. Per setup:
|
|
|
46
46
|
`node_modules/@openreceive/browser/dist/assets/icons` into
|
|
47
47
|
`public/assets/icons/`, or copy it into the build output from a small
|
|
48
48
|
`writeBundle` plugin (the repo demos use
|
|
49
|
-
`examples/
|
|
49
|
+
`examples/buttons/shared/copy-openreceive-payment-icons-plugin.ts`).
|
|
50
50
|
- **webpack / Next.js**: copy the icons next to your emitted bundles with
|
|
51
51
|
`copy-webpack-plugin` (the repo's Rails Shakapacker demo copies
|
|
52
52
|
`node_modules/@openreceive/browser/dist/assets/icons` to
|
|
@@ -8,6 +8,7 @@ var OPENRECEIVE_DEFAULT_POLL_INTERVAL_MS = 3e3;
|
|
|
8
8
|
var OPENRECEIVE_LIGHTNING_REUSE_BUFFER_SECONDS = 60;
|
|
9
9
|
var OPENRECEIVE_DEFAULT_PREFIX = "/openreceive";
|
|
10
10
|
var OPENRECEIVE_COPY_FEEDBACK_MS = 1800;
|
|
11
|
+
var OPENRECEIVE_PROVIDER_PREVIEW_LIMIT = 4;
|
|
11
12
|
var OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME = "openreceive-checkout";
|
|
12
13
|
var OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME = "openreceive-theme-toggle";
|
|
13
14
|
var OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS = {
|
|
@@ -154,6 +155,14 @@ var OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES = {
|
|
|
154
155
|
* push/replace the URL via the History API.
|
|
155
156
|
*/
|
|
156
157
|
routeReference: "route-reference",
|
|
158
|
+
/**
|
|
159
|
+
* Does a payer who closes this tab have a URL that brings them back to this
|
|
160
|
+
* checkout? Only the refund screen's copy depends on it — see
|
|
161
|
+
* `SwapDisplayModel.refundReturnLabel`. Unset, the element infers it from
|
|
162
|
+
* `sync-url` / `route-reference`; set it when the host owns a per-order route
|
|
163
|
+
* of its own, which the element cannot see.
|
|
164
|
+
*/
|
|
165
|
+
resumable: "resumable",
|
|
157
166
|
/**
|
|
158
167
|
* Base URL of an external bolt11 decoder. When set, the checkout shows a
|
|
159
168
|
* "Decode" link to `{decode-link-url}?invoice={bolt11}`. Omitted (the
|
|
@@ -184,7 +193,7 @@ var OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES = {
|
|
|
184
193
|
};
|
|
185
194
|
|
|
186
195
|
// src/internal/icons.ts
|
|
187
|
-
import { warnOnFileAssetUrl } from "@openreceive/provider-data";
|
|
196
|
+
import { lazyAssetUrlTable, warnOnFileAssetUrl } from "@openreceive/provider-data";
|
|
188
197
|
var OPENRECEIVE_PAYMENT_ICON_IDS = [
|
|
189
198
|
"btc",
|
|
190
199
|
"crypto",
|
|
@@ -222,8 +231,9 @@ function paymentIconUrl(file) {
|
|
|
222
231
|
var paymentIconPaths = Object.fromEntries(
|
|
223
232
|
OPENRECEIVE_PAYMENT_ICON_IDS.map((id) => [id, `${PACKAGED_ICON_PREFIX}${id}.svg`])
|
|
224
233
|
);
|
|
225
|
-
var paymentIconUrls =
|
|
226
|
-
OPENRECEIVE_PAYMENT_ICON_IDS
|
|
234
|
+
var paymentIconUrls = lazyAssetUrlTable(
|
|
235
|
+
OPENRECEIVE_PAYMENT_ICON_IDS,
|
|
236
|
+
(id) => paymentIconUrl(`${id}.svg`)
|
|
227
237
|
);
|
|
228
238
|
var paymentMethodIconIds = {
|
|
229
239
|
bitcoin: "btc"
|
|
@@ -524,15 +534,31 @@ var checkoutLabels = {
|
|
|
524
534
|
/** Same sentence when the provider only reported PAY-side limits. */
|
|
525
535
|
swapPayMinimumSentence: "To pay with {asset}, the minimum is {amount} {asset}.",
|
|
526
536
|
swapPayMaximumSentence: "To pay with {asset}, the maximum is {amount} {asset}.",
|
|
527
|
-
/**
|
|
528
|
-
|
|
537
|
+
/**
|
|
538
|
+
* Shown on the refund screen so the payer can return after closing the tab —
|
|
539
|
+
* and TRUE ONLY IF THIS CHECKOUT HAS A URL TO RETURN TO. Both are reached
|
|
540
|
+
* through {@link SwapDisplayModel.refundReturnLabel}, which picks between
|
|
541
|
+
* them from what the host declared; neither should be rendered directly.
|
|
542
|
+
*/
|
|
543
|
+
refundReturnWarning: "Bookmark this page, or copy its URL. You need it to return to this refund screen.",
|
|
544
|
+
/**
|
|
545
|
+
* The same screen when the checkout is NOT resumable — no synced URL, no
|
|
546
|
+
* per-order route. Telling that payer to bookmark the page would send them
|
|
547
|
+
* back to an empty checkout with their deposit unreachable, so it says the
|
|
548
|
+
* true thing instead.
|
|
549
|
+
*/
|
|
550
|
+
refundNoReturnWarning: "Do not close this tab until you have submitted this refund. This checkout has no address to return to, so this screen is the only place it can be requested."
|
|
529
551
|
};
|
|
530
552
|
var checkoutElementStyles = `:host{display:block}${compiledStyles}`;
|
|
531
553
|
var paymentMethods = [
|
|
532
554
|
{
|
|
533
555
|
id: "bitcoin",
|
|
556
|
+
// The detail line disambiguates this tile from its NEIGHBOURS, so it must
|
|
557
|
+
// describe this tile. In a grid where USDT / USDC / SOL / ETH are their own
|
|
558
|
+
// tiles, "send on-chain into a swap" described what those tiles do — one
|
|
559
|
+
// tile away from four tiles that actually do it.
|
|
534
560
|
title: "Bitcoin",
|
|
535
|
-
detail: "Pay
|
|
561
|
+
detail: "Pay a Lightning invoice from any Bitcoin wallet."
|
|
536
562
|
}
|
|
537
563
|
];
|
|
538
564
|
function parseOptionalInteger(value, options = {}) {
|
|
@@ -853,6 +879,7 @@ function createSwapDisplayModel(invoice, options = {}) {
|
|
|
853
879
|
...swap.payout_tx_id === void 0 ? {} : { payoutTxId: swap.payout_tx_id },
|
|
854
880
|
...swap.refund_address === void 0 ? {} : { refundAddress: swap.refund_address },
|
|
855
881
|
refundAllowed: swap.provider_state === "refund_required",
|
|
882
|
+
refundReturnLabel: options.resumable === true ? checkoutLabels.refundReturnWarning : checkoutLabels.refundNoReturnWarning,
|
|
856
883
|
...swap.refund_tx_id === void 0 ? {} : { refundTxId: swap.refund_tx_id },
|
|
857
884
|
...swap.refund_reason === void 0 ? {} : { refundReason: swap.refund_reason },
|
|
858
885
|
...swap.deposit_received_amount === void 0 ? {} : {
|
|
@@ -1077,6 +1104,7 @@ function createDetailExternalLink(options) {
|
|
|
1077
1104
|
|
|
1078
1105
|
// src/internal/checkout-details.ts
|
|
1079
1106
|
function createTransactionDetails(input) {
|
|
1107
|
+
if (input.rail === "checkout_lock") return [];
|
|
1080
1108
|
const rows = [];
|
|
1081
1109
|
const payInAsset = input.swap?.pay_in_asset;
|
|
1082
1110
|
const push = (label, value, copyValue, kind) => {
|
|
@@ -1273,7 +1301,8 @@ function createWizardRouteDisplays(routes, options = {}) {
|
|
|
1273
1301
|
key: getWizardRouteDisplayKey(route),
|
|
1274
1302
|
title: getWizardRouteDisplayTitle(route),
|
|
1275
1303
|
subtitle: getWizardRouteDisplaySubtitle(route),
|
|
1276
|
-
providers: (options.providerPreviewLimit === void 0 ? route.providers : route.providers.slice(0, options.providerPreviewLimit)).map((entry) => createWizardProviderDisplay(entry, options.resolveAssetUrl))
|
|
1304
|
+
providers: (options.providerPreviewLimit === void 0 ? route.providers : route.providers.slice(0, options.providerPreviewLimit)).map((entry) => createWizardProviderDisplay(entry, options.resolveAssetUrl)),
|
|
1305
|
+
providerCount: route.providers.length
|
|
1277
1306
|
}));
|
|
1278
1307
|
}
|
|
1279
1308
|
function getWizardRouteDisplayKey(route) {
|
|
@@ -1441,7 +1470,7 @@ function formatChooseNetworkHeading(assetLabel) {
|
|
|
1441
1470
|
}
|
|
1442
1471
|
function resolvePreservedNetworkSelection(options) {
|
|
1443
1472
|
const nextKey = options.nextGroup.label.trim().toUpperCase();
|
|
1444
|
-
const current = options.
|
|
1473
|
+
const current = options.selectedAssetByGroup[nextKey];
|
|
1445
1474
|
if (current !== void 0 && options.nextGroup.options.some(
|
|
1446
1475
|
(option) => option.pay_in_asset === current && option.available !== false
|
|
1447
1476
|
)) {
|
|
@@ -1450,7 +1479,7 @@ function resolvePreservedNetworkSelection(options) {
|
|
|
1450
1479
|
const previous = options.previousGroup;
|
|
1451
1480
|
if (previous === void 0) return void 0;
|
|
1452
1481
|
const previousKey = previous.label.trim().toUpperCase();
|
|
1453
|
-
const previousAsset = options.
|
|
1482
|
+
const previousAsset = options.selectedAssetByGroup[previousKey];
|
|
1454
1483
|
if (previousAsset === void 0) return void 0;
|
|
1455
1484
|
const previousOption = previous.options.find((option) => option.pay_in_asset === previousAsset);
|
|
1456
1485
|
if (previousOption === void 0) return void 0;
|
|
@@ -1468,30 +1497,30 @@ function findSwapGridGroup(entries, pickerKey) {
|
|
|
1468
1497
|
);
|
|
1469
1498
|
return entry?.kind === "swap" ? entry.group : void 0;
|
|
1470
1499
|
}
|
|
1471
|
-
function
|
|
1500
|
+
function updateSelectedSwapAssetByGroup(options) {
|
|
1472
1501
|
const nextGroup = findSwapGridGroup(options.entries, options.nextKey);
|
|
1473
1502
|
if (nextGroup === void 0 || nextGroup.options.length <= 1) {
|
|
1474
|
-
return options.
|
|
1503
|
+
return options.selectedAssetByGroup;
|
|
1475
1504
|
}
|
|
1476
1505
|
const previousGroup = findSwapGridGroup(options.entries, options.previousKey);
|
|
1477
1506
|
const preserved = resolvePreservedNetworkSelection({
|
|
1478
1507
|
previousGroup,
|
|
1479
1508
|
nextGroup,
|
|
1480
|
-
|
|
1509
|
+
selectedAssetByGroup: options.selectedAssetByGroup
|
|
1481
1510
|
});
|
|
1482
1511
|
const groupKey = nextGroup.label.trim().toUpperCase();
|
|
1483
1512
|
if (preserved === void 0) {
|
|
1484
|
-
const { [groupKey]: _removed, ...rest } = options.
|
|
1513
|
+
const { [groupKey]: _removed, ...rest } = options.selectedAssetByGroup;
|
|
1485
1514
|
return rest;
|
|
1486
1515
|
}
|
|
1487
|
-
return { ...options.
|
|
1516
|
+
return { ...options.selectedAssetByGroup, [groupKey]: preserved };
|
|
1488
1517
|
}
|
|
1489
1518
|
function resolveWizardSelection(options) {
|
|
1490
1519
|
const methodPick = parseMethodPickerKey(options.pickerKey);
|
|
1491
1520
|
if (methodPick !== null) return { kind: "select_method", methodId: methodPick.methodId };
|
|
1492
1521
|
const group = findSwapGridGroup(options.entries, options.pickerKey);
|
|
1493
1522
|
if (group === void 0) return { kind: "none" };
|
|
1494
|
-
const
|
|
1523
|
+
const selectedAssetByGroup = options.selectedAssetByGroup ?? {};
|
|
1495
1524
|
if (group.options.length <= 1) {
|
|
1496
1525
|
const option = group.options.find((entry) => entry.available !== false);
|
|
1497
1526
|
if (option === void 0) return { kind: "none" };
|
|
@@ -1504,11 +1533,11 @@ function resolveWizardSelection(options) {
|
|
|
1504
1533
|
groupKey,
|
|
1505
1534
|
heading: formatChooseNetworkHeading(group.label),
|
|
1506
1535
|
...wizardNetworkGroupIds(groupKey),
|
|
1507
|
-
|
|
1536
|
+
selectedAssetByGroup: updateSelectedSwapAssetByGroup({
|
|
1508
1537
|
entries: options.entries,
|
|
1509
1538
|
nextKey: options.pickerKey,
|
|
1510
1539
|
previousKey: options.previousKey ?? null,
|
|
1511
|
-
|
|
1540
|
+
selectedAssetByGroup
|
|
1512
1541
|
})
|
|
1513
1542
|
};
|
|
1514
1543
|
}
|
|
@@ -1584,7 +1613,7 @@ function swapGroupLimitOption(options) {
|
|
|
1584
1613
|
}
|
|
1585
1614
|
function createMethodGridDisplay(options) {
|
|
1586
1615
|
const selectedKey = options.selectedPickerKey ?? null;
|
|
1587
|
-
const
|
|
1616
|
+
const selectedAssetByGroup = options.selectedAssetByGroup ?? {};
|
|
1588
1617
|
const startingAsset = options.startingAsset === null || options.startingAsset === "" ? void 0 : options.startingAsset;
|
|
1589
1618
|
const gridBusy = startingAsset !== void 0;
|
|
1590
1619
|
const entries = [];
|
|
@@ -1603,7 +1632,7 @@ function createMethodGridDisplay(options) {
|
|
|
1603
1632
|
if (displayOption === void 0) continue;
|
|
1604
1633
|
const groupKey = group.label.trim().toUpperCase();
|
|
1605
1634
|
const multiNetwork = group.options.length > 1;
|
|
1606
|
-
const selectedAsset =
|
|
1635
|
+
const selectedAsset = selectedAssetByGroup[groupKey];
|
|
1607
1636
|
const selectedOption = selectedAsset === void 0 ? void 0 : group.options.find((option) => option.pay_in_asset === selectedAsset);
|
|
1608
1637
|
const activeOption = selectedOption ?? displayOption;
|
|
1609
1638
|
const disabled = group.options.every((option) => option.available === false);
|
|
@@ -2740,6 +2769,36 @@ function openWallet(options) {
|
|
|
2740
2769
|
);
|
|
2741
2770
|
return uri;
|
|
2742
2771
|
}
|
|
2772
|
+
function createQrSvgController(options) {
|
|
2773
|
+
let generation = 0;
|
|
2774
|
+
const qrOptions = () => ({
|
|
2775
|
+
...options.encoder === void 0 ? {} : { encoder: options.encoder },
|
|
2776
|
+
...options.width === void 0 ? {} : { width: options.width }
|
|
2777
|
+
});
|
|
2778
|
+
const publish = (pending) => {
|
|
2779
|
+
generation += 1;
|
|
2780
|
+
const mine = generation;
|
|
2781
|
+
void pending.then(
|
|
2782
|
+
(svg) => {
|
|
2783
|
+
if (mine === generation) options.onValue(svg);
|
|
2784
|
+
},
|
|
2785
|
+
(error) => {
|
|
2786
|
+
if (mine === generation) options.onError?.(error);
|
|
2787
|
+
}
|
|
2788
|
+
);
|
|
2789
|
+
};
|
|
2790
|
+
return {
|
|
2791
|
+
show(invoice) {
|
|
2792
|
+
publish(createQrSvg(invoice, qrOptions()));
|
|
2793
|
+
},
|
|
2794
|
+
showPayload(payload) {
|
|
2795
|
+
publish(createQrPayloadSvg(payload, qrOptions()));
|
|
2796
|
+
},
|
|
2797
|
+
stop() {
|
|
2798
|
+
generation += 1;
|
|
2799
|
+
}
|
|
2800
|
+
};
|
|
2801
|
+
}
|
|
2743
2802
|
function getQrEncoder(encoder) {
|
|
2744
2803
|
if (encoder !== void 0) return encoder;
|
|
2745
2804
|
if (isQrEncoder(defaultQrEncoder)) return defaultQrEncoder;
|
|
@@ -3474,6 +3533,7 @@ export {
|
|
|
3474
3533
|
OPENRECEIVE_DEFAULT_POLL_INTERVAL_MS,
|
|
3475
3534
|
OPENRECEIVE_DEFAULT_PREFIX,
|
|
3476
3535
|
OPENRECEIVE_COPY_FEEDBACK_MS,
|
|
3536
|
+
OPENRECEIVE_PROVIDER_PREVIEW_LIMIT,
|
|
3477
3537
|
OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME,
|
|
3478
3538
|
OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME,
|
|
3479
3539
|
OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS,
|
|
@@ -3576,6 +3636,7 @@ export {
|
|
|
3576
3636
|
createQrPngDataUrl,
|
|
3577
3637
|
copyInvoice,
|
|
3578
3638
|
openWallet,
|
|
3639
|
+
createQrSvgController,
|
|
3579
3640
|
postJson,
|
|
3580
3641
|
normalizeSwapStartInvoice,
|
|
3581
3642
|
startSwapRequest,
|
package/dist/headless.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { P as ParseOpenReceiveOptionalIntegerOptions, a as PaymentMethod, R as ResolvedTheme, T as ThemePreference, b as PaymentMethodOption, c as TickingValueOptions, d as TickingValueController, e as TransientFeedbackOptions, f as TransientFeedbackController, C as CheckoutInvoiceSnapshot, U as UnixSeconds, S as SwapDisplayModel, g as CheckoutSnapshot, h as SwapDepositRisk, i as CheckoutState, j as TransactionDetailsInput, k as TransactionDetailRow, l as CreateCheckoutStateOptions, m as CheckoutStatusModelInput, n as CheckoutStatusModel, o as CheckoutPaymentMethod, B as BrowserLoggerOption, p as ThemeAttributeTarget, q as CheckoutElementAttributes, r as CheckoutElementAttributeOptions, s as CheckoutElementEventHandlers, t as CheckoutElementListeners, u as CreateCheckoutShellOptions, v as CheckoutShellElements, w as CheckoutShellOptions, x as CheckoutShellModel, y as CreateOpenReceiveThemeToggleElementOptions, z as ThemeToggleElementAttributeOptions, A as ThemeToggleElementAttributes, D as StoredThemeModelOptions, E as ThemeModel, F as ThemeModelOptions, G as ReadThemePreferenceOptions, H as ThemeControlTargets, I as ThemeStorageOptions, J as PaymentWizardControllerOptions, K as PaymentWizardController, L as PaymentWizardSelection, M as PaymentWizardModel, W as WizardRouteAssetDisplay, N as WizardRouteDisplay, O as PaymentWizardSelectionAction } from './status-
|
|
2
|
-
export { Q as BrowserLogContext, V as BrowserLogger, X as BrowserRequestError, Y as CheckoutController, Z as CheckoutControllerOptions, _ as CheckoutPhase, $ as CheckoutStatusRefresh, a0 as OPENRECEIVE_CHECKOUT_DATA_ATTRIBUTES, a1 as OPENRECEIVE_CHECKOUT_DATA_SELECTORS, a2 as OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES, a3 as OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS, a4 as OPENRECEIVE_CHECKOUT_ELEMENT_PARTS, a5 as OPENRECEIVE_CHECKOUT_ELEMENT_PART_SELECTORS, a6 as OPENRECEIVE_CHECKOUT_ELEMENT_SLOTS, a7 as OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME, a8 as OPENRECEIVE_COPY_FEEDBACK_MS, a9 as OPENRECEIVE_DEFAULT_POLL_INTERVAL_MS, aa as OPENRECEIVE_DEFAULT_PREFIX, ab as OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES, ac as OPENRECEIVE_PAYMENT_WIZARD_SELECTORS, ad as
|
|
1
|
+
import { P as ParseOpenReceiveOptionalIntegerOptions, a as PaymentMethod, R as ResolvedTheme, T as ThemePreference, b as PaymentMethodOption, c as TickingValueOptions, d as TickingValueController, e as TransientFeedbackOptions, f as TransientFeedbackController, C as CheckoutInvoiceSnapshot, U as UnixSeconds, S as SwapDisplayModel, g as CheckoutSnapshot, h as SwapDepositRisk, i as CheckoutState, j as TransactionDetailsInput, k as TransactionDetailRow, l as CreateCheckoutStateOptions, m as CheckoutStatusModelInput, n as CheckoutStatusModel, o as CheckoutPaymentMethod, B as BrowserLoggerOption, p as ThemeAttributeTarget, q as CheckoutElementAttributes, r as CheckoutElementAttributeOptions, s as CheckoutElementEventHandlers, t as CheckoutElementListeners, u as CreateCheckoutShellOptions, v as CheckoutShellElements, w as CheckoutShellOptions, x as CheckoutShellModel, y as CreateOpenReceiveThemeToggleElementOptions, z as ThemeToggleElementAttributeOptions, A as ThemeToggleElementAttributes, D as StoredThemeModelOptions, E as ThemeModel, F as ThemeModelOptions, G as ReadThemePreferenceOptions, H as ThemeControlTargets, I as ThemeStorageOptions, J as PaymentWizardControllerOptions, K as PaymentWizardController, L as PaymentWizardSelection, M as PaymentWizardModel, W as WizardRouteAssetDisplay, N as WizardRouteDisplay, O as PaymentWizardSelectionAction } from './status-BZEGi6Ca.js';
|
|
2
|
+
export { Q as BrowserLogContext, V as BrowserLogger, X as BrowserRequestError, Y as CheckoutController, Z as CheckoutControllerOptions, _ as CheckoutPhase, $ as CheckoutStatusRefresh, a0 as OPENRECEIVE_CHECKOUT_DATA_ATTRIBUTES, a1 as OPENRECEIVE_CHECKOUT_DATA_SELECTORS, a2 as OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES, a3 as OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS, a4 as OPENRECEIVE_CHECKOUT_ELEMENT_PARTS, a5 as OPENRECEIVE_CHECKOUT_ELEMENT_PART_SELECTORS, a6 as OPENRECEIVE_CHECKOUT_ELEMENT_SLOTS, a7 as OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME, a8 as OPENRECEIVE_COPY_FEEDBACK_MS, a9 as OPENRECEIVE_DEFAULT_POLL_INTERVAL_MS, aa as OPENRECEIVE_DEFAULT_PREFIX, ab as OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES, ac as OPENRECEIVE_PAYMENT_WIZARD_SELECTORS, ad as OPENRECEIVE_PROVIDER_PREVIEW_LIMIT, ae as OPENRECEIVE_THEME_STORAGE_KEY, af as OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES, ag as OPENRECEIVE_THEME_TOGGLE_ELEMENT_EVENTS, ah as OPENRECEIVE_THEME_TOGGLE_ELEMENT_PARTS, ai as OPENRECEIVE_THEME_TOGGLE_ELEMENT_PART_SELECTORS, aj as OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME, ak as QrEncoder, al as QrSvgController, am as QrSvgControllerOptions, an as Status, ao as SwapCopyRow, ap as SwapRefundStaging, aq as WizardProviderDisplay, ar as assertDisplayInvoice, as as copyInvoice, at as createCheckoutActionEvent, au as createCheckoutController, av as createCheckoutErrorEvent, aw as createCheckoutProviderCopyEvent, ax as createCheckoutStateEvent, ay as createQrPayloadSvg, az as createQrSvg, aA as createQrSvgController, aB as createStatusFetcher, aC as createThemeChangeEvent, aD as deriveCheckoutStateLabels, aE as deriveStatus, aF as enterCheckoutResumePath, aG as escapeHtml, aH as formatAmountCaption, aI as formatDepositAmount, aJ as formatFiatAmount, aK as formatMsats, aL as formatSwapLimit, aM as formatUnixTime, aN as openWallet, aO as prepareCheckout, aP as requestCheckout } from './status-BZEGi6Ca.js';
|
|
3
3
|
import { AssetIndexEntry, AssetUrlResolver, PaymentWizardRoute } from '@openreceive/provider-data';
|
|
4
|
-
export { AssetUrlResolver, createAssetBaseUrlResolver } from '@openreceive/provider-data';
|
|
4
|
+
export { AssetUrlResolver, PaymentWizardRoute, PaymentWizardRouteRequest, createAssetBaseUrlResolver, getPaymentWizardRoutes } from '@openreceive/provider-data';
|
|
5
5
|
import '@openreceive/core';
|
|
6
6
|
|
|
7
7
|
declare const OPENRECEIVE_PAYMENT_ICON_IDS: readonly ["btc", "crypto", "eth", "lightning", "ltc", "sol", "trx", "usdc", "usdt", "xmr", "xrp"];
|
|
@@ -290,8 +290,20 @@ declare const checkoutLabels: {
|
|
|
290
290
|
/** Same sentence when the provider only reported PAY-side limits. */
|
|
291
291
|
readonly swapPayMinimumSentence: "To pay with {asset}, the minimum is {amount} {asset}.";
|
|
292
292
|
readonly swapPayMaximumSentence: "To pay with {asset}, the maximum is {amount} {asset}.";
|
|
293
|
-
/**
|
|
293
|
+
/**
|
|
294
|
+
* Shown on the refund screen so the payer can return after closing the tab —
|
|
295
|
+
* and TRUE ONLY IF THIS CHECKOUT HAS A URL TO RETURN TO. Both are reached
|
|
296
|
+
* through {@link SwapDisplayModel.refundReturnLabel}, which picks between
|
|
297
|
+
* them from what the host declared; neither should be rendered directly.
|
|
298
|
+
*/
|
|
294
299
|
readonly refundReturnWarning: "Bookmark this page, or copy its URL. You need it to return to this refund screen.";
|
|
300
|
+
/**
|
|
301
|
+
* The same screen when the checkout is NOT resumable — no synced URL, no
|
|
302
|
+
* per-order route. Telling that payer to bookmark the page would send them
|
|
303
|
+
* back to an empty checkout with their deposit unreachable, so it says the
|
|
304
|
+
* true thing instead.
|
|
305
|
+
*/
|
|
306
|
+
readonly refundNoReturnWarning: string;
|
|
295
307
|
};
|
|
296
308
|
|
|
297
309
|
declare const checkoutElementStyles = ":host{display:block}/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;--color-black:#000;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--leading-tight:1.25;--leading-snug:1.375;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light],:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=dark]:checked),[data-theme=dark]{color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}@property --radialprogress{syntax:\"<percentage>\";inherits:true;initial-value:0%}@property --aura-angle{syntax:\"<angle>\";inherits:false;initial-value:0deg}:root{scrollbar-color:currentColor #0000}@supports (color:color-mix(in lab, red, red)){:root{scrollbar-color:color-mix(in oklch, currentColor 35%, #0000) #0000}}:root{--fx-noise:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E\");--page-scroll-lock:initial;--page-overflow:var(--page-scroll-lock) hidden}:root:not(span){overflow:var(--page-overflow)}:root{--page-has-backdrop:var(--page-scroll-lock) 1;--page-scroll-bg:var(--page-scroll-lock) var(--root-bg,#0000)}@supports (color:color-mix(in lab, red, red)){:root{--page-scroll-bg:var(--page-scroll-lock) color-mix(in srgb, var(--root-bg,#0000), oklch(0% 0 0) calc(var(--page-has-backdrop,0) * 40%))}}:root{background-image:var(--page-scroll-lock) linear-gradient(var(--root-bg,#0000), var(--root-bg,#0000));transition:var(--page-scroll-lock) background-color .3s ease-out;animation:var(--page-scroll-lock) set-page-has-scroll forwards;animation-timeline:var(--page-scroll-lock) scroll();--page-has-scroll:initial;scrollbar-gutter:var(--page-has-scroll) var(--page-scroll-lock) stable}@keyframes set-page-has-scroll{0%,to{--page-has-scroll: }}:root,[data-theme]{background-color:var(--root-bg);color:var(--color-base-content)}:root{background-color:var(--page-scroll-bg,var(--root-bg))}:where(:root,[data-theme]){--root-bg:var(--color-base-100)}}@layer components;@layer utilities{@layer daisyui.l1.l2.l3{.modal{pointer-events:none;visibility:hidden;width:100%;max-width:none;height:100%;max-height:none;color:inherit;transition:overlay .3s allow-discrete, visibility .3s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;overscroll-behavior:contain;z-index:999;scrollbar-gutter:auto;background-color:#0000;place-items:center;margin:0;padding:0;display:grid;position:fixed;inset:0;overflow:clip}.modal::backdrop{display:none}.modal[popover]{color:inherit;background:0 0;border:0;max-width:none;max-height:none;margin:0;padding:0;inset:0}.modal[popover]::backdrop{background-color:oklch(0% 0 0/.4);transition:background-color .3s ease-out}.tooltip{--tt-bg:var(--color-neutral);--tt-off:calc(100% + .5rem);--tt-tail:calc(100% + 1px + .25rem);--tt-tail-off:.5rem;display:inline-block;position:relative}.tooltip>.tooltip-content,.tooltip[data-tip]:before{border-radius:var(--radius-field);text-align:center;white-space:normal;max-width:20rem;color:var(--color-neutral-content);opacity:0;background-color:var(--tt-bg);pointer-events:none;z-index:2;--tw-content:attr(data-tip);content:var(--tw-content);width:max-content;padding-block:.25rem;padding-inline:.5rem;font-size:.875rem;line-height:1.25;position:absolute}.tooltip:after{opacity:0;background-color:var(--tt-bg);content:\"\";pointer-events:none;--mask-tooltip:url(\"data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A\");width:.625rem;height:.25rem;-webkit-mask-position:-1px 0;mask-position:-1px 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-tooltip);-webkit-mask-image:var(--mask-tooltip);mask-image:var(--mask-tooltip);display:block;position:absolute}@media (prefers-reduced-motion:no-preference){.tooltip>.tooltip-content,.tooltip[data-tip]:before,.tooltip:after{transition:opacity .2s cubic-bezier(.4,0,.2,1) 75ms,transform .2s cubic-bezier(.4,0,.2,1) 75ms}}:is(.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{opacity:1;--tt-pos:0rem}@media (prefers-reduced-motion:no-preference){:is(.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=\"\"]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1)}}.tab:is(.tabs>.tab){cursor:pointer;appearance:none;text-align:center;webkit-user-select:none;-webkit-user-select:none;user-select:none;flex-wrap:wrap;justify-content:center;align-items:center;display:inline-flex;position:relative}@media (hover:hover){.tab:is(.tabs>.tab):hover{color:var(--color-base-content)}}.tab:is(.tabs>.tab){--tab-p:.75rem;--tab-bg:var(--color-base-100);--tab-border-color:var(--color-base-300);--tab-radius-ss:0;--tab-radius-se:0;--tab-radius-es:0;--tab-radius-ee:0;--tab-order:0;--tab-radius-min:calc(.75rem - var(--border));--tab-radius-limit:min(var(--radius-field), var(--tab-radius-min));--tab-radius-grad:#0000 calc(69% - var(--border)), var(--tab-border-color) calc(69% - var(--border) + .25px), var(--tab-border-color) 69%, var(--tab-bg) calc(69% + .25px);order:var(--tab-order);height:var(--tab-height);padding-inline:var(--tab-p);border-color:#0000;font-size:.875rem}.tab:is(.tabs>.tab):is(input[type=radio]){min-width:fit-content}.tab:is(.tabs>.tab):is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.tab:is(.tabs>.tab):is(label){position:relative}.tab:is(.tabs>.tab):is(label) input{cursor:pointer;appearance:none;opacity:0;position:absolute;inset:0}:is(.tab:is(.tabs>.tab):checked,.tab:is(.tabs>.tab):is(label:has(:checked)),.tab:is(.tabs>.tab):is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content{display:block}.tab:is(.tabs>.tab):not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.tab:is(.tabs>.tab):not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.tab:is(.tabs>.tab):not(input):empty{cursor:default;flex-grow:1}.tab:is(.tabs>.tab):focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tab:is(.tabs>.tab):focus{outline-offset:2px;outline:2px solid #0000}}.tab:is(.tabs>.tab):focus-visible,.tab:is(.tabs>.tab):is(label:has(:checked:focus-visible)){outline-offset:-5px;outline:2px solid}.tab:is(.tabs>.tab)[disabled]{pointer-events:none;opacity:.4}.menu{--menu-active-fg:var(--color-neutral-content);--menu-active-bg:var(--color-neutral);flex-flow:column wrap;width:fit-content;padding:.5rem;font-size:.875rem;display:flex}.menu :where(li ul,li menu){white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem;position:relative}.menu :where(li ul,li menu):before{background-color:var(--color-base-content);opacity:.1;width:var(--border);content:\"\";inset-inline-start:0;position:absolute;top:.75rem;bottom:.75rem}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}.menu :where(li:not(.menu-title)>:not(ul,menu,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);text-align:start;-webkit-user-select:none;user-select:none;grid-auto-columns:minmax(auto,max-content) auto max-content;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:grid}.menu :where(li>details>summary){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li>details>summary){outline-offset:2px;outline:2px solid #0000}}.menu :where(li>details>summary)::-webkit-details-marker{display:none}:is(.menu :where(li>details>summary),.menu :where(li>.menu-dropdown-toggle)):after{content:\"\";transform-origin:50%;pointer-events:none;justify-self:flex-end;width:.375rem;height:.375rem;transition-property:rotate,translate;transition-duration:.2s;display:block;translate:0 -1px;rotate:-135deg;box-shadow:inset 2px 2px}.menu details{interpolate-size:allow-keywords;overflow:hidden}.menu details::details-content{block-size:0}@media (prefers-reduced-motion:no-preference){.menu details::details-content{transition-behavior:allow-discrete;transition-property:block-size,content-visibility;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.menu details[open]::details-content{block-size:auto}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{translate:0 1px;rotate:45deg}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{color:var(--color-base-content);--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){box-shadow:inset 0 1px oklch(0% 0 0/.01),inset 0 -1px oklch(100% 0 0/.01)}.menu :where(li:empty){background-color:var(--color-base-content);opacity:.1;height:1px;margin:.5rem 1rem}.menu :where(li){flex-flow:column wrap;flex-shrink:0;align-items:stretch;display:flex;position:relative}.menu :where(li) .badge{justify-self:flex-end}.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{outline-offset:2px;outline:2px solid #0000}}.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{color:var(--menu-active-fg);background-color:var(--menu-active-bg);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}:is(.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):not(:is(.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):active){box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--menu-active-bg)}.menu :where(li).menu-disabled,.menu :where(li) [disabled]{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li).menu-disabled,.menu :where(li) [disabled]{color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.menu .dropdown:focus-within .menu-dropdown-toggle:after{translate:0 1px;rotate:45deg}.menu .dropdown-content{margin-top:.5rem;padding:.5rem}.menu .dropdown-content:before{display:none}.dropdown{position-area:var(--anchor-v,bottom) var(--anchor-h,span-right);display:inline-block;position:relative}.dropdown>:not(:has(~[class*=dropdown-content])):focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.dropdown>:not(:has(~[class*=dropdown-content])):focus{outline-offset:2px;outline:2px solid #0000}}.dropdown .dropdown-content{position:absolute}.dropdown.dropdown-close .dropdown-content,.dropdown:not(details,.dropdown-open,.dropdown-hover:hover,:focus-within) .dropdown-content,.dropdown.dropdown-hover:not(:hover) [tabindex]:first-child:focus:not(:focus-visible)~.dropdown-content{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover],.dropdown .dropdown-content{z-index:999}@media (prefers-reduced-motion:no-preference){.dropdown[popover],.dropdown .dropdown-content{transition-behavior:allow-discrete;transition-property:opacity,scale,display,overlay;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);animation:.2s dropdown}}@starting-style{.dropdown[popover],.dropdown .dropdown-content{opacity:0;scale:.95}}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within)>[tabindex]:first-child{pointer-events:none}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within) .dropdown-content,.dropdown:not(.dropdown-close).dropdown-hover:hover .dropdown-content{opacity:1;scale:1}.dropdown:is(details){overflow:revert-layer}.dropdown:is(details) summary::-webkit-details-marker{display:none}.dropdown:where([popover]){background:0 0}.dropdown[popover]{color:inherit;position:fixed}@supports not (position-area:bottom){.dropdown[popover]{margin:auto}.dropdown[popover].dropdown-close{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover].dropdown-open:not(:popover-open){transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover]::backdrop{background-color:oklab(0% none none/.3)}}:is(.dropdown[popover].dropdown-close,.dropdown[popover]:not(.dropdown-open,:popover-open)){transform-origin:top;opacity:0;display:none;scale:.95}:where(.btn){width:unset}.btn{--size:calc(var(--size-field,.25rem) * 10);--btn-p:1rem;--btn-fg:var(--color-base-content);cursor:pointer;text-align:center;vertical-align:middle;outline-offset:2px;webkit-user-select:none;-webkit-user-select:none;user-select:none;border-width:var(--border);touch-action:manipulation;--btn-bg:var(--btn-color,var(--color-base-200));--btn-border:var(--btn-color,var(--color-base-200));border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-wrap:nowrap;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;font-weight:600;transition-property:color,background-color,border-color,box-shadow,transform;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.btn{--btn-border:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 calc(var(--depth) * 5%))}}.btn{--btn-soft-bg:initial;--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn{--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}.btn{--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));height:var(--size);padding-inline:var(--btn-p);font-size:var(--fontsize,.875rem);background-color:var(--btn-bg);color:var(--btn-fg);border-color:var(--btn-border);border-style:var(--btn-border-style,solid);outline-color:var(--btn-color,var(--color-base-content));--tw-prose-links:var(--btn-fg);background-image:none, var(--fx-noise);background-size:auto, calc(var(--noise,0) * 100%);text-shadow:0 .5px oklch(100% 0 0 / calc(var(--depth) * .15));box-shadow:var(--btn-inset) inset, var(--btn-shadow)}.btn:is([type=checkbox],[type=radio]){appearance:none}.btn:is([type=checkbox],[type=radio])[aria-label]:after{--tw-content:attr(aria-label);content:var(--tw-content)}.loading{pointer-events:none;aspect-ratio:1;vertical-align:middle;width:calc(var(--size-selector,.25rem) * 6);background-color:currentColor;display:inline-block;-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='8s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='8s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}@media (prefers-reduced-motion:no-preference){.loading{-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\")}}.countdown{display:inline-flex}.countdown>*{visibility:hidden;--value-v:calc(mod(max(0, var(--value)), 1000));--value-hundreds:calc(round(to-zero, var(--value-v) / 100, 1));--value-tens:calc(round(to-zero, mod(var(--value-v), 100) / 10, 1));--value-ones:calc(mod(var(--value-v), 100));--show-hundreds:clamp(clamp(0, var(--digits,1) - 2, 1), var(--value-hundreds), 1);--show-tens:clamp(clamp(0, var(--digits,1) - 1, 1), var(--value-tens) + var(--show-hundreds), 1);--first-digits:calc(round(to-zero, var(--value-v) / 10, 1));height:1em;width:calc(1ch + var(--show-tens) * 1ch + var(--show-hundreds) * 1ch);direction:ltr;transition:width .4s ease-out .2s;display:inline-block;position:relative;overflow-y:clip}.countdown>:before,.countdown>:after{visibility:visible;--tw-content:\"00\\a 01\\a 02\\a 03\\a 04\\a 05\\a 06\\a 07\\a 08\\a 09\\a 10\\a 11\\a 12\\a 13\\a 14\\a 15\\a 16\\a 17\\a 18\\a 19\\a 20\\a 21\\a 22\\a 23\\a 24\\a 25\\a 26\\a 27\\a 28\\a 29\\a 30\\a 31\\a 32\\a 33\\a 34\\a 35\\a 36\\a 37\\a 38\\a 39\\a 40\\a 41\\a 42\\a 43\\a 44\\a 45\\a 46\\a 47\\a 48\\a 49\\a 50\\a 51\\a 52\\a 53\\a 54\\a 55\\a 56\\a 57\\a 58\\a 59\\a 60\\a 61\\a 62\\a 63\\a 64\\a 65\\a 66\\a 67\\a 68\\a 69\\a 70\\a 71\\a 72\\a 73\\a 74\\a 75\\a 76\\a 77\\a 78\\a 79\\a 80\\a 81\\a 82\\a 83\\a 84\\a 85\\a 86\\a 87\\a 88\\a 89\\a 90\\a 91\\a 92\\a 93\\a 94\\a 95\\a 96\\a 97\\a 98\\a 99\\a \";content:var(--tw-content);font-variant-numeric:tabular-nums;white-space:pre;text-align:end;direction:rtl;transition:all 1s cubic-bezier(1,0,0,1),width .2s ease-out .2s,opacity .2s ease-out .2s;position:absolute;overflow-x:clip}.countdown>:before{width:calc(1ch + var(--show-hundreds) * 1ch);top:calc(var(--first-digits) * -1em);opacity:var(--show-tens);inset-inline-end:0}.countdown>:after{width:1ch;top:calc(var(--value-ones) * -1em);inset-inline-start:0}.collapse{border-radius:var(--radius-box,1rem);isolation:isolate;grid-template-rows:max-content 0fr;grid-template-columns:minmax(0,1fr);width:100%;display:grid;position:relative}@media (prefers-reduced-motion:no-preference){.collapse{transition:grid-template-rows .2s}}.collapse>input:is([type=checkbox],[type=radio]){appearance:none;opacity:0;z-index:1;grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close)),.collapse:not(.collapse-close):has(>input:is([type=checkbox],[type=radio]):checked){grid-template-rows:max-content 1fr}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){--overflow-delay:.2s;overflow:revert-layer;content-visibility:visible;min-height:fit-content}@supports not (content-visibility:visible){.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){visibility:visible}}.collapse:focus-visible,.collapse:has(>input:is([type=checkbox],[type=radio]):focus-visible),.collapse:has(summary:focus-visible){outline-color:var(--color-base-content);outline-offset:2px;outline-width:2px;outline-style:solid}.collapse:not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-close)>input[type=radio]:not(:checked),.collapse:not(.collapse-close)>.collapse-title{cursor:pointer}:is(.collapse[tabindex]:focus:not(.collapse-close,.collapse[open]),.collapse[tabindex]:focus-within:not(.collapse-close,.collapse[open]))>.collapse-title{cursor:unset}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){padding-bottom:1rem}.collapse:is(details){width:100%}.collapse:is(details)::details-content{--overflow-delay:0s;height:0;overflow:clip}.collapse:is(details):where([open])::details-content{overflow:revert-layer;height:auto}@media (prefers-reduced-motion:no-preference){.collapse:is(details)::details-content{transition:overflow .2s allow-discrete var(--overflow-delay), content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out, height .2s;interpolate-size:allow-keywords}.collapse:is(details):where([open])::details-content{--overflow-delay:.2s}}.collapse:is(details)>summary{outline:none;display:block;position:relative}.collapse:is(details)>summary::-webkit-details-marker{display:none}.collapse-content{--overflow-delay:0s;content-visibility:hidden;min-height:0;cursor:unset;grid-row-start:2;grid-column-start:1;padding-left:1rem;padding-right:1rem;overflow:clip}@supports not (content-visibility:hidden){.collapse-content{visibility:hidden}}@media (prefers-reduced-motion:no-preference){.collapse-content{transition:overflow .2s allow-discrete var(--overflow-delay), content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out}}details>.collapse-content{content-visibility:visible}.filter{flex-wrap:wrap;display:flex}.filter [type=radio]{width:auto}.filter input{opacity:1;transition:visibility .1s allow-discrete, margin .1s, opacity .3s, padding .3s, border-width .1s;overflow:hidden;scale:1}.filter input.filter-reset{aspect-ratio:1}.filter input.filter-reset:after{--tw-content:\"\u00D7\";content:var(--tw-content)}.filter>input:not(:last-child),.filter>:not(:last-child) input{margin-inline-end:.25rem}.list{flex-direction:column;font-size:.875rem;display:flex}.list .list-row{--list-grid-cols:minmax(0, auto) 1fr;border-radius:var(--radius-box);word-break:break-word;grid-auto-flow:column;grid-template-columns:var(--list-grid-cols);gap:1rem;padding:1rem;display:grid;position:relative}:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{content:\"\";border-bottom:var(--border) solid;inset-inline:var(--radius-box);border-color:var(--color-base-content);position:absolute;bottom:0}@supports (color:color-mix(in lab, red, red)){:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{border-color:color-mix(in oklab, var(--color-base-content) 5%, transparent)}}.toast{translate:var(--toast-x,0) var(--toast-y,0);inset-inline:auto 1rem;background-color:#0000;flex-direction:column;gap:.5rem;width:max-content;max-width:calc(100vw - 2rem);display:flex;position:fixed;top:auto;bottom:1rem}@media (prefers-reduced-motion:no-preference){.toast>*{animation:.25s ease-out toast}}.toggle{border:var(--border) solid currentColor;color:var(--input-color);cursor:pointer;appearance:none;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--toggle-p), var(--radius-selector-max)) + min(var(--border), var(--radius-selector-max)));padding:var(--toggle-p);flex-shrink:0;grid-template-columns:0fr 1fr 1fr;place-content:center;display:inline-grid;position:relative;box-shadow:inset 0 1px}@supports (color:color-mix(in lab, red, red)){.toggle{box-shadow:0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000) inset}}.toggle{--input-color:var(--color-base-content);transition:color .3s,grid-template-columns .2s}@supports (color:color-mix(in lab, red, red)){.toggle{--input-color:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}.toggle{--toggle-p:calc(var(--size) * .125);--size:calc(var(--size-selector,.25rem) * 6);width:calc((var(--size) * 2) - (var(--border) + var(--toggle-p)) * 2);height:var(--size)}.toggle>*{z-index:1;cursor:pointer;appearance:none;background-color:#0000;border:none;grid-column:2/span 1;grid-row-start:1;height:100%;padding:.125rem;transition:opacity .2s,rotate .4s}.toggle>:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.toggle>:focus{outline-offset:2px;outline:2px solid #0000}}.toggle>:nth-child(2){color:var(--color-base-100);rotate:0deg}.toggle>:nth-child(3){color:var(--color-base-100);opacity:0;rotate:-15deg}.toggle:has(:checked)>:nth-child(2){opacity:0;rotate:15deg}.toggle:has(:checked)>:nth-child(3){opacity:1;rotate:0deg}.toggle:before{aspect-ratio:1;border-radius:var(--radius-selector);--tw-content:\"\";content:var(--tw-content);width:100%;height:100%;box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor;background-color:currentColor;grid-row-start:1;grid-column-start:2;transition:background-color .1s,translate .2s,inset-inline-start .2s;position:relative;inset-inline-start:0;translate:0}@supports (color:color-mix(in lab, red, red)){.toggle:before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000)}}.toggle:before{background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}@media (forced-colors:active){.toggle:before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{.toggle:before{outline-offset:-1rem;outline:.25rem solid}}.toggle:focus-visible,.toggle:has(:focus-visible){outline-offset:2px;outline:2px solid}.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked){background-color:var(--color-base-100);--input-color:var(--color-base-content);grid-template-columns:1fr 1fr 0fr}:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{background-color:currentColor}@starting-style{:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{opacity:0}}.toggle:indeterminate{grid-template-columns:.5fr 1fr .5fr}.toggle:disabled{cursor:not-allowed;opacity:.3}.toggle:disabled:before{border:var(--border) solid currentColor;background-color:#0000}.input{appearance:none;background-color:var(--color-base-100);vertical-align:middle;white-space:nowrap;--size:calc(var(--size-field,.25rem) * var(--in-size-mul));--input-color:var(--color-base-content);flex-shrink:1;align-items:center;gap:.5rem;padding-inline:.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.input{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.input{cursor:text;width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field))}@supports (color:color-mix(in lab, red, red)){.input{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.input input{appearance:none;background-color:#0000;border:none;width:100%;height:100%}.input input::placeholder{color:var(--color-base-content);opacity:.5}.input input:focus,.input input:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.input input:focus,.input input:focus-within{outline-offset:2px;outline:2px solid #0000}}.input input::-webkit-calendar-picker-indicator{inset-inline-end:-.15em}.input::-webkit-inner-spin-button{margin-inline-end:-10px}.input::-webkit-calendar-picker-indicator{inset-inline-end:.75em}input.input,.input input{display:inline-flex;position:relative}:is(input.input,.input input)[type=url],:is(input.input,.input input)[type=email]{text-align:left}:is(input.input,.input input)::-webkit-datetime-edit{min-height:100%;text-align:inherit;align-items:center;display:grid}:is(input.input,.input input)::-webkit-date-and-time-value{min-height:100%;text-align:inherit;align-items:center;display:grid}:is(input.input,.input input)::-webkit-inner-spin-button{margin-block:calc(.25rem * var(--spin-my))}:is(input.input,.input input)::-webkit-calendar-picker-indicator{cursor:pointer;width:1em;height:1em;position:absolute}:is(input.input,.input input)::-webkit-color-swatch-wrapper{padding-block:.25rem}.input:focus,.input:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.input:focus,.input:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.input:focus,.input:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.input:focus,.input:focus-within{--font-size:1rem}}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200)}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input):is(input),:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) :is(input){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input):is(input),:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) :is(input){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{box-shadow:none}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder,:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) ::placeholder{color:var(--color-base-content);opacity:.2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.range{appearance:none;webkit-appearance:none;--range-thumb:var(--color-base-100);--range-thumb-size:calc(var(--size-selector,.25rem) * 6);--range-progress:currentColor;--range-fill:1;--range-p:.25rem;--range-bg:currentColor}@supports (color:color-mix(in lab, red, red)){.range{--range-bg:color-mix(in oklab, currentColor 10%, #0000)}}.range{--range-fill-x:calc((var(--range-dir,1) * -100cqw) - (var(--range-dir,1) * var(--range-thumb-size) / 2));--range-fill-y:0;--range-fill-spread:calc(100cqw * var(--range-fill));cursor:pointer;vertical-align:middle;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));width:clamp(3rem,20rem,100%);height:var(--range-thumb-size);background-color:#0000;border:none;overflow:hidden}[dir=rtl] .range{--range-dir:-1}.range:focus{outline:none}.range:focus-visible{outline-offset:2px;outline:2px solid}.range::-webkit-slider-runnable-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}@media (forced-colors:active){.range::-webkit-slider-runnable-track{border:1px solid}.range::-moz-range-track{border:1px solid}}.range::-webkit-slider-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));background-color:var(--range-thumb);height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;appearance:none;webkit-appearance:none;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread);position:relative;inset-block-start:50%;transform:translateY(-50%)}@supports (color:color-mix(in lab, red, red)){.range::-webkit-slider-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread)}}.range::-moz-range-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}.range::-moz-range-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread);background-color:currentColor;position:relative}@supports (color:color-mix(in lab, red, red)){.range::-moz-range-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread)}}.range:disabled{cursor:not-allowed;opacity:.3}.table{border-collapse:separate;--tw-border-spacing-x:0;--tw-border-spacing-y:0;width:100%;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y);border-radius:var(--radius-box);text-align:left;font-size:.875rem;position:relative}.table:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}@media (hover:hover){:is(.table tr.row-hover,.table tr.row-hover:nth-child(2n)):hover{background-color:var(--color-base-200)}}.table :where(th,td){vertical-align:middle;padding-block:.75rem;padding-inline:1rem}.table :where(thead,tfoot){white-space:nowrap;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead,tfoot){color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.table :where(thead,tfoot){font-size:.875rem;font-weight:600}.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.table :where(.table-pin-rows thead tr){z-index:1;background-color:var(--color-base-100);position:sticky;top:0}.table :where(.table-pin-rows tfoot tr){z-index:1;background-color:var(--color-base-100);position:sticky;bottom:0}.table :where(.table-pin-cols tr th){background-color:var(--color-base-100);position:sticky;left:0;right:0}.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.aura{--aura-padding:.125rem;padding:var(--aura-padding);border-radius:calc(var(--aura-padding) + var(--aura-radius,var(--radius-box)));animation:aura var(--tw-duration,6s) linear infinite;background-image:conic-gradient(from var(--aura-angle), transparent 225deg, currentColor);display:inline-block;position:relative}.aura:has(>.card,>.alert){--aura-radius:var(--radius-box)}.aura:has(>.btn,>.input,>.select){--aura-radius:var(--radius-field)}.aura:has(>.checkbox,>.toggle,>.badge){--aura-radius:var(--radius-selector)}.aura:before,.aura:after{animation:inherit;background-color:inherit;background-image:inherit;border-radius:inherit;z-index:0;opacity:.7;filter:blur(.25rem);content:\"\";width:100%;height:100%;display:block;position:absolute;top:50%;left:50%;translate:-50% -50%}.aura:after{opacity:.3;filter:blur(1rem)}.aura>*{z-index:1;position:relative}.steps{counter-reset:step;grid-auto-columns:1fr;grid-auto-flow:column;display:inline-grid;overflow:auto hidden}.steps .step{text-align:center;--step-bg:var(--color-base-300);--step-fg:var(--color-base-content);grid-template-rows:40px 1fr;grid-template-columns:auto;place-items:center;min-width:4rem;display:grid}.steps .step:before{width:100%;height:.5rem;color:var(--step-bg);background-color:var(--step-bg);content:\"\";border:1px solid;grid-row-start:1;grid-column-start:1;margin-inline-start:-100%;top:0}.steps .step>.step-icon,.steps .step:not(:has(.step-icon)):after{--tw-content:counter(step);content:var(--tw-content);counter-increment:step;z-index:1;color:var(--step-fg);background-color:var(--step-bg);border:1px solid var(--step-bg);border-radius:3.40282e38px;grid-row-start:1;grid-column-start:1;place-self:center;place-items:center;width:2rem;height:2rem;display:grid;position:relative}.steps .step:first-child:before{--tw-content:none;content:var(--tw-content)}.steps .step[data-content]:after{--tw-content:attr(data-content);content:var(--tw-content)}.select{appearance:none;background-color:var(--color-base-100);vertical-align:middle;--size:calc(var(--size-field,.25rem) * var(--sl-size-mul));--input-color:var(--color-base-content);flex-shrink:1;align-items:center;gap:.375rem;padding-inline:.75rem 1.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.select{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.select{width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;white-space:nowrap;text-overflow:ellipsis;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;background-image:linear-gradient(45deg,#0000 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,#0000 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-repeat:no-repeat;background-size:4px 4px,4px 4px;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));overflow:hidden}@supports (color:color-mix(in lab, red, red)){.select{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}[dir=rtl] .select::picker(select){translate:.5rem}[dir=rtl] .select select::picker(select){translate:.5rem}.select[multiple]{background-image:none;height:auto;padding-block:.75rem;padding-inline-end:.75rem;overflow:auto}.select select{appearance:none;width:calc(100% + 2.75rem);height:calc(100% - calc(var(--border) * 2));background:inherit;border-radius:inherit;border-style:none;align-items:center;margin-inline:-.75rem -1.75rem;padding-inline:.75rem 1.75rem}.select select::placeholder{color:var(--color-base-content);opacity:.5}.select select:focus,.select select:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.select select:focus,.select select:focus-within{outline-offset:2px;outline:2px solid #0000}}.select select:not(:last-child){background-image:none;margin-inline-end:-1.375rem}:is(.select:focus,.select:focus-within,.select:open){--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){:is(.select:focus,.select:focus-within,.select:open){box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}:is(.select:focus,.select:focus-within,.select:open){outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate;background-image:linear-gradient(135deg,#0000 50%,currentColor 50%),linear-gradient(45deg,currentColor 50%,#0000 50%)}.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200)}:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select):is(select),:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select) :is(select){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select):is(select),:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select) :is(select){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{box-shadow:none}:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder,:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select) ::placeholder{color:var(--color-base-content);opacity:.2}.select:has(>select[disabled])>select[disabled]{cursor:not-allowed}@supports (appearance:base-select){:is(.select,.select select){appearance:base-select}:is(.select,.select select)::picker(select){appearance:base-select}}:is(.select,.select select)::picker(select){color:inherit;border:var(--border) solid var(--color-base-200);border-radius:var(--radius-box);background-color:inherit;max-height:min(24rem,70dvh);box-shadow:0 2px calc(var(--depth) * 3px) -2px oklch(0% 0 0/.2);box-shadow:0 20px 25px -5px rgb(0 0 0/calc(var(--depth) * .1)), 0 8px 10px -6px rgb(0 0 0/calc(var(--depth) * .1));margin-block:.5rem;margin-inline:.5rem;padding:.5rem;translate:-.5rem}:is(.select,.select select)::picker-icon{display:none}:is(.select,.select select) selectedcontent{text-overflow:ellipsis;white-space:nowrap;width:100%;overflow:hidden}:is(.select,.select select) optgroup{padding-top:.5em}:is(.select,.select select) optgroup option:first-child{margin-top:.5em}:is(.select,.select select) option{border-radius:var(--radius-field);padding-block:.375rem;padding-inline:calc(.25rem * var(--option-px));white-space:normal;transition-property:color,background-color;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{outline-offset:2px;outline:2px solid #0000}}:is(.select,.select select) option:not(:disabled):active{background-color:var(--color-neutral);color:var(--color-neutral-content);box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--color-neutral)}.collapse-title{grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out;position:relative}.radio{cursor:pointer;appearance:none;vertical-align:middle;border:var(--border) solid var(--input-color,currentColor);border-radius:3.40282e38px;flex-shrink:0;padding:.25rem;display:inline-block;position:relative}@supports (color:color-mix(in lab, red, red)){.radio{border:var(--border) solid var(--input-color,color-mix(in srgb, currentColor 20%, #0000))}}.radio{box-shadow:0 1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset;--size:calc(var(--size-selector,.25rem) * 6);width:var(--size);height:var(--size);color:var(--input-color,currentColor)}.radio:before{--tw-content:\"\";content:var(--tw-content);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);border-radius:3.40282e38px;width:100%;height:100%;display:block}.radio:focus-visible{outline:2px solid}.radio:checked,.radio[aria-checked=true]{background-color:var(--color-base-100);border-color:currentColor}@media (prefers-reduced-motion:no-preference){.radio:checked,.radio[aria-checked=true]{animation:.2s ease-out radio}}:is(.radio:checked,.radio[aria-checked=true]):before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * .1));background-color:currentColor}@media (forced-colors:active){:is(.radio:checked,.radio[aria-checked=true]):before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{:is(.radio:checked,.radio[aria-checked=true]):before{outline-offset:-1rem;outline:.25rem solid}}.rating{vertical-align:middle;--size:var(--size-selector,.25rem) * 6;display:inline-flex;position:relative}.rating input{cursor:pointer;appearance:none}.rating *{background-color:var(--color-base-content);opacity:.2;width:calc(var(--size) * 1);height:calc(var(--size));border-radius:0}@media (prefers-reduced-motion:no-preference){.rating *{animation:.25s ease-out rating}}.rating .rating-hidden{background-color:#0000;width:.5rem}.rating :checked,.rating [aria-checked=true],.rating [aria-current=true],.rating :has(~:checked,~[aria-checked=true],~[aria-current=true]){opacity:1}.rating :focus-visible{scale:1.1}@media (prefers-reduced-motion:no-preference){.rating :focus-visible{transition:scale .2s ease-out}}.rating :active:focus{animation:none;scale:1.1}.card{border-radius:var(--radius-box);outline-offset:2px;outline:2px solid #0000;flex-direction:column;transition:outline .2s ease-in-out;display:flex;position:relative}.card:focus-visible,.card[aria-checked=true],.card:has(>:checked,>:is([type=checkbox],[type=radio]):focus-visible){outline-color:currentColor}.card:has(>:checked:focus-visible),.card[aria-checked=true]:focus-visible,.card[aria-checked=true]:has(>:is([type=checkbox],[type=radio]):focus-visible){outline-width:4px}.card:has(>:is([type=checkbox],[type=radio])){cursor:pointer;-webkit-user-select:none;user-select:none}.card>:is([type=checkbox],[type=radio]){appearance:none}.progress{appearance:none;border-radius:var(--radius-box);background-color:currentColor;width:100%;height:.5rem;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.progress{background-color:color-mix(in oklab, currentcolor 20%, transparent)}}.progress{color:var(--color-base-content)}.progress:indeterminate{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%}@media (prefers-reduced-motion:no-preference){.progress:indeterminate{animation:5s ease-in-out infinite progress}}@supports ((-moz-appearance:none)){.progress:indeterminate::-moz-progress-bar{background-color:#0000}@media (prefers-reduced-motion:no-preference){.progress:indeterminate::-moz-progress-bar{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%;animation:5s ease-in-out infinite progress}}.progress::-moz-progress-bar{border-radius:var(--radius-box);background-color:currentColor}}@supports ((-webkit-appearance:none)){.progress::-webkit-progress-bar{border-radius:var(--radius-box);background-color:#0000}.progress::-webkit-progress-value{border-radius:var(--radius-box);background-color:currentColor}}.textarea{appearance:none;border-radius:var(--radius-field);background-color:var(--color-base-100);vertical-align:middle;--input-color:var(--color-base-content);flex-shrink:1;min-height:5rem;padding-block:.5rem;padding-inline:.75rem}@supports (color:color-mix(in lab, red, red)){.textarea{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.textarea{width:clamp(3rem,20rem,100%);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}@supports (color:color-mix(in lab, red, red)){.textarea{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.textarea textarea{appearance:none;background-color:#0000;border:none}.textarea textarea::placeholder{color:var(--color-base-content);opacity:.5}.textarea textarea:focus,.textarea textarea:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.textarea textarea:focus,.textarea textarea:focus-within{outline-offset:2px;outline:2px solid #0000}}.textarea:focus,.textarea:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.textarea:focus,.textarea:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.textarea:focus,.textarea:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.textarea:focus,.textarea:focus-within{--font-size:1rem}}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){box-shadow:none}:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]))::placeholder,:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled])) ::placeholder{color:var(--color-base-content);opacity:.2}.textarea:has(>textarea[disabled])>textarea[disabled]{cursor:not-allowed}.stack{grid-template-rows:3px 4px 1fr 4px 3px;grid-template-columns:3px 4px 1fr 4px 3px;display:inline-grid}.stack>*{width:100%;height:100%}.stack>:nth-child(n+2){opacity:.7;width:100%}.stack>:nth-child(2){z-index:2;opacity:.9}.stack>:first-child{z-index:3;width:100%}.tab-content{order:var(--tabcontent-order);--tabcontent-radius-ss:var(--radius-box);--tabcontent-radius-se:var(--radius-box);--tabcontent-radius-es:var(--radius-box);--tabcontent-radius-ee:var(--radius-box);--tabcontent-order:1;width:100%;height:calc(100% - var(--tab-height) + var(--border));margin:var(--tabcontent-margin);border-color:#0000;border-width:var(--border);border-start-start-radius:var(--tabcontent-radius-ss);border-start-end-radius:var(--tabcontent-radius-se);border-end-end-radius:var(--tabcontent-radius-ee);border-end-start-radius:var(--tabcontent-radius-es);display:none}.modal-box{background-color:var(--color-base-100);border-top-left-radius:var(--modal-tl,var(--radius-box));border-top-right-radius:var(--modal-tr,var(--radius-box));border-bottom-left-radius:var(--modal-bl,var(--radius-box));border-bottom-right-radius:var(--modal-br,var(--radius-box));opacity:0;overscroll-behavior:contain;grid-row-start:1;grid-column-start:1;width:91.6667%;max-width:32rem;max-height:100vh;padding:1.5rem;transition:translate .3s ease-out,scale .3s ease-out,opacity .2s ease-out 50ms,box-shadow .3s ease-out;overflow-y:auto;scale:.95;box-shadow:0 25px 50px -12px oklch(0% 0 0/.25)}.breadcrumbs{max-width:100%;padding-block:.5rem;overflow-x:auto}.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol{white-space:nowrap;align-items:center;min-height:min-content;display:flex}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li{align-items:center;display:flex}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>*{cursor:pointer;align-items:center;gap:.5rem;display:flex}@media (hover:hover){:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>:hover{text-decoration-line:underline}}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>:focus{outline-offset:2px;outline:2px solid #0000}}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>:focus-visible{outline-offset:2px;outline:2px solid}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li+:before{content:\"\";opacity:.4;background-color:#0000;border-top:1px solid;border-right:1px solid;width:.375rem;height:.375rem;margin-inline:.5rem .75rem;display:block;rotate:45deg}[dir=rtl] :is(:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li)+:before{rotate:-135deg}.label{white-space:nowrap;color:currentColor;align-items:center;gap:.375rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.label{color:color-mix(in oklab, currentcolor 60%, transparent)}}.label:has(input){cursor:pointer}.label:is(.input>*,.select>*){white-space:nowrap;height:calc(100% - .5rem);font-size:inherit;align-items:center;padding-inline:.75rem;display:flex}.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid currentColor;margin-inline:-.75rem .75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid currentColor;margin-inline:.75rem -.75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.status{aspect-ratio:1;border-radius:var(--radius-selector);background-color:var(--color-base-content);width:.5rem;height:.5rem;display:inline-block}@supports (color:color-mix(in lab, red, red)){.status{background-color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.status{vertical-align:middle;color:#0000004d;background-position:50%;background-repeat:no-repeat}@supports (color:color-mix(in lab, red, red)){.status{color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.status{background-image:radial-gradient(circle at 35% 30%, oklch(1 0 0 / calc(var(--depth) * .5)), #0000);box-shadow:0 2px 3px -1px}@supports (color:color-mix(in lab, red, red)){.status{box-shadow:0 2px 3px -1px color-mix(in oklab, currentColor calc(var(--depth) * 100%), #0000)}}.badge{border-radius:var(--radius-selector);vertical-align:middle;color:var(--badge-fg);border:var(--border) solid var(--badge-color,var(--color-base-200));background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);background-color:var(--badge-bg);--badge-bg:var(--badge-color,var(--color-base-100));--badge-fg:var(--color-base-content);--size:calc(var(--size-selector,.25rem) * 6);width:fit-content;height:var(--size);padding-inline:calc(var(--size) / 2 - var(--border));justify-content:center;align-items:center;gap:.5rem;font-size:.875rem;display:inline-flex}.alert{--alert-border-color:var(--color-base-200);border-radius:var(--radius-box);color:var(--color-base-content);background-color:var(--alert-color,var(--color-base-200));text-align:start;background-size:auto, calc(var(--noise) * 33%);background-image:none, var(--fx-noise);box-shadow:0 3px 0 -2px oklch(100% 0 0 / calc(var(--depth) * .08)) inset, 0 1px #000, 0 4px 3px -2px oklch(0% 0 0 / calc(var(--depth) * .08));border-style:solid;grid-template-columns:auto;grid-auto-flow:column;justify-content:start;place-items:center start;gap:1rem;padding-block:.75rem;padding-inline:1rem;font-size:.875rem;line-height:1.25rem;display:grid}@supports (color:color-mix(in lab, red, red)){.alert{box-shadow:0 3px 0 -2px oklch(100% 0 0 / calc(var(--depth) * .08)) inset, 0 1px color-mix(in oklab, color-mix(in oklab, #000 20%, var(--alert-color,var(--color-base-200))) calc(var(--depth) * 20%), #0000), 0 4px 3px -2px oklch(0% 0 0 / calc(var(--depth) * .08))}}.alert:has(:nth-child(2)){grid-template-columns:auto minmax(auto,1fr)}.skeleton{border-radius:var(--radius-box);background-color:var(--color-base-300)}@media (prefers-reduced-motion:reduce){.skeleton{transition-duration:15s}}.skeleton{will-change:background-position;background-image:linear-gradient(105deg, #0000 0% 40%, var(--color-base-100) 50%, #0000 60% 100%);background-position-x:-50%;background-size:200%}@media (prefers-reduced-motion:no-preference){.skeleton{animation:1.8s ease-in-out infinite skeleton}}.link{cursor:pointer;text-decoration-line:underline}.link:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.link:focus{outline-offset:2px;outline:2px solid #0000}}.link:focus-visible{outline-offset:2px;outline:2px solid}.btn-outline{--btn-bg:#0000;color:var(--btn-rest-fg,var(--btn-color,var(--color-base-content)));--btn-border:var(--btn-color,var(--color-base-content));--btn-border-style:solid;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0);background-image:none}.btn-soft{--btn-bg:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.btn-soft{--btn-bg:color-mix(in oklab, var(--btn-color,var(--color-base-content)) 8%, var(--btn-soft-bg,var(--color-base-100)))}}.btn-soft{color:var(--btn-rest-fg,var(--btn-color,var(--color-base-content)));--btn-border:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.btn-soft{--btn-border:color-mix(in oklab, var(--btn-color,var(--color-base-content)) 10%, var(--btn-soft-bg,var(--color-base-100)))}}.btn-soft{--btn-border-style:solid;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0);background-image:none}.btn-ghost{--btn-bg:#0000;color:var(--btn-rest-fg,var(--btn-color,var(--color-base-content,currentColor)));--btn-border:#0000;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0);background-image:none}.menu-title{color:var(--color-base-content);padding-block:.5rem;padding-inline:.75rem}@supports (color:color-mix(in lab, red, red)){.menu-title{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.menu-title{font-size:.875rem;font-weight:600}}@layer daisyui.l1.l2{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}.modal:popover-open{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}.modal:popover-open .modal-box{opacity:1;translate:0;scale:1}:root:has(.modal:popover-open){--page-scroll-lock: }:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal) .modal-box{opacity:1;translate:0;scale:1}:root:has(:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal)){--page-scroll-lock: }@starting-style{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{opacity:0}.modal:popover-open{opacity:0}}.tooltip>.tooltip-content,.tooltip[data-tip]:before{transform:translateX(var(--tt-trans,-50%)) translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-off) 50%}.tooltip:after{transform:translateX(var(--tt-trans,-50%)) translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-tail) 50%}.collapse-arrow>.collapse-title:after{width:.5rem;height:.5rem;display:block;position:absolute;transform:translateY(-100%)rotate(45deg)}@media (prefers-reduced-motion:no-preference){.collapse-arrow>.collapse-title:after{transition-property:all;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}}.collapse-arrow>.collapse-title:after{content:\"\";transform-origin:75% 75%;pointer-events:none;top:50%;inset-inline-end:1.4rem;box-shadow:2px 2px}@media (prefers-reduced-motion:no-preference){.collapse[open].collapse-arrow>.collapse-title:after,.collapse.collapse-open.collapse-arrow>.collapse-title:after{transform:translateY(-50%)rotate(225deg)}}.collapse.collapse-open.collapse-plus>.collapse-title:after{--tw-content:\"\u2212\";content:var(--tw-content)}:is(.collapse[tabindex].collapse-arrow:focus:not(.collapse-close),.collapse.collapse-arrow[tabindex]:focus-within:not(.collapse-close))>.collapse-title:after,.collapse.collapse-arrow:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{transform:translateY(-50%)rotate(225deg)}.collapse[open].collapse-plus>.collapse-title:after,.collapse[tabindex].collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse.collapse-plus:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{--tw-content:\"\u2212\";content:var(--tw-content)}.list .list-row:has(.list-col-grow:first-child){--list-grid-cols:1fr}.list .list-row:has(.list-col-grow:nth-child(2)){--list-grid-cols:minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(3)){--list-grid-cols:minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(4)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(5)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(6)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row>*{grid-row-start:1}.input{--in-size-mul:10;--font-size-min:.875rem;--spin-my:-3}.floating-label:has(.input){--top-mul:5;--font-size:.875rem}.steps .step-neutral+.step-neutral:before,.steps .step-neutral:after,.steps .step-neutral>.step-icon{--step-bg:var(--color-neutral);--step-fg:var(--color-neutral-content)}.steps .step-primary+.step-primary:before,.steps .step-primary:after,.steps .step-primary>.step-icon{--step-bg:var(--color-primary);--step-fg:var(--color-primary-content)}.steps .step-secondary+.step-secondary:before,.steps .step-secondary:after,.steps .step-secondary>.step-icon{--step-bg:var(--color-secondary);--step-fg:var(--color-secondary-content)}.steps .step-accent+.step-accent:before,.steps .step-accent:after,.steps .step-accent>.step-icon{--step-bg:var(--color-accent);--step-fg:var(--color-accent-content)}.steps .step-info+.step-info:before,.steps .step-info:after,.steps .step-info>.step-icon{--step-bg:var(--color-info);--step-fg:var(--color-info-content)}.steps .step-success+.step-success:before,.steps .step-success:after,.steps .step-success>.step-icon{--step-bg:var(--color-success);--step-fg:var(--color-success-content)}.steps .step-warning+.step-warning:before,.steps .step-warning:after,.steps .step-warning>.step-icon{--step-bg:var(--color-warning);--step-fg:var(--color-warning-content)}.steps .step-error+.step-error:before,.steps .step-error:after,.steps .step-error>.step-icon{--step-bg:var(--color-error);--step-fg:var(--color-error-content)}.select{--sl-size-mul:10;--font-size-min:.875rem;--option-px:3}.floating-label:has(.select){--top-mul:5;--font-size:.875rem}.swap{cursor:pointer;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;place-content:center;display:inline-grid;position:relative}.swap input{appearance:none;border:none}.swap>*{grid-row-start:1;grid-column-start:1}@media (prefers-reduced-motion:no-preference){.swap>*{transition-property:transform,rotate,opacity;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.swap .swap-on,.swap .swap-indeterminate,.swap input:indeterminate~.swap-on,.swap input:is(:checked,:indeterminate)~.swap-off{opacity:0}.swap input:checked~.swap-on,.swap input:indeterminate~.swap-indeterminate{opacity:1;backface-visibility:visible}.radio:disabled{cursor:not-allowed;opacity:.2}.rating{--size:var(--size-selector,.25rem) * 6}.textarea{--font-size-min:.875rem}.floating-label:has(.textarea){--top-mul:5;--font-size:.875rem}:is(.stack,.stack.stack-bottom)>*{grid-area:3/3/6/4}:is(.stack,.stack.stack-bottom)>:nth-child(2){grid-area:2/2/5/5}:is(.stack,.stack.stack-bottom)>:first-child{grid-area:1/1/4/6}.stack.stack-top>*{grid-area:1/3/4/4}.stack.stack-top>:nth-child(2){grid-area:2/2/5/5}.stack.stack-top>:first-child{grid-area:3/1/6/6}.stack.stack-start>*{grid-area:3/1/4/4}.stack.stack-start>:nth-child(2){grid-area:2/2/5/5}.stack.stack-start>:first-child{grid-area:1/3/6/6}.stack.stack-end>*{grid-area:3/3/4/6}.stack.stack-end>:nth-child(2){grid-area:2/2/5/5}.stack.stack-end>:first-child{grid-area:1/1/6/4}.btn-square{width:var(--size);height:var(--size);padding-inline:0}.btn-block{width:100%}.loading-md{width:calc(var(--size-selector,.25rem) * 6)}.aura-glow{background-image:radial-gradient(closest-corner,currentColor 0%,#0000 90%);animation:none}.aura-glow:before{animation:aura-glow var(--tw-duration,6s) ease-out infinite}.aura-glow:after{animation:aura-glow-after var(--tw-duration,6s) ease-out infinite}.menu-sm :where(li:not(.menu-title)>:not(ul,menu,details,.menu-title)),.menu-sm :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);padding-block:.25rem;padding-inline:.625rem;font-size:.75rem}.menu-sm .menu-title{padding-block:.5rem;padding-inline:.75rem}.badge-ghost{border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content);background-image:none}.loading-spinner{-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='8s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='8s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\")}@media (prefers-reduced-motion:no-preference){.loading-spinner{-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\")}}.badge-sm{--size:calc(var(--size-selector,.25rem) * 5);font-size:.75rem}.badge-xs{--size:calc(var(--size-selector,.25rem) * 4);font-size:.625rem}.alert-error{color:var(--color-error-content);--alert-border-color:var(--color-error);--alert-color:var(--color-error)}.alert-warning{color:var(--color-warning-content);--alert-border-color:var(--color-warning);--alert-color:var(--color-warning)}.input-sm{--in-size-mul:8;--font-size-min:.75rem;--spin-my:-2}.floating-label:has(.input-sm){--top-mul:4;--font-size:.75rem}.select-sm{--sl-size-mul:8;--font-size-min:.75rem;--option-px:2.5}.floating-label:has(.select-sm){--top-mul:4;--font-size:.75rem}.btn-primary{--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content);--btn-soft-bg:initial}.btn-sm{--fontsize:.75rem;--btn-p:.75rem;--size:calc(var(--size-field,.25rem) * 8)}.badge-neutral{--badge-color:var(--color-neutral);--badge-fg:var(--color-neutral-content)}.badge-success{--badge-color:var(--color-success);--badge-fg:var(--color-success-content)}.card-border{border:var(--border) solid var(--color-base-200)}.input-error,.input-error:focus,.input-error:focus-within{--input-color:var(--color-error)}}@layer daisyui.l1{.btn:where(:checked:not(.filter [type=radio].btn)){--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content)}@media (hover:hover){.btn:hover{--btn-bg:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-bg:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%)}}.btn:hover{color:var(--btn-fg);--btn-border:var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-border:color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%))}}.btn:hover{--btn-border-style:solid;--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}}.btn:active:not(.btn-active){--btn-bg:var(--btn-color,var(--color-base-200));translate:0 .5px}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-bg:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 5%)}}.btn:active:not(.btn-active){color:var(--btn-fg,var(--color-base-content));--btn-border:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-border:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%)}}.btn:active:not(.btn-active){--btn-border-style:solid;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0)}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-bg:var(--btn-color,var(--color-base-200));color:var(--btn-fg,var(--color-base-content));--btn-border:var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-border:color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%))}}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-border-style:solid;--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){isolation:isolate}.btn:focus-visible,.btn:has(:focus-visible){isolation:isolate;outline-width:2px;outline-style:solid}.filter:not(:has(:checked:not(.filter-reset))) :is(.filter-reset,[type=reset]):not(:focus-visible){visibility:hidden}.filter:not(:has(:checked:not(.filter-reset))) :is(.filter-reset,[type=reset]):not(:focus-visible),.filter:not(:has(:focus-visible)):has(:checked:not(.filter-reset,[type=checkbox])) :is(input,button):not(:checked,.filter-reset,[type=reset]){opacity:0;border-width:0;width:0;margin-inline:0;padding-inline:0;scale:0}.alert-soft{color:var(--alert-color,var(--color-base-content));background:var(--alert-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.alert-soft{background:color-mix(in oklab, var(--alert-color,var(--color-base-content)) 8%, var(--color-base-100))}}.alert-soft{--alert-border-color:var(--alert-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.alert-soft{--alert-border-color:color-mix(in oklab, var(--alert-color,var(--color-base-content)) 10%, var(--color-base-100))}}.alert-soft{box-shadow:none;background-image:none}}@layer daisyui{.btn:is(:disabled,[disabled],[aria-disabled=true]){pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:is(:disabled,[disabled],[aria-disabled=true]){color:color-mix(in oklch, var(--color-base-content) 20%, #0000)}}.btn:is(:disabled,[disabled],[aria-disabled=true]){--btn-bg:#0000;--btn-border:#0000;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0);background-image:none}.btn:is(:disabled,[disabled],[aria-disabled=true]):not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:is(:disabled,[disabled],[aria-disabled=true]):not(.btn-link,.btn-ghost){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}}.pointer-events-none{pointer-events:none}.countdown.countdown{line-height:1em}.collapse:not(td,tr,colgroup){visibility:revert-layer}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@layer daisyui.l1.l2.l3.l4{.card figure:first-child{border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-end-radius:unset;border-end-start-radius:unset;overflow:hidden}.card figure:last-child{border-start-start-radius:unset;border-start-end-radius:unset;border-end-end-radius:inherit;border-end-start-radius:inherit;overflow:hidden}.card figure{justify-content:center;align-items:center;display:flex}}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.z-10{z-index:10}.col-span-2{grid-column:span 2/span 2}.m-0{margin:0}.mt-0{margin-top:0}.mt-0\\.5{margin-top:calc(var(--spacing) * .5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.alert{border-width:var(--border);border-color:var(--alert-border-color,var(--color-base-200))}:root .prose{--tw-prose-body:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-body:color-mix(in oklab, var(--color-base-content) 80%, #0000)}}:root .prose{--tw-prose-headings:var(--color-base-content);--tw-prose-lead:var(--color-base-content);--tw-prose-links:var(--color-base-content);--tw-prose-bold:var(--color-base-content);--tw-prose-counters:var(--color-base-content);--tw-prose-bullets:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-bullets:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-hr:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-hr:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-quotes:var(--color-base-content);--tw-prose-quote-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-quote-borders:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-captions:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-captions:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-code:var(--color-base-content);--tw-prose-pre-code:var(--color-neutral-content);--tw-prose-pre-bg:var(--color-neutral);--tw-prose-th-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-th-borders:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-td-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-td-borders:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-kbd:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-kbd:color-mix(in oklab, var(--color-base-content) 80%, #0000)}}:root .prose :where(code):not(pre>code){background-color:var(--color-base-200);border-radius:var(--radius-selector);border:var(--border) solid var(--color-base-300);font-weight:inherit;padding-block:.2em;padding-inline:.5em}:root .prose :where(code):not(pre>code):before,:root .prose :where(code):not(pre>code):after{display:none}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-\\[52px\\]{width:52px;height:52px}.h-11{height:calc(var(--spacing) * 11)}.h-auto{height:auto}.max-h-\\[min\\(66vh\\,720px\\)\\]{max-height:min(66vh,720px)}.min-h-0{min-height:0}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-\\[120px\\]{min-height:120px}.w-\\[min\\(148px\\,38vw\\)\\]{width:min(148px,38vw)}.w-\\[min\\(200px\\,100\\%\\)\\]{width:min(200px,100%)}.w-auto{width:auto}.w-full{width:100%}.max-w-\\[min\\(148px\\,38vw\\)\\]{max-width:min(148px,38vw)}.max-w-\\[min\\(440px\\,100\\%\\)\\]{max-width:min(440px,100%)}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-\\[min\\(240px\\,100\\%\\)\\]{min-width:min(240px,100%)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\\[1fr_auto\\]{grid-template-columns:1fr auto}.grid-cols-\\[auto_minmax\\(0\\,1fr\\)\\]{grid-template-columns:auto minmax(0,1fr)}.grid-cols-\\[minmax\\(0\\,1fr\\)_auto\\]{grid-template-columns:minmax(0,1fr) auto}.grid-rows-\\[0fr\\]{grid-template-rows:0fr}.grid-rows-\\[1fr\\]{grid-template-rows:1fr}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.justify-items-start{justify-items:start}.gap-0{gap:0}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\\.5{row-gap:calc(var(--spacing) * 1.5)}.justify-self-center{justify-self:center}.justify-self-end{justify-self:flex-end}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-box{border-radius:var(--radius-box);border-radius:var(--radius-box)}.rounded-field{border-radius:var(--radius-field);border-radius:var(--radius-field)}.rounded-full{border-radius:3.40282e38px}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-base-300{border-color:var(--color-base-300)}.border-base-content,.border-base-content\\/15{border-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.border-base-content\\/15{border-color:color-mix(in oklab, var(--color-base-content) 15%, transparent)}}.border-base-content\\/20{border-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.border-base-content\\/20{border-color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.border-base-content\\/25{border-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.border-base-content\\/25{border-color:color-mix(in oklab, var(--color-base-content) 25%, transparent)}}.border-base-content\\/30{border-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.border-base-content\\/30{border-color:color-mix(in oklab, var(--color-base-content) 30%, transparent)}}.border-info,.border-info\\/40{border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.border-info\\/40{border-color:color-mix(in oklab, var(--color-info) 40%, transparent)}}.border-primary{border-color:var(--color-primary)}.border-secondary{border-color:var(--color-secondary)}.border-success,.border-success\\/40{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.border-success\\/40{border-color:color-mix(in oklab, var(--color-success) 40%, transparent)}}.border-warning{border-color:var(--color-warning)}.bg-base-100{background-color:var(--color-base-100)}.bg-base-200{background-color:var(--color-base-200)}.bg-info,.bg-info\\/10{background-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.bg-info\\/10{background-color:color-mix(in oklab, var(--color-info) 10%, transparent)}}.bg-primary,.bg-primary\\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/10{background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.bg-secondary,.bg-secondary\\/10{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.bg-secondary\\/10{background-color:color-mix(in oklab, var(--color-secondary) 10%, transparent)}}.bg-success,.bg-success\\/10{background-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.bg-success\\/10{background-color:color-mix(in oklab, var(--color-success) 10%, transparent)}}.bg-warning,.bg-warning\\/10{background-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.bg-warning\\/10{background-color:color-mix(in oklab, var(--color-warning) 10%, transparent)}}.stroke-current{stroke:currentColor}.object-contain{object-fit:contain}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:var(--spacing)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1{padding-block:var(--spacing)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-4{padding-block:calc(var(--spacing) * 4)}.pl-3{padding-left:calc(var(--spacing) * 3)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[0\\.65rem\\]{font-size:.65rem}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-base-content,.text-base-content\\/55{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\\/55{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.text-base-content\\/60{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\\/60{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.text-base-content\\/65{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\\/65{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.text-base-content\\/70{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\\/70{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.text-error{color:var(--color-error)}.text-info-content{color:var(--color-info-content)}.text-success{color:var(--color-success)}.text-success-content{color:var(--color-success-content)}.text-warning{color:var(--color-warning)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.prose :where(a.btn:not(.btn-link)):not(:where([class~=not-prose],[class~=not-prose] *)){text-decoration-line:none}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-info,.ring-info\\/50{--tw-ring-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.ring-info\\/50{--tw-ring-color:color-mix(in oklab, var(--color-info) 50%, transparent)}}.ring-primary,.ring-primary\\/30{--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.ring-primary\\/30{--tw-ring-color:color-mix(in oklab, var(--color-primary) 30%, transparent)}}.ring-primary\\/50{--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.ring-primary\\/50{--tw-ring-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.ring-secondary,.ring-secondary\\/50{--tw-ring-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.ring-secondary\\/50{--tw-ring-color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.ring-success,.ring-success\\/50{--tw-ring-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.ring-success\\/50{--tw-ring-color:color-mix(in oklab, var(--color-success) 50%, transparent)}}.ring-warning,.ring-warning\\/50{--tw-ring-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.ring-warning\\/50{--tw-ring-color:color-mix(in oklab, var(--color-warning) 50%, transparent)}}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[grid-template-rows\\,opacity\\,margin\\]{transition-property:grid-template-rows,opacity,margin;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.outline-none\\!{--tw-outline-style:none!important;outline-style:none!important}.select-all{-webkit-user-select:all;user-select:all}@media (hover:hover){.hover\\:border-base-content\\/45:hover{border-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.hover\\:border-base-content\\/45:hover{border-color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.hover\\:border-primary:hover{border-color:var(--color-primary)}.hover\\:bg-base-100:hover{background-color:var(--color-base-100)}}.focus\\:outline-offset-0\\!:focus{outline-offset:0px!important}.focus\\:outline-none\\!:focus{--tw-outline-style:none!important;outline-style:none!important}.focus-visible\\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\\:outline-primary:focus-visible{outline-color:var(--color-primary)}@media (prefers-reduced-motion:reduce){.motion-reduce\\:transition-none{transition-property:none}}@media (min-width:390px){.min-\\[390px\\]\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:40rem){.sm\\:col-span-2{grid-column:span 2/span 2}.sm\\:block{display:block}.sm\\:hidden{display:none}.sm\\:size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.sm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\\:gap-3{gap:calc(var(--spacing) * 3)}.sm\\:p-5{padding:calc(var(--spacing) * 5)}.sm\\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\\:col-span-1{grid-column:span 1/span 1}.md\\:w-\\[min\\(180px\\,100\\%\\)\\]{width:min(180px,100%)}.md\\:w-\\[min\\(200px\\,36vw\\)\\]{width:min(200px,36vw)}.md\\:w-auto{width:auto}.md\\:max-w-\\[min\\(200px\\,36vw\\)\\]{max-width:min(200px,36vw)}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\\:grid-cols-\\[auto_minmax\\(0\\,1fr\\)\\]{grid-template-columns:auto minmax(0,1fr)}.md\\:grid-cols-\\[minmax\\(0\\,1fr\\)_auto_auto\\]{grid-template-columns:minmax(0,1fr) auto auto}.md\\:items-start{align-items:flex-start}.md\\:gap-x-2{column-gap:calc(var(--spacing) * 2)}.md\\:gap-x-5{column-gap:calc(var(--spacing) * 5)}.md\\:gap-y-1{row-gap:var(--spacing)}.md\\:justify-self-end{justify-self:flex-end}.md\\:justify-self-start{justify-self:flex-start}.md\\:text-left{text-align:left}}@media (min-width:64rem){.lg\\:col-span-4{grid-column:span 4/span 4}.lg\\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\\:grid-cols-\\[9rem_minmax\\(0\\,1fr\\)_minmax\\(8rem\\,auto\\)\\]{grid-template-columns:9rem minmax(0,1fr) minmax(8rem,auto)}.lg\\:items-start{align-items:flex-start}}.\\[\\&_svg\\]\\:block svg{display:block}.\\[\\&_svg\\]\\:h-auto svg{height:auto}.\\[\\&_svg\\]\\:w-full svg{width:100%}}:host{display:block}:host([hidden]){display:none}@keyframes dropdown{0%{opacity:0}}@keyframes rotator{89.9999%,to{--first-item-position:0 0%}90%,99.9999%{--first-item-position:0 calc(var(--items) * 100%)}to{translate:0 -100%}}@keyframes radio{0%{padding:5px}50%{padding:3px}}@keyframes toast{0%{opacity:0;scale:.9}to{opacity:1;scale:1}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}@keyframes progress{50%{background-position-x:-115%}}@keyframes rating{0%,40%{filter:brightness(1.05)contrast(1.05);scale:1.1}}@keyframes aura{to{--aura-angle:360deg;transform:translateZ(1px)}}@keyframes aura-glow{20%,80%{opacity:.7;filter:blur(.25rem)}50%{opacity:1;filter:blur(.75rem)}}@keyframes aura-glow-after{20%,80%{opacity:.3;filter:blur(1rem)}50%{opacity:.6;filter:blur(1.5rem)}}@keyframes menu{0%{opacity:0}}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-tracking{syntax:\"*\";inherits:false}@property --tw-ordinal{syntax:\"*\";inherits:false}@property --tw-slashed-zero{syntax:\"*\";inherits:false}@property --tw-numeric-figure{syntax:\"*\";inherits:false}@property --tw-numeric-spacing{syntax:\"*\";inherits:false}@property --tw-numeric-fraction{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:\"*\";inherits:false}@property --tw-brightness{syntax:\"*\";inherits:false}@property --tw-contrast{syntax:\"*\";inherits:false}@property --tw-grayscale{syntax:\"*\";inherits:false}@property --tw-hue-rotate{syntax:\"*\";inherits:false}@property --tw-invert{syntax:\"*\";inherits:false}@property --tw-opacity{syntax:\"*\";inherits:false}@property --tw-saturate{syntax:\"*\";inherits:false}@property --tw-sepia{syntax:\"*\";inherits:false}@property --tw-drop-shadow{syntax:\"*\";inherits:false}@property --tw-drop-shadow-color{syntax:\"*\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\"*\";inherits:false}@property --tw-duration{syntax:\"*\";inherits:false}@property --tw-ease{syntax:\"*\";inherits:false}@property --tw-outline-style{syntax:\"*\";inherits:false;initial-value:solid}";
|
|
@@ -329,9 +341,17 @@ declare function swapDepositRisk(payInAsset: string): SwapDepositRisk;
|
|
|
329
341
|
* @param options.now Unix timestamp in **seconds** ({@link UnixSeconds}); the
|
|
330
342
|
* provider countdown is measured against it. Milliseconds (`Date.now()`)
|
|
331
343
|
* throw rather than pinning every deposit window at zero.
|
|
344
|
+
* @param options.resumable Whether this checkout has a URL the payer can come
|
|
345
|
+
* BACK to — a synced history path, or the host's own per-order route. It
|
|
346
|
+
* decides {@link SwapDisplayModel.refundReturnLabel} and nothing else; the
|
|
347
|
+
* refund form itself stays available either way, because a payer who is on
|
|
348
|
+
* the screen right now can still submit one. Defaults to `false`: a host that
|
|
349
|
+
* has not said it is resumable is the host whose payer must not be told to
|
|
350
|
+
* bookmark the page.
|
|
332
351
|
*/
|
|
333
352
|
declare function createSwapDisplayModel(invoice: CheckoutInvoiceSnapshot, options?: {
|
|
334
353
|
readonly now?: UnixSeconds;
|
|
354
|
+
readonly resumable?: boolean;
|
|
335
355
|
}): SwapDisplayModel | undefined;
|
|
336
356
|
/**
|
|
337
357
|
* The current swap attempt as a renderer should read it: the polled snapshot's
|
|
@@ -400,6 +420,14 @@ declare function createDetailExternalLink(options: {
|
|
|
400
420
|
/**
|
|
401
421
|
* Build display rows for settled checkout / swap state from public OpenReceive
|
|
402
422
|
* fields only. Omits undefined values; never surfaces NWC or send-payment secrets.
|
|
423
|
+
*
|
|
424
|
+
* A `checkout_lock` rail returns NO rows. That rail is the deferred placeholder
|
|
425
|
+
* a prepared checkout carries before the payer has chosen anything, so there is
|
|
426
|
+
* no transaction to describe yet — and a host following "transaction details on
|
|
427
|
+
* the live checkout AND on the receipt" would otherwise open a caret over a
|
|
428
|
+
* record of nothing. An empty array is already every caller's "render nothing"
|
|
429
|
+
* signal, so the rule enforces itself and no host has to learn the rail
|
|
430
|
+
* vocabulary to obey it.
|
|
403
431
|
*/
|
|
404
432
|
declare function createTransactionDetails(input: TransactionDetailsInput): TransactionDetailRow[];
|
|
405
433
|
declare function createTransactionDetailsFromState(state: Pick<CheckoutState, "reference" | "checkout_id" | "invoice_id" | "invoice" | "rail" | "payment_hash" | "amount_msats" | "fiat_quote" | "transaction_state" | "workflow_state" | "expires_at" | "settled_at" | "swap">): TransactionDetailRow[];
|
|
@@ -537,6 +565,18 @@ interface CheckoutComponentProps {
|
|
|
537
565
|
* does not push/replace the URL itself.
|
|
538
566
|
*/
|
|
539
567
|
readonly routeReference?: string;
|
|
568
|
+
/**
|
|
569
|
+
* Does a payer who closes this tab have a URL that brings them back to this
|
|
570
|
+
* checkout? It decides ONE thing: which of the two refund-return warnings the
|
|
571
|
+
* swap deposit panel shows (`SwapDisplayModel.refundReturnLabel`). Telling a
|
|
572
|
+
* payer to bookmark a page that will not bring them back is how a swap
|
|
573
|
+
* deposit becomes unreachable, so the safe copy is the default.
|
|
574
|
+
*
|
|
575
|
+
* Unset, it is inferred from `syncUrl` / `routeReference` — both of which put
|
|
576
|
+
* the order in the URL. Set it explicitly when the host owns a per-order
|
|
577
|
+
* route the component cannot see, which is most snapshot-mode apps.
|
|
578
|
+
*/
|
|
579
|
+
readonly resumable?: boolean;
|
|
540
580
|
}
|
|
541
581
|
/** Which props only do something in create mode (no `checkout` snapshot). */
|
|
542
582
|
declare const CREATE_MODE_ONLY_PROPS: readonly ["metadata", "syncUrl", "resumePathPrefix", "routeReference"];
|
|
@@ -571,6 +611,37 @@ interface SwapSelection {
|
|
|
571
611
|
setDismissedInvoiceId(invoiceId: string | null): void;
|
|
572
612
|
setSelectedAsset(payInAsset: string | null): void;
|
|
573
613
|
}
|
|
614
|
+
/**
|
|
615
|
+
* Everything {@link CheckoutSession.startSwap} needs, as ONE option.
|
|
616
|
+
*
|
|
617
|
+
* These three used to be three optional fields beside each other
|
|
618
|
+
* (`swapSelection`, `swapPrefix`, `fetch`), which let a host supply two of them
|
|
619
|
+
* and get silence: `startSwap` returned at its first `undefined` without a
|
|
620
|
+
* throw, an `onError` or a state change, so the payer clicked Continue and the
|
|
621
|
+
* screen did not move. They are only ever useful as a set, so they are one
|
|
622
|
+
* field now and the mistake is no longer representable — a host either drives
|
|
623
|
+
* swaps or it does not.
|
|
624
|
+
*/
|
|
625
|
+
interface CheckoutSwapOptions {
|
|
626
|
+
/** The swap attempt the wizard is showing, over the host's own state. */
|
|
627
|
+
selection: SwapSelection;
|
|
628
|
+
/**
|
|
629
|
+
* The mount prefix swap routes are derived from. May still answer
|
|
630
|
+
* `undefined` — a standalone wizard has no prefix until its host has one —
|
|
631
|
+
* and a start attempted before then is reported through `onError` rather
|
|
632
|
+
* than swallowed.
|
|
633
|
+
*/
|
|
634
|
+
prefix(): string | undefined;
|
|
635
|
+
/** Read at call time so a host that swaps `globalThis.fetch` is honoured. */
|
|
636
|
+
fetch(): typeof globalThis.fetch | undefined;
|
|
637
|
+
/**
|
|
638
|
+
* Publish a freshly started swap attempt. The two hosts fold it into their
|
|
639
|
+
* snapshot differently (the element re-keys its poll controller onto the
|
|
640
|
+
* merged snapshot; React hands the attempt to whichever component owns the
|
|
641
|
+
* snapshot), so the merge stays on the host side of this callback.
|
|
642
|
+
*/
|
|
643
|
+
onStarted?(invoice: CheckoutInvoiceSnapshot): void;
|
|
644
|
+
}
|
|
574
645
|
interface CheckoutSessionOptions {
|
|
575
646
|
/**
|
|
576
647
|
* The snapshot the host is rendering right now, read at call time — the
|
|
@@ -589,20 +660,11 @@ interface CheckoutSessionOptions {
|
|
|
589
660
|
/** Publish a snapshot that now carries the Lightning attempt. */
|
|
590
661
|
onSnapshot?(snapshot: CheckoutSnapshot): void;
|
|
591
662
|
/**
|
|
592
|
-
*
|
|
593
|
-
*
|
|
594
|
-
|
|
595
|
-
swapPrefix?(): string | undefined;
|
|
596
|
-
/** Read at call time so a host that swaps `globalThis.fetch` is honoured. */
|
|
597
|
-
fetch?(): typeof globalThis.fetch | undefined;
|
|
598
|
-
swapSelection?: SwapSelection;
|
|
599
|
-
/**
|
|
600
|
-
* Publish a freshly started swap attempt. The two hosts fold it into their
|
|
601
|
-
* snapshot differently (the element re-keys its poll controller onto the
|
|
602
|
-
* merged snapshot; React hands the attempt to whichever component owns the
|
|
603
|
-
* snapshot), so the merge stays on the host side of this callback.
|
|
663
|
+
* Swap support, all of it or none of it. Omit for a Lightning-only host:
|
|
664
|
+
* {@link CheckoutSession.startSwap} then reports through `onError` instead
|
|
665
|
+
* of doing nothing.
|
|
604
666
|
*/
|
|
605
|
-
|
|
667
|
+
swap?: CheckoutSwapOptions;
|
|
606
668
|
logger?: BrowserLoggerOption;
|
|
607
669
|
/** The host's error surface: a DOM `openreceive:error` event, or `onError`. */
|
|
608
670
|
onError(error: unknown): void;
|
|
@@ -723,7 +785,22 @@ declare function createWizardRouteAssetDisplays(assets: readonly AssetIndexEntry
|
|
|
723
785
|
/** Host-side rewrite of the packaged icon path. See {@link AssetUrlResolver}. */
|
|
724
786
|
readonly resolveAssetUrl?: AssetUrlResolver;
|
|
725
787
|
}): readonly WizardRouteAssetDisplay[];
|
|
788
|
+
/**
|
|
789
|
+
* The wallet suggestions for each route, as displays.
|
|
790
|
+
*
|
|
791
|
+
* The registry answers ~37 providers for Lightning. Both shipped renderers draw
|
|
792
|
+
* all of them, in a grid on the route screen where that is fine; a host putting
|
|
793
|
+
* them under the invoice instead — beside a QR, in a fixed-height panel — wants
|
|
794
|
+
* `providerPreviewLimit` and a "show all" affordance built from
|
|
795
|
+
* {@link WizardRouteDisplay.providerCount}. `OPENRECEIVE_PROVIDER_PREVIEW_LIMIT`
|
|
796
|
+
* is the number the shipped styles are drawn against.
|
|
797
|
+
*
|
|
798
|
+
* No default limit, deliberately: the renderers show the whole grid, and a
|
|
799
|
+
* default that silently hid 33 wallets from them would be a worse bug than the
|
|
800
|
+
* one it prevents.
|
|
801
|
+
*/
|
|
726
802
|
declare function createWizardRouteDisplays(routes: readonly PaymentWizardRoute[], options?: {
|
|
803
|
+
/** Draw at most this many providers per route. Omitted, every one is drawn. */
|
|
727
804
|
readonly providerPreviewLimit?: number;
|
|
728
805
|
/** Host-side rewrite of the packaged icon and tutorial paths. See {@link AssetUrlResolver}. */
|
|
729
806
|
readonly resolveAssetUrl?: AssetUrlResolver;
|
|
@@ -806,8 +883,15 @@ type WizardSelection<T extends {
|
|
|
806
883
|
readonly heading: string;
|
|
807
884
|
readonly panelId: string;
|
|
808
885
|
readonly headingId: string;
|
|
809
|
-
/**
|
|
810
|
-
|
|
886
|
+
/**
|
|
887
|
+
* The per-group choice map after the pick, from
|
|
888
|
+
* {@link updateSelectedSwapAssetByGroup}: keyed by GROUP KEY
|
|
889
|
+
* (`group.label` upper-cased), valued by the chosen option's
|
|
890
|
+
* `pay_in_asset` — NOT its `network_label`. A deposit address is
|
|
891
|
+
* network-specific, so the value has to be the thing that identifies the
|
|
892
|
+
* address, and `pay_in_asset` is what every other seam here keys on.
|
|
893
|
+
*/
|
|
894
|
+
readonly selectedAssetByGroup: Record<string, string>;
|
|
811
895
|
} | {
|
|
812
896
|
readonly kind: "none";
|
|
813
897
|
};
|
|
@@ -827,7 +911,8 @@ declare function resolveWizardSelection<T extends {
|
|
|
827
911
|
readonly pickerKey: string;
|
|
828
912
|
readonly previousKey?: string | null;
|
|
829
913
|
readonly entries: readonly MethodGridEntry<T>[];
|
|
830
|
-
|
|
914
|
+
/** Keyed by group key, valued by the chosen option's `pay_in_asset`. */
|
|
915
|
+
readonly selectedAssetByGroup?: Readonly<Record<string, string>>;
|
|
831
916
|
}): WizardSelection<T>;
|
|
832
917
|
/** Invoice-side amount context for fiat swap-limit notes. */
|
|
833
918
|
interface SwapLimitContext {
|
|
@@ -905,7 +990,7 @@ interface MethodGridGroupDisplay<T extends {
|
|
|
905
990
|
readonly label: string;
|
|
906
991
|
}> {
|
|
907
992
|
readonly label: string;
|
|
908
|
-
/** The group's normalized key — how
|
|
993
|
+
/** The group's normalized key — how `selectedAssetByGroup` is keyed. */
|
|
909
994
|
readonly groupKey: string;
|
|
910
995
|
readonly pickerKey: string;
|
|
911
996
|
readonly accent: PaymentAccentId;
|
|
@@ -980,7 +1065,8 @@ declare function createMethodGridDisplay<T extends {
|
|
|
980
1065
|
}>(options: {
|
|
981
1066
|
readonly entries: readonly MethodGridEntry<T>[];
|
|
982
1067
|
readonly selectedPickerKey?: string | null;
|
|
983
|
-
|
|
1068
|
+
/** Keyed by group key, valued by the chosen option's `pay_in_asset`. */
|
|
1069
|
+
readonly selectedAssetByGroup?: Readonly<Record<string, string>>;
|
|
984
1070
|
/** The asset whose swap is being started, or null/undefined for none. */
|
|
985
1071
|
readonly startingAsset?: string | null;
|
|
986
1072
|
readonly checkout?: SwapLimitContext;
|
|
@@ -1002,4 +1088,4 @@ declare function createPaymentWizardModel(selection: PaymentWizardSelection): Pa
|
|
|
1002
1088
|
declare function updatePaymentWizardSelection(selection: PaymentWizardSelection, action: PaymentWizardSelectionAction): PaymentWizardSelection;
|
|
1003
1089
|
declare function createPaymentWizardController(options?: PaymentWizardControllerOptions): PaymentWizardController;
|
|
1004
1090
|
|
|
1005
|
-
export { BrowserLoggerOption, type CheckoutComponentProps, CheckoutElementAttributeOptions, CheckoutElementAttributes, CheckoutElementEventHandlers, CheckoutElementListeners, CheckoutInvoiceSnapshot, CheckoutPaymentMethod, type CheckoutPropsValidation, type CheckoutSession, type CheckoutSessionOptions, CheckoutShellElements, CheckoutShellModel, CheckoutShellOptions, CheckoutSnapshot, CheckoutState, CheckoutStatusModel, CreateCheckoutShellOptions, type DetailLinkKind, type MethodGridContinueDisplay, type MethodGridDisplay, type MethodGridDisplayEntry, type MethodGridEntry, type MethodGridGroupDisplay, PaymentMethod, PaymentWizardController, PaymentWizardModel, PaymentWizardSelection, ResolvedTheme, StoredThemeModelOptions, SwapDepositRisk, SwapDisplayModel, type SwapLimitContext, type SwapMethodGroup, type SwapSelection, type SwapUnavailableModel, ThemeModel, ThemeModelOptions, ThemePreference, ThemeToggleElementAttributeOptions, ThemeToggleElementAttributes, TransactionDetailRow, TransactionDetailsInput, type TransactionDetailsSource, TransientFeedbackController, UnixSeconds, WizardRouteAssetDisplay, WizardRouteDisplay, type WizardSelection, applyCheckoutElementAttributes, assetButtonClasses, buildMethodGridEntries, checkoutElementStyles, checkoutLabels, createBlockExplorerUrl, createCheckoutElementAttributes, createCheckoutElementListeners, createCheckoutSession, createCheckoutShell, createCheckoutShellModel, createCheckoutSnapshotFromInvoice, createCheckoutState, createCheckoutStatusModel, createDetailExternalLink, createLightningInvoiceDecodeUrl, createMethodGridDisplay, createPaymentWizardController, createPaymentWizardModel, createPaymentWizardSelection, createStoredThemeModel, createSwapDisplayModel, createSwapUnavailableModel, createThemeModel, createThemeToggleElement, createThemeToggleElementAttributes, createTickingValueController, createTransactionDetails, createTransactionDetailsFromState, createTransientFeedbackController, createWizardRouteAssetDisplays, createWizardRouteDisplays, formatNetworkSummary, getExplorerNetwork, getNetworkIcon, getPaymentMethodIcon, getRouteIconPath, getRouteNetworkLabel, getSwapOptionIcon, getSwapRefundFormError, getWizardEmptyMessage, isReusableLightningInvoice, mergeAttemptIntoCheckout, mergeAttemptIntoSnapshot, networkButtonClasses, networkCheckClasses, networkMobileRevealClasses, networkSummaryIconClasses, normalizeSwapStartInvoice, orClasses, parseBooleanAttribute, parseMethodPickerKey, parseOptionalInteger, parsePaymentMethod, parseResolvedTheme, parseThemePreference, paymentAccentId, paymentIconPaths, paymentIconUrls, paymentMethods, postJson, readThemePreference, requestSwapRefund, resolveTransactionDetailRows, resolveWizardSelection, selectCheckoutDisplayInvoice, selectCurrentSwapInvoice, startSwapRequest, swapAssetMatchesRoute, swapDepositRisk, swapOptionLimitMessage, swapOptionLimitSentence, swapPickerKey, syncStoredThemeControls, toggleStoredThemeControls, updatePaymentWizardSelection, validateCheckoutProps, writeThemePreference };
|
|
1091
|
+
export { BrowserLoggerOption, type CheckoutComponentProps, CheckoutElementAttributeOptions, CheckoutElementAttributes, CheckoutElementEventHandlers, CheckoutElementListeners, CheckoutInvoiceSnapshot, CheckoutPaymentMethod, type CheckoutPropsValidation, type CheckoutSession, type CheckoutSessionOptions, CheckoutShellElements, CheckoutShellModel, CheckoutShellOptions, CheckoutSnapshot, CheckoutState, CheckoutStatusModel, type CheckoutSwapOptions, CreateCheckoutShellOptions, type DetailLinkKind, type MethodGridContinueDisplay, type MethodGridDisplay, type MethodGridDisplayEntry, type MethodGridEntry, type MethodGridGroupDisplay, PaymentMethod, PaymentWizardController, PaymentWizardModel, PaymentWizardSelection, ResolvedTheme, StoredThemeModelOptions, SwapDepositRisk, SwapDisplayModel, type SwapLimitContext, type SwapMethodGroup, type SwapSelection, type SwapUnavailableModel, ThemeModel, ThemeModelOptions, ThemePreference, ThemeToggleElementAttributeOptions, ThemeToggleElementAttributes, TransactionDetailRow, TransactionDetailsInput, type TransactionDetailsSource, TransientFeedbackController, UnixSeconds, WizardRouteAssetDisplay, WizardRouteDisplay, type WizardSelection, applyCheckoutElementAttributes, assetButtonClasses, buildMethodGridEntries, checkoutElementStyles, checkoutLabels, createBlockExplorerUrl, createCheckoutElementAttributes, createCheckoutElementListeners, createCheckoutSession, createCheckoutShell, createCheckoutShellModel, createCheckoutSnapshotFromInvoice, createCheckoutState, createCheckoutStatusModel, createDetailExternalLink, createLightningInvoiceDecodeUrl, createMethodGridDisplay, createPaymentWizardController, createPaymentWizardModel, createPaymentWizardSelection, createStoredThemeModel, createSwapDisplayModel, createSwapUnavailableModel, createThemeModel, createThemeToggleElement, createThemeToggleElementAttributes, createTickingValueController, createTransactionDetails, createTransactionDetailsFromState, createTransientFeedbackController, createWizardRouteAssetDisplays, createWizardRouteDisplays, formatNetworkSummary, getExplorerNetwork, getNetworkIcon, getPaymentMethodIcon, getRouteIconPath, getRouteNetworkLabel, getSwapOptionIcon, getSwapRefundFormError, getWizardEmptyMessage, isReusableLightningInvoice, mergeAttemptIntoCheckout, mergeAttemptIntoSnapshot, networkButtonClasses, networkCheckClasses, networkMobileRevealClasses, networkSummaryIconClasses, normalizeSwapStartInvoice, orClasses, parseBooleanAttribute, parseMethodPickerKey, parseOptionalInteger, parsePaymentMethod, parseResolvedTheme, parseThemePreference, paymentAccentId, paymentIconPaths, paymentIconUrls, paymentMethods, postJson, readThemePreference, requestSwapRefund, resolveTransactionDetailRows, resolveWizardSelection, selectCheckoutDisplayInvoice, selectCurrentSwapInvoice, startSwapRequest, swapAssetMatchesRoute, swapDepositRisk, swapOptionLimitMessage, swapOptionLimitSentence, swapPickerKey, syncStoredThemeControls, toggleStoredThemeControls, updatePaymentWizardSelection, validateCheckoutProps, writeThemePreference };
|
package/dist/headless.js
CHANGED
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
OPENRECEIVE_DEFAULT_PREFIX,
|
|
14
14
|
OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES,
|
|
15
15
|
OPENRECEIVE_PAYMENT_WIZARD_SELECTORS,
|
|
16
|
+
OPENRECEIVE_PROVIDER_PREVIEW_LIMIT,
|
|
16
17
|
OPENRECEIVE_THEME_STORAGE_KEY,
|
|
17
18
|
OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES,
|
|
18
19
|
OPENRECEIVE_THEME_TOGGLE_ELEMENT_EVENTS,
|
|
@@ -42,6 +43,7 @@ import {
|
|
|
42
43
|
createPaymentWizardSelection,
|
|
43
44
|
createQrPayloadSvg,
|
|
44
45
|
createQrSvg,
|
|
46
|
+
createQrSvgController,
|
|
45
47
|
createStatusFetcher,
|
|
46
48
|
createSwapDisplayModel,
|
|
47
49
|
createSwapUnavailableModel,
|
|
@@ -109,7 +111,7 @@ import {
|
|
|
109
111
|
swapOptionLimitSentence,
|
|
110
112
|
swapPickerKey,
|
|
111
113
|
updatePaymentWizardSelection
|
|
112
|
-
} from "./chunk-
|
|
114
|
+
} from "./chunk-JR3DCSHN.js";
|
|
113
115
|
|
|
114
116
|
// src/internal/checkout-props.ts
|
|
115
117
|
var CREATE_MODE_ONLY_PROPS = [
|
|
@@ -141,6 +143,8 @@ function validateCheckoutProps(props) {
|
|
|
141
143
|
// src/internal/checkout-session.ts
|
|
142
144
|
import { recordOrEmpty } from "@openreceive/core";
|
|
143
145
|
var SWAP_START_FAILED = "Could not prepare the payment address. Please try again.";
|
|
146
|
+
var MISSING_SWAP_OPTIONS = "startSwap needs the session's `swap` options (selection, prefix, fetch) \u2014 this session was created without them, so it cannot start a swap. See docs/guides/headless-checkout.md.";
|
|
147
|
+
var MISSING_SWAP_WIRING = "startSwap cannot start a swap: the session was given no";
|
|
144
148
|
var MINT_FAILED = "Could not create the Lightning invoice. Please try again.";
|
|
145
149
|
function normalizeSwapQuote(body) {
|
|
146
150
|
const quote = recordOrEmpty(recordOrEmpty(body).quote ?? body);
|
|
@@ -190,11 +194,23 @@ function createCheckoutSession(options) {
|
|
|
190
194
|
}
|
|
191
195
|
async function startSwap(payInAsset) {
|
|
192
196
|
if (startingSwapAsset !== null) return;
|
|
193
|
-
const
|
|
194
|
-
|
|
195
|
-
|
|
197
|
+
const swap = options.swap;
|
|
198
|
+
if (swap === void 0) {
|
|
199
|
+
options.onError(new Error(MISSING_SWAP_OPTIONS));
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const selection = swap.selection;
|
|
203
|
+
const prefix = swap.prefix();
|
|
204
|
+
const fetcher = swap.fetch();
|
|
196
205
|
const reference = options.reference();
|
|
197
|
-
if (
|
|
206
|
+
if (prefix === void 0 || fetcher === void 0) {
|
|
207
|
+
const missing = [
|
|
208
|
+
...prefix === void 0 ? ["swap.prefix()"] : [],
|
|
209
|
+
...fetcher === void 0 ? ["swap.fetch()"] : []
|
|
210
|
+
];
|
|
211
|
+
options.onError(new Error(`${MISSING_SWAP_WIRING} ${missing.join(" and ")}.`));
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
198
214
|
if (reference === void 0 || reference.length === 0) return;
|
|
199
215
|
const alreadyStarted = selection.started();
|
|
200
216
|
if (alreadyStarted?.swap?.pay_in_asset === payInAsset && alreadyStarted.invoice_id !== selection.dismissedInvoiceId()) {
|
|
@@ -217,7 +233,7 @@ function createCheckoutSession(options) {
|
|
|
217
233
|
});
|
|
218
234
|
selection.setStarted(started);
|
|
219
235
|
selection.setDismissedInvoiceId(null);
|
|
220
|
-
|
|
236
|
+
swap.onStarted?.(started);
|
|
221
237
|
selection.setSelectedAsset(payInAsset);
|
|
222
238
|
options.onChange();
|
|
223
239
|
} catch (error) {
|
|
@@ -418,6 +434,9 @@ function sharedElementAttributes(options) {
|
|
|
418
434
|
if (isSet(options.assetBaseUrl)) {
|
|
419
435
|
attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.assetBaseUrl] = options.assetBaseUrl;
|
|
420
436
|
}
|
|
437
|
+
if (options.resumable !== void 0) {
|
|
438
|
+
attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.resumable] = String(options.resumable);
|
|
439
|
+
}
|
|
421
440
|
if (options.polling !== void 0) {
|
|
422
441
|
attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.polling] = String(options.polling);
|
|
423
442
|
}
|
|
@@ -579,6 +598,7 @@ function createCheckoutShell(snapshot, options = {}) {
|
|
|
579
598
|
|
|
580
599
|
// src/headless.ts
|
|
581
600
|
import { createAssetBaseUrlResolver } from "@openreceive/provider-data";
|
|
601
|
+
import { getPaymentWizardRoutes } from "@openreceive/provider-data";
|
|
582
602
|
export {
|
|
583
603
|
BrowserRequestError,
|
|
584
604
|
OPENRECEIVE_CHECKOUT_DATA_ATTRIBUTES,
|
|
@@ -594,6 +614,7 @@ export {
|
|
|
594
614
|
OPENRECEIVE_DEFAULT_PREFIX,
|
|
595
615
|
OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES,
|
|
596
616
|
OPENRECEIVE_PAYMENT_WIZARD_SELECTORS,
|
|
617
|
+
OPENRECEIVE_PROVIDER_PREVIEW_LIMIT,
|
|
597
618
|
OPENRECEIVE_THEME_STORAGE_KEY,
|
|
598
619
|
OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES,
|
|
599
620
|
OPENRECEIVE_THEME_TOGGLE_ELEMENT_EVENTS,
|
|
@@ -630,6 +651,7 @@ export {
|
|
|
630
651
|
createPaymentWizardSelection,
|
|
631
652
|
createQrPayloadSvg,
|
|
632
653
|
createQrSvg,
|
|
654
|
+
createQrSvgController,
|
|
633
655
|
createStatusFetcher,
|
|
634
656
|
createStoredThemeModel,
|
|
635
657
|
createSwapDisplayModel,
|
|
@@ -658,6 +680,7 @@ export {
|
|
|
658
680
|
getExplorerNetwork,
|
|
659
681
|
getNetworkIcon,
|
|
660
682
|
getPaymentMethodIcon,
|
|
683
|
+
getPaymentWizardRoutes,
|
|
661
684
|
getRouteIconPath,
|
|
662
685
|
getRouteNetworkLabel,
|
|
663
686
|
getSwapOptionIcon,
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
1
|
+
import { aQ as BrowserLogLevel } from './status-BZEGi6Ca.js';
|
|
2
|
+
export { aR as BrowserLogEntry, V as BrowserLogger, B as BrowserLoggerOption, X as BrowserRequestError, Y as CheckoutController, Z as CheckoutControllerOptions, g as CheckoutSnapshot, i as CheckoutState, aS as CopyInvoiceOptions, aT as GuestCheckoutResumeController, aU as GuestCheckoutResumeOptions, aV as OpenWalletOptions, aW as PrepareCheckoutOptions, aX as QrOptions, aY as RequestCheckoutOptions, an as Status, aZ as StatusInvoiceLike, U as UnixSeconds, as as copyInvoice, au as createCheckoutController, a_ as createGuestCheckoutResume, a$ as createGuestOrderFetcher, b0 as createLightningUri, b1 as createQrPngDataUrl, az as createQrSvg, aE as deriveStatus, aF as enterCheckoutResumePath, aN as openWallet, aO as prepareCheckout, aP as requestCheckout } from './status-BZEGi6Ca.js';
|
|
3
3
|
import '@openreceive/provider-data';
|
|
4
4
|
import '@openreceive/core';
|
|
5
5
|
|
package/dist/index.js
CHANGED
|
@@ -102,6 +102,7 @@ declare const OPENRECEIVE_DEFAULT_POLL_INTERVAL_MS: 3000;
|
|
|
102
102
|
*/
|
|
103
103
|
declare const OPENRECEIVE_DEFAULT_PREFIX: "/openreceive";
|
|
104
104
|
declare const OPENRECEIVE_COPY_FEEDBACK_MS: 1800;
|
|
105
|
+
declare const OPENRECEIVE_PROVIDER_PREVIEW_LIMIT: 4;
|
|
105
106
|
declare const OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME: "openreceive-checkout";
|
|
106
107
|
declare const OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME: "openreceive-theme-toggle";
|
|
107
108
|
declare const OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS: {
|
|
@@ -267,6 +268,14 @@ declare const OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES: {
|
|
|
267
268
|
* push/replace the URL via the History API.
|
|
268
269
|
*/
|
|
269
270
|
readonly routeReference: "route-reference";
|
|
271
|
+
/**
|
|
272
|
+
* Does a payer who closes this tab have a URL that brings them back to this
|
|
273
|
+
* checkout? Only the refund screen's copy depends on it — see
|
|
274
|
+
* `SwapDisplayModel.refundReturnLabel`. Unset, the element infers it from
|
|
275
|
+
* `sync-url` / `route-reference`; set it when the host owns a per-order route
|
|
276
|
+
* of its own, which the element cannot see.
|
|
277
|
+
*/
|
|
278
|
+
readonly resumable: "resumable";
|
|
270
279
|
/**
|
|
271
280
|
* Base URL of an external bolt11 decoder. When set, the checkout shows a
|
|
272
281
|
* "Decode" link to `{decode-link-url}?invoice={bolt11}`. Omitted (the
|
|
@@ -516,6 +525,18 @@ interface SwapDisplayModel {
|
|
|
516
525
|
* refund_address.
|
|
517
526
|
*/
|
|
518
527
|
readonly refundAllowed: boolean;
|
|
528
|
+
/**
|
|
529
|
+
* What to tell the payer about getting BACK to this refund screen, already
|
|
530
|
+
* decided from whether the host said the checkout is resumable.
|
|
531
|
+
*
|
|
532
|
+
* `checkoutLabels.refundReturnWarning` — "Bookmark this page…" — is only true
|
|
533
|
+
* if the checkout HAS a URL. A swap checkout that lives at one route with no
|
|
534
|
+
* per-order path (a single-page shop, a modal) sends that payer back to an
|
|
535
|
+
* empty checkout and their deposit is unreachable through the UI. So the
|
|
536
|
+
* choice is made here, from one declared fact, rather than left to every host
|
|
537
|
+
* to notice: render this string, never either label directly.
|
|
538
|
+
*/
|
|
539
|
+
readonly refundReturnLabel: string;
|
|
519
540
|
readonly refundTxId?: string;
|
|
520
541
|
readonly refundReason?: string;
|
|
521
542
|
readonly depositReceivedAmount?: string;
|
|
@@ -619,6 +640,11 @@ interface CheckoutElementAttributeOptions {
|
|
|
619
640
|
* Order id from the app router (e.g. Next.js). When set, skip History API URL sync.
|
|
620
641
|
*/
|
|
621
642
|
readonly routeReference?: string;
|
|
643
|
+
/**
|
|
644
|
+
* Does a payer who closes this tab have a URL that brings them back? Emitted
|
|
645
|
+
* in every mode, because the refund screen it governs shows in every mode.
|
|
646
|
+
*/
|
|
647
|
+
readonly resumable?: boolean;
|
|
622
648
|
/**
|
|
623
649
|
* Base URL of an external bolt11 decoder. Omitted (the default), the element
|
|
624
650
|
* renders no "Decode" link and the invoice is never sent to a third party.
|
|
@@ -1001,7 +1027,18 @@ interface WizardRouteDisplay {
|
|
|
1001
1027
|
readonly key: string;
|
|
1002
1028
|
readonly title: string;
|
|
1003
1029
|
readonly subtitle: string;
|
|
1030
|
+
/**
|
|
1031
|
+
* The providers to draw — every one the route has, or the first
|
|
1032
|
+
* `providerPreviewLimit` of them.
|
|
1033
|
+
*/
|
|
1004
1034
|
readonly providers: readonly WizardProviderDisplay[];
|
|
1035
|
+
/**
|
|
1036
|
+
* How many the route has in total, before any preview limit. The registry
|
|
1037
|
+
* carries ~37 wallets for Lightning, so a host that renders them beside a QR
|
|
1038
|
+
* needs a limit and a "show all N" affordance; this is the N, and
|
|
1039
|
+
* {@link WizardRouteDisplay.providers}.length is what it is showing.
|
|
1040
|
+
*/
|
|
1041
|
+
readonly providerCount: number;
|
|
1005
1042
|
}
|
|
1006
1043
|
/**
|
|
1007
1044
|
* One display row for post-settlement transaction details. Values are already
|
|
@@ -1083,6 +1120,42 @@ declare function copyInvoice(options: CopyInvoiceOptions): Promise<void>;
|
|
|
1083
1120
|
* that decision — see docs/guides/headless-checkout.md.
|
|
1084
1121
|
*/
|
|
1085
1122
|
declare function openWallet(options: OpenWalletOptions): string;
|
|
1123
|
+
/**
|
|
1124
|
+
* A QR that follows a changing payload, without every host rewriting the same
|
|
1125
|
+
* effect.
|
|
1126
|
+
*
|
|
1127
|
+
* {@link createQrSvg} and {@link createQrPayloadSvg} are ASYNC, and that is the
|
|
1128
|
+
* trap: `dangerouslySetInnerHTML={{ __html: createQrSvg(invoice) }}` type-checks
|
|
1129
|
+
* (React types `__html` as `string | TrustedHTML`, and `TrustedHTML` is an empty
|
|
1130
|
+
* interface every object satisfies) and paints the literal text
|
|
1131
|
+
* "[object Promise]" inside the QR box. Resolving it by hand then needs the
|
|
1132
|
+
* other half nobody writes the first time: a slow encode that lands AFTER the
|
|
1133
|
+
* payload changed must not paint the old QR over the new one.
|
|
1134
|
+
*
|
|
1135
|
+
* So: call `show`/`showPayload` whenever the payload changes and render what
|
|
1136
|
+
* `onValue` last handed you. Only the newest call can publish — an earlier
|
|
1137
|
+
* encode still in flight is dropped, resolved or rejected. `stop()` drops the
|
|
1138
|
+
* one in flight, for a host going away. Same shape as
|
|
1139
|
+
* {@link createTickingValueController}: DOM-free, framework-free, one
|
|
1140
|
+
* implementation instead of one per renderer.
|
|
1141
|
+
*/
|
|
1142
|
+
interface QrSvgControllerOptions {
|
|
1143
|
+
/** The newest encoded SVG. Not called for a superseded or stopped encode. */
|
|
1144
|
+
onValue(svg: string): void;
|
|
1145
|
+
/** Encode failures, on the same terms. */
|
|
1146
|
+
onError?(error: unknown): void;
|
|
1147
|
+
readonly encoder?: QrEncoder;
|
|
1148
|
+
readonly width?: number;
|
|
1149
|
+
}
|
|
1150
|
+
interface QrSvgController {
|
|
1151
|
+
/** Encode a bolt11, as the `lightning:` URI a wallet expects. */
|
|
1152
|
+
show(invoice: string): void;
|
|
1153
|
+
/** Encode a payload verbatim — a swap deposit URI, say. */
|
|
1154
|
+
showPayload(payload: string): void;
|
|
1155
|
+
/** Publish nothing further; the encode in flight is abandoned. */
|
|
1156
|
+
stop(): void;
|
|
1157
|
+
}
|
|
1158
|
+
declare function createQrSvgController(options: QrSvgControllerOptions): QrSvgController;
|
|
1086
1159
|
|
|
1087
1160
|
declare function createCheckoutController(options: CheckoutControllerOptions): CheckoutController;
|
|
1088
1161
|
|
|
@@ -1179,4 +1252,4 @@ declare function deriveStatus(invoice: StatusInvoiceLike, options?: {
|
|
|
1179
1252
|
readonly now?: UnixSeconds;
|
|
1180
1253
|
}): Status;
|
|
1181
1254
|
|
|
1182
|
-
export { type CheckoutStatusRefresh as $, type ThemeToggleElementAttributes as A, type BrowserLoggerOption as B, type CheckoutInvoiceSnapshot as C, type StoredThemeModelOptions as D, type ThemeModel as E, type ThemeModelOptions as F, type ReadThemePreferenceOptions as G, type ThemeControlTargets as H, type ThemeStorageOptions as I, type PaymentWizardControllerOptions as J, type PaymentWizardController as K, type PaymentWizardSelection as L, type PaymentWizardModel as M, type WizardRouteDisplay as N, type PaymentWizardSelectionAction as O, type ParseOpenReceiveOptionalIntegerOptions as P, type BrowserLogContext as Q, type ResolvedTheme as R, type SwapDisplayModel as S, type ThemePreference as T, type UnixSeconds as U, type BrowserLogger as V, type WizardRouteAssetDisplay as W, BrowserRequestError as X, type CheckoutController as Y, type CheckoutControllerOptions as Z, type CheckoutPhase as _, type PaymentMethod as a, OPENRECEIVE_CHECKOUT_DATA_ATTRIBUTES as a0, OPENRECEIVE_CHECKOUT_DATA_SELECTORS as a1, OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES as a2, OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS as a3, OPENRECEIVE_CHECKOUT_ELEMENT_PARTS as a4, OPENRECEIVE_CHECKOUT_ELEMENT_PART_SELECTORS as a5, OPENRECEIVE_CHECKOUT_ELEMENT_SLOTS as a6, OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME as a7, OPENRECEIVE_COPY_FEEDBACK_MS as a8, OPENRECEIVE_DEFAULT_POLL_INTERVAL_MS as a9,
|
|
1255
|
+
export { type CheckoutStatusRefresh as $, type ThemeToggleElementAttributes as A, type BrowserLoggerOption as B, type CheckoutInvoiceSnapshot as C, type StoredThemeModelOptions as D, type ThemeModel as E, type ThemeModelOptions as F, type ReadThemePreferenceOptions as G, type ThemeControlTargets as H, type ThemeStorageOptions as I, type PaymentWizardControllerOptions as J, type PaymentWizardController as K, type PaymentWizardSelection as L, type PaymentWizardModel as M, type WizardRouteDisplay as N, type PaymentWizardSelectionAction as O, type ParseOpenReceiveOptionalIntegerOptions as P, type BrowserLogContext as Q, type ResolvedTheme as R, type SwapDisplayModel as S, type ThemePreference as T, type UnixSeconds as U, type BrowserLogger as V, type WizardRouteAssetDisplay as W, BrowserRequestError as X, type CheckoutController as Y, type CheckoutControllerOptions as Z, type CheckoutPhase as _, type PaymentMethod as a, createGuestOrderFetcher as a$, OPENRECEIVE_CHECKOUT_DATA_ATTRIBUTES as a0, OPENRECEIVE_CHECKOUT_DATA_SELECTORS as a1, OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES as a2, OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS as a3, OPENRECEIVE_CHECKOUT_ELEMENT_PARTS as a4, OPENRECEIVE_CHECKOUT_ELEMENT_PART_SELECTORS as a5, OPENRECEIVE_CHECKOUT_ELEMENT_SLOTS as a6, OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME as a7, OPENRECEIVE_COPY_FEEDBACK_MS as a8, OPENRECEIVE_DEFAULT_POLL_INTERVAL_MS as a9, createQrSvgController as aA, createStatusFetcher as aB, createThemeChangeEvent as aC, deriveCheckoutStateLabels as aD, deriveStatus as aE, enterCheckoutResumePath as aF, escapeHtml as aG, formatAmountCaption as aH, formatDepositAmount as aI, formatFiatAmount as aJ, formatMsats as aK, formatSwapLimit as aL, formatUnixTime as aM, openWallet as aN, prepareCheckout as aO, requestCheckout as aP, type BrowserLogLevel as aQ, type BrowserLogEntry as aR, type CopyInvoiceOptions as aS, type GuestCheckoutResumeController as aT, type GuestCheckoutResumeOptions as aU, type OpenWalletOptions as aV, type PrepareCheckoutOptions as aW, type QrOptions as aX, type RequestCheckoutOptions as aY, type StatusInvoiceLike as aZ, createGuestCheckoutResume as a_, OPENRECEIVE_DEFAULT_PREFIX as aa, OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES as ab, OPENRECEIVE_PAYMENT_WIZARD_SELECTORS as ac, OPENRECEIVE_PROVIDER_PREVIEW_LIMIT as ad, OPENRECEIVE_THEME_STORAGE_KEY as ae, OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES as af, OPENRECEIVE_THEME_TOGGLE_ELEMENT_EVENTS as ag, OPENRECEIVE_THEME_TOGGLE_ELEMENT_PARTS as ah, OPENRECEIVE_THEME_TOGGLE_ELEMENT_PART_SELECTORS as ai, OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME as aj, type QrEncoder as ak, type QrSvgController as al, type QrSvgControllerOptions as am, type Status as an, type SwapCopyRow as ao, type SwapRefundStaging as ap, type WizardProviderDisplay as aq, assertDisplayInvoice as ar, copyInvoice as as, createCheckoutActionEvent as at, createCheckoutController as au, createCheckoutErrorEvent as av, createCheckoutProviderCopyEvent as aw, createCheckoutStateEvent as ax, createQrPayloadSvg as ay, createQrSvg as az, type PaymentMethodOption as b, createLightningUri as b0, createQrPngDataUrl as b1, type TickingValueOptions as c, type TickingValueController as d, type TransientFeedbackOptions as e, type TransientFeedbackController as f, type CheckoutSnapshot as g, type SwapDepositRisk as h, type CheckoutState as i, type TransactionDetailsInput as j, type TransactionDetailRow as k, type CreateCheckoutStateOptions as l, type CheckoutStatusModelInput as m, type CheckoutStatusModel as n, type CheckoutPaymentMethod as o, type ThemeAttributeTarget as p, type CheckoutElementAttributes as q, type CheckoutElementAttributeOptions as r, type CheckoutElementEventHandlers as s, type CheckoutElementListeners as t, type CreateCheckoutShellOptions as u, type CheckoutShellElements as v, type CheckoutShellOptions as w, type CheckoutShellModel as x, type CreateOpenReceiveThemeToggleElementOptions as y, type ThemeToggleElementAttributeOptions as z };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openreceive/browser",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Framework-free browser helpers for OpenReceive checkout: prepare/create calls, status polling, QR and wallet helpers.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bitcoin",
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"./assets/*": "./dist/assets/*"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@openreceive/core": "0.3.
|
|
35
|
-
"@openreceive/provider-data": "0.3.
|
|
34
|
+
"@openreceive/core": "0.3.1",
|
|
35
|
+
"@openreceive/provider-data": "0.3.1",
|
|
36
36
|
"qrcode": "^1.5.4"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|