@betterstore/react 0.3.3 → 0.3.5
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/CHANGELOG.md +12 -0
- package/dist/components/cart/useCart.d.ts +1 -2
- package/dist/components/checkout-embed/checkout-form.d.ts +2 -1
- package/dist/components/checkout-embed/checkout-schema.d.ts +18 -18
- package/dist/components/checkout-embed/steps/summary/discount-code.d.ts +5 -0
- package/dist/components/checkout-embed/steps/summary/index.d.ts +8 -4
- package/dist/components/ui/sonner.d.ts +4 -0
- package/dist/index.cjs.js +1541 -254
- package/dist/index.mjs +1541 -254
- package/dist/lib/betterstore.d.ts +1 -0
- package/package.json +4 -2
package/dist/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import React__default, { createContext, useContext, useCallback, useState, useRef, useEffect, useLayoutEffect, useId, useInsertionEffect, useMemo, Children, isValidElement, forwardRef, Fragment as Fragment$1, createElement, Component, memo as memo$1 } from 'react';
|
|
3
3
|
import { createStoreHelpers, createStoreClient } from '@betterstore/sdk';
|
|
4
|
+
import ReactDOM from 'react-dom';
|
|
4
5
|
import { Slot } from '@radix-ui/react-slot';
|
|
5
6
|
import * as LabelPrimitive from '@radix-ui/react-label';
|
|
6
7
|
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
7
|
-
import 'react-dom';
|
|
8
8
|
import * as PopoverPrimitive from '@radix-ui/react-popover';
|
|
9
9
|
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
10
10
|
|
|
@@ -63,7 +63,7 @@ function createJSONStorage(getStorage, options) {
|
|
|
63
63
|
if (str2 === null) {
|
|
64
64
|
return null;
|
|
65
65
|
}
|
|
66
|
-
return JSON.parse(str2,
|
|
66
|
+
return JSON.parse(str2, void 0 );
|
|
67
67
|
};
|
|
68
68
|
const str = (_a = storage.getItem(name)) != null ? _a : null;
|
|
69
69
|
if (str instanceof Promise) {
|
|
@@ -73,7 +73,7 @@ function createJSONStorage(getStorage, options) {
|
|
|
73
73
|
},
|
|
74
74
|
setItem: (name, newValue) => storage.setItem(
|
|
75
75
|
name,
|
|
76
|
-
JSON.stringify(newValue,
|
|
76
|
+
JSON.stringify(newValue, void 0 )
|
|
77
77
|
),
|
|
78
78
|
removeItem: (name) => storage.removeItem(name)
|
|
79
79
|
};
|
|
@@ -161,7 +161,7 @@ const persistImpl = (config, baseOptions) => (set, get, api) => {
|
|
|
161
161
|
var _a2;
|
|
162
162
|
return cb((_a2 = get()) != null ? _a2 : configResult);
|
|
163
163
|
});
|
|
164
|
-
const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ?
|
|
164
|
+
const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;
|
|
165
165
|
return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {
|
|
166
166
|
if (deserializedStorageValue) {
|
|
167
167
|
if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) {
|
|
@@ -182,7 +182,7 @@ const persistImpl = (config, baseOptions) => (set, get, api) => {
|
|
|
182
182
|
return [false, deserializedStorageValue.state];
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
|
-
return [false,
|
|
185
|
+
return [false, void 0];
|
|
186
186
|
}).then((migrationResult) => {
|
|
187
187
|
var _a2;
|
|
188
188
|
const [migrated, migratedState] = migrationResult;
|
|
@@ -195,12 +195,12 @@ const persistImpl = (config, baseOptions) => (set, get, api) => {
|
|
|
195
195
|
return setItem();
|
|
196
196
|
}
|
|
197
197
|
}).then(() => {
|
|
198
|
-
postRehydrationCallback == null ?
|
|
198
|
+
postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);
|
|
199
199
|
stateFromStorage = get();
|
|
200
200
|
hasHydrated = true;
|
|
201
201
|
finishHydrationListeners.forEach((cb) => cb(stateFromStorage));
|
|
202
202
|
}).catch((e) => {
|
|
203
|
-
postRehydrationCallback == null ?
|
|
203
|
+
postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);
|
|
204
204
|
});
|
|
205
205
|
};
|
|
206
206
|
api.persist = {
|
|
@@ -214,7 +214,7 @@ const persistImpl = (config, baseOptions) => (set, get, api) => {
|
|
|
214
214
|
}
|
|
215
215
|
},
|
|
216
216
|
clearStorage: () => {
|
|
217
|
-
storage == null ?
|
|
217
|
+
storage == null ? void 0 : storage.removeItem(options.name);
|
|
218
218
|
},
|
|
219
219
|
getOptions: () => options,
|
|
220
220
|
rehydrate: () => hydrate(),
|
|
@@ -2631,6 +2631,7 @@ const serializeCookie = function (name, val) {
|
|
|
2631
2631
|
throw new TypeError('option sameSite is invalid');
|
|
2632
2632
|
}
|
|
2633
2633
|
}
|
|
2634
|
+
if (opt.partitioned) str += '; Partitioned';
|
|
2634
2635
|
return str;
|
|
2635
2636
|
};
|
|
2636
2637
|
const cookie = {
|
|
@@ -3015,7 +3016,7 @@ const hasLoadedNamespace = (ns, i18n, options = {}) => {
|
|
|
3015
3016
|
});
|
|
3016
3017
|
};
|
|
3017
3018
|
const isString$1 = obj => typeof obj === 'string';
|
|
3018
|
-
const isObject$
|
|
3019
|
+
const isObject$2 = obj => typeof obj === 'object' && obj !== null;
|
|
3019
3020
|
|
|
3020
3021
|
const matchHtmlEntity = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g;
|
|
3021
3022
|
const htmlEntities = {
|
|
@@ -3113,7 +3114,7 @@ const useTranslation = (ns, props = {}) => {
|
|
|
3113
3114
|
warnOnce$1(i18n, 'NO_I18NEXT_INSTANCE', 'useTranslation: You will need to pass in an i18next instance by using initReactI18next');
|
|
3114
3115
|
const notReadyT = (k, optsOrDefaultValue) => {
|
|
3115
3116
|
if (isString$1(optsOrDefaultValue)) return optsOrDefaultValue;
|
|
3116
|
-
if (isObject$
|
|
3117
|
+
if (isObject$2(optsOrDefaultValue) && isString$1(optsOrDefaultValue.defaultValue)) return optsOrDefaultValue.defaultValue;
|
|
3117
3118
|
return Array.isArray(k) ? k[k.length - 1] : k;
|
|
3118
3119
|
};
|
|
3119
3120
|
const retNotReady = [notReadyT, {}, false];
|
|
@@ -3234,7 +3235,12 @@ const CheckoutEmbed$2 = {
|
|
|
3234
3235
|
subtotal: "Mezisoučet",
|
|
3235
3236
|
tax: "Daň",
|
|
3236
3237
|
title: "Shrnutí",
|
|
3237
|
-
total: "Celkem"
|
|
3238
|
+
total: "Celkem",
|
|
3239
|
+
discountCodeApply: "Aplikovat",
|
|
3240
|
+
discountCodePlaceholder: "Slevový kód nebo dárková karta",
|
|
3241
|
+
discountCodeError: "Už dostáváte nejlepší nabídku!",
|
|
3242
|
+
free: "Zdarma",
|
|
3243
|
+
discountCodeSuccess: "Slevový kód byl úspěšně použit."
|
|
3238
3244
|
},
|
|
3239
3245
|
loading: "Načítání ...",
|
|
3240
3246
|
Payment: {
|
|
@@ -3281,7 +3287,12 @@ const CheckoutEmbed$1 = {
|
|
|
3281
3287
|
subtotal: "Subtotal",
|
|
3282
3288
|
shipping: "Shipping",
|
|
3283
3289
|
calculatedAtNextStep: "Calculated at next step",
|
|
3284
|
-
tax: "Tax"
|
|
3290
|
+
tax: "Tax",
|
|
3291
|
+
discountCodePlaceholder: "Discount code or gift card",
|
|
3292
|
+
discountCodeApply: "Apply",
|
|
3293
|
+
discountCodeError: "You're already getting the best offer!",
|
|
3294
|
+
free: "Free",
|
|
3295
|
+
discountCodeSuccess: "Discount code applied successfully."
|
|
3285
3296
|
},
|
|
3286
3297
|
CustomerForm: {
|
|
3287
3298
|
address: {
|
|
@@ -3369,6 +3380,1135 @@ const createI18nInstance = (locale) => __awaiter(void 0, void 0, void 0, functio
|
|
|
3369
3380
|
return instance;
|
|
3370
3381
|
});
|
|
3371
3382
|
|
|
3383
|
+
var M$1=(e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n);}),R(n);}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n);}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y);}catch(n){}};var x=React.createContext(void 0),U$1={setTheme:e=>{},themes:[]},z$1=()=>{var e;return (e=React.useContext(x))!=null?e:U$1};React.memo(({forcedTheme:e,storageKey:i,attribute:s,enableSystem:u,enableColorScheme:m,defaultTheme:a,value:l,themes:h,nonce:d,scriptProps:w})=>{let p=JSON.stringify([s,i,a,e,h,l,u,m]).slice(1,-1);return React.createElement("script",{...w,suppressHydrationWarning:true,nonce:typeof window=="undefined"?d:"",dangerouslySetInnerHTML:{__html:`(${M$1.toString()})(${p})`}})});
|
|
3384
|
+
|
|
3385
|
+
function __insertCSS(code) {
|
|
3386
|
+
if (typeof document == 'undefined') return
|
|
3387
|
+
let head = document.head || document.getElementsByTagName('head')[0];
|
|
3388
|
+
let style = document.createElement('style');
|
|
3389
|
+
style.type = 'text/css';
|
|
3390
|
+
head.appendChild(style)
|
|
3391
|
+
;style.styleSheet ? (style.styleSheet.cssText = code) : style.appendChild(document.createTextNode(code));
|
|
3392
|
+
}
|
|
3393
|
+
|
|
3394
|
+
const getAsset = (type)=>{
|
|
3395
|
+
switch(type){
|
|
3396
|
+
case 'success':
|
|
3397
|
+
return SuccessIcon;
|
|
3398
|
+
case 'info':
|
|
3399
|
+
return InfoIcon;
|
|
3400
|
+
case 'warning':
|
|
3401
|
+
return WarningIcon;
|
|
3402
|
+
case 'error':
|
|
3403
|
+
return ErrorIcon;
|
|
3404
|
+
default:
|
|
3405
|
+
return null;
|
|
3406
|
+
}
|
|
3407
|
+
};
|
|
3408
|
+
const bars = Array(12).fill(0);
|
|
3409
|
+
const Loader$1 = ({ visible, className })=>{
|
|
3410
|
+
return /*#__PURE__*/ React__default.createElement("div", {
|
|
3411
|
+
className: [
|
|
3412
|
+
'sonner-loading-wrapper',
|
|
3413
|
+
className
|
|
3414
|
+
].filter(Boolean).join(' '),
|
|
3415
|
+
"data-visible": visible
|
|
3416
|
+
}, /*#__PURE__*/ React__default.createElement("div", {
|
|
3417
|
+
className: "sonner-spinner"
|
|
3418
|
+
}, bars.map((_, i)=>/*#__PURE__*/ React__default.createElement("div", {
|
|
3419
|
+
className: "sonner-loading-bar",
|
|
3420
|
+
key: `spinner-bar-${i}`
|
|
3421
|
+
}))));
|
|
3422
|
+
};
|
|
3423
|
+
const SuccessIcon = /*#__PURE__*/ React__default.createElement("svg", {
|
|
3424
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
3425
|
+
viewBox: "0 0 20 20",
|
|
3426
|
+
fill: "currentColor",
|
|
3427
|
+
height: "20",
|
|
3428
|
+
width: "20"
|
|
3429
|
+
}, /*#__PURE__*/ React__default.createElement("path", {
|
|
3430
|
+
fillRule: "evenodd",
|
|
3431
|
+
d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",
|
|
3432
|
+
clipRule: "evenodd"
|
|
3433
|
+
}));
|
|
3434
|
+
const WarningIcon = /*#__PURE__*/ React__default.createElement("svg", {
|
|
3435
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
3436
|
+
viewBox: "0 0 24 24",
|
|
3437
|
+
fill: "currentColor",
|
|
3438
|
+
height: "20",
|
|
3439
|
+
width: "20"
|
|
3440
|
+
}, /*#__PURE__*/ React__default.createElement("path", {
|
|
3441
|
+
fillRule: "evenodd",
|
|
3442
|
+
d: "M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",
|
|
3443
|
+
clipRule: "evenodd"
|
|
3444
|
+
}));
|
|
3445
|
+
const InfoIcon = /*#__PURE__*/ React__default.createElement("svg", {
|
|
3446
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
3447
|
+
viewBox: "0 0 20 20",
|
|
3448
|
+
fill: "currentColor",
|
|
3449
|
+
height: "20",
|
|
3450
|
+
width: "20"
|
|
3451
|
+
}, /*#__PURE__*/ React__default.createElement("path", {
|
|
3452
|
+
fillRule: "evenodd",
|
|
3453
|
+
d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",
|
|
3454
|
+
clipRule: "evenodd"
|
|
3455
|
+
}));
|
|
3456
|
+
const ErrorIcon = /*#__PURE__*/ React__default.createElement("svg", {
|
|
3457
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
3458
|
+
viewBox: "0 0 20 20",
|
|
3459
|
+
fill: "currentColor",
|
|
3460
|
+
height: "20",
|
|
3461
|
+
width: "20"
|
|
3462
|
+
}, /*#__PURE__*/ React__default.createElement("path", {
|
|
3463
|
+
fillRule: "evenodd",
|
|
3464
|
+
d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",
|
|
3465
|
+
clipRule: "evenodd"
|
|
3466
|
+
}));
|
|
3467
|
+
const CloseIcon = /*#__PURE__*/ React__default.createElement("svg", {
|
|
3468
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
3469
|
+
width: "12",
|
|
3470
|
+
height: "12",
|
|
3471
|
+
viewBox: "0 0 24 24",
|
|
3472
|
+
fill: "none",
|
|
3473
|
+
stroke: "currentColor",
|
|
3474
|
+
strokeWidth: "1.5",
|
|
3475
|
+
strokeLinecap: "round",
|
|
3476
|
+
strokeLinejoin: "round"
|
|
3477
|
+
}, /*#__PURE__*/ React__default.createElement("line", {
|
|
3478
|
+
x1: "18",
|
|
3479
|
+
y1: "6",
|
|
3480
|
+
x2: "6",
|
|
3481
|
+
y2: "18"
|
|
3482
|
+
}), /*#__PURE__*/ React__default.createElement("line", {
|
|
3483
|
+
x1: "6",
|
|
3484
|
+
y1: "6",
|
|
3485
|
+
x2: "18",
|
|
3486
|
+
y2: "18"
|
|
3487
|
+
}));
|
|
3488
|
+
|
|
3489
|
+
const useIsDocumentHidden = ()=>{
|
|
3490
|
+
const [isDocumentHidden, setIsDocumentHidden] = React__default.useState(document.hidden);
|
|
3491
|
+
React__default.useEffect(()=>{
|
|
3492
|
+
const callback = ()=>{
|
|
3493
|
+
setIsDocumentHidden(document.hidden);
|
|
3494
|
+
};
|
|
3495
|
+
document.addEventListener('visibilitychange', callback);
|
|
3496
|
+
return ()=>window.removeEventListener('visibilitychange', callback);
|
|
3497
|
+
}, []);
|
|
3498
|
+
return isDocumentHidden;
|
|
3499
|
+
};
|
|
3500
|
+
|
|
3501
|
+
let toastsCounter = 1;
|
|
3502
|
+
class Observer {
|
|
3503
|
+
constructor(){
|
|
3504
|
+
// We use arrow functions to maintain the correct `this` reference
|
|
3505
|
+
this.subscribe = (subscriber)=>{
|
|
3506
|
+
this.subscribers.push(subscriber);
|
|
3507
|
+
return ()=>{
|
|
3508
|
+
const index = this.subscribers.indexOf(subscriber);
|
|
3509
|
+
this.subscribers.splice(index, 1);
|
|
3510
|
+
};
|
|
3511
|
+
};
|
|
3512
|
+
this.publish = (data)=>{
|
|
3513
|
+
this.subscribers.forEach((subscriber)=>subscriber(data));
|
|
3514
|
+
};
|
|
3515
|
+
this.addToast = (data)=>{
|
|
3516
|
+
this.publish(data);
|
|
3517
|
+
this.toasts = [
|
|
3518
|
+
...this.toasts,
|
|
3519
|
+
data
|
|
3520
|
+
];
|
|
3521
|
+
};
|
|
3522
|
+
this.create = (data)=>{
|
|
3523
|
+
var _data_id;
|
|
3524
|
+
const { message, ...rest } = data;
|
|
3525
|
+
const id = typeof (data == null ? void 0 : data.id) === 'number' || ((_data_id = data.id) == null ? void 0 : _data_id.length) > 0 ? data.id : toastsCounter++;
|
|
3526
|
+
const alreadyExists = this.toasts.find((toast)=>{
|
|
3527
|
+
return toast.id === id;
|
|
3528
|
+
});
|
|
3529
|
+
const dismissible = data.dismissible === undefined ? true : data.dismissible;
|
|
3530
|
+
if (this.dismissedToasts.has(id)) {
|
|
3531
|
+
this.dismissedToasts.delete(id);
|
|
3532
|
+
}
|
|
3533
|
+
if (alreadyExists) {
|
|
3534
|
+
this.toasts = this.toasts.map((toast)=>{
|
|
3535
|
+
if (toast.id === id) {
|
|
3536
|
+
this.publish({
|
|
3537
|
+
...toast,
|
|
3538
|
+
...data,
|
|
3539
|
+
id,
|
|
3540
|
+
title: message
|
|
3541
|
+
});
|
|
3542
|
+
return {
|
|
3543
|
+
...toast,
|
|
3544
|
+
...data,
|
|
3545
|
+
id,
|
|
3546
|
+
dismissible,
|
|
3547
|
+
title: message
|
|
3548
|
+
};
|
|
3549
|
+
}
|
|
3550
|
+
return toast;
|
|
3551
|
+
});
|
|
3552
|
+
} else {
|
|
3553
|
+
this.addToast({
|
|
3554
|
+
title: message,
|
|
3555
|
+
...rest,
|
|
3556
|
+
dismissible,
|
|
3557
|
+
id
|
|
3558
|
+
});
|
|
3559
|
+
}
|
|
3560
|
+
return id;
|
|
3561
|
+
};
|
|
3562
|
+
this.dismiss = (id)=>{
|
|
3563
|
+
if (id) {
|
|
3564
|
+
this.dismissedToasts.add(id);
|
|
3565
|
+
requestAnimationFrame(()=>this.subscribers.forEach((subscriber)=>subscriber({
|
|
3566
|
+
id,
|
|
3567
|
+
dismiss: true
|
|
3568
|
+
})));
|
|
3569
|
+
} else {
|
|
3570
|
+
this.toasts.forEach((toast)=>{
|
|
3571
|
+
this.subscribers.forEach((subscriber)=>subscriber({
|
|
3572
|
+
id: toast.id,
|
|
3573
|
+
dismiss: true
|
|
3574
|
+
}));
|
|
3575
|
+
});
|
|
3576
|
+
}
|
|
3577
|
+
return id;
|
|
3578
|
+
};
|
|
3579
|
+
this.message = (message, data)=>{
|
|
3580
|
+
return this.create({
|
|
3581
|
+
...data,
|
|
3582
|
+
message
|
|
3583
|
+
});
|
|
3584
|
+
};
|
|
3585
|
+
this.error = (message, data)=>{
|
|
3586
|
+
return this.create({
|
|
3587
|
+
...data,
|
|
3588
|
+
message,
|
|
3589
|
+
type: 'error'
|
|
3590
|
+
});
|
|
3591
|
+
};
|
|
3592
|
+
this.success = (message, data)=>{
|
|
3593
|
+
return this.create({
|
|
3594
|
+
...data,
|
|
3595
|
+
type: 'success',
|
|
3596
|
+
message
|
|
3597
|
+
});
|
|
3598
|
+
};
|
|
3599
|
+
this.info = (message, data)=>{
|
|
3600
|
+
return this.create({
|
|
3601
|
+
...data,
|
|
3602
|
+
type: 'info',
|
|
3603
|
+
message
|
|
3604
|
+
});
|
|
3605
|
+
};
|
|
3606
|
+
this.warning = (message, data)=>{
|
|
3607
|
+
return this.create({
|
|
3608
|
+
...data,
|
|
3609
|
+
type: 'warning',
|
|
3610
|
+
message
|
|
3611
|
+
});
|
|
3612
|
+
};
|
|
3613
|
+
this.loading = (message, data)=>{
|
|
3614
|
+
return this.create({
|
|
3615
|
+
...data,
|
|
3616
|
+
type: 'loading',
|
|
3617
|
+
message
|
|
3618
|
+
});
|
|
3619
|
+
};
|
|
3620
|
+
this.promise = (promise, data)=>{
|
|
3621
|
+
if (!data) {
|
|
3622
|
+
// Nothing to show
|
|
3623
|
+
return;
|
|
3624
|
+
}
|
|
3625
|
+
let id = undefined;
|
|
3626
|
+
if (data.loading !== undefined) {
|
|
3627
|
+
id = this.create({
|
|
3628
|
+
...data,
|
|
3629
|
+
promise,
|
|
3630
|
+
type: 'loading',
|
|
3631
|
+
message: data.loading,
|
|
3632
|
+
description: typeof data.description !== 'function' ? data.description : undefined
|
|
3633
|
+
});
|
|
3634
|
+
}
|
|
3635
|
+
const p = Promise.resolve(promise instanceof Function ? promise() : promise);
|
|
3636
|
+
let shouldDismiss = id !== undefined;
|
|
3637
|
+
let result;
|
|
3638
|
+
const originalPromise = p.then(async (response)=>{
|
|
3639
|
+
result = [
|
|
3640
|
+
'resolve',
|
|
3641
|
+
response
|
|
3642
|
+
];
|
|
3643
|
+
const isReactElementResponse = React__default.isValidElement(response);
|
|
3644
|
+
if (isReactElementResponse) {
|
|
3645
|
+
shouldDismiss = false;
|
|
3646
|
+
this.create({
|
|
3647
|
+
id,
|
|
3648
|
+
type: 'default',
|
|
3649
|
+
message: response
|
|
3650
|
+
});
|
|
3651
|
+
} else if (isHttpResponse(response) && !response.ok) {
|
|
3652
|
+
shouldDismiss = false;
|
|
3653
|
+
const promiseData = typeof data.error === 'function' ? await data.error(`HTTP error! status: ${response.status}`) : data.error;
|
|
3654
|
+
const description = typeof data.description === 'function' ? await data.description(`HTTP error! status: ${response.status}`) : data.description;
|
|
3655
|
+
const isExtendedResult = typeof promiseData === 'object' && !React__default.isValidElement(promiseData);
|
|
3656
|
+
const toastSettings = isExtendedResult ? promiseData : {
|
|
3657
|
+
message: promiseData
|
|
3658
|
+
};
|
|
3659
|
+
this.create({
|
|
3660
|
+
id,
|
|
3661
|
+
type: 'error',
|
|
3662
|
+
description,
|
|
3663
|
+
...toastSettings
|
|
3664
|
+
});
|
|
3665
|
+
} else if (response instanceof Error) {
|
|
3666
|
+
shouldDismiss = false;
|
|
3667
|
+
const promiseData = typeof data.error === 'function' ? await data.error(response) : data.error;
|
|
3668
|
+
const description = typeof data.description === 'function' ? await data.description(response) : data.description;
|
|
3669
|
+
const isExtendedResult = typeof promiseData === 'object' && !React__default.isValidElement(promiseData);
|
|
3670
|
+
const toastSettings = isExtendedResult ? promiseData : {
|
|
3671
|
+
message: promiseData
|
|
3672
|
+
};
|
|
3673
|
+
this.create({
|
|
3674
|
+
id,
|
|
3675
|
+
type: 'error',
|
|
3676
|
+
description,
|
|
3677
|
+
...toastSettings
|
|
3678
|
+
});
|
|
3679
|
+
} else if (data.success !== undefined) {
|
|
3680
|
+
shouldDismiss = false;
|
|
3681
|
+
const promiseData = typeof data.success === 'function' ? await data.success(response) : data.success;
|
|
3682
|
+
const description = typeof data.description === 'function' ? await data.description(response) : data.description;
|
|
3683
|
+
const isExtendedResult = typeof promiseData === 'object' && !React__default.isValidElement(promiseData);
|
|
3684
|
+
const toastSettings = isExtendedResult ? promiseData : {
|
|
3685
|
+
message: promiseData
|
|
3686
|
+
};
|
|
3687
|
+
this.create({
|
|
3688
|
+
id,
|
|
3689
|
+
type: 'success',
|
|
3690
|
+
description,
|
|
3691
|
+
...toastSettings
|
|
3692
|
+
});
|
|
3693
|
+
}
|
|
3694
|
+
}).catch(async (error)=>{
|
|
3695
|
+
result = [
|
|
3696
|
+
'reject',
|
|
3697
|
+
error
|
|
3698
|
+
];
|
|
3699
|
+
if (data.error !== undefined) {
|
|
3700
|
+
shouldDismiss = false;
|
|
3701
|
+
const promiseData = typeof data.error === 'function' ? await data.error(error) : data.error;
|
|
3702
|
+
const description = typeof data.description === 'function' ? await data.description(error) : data.description;
|
|
3703
|
+
const isExtendedResult = typeof promiseData === 'object' && !React__default.isValidElement(promiseData);
|
|
3704
|
+
const toastSettings = isExtendedResult ? promiseData : {
|
|
3705
|
+
message: promiseData
|
|
3706
|
+
};
|
|
3707
|
+
this.create({
|
|
3708
|
+
id,
|
|
3709
|
+
type: 'error',
|
|
3710
|
+
description,
|
|
3711
|
+
...toastSettings
|
|
3712
|
+
});
|
|
3713
|
+
}
|
|
3714
|
+
}).finally(()=>{
|
|
3715
|
+
if (shouldDismiss) {
|
|
3716
|
+
// Toast is still in load state (and will be indefinitely — dismiss it)
|
|
3717
|
+
this.dismiss(id);
|
|
3718
|
+
id = undefined;
|
|
3719
|
+
}
|
|
3720
|
+
data.finally == null ? void 0 : data.finally.call(data);
|
|
3721
|
+
});
|
|
3722
|
+
const unwrap = ()=>new Promise((resolve, reject)=>originalPromise.then(()=>result[0] === 'reject' ? reject(result[1]) : resolve(result[1])).catch(reject));
|
|
3723
|
+
if (typeof id !== 'string' && typeof id !== 'number') {
|
|
3724
|
+
// cannot Object.assign on undefined
|
|
3725
|
+
return {
|
|
3726
|
+
unwrap
|
|
3727
|
+
};
|
|
3728
|
+
} else {
|
|
3729
|
+
return Object.assign(id, {
|
|
3730
|
+
unwrap
|
|
3731
|
+
});
|
|
3732
|
+
}
|
|
3733
|
+
};
|
|
3734
|
+
this.custom = (jsx, data)=>{
|
|
3735
|
+
const id = (data == null ? void 0 : data.id) || toastsCounter++;
|
|
3736
|
+
this.create({
|
|
3737
|
+
jsx: jsx(id),
|
|
3738
|
+
id,
|
|
3739
|
+
...data
|
|
3740
|
+
});
|
|
3741
|
+
return id;
|
|
3742
|
+
};
|
|
3743
|
+
this.getActiveToasts = ()=>{
|
|
3744
|
+
return this.toasts.filter((toast)=>!this.dismissedToasts.has(toast.id));
|
|
3745
|
+
};
|
|
3746
|
+
this.subscribers = [];
|
|
3747
|
+
this.toasts = [];
|
|
3748
|
+
this.dismissedToasts = new Set();
|
|
3749
|
+
}
|
|
3750
|
+
}
|
|
3751
|
+
const ToastState = new Observer();
|
|
3752
|
+
// bind this to the toast function
|
|
3753
|
+
const toastFunction = (message, data)=>{
|
|
3754
|
+
const id = (data == null ? void 0 : data.id) || toastsCounter++;
|
|
3755
|
+
ToastState.addToast({
|
|
3756
|
+
title: message,
|
|
3757
|
+
...data,
|
|
3758
|
+
id
|
|
3759
|
+
});
|
|
3760
|
+
return id;
|
|
3761
|
+
};
|
|
3762
|
+
const isHttpResponse = (data)=>{
|
|
3763
|
+
return data && typeof data === 'object' && 'ok' in data && typeof data.ok === 'boolean' && 'status' in data && typeof data.status === 'number';
|
|
3764
|
+
};
|
|
3765
|
+
const basicToast = toastFunction;
|
|
3766
|
+
const getHistory = ()=>ToastState.toasts;
|
|
3767
|
+
const getToasts = ()=>ToastState.getActiveToasts();
|
|
3768
|
+
// We use `Object.assign` to maintain the correct types as we would lose them otherwise
|
|
3769
|
+
const toast = Object.assign(basicToast, {
|
|
3770
|
+
success: ToastState.success,
|
|
3771
|
+
info: ToastState.info,
|
|
3772
|
+
warning: ToastState.warning,
|
|
3773
|
+
error: ToastState.error,
|
|
3774
|
+
custom: ToastState.custom,
|
|
3775
|
+
message: ToastState.message,
|
|
3776
|
+
promise: ToastState.promise,
|
|
3777
|
+
dismiss: ToastState.dismiss,
|
|
3778
|
+
loading: ToastState.loading
|
|
3779
|
+
}, {
|
|
3780
|
+
getHistory,
|
|
3781
|
+
getToasts
|
|
3782
|
+
});
|
|
3783
|
+
|
|
3784
|
+
__insertCSS("[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}[data-sonner-toaster][data-lifted=true]{transform:translateY(-8px)}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}");
|
|
3785
|
+
|
|
3786
|
+
function isAction(action) {
|
|
3787
|
+
return action.label !== undefined;
|
|
3788
|
+
}
|
|
3789
|
+
|
|
3790
|
+
// Visible toasts amount
|
|
3791
|
+
const VISIBLE_TOASTS_AMOUNT = 3;
|
|
3792
|
+
// Viewport padding
|
|
3793
|
+
const VIEWPORT_OFFSET = '24px';
|
|
3794
|
+
// Mobile viewport padding
|
|
3795
|
+
const MOBILE_VIEWPORT_OFFSET = '16px';
|
|
3796
|
+
// Default lifetime of a toasts (in ms)
|
|
3797
|
+
const TOAST_LIFETIME = 4000;
|
|
3798
|
+
// Default toast width
|
|
3799
|
+
const TOAST_WIDTH = 356;
|
|
3800
|
+
// Default gap between toasts
|
|
3801
|
+
const GAP = 14;
|
|
3802
|
+
// Threshold to dismiss a toast
|
|
3803
|
+
const SWIPE_THRESHOLD = 45;
|
|
3804
|
+
// Equal to exit animation duration
|
|
3805
|
+
const TIME_BEFORE_UNMOUNT = 200;
|
|
3806
|
+
function cn$1(...classes) {
|
|
3807
|
+
return classes.filter(Boolean).join(' ');
|
|
3808
|
+
}
|
|
3809
|
+
function getDefaultSwipeDirections(position) {
|
|
3810
|
+
const [y, x] = position.split('-');
|
|
3811
|
+
const directions = [];
|
|
3812
|
+
if (y) {
|
|
3813
|
+
directions.push(y);
|
|
3814
|
+
}
|
|
3815
|
+
if (x) {
|
|
3816
|
+
directions.push(x);
|
|
3817
|
+
}
|
|
3818
|
+
return directions;
|
|
3819
|
+
}
|
|
3820
|
+
const Toast = (props)=>{
|
|
3821
|
+
var _toast_classNames, _toast_classNames1, _toast_classNames2, _toast_classNames3, _toast_classNames4, _toast_classNames5, _toast_classNames6, _toast_classNames7, _toast_classNames8;
|
|
3822
|
+
const { invert: ToasterInvert, toast, unstyled, interacting, setHeights, visibleToasts, heights, index, toasts, expanded, removeToast, defaultRichColors, closeButton: closeButtonFromToaster, style, cancelButtonStyle, actionButtonStyle, className = '', descriptionClassName = '', duration: durationFromToaster, position, gap, expandByDefault, classNames, icons, closeButtonAriaLabel = 'Close toast' } = props;
|
|
3823
|
+
const [swipeDirection, setSwipeDirection] = React__default.useState(null);
|
|
3824
|
+
const [swipeOutDirection, setSwipeOutDirection] = React__default.useState(null);
|
|
3825
|
+
const [mounted, setMounted] = React__default.useState(false);
|
|
3826
|
+
const [removed, setRemoved] = React__default.useState(false);
|
|
3827
|
+
const [swiping, setSwiping] = React__default.useState(false);
|
|
3828
|
+
const [swipeOut, setSwipeOut] = React__default.useState(false);
|
|
3829
|
+
const [isSwiped, setIsSwiped] = React__default.useState(false);
|
|
3830
|
+
const [offsetBeforeRemove, setOffsetBeforeRemove] = React__default.useState(0);
|
|
3831
|
+
const [initialHeight, setInitialHeight] = React__default.useState(0);
|
|
3832
|
+
const remainingTime = React__default.useRef(toast.duration || durationFromToaster || TOAST_LIFETIME);
|
|
3833
|
+
const dragStartTime = React__default.useRef(null);
|
|
3834
|
+
const toastRef = React__default.useRef(null);
|
|
3835
|
+
const isFront = index === 0;
|
|
3836
|
+
const isVisible = index + 1 <= visibleToasts;
|
|
3837
|
+
const toastType = toast.type;
|
|
3838
|
+
const dismissible = toast.dismissible !== false;
|
|
3839
|
+
const toastClassname = toast.className || '';
|
|
3840
|
+
const toastDescriptionClassname = toast.descriptionClassName || '';
|
|
3841
|
+
// Height index is used to calculate the offset as it gets updated before the toast array, which means we can calculate the new layout faster.
|
|
3842
|
+
const heightIndex = React__default.useMemo(()=>heights.findIndex((height)=>height.toastId === toast.id) || 0, [
|
|
3843
|
+
heights,
|
|
3844
|
+
toast.id
|
|
3845
|
+
]);
|
|
3846
|
+
const closeButton = React__default.useMemo(()=>{
|
|
3847
|
+
var _toast_closeButton;
|
|
3848
|
+
return (_toast_closeButton = toast.closeButton) != null ? _toast_closeButton : closeButtonFromToaster;
|
|
3849
|
+
}, [
|
|
3850
|
+
toast.closeButton,
|
|
3851
|
+
closeButtonFromToaster
|
|
3852
|
+
]);
|
|
3853
|
+
const duration = React__default.useMemo(()=>toast.duration || durationFromToaster || TOAST_LIFETIME, [
|
|
3854
|
+
toast.duration,
|
|
3855
|
+
durationFromToaster
|
|
3856
|
+
]);
|
|
3857
|
+
const closeTimerStartTimeRef = React__default.useRef(0);
|
|
3858
|
+
const offset = React__default.useRef(0);
|
|
3859
|
+
const lastCloseTimerStartTimeRef = React__default.useRef(0);
|
|
3860
|
+
const pointerStartRef = React__default.useRef(null);
|
|
3861
|
+
const [y, x] = position.split('-');
|
|
3862
|
+
const toastsHeightBefore = React__default.useMemo(()=>{
|
|
3863
|
+
return heights.reduce((prev, curr, reducerIndex)=>{
|
|
3864
|
+
// Calculate offset up until current toast
|
|
3865
|
+
if (reducerIndex >= heightIndex) {
|
|
3866
|
+
return prev;
|
|
3867
|
+
}
|
|
3868
|
+
return prev + curr.height;
|
|
3869
|
+
}, 0);
|
|
3870
|
+
}, [
|
|
3871
|
+
heights,
|
|
3872
|
+
heightIndex
|
|
3873
|
+
]);
|
|
3874
|
+
const isDocumentHidden = useIsDocumentHidden();
|
|
3875
|
+
const invert = toast.invert || ToasterInvert;
|
|
3876
|
+
const disabled = toastType === 'loading';
|
|
3877
|
+
offset.current = React__default.useMemo(()=>heightIndex * gap + toastsHeightBefore, [
|
|
3878
|
+
heightIndex,
|
|
3879
|
+
toastsHeightBefore
|
|
3880
|
+
]);
|
|
3881
|
+
React__default.useEffect(()=>{
|
|
3882
|
+
remainingTime.current = duration;
|
|
3883
|
+
}, [
|
|
3884
|
+
duration
|
|
3885
|
+
]);
|
|
3886
|
+
React__default.useEffect(()=>{
|
|
3887
|
+
// Trigger enter animation without using CSS animation
|
|
3888
|
+
setMounted(true);
|
|
3889
|
+
}, []);
|
|
3890
|
+
React__default.useEffect(()=>{
|
|
3891
|
+
const toastNode = toastRef.current;
|
|
3892
|
+
if (toastNode) {
|
|
3893
|
+
const height = toastNode.getBoundingClientRect().height;
|
|
3894
|
+
// Add toast height to heights array after the toast is mounted
|
|
3895
|
+
setInitialHeight(height);
|
|
3896
|
+
setHeights((h)=>[
|
|
3897
|
+
{
|
|
3898
|
+
toastId: toast.id,
|
|
3899
|
+
height,
|
|
3900
|
+
position: toast.position
|
|
3901
|
+
},
|
|
3902
|
+
...h
|
|
3903
|
+
]);
|
|
3904
|
+
return ()=>setHeights((h)=>h.filter((height)=>height.toastId !== toast.id));
|
|
3905
|
+
}
|
|
3906
|
+
}, [
|
|
3907
|
+
setHeights,
|
|
3908
|
+
toast.id
|
|
3909
|
+
]);
|
|
3910
|
+
React__default.useLayoutEffect(()=>{
|
|
3911
|
+
if (!mounted) return;
|
|
3912
|
+
const toastNode = toastRef.current;
|
|
3913
|
+
const originalHeight = toastNode.style.height;
|
|
3914
|
+
toastNode.style.height = 'auto';
|
|
3915
|
+
const newHeight = toastNode.getBoundingClientRect().height;
|
|
3916
|
+
toastNode.style.height = originalHeight;
|
|
3917
|
+
setInitialHeight(newHeight);
|
|
3918
|
+
setHeights((heights)=>{
|
|
3919
|
+
const alreadyExists = heights.find((height)=>height.toastId === toast.id);
|
|
3920
|
+
if (!alreadyExists) {
|
|
3921
|
+
return [
|
|
3922
|
+
{
|
|
3923
|
+
toastId: toast.id,
|
|
3924
|
+
height: newHeight,
|
|
3925
|
+
position: toast.position
|
|
3926
|
+
},
|
|
3927
|
+
...heights
|
|
3928
|
+
];
|
|
3929
|
+
} else {
|
|
3930
|
+
return heights.map((height)=>height.toastId === toast.id ? {
|
|
3931
|
+
...height,
|
|
3932
|
+
height: newHeight
|
|
3933
|
+
} : height);
|
|
3934
|
+
}
|
|
3935
|
+
});
|
|
3936
|
+
}, [
|
|
3937
|
+
mounted,
|
|
3938
|
+
toast.title,
|
|
3939
|
+
toast.description,
|
|
3940
|
+
setHeights,
|
|
3941
|
+
toast.id
|
|
3942
|
+
]);
|
|
3943
|
+
const deleteToast = React__default.useCallback(()=>{
|
|
3944
|
+
// Save the offset for the exit swipe animation
|
|
3945
|
+
setRemoved(true);
|
|
3946
|
+
setOffsetBeforeRemove(offset.current);
|
|
3947
|
+
setHeights((h)=>h.filter((height)=>height.toastId !== toast.id));
|
|
3948
|
+
setTimeout(()=>{
|
|
3949
|
+
removeToast(toast);
|
|
3950
|
+
}, TIME_BEFORE_UNMOUNT);
|
|
3951
|
+
}, [
|
|
3952
|
+
toast,
|
|
3953
|
+
removeToast,
|
|
3954
|
+
setHeights,
|
|
3955
|
+
offset
|
|
3956
|
+
]);
|
|
3957
|
+
React__default.useEffect(()=>{
|
|
3958
|
+
if (toast.promise && toastType === 'loading' || toast.duration === Infinity || toast.type === 'loading') return;
|
|
3959
|
+
let timeoutId;
|
|
3960
|
+
// Pause the timer on each hover
|
|
3961
|
+
const pauseTimer = ()=>{
|
|
3962
|
+
if (lastCloseTimerStartTimeRef.current < closeTimerStartTimeRef.current) {
|
|
3963
|
+
// Get the elapsed time since the timer started
|
|
3964
|
+
const elapsedTime = new Date().getTime() - closeTimerStartTimeRef.current;
|
|
3965
|
+
remainingTime.current = remainingTime.current - elapsedTime;
|
|
3966
|
+
}
|
|
3967
|
+
lastCloseTimerStartTimeRef.current = new Date().getTime();
|
|
3968
|
+
};
|
|
3969
|
+
const startTimer = ()=>{
|
|
3970
|
+
// setTimeout(, Infinity) behaves as if the delay is 0.
|
|
3971
|
+
// As a result, the toast would be closed immediately, giving the appearance that it was never rendered.
|
|
3972
|
+
// See: https://github.com/denysdovhan/wtfjs?tab=readme-ov-file#an-infinite-timeout
|
|
3973
|
+
if (remainingTime.current === Infinity) return;
|
|
3974
|
+
closeTimerStartTimeRef.current = new Date().getTime();
|
|
3975
|
+
// Let the toast know it has started
|
|
3976
|
+
timeoutId = setTimeout(()=>{
|
|
3977
|
+
toast.onAutoClose == null ? void 0 : toast.onAutoClose.call(toast, toast);
|
|
3978
|
+
deleteToast();
|
|
3979
|
+
}, remainingTime.current);
|
|
3980
|
+
};
|
|
3981
|
+
if (expanded || interacting || isDocumentHidden) {
|
|
3982
|
+
pauseTimer();
|
|
3983
|
+
} else {
|
|
3984
|
+
startTimer();
|
|
3985
|
+
}
|
|
3986
|
+
return ()=>clearTimeout(timeoutId);
|
|
3987
|
+
}, [
|
|
3988
|
+
expanded,
|
|
3989
|
+
interacting,
|
|
3990
|
+
toast,
|
|
3991
|
+
toastType,
|
|
3992
|
+
isDocumentHidden,
|
|
3993
|
+
deleteToast
|
|
3994
|
+
]);
|
|
3995
|
+
React__default.useEffect(()=>{
|
|
3996
|
+
if (toast.delete) {
|
|
3997
|
+
deleteToast();
|
|
3998
|
+
}
|
|
3999
|
+
}, [
|
|
4000
|
+
deleteToast,
|
|
4001
|
+
toast.delete
|
|
4002
|
+
]);
|
|
4003
|
+
function getLoadingIcon() {
|
|
4004
|
+
var _toast_classNames;
|
|
4005
|
+
if (icons == null ? void 0 : icons.loading) {
|
|
4006
|
+
var _toast_classNames1;
|
|
4007
|
+
return /*#__PURE__*/ React__default.createElement("div", {
|
|
4008
|
+
className: cn$1(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1.loader, 'sonner-loader'),
|
|
4009
|
+
"data-visible": toastType === 'loading'
|
|
4010
|
+
}, icons.loading);
|
|
4011
|
+
}
|
|
4012
|
+
return /*#__PURE__*/ React__default.createElement(Loader$1, {
|
|
4013
|
+
className: cn$1(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.loader),
|
|
4014
|
+
visible: toastType === 'loading'
|
|
4015
|
+
});
|
|
4016
|
+
}
|
|
4017
|
+
const icon = toast.icon || (icons == null ? void 0 : icons[toastType]) || getAsset(toastType);
|
|
4018
|
+
var _toast_richColors, _icons_close;
|
|
4019
|
+
return /*#__PURE__*/ React__default.createElement("li", {
|
|
4020
|
+
tabIndex: 0,
|
|
4021
|
+
ref: toastRef,
|
|
4022
|
+
className: cn$1(className, toastClassname, classNames == null ? void 0 : classNames.toast, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.toast, classNames == null ? void 0 : classNames.default, classNames == null ? void 0 : classNames[toastType], toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1[toastType]),
|
|
4023
|
+
"data-sonner-toast": "",
|
|
4024
|
+
"data-rich-colors": (_toast_richColors = toast.richColors) != null ? _toast_richColors : defaultRichColors,
|
|
4025
|
+
"data-styled": !Boolean(toast.jsx || toast.unstyled || unstyled),
|
|
4026
|
+
"data-mounted": mounted,
|
|
4027
|
+
"data-promise": Boolean(toast.promise),
|
|
4028
|
+
"data-swiped": isSwiped,
|
|
4029
|
+
"data-removed": removed,
|
|
4030
|
+
"data-visible": isVisible,
|
|
4031
|
+
"data-y-position": y,
|
|
4032
|
+
"data-x-position": x,
|
|
4033
|
+
"data-index": index,
|
|
4034
|
+
"data-front": isFront,
|
|
4035
|
+
"data-swiping": swiping,
|
|
4036
|
+
"data-dismissible": dismissible,
|
|
4037
|
+
"data-type": toastType,
|
|
4038
|
+
"data-invert": invert,
|
|
4039
|
+
"data-swipe-out": swipeOut,
|
|
4040
|
+
"data-swipe-direction": swipeOutDirection,
|
|
4041
|
+
"data-expanded": Boolean(expanded || expandByDefault && mounted),
|
|
4042
|
+
style: {
|
|
4043
|
+
'--index': index,
|
|
4044
|
+
'--toasts-before': index,
|
|
4045
|
+
'--z-index': toasts.length - index,
|
|
4046
|
+
'--offset': `${removed ? offsetBeforeRemove : offset.current}px`,
|
|
4047
|
+
'--initial-height': expandByDefault ? 'auto' : `${initialHeight}px`,
|
|
4048
|
+
...style,
|
|
4049
|
+
...toast.style
|
|
4050
|
+
},
|
|
4051
|
+
onDragEnd: ()=>{
|
|
4052
|
+
setSwiping(false);
|
|
4053
|
+
setSwipeDirection(null);
|
|
4054
|
+
pointerStartRef.current = null;
|
|
4055
|
+
},
|
|
4056
|
+
onPointerDown: (event)=>{
|
|
4057
|
+
if (disabled || !dismissible) return;
|
|
4058
|
+
dragStartTime.current = new Date();
|
|
4059
|
+
setOffsetBeforeRemove(offset.current);
|
|
4060
|
+
// Ensure we maintain correct pointer capture even when going outside of the toast (e.g. when swiping)
|
|
4061
|
+
event.target.setPointerCapture(event.pointerId);
|
|
4062
|
+
if (event.target.tagName === 'BUTTON') return;
|
|
4063
|
+
setSwiping(true);
|
|
4064
|
+
pointerStartRef.current = {
|
|
4065
|
+
x: event.clientX,
|
|
4066
|
+
y: event.clientY
|
|
4067
|
+
};
|
|
4068
|
+
},
|
|
4069
|
+
onPointerUp: ()=>{
|
|
4070
|
+
var _toastRef_current, _toastRef_current1, _dragStartTime_current;
|
|
4071
|
+
if (swipeOut || !dismissible) return;
|
|
4072
|
+
pointerStartRef.current = null;
|
|
4073
|
+
const swipeAmountX = Number(((_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.getPropertyValue('--swipe-amount-x').replace('px', '')) || 0);
|
|
4074
|
+
const swipeAmountY = Number(((_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.getPropertyValue('--swipe-amount-y').replace('px', '')) || 0);
|
|
4075
|
+
const timeTaken = new Date().getTime() - ((_dragStartTime_current = dragStartTime.current) == null ? void 0 : _dragStartTime_current.getTime());
|
|
4076
|
+
const swipeAmount = swipeDirection === 'x' ? swipeAmountX : swipeAmountY;
|
|
4077
|
+
const velocity = Math.abs(swipeAmount) / timeTaken;
|
|
4078
|
+
if (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11) {
|
|
4079
|
+
setOffsetBeforeRemove(offset.current);
|
|
4080
|
+
toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);
|
|
4081
|
+
if (swipeDirection === 'x') {
|
|
4082
|
+
setSwipeOutDirection(swipeAmountX > 0 ? 'right' : 'left');
|
|
4083
|
+
} else {
|
|
4084
|
+
setSwipeOutDirection(swipeAmountY > 0 ? 'down' : 'up');
|
|
4085
|
+
}
|
|
4086
|
+
deleteToast();
|
|
4087
|
+
setSwipeOut(true);
|
|
4088
|
+
return;
|
|
4089
|
+
} else {
|
|
4090
|
+
var _toastRef_current2, _toastRef_current3;
|
|
4091
|
+
(_toastRef_current2 = toastRef.current) == null ? void 0 : _toastRef_current2.style.setProperty('--swipe-amount-x', `0px`);
|
|
4092
|
+
(_toastRef_current3 = toastRef.current) == null ? void 0 : _toastRef_current3.style.setProperty('--swipe-amount-y', `0px`);
|
|
4093
|
+
}
|
|
4094
|
+
setIsSwiped(false);
|
|
4095
|
+
setSwiping(false);
|
|
4096
|
+
setSwipeDirection(null);
|
|
4097
|
+
},
|
|
4098
|
+
onPointerMove: (event)=>{
|
|
4099
|
+
var _window_getSelection, // Apply transform using both x and y values
|
|
4100
|
+
_toastRef_current, _toastRef_current1;
|
|
4101
|
+
if (!pointerStartRef.current || !dismissible) return;
|
|
4102
|
+
const isHighlighted = ((_window_getSelection = window.getSelection()) == null ? void 0 : _window_getSelection.toString().length) > 0;
|
|
4103
|
+
if (isHighlighted) return;
|
|
4104
|
+
const yDelta = event.clientY - pointerStartRef.current.y;
|
|
4105
|
+
const xDelta = event.clientX - pointerStartRef.current.x;
|
|
4106
|
+
var _props_swipeDirections;
|
|
4107
|
+
const swipeDirections = (_props_swipeDirections = props.swipeDirections) != null ? _props_swipeDirections : getDefaultSwipeDirections(position);
|
|
4108
|
+
// Determine swipe direction if not already locked
|
|
4109
|
+
if (!swipeDirection && (Math.abs(xDelta) > 1 || Math.abs(yDelta) > 1)) {
|
|
4110
|
+
setSwipeDirection(Math.abs(xDelta) > Math.abs(yDelta) ? 'x' : 'y');
|
|
4111
|
+
}
|
|
4112
|
+
let swipeAmount = {
|
|
4113
|
+
x: 0,
|
|
4114
|
+
y: 0
|
|
4115
|
+
};
|
|
4116
|
+
const getDampening = (delta)=>{
|
|
4117
|
+
const factor = Math.abs(delta) / 20;
|
|
4118
|
+
return 1 / (1.5 + factor);
|
|
4119
|
+
};
|
|
4120
|
+
// Only apply swipe in the locked direction
|
|
4121
|
+
if (swipeDirection === 'y') {
|
|
4122
|
+
// Handle vertical swipes
|
|
4123
|
+
if (swipeDirections.includes('top') || swipeDirections.includes('bottom')) {
|
|
4124
|
+
if (swipeDirections.includes('top') && yDelta < 0 || swipeDirections.includes('bottom') && yDelta > 0) {
|
|
4125
|
+
swipeAmount.y = yDelta;
|
|
4126
|
+
} else {
|
|
4127
|
+
// Smoothly transition to dampened movement
|
|
4128
|
+
const dampenedDelta = yDelta * getDampening(yDelta);
|
|
4129
|
+
// Ensure we don't jump when transitioning to dampened movement
|
|
4130
|
+
swipeAmount.y = Math.abs(dampenedDelta) < Math.abs(yDelta) ? dampenedDelta : yDelta;
|
|
4131
|
+
}
|
|
4132
|
+
}
|
|
4133
|
+
} else if (swipeDirection === 'x') {
|
|
4134
|
+
// Handle horizontal swipes
|
|
4135
|
+
if (swipeDirections.includes('left') || swipeDirections.includes('right')) {
|
|
4136
|
+
if (swipeDirections.includes('left') && xDelta < 0 || swipeDirections.includes('right') && xDelta > 0) {
|
|
4137
|
+
swipeAmount.x = xDelta;
|
|
4138
|
+
} else {
|
|
4139
|
+
// Smoothly transition to dampened movement
|
|
4140
|
+
const dampenedDelta = xDelta * getDampening(xDelta);
|
|
4141
|
+
// Ensure we don't jump when transitioning to dampened movement
|
|
4142
|
+
swipeAmount.x = Math.abs(dampenedDelta) < Math.abs(xDelta) ? dampenedDelta : xDelta;
|
|
4143
|
+
}
|
|
4144
|
+
}
|
|
4145
|
+
}
|
|
4146
|
+
if (Math.abs(swipeAmount.x) > 0 || Math.abs(swipeAmount.y) > 0) {
|
|
4147
|
+
setIsSwiped(true);
|
|
4148
|
+
}
|
|
4149
|
+
(_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.setProperty('--swipe-amount-x', `${swipeAmount.x}px`);
|
|
4150
|
+
(_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.setProperty('--swipe-amount-y', `${swipeAmount.y}px`);
|
|
4151
|
+
}
|
|
4152
|
+
}, closeButton && !toast.jsx && toastType !== 'loading' ? /*#__PURE__*/ React__default.createElement("button", {
|
|
4153
|
+
"aria-label": closeButtonAriaLabel,
|
|
4154
|
+
"data-disabled": disabled,
|
|
4155
|
+
"data-close-button": true,
|
|
4156
|
+
onClick: disabled || !dismissible ? ()=>{} : ()=>{
|
|
4157
|
+
deleteToast();
|
|
4158
|
+
toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);
|
|
4159
|
+
},
|
|
4160
|
+
className: cn$1(classNames == null ? void 0 : classNames.closeButton, toast == null ? void 0 : (_toast_classNames2 = toast.classNames) == null ? void 0 : _toast_classNames2.closeButton)
|
|
4161
|
+
}, (_icons_close = icons == null ? void 0 : icons.close) != null ? _icons_close : CloseIcon) : null, (toastType || toast.icon || toast.promise) && toast.icon !== null && ((icons == null ? void 0 : icons[toastType]) !== null || toast.icon) ? /*#__PURE__*/ React__default.createElement("div", {
|
|
4162
|
+
"data-icon": "",
|
|
4163
|
+
className: cn$1(classNames == null ? void 0 : classNames.icon, toast == null ? void 0 : (_toast_classNames3 = toast.classNames) == null ? void 0 : _toast_classNames3.icon)
|
|
4164
|
+
}, toast.promise || toast.type === 'loading' && !toast.icon ? toast.icon || getLoadingIcon() : null, toast.type !== 'loading' ? icon : null) : null, /*#__PURE__*/ React__default.createElement("div", {
|
|
4165
|
+
"data-content": "",
|
|
4166
|
+
className: cn$1(classNames == null ? void 0 : classNames.content, toast == null ? void 0 : (_toast_classNames4 = toast.classNames) == null ? void 0 : _toast_classNames4.content)
|
|
4167
|
+
}, /*#__PURE__*/ React__default.createElement("div", {
|
|
4168
|
+
"data-title": "",
|
|
4169
|
+
className: cn$1(classNames == null ? void 0 : classNames.title, toast == null ? void 0 : (_toast_classNames5 = toast.classNames) == null ? void 0 : _toast_classNames5.title)
|
|
4170
|
+
}, toast.jsx ? toast.jsx : typeof toast.title === 'function' ? toast.title() : toast.title), toast.description ? /*#__PURE__*/ React__default.createElement("div", {
|
|
4171
|
+
"data-description": "",
|
|
4172
|
+
className: cn$1(descriptionClassName, toastDescriptionClassname, classNames == null ? void 0 : classNames.description, toast == null ? void 0 : (_toast_classNames6 = toast.classNames) == null ? void 0 : _toast_classNames6.description)
|
|
4173
|
+
}, typeof toast.description === 'function' ? toast.description() : toast.description) : null), /*#__PURE__*/ React__default.isValidElement(toast.cancel) ? toast.cancel : toast.cancel && isAction(toast.cancel) ? /*#__PURE__*/ React__default.createElement("button", {
|
|
4174
|
+
"data-button": true,
|
|
4175
|
+
"data-cancel": true,
|
|
4176
|
+
style: toast.cancelButtonStyle || cancelButtonStyle,
|
|
4177
|
+
onClick: (event)=>{
|
|
4178
|
+
// We need to check twice because typescript
|
|
4179
|
+
if (!isAction(toast.cancel)) return;
|
|
4180
|
+
if (!dismissible) return;
|
|
4181
|
+
toast.cancel.onClick == null ? void 0 : toast.cancel.onClick.call(toast.cancel, event);
|
|
4182
|
+
deleteToast();
|
|
4183
|
+
},
|
|
4184
|
+
className: cn$1(classNames == null ? void 0 : classNames.cancelButton, toast == null ? void 0 : (_toast_classNames7 = toast.classNames) == null ? void 0 : _toast_classNames7.cancelButton)
|
|
4185
|
+
}, toast.cancel.label) : null, /*#__PURE__*/ React__default.isValidElement(toast.action) ? toast.action : toast.action && isAction(toast.action) ? /*#__PURE__*/ React__default.createElement("button", {
|
|
4186
|
+
"data-button": true,
|
|
4187
|
+
"data-action": true,
|
|
4188
|
+
style: toast.actionButtonStyle || actionButtonStyle,
|
|
4189
|
+
onClick: (event)=>{
|
|
4190
|
+
// We need to check twice because typescript
|
|
4191
|
+
if (!isAction(toast.action)) return;
|
|
4192
|
+
toast.action.onClick == null ? void 0 : toast.action.onClick.call(toast.action, event);
|
|
4193
|
+
if (event.defaultPrevented) return;
|
|
4194
|
+
deleteToast();
|
|
4195
|
+
},
|
|
4196
|
+
className: cn$1(classNames == null ? void 0 : classNames.actionButton, toast == null ? void 0 : (_toast_classNames8 = toast.classNames) == null ? void 0 : _toast_classNames8.actionButton)
|
|
4197
|
+
}, toast.action.label) : null);
|
|
4198
|
+
};
|
|
4199
|
+
function getDocumentDirection() {
|
|
4200
|
+
if (typeof window === 'undefined') return 'ltr';
|
|
4201
|
+
if (typeof document === 'undefined') return 'ltr'; // For Fresh purpose
|
|
4202
|
+
const dirAttribute = document.documentElement.getAttribute('dir');
|
|
4203
|
+
if (dirAttribute === 'auto' || !dirAttribute) {
|
|
4204
|
+
return window.getComputedStyle(document.documentElement).direction;
|
|
4205
|
+
}
|
|
4206
|
+
return dirAttribute;
|
|
4207
|
+
}
|
|
4208
|
+
function assignOffset(defaultOffset, mobileOffset) {
|
|
4209
|
+
const styles = {};
|
|
4210
|
+
[
|
|
4211
|
+
defaultOffset,
|
|
4212
|
+
mobileOffset
|
|
4213
|
+
].forEach((offset, index)=>{
|
|
4214
|
+
const isMobile = index === 1;
|
|
4215
|
+
const prefix = isMobile ? '--mobile-offset' : '--offset';
|
|
4216
|
+
const defaultValue = isMobile ? MOBILE_VIEWPORT_OFFSET : VIEWPORT_OFFSET;
|
|
4217
|
+
function assignAll(offset) {
|
|
4218
|
+
[
|
|
4219
|
+
'top',
|
|
4220
|
+
'right',
|
|
4221
|
+
'bottom',
|
|
4222
|
+
'left'
|
|
4223
|
+
].forEach((key)=>{
|
|
4224
|
+
styles[`${prefix}-${key}`] = typeof offset === 'number' ? `${offset}px` : offset;
|
|
4225
|
+
});
|
|
4226
|
+
}
|
|
4227
|
+
if (typeof offset === 'number' || typeof offset === 'string') {
|
|
4228
|
+
assignAll(offset);
|
|
4229
|
+
} else if (typeof offset === 'object') {
|
|
4230
|
+
[
|
|
4231
|
+
'top',
|
|
4232
|
+
'right',
|
|
4233
|
+
'bottom',
|
|
4234
|
+
'left'
|
|
4235
|
+
].forEach((key)=>{
|
|
4236
|
+
if (offset[key] === undefined) {
|
|
4237
|
+
styles[`${prefix}-${key}`] = defaultValue;
|
|
4238
|
+
} else {
|
|
4239
|
+
styles[`${prefix}-${key}`] = typeof offset[key] === 'number' ? `${offset[key]}px` : offset[key];
|
|
4240
|
+
}
|
|
4241
|
+
});
|
|
4242
|
+
} else {
|
|
4243
|
+
assignAll(defaultValue);
|
|
4244
|
+
}
|
|
4245
|
+
});
|
|
4246
|
+
return styles;
|
|
4247
|
+
}
|
|
4248
|
+
const Toaster$1 = /*#__PURE__*/ React__default.forwardRef(function Toaster(props, ref) {
|
|
4249
|
+
const { invert, position = 'bottom-right', hotkey = [
|
|
4250
|
+
'altKey',
|
|
4251
|
+
'KeyT'
|
|
4252
|
+
], expand, closeButton, className, offset, mobileOffset, theme = 'light', richColors, duration, style, visibleToasts = VISIBLE_TOASTS_AMOUNT, toastOptions, dir = getDocumentDirection(), gap = GAP, icons, containerAriaLabel = 'Notifications' } = props;
|
|
4253
|
+
const [toasts, setToasts] = React__default.useState([]);
|
|
4254
|
+
const possiblePositions = React__default.useMemo(()=>{
|
|
4255
|
+
return Array.from(new Set([
|
|
4256
|
+
position
|
|
4257
|
+
].concat(toasts.filter((toast)=>toast.position).map((toast)=>toast.position))));
|
|
4258
|
+
}, [
|
|
4259
|
+
toasts,
|
|
4260
|
+
position
|
|
4261
|
+
]);
|
|
4262
|
+
const [heights, setHeights] = React__default.useState([]);
|
|
4263
|
+
const [expanded, setExpanded] = React__default.useState(false);
|
|
4264
|
+
const [interacting, setInteracting] = React__default.useState(false);
|
|
4265
|
+
const [actualTheme, setActualTheme] = React__default.useState(theme !== 'system' ? theme : typeof window !== 'undefined' ? window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' : 'light');
|
|
4266
|
+
const listRef = React__default.useRef(null);
|
|
4267
|
+
const hotkeyLabel = hotkey.join('+').replace(/Key/g, '').replace(/Digit/g, '');
|
|
4268
|
+
const lastFocusedElementRef = React__default.useRef(null);
|
|
4269
|
+
const isFocusWithinRef = React__default.useRef(false);
|
|
4270
|
+
const removeToast = React__default.useCallback((toastToRemove)=>{
|
|
4271
|
+
setToasts((toasts)=>{
|
|
4272
|
+
var _toasts_find;
|
|
4273
|
+
if (!((_toasts_find = toasts.find((toast)=>toast.id === toastToRemove.id)) == null ? void 0 : _toasts_find.delete)) {
|
|
4274
|
+
ToastState.dismiss(toastToRemove.id);
|
|
4275
|
+
}
|
|
4276
|
+
return toasts.filter(({ id })=>id !== toastToRemove.id);
|
|
4277
|
+
});
|
|
4278
|
+
}, []);
|
|
4279
|
+
React__default.useEffect(()=>{
|
|
4280
|
+
return ToastState.subscribe((toast)=>{
|
|
4281
|
+
if (toast.dismiss) {
|
|
4282
|
+
// Prevent batching of other state updates
|
|
4283
|
+
requestAnimationFrame(()=>{
|
|
4284
|
+
setToasts((toasts)=>toasts.map((t)=>t.id === toast.id ? {
|
|
4285
|
+
...t,
|
|
4286
|
+
delete: true
|
|
4287
|
+
} : t));
|
|
4288
|
+
});
|
|
4289
|
+
return;
|
|
4290
|
+
}
|
|
4291
|
+
// Prevent batching, temp solution.
|
|
4292
|
+
setTimeout(()=>{
|
|
4293
|
+
ReactDOM.flushSync(()=>{
|
|
4294
|
+
setToasts((toasts)=>{
|
|
4295
|
+
const indexOfExistingToast = toasts.findIndex((t)=>t.id === toast.id);
|
|
4296
|
+
// Update the toast if it already exists
|
|
4297
|
+
if (indexOfExistingToast !== -1) {
|
|
4298
|
+
return [
|
|
4299
|
+
...toasts.slice(0, indexOfExistingToast),
|
|
4300
|
+
{
|
|
4301
|
+
...toasts[indexOfExistingToast],
|
|
4302
|
+
...toast
|
|
4303
|
+
},
|
|
4304
|
+
...toasts.slice(indexOfExistingToast + 1)
|
|
4305
|
+
];
|
|
4306
|
+
}
|
|
4307
|
+
return [
|
|
4308
|
+
toast,
|
|
4309
|
+
...toasts
|
|
4310
|
+
];
|
|
4311
|
+
});
|
|
4312
|
+
});
|
|
4313
|
+
});
|
|
4314
|
+
});
|
|
4315
|
+
}, [
|
|
4316
|
+
toasts
|
|
4317
|
+
]);
|
|
4318
|
+
React__default.useEffect(()=>{
|
|
4319
|
+
if (theme !== 'system') {
|
|
4320
|
+
setActualTheme(theme);
|
|
4321
|
+
return;
|
|
4322
|
+
}
|
|
4323
|
+
if (theme === 'system') {
|
|
4324
|
+
// check if current preference is dark
|
|
4325
|
+
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
|
4326
|
+
// it's currently dark
|
|
4327
|
+
setActualTheme('dark');
|
|
4328
|
+
} else {
|
|
4329
|
+
// it's not dark
|
|
4330
|
+
setActualTheme('light');
|
|
4331
|
+
}
|
|
4332
|
+
}
|
|
4333
|
+
if (typeof window === 'undefined') return;
|
|
4334
|
+
const darkMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
4335
|
+
try {
|
|
4336
|
+
// Chrome & Firefox
|
|
4337
|
+
darkMediaQuery.addEventListener('change', ({ matches })=>{
|
|
4338
|
+
if (matches) {
|
|
4339
|
+
setActualTheme('dark');
|
|
4340
|
+
} else {
|
|
4341
|
+
setActualTheme('light');
|
|
4342
|
+
}
|
|
4343
|
+
});
|
|
4344
|
+
} catch (error) {
|
|
4345
|
+
// Safari < 14
|
|
4346
|
+
darkMediaQuery.addListener(({ matches })=>{
|
|
4347
|
+
try {
|
|
4348
|
+
if (matches) {
|
|
4349
|
+
setActualTheme('dark');
|
|
4350
|
+
} else {
|
|
4351
|
+
setActualTheme('light');
|
|
4352
|
+
}
|
|
4353
|
+
} catch (e) {
|
|
4354
|
+
console.error(e);
|
|
4355
|
+
}
|
|
4356
|
+
});
|
|
4357
|
+
}
|
|
4358
|
+
}, [
|
|
4359
|
+
theme
|
|
4360
|
+
]);
|
|
4361
|
+
React__default.useEffect(()=>{
|
|
4362
|
+
// Ensure expanded is always false when no toasts are present / only one left
|
|
4363
|
+
if (toasts.length <= 1) {
|
|
4364
|
+
setExpanded(false);
|
|
4365
|
+
}
|
|
4366
|
+
}, [
|
|
4367
|
+
toasts
|
|
4368
|
+
]);
|
|
4369
|
+
React__default.useEffect(()=>{
|
|
4370
|
+
const handleKeyDown = (event)=>{
|
|
4371
|
+
var _listRef_current;
|
|
4372
|
+
const isHotkeyPressed = hotkey.every((key)=>event[key] || event.code === key);
|
|
4373
|
+
if (isHotkeyPressed) {
|
|
4374
|
+
var _listRef_current1;
|
|
4375
|
+
setExpanded(true);
|
|
4376
|
+
(_listRef_current1 = listRef.current) == null ? void 0 : _listRef_current1.focus();
|
|
4377
|
+
}
|
|
4378
|
+
if (event.code === 'Escape' && (document.activeElement === listRef.current || ((_listRef_current = listRef.current) == null ? void 0 : _listRef_current.contains(document.activeElement)))) {
|
|
4379
|
+
setExpanded(false);
|
|
4380
|
+
}
|
|
4381
|
+
};
|
|
4382
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
4383
|
+
return ()=>document.removeEventListener('keydown', handleKeyDown);
|
|
4384
|
+
}, [
|
|
4385
|
+
hotkey
|
|
4386
|
+
]);
|
|
4387
|
+
React__default.useEffect(()=>{
|
|
4388
|
+
if (listRef.current) {
|
|
4389
|
+
return ()=>{
|
|
4390
|
+
if (lastFocusedElementRef.current) {
|
|
4391
|
+
lastFocusedElementRef.current.focus({
|
|
4392
|
+
preventScroll: true
|
|
4393
|
+
});
|
|
4394
|
+
lastFocusedElementRef.current = null;
|
|
4395
|
+
isFocusWithinRef.current = false;
|
|
4396
|
+
}
|
|
4397
|
+
};
|
|
4398
|
+
}
|
|
4399
|
+
}, [
|
|
4400
|
+
listRef.current
|
|
4401
|
+
]);
|
|
4402
|
+
return(// Remove item from normal navigation flow, only available via hotkey
|
|
4403
|
+
/*#__PURE__*/ React__default.createElement("section", {
|
|
4404
|
+
ref: ref,
|
|
4405
|
+
"aria-label": `${containerAriaLabel} ${hotkeyLabel}`,
|
|
4406
|
+
tabIndex: -1,
|
|
4407
|
+
"aria-live": "polite",
|
|
4408
|
+
"aria-relevant": "additions text",
|
|
4409
|
+
"aria-atomic": "false",
|
|
4410
|
+
suppressHydrationWarning: true
|
|
4411
|
+
}, possiblePositions.map((position, index)=>{
|
|
4412
|
+
var _heights_;
|
|
4413
|
+
const [y, x] = position.split('-');
|
|
4414
|
+
if (!toasts.length) return null;
|
|
4415
|
+
return /*#__PURE__*/ React__default.createElement("ol", {
|
|
4416
|
+
key: position,
|
|
4417
|
+
dir: dir === 'auto' ? getDocumentDirection() : dir,
|
|
4418
|
+
tabIndex: -1,
|
|
4419
|
+
ref: listRef,
|
|
4420
|
+
className: className,
|
|
4421
|
+
"data-sonner-toaster": true,
|
|
4422
|
+
"data-sonner-theme": actualTheme,
|
|
4423
|
+
"data-y-position": y,
|
|
4424
|
+
"data-lifted": expanded && toasts.length > 1 && !expand,
|
|
4425
|
+
"data-x-position": x,
|
|
4426
|
+
style: {
|
|
4427
|
+
'--front-toast-height': `${((_heights_ = heights[0]) == null ? void 0 : _heights_.height) || 0}px`,
|
|
4428
|
+
'--width': `${TOAST_WIDTH}px`,
|
|
4429
|
+
'--gap': `${gap}px`,
|
|
4430
|
+
...style,
|
|
4431
|
+
...assignOffset(offset, mobileOffset)
|
|
4432
|
+
},
|
|
4433
|
+
onBlur: (event)=>{
|
|
4434
|
+
if (isFocusWithinRef.current && !event.currentTarget.contains(event.relatedTarget)) {
|
|
4435
|
+
isFocusWithinRef.current = false;
|
|
4436
|
+
if (lastFocusedElementRef.current) {
|
|
4437
|
+
lastFocusedElementRef.current.focus({
|
|
4438
|
+
preventScroll: true
|
|
4439
|
+
});
|
|
4440
|
+
lastFocusedElementRef.current = null;
|
|
4441
|
+
}
|
|
4442
|
+
}
|
|
4443
|
+
},
|
|
4444
|
+
onFocus: (event)=>{
|
|
4445
|
+
const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';
|
|
4446
|
+
if (isNotDismissible) return;
|
|
4447
|
+
if (!isFocusWithinRef.current) {
|
|
4448
|
+
isFocusWithinRef.current = true;
|
|
4449
|
+
lastFocusedElementRef.current = event.relatedTarget;
|
|
4450
|
+
}
|
|
4451
|
+
},
|
|
4452
|
+
onMouseEnter: ()=>setExpanded(true),
|
|
4453
|
+
onMouseMove: ()=>setExpanded(true),
|
|
4454
|
+
onMouseLeave: ()=>{
|
|
4455
|
+
// Avoid setting expanded to false when interacting with a toast, e.g. swiping
|
|
4456
|
+
if (!interacting) {
|
|
4457
|
+
setExpanded(false);
|
|
4458
|
+
}
|
|
4459
|
+
},
|
|
4460
|
+
onDragEnd: ()=>setExpanded(false),
|
|
4461
|
+
onPointerDown: (event)=>{
|
|
4462
|
+
const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';
|
|
4463
|
+
if (isNotDismissible) return;
|
|
4464
|
+
setInteracting(true);
|
|
4465
|
+
},
|
|
4466
|
+
onPointerUp: ()=>setInteracting(false)
|
|
4467
|
+
}, toasts.filter((toast)=>!toast.position && index === 0 || toast.position === position).map((toast, index)=>{
|
|
4468
|
+
var _toastOptions_duration, _toastOptions_closeButton;
|
|
4469
|
+
return /*#__PURE__*/ React__default.createElement(Toast, {
|
|
4470
|
+
key: toast.id,
|
|
4471
|
+
icons: icons,
|
|
4472
|
+
index: index,
|
|
4473
|
+
toast: toast,
|
|
4474
|
+
defaultRichColors: richColors,
|
|
4475
|
+
duration: (_toastOptions_duration = toastOptions == null ? void 0 : toastOptions.duration) != null ? _toastOptions_duration : duration,
|
|
4476
|
+
className: toastOptions == null ? void 0 : toastOptions.className,
|
|
4477
|
+
descriptionClassName: toastOptions == null ? void 0 : toastOptions.descriptionClassName,
|
|
4478
|
+
invert: invert,
|
|
4479
|
+
visibleToasts: visibleToasts,
|
|
4480
|
+
closeButton: (_toastOptions_closeButton = toastOptions == null ? void 0 : toastOptions.closeButton) != null ? _toastOptions_closeButton : closeButton,
|
|
4481
|
+
interacting: interacting,
|
|
4482
|
+
position: position,
|
|
4483
|
+
style: toastOptions == null ? void 0 : toastOptions.style,
|
|
4484
|
+
unstyled: toastOptions == null ? void 0 : toastOptions.unstyled,
|
|
4485
|
+
classNames: toastOptions == null ? void 0 : toastOptions.classNames,
|
|
4486
|
+
cancelButtonStyle: toastOptions == null ? void 0 : toastOptions.cancelButtonStyle,
|
|
4487
|
+
actionButtonStyle: toastOptions == null ? void 0 : toastOptions.actionButtonStyle,
|
|
4488
|
+
closeButtonAriaLabel: toastOptions == null ? void 0 : toastOptions.closeButtonAriaLabel,
|
|
4489
|
+
removeToast: removeToast,
|
|
4490
|
+
toasts: toasts.filter((t)=>t.position == toast.position),
|
|
4491
|
+
heights: heights.filter((h)=>h.position == toast.position),
|
|
4492
|
+
setHeights: setHeights,
|
|
4493
|
+
expandByDefault: expand,
|
|
4494
|
+
gap: gap,
|
|
4495
|
+
expanded: expanded,
|
|
4496
|
+
swipeDirections: props.swipeDirections
|
|
4497
|
+
});
|
|
4498
|
+
}));
|
|
4499
|
+
})));
|
|
4500
|
+
});
|
|
4501
|
+
|
|
4502
|
+
const Toaster = (_a) => {
|
|
4503
|
+
var props = __rest(_a, []);
|
|
4504
|
+
const { theme = "system" } = z$1();
|
|
4505
|
+
return (React__default.createElement(Toaster$1, Object.assign({ theme: theme, className: "toaster group", style: {
|
|
4506
|
+
"--normal-bg": "var(--popover)",
|
|
4507
|
+
"--normal-text": "var(--popover-foreground)",
|
|
4508
|
+
"--normal-border": "var(--border)",
|
|
4509
|
+
} }, props)));
|
|
4510
|
+
};
|
|
4511
|
+
|
|
3372
4512
|
const appearance = {
|
|
3373
4513
|
variables: {
|
|
3374
4514
|
fontFamily: '-apple-system, BlinkMacSystemFont, "Geist", "Gill Sans", sans-serif'}};
|
|
@@ -3583,6 +4723,18 @@ const MotionConfigContext = createContext({
|
|
|
3583
4723
|
reducedMotion: "never",
|
|
3584
4724
|
});
|
|
3585
4725
|
|
|
4726
|
+
function isObject$1(value) {
|
|
4727
|
+
return typeof value === "object" && value !== null;
|
|
4728
|
+
}
|
|
4729
|
+
|
|
4730
|
+
/**
|
|
4731
|
+
* Checks if an element is an HTML element in a way
|
|
4732
|
+
* that works across iframes
|
|
4733
|
+
*/
|
|
4734
|
+
function isHTMLElement$1(element) {
|
|
4735
|
+
return isObject$1(element) && "offsetHeight" in element;
|
|
4736
|
+
}
|
|
4737
|
+
|
|
3586
4738
|
/**
|
|
3587
4739
|
* Measurement functionality has to be within a separate component
|
|
3588
4740
|
* to leverage snapshot lifecycle.
|
|
@@ -3592,7 +4744,9 @@ class PopChildMeasure extends React.Component {
|
|
|
3592
4744
|
const element = this.props.childRef.current;
|
|
3593
4745
|
if (element && prevProps.isPresent && !this.props.isPresent) {
|
|
3594
4746
|
const parent = element.offsetParent;
|
|
3595
|
-
const parentWidth = parent
|
|
4747
|
+
const parentWidth = isHTMLElement$1(parent)
|
|
4748
|
+
? parent.offsetWidth || 0
|
|
4749
|
+
: 0;
|
|
3596
4750
|
const size = this.props.sizeRef.current;
|
|
3597
4751
|
size.height = element.offsetHeight || 0;
|
|
3598
4752
|
size.width = element.offsetWidth || 0;
|
|
@@ -3652,7 +4806,9 @@ function PopChild({ children, isPresent, anchorX }) {
|
|
|
3652
4806
|
`);
|
|
3653
4807
|
}
|
|
3654
4808
|
return () => {
|
|
3655
|
-
document.head.
|
|
4809
|
+
if (document.head.contains(style)) {
|
|
4810
|
+
document.head.removeChild(style);
|
|
4811
|
+
}
|
|
3656
4812
|
};
|
|
3657
4813
|
}, [isPresent]);
|
|
3658
4814
|
return (jsx(PopChildMeasure, { isPresent: isPresent, childRef: ref, sizeRef: size, children: React.cloneElement(children, { ref }) }));
|
|
@@ -4679,8 +5835,6 @@ function isForcedMotionValue(key, { layout, layoutId }) {
|
|
|
4679
5835
|
(!!scaleCorrectors[key] || key === "opacity")));
|
|
4680
5836
|
}
|
|
4681
5837
|
|
|
4682
|
-
const isMotionValue = (value) => Boolean(value && value.getVelocity);
|
|
4683
|
-
|
|
4684
5838
|
/**
|
|
4685
5839
|
* Provided a value and a ValueType, returns the value as that value type.
|
|
4686
5840
|
*/
|
|
@@ -4927,6 +6081,8 @@ const createHtmlRenderState = () => ({
|
|
|
4927
6081
|
vars: {},
|
|
4928
6082
|
});
|
|
4929
6083
|
|
|
6084
|
+
const isMotionValue = (value) => Boolean(value && value.getVelocity);
|
|
6085
|
+
|
|
4930
6086
|
function copyRawValuesOnly(target, source, props) {
|
|
4931
6087
|
for (const key in source) {
|
|
4932
6088
|
if (!isMotionValue(source[key]) && !isForcedMotionValue(key, props)) {
|
|
@@ -4977,65 +6133,6 @@ function useHTMLProps(props, visualState) {
|
|
|
4977
6133
|
return htmlProps;
|
|
4978
6134
|
}
|
|
4979
6135
|
|
|
4980
|
-
/**
|
|
4981
|
-
* We keep these listed separately as we use the lowercase tag names as part
|
|
4982
|
-
* of the runtime bundle to detect SVG components
|
|
4983
|
-
*/
|
|
4984
|
-
const lowercaseSVGElements = [
|
|
4985
|
-
"animate",
|
|
4986
|
-
"circle",
|
|
4987
|
-
"defs",
|
|
4988
|
-
"desc",
|
|
4989
|
-
"ellipse",
|
|
4990
|
-
"g",
|
|
4991
|
-
"image",
|
|
4992
|
-
"line",
|
|
4993
|
-
"filter",
|
|
4994
|
-
"marker",
|
|
4995
|
-
"mask",
|
|
4996
|
-
"metadata",
|
|
4997
|
-
"path",
|
|
4998
|
-
"pattern",
|
|
4999
|
-
"polygon",
|
|
5000
|
-
"polyline",
|
|
5001
|
-
"rect",
|
|
5002
|
-
"stop",
|
|
5003
|
-
"switch",
|
|
5004
|
-
"symbol",
|
|
5005
|
-
"svg",
|
|
5006
|
-
"text",
|
|
5007
|
-
"tspan",
|
|
5008
|
-
"use",
|
|
5009
|
-
"view",
|
|
5010
|
-
];
|
|
5011
|
-
|
|
5012
|
-
function isSVGComponent(Component) {
|
|
5013
|
-
if (
|
|
5014
|
-
/**
|
|
5015
|
-
* If it's not a string, it's a custom React component. Currently we only support
|
|
5016
|
-
* HTML custom React components.
|
|
5017
|
-
*/
|
|
5018
|
-
typeof Component !== "string" ||
|
|
5019
|
-
/**
|
|
5020
|
-
* If it contains a dash, the element is a custom HTML webcomponent.
|
|
5021
|
-
*/
|
|
5022
|
-
Component.includes("-")) {
|
|
5023
|
-
return false;
|
|
5024
|
-
}
|
|
5025
|
-
else if (
|
|
5026
|
-
/**
|
|
5027
|
-
* If it's in our list of lowercase SVG tags, it's an SVG component
|
|
5028
|
-
*/
|
|
5029
|
-
lowercaseSVGElements.indexOf(Component) > -1 ||
|
|
5030
|
-
/**
|
|
5031
|
-
* If it contains a capital letter, it's an SVG component
|
|
5032
|
-
*/
|
|
5033
|
-
/[A-Z]/u.test(Component)) {
|
|
5034
|
-
return true;
|
|
5035
|
-
}
|
|
5036
|
-
return false;
|
|
5037
|
-
}
|
|
5038
|
-
|
|
5039
6136
|
const dashKeys = {
|
|
5040
6137
|
offset: "stroke-dashoffset",
|
|
5041
6138
|
array: "stroke-dasharray",
|
|
@@ -5070,7 +6167,7 @@ function buildSVGPath(attrs, length, spacing = 1, offset = 0, useDashCase = true
|
|
|
5070
6167
|
*/
|
|
5071
6168
|
function buildSVGAttrs(state, { attrX, attrY, attrScale, pathLength, pathSpacing = 1, pathOffset = 0,
|
|
5072
6169
|
// This is object creation, which we try to avoid per-frame.
|
|
5073
|
-
...latest }, isSVGTag, transformTemplate) {
|
|
6170
|
+
...latest }, isSVGTag, transformTemplate, styleProp) {
|
|
5074
6171
|
buildHTMLStyles(state, latest, transformTemplate);
|
|
5075
6172
|
/**
|
|
5076
6173
|
* For svg tags we just want to make sure viewBox is animatable and treat all the styles
|
|
@@ -5102,7 +6199,7 @@ function buildSVGAttrs(state, { attrX, attrY, attrScale, pathLength, pathSpacing
|
|
|
5102
6199
|
* SVG's element transform-origin uses its own median as a reference.
|
|
5103
6200
|
* Therefore, transformBox becomes a fill-box
|
|
5104
6201
|
*/
|
|
5105
|
-
style.transformBox = "fill-box";
|
|
6202
|
+
style.transformBox = styleProp?.transformBox ?? "fill-box";
|
|
5106
6203
|
delete attrs.transformBox;
|
|
5107
6204
|
}
|
|
5108
6205
|
// Render attrX/attrY/attrScale as attributes
|
|
@@ -5128,7 +6225,7 @@ const isSVGTag = (tag) => typeof tag === "string" && tag.toLowerCase() === "svg"
|
|
|
5128
6225
|
function useSVGProps(props, visualState, _isStatic, Component) {
|
|
5129
6226
|
const visualProps = useMemo(() => {
|
|
5130
6227
|
const state = createSvgRenderState();
|
|
5131
|
-
buildSVGAttrs(state, visualState, isSVGTag(Component), props.transformTemplate);
|
|
6228
|
+
buildSVGAttrs(state, visualState, isSVGTag(Component), props.transformTemplate, props.style);
|
|
5132
6229
|
return {
|
|
5133
6230
|
...state.attrs,
|
|
5134
6231
|
style: { ...state.style },
|
|
@@ -5142,6 +6239,65 @@ function useSVGProps(props, visualState, _isStatic, Component) {
|
|
|
5142
6239
|
return visualProps;
|
|
5143
6240
|
}
|
|
5144
6241
|
|
|
6242
|
+
/**
|
|
6243
|
+
* We keep these listed separately as we use the lowercase tag names as part
|
|
6244
|
+
* of the runtime bundle to detect SVG components
|
|
6245
|
+
*/
|
|
6246
|
+
const lowercaseSVGElements = [
|
|
6247
|
+
"animate",
|
|
6248
|
+
"circle",
|
|
6249
|
+
"defs",
|
|
6250
|
+
"desc",
|
|
6251
|
+
"ellipse",
|
|
6252
|
+
"g",
|
|
6253
|
+
"image",
|
|
6254
|
+
"line",
|
|
6255
|
+
"filter",
|
|
6256
|
+
"marker",
|
|
6257
|
+
"mask",
|
|
6258
|
+
"metadata",
|
|
6259
|
+
"path",
|
|
6260
|
+
"pattern",
|
|
6261
|
+
"polygon",
|
|
6262
|
+
"polyline",
|
|
6263
|
+
"rect",
|
|
6264
|
+
"stop",
|
|
6265
|
+
"switch",
|
|
6266
|
+
"symbol",
|
|
6267
|
+
"svg",
|
|
6268
|
+
"text",
|
|
6269
|
+
"tspan",
|
|
6270
|
+
"use",
|
|
6271
|
+
"view",
|
|
6272
|
+
];
|
|
6273
|
+
|
|
6274
|
+
function isSVGComponent(Component) {
|
|
6275
|
+
if (
|
|
6276
|
+
/**
|
|
6277
|
+
* If it's not a string, it's a custom React component. Currently we only support
|
|
6278
|
+
* HTML custom React components.
|
|
6279
|
+
*/
|
|
6280
|
+
typeof Component !== "string" ||
|
|
6281
|
+
/**
|
|
6282
|
+
* If it contains a dash, the element is a custom HTML webcomponent.
|
|
6283
|
+
*/
|
|
6284
|
+
Component.includes("-")) {
|
|
6285
|
+
return false;
|
|
6286
|
+
}
|
|
6287
|
+
else if (
|
|
6288
|
+
/**
|
|
6289
|
+
* If it's in our list of lowercase SVG tags, it's an SVG component
|
|
6290
|
+
*/
|
|
6291
|
+
lowercaseSVGElements.indexOf(Component) > -1 ||
|
|
6292
|
+
/**
|
|
6293
|
+
* If it contains a capital letter, it's an SVG component
|
|
6294
|
+
*/
|
|
6295
|
+
/[A-Z]/u.test(Component)) {
|
|
6296
|
+
return true;
|
|
6297
|
+
}
|
|
6298
|
+
return false;
|
|
6299
|
+
}
|
|
6300
|
+
|
|
5145
6301
|
function createUseRender(forwardMotionProps = false) {
|
|
5146
6302
|
const useRender = (Component, props, ref, { latestValues }, isStatic) => {
|
|
5147
6303
|
const useVisualProps = isSVGComponent(Component)
|
|
@@ -5453,11 +6609,6 @@ class MotionValue {
|
|
|
5453
6609
|
* - `transformer`: A function to transform incoming values with.
|
|
5454
6610
|
*/
|
|
5455
6611
|
constructor(init, options = {}) {
|
|
5456
|
-
/**
|
|
5457
|
-
* This will be replaced by the build step with the latest version number.
|
|
5458
|
-
* When MotionValues are provided to motion components, warn if versions are mixed.
|
|
5459
|
-
*/
|
|
5460
|
-
this.version = "12.9.1";
|
|
5461
6612
|
/**
|
|
5462
6613
|
* Tracks whether this value can output a velocity. Currently this is only true
|
|
5463
6614
|
* if the value is numerical, but we might be able to widen the scope here and support
|
|
@@ -5485,6 +6636,11 @@ class MotionValue {
|
|
|
5485
6636
|
// Update update subscribers
|
|
5486
6637
|
if (this.current !== this.prev) {
|
|
5487
6638
|
this.events.change?.notify(this.current);
|
|
6639
|
+
if (this.dependents) {
|
|
6640
|
+
for (const dependent of this.dependents) {
|
|
6641
|
+
dependent.dirty();
|
|
6642
|
+
}
|
|
6643
|
+
}
|
|
5488
6644
|
}
|
|
5489
6645
|
// Update render subscribers
|
|
5490
6646
|
if (render) {
|
|
@@ -5626,6 +6782,20 @@ class MotionValue {
|
|
|
5626
6782
|
if (this.stopPassiveEffect)
|
|
5627
6783
|
this.stopPassiveEffect();
|
|
5628
6784
|
}
|
|
6785
|
+
dirty() {
|
|
6786
|
+
this.events.change?.notify(this.current);
|
|
6787
|
+
}
|
|
6788
|
+
addDependent(dependent) {
|
|
6789
|
+
if (!this.dependents) {
|
|
6790
|
+
this.dependents = new Set();
|
|
6791
|
+
}
|
|
6792
|
+
this.dependents.add(dependent);
|
|
6793
|
+
}
|
|
6794
|
+
removeDependent(dependent) {
|
|
6795
|
+
if (this.dependents) {
|
|
6796
|
+
this.dependents.delete(dependent);
|
|
6797
|
+
}
|
|
6798
|
+
}
|
|
5629
6799
|
/**
|
|
5630
6800
|
* Returns the latest state of `MotionValue`
|
|
5631
6801
|
*
|
|
@@ -5721,6 +6891,7 @@ class MotionValue {
|
|
|
5721
6891
|
* @public
|
|
5722
6892
|
*/
|
|
5723
6893
|
destroy() {
|
|
6894
|
+
this.dependents?.clear();
|
|
5724
6895
|
this.events.destroy?.notify();
|
|
5725
6896
|
this.clearListeners();
|
|
5726
6897
|
this.stop();
|
|
@@ -6300,7 +7471,7 @@ function mix(from, to, p) {
|
|
|
6300
7471
|
const frameloopDriver = (update) => {
|
|
6301
7472
|
const passTimestamp = ({ timestamp }) => update(timestamp);
|
|
6302
7473
|
return {
|
|
6303
|
-
start: () => frame.update(passTimestamp,
|
|
7474
|
+
start: (keepAlive = true) => frame.update(passTimestamp, keepAlive),
|
|
6304
7475
|
stop: () => cancelFrame(passTimestamp),
|
|
6305
7476
|
/**
|
|
6306
7477
|
* If we're processing this frame we can use the
|
|
@@ -6759,7 +7930,7 @@ function createMixers(output, ease, customMixer) {
|
|
|
6759
7930
|
* mixColor(0.5) // 'rgba(128, 128, 128, 1)'
|
|
6760
7931
|
* ```
|
|
6761
7932
|
*
|
|
6762
|
-
* TODO
|
|
7933
|
+
* TODO Revisit this approach once we've moved to data models for values,
|
|
6763
7934
|
* probably not needed to pregenerate mixer functions.
|
|
6764
7935
|
*
|
|
6765
7936
|
* @public
|
|
@@ -6994,14 +8165,12 @@ function replaceTransitionType(transition) {
|
|
|
6994
8165
|
|
|
6995
8166
|
class WithPromise {
|
|
6996
8167
|
constructor() {
|
|
6997
|
-
this.count = 0;
|
|
6998
8168
|
this.updateFinished();
|
|
6999
8169
|
}
|
|
7000
8170
|
get finished() {
|
|
7001
8171
|
return this._finished;
|
|
7002
8172
|
}
|
|
7003
8173
|
updateFinished() {
|
|
7004
|
-
this.count++;
|
|
7005
8174
|
this._finished = new Promise((resolve) => {
|
|
7006
8175
|
this.resolve = resolve;
|
|
7007
8176
|
});
|
|
@@ -7042,17 +8211,18 @@ class JSAnimation extends WithPromise {
|
|
|
7042
8211
|
* This method is bound to the instance to fix a pattern where
|
|
7043
8212
|
* animation.stop is returned as a reference from a useEffect.
|
|
7044
8213
|
*/
|
|
7045
|
-
this.stop = () => {
|
|
7046
|
-
|
|
7047
|
-
|
|
7048
|
-
|
|
8214
|
+
this.stop = (sync = true) => {
|
|
8215
|
+
if (sync) {
|
|
8216
|
+
const { motionValue } = this.options;
|
|
8217
|
+
if (motionValue && motionValue.updatedAt !== time.now()) {
|
|
8218
|
+
this.tick(time.now());
|
|
8219
|
+
}
|
|
7049
8220
|
}
|
|
7050
8221
|
this.isStopped = true;
|
|
7051
8222
|
if (this.state === "idle")
|
|
7052
8223
|
return;
|
|
7053
8224
|
this.teardown();
|
|
7054
|
-
|
|
7055
|
-
onStop && onStop();
|
|
8225
|
+
this.options.onStop?.();
|
|
7056
8226
|
};
|
|
7057
8227
|
this.options = options;
|
|
7058
8228
|
this.initAnimation();
|
|
@@ -7252,6 +8422,7 @@ class JSAnimation extends WithPromise {
|
|
|
7252
8422
|
else if (this.driver) {
|
|
7253
8423
|
this.startTime = this.driver.now() - newTime / this.playbackSpeed;
|
|
7254
8424
|
}
|
|
8425
|
+
this.driver?.start(false);
|
|
7255
8426
|
}
|
|
7256
8427
|
get speed() {
|
|
7257
8428
|
return this.playbackSpeed;
|
|
@@ -7267,11 +8438,11 @@ class JSAnimation extends WithPromise {
|
|
|
7267
8438
|
play() {
|
|
7268
8439
|
if (this.isStopped)
|
|
7269
8440
|
return;
|
|
7270
|
-
const { driver = frameloopDriver,
|
|
8441
|
+
const { driver = frameloopDriver, startTime } = this.options;
|
|
7271
8442
|
if (!this.driver) {
|
|
7272
8443
|
this.driver = driver((timestamp) => this.tick(timestamp));
|
|
7273
8444
|
}
|
|
7274
|
-
onPlay
|
|
8445
|
+
this.options.onPlay?.();
|
|
7275
8446
|
const now = this.driver.now();
|
|
7276
8447
|
if (this.state === "finished") {
|
|
7277
8448
|
this.updateFinished();
|
|
@@ -7307,19 +8478,19 @@ class JSAnimation extends WithPromise {
|
|
|
7307
8478
|
this.holdTime = null;
|
|
7308
8479
|
}
|
|
7309
8480
|
finish() {
|
|
8481
|
+
this.notifyFinished();
|
|
7310
8482
|
this.teardown();
|
|
7311
8483
|
this.state = "finished";
|
|
7312
|
-
|
|
7313
|
-
onComplete && onComplete();
|
|
8484
|
+
this.options.onComplete?.();
|
|
7314
8485
|
}
|
|
7315
8486
|
cancel() {
|
|
7316
8487
|
this.holdTime = null;
|
|
7317
8488
|
this.startTime = 0;
|
|
7318
8489
|
this.tick(0);
|
|
7319
8490
|
this.teardown();
|
|
8491
|
+
this.options.onCancel?.();
|
|
7320
8492
|
}
|
|
7321
8493
|
teardown() {
|
|
7322
|
-
this.notifyFinished();
|
|
7323
8494
|
this.state = "idle";
|
|
7324
8495
|
this.stopDriver();
|
|
7325
8496
|
this.startTime = this.holdTime = null;
|
|
@@ -7340,6 +8511,7 @@ class JSAnimation extends WithPromise {
|
|
|
7340
8511
|
this.options.ease = "linear";
|
|
7341
8512
|
this.initAnimation();
|
|
7342
8513
|
}
|
|
8514
|
+
this.driver?.stop();
|
|
7343
8515
|
return timeline.observe(this);
|
|
7344
8516
|
}
|
|
7345
8517
|
}
|
|
@@ -7524,11 +8696,7 @@ function flushKeyframeResolvers() {
|
|
|
7524
8696
|
}
|
|
7525
8697
|
class KeyframeResolver {
|
|
7526
8698
|
constructor(unresolvedKeyframes, onComplete, name, motionValue, element, isAsync = false) {
|
|
7527
|
-
|
|
7528
|
-
* Track whether this resolver has completed. Once complete, it never
|
|
7529
|
-
* needs to attempt keyframe resolution again.
|
|
7530
|
-
*/
|
|
7531
|
-
this.isComplete = false;
|
|
8699
|
+
this.state = "pending";
|
|
7532
8700
|
/**
|
|
7533
8701
|
* Track whether this resolver is async. If it is, it'll be added to the
|
|
7534
8702
|
* resolver queue and flushed in the next frame. Resolvers that aren't going
|
|
@@ -7540,11 +8708,6 @@ class KeyframeResolver {
|
|
|
7540
8708
|
* to resolve its keyframes.
|
|
7541
8709
|
*/
|
|
7542
8710
|
this.needsMeasurement = false;
|
|
7543
|
-
/**
|
|
7544
|
-
* Track whether this resolver is currently scheduled to resolve
|
|
7545
|
-
* to allow it to be cancelled and resumed externally.
|
|
7546
|
-
*/
|
|
7547
|
-
this.isScheduled = false;
|
|
7548
8711
|
this.unresolvedKeyframes = [...unresolvedKeyframes];
|
|
7549
8712
|
this.onComplete = onComplete;
|
|
7550
8713
|
this.name = name;
|
|
@@ -7553,7 +8716,7 @@ class KeyframeResolver {
|
|
|
7553
8716
|
this.isAsync = isAsync;
|
|
7554
8717
|
}
|
|
7555
8718
|
scheduleResolve() {
|
|
7556
|
-
this.
|
|
8719
|
+
this.state = "scheduled";
|
|
7557
8720
|
if (this.isAsync) {
|
|
7558
8721
|
toResolve.add(this);
|
|
7559
8722
|
if (!isScheduled) {
|
|
@@ -7596,19 +8759,19 @@ class KeyframeResolver {
|
|
|
7596
8759
|
measureInitialState() { }
|
|
7597
8760
|
renderEndStyles() { }
|
|
7598
8761
|
measureEndState() { }
|
|
7599
|
-
complete(
|
|
7600
|
-
this.
|
|
7601
|
-
this.onComplete(this.unresolvedKeyframes, this.finalKeyframe,
|
|
8762
|
+
complete(isForcedComplete = false) {
|
|
8763
|
+
this.state = "complete";
|
|
8764
|
+
this.onComplete(this.unresolvedKeyframes, this.finalKeyframe, isForcedComplete);
|
|
7602
8765
|
toResolve.delete(this);
|
|
7603
8766
|
}
|
|
7604
8767
|
cancel() {
|
|
7605
|
-
if (
|
|
7606
|
-
this.isScheduled = false;
|
|
8768
|
+
if (this.state === "scheduled") {
|
|
7607
8769
|
toResolve.delete(this);
|
|
8770
|
+
this.state = "pending";
|
|
7608
8771
|
}
|
|
7609
8772
|
}
|
|
7610
8773
|
resume() {
|
|
7611
|
-
if (
|
|
8774
|
+
if (this.state === "pending")
|
|
7612
8775
|
this.scheduleResolve();
|
|
7613
8776
|
}
|
|
7614
8777
|
}
|
|
@@ -7771,10 +8934,6 @@ class NativeAnimation extends WithPromise {
|
|
|
7771
8934
|
onComplete?.();
|
|
7772
8935
|
this.notifyFinished();
|
|
7773
8936
|
};
|
|
7774
|
-
/**
|
|
7775
|
-
* TODO: In a breaking change, we should replace this with `.notifyCancel()`
|
|
7776
|
-
*/
|
|
7777
|
-
this.animation.oncancel = () => this.notifyFinished();
|
|
7778
8937
|
}
|
|
7779
8938
|
play() {
|
|
7780
8939
|
if (this.isStopped)
|
|
@@ -8028,16 +9187,13 @@ const acceleratedValues = new Set([
|
|
|
8028
9187
|
"clipPath",
|
|
8029
9188
|
"filter",
|
|
8030
9189
|
"transform",
|
|
8031
|
-
// TODO:
|
|
8032
|
-
// or until we implement support for linear() easing.
|
|
9190
|
+
// TODO: Could be re-enabled now we have support for linear() easing
|
|
8033
9191
|
// "background-color"
|
|
8034
9192
|
]);
|
|
8035
9193
|
const supportsWaapi = /*@__PURE__*/ memo(() => Object.hasOwnProperty.call(Element.prototype, "animate"));
|
|
8036
9194
|
function supportsBrowserAnimation(options) {
|
|
8037
9195
|
const { motionValue, name, repeatDelay, repeatType, damping, type } = options;
|
|
8038
|
-
if (!motionValue
|
|
8039
|
-
!motionValue.owner ||
|
|
8040
|
-
!(motionValue.owner.current instanceof HTMLElement)) {
|
|
9196
|
+
if (!isHTMLElement$1(motionValue?.owner?.current)) {
|
|
8041
9197
|
return false;
|
|
8042
9198
|
}
|
|
8043
9199
|
const { onUpdate, transformTemplate } = motionValue.owner.getProps();
|
|
@@ -8076,9 +9232,7 @@ class AsyncMotionValueAnimation extends WithPromise {
|
|
|
8076
9232
|
this._animation.stop();
|
|
8077
9233
|
this.stopTimeline?.();
|
|
8078
9234
|
}
|
|
8079
|
-
|
|
8080
|
-
this.keyframeResolver?.cancel();
|
|
8081
|
-
}
|
|
9235
|
+
this.keyframeResolver?.cancel();
|
|
8082
9236
|
};
|
|
8083
9237
|
this.createdAt = time.now();
|
|
8084
9238
|
const optionsWithDefaults = {
|
|
@@ -8169,6 +9323,7 @@ class AsyncMotionValueAnimation extends WithPromise {
|
|
|
8169
9323
|
}
|
|
8170
9324
|
get animation() {
|
|
8171
9325
|
if (!this._animation) {
|
|
9326
|
+
this.keyframeResolver?.resume();
|
|
8172
9327
|
flushKeyframeResolvers();
|
|
8173
9328
|
}
|
|
8174
9329
|
return this._animation;
|
|
@@ -8213,7 +9368,10 @@ class AsyncMotionValueAnimation extends WithPromise {
|
|
|
8213
9368
|
this.animation.complete();
|
|
8214
9369
|
}
|
|
8215
9370
|
cancel() {
|
|
8216
|
-
this.
|
|
9371
|
+
if (this._animation) {
|
|
9372
|
+
this.animation.cancel();
|
|
9373
|
+
}
|
|
9374
|
+
this.keyframeResolver?.cancel();
|
|
8217
9375
|
}
|
|
8218
9376
|
}
|
|
8219
9377
|
|
|
@@ -8303,7 +9461,9 @@ const animateMotionValue = (name, value, target, transition = {}, element, isHan
|
|
|
8303
9461
|
return;
|
|
8304
9462
|
}
|
|
8305
9463
|
}
|
|
8306
|
-
return
|
|
9464
|
+
return valueTransition.isSync
|
|
9465
|
+
? new JSAnimation(options)
|
|
9466
|
+
: new AsyncMotionValueAnimation(options);
|
|
8307
9467
|
};
|
|
8308
9468
|
|
|
8309
9469
|
const positionalKeys = new Set([
|
|
@@ -10174,7 +11334,7 @@ class MeasureLayoutWithContext extends Component {
|
|
|
10174
11334
|
}
|
|
10175
11335
|
getSnapshotBeforeUpdate(prevProps) {
|
|
10176
11336
|
const { layoutDependency, visualElement, drag, isPresent } = this.props;
|
|
10177
|
-
const projection = visualElement
|
|
11337
|
+
const { projection } = visualElement;
|
|
10178
11338
|
if (!projection)
|
|
10179
11339
|
return null;
|
|
10180
11340
|
/**
|
|
@@ -10272,10 +11432,6 @@ function animateSingleValue(value, keyframes, options) {
|
|
|
10272
11432
|
return motionValue$1.animation;
|
|
10273
11433
|
}
|
|
10274
11434
|
|
|
10275
|
-
function isSVGElement(element) {
|
|
10276
|
-
return element instanceof SVGElement && element.tagName !== "svg";
|
|
10277
|
-
}
|
|
10278
|
-
|
|
10279
11435
|
const compareByDepth = (a, b) => a.depth - b.depth;
|
|
10280
11436
|
|
|
10281
11437
|
class FlatTree {
|
|
@@ -10662,6 +11818,22 @@ function buildProjectionTransform(delta, treeScale, latestTransform) {
|
|
|
10662
11818
|
return transform || "none";
|
|
10663
11819
|
}
|
|
10664
11820
|
|
|
11821
|
+
/**
|
|
11822
|
+
* Checks if an element is an SVG element in a way
|
|
11823
|
+
* that works across iframes
|
|
11824
|
+
*/
|
|
11825
|
+
function isSVGElement(element) {
|
|
11826
|
+
return isObject$1(element) && "ownerSVGElement" in element;
|
|
11827
|
+
}
|
|
11828
|
+
|
|
11829
|
+
/**
|
|
11830
|
+
* Checks if an element is specifically an SVGSVGElement (the root SVG element)
|
|
11831
|
+
* in a way that works across iframes
|
|
11832
|
+
*/
|
|
11833
|
+
function isSVGSVGElement(element) {
|
|
11834
|
+
return isSVGElement(element) && element.tagName === "svg";
|
|
11835
|
+
}
|
|
11836
|
+
|
|
10665
11837
|
const transformAxes = ["", "X", "Y", "Z"];
|
|
10666
11838
|
const hiddenVisibility = { visibility: "hidden" };
|
|
10667
11839
|
/**
|
|
@@ -10855,10 +12027,10 @@ function createProjectionNode({ attachResizeListener, defaultParent, measureScro
|
|
|
10855
12027
|
/**
|
|
10856
12028
|
* Lifecycles
|
|
10857
12029
|
*/
|
|
10858
|
-
mount(instance
|
|
12030
|
+
mount(instance) {
|
|
10859
12031
|
if (this.instance)
|
|
10860
12032
|
return;
|
|
10861
|
-
this.isSVG = isSVGElement(instance);
|
|
12033
|
+
this.isSVG = isSVGElement(instance) && !isSVGSVGElement(instance);
|
|
10862
12034
|
this.instance = instance;
|
|
10863
12035
|
const { layoutId, layout, visualElement } = this.options;
|
|
10864
12036
|
if (visualElement && !visualElement.current) {
|
|
@@ -10866,7 +12038,7 @@ function createProjectionNode({ attachResizeListener, defaultParent, measureScro
|
|
|
10866
12038
|
}
|
|
10867
12039
|
this.root.nodes.add(this);
|
|
10868
12040
|
this.parent && this.parent.children.add(this);
|
|
10869
|
-
if (
|
|
12041
|
+
if (this.root.hasTreeAnimated && (layout || layoutId)) {
|
|
10870
12042
|
this.isLayoutDirty = true;
|
|
10871
12043
|
}
|
|
10872
12044
|
if (attachResizeListener) {
|
|
@@ -10964,6 +12136,7 @@ function createProjectionNode({ attachResizeListener, defaultParent, measureScro
|
|
|
10964
12136
|
stack && stack.remove(this);
|
|
10965
12137
|
this.parent && this.parent.children.delete(this);
|
|
10966
12138
|
this.instance = undefined;
|
|
12139
|
+
this.eventHandlers.clear();
|
|
10967
12140
|
cancelFrame(this.updateProjection);
|
|
10968
12141
|
}
|
|
10969
12142
|
// only on the root
|
|
@@ -11165,7 +12338,7 @@ function createProjectionNode({ attachResizeListener, defaultParent, measureScro
|
|
|
11165
12338
|
this.scroll.phase === phase) {
|
|
11166
12339
|
needsMeasurement = false;
|
|
11167
12340
|
}
|
|
11168
|
-
if (needsMeasurement) {
|
|
12341
|
+
if (needsMeasurement && this.instance) {
|
|
11169
12342
|
const isRoot = checkIsScrollRoot(this.instance);
|
|
11170
12343
|
this.scroll = {
|
|
11171
12344
|
animationId: this.root.animationId,
|
|
@@ -11189,6 +12362,7 @@ function createProjectionNode({ attachResizeListener, defaultParent, measureScro
|
|
|
11189
12362
|
: undefined;
|
|
11190
12363
|
const transformTemplateHasChanged = transformTemplateValue !== this.prevTransformTemplateValue;
|
|
11191
12364
|
if (isResetRequested &&
|
|
12365
|
+
this.instance &&
|
|
11192
12366
|
(hasProjection ||
|
|
11193
12367
|
hasTransform(this.latestValues) ||
|
|
11194
12368
|
transformTemplateHasChanged)) {
|
|
@@ -11660,10 +12834,8 @@ function createProjectionNode({ attachResizeListener, defaultParent, measureScro
|
|
|
11660
12834
|
}
|
|
11661
12835
|
startAnimation(options) {
|
|
11662
12836
|
this.notifyListeners("animationStart");
|
|
11663
|
-
this.currentAnimation
|
|
11664
|
-
|
|
11665
|
-
this.resumingFrom.currentAnimation.stop();
|
|
11666
|
-
}
|
|
12837
|
+
this.currentAnimation?.stop(false);
|
|
12838
|
+
this.resumingFrom?.currentAnimation?.stop(false);
|
|
11667
12839
|
if (this.pendingAnimation) {
|
|
11668
12840
|
cancelFrame(this.pendingAnimation);
|
|
11669
12841
|
this.pendingAnimation = undefined;
|
|
@@ -11675,8 +12847,10 @@ function createProjectionNode({ attachResizeListener, defaultParent, measureScro
|
|
|
11675
12847
|
*/
|
|
11676
12848
|
this.pendingAnimation = frame.update(() => {
|
|
11677
12849
|
globalProjectionState.hasAnimatedSinceResize = true;
|
|
11678
|
-
this.
|
|
12850
|
+
this.motionValue || (this.motionValue = motionValue(0));
|
|
12851
|
+
this.currentAnimation = animateSingleValue(this.motionValue, [0, 1000], {
|
|
11679
12852
|
...options,
|
|
12853
|
+
isSync: true,
|
|
11680
12854
|
onUpdate: (latest) => {
|
|
11681
12855
|
this.mixTargetDelta(latest);
|
|
11682
12856
|
options.onUpdate && options.onUpdate(latest);
|
|
@@ -11710,7 +12884,7 @@ function createProjectionNode({ attachResizeListener, defaultParent, measureScro
|
|
|
11710
12884
|
finishAnimation() {
|
|
11711
12885
|
if (this.currentAnimation) {
|
|
11712
12886
|
this.mixTargetDelta && this.mixTargetDelta(animationTarget);
|
|
11713
|
-
this.currentAnimation.stop();
|
|
12887
|
+
this.currentAnimation.stop(false);
|
|
11714
12888
|
}
|
|
11715
12889
|
this.completeAnimation();
|
|
11716
12890
|
}
|
|
@@ -11975,7 +13149,7 @@ function createProjectionNode({ attachResizeListener, defaultParent, measureScro
|
|
|
11975
13149
|
}
|
|
11976
13150
|
// Only run on root
|
|
11977
13151
|
resetTree() {
|
|
11978
|
-
this.root.nodes.forEach((node) => node.currentAnimation?.stop());
|
|
13152
|
+
this.root.nodes.forEach((node) => node.currentAnimation?.stop(false));
|
|
11979
13153
|
this.root.nodes.forEach(clearMeasurements);
|
|
11980
13154
|
this.root.sharedNodes.clear();
|
|
11981
13155
|
}
|
|
@@ -12447,17 +13621,19 @@ function press(targetOrSelector, onPressStart, options = {}) {
|
|
|
12447
13621
|
const [targets, eventOptions, cancelEvents] = setupGesture(targetOrSelector, options);
|
|
12448
13622
|
const startPress = (startEvent) => {
|
|
12449
13623
|
const target = startEvent.currentTarget;
|
|
12450
|
-
if (!isValidPressEvent(startEvent)
|
|
13624
|
+
if (!isValidPressEvent(startEvent))
|
|
12451
13625
|
return;
|
|
12452
13626
|
isPressing.add(target);
|
|
12453
13627
|
const onPressEnd = onPressStart(target, startEvent);
|
|
12454
13628
|
const onPointerEnd = (endEvent, success) => {
|
|
12455
13629
|
window.removeEventListener("pointerup", onPointerUp);
|
|
12456
13630
|
window.removeEventListener("pointercancel", onPointerCancel);
|
|
12457
|
-
if (
|
|
13631
|
+
if (isPressing.has(target)) {
|
|
13632
|
+
isPressing.delete(target);
|
|
13633
|
+
}
|
|
13634
|
+
if (!isValidPressEvent(endEvent)) {
|
|
12458
13635
|
return;
|
|
12459
13636
|
}
|
|
12460
|
-
isPressing.delete(target);
|
|
12461
13637
|
if (typeof onPressEnd === "function") {
|
|
12462
13638
|
onPressEnd(endEvent, { success });
|
|
12463
13639
|
}
|
|
@@ -12477,7 +13653,7 @@ function press(targetOrSelector, onPressStart, options = {}) {
|
|
|
12477
13653
|
targets.forEach((target) => {
|
|
12478
13654
|
const pointerDownTarget = options.useGlobalTarget ? window : target;
|
|
12479
13655
|
pointerDownTarget.addEventListener("pointerdown", startPress, eventOptions);
|
|
12480
|
-
if (target
|
|
13656
|
+
if (isHTMLElement$1(target)) {
|
|
12481
13657
|
target.addEventListener("focus", (event) => enableKeyboardPress(event, eventOptions));
|
|
12482
13658
|
if (!isElementKeyboardAccessible(target) &&
|
|
12483
13659
|
!target.hasAttribute("tabindex")) {
|
|
@@ -12684,13 +13860,6 @@ function updateMotionValuesFromProps(element, next, prev) {
|
|
|
12684
13860
|
* to our visual element's motion value map.
|
|
12685
13861
|
*/
|
|
12686
13862
|
element.addValue(key, nextValue);
|
|
12687
|
-
/**
|
|
12688
|
-
* Check the version of the incoming motion value with this version
|
|
12689
|
-
* and warn against mismatches.
|
|
12690
|
-
*/
|
|
12691
|
-
if (process.env.NODE_ENV === "development") {
|
|
12692
|
-
warnOnce(nextValue.version === "12.9.2", `Attempting to mix Motion versions ${nextValue.version} with 12.9.2 may not work as expected.`);
|
|
12693
|
-
}
|
|
12694
13863
|
}
|
|
12695
13864
|
else if (isMotionValue(prevValue)) {
|
|
12696
13865
|
/**
|
|
@@ -13422,7 +14591,7 @@ class DOMKeyframesResolver extends KeyframeResolver {
|
|
|
13422
14591
|
}
|
|
13423
14592
|
}
|
|
13424
14593
|
}
|
|
13425
|
-
else {
|
|
14594
|
+
else if (positionalValues[name]) {
|
|
13426
14595
|
/**
|
|
13427
14596
|
* Else, the only way to resolve this is by measuring the element.
|
|
13428
14597
|
*/
|
|
@@ -13538,7 +14707,9 @@ class HTMLVisualElement extends DOMVisualElement {
|
|
|
13538
14707
|
}
|
|
13539
14708
|
readValueFromInstance(instance, key) {
|
|
13540
14709
|
if (transformProps.has(key)) {
|
|
13541
|
-
return
|
|
14710
|
+
return this.projection?.isProjecting
|
|
14711
|
+
? defaultTransformValue(key)
|
|
14712
|
+
: readTransformValue(instance, key);
|
|
13542
14713
|
}
|
|
13543
14714
|
else {
|
|
13544
14715
|
const computedStyle = getComputedStyle$1(instance);
|
|
@@ -13617,7 +14788,7 @@ class SVGVisualElement extends DOMVisualElement {
|
|
|
13617
14788
|
return scrapeMotionValuesFromProps(props, prevProps, visualElement);
|
|
13618
14789
|
}
|
|
13619
14790
|
build(renderState, latestValues, props) {
|
|
13620
|
-
buildSVGAttrs(renderState, latestValues, this.isSVGTag, props.transformTemplate);
|
|
14791
|
+
buildSVGAttrs(renderState, latestValues, this.isSVGTag, props.transformTemplate, props.style);
|
|
13621
14792
|
}
|
|
13622
14793
|
renderInstance(instance, renderState, styleProp, projection) {
|
|
13623
14794
|
renderSVG(instance, renderState, styleProp, projection);
|
|
@@ -14605,15 +15776,15 @@ const base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z
|
|
|
14605
15776
|
const dateRegexSource = `((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))`;
|
|
14606
15777
|
const dateRegex = new RegExp(`^${dateRegexSource}$`);
|
|
14607
15778
|
function timeRegexSource(args) {
|
|
14608
|
-
|
|
14609
|
-
let regex = `([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d`;
|
|
15779
|
+
let secondsRegexSource = `[0-5]\\d`;
|
|
14610
15780
|
if (args.precision) {
|
|
14611
|
-
|
|
15781
|
+
secondsRegexSource = `${secondsRegexSource}\\.\\d{${args.precision}}`;
|
|
14612
15782
|
}
|
|
14613
15783
|
else if (args.precision == null) {
|
|
14614
|
-
|
|
15784
|
+
secondsRegexSource = `${secondsRegexSource}(\\.\\d+)?`;
|
|
14615
15785
|
}
|
|
14616
|
-
|
|
15786
|
+
const secondsQuantifier = args.precision ? "+" : "?"; // require seconds if precision is nonzero
|
|
15787
|
+
return `([01]\\d|2[0-3]):[0-5]\\d(:${secondsRegexSource})${secondsQuantifier}`;
|
|
14617
15788
|
}
|
|
14618
15789
|
function timeRegex(args) {
|
|
14619
15790
|
return new RegExp(`^${timeRegexSource(args)}$`);
|
|
@@ -18310,47 +19481,7 @@ var getProxyFormState = (formState, control, localProxyFormState, isRoot = true)
|
|
|
18310
19481
|
return result;
|
|
18311
19482
|
};
|
|
18312
19483
|
|
|
18313
|
-
|
|
18314
|
-
|
|
18315
|
-
function deepEqual(object1, object2) {
|
|
18316
|
-
if (isPrimitive(object1) || isPrimitive(object2)) {
|
|
18317
|
-
return object1 === object2;
|
|
18318
|
-
}
|
|
18319
|
-
if (isDateObject(object1) && isDateObject(object2)) {
|
|
18320
|
-
return object1.getTime() === object2.getTime();
|
|
18321
|
-
}
|
|
18322
|
-
const keys1 = Object.keys(object1);
|
|
18323
|
-
const keys2 = Object.keys(object2);
|
|
18324
|
-
if (keys1.length !== keys2.length) {
|
|
18325
|
-
return false;
|
|
18326
|
-
}
|
|
18327
|
-
for (const key of keys1) {
|
|
18328
|
-
const val1 = object1[key];
|
|
18329
|
-
if (!keys2.includes(key)) {
|
|
18330
|
-
return false;
|
|
18331
|
-
}
|
|
18332
|
-
if (key !== 'ref') {
|
|
18333
|
-
const val2 = object2[key];
|
|
18334
|
-
if ((isDateObject(val1) && isDateObject(val2)) ||
|
|
18335
|
-
(isObject(val1) && isObject(val2)) ||
|
|
18336
|
-
(Array.isArray(val1) && Array.isArray(val2))
|
|
18337
|
-
? !deepEqual(val1, val2)
|
|
18338
|
-
: val1 !== val2) {
|
|
18339
|
-
return false;
|
|
18340
|
-
}
|
|
18341
|
-
}
|
|
18342
|
-
}
|
|
18343
|
-
return true;
|
|
18344
|
-
}
|
|
18345
|
-
|
|
18346
|
-
const useDeepEqualEffect = (effect, deps) => {
|
|
18347
|
-
const ref = React.useRef(deps);
|
|
18348
|
-
if (!deepEqual(deps, ref.current)) {
|
|
18349
|
-
ref.current = deps;
|
|
18350
|
-
}
|
|
18351
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
18352
|
-
React.useEffect(effect, ref.current);
|
|
18353
|
-
};
|
|
19484
|
+
const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
|
|
18354
19485
|
|
|
18355
19486
|
/**
|
|
18356
19487
|
* This custom hook allows you to subscribe to each form state, and isolate the re-render at the custom hook level. It has its scope in terms of form state subscription, so it would not affect other useFormState and useForm. Using this hook can reduce the re-render impact on large and complex form application.
|
|
@@ -18396,7 +19527,7 @@ function useFormState(props) {
|
|
|
18396
19527
|
isValid: false,
|
|
18397
19528
|
errors: false,
|
|
18398
19529
|
});
|
|
18399
|
-
|
|
19530
|
+
useIsomorphicLayoutEffect(() => control._subscribe({
|
|
18400
19531
|
name: name,
|
|
18401
19532
|
formState: _localProxyFormState.current,
|
|
18402
19533
|
exact,
|
|
@@ -18447,16 +19578,17 @@ var generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) =>
|
|
|
18447
19578
|
function useWatch(props) {
|
|
18448
19579
|
const methods = useFormContext();
|
|
18449
19580
|
const { control = methods.control, name, defaultValue, disabled, exact, } = props || {};
|
|
18450
|
-
const
|
|
18451
|
-
|
|
19581
|
+
const _defaultValue = React__default.useRef(defaultValue);
|
|
19582
|
+
const [value, updateValue] = React__default.useState(control._getWatch(name, _defaultValue.current));
|
|
19583
|
+
useIsomorphicLayoutEffect(() => control._subscribe({
|
|
18452
19584
|
name: name,
|
|
18453
19585
|
formState: {
|
|
18454
19586
|
values: true,
|
|
18455
19587
|
},
|
|
18456
19588
|
exact,
|
|
18457
19589
|
callback: (formState) => !disabled &&
|
|
18458
|
-
updateValue(generateWatchOutput(name, control._names, formState.values || control._formValues, false,
|
|
18459
|
-
}), [name,
|
|
19590
|
+
updateValue(generateWatchOutput(name, control._names, formState.values || control._formValues, false, _defaultValue.current)),
|
|
19591
|
+
}), [name, control, disabled, exact]);
|
|
18460
19592
|
React__default.useEffect(() => control._removeUnmounted());
|
|
18461
19593
|
return value;
|
|
18462
19594
|
}
|
|
@@ -18691,6 +19823,39 @@ var createSubject = () => {
|
|
|
18691
19823
|
};
|
|
18692
19824
|
};
|
|
18693
19825
|
|
|
19826
|
+
var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
|
|
19827
|
+
|
|
19828
|
+
function deepEqual(object1, object2) {
|
|
19829
|
+
if (isPrimitive(object1) || isPrimitive(object2)) {
|
|
19830
|
+
return object1 === object2;
|
|
19831
|
+
}
|
|
19832
|
+
if (isDateObject(object1) && isDateObject(object2)) {
|
|
19833
|
+
return object1.getTime() === object2.getTime();
|
|
19834
|
+
}
|
|
19835
|
+
const keys1 = Object.keys(object1);
|
|
19836
|
+
const keys2 = Object.keys(object2);
|
|
19837
|
+
if (keys1.length !== keys2.length) {
|
|
19838
|
+
return false;
|
|
19839
|
+
}
|
|
19840
|
+
for (const key of keys1) {
|
|
19841
|
+
const val1 = object1[key];
|
|
19842
|
+
if (!keys2.includes(key)) {
|
|
19843
|
+
return false;
|
|
19844
|
+
}
|
|
19845
|
+
if (key !== 'ref') {
|
|
19846
|
+
const val2 = object2[key];
|
|
19847
|
+
if ((isDateObject(val1) && isDateObject(val2)) ||
|
|
19848
|
+
(isObject(val1) && isObject(val2)) ||
|
|
19849
|
+
(Array.isArray(val1) && Array.isArray(val2))
|
|
19850
|
+
? !deepEqual(val1, val2)
|
|
19851
|
+
: val1 !== val2) {
|
|
19852
|
+
return false;
|
|
19853
|
+
}
|
|
19854
|
+
}
|
|
19855
|
+
}
|
|
19856
|
+
return true;
|
|
19857
|
+
}
|
|
19858
|
+
|
|
18694
19859
|
var isEmptyObject = (value) => isObject(value) && !Object.keys(value).length;
|
|
18695
19860
|
|
|
18696
19861
|
var isFileInput = (element) => element.type === 'file';
|
|
@@ -19254,7 +20419,7 @@ function createFormControl(props = {}) {
|
|
|
19254
20419
|
};
|
|
19255
20420
|
const _fields = {};
|
|
19256
20421
|
let _defaultValues = isObject(_options.defaultValues) || isObject(_options.values)
|
|
19257
|
-
? cloneObject(_options.
|
|
20422
|
+
? cloneObject(_options.defaultValues || _options.values) || {}
|
|
19258
20423
|
: {};
|
|
19259
20424
|
let _formValues = _options.shouldUnregister
|
|
19260
20425
|
? {}
|
|
@@ -20259,7 +21424,6 @@ function createFormControl(props = {}) {
|
|
|
20259
21424
|
};
|
|
20260
21425
|
}
|
|
20261
21426
|
|
|
20262
|
-
const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React__default.useLayoutEffect : React__default.useEffect;
|
|
20263
21427
|
/**
|
|
20264
21428
|
* Custom hook to manage the entire form.
|
|
20265
21429
|
*
|
|
@@ -21606,21 +22770,21 @@ const getDefaultConfig = () => {
|
|
|
21606
22770
|
* @see https://tailwindcss.com/docs/height
|
|
21607
22771
|
*/
|
|
21608
22772
|
h: [{
|
|
21609
|
-
h: ['screen', ...scaleSizing()]
|
|
22773
|
+
h: ['screen', 'lh', ...scaleSizing()]
|
|
21610
22774
|
}],
|
|
21611
22775
|
/**
|
|
21612
22776
|
* Min-Height
|
|
21613
22777
|
* @see https://tailwindcss.com/docs/min-height
|
|
21614
22778
|
*/
|
|
21615
22779
|
'min-h': [{
|
|
21616
|
-
'min-h': ['screen', 'none', ...scaleSizing()]
|
|
22780
|
+
'min-h': ['screen', 'lh', 'none', ...scaleSizing()]
|
|
21617
22781
|
}],
|
|
21618
22782
|
/**
|
|
21619
22783
|
* Max-Height
|
|
21620
22784
|
* @see https://tailwindcss.com/docs/max-height
|
|
21621
22785
|
*/
|
|
21622
22786
|
'max-h': [{
|
|
21623
|
-
'max-h': ['screen', ...scaleSizing()]
|
|
22787
|
+
'max-h': ['screen', 'lh', ...scaleSizing()]
|
|
21624
22788
|
}],
|
|
21625
22789
|
// ------------------
|
|
21626
22790
|
// --- Typography ---
|
|
@@ -23419,7 +24583,7 @@ function FormMessage(_a) {
|
|
|
23419
24583
|
|
|
23420
24584
|
function Input(_a) {
|
|
23421
24585
|
var { className, type } = _a, props = __rest(_a, ["className", "type"]);
|
|
23422
|
-
return (React.createElement("input", Object.assign({ type: type, "data-slot": "input", className: cn("border-input file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground flex h-
|
|
24586
|
+
return (React.createElement("input", Object.assign({ type: type, "data-slot": "input", className: cn("border-input file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground flex h-10 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", className) }, props)));
|
|
23423
24587
|
}
|
|
23424
24588
|
|
|
23425
24589
|
function InputGroup(_a) {
|
|
@@ -23485,9 +24649,9 @@ const buttonVariants = cva("inline-flex cursor-pointer items-center justify-cent
|
|
|
23485
24649
|
},
|
|
23486
24650
|
size: {
|
|
23487
24651
|
link: "p-0 h-auto",
|
|
23488
|
-
default: "h-
|
|
24652
|
+
default: "h-10 px-4 py-2 has-[>svg]:px-3",
|
|
23489
24653
|
sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
|
|
23490
|
-
lg: "h-
|
|
24654
|
+
lg: "h-12 rounded-md px-6 has-[>svg]:px-4",
|
|
23491
24655
|
icon: "size-9",
|
|
23492
24656
|
},
|
|
23493
24657
|
},
|
|
@@ -28851,7 +30015,7 @@ function requireCurrencies () {
|
|
|
28851
30015
|
name: 'Lesotho loti',
|
|
28852
30016
|
number: '426'
|
|
28853
30017
|
}, {
|
|
28854
|
-
code: '
|
|
30018
|
+
code: 'LTL',
|
|
28855
30019
|
decimals: 2,
|
|
28856
30020
|
name: 'Lithuanian litas',
|
|
28857
30021
|
number: '440'
|
|
@@ -32951,12 +34115,12 @@ function requireReactStripe_umd () {
|
|
|
32951
34115
|
|
|
32952
34116
|
stripe._registerWrapper({
|
|
32953
34117
|
name: 'react-stripe-js',
|
|
32954
|
-
version: "3.
|
|
34118
|
+
version: "3.7.0"
|
|
32955
34119
|
});
|
|
32956
34120
|
|
|
32957
34121
|
stripe.registerAppInfo({
|
|
32958
34122
|
name: 'react-stripe-js',
|
|
32959
|
-
version: "3.
|
|
34123
|
+
version: "3.7.0",
|
|
32960
34124
|
url: 'https://stripe.com/docs/stripe-js/react'
|
|
32961
34125
|
});
|
|
32962
34126
|
};
|
|
@@ -33199,20 +34363,24 @@ function requireReactStripe_umd () {
|
|
|
33199
34363
|
}, [prevStripe, rawStripeProp]); // Apply updates to elements when options prop has relevant changes
|
|
33200
34364
|
|
|
33201
34365
|
var prevOptions = usePrevious(options);
|
|
34366
|
+
var prevCheckoutSdk = usePrevious(ctx.checkoutSdk);
|
|
33202
34367
|
React.useEffect(function () {
|
|
33203
34368
|
var _prevOptions$elements, _options$elementsOpti;
|
|
33204
34369
|
|
|
34370
|
+
// Ignore changes while checkout sdk is not initialized.
|
|
33205
34371
|
if (!ctx.checkoutSdk) {
|
|
33206
34372
|
return;
|
|
33207
34373
|
}
|
|
33208
34374
|
|
|
33209
34375
|
var previousAppearance = prevOptions === null || prevOptions === void 0 ? void 0 : (_prevOptions$elements = prevOptions.elementsOptions) === null || _prevOptions$elements === void 0 ? void 0 : _prevOptions$elements.appearance;
|
|
33210
34376
|
var currentAppearance = options === null || options === void 0 ? void 0 : (_options$elementsOpti = options.elementsOptions) === null || _options$elementsOpti === void 0 ? void 0 : _options$elementsOpti.appearance;
|
|
34377
|
+
var hasAppearanceChanged = !isEqual(currentAppearance, previousAppearance);
|
|
34378
|
+
var hasSdkLoaded = !prevCheckoutSdk && ctx.checkoutSdk;
|
|
33211
34379
|
|
|
33212
|
-
if (currentAppearance &&
|
|
34380
|
+
if (currentAppearance && (hasAppearanceChanged || hasSdkLoaded)) {
|
|
33213
34381
|
ctx.checkoutSdk.changeAppearance(currentAppearance);
|
|
33214
34382
|
}
|
|
33215
|
-
}, [options, prevOptions, ctx.checkoutSdk]); // Attach react-stripe-js version to stripe.js instance
|
|
34383
|
+
}, [options, prevOptions, ctx.checkoutSdk, prevCheckoutSdk]); // Attach react-stripe-js version to stripe.js instance
|
|
33216
34384
|
|
|
33217
34385
|
React.useEffect(function () {
|
|
33218
34386
|
registerWithStripeJs(ctx.stripe);
|
|
@@ -34246,7 +35414,7 @@ const motionSettings = {
|
|
|
34246
35414
|
exit: { opacity: 0 },
|
|
34247
35415
|
transition: { duration: 0.2 },
|
|
34248
35416
|
};
|
|
34249
|
-
function CheckoutForm({ storeClient, checkoutId, onSuccess, onError, cancelUrl, clientSecret, customer, currency, checkoutAppearance, fonts, locale, setShippingCost, exchangeRate, }) {
|
|
35417
|
+
function CheckoutForm({ storeClient, checkoutId, onSuccess, onError, cancelUrl, clientSecret, customer, currency, checkoutAppearance, fonts, locale, setShippingCost, exchangeRate, setCheckout, }) {
|
|
34250
35418
|
const { formData, setFormData, step, setStep, checkoutId: storedCheckoutId, setCheckoutId, } = useFormStore();
|
|
34251
35419
|
const [paymentSecret, setPaymentSecret] = useState(null);
|
|
34252
35420
|
const [publicKey, setPublicKey] = useState(null);
|
|
@@ -34382,10 +35550,11 @@ function CheckoutForm({ storeClient, checkoutId, onSuccess, onError, cancelUrl,
|
|
|
34382
35550
|
name: data.name,
|
|
34383
35551
|
},
|
|
34384
35552
|
});
|
|
34385
|
-
const { paymentSecret, publicKey } = yield storeClient.
|
|
35553
|
+
const { paymentSecret, publicKey, checkoutSession: newCheckout, } = yield storeClient.generateCheckoutPaymentSecret(clientSecret, checkoutId);
|
|
34386
35554
|
setPaymentSecret(paymentSecret);
|
|
34387
35555
|
setPublicKey(publicKey);
|
|
34388
35556
|
setShippingCost(data.price);
|
|
35557
|
+
setCheckout(newCheckout);
|
|
34389
35558
|
setStep("payment");
|
|
34390
35559
|
});
|
|
34391
35560
|
// Navigate back to previous step
|
|
@@ -34403,9 +35572,10 @@ function CheckoutForm({ storeClient, checkoutId, onSuccess, onError, cancelUrl,
|
|
|
34403
35572
|
};
|
|
34404
35573
|
useEffect(() => {
|
|
34405
35574
|
const asyncFunc = () => __awaiter(this, void 0, void 0, function* () {
|
|
34406
|
-
const { paymentSecret, publicKey } = yield storeClient.
|
|
35575
|
+
const { paymentSecret, publicKey, checkoutSession: newCheckout, } = yield storeClient.generateCheckoutPaymentSecret(clientSecret, checkoutId);
|
|
34407
35576
|
setPaymentSecret(paymentSecret);
|
|
34408
35577
|
setPublicKey(publicKey);
|
|
35578
|
+
setCheckout(newCheckout);
|
|
34409
35579
|
});
|
|
34410
35580
|
if (!paymentSecret && step === "payment") {
|
|
34411
35581
|
asyncFunc();
|
|
@@ -34432,26 +35602,68 @@ function CheckoutFormLoading() {
|
|
|
34432
35602
|
React__default.createElement(InputGroupLoading, { className: "md:col-span-2" }),
|
|
34433
35603
|
React__default.createElement(InputGroupLoading, null),
|
|
34434
35604
|
React__default.createElement("div", { className: "flex md:col-span-2 justify-end pt-2" },
|
|
34435
|
-
React__default.createElement(Skeleton, { className: "w-32 h-
|
|
35605
|
+
React__default.createElement(Skeleton, { className: "w-32 h-10" }))));
|
|
34436
35606
|
}
|
|
34437
35607
|
function InputGroupLoading({ className }) {
|
|
34438
35608
|
return (React__default.createElement("div", { className: clsx("flex flex-col gap-2", className) },
|
|
34439
35609
|
React__default.createElement(Skeleton, { className: "w-10 h-3" }),
|
|
34440
|
-
React__default.createElement(Skeleton, { className: "w-full h-
|
|
35610
|
+
React__default.createElement(Skeleton, { className: "w-full h-10" })));
|
|
34441
35611
|
}
|
|
34442
35612
|
|
|
34443
|
-
function
|
|
34444
|
-
|
|
35613
|
+
function DiscountCode({ applyDiscountCode, revalidateDiscounts, }) {
|
|
35614
|
+
const { t } = useTranslation();
|
|
35615
|
+
const [discountCode, setDiscountCode] = useState("");
|
|
35616
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
35617
|
+
const [error, setError] = useState(null);
|
|
35618
|
+
const isValid = discountCode.length > 0;
|
|
35619
|
+
const handleSubmit = (e) => __awaiter(this, void 0, void 0, function* () {
|
|
35620
|
+
e.preventDefault();
|
|
35621
|
+
setIsLoading(true);
|
|
35622
|
+
try {
|
|
35623
|
+
yield applyDiscountCode(discountCode);
|
|
35624
|
+
yield revalidateDiscounts();
|
|
35625
|
+
setDiscountCode("");
|
|
35626
|
+
toast.success(t("CheckoutEmbed.Summary.discountCodeSuccess"));
|
|
35627
|
+
}
|
|
35628
|
+
catch (error) {
|
|
35629
|
+
console.error(error);
|
|
35630
|
+
setError(t("CheckoutEmbed.Summary.discountCodeError"));
|
|
35631
|
+
}
|
|
35632
|
+
finally {
|
|
35633
|
+
setIsLoading(false);
|
|
35634
|
+
}
|
|
35635
|
+
});
|
|
35636
|
+
return (React__default.createElement("form", { className: "pb-1", onSubmit: handleSubmit },
|
|
35637
|
+
React__default.createElement(Label, { className: "text-sm font-medium mb-2" }, "Discount Code"),
|
|
35638
|
+
React__default.createElement("div", { className: "flex items-center gap-2" },
|
|
35639
|
+
React__default.createElement(Input, { "aria-invalid": !!error, value: discountCode, onChange: (e) => {
|
|
35640
|
+
setError("");
|
|
35641
|
+
setDiscountCode(e.target.value);
|
|
35642
|
+
}, name: "discountCode", placeholder: t("CheckoutEmbed.Summary.discountCodePlaceholder") }),
|
|
35643
|
+
React__default.createElement(SubmitButton, { isSubmitting: isLoading, isValid: isValid, type: "submit" }, t("CheckoutEmbed.Summary.discountCodeApply"))),
|
|
35644
|
+
error && React__default.createElement("p", { className: "text-red-500 mt-2 text-sm" }, error)));
|
|
35645
|
+
}
|
|
35646
|
+
|
|
35647
|
+
function CheckoutSummary({ appliedDiscounts, lineItems, shipping, tax, currency, onCancel, exchangeRate, applyDiscountCode, revalidateDiscounts, removeDiscount, }) {
|
|
35648
|
+
var _a, _b;
|
|
34445
35649
|
const { formData } = useFormStore();
|
|
34446
35650
|
const [isOpen, setIsOpen] = useState(false);
|
|
34447
35651
|
const { t } = useTranslation();
|
|
34448
35652
|
const subtotal = lineItems.reduce((acc, item) => {
|
|
34449
|
-
var _a;
|
|
34450
|
-
const productItem = item.
|
|
34451
|
-
return acc + ((
|
|
35653
|
+
var _a, _b;
|
|
35654
|
+
const productItem = ((_a = item.productData) === null || _a === void 0 ? void 0 : _a.selectedVariant) || item.productData;
|
|
35655
|
+
return acc + ((_b = productItem === null || productItem === void 0 ? void 0 : productItem.priceInCents) !== null && _b !== void 0 ? _b : 0) * item.quantity;
|
|
34452
35656
|
}, 0);
|
|
34453
35657
|
const shippingPrice = shipping !== null && shipping !== void 0 ? shipping : (_a = formData.shipping) === null || _a === void 0 ? void 0 : _a.price;
|
|
34454
35658
|
const total = subtotal + (tax !== null && tax !== void 0 ? tax : 0) + (shippingPrice !== null && shippingPrice !== void 0 ? shippingPrice : 0);
|
|
35659
|
+
const isShippingFree = total > (shippingPrice !== null && shippingPrice !== void 0 ? shippingPrice : 0) &&
|
|
35660
|
+
appliedDiscounts.some((discount) => discount.discount.type === "FREE_SHIPPING");
|
|
35661
|
+
const filteredDiscounts = appliedDiscounts.filter((discount) => discount.discount.type !== "FREE_SHIPPING");
|
|
35662
|
+
const totalWithDiscounts = total -
|
|
35663
|
+
((_b = filteredDiscounts.reduce((acc, { amount }) => acc + amount, 0)) !== null && _b !== void 0 ? _b : 0);
|
|
35664
|
+
useEffect(() => {
|
|
35665
|
+
console.log(appliedDiscounts);
|
|
35666
|
+
}, [appliedDiscounts]);
|
|
34455
35667
|
return (React__default.createElement("div", { className: "grid gap-5" },
|
|
34456
35668
|
React__default.createElement("div", { className: "flex justify-between items-center" },
|
|
34457
35669
|
React__default.createElement("div", { onClick: () => setIsOpen(!isOpen), className: "flex items-center gap-2 cursor-pointer" },
|
|
@@ -34462,7 +35674,7 @@ function CheckoutSummary({ lineItems, shipping, tax, currency, onCancel, exchang
|
|
|
34462
35674
|
React__default.createElement("p", { className: "font-bold text-lg tracking-tight md:hidden" }, storeHelpers.formatPrice(total, currency, exchangeRate)),
|
|
34463
35675
|
React__default.createElement(Button, { className: "max-sm:hidden", variant: "link", size: "link", onClick: onCancel }, t("CheckoutEmbed.Summary.edit"))),
|
|
34464
35676
|
React__default.createElement("hr", null),
|
|
34465
|
-
React__default.createElement("div", { className: clsx("gap-
|
|
35677
|
+
React__default.createElement("div", { className: clsx("gap-2 order-4 md:order-none", {
|
|
34466
35678
|
"hidden md:grid": !isOpen,
|
|
34467
35679
|
grid: isOpen,
|
|
34468
35680
|
}) },
|
|
@@ -34471,41 +35683,91 @@ function CheckoutSummary({ lineItems, shipping, tax, currency, onCancel, exchang
|
|
|
34471
35683
|
React__default.createElement("p", null, storeHelpers.formatPrice(subtotal, currency, exchangeRate))),
|
|
34472
35684
|
React__default.createElement("div", { className: "flex justify-between" },
|
|
34473
35685
|
React__default.createElement("p", null, t("CheckoutEmbed.Summary.shipping")),
|
|
34474
|
-
React__default.createElement("p", null,
|
|
34475
|
-
?
|
|
34476
|
-
:
|
|
35686
|
+
React__default.createElement("p", null, isShippingFree
|
|
35687
|
+
? t("CheckoutEmbed.Summary.free")
|
|
35688
|
+
: !!shippingPrice
|
|
35689
|
+
? storeHelpers.formatPrice(shippingPrice, currency, exchangeRate)
|
|
35690
|
+
: t("CheckoutEmbed.Summary.calculatedAtNextStep"))),
|
|
34477
35691
|
!!tax && (React__default.createElement("div", { className: "flex justify-between" },
|
|
34478
35692
|
React__default.createElement("p", null, t("CheckoutEmbed.Summary.tax")),
|
|
34479
35693
|
React__default.createElement("p", null, storeHelpers.formatPrice(tax, currency, exchangeRate)))),
|
|
34480
|
-
|
|
35694
|
+
filteredDiscounts.map(({ discount, amount, id }) => {
|
|
35695
|
+
var _a;
|
|
35696
|
+
return (React__default.createElement("div", { key: discount.id, className: "flex not-last:-mb-0.5 justify-between text-muted-foreground" },
|
|
35697
|
+
React__default.createElement(DiscountItem, { id: id, removeDiscount: removeDiscount, label: (_a = ((discount === null || discount === void 0 ? void 0 : discount.code) || (discount === null || discount === void 0 ? void 0 : discount.title))) !== null && _a !== void 0 ? _a : "", canRemove: discount.method === "CODE" }),
|
|
35698
|
+
React__default.createElement("p", null,
|
|
35699
|
+
"- ",
|
|
35700
|
+
storeHelpers.formatPrice(amount, currency, exchangeRate))));
|
|
35701
|
+
}),
|
|
35702
|
+
React__default.createElement("div", { className: "flex font-bold justify-between items-center" },
|
|
34481
35703
|
React__default.createElement("p", null, t("CheckoutEmbed.Summary.total")),
|
|
34482
|
-
React__default.createElement("p", null, storeHelpers.formatPrice(
|
|
35704
|
+
React__default.createElement("p", null, storeHelpers.formatPrice(totalWithDiscounts, currency, exchangeRate)))),
|
|
35705
|
+
React__default.createElement("hr", { className: clsx("order-7 md:order-none", {
|
|
35706
|
+
"hidden md:block": !isOpen,
|
|
35707
|
+
block: isOpen,
|
|
35708
|
+
}) }),
|
|
35709
|
+
React__default.createElement("div", { className: clsx("gap-0 order-6 md:order-none", {
|
|
35710
|
+
"hidden md:grid": !isOpen,
|
|
35711
|
+
grid: isOpen,
|
|
35712
|
+
}) },
|
|
35713
|
+
React__default.createElement(DiscountCode, { applyDiscountCode: applyDiscountCode, revalidateDiscounts: revalidateDiscounts })),
|
|
34483
35714
|
React__default.createElement("hr", { className: clsx("order-5 md:order-none", {
|
|
34484
35715
|
"hidden md:block": !isOpen,
|
|
34485
35716
|
block: isOpen,
|
|
34486
35717
|
}) }),
|
|
34487
|
-
React__default.createElement("div", { className: clsx("gap-
|
|
35718
|
+
React__default.createElement("div", { className: clsx("gap-0 order-3 md:order-none", {
|
|
34488
35719
|
"hidden md:grid": !isOpen,
|
|
34489
35720
|
grid: isOpen,
|
|
34490
35721
|
}) }, lineItems.map((item, index) => {
|
|
34491
|
-
var _a, _b, _c, _d, _e;
|
|
34492
|
-
const
|
|
35722
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
35723
|
+
const productAppliedDiscounts = appliedDiscounts.filter(({ discount }) => discount.allowedProductIDs.includes(item.productData.productId));
|
|
35724
|
+
const discount = productAppliedDiscounts.length > 0
|
|
35725
|
+
? productAppliedDiscounts.reduce((acc, curr) => {
|
|
35726
|
+
return curr.amount > acc.amount ? curr : acc;
|
|
35727
|
+
}, productAppliedDiscounts[0])
|
|
35728
|
+
: null;
|
|
35729
|
+
const isDiscounted = !!discount;
|
|
35730
|
+
const productItem = ((_a = item.productData) === null || _a === void 0 ? void 0 : _a.selectedVariant) || item.productData;
|
|
35731
|
+
const discountedPrice = productItem.priceInCents - ((_b = discount === null || discount === void 0 ? void 0 : discount.amount) !== null && _b !== void 0 ? _b : 0);
|
|
34493
35732
|
return (React__default.createElement("div", { key: index, className: "flex items-center" },
|
|
34494
35733
|
React__default.createElement("div", { className: "relative" },
|
|
34495
35734
|
React__default.createElement("div", { className: "w-16 h-16 bg-secondary rounded-lg overflow-hidden relative" }, (productItem === null || productItem === void 0 ? void 0 : productItem.images[0]) && (React__default.createElement("img", { src: productItem.images[0] ||
|
|
34496
|
-
((
|
|
34497
|
-
"/placeholder.svg", alt: ((
|
|
35735
|
+
((_c = item === null || item === void 0 ? void 0 : item.productData) === null || _c === void 0 ? void 0 : _c.images[0]) ||
|
|
35736
|
+
"/placeholder.svg", alt: ((_d = item.productData) === null || _d === void 0 ? void 0 : _d.title) || "", className: "object-cover w-full h-full", sizes: "64px" }))),
|
|
34498
35737
|
React__default.createElement("div", { className: "absolute -top-2 -right-2 w-6 h-6 bg-primary rounded-full flex items-center text-background justify-center text-sm" }, item.quantity)),
|
|
34499
35738
|
React__default.createElement("div", { className: "ml-4 flex-1" },
|
|
34500
|
-
React__default.createElement("h3", { className: "text-lg font-medium" }, (
|
|
35739
|
+
React__default.createElement("h3", { className: "text-lg font-medium" }, (_e = item.productData) === null || _e === void 0 ? void 0 : _e.title),
|
|
34501
35740
|
React__default.createElement("p", { className: "text-muted-foreground text-sm" }, item.variantOptions.map((option) => (React__default.createElement("span", { key: option.name },
|
|
34502
35741
|
option.name,
|
|
34503
35742
|
": ",
|
|
34504
35743
|
option.value))))),
|
|
34505
|
-
React__default.createElement("div", { className: "text-right" },
|
|
34506
|
-
React__default.createElement("p", { className: "text-
|
|
35744
|
+
React__default.createElement("div", { className: "text-right" }, isDiscounted ? (React__default.createElement("div", { className: "flex flex-col" },
|
|
35745
|
+
React__default.createElement("p", { className: "text-sm font-medium -mb-0.5 line-through text-muted-foreground" }, storeHelpers.formatPrice((_f = productItem === null || productItem === void 0 ? void 0 : productItem.priceInCents) !== null && _f !== void 0 ? _f : 0, currency, exchangeRate)),
|
|
35746
|
+
React__default.createElement("p", { className: "text-lg font-medium" }, discountedPrice <= 0
|
|
35747
|
+
? t("CheckoutEmbed.Summary.free")
|
|
35748
|
+
: storeHelpers.formatPrice(discountedPrice, currency, exchangeRate)))) : (React__default.createElement("p", { className: "text-lg font-medium" }, storeHelpers.formatPrice((_g = productItem === null || productItem === void 0 ? void 0 : productItem.priceInCents) !== null && _g !== void 0 ? _g : 0, currency, exchangeRate))))));
|
|
34507
35749
|
}))));
|
|
34508
35750
|
}
|
|
35751
|
+
function DiscountItem({ id, removeDiscount, label, canRemove, }) {
|
|
35752
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
35753
|
+
const handleRemove = () => __awaiter(this, void 0, void 0, function* () {
|
|
35754
|
+
setIsLoading(true);
|
|
35755
|
+
try {
|
|
35756
|
+
yield removeDiscount(id);
|
|
35757
|
+
}
|
|
35758
|
+
catch (error) {
|
|
35759
|
+
console.error(error);
|
|
35760
|
+
}
|
|
35761
|
+
finally {
|
|
35762
|
+
setIsLoading(false);
|
|
35763
|
+
}
|
|
35764
|
+
});
|
|
35765
|
+
return (React__default.createElement("div", { className: "flex items-center gap-0.5" },
|
|
35766
|
+
React__default.createElement("p", null, isLoading ? "Removing..." : label),
|
|
35767
|
+
!isLoading && canRemove && (React__default.createElement("div", { onClick: handleRemove, className: "flex items-center z-10 relative -m-0.5 hover:bg-muted p-1 rounded-full justify-center hover:text-foreground cursor-pointer" },
|
|
35768
|
+
React__default.createElement(X$2, { className: "size-3" }),
|
|
35769
|
+
React__default.createElement("p", { className: "sr-only" }, "Remove")))));
|
|
35770
|
+
}
|
|
34509
35771
|
|
|
34510
35772
|
function CheckoutSummaryLoading() {
|
|
34511
35773
|
const { t } = useTranslation();
|
|
@@ -34529,7 +35791,11 @@ function CheckoutSummaryLoading() {
|
|
|
34529
35791
|
React__default.createElement("p", null, t("CheckoutEmbed.Summary.total")),
|
|
34530
35792
|
React__default.createElement(Skeleton, { className: "w-24 h-[18px]" }))),
|
|
34531
35793
|
React__default.createElement("hr", { className: "hidden md:block" }),
|
|
34532
|
-
|
|
35794
|
+
React__default.createElement("div", null,
|
|
35795
|
+
React__default.createElement(Skeleton, { className: "w-24 h-5 mb-2" }),
|
|
35796
|
+
React__default.createElement(Skeleton, { className: "h-10 w-full mb-1" })),
|
|
35797
|
+
React__default.createElement("hr", { className: "hidden md:block" }),
|
|
35798
|
+
Array.from({ length: 2 }).map((_, index) => (React__default.createElement("div", { key: index, className: "hidden md:flex items-center" },
|
|
34533
35799
|
React__default.createElement(Skeleton, { className: "rounded-lg size-16" }),
|
|
34534
35800
|
React__default.createElement("div", { className: "ml-4 grid gap-2 flex-1" },
|
|
34535
35801
|
React__default.createElement(Skeleton, { className: "w-28 h-5" }),
|
|
@@ -34539,11 +35805,11 @@ function CheckoutSummaryLoading() {
|
|
|
34539
35805
|
}
|
|
34540
35806
|
|
|
34541
35807
|
function CheckoutEmbed({ checkoutId, config }) {
|
|
34542
|
-
var _a, _b, _c, _d, _e;
|
|
35808
|
+
var _a, _b, _c, _d, _e, _f;
|
|
34543
35809
|
const { cancelUrl, successUrl, appearance, locale, clientSecret, clientProxy, } = config;
|
|
34544
|
-
const storeClient = createStoreClient({ proxy: clientProxy });
|
|
35810
|
+
const storeClient = React__default.useMemo(() => createStoreClient({ proxy: clientProxy }), [clientProxy]);
|
|
34545
35811
|
React__default.useMemo(() => createI18nInstance(locale), []);
|
|
34546
|
-
const { formData, setFormData,
|
|
35812
|
+
const { formData, setFormData, setStep } = useFormStore();
|
|
34547
35813
|
const [checkout, setCheckout] = useState(null);
|
|
34548
35814
|
const [loading, setLoading] = useState(true);
|
|
34549
35815
|
useEffect(() => {
|
|
@@ -34594,10 +35860,31 @@ function CheckoutEmbed({ checkoutId, config }) {
|
|
|
34594
35860
|
return;
|
|
34595
35861
|
setCheckout(Object.assign(Object.assign({}, checkout), { shipping: cost }));
|
|
34596
35862
|
};
|
|
35863
|
+
const applyDiscountCode = (code) => __awaiter(this, void 0, void 0, function* () {
|
|
35864
|
+
const newCheckout = yield storeClient.applyDiscountCode(clientSecret, checkoutId, code);
|
|
35865
|
+
setCheckout(newCheckout);
|
|
35866
|
+
});
|
|
35867
|
+
const revalidateDiscounts = () => __awaiter(this, void 0, void 0, function* () {
|
|
35868
|
+
const newCheckout = yield storeClient.revalidateDiscounts(clientSecret, checkoutId);
|
|
35869
|
+
setCheckout(newCheckout);
|
|
35870
|
+
});
|
|
35871
|
+
const removeDiscount = (id) => __awaiter(this, void 0, void 0, function* () {
|
|
35872
|
+
console.log("storeclient method", storeClient);
|
|
35873
|
+
const newCheckout = yield storeClient.removeDiscount(clientSecret, checkoutId, id);
|
|
35874
|
+
setCheckout(newCheckout);
|
|
35875
|
+
});
|
|
35876
|
+
useEffect(() => {
|
|
35877
|
+
const interval = setTimeout(() => {
|
|
35878
|
+
revalidateDiscounts();
|
|
35879
|
+
}, 1000 * 5);
|
|
35880
|
+
return () => clearInterval(interval);
|
|
35881
|
+
}, []);
|
|
34597
35882
|
return (React__default.createElement("div", { className: "checkout-embed scrollbar-hidden mx-auto max-w-[1200px] min-h-screen overflow-x-hidden gap-6 md:gap-0 py-4 md:py-12 flex flex-col md:grid md:grid-cols-7 " },
|
|
34598
35883
|
React__default.createElement(Appearance, { appearance: appearance }),
|
|
34599
|
-
React__default.createElement("div", { className: "md:col-span-4 px-4 md:px-8" }, loading ? (React__default.createElement(CheckoutFormLoading, null)) : (React__default.createElement(CheckoutForm, { locale: locale, setShippingCost: setShippingCost, storeClient: storeClient, fonts: config.fonts, checkoutAppearance: appearance, currency: (_a = checkout === null || checkout === void 0 ? void 0 : checkout.currency) !== null && _a !== void 0 ? _a : "", customer: checkout === null || checkout === void 0 ? void 0 : checkout.customer, cancelUrl: cancelUrl, checkoutId: checkoutId, clientSecret: clientSecret, onSuccess: onSuccess, onError: onError, exchangeRate: (_b = checkout === null || checkout === void 0 ? void 0 : checkout.exchangeRate) !== null && _b !== void 0 ? _b : 1 }))),
|
|
34600
|
-
React__default.createElement("div", { className: "md:col-span-3 px-4 md:px-8 order-first md:order-last" },
|
|
35884
|
+
React__default.createElement("div", { className: "md:col-span-4 px-4 md:px-8" }, loading ? (React__default.createElement(CheckoutFormLoading, null)) : (React__default.createElement(CheckoutForm, { locale: locale, setShippingCost: setShippingCost, storeClient: storeClient, fonts: config.fonts, checkoutAppearance: appearance, currency: (_a = checkout === null || checkout === void 0 ? void 0 : checkout.currency) !== null && _a !== void 0 ? _a : "", customer: checkout === null || checkout === void 0 ? void 0 : checkout.customer, cancelUrl: cancelUrl, checkoutId: checkoutId, clientSecret: clientSecret, onSuccess: onSuccess, onError: onError, exchangeRate: (_b = checkout === null || checkout === void 0 ? void 0 : checkout.exchangeRate) !== null && _b !== void 0 ? _b : 1, setCheckout: setCheckout }))),
|
|
35885
|
+
React__default.createElement("div", { className: "md:col-span-3 px-4 md:px-8 order-first md:order-last" },
|
|
35886
|
+
React__default.createElement(Toaster, null),
|
|
35887
|
+
loading ? (React__default.createElement(CheckoutSummaryLoading, null)) : (React__default.createElement(CheckoutSummary, { currency: (_c = checkout === null || checkout === void 0 ? void 0 : checkout.currency) !== null && _c !== void 0 ? _c : "", lineItems: (_d = checkout === null || checkout === void 0 ? void 0 : checkout.lineItems) !== null && _d !== void 0 ? _d : [], shipping: checkout === null || checkout === void 0 ? void 0 : checkout.shipping, tax: checkout === null || checkout === void 0 ? void 0 : checkout.tax, onCancel: onCancel, exchangeRate: (_e = checkout === null || checkout === void 0 ? void 0 : checkout.exchangeRate) !== null && _e !== void 0 ? _e : 1, applyDiscountCode: applyDiscountCode, appliedDiscounts: (_f = checkout === null || checkout === void 0 ? void 0 : checkout.appliedDiscounts) !== null && _f !== void 0 ? _f : [], revalidateDiscounts: revalidateDiscounts, removeDiscount: removeDiscount })))));
|
|
34601
35888
|
}
|
|
34602
35889
|
var index = memo$1(CheckoutEmbed);
|
|
34603
35890
|
|
|
@@ -34628,7 +35915,7 @@ function styleInject(css, ref) {
|
|
|
34628
35915
|
}
|
|
34629
35916
|
}
|
|
34630
35917
|
|
|
34631
|
-
var css_248z = "/*! tailwindcss v4.1.4 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace;\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-black: #000;\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-lg: 32rem;\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-base: 1rem;\n --text-base--line-height: calc(1.5 / 1);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --tracking-tight: -0.025em;\n --tracking-widest: 0.1em;\n --radius-xs: 0.125rem;\n --animate-spin: spin 1s linear infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: var(--bs-font-sans), Helvetica, Arial, apple-system, sans-serif;\n --default-mono-font-family: var(--font-mono);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n -moz-tab-size: 4;\n -o-tab-size: 4;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::-moz-placeholder {\n opacity: 1;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::-moz-placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n -webkit-appearance: button;\n -moz-appearance: button;\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .pointer-events-none {\n pointer-events: none !important;\n }\n .sr-only {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border-width: 0 !important;\n }\n .absolute {\n position: absolute !important;\n }\n .fixed {\n position: fixed !important;\n }\n .relative {\n position: relative !important;\n }\n .sticky {\n position: sticky !important;\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0) !important;\n }\n .-top-2 {\n top: calc(var(--spacing) * -2) !important;\n }\n .top-0 {\n top: calc(var(--spacing) * 0) !important;\n }\n .top-0\\.5 {\n top: calc(var(--spacing) * 0.5) !important;\n }\n .top-1\\/2 {\n top: calc(1/2 * 100%) !important;\n }\n .top-4 {\n top: calc(var(--spacing) * 4) !important;\n }\n .top-\\[50\\%\\] {\n top: 50% !important;\n }\n .-right-2 {\n right: calc(var(--spacing) * -2) !important;\n }\n .right-2 {\n right: calc(var(--spacing) * 2) !important;\n }\n .right-4 {\n right: calc(var(--spacing) * 4) !important;\n }\n .left-1\\/2 {\n left: calc(1/2 * 100%) !important;\n }\n .left-2 {\n left: calc(var(--spacing) * 2) !important;\n }\n .left-\\[50\\%\\] {\n left: 50% !important;\n }\n .z-10 {\n z-index: 10 !important;\n }\n .z-50 {\n z-index: 50 !important;\n }\n .order-3 {\n order: 3 !important;\n }\n .order-4 {\n order: 4 !important;\n }\n .order-5 {\n order: 5 !important;\n }\n .order-first {\n order: -9999 !important;\n }\n .col-span-2 {\n grid-column: span 2 / span 2 !important;\n }\n .-mx-1 {\n margin-inline: calc(var(--spacing) * -1) !important;\n }\n .mx-auto {\n margin-inline: auto !important;\n }\n .my-1 {\n margin-block: calc(var(--spacing) * 1) !important;\n }\n .my-2 {\n margin-block: calc(var(--spacing) * 2) !important;\n }\n .mt-8 {\n margin-top: calc(var(--spacing) * 8) !important;\n }\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2) !important;\n }\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6) !important;\n }\n .ml-4 {\n margin-left: calc(var(--spacing) * 4) !important;\n }\n .ml-auto {\n margin-left: auto !important;\n }\n .block {\n display: block !important;\n }\n .flex {\n display: flex !important;\n }\n .grid {\n display: grid !important;\n }\n .hidden {\n display: none !important;\n }\n .inline-flex {\n display: inline-flex !important;\n }\n .aspect-square {\n aspect-ratio: 1 / 1 !important;\n }\n .size-2 {\n width: calc(var(--spacing) * 2) !important;\n height: calc(var(--spacing) * 2) !important;\n }\n .size-3\\.5 {\n width: calc(var(--spacing) * 3.5) !important;\n height: calc(var(--spacing) * 3.5) !important;\n }\n .size-4 {\n width: calc(var(--spacing) * 4) !important;\n height: calc(var(--spacing) * 4) !important;\n }\n .size-5 {\n width: calc(var(--spacing) * 5) !important;\n height: calc(var(--spacing) * 5) !important;\n }\n .size-9 {\n width: calc(var(--spacing) * 9) !important;\n height: calc(var(--spacing) * 9) !important;\n }\n .size-16 {\n width: calc(var(--spacing) * 16) !important;\n height: calc(var(--spacing) * 16) !important;\n }\n .h-3 {\n height: calc(var(--spacing) * 3) !important;\n }\n .h-3\\.5 {\n height: calc(var(--spacing) * 3.5) !important;\n }\n .h-4 {\n height: calc(var(--spacing) * 4) !important;\n }\n .h-5 {\n height: calc(var(--spacing) * 5) !important;\n }\n .h-6 {\n height: calc(var(--spacing) * 6) !important;\n }\n .h-8 {\n height: calc(var(--spacing) * 8) !important;\n }\n .h-9 {\n height: calc(var(--spacing) * 9) !important;\n }\n .h-10 {\n height: calc(var(--spacing) * 10) !important;\n }\n .h-16 {\n height: calc(var(--spacing) * 16) !important;\n }\n .h-\\[18px\\] {\n height: 18px !important;\n }\n .h-\\[20px\\] {\n height: 20px !important;\n }\n .h-\\[var\\(--radix-select-trigger-height\\)\\] {\n height: var(--radix-select-trigger-height) !important;\n }\n .h-auto {\n height: auto !important;\n }\n .h-auto\\! {\n height: auto !important;\n }\n .h-full {\n height: 100% !important;\n }\n .h-px {\n height: 1px !important;\n }\n .max-h-\\(--radix-dropdown-menu-content-available-height\\) {\n max-height: var(--radix-dropdown-menu-content-available-height) !important;\n }\n .max-h-96 {\n max-height: calc(var(--spacing) * 96) !important;\n }\n .max-h-\\[200px\\] {\n max-height: 200px !important;\n }\n .max-h-\\[300px\\] {\n max-height: 300px !important;\n }\n .min-h-full {\n min-height: 100% !important;\n }\n .min-h-screen {\n min-height: 100vh !important;\n }\n .w-0 {\n width: calc(var(--spacing) * 0) !important;\n }\n .w-4 {\n width: calc(var(--spacing) * 4) !important;\n }\n .w-5 {\n width: calc(var(--spacing) * 5) !important;\n }\n .w-6 {\n width: calc(var(--spacing) * 6) !important;\n }\n .w-10 {\n width: calc(var(--spacing) * 10) !important;\n }\n .w-12 {\n width: calc(var(--spacing) * 12) !important;\n }\n .w-16 {\n width: calc(var(--spacing) * 16) !important;\n }\n .w-20 {\n width: calc(var(--spacing) * 20) !important;\n }\n .w-24 {\n width: calc(var(--spacing) * 24) !important;\n }\n .w-28 {\n width: calc(var(--spacing) * 28) !important;\n }\n .w-32 {\n width: calc(var(--spacing) * 32) !important;\n }\n .w-40 {\n width: calc(var(--spacing) * 40) !important;\n }\n .w-72 {\n width: calc(var(--spacing) * 72) !important;\n }\n .w-fit {\n width: -moz-fit-content !important;\n width: fit-content !important;\n }\n .w-full {\n width: 100% !important;\n }\n .max-w-\\[1200px\\] {\n max-width: 1200px !important;\n }\n .max-w-\\[calc\\(100\\%-2rem\\)\\] {\n max-width: calc(100% - 2rem) !important;\n }\n .min-w-0 {\n min-width: calc(var(--spacing) * 0) !important;\n }\n .min-w-\\[--radix-popper-anchor-width\\] {\n min-width: --radix-popper-anchor-width !important;\n }\n .min-w-\\[8rem\\] {\n min-width: 8rem !important;\n }\n .min-w-\\[var\\(--radix-select-trigger-width\\)\\] {\n min-width: var(--radix-select-trigger-width) !important;\n }\n .flex-1 {\n flex: 1 !important;\n }\n .shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-grow {\n flex-grow: 1 !important;\n }\n .origin-\\(--radix-dropdown-menu-content-transform-origin\\) {\n transform-origin: var(--radix-dropdown-menu-content-transform-origin) !important;\n }\n .origin-\\(--radix-popover-content-transform-origin\\) {\n transform-origin: var(--radix-popover-content-transform-origin) !important;\n }\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1/2 * 100%) * -1) !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n .translate-x-\\[-50\\%\\] {\n --tw-translate-x: -50% !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n .-translate-y-1\\/2 {\n --tw-translate-y: calc(calc(1/2 * 100%) * -1) !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n .translate-y-\\[-50\\%\\] {\n --tw-translate-y: -50% !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n .rotate-180 {\n rotate: 180deg !important;\n }\n .transform-none\\! {\n transform: none !important;\n }\n .animate-pulse {\n animation: var(--animate-pulse) !important;\n }\n .animate-spin {\n animation: var(--animate-spin) !important;\n }\n .cursor-default {\n cursor: default !important;\n }\n .cursor-pointer {\n cursor: pointer !important;\n }\n .scroll-my-1 {\n scroll-margin-block: calc(var(--spacing) * 1) !important;\n }\n .scroll-py-1 {\n scroll-padding-block: calc(var(--spacing) * 1) !important;\n }\n .grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr)) !important;\n }\n .flex-col {\n flex-direction: column !important;\n }\n .flex-col-reverse {\n flex-direction: column-reverse !important;\n }\n .items-center {\n align-items: center !important;\n }\n .justify-between {\n justify-content: space-between !important;\n }\n .justify-center {\n justify-content: center !important;\n }\n .justify-end {\n justify-content: flex-end !important;\n }\n .gap-1\\.5 {\n gap: calc(var(--spacing) * 1.5) !important;\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2) !important;\n }\n .gap-3 {\n gap: calc(var(--spacing) * 3) !important;\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4) !important;\n }\n .gap-5 {\n gap: calc(var(--spacing) * 5) !important;\n }\n .gap-6 {\n gap: calc(var(--spacing) * 6) !important;\n }\n .gap-\\[10px\\] {\n gap: 10px !important;\n }\n .space-y-2 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0 !important;\n margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse)) !important;\n margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))) !important;\n }\n }\n .space-y-4 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0 !important;\n margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse)) !important;\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse))) !important;\n }\n }\n .space-y-6 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0 !important;\n margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse)) !important;\n margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse))) !important;\n }\n }\n .space-x-2 {\n :where(& > :not(:last-child)) {\n --tw-space-x-reverse: 0 !important;\n margin-inline-start: calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse)) !important;\n margin-inline-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse))) !important;\n }\n }\n .overflow-hidden {\n overflow: hidden !important;\n }\n .overflow-x-hidden {\n overflow-x: hidden !important;\n }\n .overflow-y-auto {\n overflow-y: auto !important;\n }\n .rounded-\\[4px\\] {\n border-radius: 4px !important;\n }\n .rounded-full {\n border-radius: calc(infinity * 1px) !important;\n }\n .rounded-lg {\n border-radius: var(--bs-radius) !important;\n }\n .rounded-md {\n border-radius: calc(var(--bs-radius) - 2px) !important;\n }\n .rounded-sm {\n border-radius: calc(var(--bs-radius) - 4px) !important;\n }\n .rounded-xs {\n border-radius: var(--radius-xs) !important;\n }\n .border {\n border-style: var(--tw-border-style) !important;\n border-width: 1px !important;\n }\n .border-b {\n border-bottom-style: var(--tw-border-style) !important;\n border-bottom-width: 1px !important;\n }\n .border-input {\n border-color: var(--bs-input) !important;\n }\n .border-primary {\n border-color: var(--bs-primary) !important;\n }\n .bg-accent {\n background-color: var(--bs-accent) !important;\n }\n .bg-background {\n background-color: var(--bs-background) !important;\n }\n .bg-black\\/50 {\n background-color: color-mix(in srgb, #000 50%, transparent) !important;\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 50%, transparent) !important;\n }\n }\n .bg-border {\n background-color: var(--bs-border) !important;\n }\n .bg-destructive {\n background-color: var(--bs-destructive) !important;\n }\n .bg-muted {\n background-color: var(--bs-muted) !important;\n }\n .bg-popover {\n background-color: var(--bs-popover) !important;\n }\n .bg-primary {\n background-color: var(--bs-primary) !important;\n }\n .bg-secondary {\n background-color: var(--bs-secondary) !important;\n }\n .bg-transparent {\n background-color: transparent !important;\n }\n .fill-current {\n fill: currentcolor !important;\n }\n .fill-primary {\n fill: var(--bs-primary) !important;\n }\n .object-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n .p-0 {\n padding: calc(var(--spacing) * 0) !important;\n }\n .p-1 {\n padding: calc(var(--spacing) * 1) !important;\n }\n .p-4 {\n padding: calc(var(--spacing) * 4) !important;\n }\n .p-6 {\n padding: calc(var(--spacing) * 6) !important;\n }\n .px-2 {\n padding-inline: calc(var(--spacing) * 2) !important;\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3) !important;\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4) !important;\n }\n .px-6 {\n padding-inline: calc(var(--spacing) * 6) !important;\n }\n .py-1 {\n padding-block: calc(var(--spacing) * 1) !important;\n }\n .py-1\\.5 {\n padding-block: calc(var(--spacing) * 1.5) !important;\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2) !important;\n }\n .py-3 {\n padding-block: calc(var(--spacing) * 3) !important;\n }\n .py-4 {\n padding-block: calc(var(--spacing) * 4) !important;\n }\n .py-6 {\n padding-block: calc(var(--spacing) * 6) !important;\n }\n .pt-2 {\n padding-top: calc(var(--spacing) * 2) !important;\n }\n .pt-4 {\n padding-top: calc(var(--spacing) * 4) !important;\n }\n .pt-8 {\n padding-top: calc(var(--spacing) * 8) !important;\n }\n .pr-2 {\n padding-right: calc(var(--spacing) * 2) !important;\n }\n .pr-8 {\n padding-right: calc(var(--spacing) * 8) !important;\n }\n .pb-2 {\n padding-bottom: calc(var(--spacing) * 2) !important;\n }\n .pl-2 {\n padding-left: calc(var(--spacing) * 2) !important;\n }\n .pl-8 {\n padding-left: calc(var(--spacing) * 8) !important;\n }\n .text-center {\n text-align: center !important;\n }\n .text-right {\n text-align: right !important;\n }\n .text-base {\n font-size: var(--text-base) !important;\n line-height: var(--tw-leading, var(--text-base--line-height)) !important;\n }\n .text-lg {\n font-size: var(--text-lg) !important;\n line-height: var(--tw-leading, var(--text-lg--line-height)) !important;\n }\n .text-sm {\n font-size: var(--text-sm) !important;\n line-height: var(--tw-leading, var(--text-sm--line-height)) !important;\n }\n .text-xs {\n font-size: var(--text-xs) !important;\n line-height: var(--tw-leading, var(--text-xs--line-height)) !important;\n }\n .leading-none {\n --tw-leading: 1 !important;\n line-height: 1 !important;\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold) !important;\n font-weight: var(--font-weight-bold) !important;\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium) !important;\n font-weight: var(--font-weight-medium) !important;\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold) !important;\n font-weight: var(--font-weight-semibold) !important;\n }\n .tracking-tight {\n --tw-tracking: var(--tracking-tight) !important;\n letter-spacing: var(--tracking-tight) !important;\n }\n .tracking-widest {\n --tw-tracking: var(--tracking-widest) !important;\n letter-spacing: var(--tracking-widest) !important;\n }\n .text-ellipsis {\n text-overflow: ellipsis !important;\n }\n .whitespace-nowrap {\n white-space: nowrap !important;\n }\n .text-background {\n color: var(--bs-background) !important;\n }\n .text-current {\n color: currentcolor !important;\n }\n .text-destructive {\n color: var(--bs-destructive) !important;\n }\n .text-destructive-foreground {\n color: var(--bs-destructive-foreground) !important;\n }\n .text-foreground {\n color: var(--bs-foreground) !important;\n }\n .text-muted-foreground {\n color: var(--bs-muted-foreground) !important;\n }\n .text-popover-foreground {\n color: var(--bs-popover-foreground) !important;\n }\n .text-primary {\n color: var(--bs-primary) !important;\n }\n .text-primary-foreground {\n color: var(--bs-primary-foreground) !important;\n }\n .text-red-500 {\n color: var(--color-red-500) !important;\n }\n .text-secondary-foreground {\n color: var(--bs-secondary-foreground) !important;\n }\n .text-white {\n color: var(--color-white) !important;\n }\n .underline-offset-4 {\n text-underline-offset: 4px !important;\n }\n .opacity-0 {\n opacity: 0% !important;\n }\n .opacity-50 {\n opacity: 50% !important;\n }\n .opacity-70 {\n opacity: 70% !important;\n }\n .opacity-100 {\n opacity: 100% !important;\n }\n .shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1)) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n .shadow-md {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1)) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n .shadow-sm {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n .shadow-xs {\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05)) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n .ring {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n .ring-offset-background {\n --tw-ring-offset-color: var(--bs-background) !important;\n }\n .outline-hidden {\n --tw-outline-style: none !important;\n outline-style: none !important;\n @media (forced-colors: active) {\n outline: 2px solid transparent !important;\n outline-offset: 2px !important;\n }\n }\n .outline {\n outline-style: var(--tw-outline-style) !important;\n outline-width: 1px !important;\n }\n .transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter !important;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)) !important;\n transition-duration: var(--tw-duration, var(--default-transition-duration)) !important;\n }\n .transition-\\[color\\,box-shadow\\] {\n transition-property: color,box-shadow !important;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)) !important;\n transition-duration: var(--tw-duration, var(--default-transition-duration)) !important;\n }\n .transition-opacity {\n transition-property: opacity !important;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)) !important;\n transition-duration: var(--tw-duration, var(--default-transition-duration)) !important;\n }\n .transition-shadow {\n transition-property: box-shadow !important;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)) !important;\n transition-duration: var(--tw-duration, var(--default-transition-duration)) !important;\n }\n .transition-transform {\n transition-property: transform, translate, scale, rotate !important;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)) !important;\n transition-duration: var(--tw-duration, var(--default-transition-duration)) !important;\n }\n .transition-none {\n transition-property: none !important;\n }\n .duration-200 {\n --tw-duration: 200ms !important;\n transition-duration: 200ms !important;\n }\n .outline-none {\n --tw-outline-style: none !important;\n outline-style: none !important;\n }\n .select-none {\n -webkit-user-select: none !important;\n -moz-user-select: none !important;\n user-select: none !important;\n }\n .duration-200 {\n animation-duration: 200ms !important;\n }\n .group-data-\\[disabled\\=true\\]\\:pointer-events-none {\n &:is(:where(.group)[data-disabled=\"true\"] *) {\n pointer-events: none !important;\n }\n }\n .group-data-\\[disabled\\=true\\]\\:opacity-50 {\n &:is(:where(.group)[data-disabled=\"true\"] *) {\n opacity: 50% !important;\n }\n }\n .peer-disabled\\:cursor-not-allowed {\n &:is(:where(.peer):disabled ~ *) {\n cursor: not-allowed !important;\n }\n }\n .peer-disabled\\:opacity-50 {\n &:is(:where(.peer):disabled ~ *) {\n opacity: 50% !important;\n }\n }\n .selection\\:bg-primary {\n & *::-moz-selection {\n background-color: var(--bs-primary) !important;\n }\n & *::selection {\n background-color: var(--bs-primary) !important;\n }\n &::-moz-selection {\n background-color: var(--bs-primary) !important;\n }\n &::selection {\n background-color: var(--bs-primary) !important;\n }\n }\n .selection\\:text-primary-foreground {\n & *::-moz-selection {\n color: var(--bs-primary-foreground) !important;\n }\n & *::selection {\n color: var(--bs-primary-foreground) !important;\n }\n &::-moz-selection {\n color: var(--bs-primary-foreground) !important;\n }\n &::selection {\n color: var(--bs-primary-foreground) !important;\n }\n }\n .file\\:inline-flex {\n &::file-selector-button {\n display: inline-flex !important;\n }\n }\n .file\\:h-7 {\n &::file-selector-button {\n height: calc(var(--spacing) * 7) !important;\n }\n }\n .file\\:border-0 {\n &::file-selector-button {\n border-style: var(--tw-border-style) !important;\n border-width: 0px !important;\n }\n }\n .file\\:bg-transparent {\n &::file-selector-button {\n background-color: transparent !important;\n }\n }\n .file\\:text-sm {\n &::file-selector-button {\n font-size: var(--text-sm) !important;\n line-height: var(--tw-leading, var(--text-sm--line-height)) !important;\n }\n }\n .file\\:font-medium {\n &::file-selector-button {\n --tw-font-weight: var(--font-weight-medium) !important;\n font-weight: var(--font-weight-medium) !important;\n }\n }\n .file\\:text-foreground {\n &::file-selector-button {\n color: var(--bs-foreground) !important;\n }\n }\n .placeholder\\:text-muted-foreground {\n &::-moz-placeholder {\n color: var(--bs-muted-foreground) !important;\n }\n &::placeholder {\n color: var(--bs-muted-foreground) !important;\n }\n }\n .hover\\:bg-accent {\n &:hover {\n @media (hover: hover) {\n background-color: var(--bs-accent) !important;\n }\n }\n }\n .hover\\:bg-destructive\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--bs-destructive) 90%, transparent) !important;\n }\n }\n }\n }\n .hover\\:bg-primary\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--bs-primary) !important;\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--bs-primary) 90%, transparent) !important;\n }\n }\n }\n }\n .hover\\:bg-secondary\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--bs-secondary) !important;\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--bs-secondary) 80%, transparent) !important;\n }\n }\n }\n }\n .hover\\:text-accent-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--bs-accent-foreground) !important;\n }\n }\n }\n .hover\\:underline {\n &:hover {\n @media (hover: hover) {\n text-decoration-line: underline !important;\n }\n }\n }\n .hover\\:opacity-100 {\n &:hover {\n @media (hover: hover) {\n opacity: 100% !important;\n }\n }\n }\n .focus\\:bg-accent {\n &:focus {\n background-color: var(--bs-accent) !important;\n }\n }\n .focus\\:text-accent-foreground {\n &:focus {\n color: var(--bs-accent-foreground) !important;\n }\n }\n .focus\\:ring-1 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n }\n .focus\\:ring-2 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n }\n .focus\\:ring-ring {\n &:focus {\n --tw-ring-color: var(--bs-ring) !important;\n }\n }\n .focus\\:ring-offset-2 {\n &:focus {\n --tw-ring-offset-width: 2px !important;\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;\n }\n }\n .focus\\:outline-hidden {\n &:focus {\n --tw-outline-style: none !important;\n outline-style: none !important;\n @media (forced-colors: active) {\n outline: 2px solid transparent !important;\n outline-offset: 2px !important;\n }\n }\n }\n .focus\\:outline-none {\n &:focus {\n --tw-outline-style: none !important;\n outline-style: none !important;\n }\n }\n .focus-visible\\:border-ring {\n &:focus-visible {\n border-color: var(--bs-ring) !important;\n }\n }\n .focus-visible\\:ring-\\[3px\\] {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n }\n .focus-visible\\:ring-destructive\\/20 {\n &:focus-visible {\n --tw-ring-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--bs-destructive) 20%, transparent) !important;\n }\n }\n }\n .focus-visible\\:ring-ring\\/50 {\n &:focus-visible {\n --tw-ring-color: var(--bs-ring) !important;\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--bs-ring) 50%, transparent) !important;\n }\n }\n }\n .disabled\\:pointer-events-none {\n &:disabled {\n pointer-events: none !important;\n }\n }\n .disabled\\:cursor-not-allowed {\n &:disabled {\n cursor: not-allowed !important;\n }\n }\n .disabled\\:opacity-50 {\n &:disabled {\n opacity: 50% !important;\n }\n }\n .has-\\[\\>svg\\]\\:px-2\\.5 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 2.5) !important;\n }\n }\n .has-\\[\\>svg\\]\\:px-3 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 3) !important;\n }\n }\n .has-\\[\\>svg\\]\\:px-4 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 4) !important;\n }\n }\n .aria-invalid\\:border-destructive {\n &[aria-invalid=\"true\"] {\n border-color: var(--bs-destructive) !important;\n }\n }\n .aria-invalid\\:ring-destructive\\/20 {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--bs-destructive) 20%, transparent) !important;\n }\n }\n }\n .data-\\[disabled\\]\\:pointer-events-none {\n &[data-disabled] {\n pointer-events: none !important;\n }\n }\n .data-\\[disabled\\]\\:opacity-50 {\n &[data-disabled] {\n opacity: 50% !important;\n }\n }\n .data-\\[disabled\\=true\\]\\:pointer-events-none {\n &[data-disabled=\"true\"] {\n pointer-events: none !important;\n }\n }\n .data-\\[disabled\\=true\\]\\:opacity-50 {\n &[data-disabled=\"true\"] {\n opacity: 50% !important;\n }\n }\n .data-\\[error\\=true\\]\\:text-destructive-foreground {\n &[data-error=\"true\"] {\n color: var(--bs-destructive-foreground) !important;\n }\n }\n .data-\\[inset\\]\\:pl-8 {\n &[data-inset] {\n padding-left: calc(var(--spacing) * 8) !important;\n }\n }\n .data-\\[placeholder\\]\\:text-muted-foreground {\n &[data-placeholder] {\n color: var(--bs-muted-foreground) !important;\n }\n }\n .data-\\[selected\\=true\\]\\:bg-accent {\n &[data-selected=\"true\"] {\n background-color: var(--bs-accent) !important;\n }\n }\n .data-\\[selected\\=true\\]\\:text-accent-foreground {\n &[data-selected=\"true\"] {\n color: var(--bs-accent-foreground) !important;\n }\n }\n .data-\\[side\\=bottom\\]\\:translate-y-1 {\n &[data-side=\"bottom\"] {\n --tw-translate-y: calc(var(--spacing) * 1) !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n }\n .data-\\[side\\=bottom\\]\\:slide-in-from-top-2 {\n &[data-side=\"bottom\"] {\n --tw-enter-translate-y: -0.5rem !important;\n }\n }\n .data-\\[side\\=left\\]\\:-translate-x-1 {\n &[data-side=\"left\"] {\n --tw-translate-x: calc(var(--spacing) * -1) !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n }\n .data-\\[side\\=left\\]\\:slide-in-from-right-2 {\n &[data-side=\"left\"] {\n --tw-enter-translate-x: 0.5rem !important;\n }\n }\n .data-\\[side\\=right\\]\\:translate-x-1 {\n &[data-side=\"right\"] {\n --tw-translate-x: calc(var(--spacing) * 1) !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n }\n .data-\\[side\\=right\\]\\:slide-in-from-left-2 {\n &[data-side=\"right\"] {\n --tw-enter-translate-x: -0.5rem !important;\n }\n }\n .data-\\[side\\=top\\]\\:-translate-y-1 {\n &[data-side=\"top\"] {\n --tw-translate-y: calc(var(--spacing) * -1) !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n }\n .data-\\[side\\=top\\]\\:slide-in-from-bottom-2 {\n &[data-side=\"top\"] {\n --tw-enter-translate-y: 0.5rem !important;\n }\n }\n .\\*\\*\\:data-\\[slot\\=command-input-wrapper\\]\\:h-12 {\n :is(& *) {\n &[data-slot=\"command-input-wrapper\"] {\n height: calc(var(--spacing) * 12) !important;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1 {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n overflow: hidden !important;\n display: -webkit-box !important;\n -webkit-box-orient: vertical !important;\n -webkit-line-clamp: 1 !important;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:flex {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n display: flex !important;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:items-center {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n align-items: center !important;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:gap-2 {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n gap: calc(var(--spacing) * 2) !important;\n }\n }\n }\n .data-\\[state\\=checked\\]\\:border-primary {\n &[data-state=\"checked\"] {\n border-color: var(--bs-primary) !important;\n }\n }\n .data-\\[state\\=checked\\]\\:bg-primary {\n &[data-state=\"checked\"] {\n background-color: var(--bs-primary) !important;\n }\n }\n .data-\\[state\\=checked\\]\\:text-primary-foreground {\n &[data-state=\"checked\"] {\n color: var(--bs-primary-foreground) !important;\n }\n }\n .data-\\[state\\=closed\\]\\:animate-out {\n &[data-state=\"closed\"] {\n animation-name: exit !important;\n animation-duration: 150ms !important;\n --tw-exit-opacity: initial !important;\n --tw-exit-scale: initial !important;\n --tw-exit-rotate: initial !important;\n --tw-exit-translate-x: initial !important;\n --tw-exit-translate-y: initial !important;\n }\n }\n .data-\\[state\\=closed\\]\\:fade-out-0 {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: 0 !important;\n }\n }\n .data-\\[state\\=closed\\]\\:zoom-out-95 {\n &[data-state=\"closed\"] {\n --tw-exit-scale: .95 !important;\n }\n }\n .data-\\[state\\=open\\]\\:bg-accent {\n &[data-state=\"open\"] {\n background-color: var(--bs-accent) !important;\n }\n }\n .data-\\[state\\=open\\]\\:text-accent-foreground {\n &[data-state=\"open\"] {\n color: var(--bs-accent-foreground) !important;\n }\n }\n .data-\\[state\\=open\\]\\:text-muted-foreground {\n &[data-state=\"open\"] {\n color: var(--bs-muted-foreground) !important;\n }\n }\n .data-\\[state\\=open\\]\\:animate-in {\n &[data-state=\"open\"] {\n animation-name: enter !important;\n animation-duration: 150ms !important;\n --tw-enter-opacity: initial !important;\n --tw-enter-scale: initial !important;\n --tw-enter-rotate: initial !important;\n --tw-enter-translate-x: initial !important;\n --tw-enter-translate-y: initial !important;\n }\n }\n .data-\\[state\\=open\\]\\:fade-in-0 {\n &[data-state=\"open\"] {\n --tw-enter-opacity: 0 !important;\n }\n }\n .data-\\[state\\=open\\]\\:zoom-in-95 {\n &[data-state=\"open\"] {\n --tw-enter-scale: .95 !important;\n }\n }\n .data-\\[variant\\=destructive\\]\\:text-destructive {\n &[data-variant=\"destructive\"] {\n color: var(--bs-destructive) !important;\n }\n }\n .data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10 {\n &[data-variant=\"destructive\"] {\n &:focus {\n background-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--bs-destructive) 10%, transparent) !important;\n }\n }\n }\n }\n .data-\\[variant\\=destructive\\]\\:focus\\:text-destructive {\n &[data-variant=\"destructive\"] {\n &:focus {\n color: var(--bs-destructive) !important;\n }\n }\n }\n .max-sm\\:hidden {\n @media (width < 40rem) {\n display: none !important;\n }\n }\n .sm\\:max-h-\\[270px\\] {\n @media (width >= 40rem) {\n max-height: 270px !important;\n }\n }\n .sm\\:max-w-\\[500px\\] {\n @media (width >= 40rem) {\n max-width: 500px !important;\n }\n }\n .sm\\:max-w-lg {\n @media (width >= 40rem) {\n max-width: var(--container-lg) !important;\n }\n }\n .sm\\:flex-row {\n @media (width >= 40rem) {\n flex-direction: row !important;\n }\n }\n .sm\\:justify-end {\n @media (width >= 40rem) {\n justify-content: flex-end !important;\n }\n }\n .sm\\:text-left {\n @media (width >= 40rem) {\n text-align: left !important;\n }\n }\n .md\\:order-last {\n @media (width >= 48rem) {\n order: 9999 !important;\n }\n }\n .md\\:order-none {\n @media (width >= 48rem) {\n order: 0 !important;\n }\n }\n .md\\:col-span-2 {\n @media (width >= 48rem) {\n grid-column: span 2 / span 2 !important;\n }\n }\n .md\\:col-span-3 {\n @media (width >= 48rem) {\n grid-column: span 3 / span 3 !important;\n }\n }\n .md\\:col-span-4 {\n @media (width >= 48rem) {\n grid-column: span 4 / span 4 !important;\n }\n }\n .md\\:block {\n @media (width >= 48rem) {\n display: block !important;\n }\n }\n .md\\:flex {\n @media (width >= 48rem) {\n display: flex !important;\n }\n }\n .md\\:grid {\n @media (width >= 48rem) {\n display: grid !important;\n }\n }\n .md\\:hidden {\n @media (width >= 48rem) {\n display: none !important;\n }\n }\n .md\\:grid-cols-2 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr)) !important;\n }\n }\n .md\\:grid-cols-7 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(7, minmax(0, 1fr)) !important;\n }\n }\n .md\\:gap-0 {\n @media (width >= 48rem) {\n gap: calc(var(--spacing) * 0) !important;\n }\n }\n .md\\:px-8 {\n @media (width >= 48rem) {\n padding-inline: calc(var(--spacing) * 8) !important;\n }\n }\n .md\\:py-12 {\n @media (width >= 48rem) {\n padding-block: calc(var(--spacing) * 12) !important;\n }\n }\n .md\\:text-sm {\n @media (width >= 48rem) {\n font-size: var(--text-sm) !important;\n line-height: var(--tw-leading, var(--text-sm--line-height)) !important;\n }\n }\n .dark\\:focus-visible\\:ring-destructive\\/40 {\n @media (prefers-color-scheme: dark) {\n &:focus-visible {\n --tw-ring-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--bs-destructive) 40%, transparent) !important;\n }\n }\n }\n }\n .dark\\:aria-invalid\\:ring-destructive\\/40 {\n @media (prefers-color-scheme: dark) {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--bs-destructive) 40%, transparent) !important;\n }\n }\n }\n }\n .dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20 {\n @media (prefers-color-scheme: dark) {\n &[data-variant=\"destructive\"] {\n &:focus {\n background-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--bs-destructive) 20%, transparent) !important;\n }\n }\n }\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:px-2 {\n & [cmdk-group-heading] {\n padding-inline: calc(var(--spacing) * 2) !important;\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:py-1\\.5 {\n & [cmdk-group-heading] {\n padding-block: calc(var(--spacing) * 1.5) !important;\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-xs {\n & [cmdk-group-heading] {\n font-size: var(--text-xs) !important;\n line-height: var(--tw-leading, var(--text-xs--line-height)) !important;\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:font-medium {\n & [cmdk-group-heading] {\n --tw-font-weight: var(--font-weight-medium) !important;\n font-weight: var(--font-weight-medium) !important;\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-muted-foreground {\n & [cmdk-group-heading] {\n color: var(--bs-muted-foreground) !important;\n }\n }\n .\\[\\&_\\[cmdk-group\\]\\]\\:px-2 {\n & [cmdk-group] {\n padding-inline: calc(var(--spacing) * 2) !important;\n }\n }\n .\\[\\&_\\[cmdk-group\\]\\:not\\(\\[hidden\\]\\)_\\~\\[cmdk-group\\]\\]\\:pt-0 {\n & [cmdk-group]:not([hidden]) ~[cmdk-group] {\n padding-top: calc(var(--spacing) * 0) !important;\n }\n }\n .\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:h-5 {\n & [cmdk-input-wrapper] svg {\n height: calc(var(--spacing) * 5) !important;\n }\n }\n .\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:w-5 {\n & [cmdk-input-wrapper] svg {\n width: calc(var(--spacing) * 5) !important;\n }\n }\n .\\[\\&_\\[cmdk-input\\]\\]\\:h-12 {\n & [cmdk-input] {\n height: calc(var(--spacing) * 12) !important;\n }\n }\n .\\[\\&_\\[cmdk-item\\]\\]\\:px-2 {\n & [cmdk-item] {\n padding-inline: calc(var(--spacing) * 2) !important;\n }\n }\n .\\[\\&_\\[cmdk-item\\]\\]\\:py-3 {\n & [cmdk-item] {\n padding-block: calc(var(--spacing) * 3) !important;\n }\n }\n .\\[\\&_\\[cmdk-item\\]_svg\\]\\:h-5 {\n & [cmdk-item] svg {\n height: calc(var(--spacing) * 5) !important;\n }\n }\n .\\[\\&_\\[cmdk-item\\]_svg\\]\\:w-5 {\n & [cmdk-item] svg {\n width: calc(var(--spacing) * 5) !important;\n }\n }\n .\\[\\&_svg\\]\\:pointer-events-none {\n & svg {\n pointer-events: none !important;\n }\n }\n .\\[\\&_svg\\]\\:shrink-0 {\n & svg {\n flex-shrink: 0 !important;\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 4) !important;\n height: calc(var(--spacing) * 4) !important;\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'text-\\'\\]\\)\\]\\:text-muted-foreground {\n & svg:not([class*='text-']) {\n color: var(--bs-muted-foreground) !important;\n }\n }\n .\\*\\:\\[span\\]\\:last\\:flex {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n display: flex !important;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:items-center {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n align-items: center !important;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:gap-2 {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n gap: calc(var(--spacing) * 2) !important;\n }\n }\n }\n }\n .data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:\\!text-destructive {\n &[data-variant=\"destructive\"] {\n :is(& > *) {\n &:is(svg) {\n color: var(--bs-destructive) !important;\n }\n }\n }\n }\n .\\[\\&\\>span\\]\\:line-clamp-1 {\n &>span {\n overflow: hidden !important;\n display: -webkit-box !important;\n -webkit-box-orient: vertical !important;\n -webkit-line-clamp: 1 !important;\n }\n }\n}\n.checkout-embed {\n :root {\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --destructive-foreground: oklch(0.577 0.245 27.325);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.646 0.222 41.116);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n --radius: 0.625rem;\n --sidebar: oklch(0.985 0 0);\n --sidebar-foreground: oklch(0.145 0 0);\n --sidebar-primary: oklch(0.205 0 0);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.97 0 0);\n --sidebar-accent-foreground: oklch(0.205 0 0);\n --sidebar-border: oklch(0.922 0 0);\n --sidebar-ring: oklch(0.708 0 0);\n }\n @layer base {\n * {\n border-color: var(--bs-border) !important;\n outline-color: var(--bs-ring) !important;\n @supports (color: color-mix(in lab, red, red)) {\n outline-color: color-mix(in oklab, var(--bs-ring) 50%, transparent) !important;\n }\n }\n .checkout-embed {\n background-color: var(--bs-background) !important;\n font-family: var(--bs-font-sans), Helvetica, Arial, apple-system, sans-serif !important;\n color: var(--bs-foreground) !important;\n }\n h2 {\n font-size: var(--text-2xl) !important;\n line-height: var(--tw-leading, var(--text-2xl--line-height)) !important;\n --tw-font-weight: var(--font-weight-bold) !important;\n font-weight: var(--font-weight-bold) !important;\n --tw-tracking: var(--tracking-tight) !important;\n letter-spacing: var(--tracking-tight) !important;\n }\n p {\n --tw-tracking: var(--tracking-tight) !important;\n letter-spacing: var(--tracking-tight) !important;\n }\n }\n @layer utilities {\n .scrollbar-hidden {\n scrollbar-width: none;\n }\n .scrollbar-hidden::-webkit-scrollbar {\n display: none;\n }\n }\n}\n@keyframes enter {\n from {\n opacity: var(--tw-enter-opacity, 1);\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\n }\n}\n@keyframes exit {\n to {\n opacity: var(--tw-exit-opacity, 1);\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\n }\n}\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-space-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-space-x-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-leading {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-tracking {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-duration {\n syntax: \"*\";\n inherits: false;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-space-y-reverse: 0;\n --tw-space-x-reverse: 0;\n --tw-border-style: solid;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-tracking: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-duration: initial;\n }\n }\n}\n";
|
|
35918
|
+
var css_248z = "/*! tailwindcss v4.1.7 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace;\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-black: #000;\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-lg: 32rem;\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-base: 1rem;\n --text-base--line-height: calc(1.5 / 1);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --tracking-tight: -0.025em;\n --tracking-widest: 0.1em;\n --radius-xs: 0.125rem;\n --animate-spin: spin 1s linear infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: var(--bs-font-sans), Helvetica, Arial, apple-system, sans-serif;\n --default-mono-font-family: var(--font-mono);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n -moz-tab-size: 4;\n -o-tab-size: 4;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::-moz-placeholder {\n opacity: 1;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::-moz-placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n -webkit-appearance: button;\n -moz-appearance: button;\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .pointer-events-none {\n pointer-events: none !important;\n }\n .sr-only {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border-width: 0 !important;\n }\n .absolute {\n position: absolute !important;\n }\n .fixed {\n position: fixed !important;\n }\n .relative {\n position: relative !important;\n }\n .sticky {\n position: sticky !important;\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0) !important;\n }\n .-top-2 {\n top: calc(var(--spacing) * -2) !important;\n }\n .top-0 {\n top: calc(var(--spacing) * 0) !important;\n }\n .top-0\\.5 {\n top: calc(var(--spacing) * 0.5) !important;\n }\n .top-1\\/2 {\n top: calc(1/2 * 100%) !important;\n }\n .top-4 {\n top: calc(var(--spacing) * 4) !important;\n }\n .top-\\[50\\%\\] {\n top: 50% !important;\n }\n .-right-2 {\n right: calc(var(--spacing) * -2) !important;\n }\n .right-2 {\n right: calc(var(--spacing) * 2) !important;\n }\n .right-4 {\n right: calc(var(--spacing) * 4) !important;\n }\n .left-1\\/2 {\n left: calc(1/2 * 100%) !important;\n }\n .left-2 {\n left: calc(var(--spacing) * 2) !important;\n }\n .left-\\[50\\%\\] {\n left: 50% !important;\n }\n .z-10 {\n z-index: 10 !important;\n }\n .z-50 {\n z-index: 50 !important;\n }\n .order-3 {\n order: 3 !important;\n }\n .order-4 {\n order: 4 !important;\n }\n .order-5 {\n order: 5 !important;\n }\n .order-6 {\n order: 6 !important;\n }\n .order-7 {\n order: 7 !important;\n }\n .order-first {\n order: -9999 !important;\n }\n .col-span-2 {\n grid-column: span 2 / span 2 !important;\n }\n .-m-0\\.5 {\n margin: calc(var(--spacing) * -0.5) !important;\n }\n .-mx-1 {\n margin-inline: calc(var(--spacing) * -1) !important;\n }\n .mx-auto {\n margin-inline: auto !important;\n }\n .my-1 {\n margin-block: calc(var(--spacing) * 1) !important;\n }\n .my-2 {\n margin-block: calc(var(--spacing) * 2) !important;\n }\n .mt-2 {\n margin-top: calc(var(--spacing) * 2) !important;\n }\n .mt-8 {\n margin-top: calc(var(--spacing) * 8) !important;\n }\n .-mb-0\\.5 {\n margin-bottom: calc(var(--spacing) * -0.5) !important;\n }\n .mb-1 {\n margin-bottom: calc(var(--spacing) * 1) !important;\n }\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2) !important;\n }\n .ml-4 {\n margin-left: calc(var(--spacing) * 4) !important;\n }\n .ml-auto {\n margin-left: auto !important;\n }\n .block {\n display: block !important;\n }\n .flex {\n display: flex !important;\n }\n .grid {\n display: grid !important;\n }\n .hidden {\n display: none !important;\n }\n .inline-flex {\n display: inline-flex !important;\n }\n .aspect-square {\n aspect-ratio: 1 / 1 !important;\n }\n .size-2 {\n width: calc(var(--spacing) * 2) !important;\n height: calc(var(--spacing) * 2) !important;\n }\n .size-3 {\n width: calc(var(--spacing) * 3) !important;\n height: calc(var(--spacing) * 3) !important;\n }\n .size-3\\.5 {\n width: calc(var(--spacing) * 3.5) !important;\n height: calc(var(--spacing) * 3.5) !important;\n }\n .size-4 {\n width: calc(var(--spacing) * 4) !important;\n height: calc(var(--spacing) * 4) !important;\n }\n .size-5 {\n width: calc(var(--spacing) * 5) !important;\n height: calc(var(--spacing) * 5) !important;\n }\n .size-9 {\n width: calc(var(--spacing) * 9) !important;\n height: calc(var(--spacing) * 9) !important;\n }\n .size-16 {\n width: calc(var(--spacing) * 16) !important;\n height: calc(var(--spacing) * 16) !important;\n }\n .h-3 {\n height: calc(var(--spacing) * 3) !important;\n }\n .h-3\\.5 {\n height: calc(var(--spacing) * 3.5) !important;\n }\n .h-4 {\n height: calc(var(--spacing) * 4) !important;\n }\n .h-5 {\n height: calc(var(--spacing) * 5) !important;\n }\n .h-6 {\n height: calc(var(--spacing) * 6) !important;\n }\n .h-8 {\n height: calc(var(--spacing) * 8) !important;\n }\n .h-9 {\n height: calc(var(--spacing) * 9) !important;\n }\n .h-10 {\n height: calc(var(--spacing) * 10) !important;\n }\n .h-12 {\n height: calc(var(--spacing) * 12) !important;\n }\n .h-16 {\n height: calc(var(--spacing) * 16) !important;\n }\n .h-\\[18px\\] {\n height: 18px !important;\n }\n .h-\\[20px\\] {\n height: 20px !important;\n }\n .h-\\[var\\(--radix-select-trigger-height\\)\\] {\n height: var(--radix-select-trigger-height) !important;\n }\n .h-auto {\n height: auto !important;\n }\n .h-auto\\! {\n height: auto !important;\n }\n .h-full {\n height: 100% !important;\n }\n .h-px {\n height: 1px !important;\n }\n .max-h-\\(--radix-dropdown-menu-content-available-height\\) {\n max-height: var(--radix-dropdown-menu-content-available-height) !important;\n }\n .max-h-96 {\n max-height: calc(var(--spacing) * 96) !important;\n }\n .max-h-\\[200px\\] {\n max-height: 200px !important;\n }\n .max-h-\\[300px\\] {\n max-height: 300px !important;\n }\n .min-h-full {\n min-height: 100% !important;\n }\n .min-h-screen {\n min-height: 100vh !important;\n }\n .w-0 {\n width: calc(var(--spacing) * 0) !important;\n }\n .w-4 {\n width: calc(var(--spacing) * 4) !important;\n }\n .w-5 {\n width: calc(var(--spacing) * 5) !important;\n }\n .w-6 {\n width: calc(var(--spacing) * 6) !important;\n }\n .w-10 {\n width: calc(var(--spacing) * 10) !important;\n }\n .w-12 {\n width: calc(var(--spacing) * 12) !important;\n }\n .w-16 {\n width: calc(var(--spacing) * 16) !important;\n }\n .w-20 {\n width: calc(var(--spacing) * 20) !important;\n }\n .w-24 {\n width: calc(var(--spacing) * 24) !important;\n }\n .w-28 {\n width: calc(var(--spacing) * 28) !important;\n }\n .w-32 {\n width: calc(var(--spacing) * 32) !important;\n }\n .w-40 {\n width: calc(var(--spacing) * 40) !important;\n }\n .w-72 {\n width: calc(var(--spacing) * 72) !important;\n }\n .w-fit {\n width: -moz-fit-content !important;\n width: fit-content !important;\n }\n .w-full {\n width: 100% !important;\n }\n .max-w-\\[1200px\\] {\n max-width: 1200px !important;\n }\n .max-w-\\[calc\\(100\\%-2rem\\)\\] {\n max-width: calc(100% - 2rem) !important;\n }\n .min-w-0 {\n min-width: calc(var(--spacing) * 0) !important;\n }\n .min-w-\\[--radix-popper-anchor-width\\] {\n min-width: --radix-popper-anchor-width !important;\n }\n .min-w-\\[8rem\\] {\n min-width: 8rem !important;\n }\n .min-w-\\[var\\(--radix-select-trigger-width\\)\\] {\n min-width: var(--radix-select-trigger-width) !important;\n }\n .flex-1 {\n flex: 1 !important;\n }\n .shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-grow {\n flex-grow: 1 !important;\n }\n .origin-\\(--radix-dropdown-menu-content-transform-origin\\) {\n transform-origin: var(--radix-dropdown-menu-content-transform-origin) !important;\n }\n .origin-\\(--radix-popover-content-transform-origin\\) {\n transform-origin: var(--radix-popover-content-transform-origin) !important;\n }\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1/2 * 100%) * -1) !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n .translate-x-\\[-50\\%\\] {\n --tw-translate-x: -50% !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n .-translate-y-1\\/2 {\n --tw-translate-y: calc(calc(1/2 * 100%) * -1) !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n .translate-y-\\[-50\\%\\] {\n --tw-translate-y: -50% !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n .rotate-180 {\n rotate: 180deg !important;\n }\n .transform-none\\! {\n transform: none !important;\n }\n .animate-pulse {\n animation: var(--animate-pulse) !important;\n }\n .animate-spin {\n animation: var(--animate-spin) !important;\n }\n .cursor-default {\n cursor: default !important;\n }\n .cursor-pointer {\n cursor: pointer !important;\n }\n .scroll-my-1 {\n scroll-margin-block: calc(var(--spacing) * 1) !important;\n }\n .scroll-py-1 {\n scroll-padding-block: calc(var(--spacing) * 1) !important;\n }\n .grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr)) !important;\n }\n .flex-col {\n flex-direction: column !important;\n }\n .flex-col-reverse {\n flex-direction: column-reverse !important;\n }\n .items-center {\n align-items: center !important;\n }\n .justify-between {\n justify-content: space-between !important;\n }\n .justify-center {\n justify-content: center !important;\n }\n .justify-end {\n justify-content: flex-end !important;\n }\n .gap-0 {\n gap: calc(var(--spacing) * 0) !important;\n }\n .gap-0\\.5 {\n gap: calc(var(--spacing) * 0.5) !important;\n }\n .gap-1\\.5 {\n gap: calc(var(--spacing) * 1.5) !important;\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2) !important;\n }\n .gap-3 {\n gap: calc(var(--spacing) * 3) !important;\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4) !important;\n }\n .gap-5 {\n gap: calc(var(--spacing) * 5) !important;\n }\n .gap-6 {\n gap: calc(var(--spacing) * 6) !important;\n }\n .gap-\\[10px\\] {\n gap: 10px !important;\n }\n .space-y-2 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0 !important;\n margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse)) !important;\n margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))) !important;\n }\n }\n .space-y-4 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0 !important;\n margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse)) !important;\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse))) !important;\n }\n }\n .space-y-6 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0 !important;\n margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse)) !important;\n margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse))) !important;\n }\n }\n .space-x-2 {\n :where(& > :not(:last-child)) {\n --tw-space-x-reverse: 0 !important;\n margin-inline-start: calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse)) !important;\n margin-inline-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse))) !important;\n }\n }\n .overflow-hidden {\n overflow: hidden !important;\n }\n .overflow-x-hidden {\n overflow-x: hidden !important;\n }\n .overflow-y-auto {\n overflow-y: auto !important;\n }\n .rounded-\\[4px\\] {\n border-radius: 4px !important;\n }\n .rounded-full {\n border-radius: calc(infinity * 1px) !important;\n }\n .rounded-lg {\n border-radius: var(--bs-radius) !important;\n }\n .rounded-md {\n border-radius: calc(var(--bs-radius) - 2px) !important;\n }\n .rounded-sm {\n border-radius: calc(var(--bs-radius) - 4px) !important;\n }\n .rounded-xs {\n border-radius: var(--radius-xs) !important;\n }\n .border {\n border-style: var(--tw-border-style) !important;\n border-width: 1px !important;\n }\n .border-b {\n border-bottom-style: var(--tw-border-style) !important;\n border-bottom-width: 1px !important;\n }\n .border-input {\n border-color: var(--bs-input) !important;\n }\n .border-primary {\n border-color: var(--bs-primary) !important;\n }\n .bg-accent {\n background-color: var(--bs-accent) !important;\n }\n .bg-background {\n background-color: var(--bs-background) !important;\n }\n .bg-black\\/50 {\n background-color: color-mix(in srgb, #000 50%, transparent) !important;\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 50%, transparent) !important;\n }\n }\n .bg-border {\n background-color: var(--bs-border) !important;\n }\n .bg-destructive {\n background-color: var(--bs-destructive) !important;\n }\n .bg-muted {\n background-color: var(--bs-muted) !important;\n }\n .bg-popover {\n background-color: var(--bs-popover) !important;\n }\n .bg-primary {\n background-color: var(--bs-primary) !important;\n }\n .bg-secondary {\n background-color: var(--bs-secondary) !important;\n }\n .bg-transparent {\n background-color: transparent !important;\n }\n .fill-current {\n fill: currentcolor !important;\n }\n .fill-primary {\n fill: var(--bs-primary) !important;\n }\n .object-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n .p-0 {\n padding: calc(var(--spacing) * 0) !important;\n }\n .p-1 {\n padding: calc(var(--spacing) * 1) !important;\n }\n .p-4 {\n padding: calc(var(--spacing) * 4) !important;\n }\n .p-6 {\n padding: calc(var(--spacing) * 6) !important;\n }\n .px-2 {\n padding-inline: calc(var(--spacing) * 2) !important;\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3) !important;\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4) !important;\n }\n .px-6 {\n padding-inline: calc(var(--spacing) * 6) !important;\n }\n .py-1 {\n padding-block: calc(var(--spacing) * 1) !important;\n }\n .py-1\\.5 {\n padding-block: calc(var(--spacing) * 1.5) !important;\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2) !important;\n }\n .py-3 {\n padding-block: calc(var(--spacing) * 3) !important;\n }\n .py-4 {\n padding-block: calc(var(--spacing) * 4) !important;\n }\n .py-6 {\n padding-block: calc(var(--spacing) * 6) !important;\n }\n .pt-2 {\n padding-top: calc(var(--spacing) * 2) !important;\n }\n .pt-4 {\n padding-top: calc(var(--spacing) * 4) !important;\n }\n .pt-8 {\n padding-top: calc(var(--spacing) * 8) !important;\n }\n .pr-2 {\n padding-right: calc(var(--spacing) * 2) !important;\n }\n .pr-8 {\n padding-right: calc(var(--spacing) * 8) !important;\n }\n .pb-1 {\n padding-bottom: calc(var(--spacing) * 1) !important;\n }\n .pb-2 {\n padding-bottom: calc(var(--spacing) * 2) !important;\n }\n .pl-2 {\n padding-left: calc(var(--spacing) * 2) !important;\n }\n .pl-8 {\n padding-left: calc(var(--spacing) * 8) !important;\n }\n .text-center {\n text-align: center !important;\n }\n .text-right {\n text-align: right !important;\n }\n .text-base {\n font-size: var(--text-base) !important;\n line-height: var(--tw-leading, var(--text-base--line-height)) !important;\n }\n .text-lg {\n font-size: var(--text-lg) !important;\n line-height: var(--tw-leading, var(--text-lg--line-height)) !important;\n }\n .text-sm {\n font-size: var(--text-sm) !important;\n line-height: var(--tw-leading, var(--text-sm--line-height)) !important;\n }\n .text-xs {\n font-size: var(--text-xs) !important;\n line-height: var(--tw-leading, var(--text-xs--line-height)) !important;\n }\n .leading-none {\n --tw-leading: 1 !important;\n line-height: 1 !important;\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold) !important;\n font-weight: var(--font-weight-bold) !important;\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium) !important;\n font-weight: var(--font-weight-medium) !important;\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold) !important;\n font-weight: var(--font-weight-semibold) !important;\n }\n .tracking-tight {\n --tw-tracking: var(--tracking-tight) !important;\n letter-spacing: var(--tracking-tight) !important;\n }\n .tracking-widest {\n --tw-tracking: var(--tracking-widest) !important;\n letter-spacing: var(--tracking-widest) !important;\n }\n .text-ellipsis {\n text-overflow: ellipsis !important;\n }\n .whitespace-nowrap {\n white-space: nowrap !important;\n }\n .text-background {\n color: var(--bs-background) !important;\n }\n .text-current {\n color: currentcolor !important;\n }\n .text-destructive {\n color: var(--bs-destructive) !important;\n }\n .text-destructive-foreground {\n color: var(--bs-destructive-foreground) !important;\n }\n .text-foreground {\n color: var(--bs-foreground) !important;\n }\n .text-muted-foreground {\n color: var(--bs-muted-foreground) !important;\n }\n .text-popover-foreground {\n color: var(--bs-popover-foreground) !important;\n }\n .text-primary {\n color: var(--bs-primary) !important;\n }\n .text-primary-foreground {\n color: var(--bs-primary-foreground) !important;\n }\n .text-red-500 {\n color: var(--color-red-500) !important;\n }\n .text-secondary-foreground {\n color: var(--bs-secondary-foreground) !important;\n }\n .text-white {\n color: var(--color-white) !important;\n }\n .line-through {\n text-decoration-line: line-through !important;\n }\n .underline-offset-4 {\n text-underline-offset: 4px !important;\n }\n .opacity-0 {\n opacity: 0% !important;\n }\n .opacity-50 {\n opacity: 50% !important;\n }\n .opacity-70 {\n opacity: 70% !important;\n }\n .opacity-100 {\n opacity: 100% !important;\n }\n .shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1)) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n .shadow-md {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1)) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n .shadow-sm {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n .shadow-xs {\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05)) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n .ring {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n .ring-offset-background {\n --tw-ring-offset-color: var(--bs-background) !important;\n }\n .outline-hidden {\n --tw-outline-style: none !important;\n outline-style: none !important;\n @media (forced-colors: active) {\n outline: 2px solid transparent !important;\n outline-offset: 2px !important;\n }\n }\n .outline {\n outline-style: var(--tw-outline-style) !important;\n outline-width: 1px !important;\n }\n .transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, visibility, content-visibility, overlay, pointer-events !important;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)) !important;\n transition-duration: var(--tw-duration, var(--default-transition-duration)) !important;\n }\n .transition-\\[color\\,box-shadow\\] {\n transition-property: color,box-shadow !important;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)) !important;\n transition-duration: var(--tw-duration, var(--default-transition-duration)) !important;\n }\n .transition-opacity {\n transition-property: opacity !important;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)) !important;\n transition-duration: var(--tw-duration, var(--default-transition-duration)) !important;\n }\n .transition-shadow {\n transition-property: box-shadow !important;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)) !important;\n transition-duration: var(--tw-duration, var(--default-transition-duration)) !important;\n }\n .transition-transform {\n transition-property: transform, translate, scale, rotate !important;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)) !important;\n transition-duration: var(--tw-duration, var(--default-transition-duration)) !important;\n }\n .transition-none {\n transition-property: none !important;\n }\n .duration-200 {\n --tw-duration: 200ms !important;\n transition-duration: 200ms !important;\n }\n .outline-none {\n --tw-outline-style: none !important;\n outline-style: none !important;\n }\n .select-none {\n -webkit-user-select: none !important;\n -moz-user-select: none !important;\n user-select: none !important;\n }\n .duration-200 {\n animation-duration: 200ms !important;\n }\n .not-last\\:-mb-0\\.5 {\n &:not(*:last-child) {\n margin-bottom: calc(var(--spacing) * -0.5) !important;\n }\n }\n .group-data-\\[disabled\\=true\\]\\:pointer-events-none {\n &:is(:where(.group)[data-disabled=\"true\"] *) {\n pointer-events: none !important;\n }\n }\n .group-data-\\[disabled\\=true\\]\\:opacity-50 {\n &:is(:where(.group)[data-disabled=\"true\"] *) {\n opacity: 50% !important;\n }\n }\n .peer-disabled\\:cursor-not-allowed {\n &:is(:where(.peer):disabled ~ *) {\n cursor: not-allowed !important;\n }\n }\n .peer-disabled\\:opacity-50 {\n &:is(:where(.peer):disabled ~ *) {\n opacity: 50% !important;\n }\n }\n .selection\\:bg-primary {\n & *::-moz-selection {\n background-color: var(--bs-primary) !important;\n }\n & *::selection {\n background-color: var(--bs-primary) !important;\n }\n &::-moz-selection {\n background-color: var(--bs-primary) !important;\n }\n &::selection {\n background-color: var(--bs-primary) !important;\n }\n }\n .selection\\:text-primary-foreground {\n & *::-moz-selection {\n color: var(--bs-primary-foreground) !important;\n }\n & *::selection {\n color: var(--bs-primary-foreground) !important;\n }\n &::-moz-selection {\n color: var(--bs-primary-foreground) !important;\n }\n &::selection {\n color: var(--bs-primary-foreground) !important;\n }\n }\n .file\\:inline-flex {\n &::file-selector-button {\n display: inline-flex !important;\n }\n }\n .file\\:h-7 {\n &::file-selector-button {\n height: calc(var(--spacing) * 7) !important;\n }\n }\n .file\\:border-0 {\n &::file-selector-button {\n border-style: var(--tw-border-style) !important;\n border-width: 0px !important;\n }\n }\n .file\\:bg-transparent {\n &::file-selector-button {\n background-color: transparent !important;\n }\n }\n .file\\:text-sm {\n &::file-selector-button {\n font-size: var(--text-sm) !important;\n line-height: var(--tw-leading, var(--text-sm--line-height)) !important;\n }\n }\n .file\\:font-medium {\n &::file-selector-button {\n --tw-font-weight: var(--font-weight-medium) !important;\n font-weight: var(--font-weight-medium) !important;\n }\n }\n .file\\:text-foreground {\n &::file-selector-button {\n color: var(--bs-foreground) !important;\n }\n }\n .placeholder\\:text-muted-foreground {\n &::-moz-placeholder {\n color: var(--bs-muted-foreground) !important;\n }\n &::placeholder {\n color: var(--bs-muted-foreground) !important;\n }\n }\n .hover\\:bg-accent {\n &:hover {\n @media (hover: hover) {\n background-color: var(--bs-accent) !important;\n }\n }\n }\n .hover\\:bg-destructive\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--bs-destructive) 90%, transparent) !important;\n }\n }\n }\n }\n .hover\\:bg-muted {\n &:hover {\n @media (hover: hover) {\n background-color: var(--bs-muted) !important;\n }\n }\n }\n .hover\\:bg-primary\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--bs-primary) !important;\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--bs-primary) 90%, transparent) !important;\n }\n }\n }\n }\n .hover\\:bg-secondary\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--bs-secondary) !important;\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--bs-secondary) 80%, transparent) !important;\n }\n }\n }\n }\n .hover\\:text-accent-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--bs-accent-foreground) !important;\n }\n }\n }\n .hover\\:text-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--bs-foreground) !important;\n }\n }\n }\n .hover\\:underline {\n &:hover {\n @media (hover: hover) {\n text-decoration-line: underline !important;\n }\n }\n }\n .hover\\:opacity-100 {\n &:hover {\n @media (hover: hover) {\n opacity: 100% !important;\n }\n }\n }\n .focus\\:bg-accent {\n &:focus {\n background-color: var(--bs-accent) !important;\n }\n }\n .focus\\:text-accent-foreground {\n &:focus {\n color: var(--bs-accent-foreground) !important;\n }\n }\n .focus\\:ring-1 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n }\n .focus\\:ring-2 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n }\n .focus\\:ring-ring {\n &:focus {\n --tw-ring-color: var(--bs-ring) !important;\n }\n }\n .focus\\:ring-offset-2 {\n &:focus {\n --tw-ring-offset-width: 2px !important;\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;\n }\n }\n .focus\\:outline-hidden {\n &:focus {\n --tw-outline-style: none !important;\n outline-style: none !important;\n @media (forced-colors: active) {\n outline: 2px solid transparent !important;\n outline-offset: 2px !important;\n }\n }\n }\n .focus\\:outline-none {\n &:focus {\n --tw-outline-style: none !important;\n outline-style: none !important;\n }\n }\n .focus-visible\\:border-ring {\n &:focus-visible {\n border-color: var(--bs-ring) !important;\n }\n }\n .focus-visible\\:ring-\\[3px\\] {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor) !important;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow) !important;\n }\n }\n .focus-visible\\:ring-destructive\\/20 {\n &:focus-visible {\n --tw-ring-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--bs-destructive) 20%, transparent) !important;\n }\n }\n }\n .focus-visible\\:ring-ring\\/50 {\n &:focus-visible {\n --tw-ring-color: var(--bs-ring) !important;\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--bs-ring) 50%, transparent) !important;\n }\n }\n }\n .disabled\\:pointer-events-none {\n &:disabled {\n pointer-events: none !important;\n }\n }\n .disabled\\:cursor-not-allowed {\n &:disabled {\n cursor: not-allowed !important;\n }\n }\n .disabled\\:opacity-50 {\n &:disabled {\n opacity: 50% !important;\n }\n }\n .has-\\[\\>svg\\]\\:px-2\\.5 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 2.5) !important;\n }\n }\n .has-\\[\\>svg\\]\\:px-3 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 3) !important;\n }\n }\n .has-\\[\\>svg\\]\\:px-4 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 4) !important;\n }\n }\n .aria-invalid\\:border-destructive {\n &[aria-invalid=\"true\"] {\n border-color: var(--bs-destructive) !important;\n }\n }\n .aria-invalid\\:ring-destructive\\/20 {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--bs-destructive) 20%, transparent) !important;\n }\n }\n }\n .data-\\[disabled\\]\\:pointer-events-none {\n &[data-disabled] {\n pointer-events: none !important;\n }\n }\n .data-\\[disabled\\]\\:opacity-50 {\n &[data-disabled] {\n opacity: 50% !important;\n }\n }\n .data-\\[disabled\\=true\\]\\:pointer-events-none {\n &[data-disabled=\"true\"] {\n pointer-events: none !important;\n }\n }\n .data-\\[disabled\\=true\\]\\:opacity-50 {\n &[data-disabled=\"true\"] {\n opacity: 50% !important;\n }\n }\n .data-\\[error\\=true\\]\\:text-destructive-foreground {\n &[data-error=\"true\"] {\n color: var(--bs-destructive-foreground) !important;\n }\n }\n .data-\\[inset\\]\\:pl-8 {\n &[data-inset] {\n padding-left: calc(var(--spacing) * 8) !important;\n }\n }\n .data-\\[placeholder\\]\\:text-muted-foreground {\n &[data-placeholder] {\n color: var(--bs-muted-foreground) !important;\n }\n }\n .data-\\[selected\\=true\\]\\:bg-accent {\n &[data-selected=\"true\"] {\n background-color: var(--bs-accent) !important;\n }\n }\n .data-\\[selected\\=true\\]\\:text-accent-foreground {\n &[data-selected=\"true\"] {\n color: var(--bs-accent-foreground) !important;\n }\n }\n .data-\\[side\\=bottom\\]\\:translate-y-1 {\n &[data-side=\"bottom\"] {\n --tw-translate-y: calc(var(--spacing) * 1) !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n }\n .data-\\[side\\=bottom\\]\\:slide-in-from-top-2 {\n &[data-side=\"bottom\"] {\n --tw-enter-translate-y: -0.5rem !important;\n }\n }\n .data-\\[side\\=left\\]\\:-translate-x-1 {\n &[data-side=\"left\"] {\n --tw-translate-x: calc(var(--spacing) * -1) !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n }\n .data-\\[side\\=left\\]\\:slide-in-from-right-2 {\n &[data-side=\"left\"] {\n --tw-enter-translate-x: 0.5rem !important;\n }\n }\n .data-\\[side\\=right\\]\\:translate-x-1 {\n &[data-side=\"right\"] {\n --tw-translate-x: calc(var(--spacing) * 1) !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n }\n .data-\\[side\\=right\\]\\:slide-in-from-left-2 {\n &[data-side=\"right\"] {\n --tw-enter-translate-x: -0.5rem !important;\n }\n }\n .data-\\[side\\=top\\]\\:-translate-y-1 {\n &[data-side=\"top\"] {\n --tw-translate-y: calc(var(--spacing) * -1) !important;\n translate: var(--tw-translate-x) var(--tw-translate-y) !important;\n }\n }\n .data-\\[side\\=top\\]\\:slide-in-from-bottom-2 {\n &[data-side=\"top\"] {\n --tw-enter-translate-y: 0.5rem !important;\n }\n }\n .\\*\\*\\:data-\\[slot\\=command-input-wrapper\\]\\:h-12 {\n :is(& *) {\n &[data-slot=\"command-input-wrapper\"] {\n height: calc(var(--spacing) * 12) !important;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1 {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n overflow: hidden !important;\n display: -webkit-box !important;\n -webkit-box-orient: vertical !important;\n -webkit-line-clamp: 1 !important;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:flex {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n display: flex !important;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:items-center {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n align-items: center !important;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:gap-2 {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n gap: calc(var(--spacing) * 2) !important;\n }\n }\n }\n .data-\\[state\\=checked\\]\\:border-primary {\n &[data-state=\"checked\"] {\n border-color: var(--bs-primary) !important;\n }\n }\n .data-\\[state\\=checked\\]\\:bg-primary {\n &[data-state=\"checked\"] {\n background-color: var(--bs-primary) !important;\n }\n }\n .data-\\[state\\=checked\\]\\:text-primary-foreground {\n &[data-state=\"checked\"] {\n color: var(--bs-primary-foreground) !important;\n }\n }\n .data-\\[state\\=closed\\]\\:animate-out {\n &[data-state=\"closed\"] {\n animation-name: exit !important;\n animation-duration: 150ms !important;\n --tw-exit-opacity: initial !important;\n --tw-exit-scale: initial !important;\n --tw-exit-rotate: initial !important;\n --tw-exit-translate-x: initial !important;\n --tw-exit-translate-y: initial !important;\n }\n }\n .data-\\[state\\=closed\\]\\:fade-out-0 {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: 0 !important;\n }\n }\n .data-\\[state\\=closed\\]\\:zoom-out-95 {\n &[data-state=\"closed\"] {\n --tw-exit-scale: .95 !important;\n }\n }\n .data-\\[state\\=open\\]\\:bg-accent {\n &[data-state=\"open\"] {\n background-color: var(--bs-accent) !important;\n }\n }\n .data-\\[state\\=open\\]\\:text-accent-foreground {\n &[data-state=\"open\"] {\n color: var(--bs-accent-foreground) !important;\n }\n }\n .data-\\[state\\=open\\]\\:text-muted-foreground {\n &[data-state=\"open\"] {\n color: var(--bs-muted-foreground) !important;\n }\n }\n .data-\\[state\\=open\\]\\:animate-in {\n &[data-state=\"open\"] {\n animation-name: enter !important;\n animation-duration: 150ms !important;\n --tw-enter-opacity: initial !important;\n --tw-enter-scale: initial !important;\n --tw-enter-rotate: initial !important;\n --tw-enter-translate-x: initial !important;\n --tw-enter-translate-y: initial !important;\n }\n }\n .data-\\[state\\=open\\]\\:fade-in-0 {\n &[data-state=\"open\"] {\n --tw-enter-opacity: 0 !important;\n }\n }\n .data-\\[state\\=open\\]\\:zoom-in-95 {\n &[data-state=\"open\"] {\n --tw-enter-scale: .95 !important;\n }\n }\n .data-\\[variant\\=destructive\\]\\:text-destructive {\n &[data-variant=\"destructive\"] {\n color: var(--bs-destructive) !important;\n }\n }\n .data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10 {\n &[data-variant=\"destructive\"] {\n &:focus {\n background-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--bs-destructive) 10%, transparent) !important;\n }\n }\n }\n }\n .data-\\[variant\\=destructive\\]\\:focus\\:text-destructive {\n &[data-variant=\"destructive\"] {\n &:focus {\n color: var(--bs-destructive) !important;\n }\n }\n }\n .max-sm\\:hidden {\n @media (width < 40rem) {\n display: none !important;\n }\n }\n .sm\\:max-h-\\[270px\\] {\n @media (width >= 40rem) {\n max-height: 270px !important;\n }\n }\n .sm\\:max-w-\\[500px\\] {\n @media (width >= 40rem) {\n max-width: 500px !important;\n }\n }\n .sm\\:max-w-lg {\n @media (width >= 40rem) {\n max-width: var(--container-lg) !important;\n }\n }\n .sm\\:flex-row {\n @media (width >= 40rem) {\n flex-direction: row !important;\n }\n }\n .sm\\:justify-end {\n @media (width >= 40rem) {\n justify-content: flex-end !important;\n }\n }\n .sm\\:text-left {\n @media (width >= 40rem) {\n text-align: left !important;\n }\n }\n .md\\:order-last {\n @media (width >= 48rem) {\n order: 9999 !important;\n }\n }\n .md\\:order-none {\n @media (width >= 48rem) {\n order: 0 !important;\n }\n }\n .md\\:col-span-2 {\n @media (width >= 48rem) {\n grid-column: span 2 / span 2 !important;\n }\n }\n .md\\:col-span-3 {\n @media (width >= 48rem) {\n grid-column: span 3 / span 3 !important;\n }\n }\n .md\\:col-span-4 {\n @media (width >= 48rem) {\n grid-column: span 4 / span 4 !important;\n }\n }\n .md\\:block {\n @media (width >= 48rem) {\n display: block !important;\n }\n }\n .md\\:flex {\n @media (width >= 48rem) {\n display: flex !important;\n }\n }\n .md\\:grid {\n @media (width >= 48rem) {\n display: grid !important;\n }\n }\n .md\\:hidden {\n @media (width >= 48rem) {\n display: none !important;\n }\n }\n .md\\:grid-cols-2 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr)) !important;\n }\n }\n .md\\:grid-cols-7 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(7, minmax(0, 1fr)) !important;\n }\n }\n .md\\:gap-0 {\n @media (width >= 48rem) {\n gap: calc(var(--spacing) * 0) !important;\n }\n }\n .md\\:px-8 {\n @media (width >= 48rem) {\n padding-inline: calc(var(--spacing) * 8) !important;\n }\n }\n .md\\:py-12 {\n @media (width >= 48rem) {\n padding-block: calc(var(--spacing) * 12) !important;\n }\n }\n .md\\:text-sm {\n @media (width >= 48rem) {\n font-size: var(--text-sm) !important;\n line-height: var(--tw-leading, var(--text-sm--line-height)) !important;\n }\n }\n .dark\\:focus-visible\\:ring-destructive\\/40 {\n @media (prefers-color-scheme: dark) {\n &:focus-visible {\n --tw-ring-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--bs-destructive) 40%, transparent) !important;\n }\n }\n }\n }\n .dark\\:aria-invalid\\:ring-destructive\\/40 {\n @media (prefers-color-scheme: dark) {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--bs-destructive) 40%, transparent) !important;\n }\n }\n }\n }\n .dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20 {\n @media (prefers-color-scheme: dark) {\n &[data-variant=\"destructive\"] {\n &:focus {\n background-color: var(--bs-destructive) !important;\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--bs-destructive) 20%, transparent) !important;\n }\n }\n }\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:px-2 {\n & [cmdk-group-heading] {\n padding-inline: calc(var(--spacing) * 2) !important;\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:py-1\\.5 {\n & [cmdk-group-heading] {\n padding-block: calc(var(--spacing) * 1.5) !important;\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-xs {\n & [cmdk-group-heading] {\n font-size: var(--text-xs) !important;\n line-height: var(--tw-leading, var(--text-xs--line-height)) !important;\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:font-medium {\n & [cmdk-group-heading] {\n --tw-font-weight: var(--font-weight-medium) !important;\n font-weight: var(--font-weight-medium) !important;\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-muted-foreground {\n & [cmdk-group-heading] {\n color: var(--bs-muted-foreground) !important;\n }\n }\n .\\[\\&_\\[cmdk-group\\]\\]\\:px-2 {\n & [cmdk-group] {\n padding-inline: calc(var(--spacing) * 2) !important;\n }\n }\n .\\[\\&_\\[cmdk-group\\]\\:not\\(\\[hidden\\]\\)_\\~\\[cmdk-group\\]\\]\\:pt-0 {\n & [cmdk-group]:not([hidden]) ~[cmdk-group] {\n padding-top: calc(var(--spacing) * 0) !important;\n }\n }\n .\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:h-5 {\n & [cmdk-input-wrapper] svg {\n height: calc(var(--spacing) * 5) !important;\n }\n }\n .\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:w-5 {\n & [cmdk-input-wrapper] svg {\n width: calc(var(--spacing) * 5) !important;\n }\n }\n .\\[\\&_\\[cmdk-input\\]\\]\\:h-12 {\n & [cmdk-input] {\n height: calc(var(--spacing) * 12) !important;\n }\n }\n .\\[\\&_\\[cmdk-item\\]\\]\\:px-2 {\n & [cmdk-item] {\n padding-inline: calc(var(--spacing) * 2) !important;\n }\n }\n .\\[\\&_\\[cmdk-item\\]\\]\\:py-3 {\n & [cmdk-item] {\n padding-block: calc(var(--spacing) * 3) !important;\n }\n }\n .\\[\\&_\\[cmdk-item\\]_svg\\]\\:h-5 {\n & [cmdk-item] svg {\n height: calc(var(--spacing) * 5) !important;\n }\n }\n .\\[\\&_\\[cmdk-item\\]_svg\\]\\:w-5 {\n & [cmdk-item] svg {\n width: calc(var(--spacing) * 5) !important;\n }\n }\n .\\[\\&_svg\\]\\:pointer-events-none {\n & svg {\n pointer-events: none !important;\n }\n }\n .\\[\\&_svg\\]\\:shrink-0 {\n & svg {\n flex-shrink: 0 !important;\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 4) !important;\n height: calc(var(--spacing) * 4) !important;\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'text-\\'\\]\\)\\]\\:text-muted-foreground {\n & svg:not([class*='text-']) {\n color: var(--bs-muted-foreground) !important;\n }\n }\n .\\*\\:\\[span\\]\\:last\\:flex {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n display: flex !important;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:items-center {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n align-items: center !important;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:gap-2 {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n gap: calc(var(--spacing) * 2) !important;\n }\n }\n }\n }\n .data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:\\!text-destructive {\n &[data-variant=\"destructive\"] {\n :is(& > *) {\n &:is(svg) {\n color: var(--bs-destructive) !important;\n }\n }\n }\n }\n .\\[\\&\\>span\\]\\:line-clamp-1 {\n &>span {\n overflow: hidden !important;\n display: -webkit-box !important;\n -webkit-box-orient: vertical !important;\n -webkit-line-clamp: 1 !important;\n }\n }\n}\n.checkout-embed {\n :root {\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --destructive-foreground: oklch(0.577 0.245 27.325);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.646 0.222 41.116);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n --radius: 0.625rem;\n --sidebar: oklch(0.985 0 0);\n --sidebar-foreground: oklch(0.145 0 0);\n --sidebar-primary: oklch(0.205 0 0);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.97 0 0);\n --sidebar-accent-foreground: oklch(0.205 0 0);\n --sidebar-border: oklch(0.922 0 0);\n --sidebar-ring: oklch(0.708 0 0);\n }\n @layer base {\n * {\n border-color: var(--bs-border) !important;\n outline-color: var(--bs-ring) !important;\n @supports (color: color-mix(in lab, red, red)) {\n outline-color: color-mix(in oklab, var(--bs-ring) 50%, transparent) !important;\n }\n }\n .checkout-embed {\n background-color: var(--bs-background) !important;\n font-family: var(--bs-font-sans), Helvetica, Arial, apple-system, sans-serif !important;\n color: var(--bs-foreground) !important;\n }\n h2 {\n font-size: var(--text-2xl) !important;\n line-height: var(--tw-leading, var(--text-2xl--line-height)) !important;\n --tw-font-weight: var(--font-weight-bold) !important;\n font-weight: var(--font-weight-bold) !important;\n --tw-tracking: var(--tracking-tight) !important;\n letter-spacing: var(--tracking-tight) !important;\n }\n p {\n --tw-tracking: var(--tracking-tight) !important;\n letter-spacing: var(--tracking-tight) !important;\n }\n }\n @layer utilities {\n .scrollbar-hidden {\n scrollbar-width: none;\n }\n .scrollbar-hidden::-webkit-scrollbar {\n display: none;\n }\n }\n}\n@keyframes enter {\n from {\n opacity: var(--tw-enter-opacity, 1);\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\n }\n}\n@keyframes exit {\n to {\n opacity: var(--tw-exit-opacity, 1);\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\n }\n}\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-space-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-space-x-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-leading {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-tracking {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-duration {\n syntax: \"*\";\n inherits: false;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-space-y-reverse: 0;\n --tw-space-x-reverse: 0;\n --tw-border-style: solid;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-tracking: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-duration: initial;\n }\n }\n}\n";
|
|
34632
35919
|
styleInject(css_248z);
|
|
34633
35920
|
|
|
34634
35921
|
export { index as CheckoutEmbed, PaymentElement$1 as PaymentElement, useCart, useCheckout };
|