@betterstore/react 0.2.3 → 0.2.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/components.json +21 -0
- package/dist/components/checkout-embed/checkout-form.d.ts +8 -0
- package/dist/components/checkout-embed/checkout-schema.d.ts +173 -0
- package/dist/components/checkout-embed/customer/form.d.ts +9 -0
- package/dist/components/checkout-embed/payment/form.d.ts +13 -0
- package/dist/components/checkout-embed/shipping/form.d.ts +11 -0
- package/dist/components/checkout-embed/useLocalStorage.d.ts +1 -0
- package/dist/components/ui/button.d.ts +10 -0
- package/dist/components/ui/checkbox.d.ts +4 -0
- package/dist/components/ui/form.d.ts +24 -0
- package/dist/components/ui/input.d.ts +3 -0
- package/dist/components/ui/label.d.ts +4 -0
- package/dist/components/ui/radio-group.d.ts +5 -0
- package/dist/components/ui/select.d.ts +13 -0
- package/dist/index.cjs.js +687 -9
- package/dist/index.mjs +698 -42
- package/dist/lib/utils.d.ts +2 -0
- package/package.json +17 -3
- package/postcss.config.cjs +1 -1
- package/rollup.config.mjs +26 -6
- package/tailwind.config.cjs +1 -0
- package/dist/styles.css +0 -1
package/dist/index.cjs.js
CHANGED
|
@@ -2,9 +2,44 @@
|
|
|
2
2
|
|
|
3
3
|
var zustand = require('zustand');
|
|
4
4
|
var React = require('react');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var classVarianceAuthority = require('class-variance-authority');
|
|
7
|
+
var clsx = require('clsx');
|
|
8
|
+
var tailwindMerge = require('tailwind-merge');
|
|
9
|
+
var CheckboxPrimitive = require('@radix-ui/react-checkbox');
|
|
10
|
+
var lucideReact = require('lucide-react');
|
|
11
|
+
var reactHookForm = require('react-hook-form');
|
|
12
|
+
var LabelPrimitive = require('@radix-ui/react-label');
|
|
13
|
+
var SelectPrimitive = require('@radix-ui/react-select');
|
|
14
|
+
var resolvers = require('@hookform/resolvers');
|
|
15
|
+
var zod = require('zod');
|
|
16
|
+
var RadioGroupPrimitive = require('@radix-ui/react-radio-group');
|
|
5
17
|
var reactStripeJs = require('@stripe/react-stripe-js');
|
|
6
18
|
var stripeJs = require('@stripe/stripe-js');
|
|
7
19
|
|
|
20
|
+
function _interopNamespaceDefault(e) {
|
|
21
|
+
var n = Object.create(null);
|
|
22
|
+
if (e) {
|
|
23
|
+
Object.keys(e).forEach(function (k) {
|
|
24
|
+
if (k !== 'default') {
|
|
25
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
26
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
get: function () { return e[k]; }
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
n.default = e;
|
|
34
|
+
return Object.freeze(n);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
38
|
+
var CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(CheckboxPrimitive);
|
|
39
|
+
var LabelPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(LabelPrimitive);
|
|
40
|
+
var SelectPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(SelectPrimitive);
|
|
41
|
+
var RadioGroupPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(RadioGroupPrimitive);
|
|
42
|
+
|
|
8
43
|
function createJSONStorage(getStorage, options) {
|
|
9
44
|
let storage;
|
|
10
45
|
try {
|
|
@@ -258,6 +293,18 @@ PERFORMANCE OF THIS SOFTWARE.
|
|
|
258
293
|
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
259
294
|
|
|
260
295
|
|
|
296
|
+
function __rest(s, e) {
|
|
297
|
+
var t = {};
|
|
298
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
299
|
+
t[p] = s[p];
|
|
300
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
301
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
302
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
303
|
+
t[p[i]] = s[p[i]];
|
|
304
|
+
}
|
|
305
|
+
return t;
|
|
306
|
+
}
|
|
307
|
+
|
|
261
308
|
function __awaiter(thisArg, _arguments, P, generator) {
|
|
262
309
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
263
310
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -273,6 +320,608 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
|
|
|
273
320
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
274
321
|
};
|
|
275
322
|
|
|
323
|
+
// packages/react/compose-refs/src/composeRefs.tsx
|
|
324
|
+
function setRef(ref, value) {
|
|
325
|
+
if (typeof ref === "function") {
|
|
326
|
+
return ref(value);
|
|
327
|
+
} else if (ref !== null && ref !== void 0) {
|
|
328
|
+
ref.current = value;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
function composeRefs(...refs) {
|
|
332
|
+
return (node) => {
|
|
333
|
+
let hasCleanup = false;
|
|
334
|
+
const cleanups = refs.map((ref) => {
|
|
335
|
+
const cleanup = setRef(ref, node);
|
|
336
|
+
if (!hasCleanup && typeof cleanup == "function") {
|
|
337
|
+
hasCleanup = true;
|
|
338
|
+
}
|
|
339
|
+
return cleanup;
|
|
340
|
+
});
|
|
341
|
+
if (hasCleanup) {
|
|
342
|
+
return () => {
|
|
343
|
+
for (let i = 0; i < cleanups.length; i++) {
|
|
344
|
+
const cleanup = cleanups[i];
|
|
345
|
+
if (typeof cleanup == "function") {
|
|
346
|
+
cleanup();
|
|
347
|
+
} else {
|
|
348
|
+
setRef(refs[i], null);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// packages/react/slot/src/slot.tsx
|
|
357
|
+
var Slot = React__namespace.forwardRef((props, forwardedRef) => {
|
|
358
|
+
const { children, ...slotProps } = props;
|
|
359
|
+
const childrenArray = React__namespace.Children.toArray(children);
|
|
360
|
+
const slottable = childrenArray.find(isSlottable);
|
|
361
|
+
if (slottable) {
|
|
362
|
+
const newElement = slottable.props.children;
|
|
363
|
+
const newChildren = childrenArray.map((child) => {
|
|
364
|
+
if (child === slottable) {
|
|
365
|
+
if (React__namespace.Children.count(newElement) > 1) return React__namespace.Children.only(null);
|
|
366
|
+
return React__namespace.isValidElement(newElement) ? newElement.props.children : null;
|
|
367
|
+
} else {
|
|
368
|
+
return child;
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SlotClone, { ...slotProps, ref: forwardedRef, children: React__namespace.isValidElement(newElement) ? React__namespace.cloneElement(newElement, void 0, newChildren) : null });
|
|
372
|
+
}
|
|
373
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SlotClone, { ...slotProps, ref: forwardedRef, children });
|
|
374
|
+
});
|
|
375
|
+
Slot.displayName = "Slot";
|
|
376
|
+
var SlotClone = React__namespace.forwardRef((props, forwardedRef) => {
|
|
377
|
+
const { children, ...slotProps } = props;
|
|
378
|
+
if (React__namespace.isValidElement(children)) {
|
|
379
|
+
const childrenRef = getElementRef(children);
|
|
380
|
+
const props2 = mergeProps(slotProps, children.props);
|
|
381
|
+
if (children.type !== React__namespace.Fragment) {
|
|
382
|
+
props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;
|
|
383
|
+
}
|
|
384
|
+
return React__namespace.cloneElement(children, props2);
|
|
385
|
+
}
|
|
386
|
+
return React__namespace.Children.count(children) > 1 ? React__namespace.Children.only(null) : null;
|
|
387
|
+
});
|
|
388
|
+
SlotClone.displayName = "SlotClone";
|
|
389
|
+
var Slottable = ({ children }) => {
|
|
390
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
|
|
391
|
+
};
|
|
392
|
+
function isSlottable(child) {
|
|
393
|
+
return React__namespace.isValidElement(child) && child.type === Slottable;
|
|
394
|
+
}
|
|
395
|
+
function mergeProps(slotProps, childProps) {
|
|
396
|
+
const overrideProps = { ...childProps };
|
|
397
|
+
for (const propName in childProps) {
|
|
398
|
+
const slotPropValue = slotProps[propName];
|
|
399
|
+
const childPropValue = childProps[propName];
|
|
400
|
+
const isHandler = /^on[A-Z]/.test(propName);
|
|
401
|
+
if (isHandler) {
|
|
402
|
+
if (slotPropValue && childPropValue) {
|
|
403
|
+
overrideProps[propName] = (...args) => {
|
|
404
|
+
childPropValue(...args);
|
|
405
|
+
slotPropValue(...args);
|
|
406
|
+
};
|
|
407
|
+
} else if (slotPropValue) {
|
|
408
|
+
overrideProps[propName] = slotPropValue;
|
|
409
|
+
}
|
|
410
|
+
} else if (propName === "style") {
|
|
411
|
+
overrideProps[propName] = { ...slotPropValue, ...childPropValue };
|
|
412
|
+
} else if (propName === "className") {
|
|
413
|
+
overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(" ");
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return { ...slotProps, ...overrideProps };
|
|
417
|
+
}
|
|
418
|
+
function getElementRef(element) {
|
|
419
|
+
let getter = Object.getOwnPropertyDescriptor(element.props, "ref")?.get;
|
|
420
|
+
let mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
|
|
421
|
+
if (mayWarn) {
|
|
422
|
+
return element.ref;
|
|
423
|
+
}
|
|
424
|
+
getter = Object.getOwnPropertyDescriptor(element, "ref")?.get;
|
|
425
|
+
mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
|
|
426
|
+
if (mayWarn) {
|
|
427
|
+
return element.props.ref;
|
|
428
|
+
}
|
|
429
|
+
return element.props.ref || element.ref;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
function cn(...inputs) {
|
|
433
|
+
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
const buttonVariants = classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none 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", {
|
|
437
|
+
variants: {
|
|
438
|
+
variant: {
|
|
439
|
+
default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
|
|
440
|
+
destructive: "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",
|
|
441
|
+
outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground",
|
|
442
|
+
secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
|
|
443
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
444
|
+
link: "text-primary underline-offset-4 hover:underline",
|
|
445
|
+
},
|
|
446
|
+
size: {
|
|
447
|
+
default: "h-9 px-4 py-2 has-[>svg]:px-3",
|
|
448
|
+
sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
|
|
449
|
+
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
|
|
450
|
+
icon: "size-9",
|
|
451
|
+
},
|
|
452
|
+
},
|
|
453
|
+
defaultVariants: {
|
|
454
|
+
variant: "default",
|
|
455
|
+
size: "default",
|
|
456
|
+
},
|
|
457
|
+
});
|
|
458
|
+
function Button(_a) {
|
|
459
|
+
var { className, variant, size, asChild = false } = _a, props = __rest(_a, ["className", "variant", "size", "asChild"]);
|
|
460
|
+
const Comp = asChild ? Slot : "button";
|
|
461
|
+
return (React__namespace.createElement(Comp, Object.assign({ "data-slot": "button", className: cn(buttonVariants({ variant, size, className })) }, props)));
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
function Checkbox(_a) {
|
|
465
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
466
|
+
return (React__namespace.createElement(CheckboxPrimitive__namespace.Root, Object.assign({ "data-slot": "checkbox", className: cn("peer border-input data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className) }, props),
|
|
467
|
+
React__namespace.createElement(CheckboxPrimitive__namespace.Indicator, { "data-slot": "checkbox-indicator", className: "flex items-center justify-center text-current transition-none" },
|
|
468
|
+
React__namespace.createElement(lucideReact.CheckIcon, { className: "size-3.5" }))));
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
function Label(_a) {
|
|
472
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
473
|
+
return (React__namespace.createElement(LabelPrimitive__namespace.Root, Object.assign({ "data-slot": "label", className: cn("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50", className) }, props)));
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
const Form = reactHookForm.FormProvider;
|
|
477
|
+
const FormFieldContext = React__namespace.createContext({});
|
|
478
|
+
const FormField = (_a) => {
|
|
479
|
+
var props = __rest(_a, []);
|
|
480
|
+
return (React__namespace.createElement(FormFieldContext.Provider, { value: { name: props.name } },
|
|
481
|
+
React__namespace.createElement(reactHookForm.Controller, Object.assign({}, props))));
|
|
482
|
+
};
|
|
483
|
+
const useFormField = () => {
|
|
484
|
+
const fieldContext = React__namespace.useContext(FormFieldContext);
|
|
485
|
+
const itemContext = React__namespace.useContext(FormItemContext);
|
|
486
|
+
const { getFieldState } = reactHookForm.useFormContext();
|
|
487
|
+
const formState = reactHookForm.useFormState({ name: fieldContext.name });
|
|
488
|
+
const fieldState = getFieldState(fieldContext.name, formState);
|
|
489
|
+
if (!fieldContext) {
|
|
490
|
+
throw new Error("useFormField should be used within <FormField>");
|
|
491
|
+
}
|
|
492
|
+
const { id } = itemContext;
|
|
493
|
+
return Object.assign({ id, name: fieldContext.name, formItemId: `${id}-form-item`, formDescriptionId: `${id}-form-item-description`, formMessageId: `${id}-form-item-message` }, fieldState);
|
|
494
|
+
};
|
|
495
|
+
const FormItemContext = React__namespace.createContext({});
|
|
496
|
+
function FormItem(_a) {
|
|
497
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
498
|
+
const id = React__namespace.useId();
|
|
499
|
+
return (React__namespace.createElement(FormItemContext.Provider, { value: { id } },
|
|
500
|
+
React__namespace.createElement("div", Object.assign({ "data-slot": "form-item", className: cn("grid gap-2", className) }, props))));
|
|
501
|
+
}
|
|
502
|
+
function FormLabel(_a) {
|
|
503
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
504
|
+
const { error, formItemId } = useFormField();
|
|
505
|
+
return (React__namespace.createElement(Label, Object.assign({ "data-slot": "form-label", "data-error": !!error, className: cn("data-[error=true]:text-destructive-foreground", className), htmlFor: formItemId }, props)));
|
|
506
|
+
}
|
|
507
|
+
function FormControl(_a) {
|
|
508
|
+
var props = __rest(_a, []);
|
|
509
|
+
const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
|
|
510
|
+
return (React__namespace.createElement(Slot, Object.assign({ "data-slot": "form-control", id: formItemId, "aria-describedby": !error
|
|
511
|
+
? `${formDescriptionId}`
|
|
512
|
+
: `${formDescriptionId} ${formMessageId}`, "aria-invalid": !!error }, props)));
|
|
513
|
+
}
|
|
514
|
+
function FormMessage(_a) {
|
|
515
|
+
var _b;
|
|
516
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
517
|
+
const { error, formMessageId } = useFormField();
|
|
518
|
+
const body = error ? String((_b = error === null || error === void 0 ? void 0 : error.message) !== null && _b !== void 0 ? _b : "") : props.children;
|
|
519
|
+
if (!body) {
|
|
520
|
+
return null;
|
|
521
|
+
}
|
|
522
|
+
return (React__namespace.createElement("p", Object.assign({ "data-slot": "form-message", id: formMessageId, className: cn("text-destructive-foreground text-sm", className) }, props), body));
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
function Input(_a) {
|
|
526
|
+
var { className, type } = _a, props = __rest(_a, ["className", "type"]);
|
|
527
|
+
return (React__namespace.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-9 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)));
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
function Select(_a) {
|
|
531
|
+
var props = __rest(_a, []);
|
|
532
|
+
return React__namespace.createElement(SelectPrimitive__namespace.Root, Object.assign({ "data-slot": "select" }, props));
|
|
533
|
+
}
|
|
534
|
+
function SelectValue(_a) {
|
|
535
|
+
var props = __rest(_a, []);
|
|
536
|
+
return React__namespace.createElement(SelectPrimitive__namespace.Value, Object.assign({ "data-slot": "select-value" }, props));
|
|
537
|
+
}
|
|
538
|
+
function SelectTrigger(_a) {
|
|
539
|
+
var { className, children } = _a, props = __rest(_a, ["className", "children"]);
|
|
540
|
+
return (React__namespace.createElement(SelectPrimitive__namespace.Trigger, Object.assign({ "data-slot": "select-trigger", className: cn("border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive flex h-9 w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className) }, props),
|
|
541
|
+
children,
|
|
542
|
+
React__namespace.createElement(SelectPrimitive__namespace.Icon, { asChild: true },
|
|
543
|
+
React__namespace.createElement(lucideReact.ChevronDownIcon, { className: "size-4 opacity-50" }))));
|
|
544
|
+
}
|
|
545
|
+
function SelectContent(_a) {
|
|
546
|
+
var { className, children, position = "popper" } = _a, props = __rest(_a, ["className", "children", "position"]);
|
|
547
|
+
return (React__namespace.createElement(SelectPrimitive__namespace.Portal, null,
|
|
548
|
+
React__namespace.createElement(SelectPrimitive__namespace.Content, Object.assign({ "data-slot": "select-content", className: cn("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border shadow-md", position === "popper" &&
|
|
549
|
+
"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className), position: position }, props),
|
|
550
|
+
React__namespace.createElement(SelectScrollUpButton, null),
|
|
551
|
+
React__namespace.createElement(SelectPrimitive__namespace.Viewport, { className: cn("p-1", position === "popper" &&
|
|
552
|
+
"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1") }, children),
|
|
553
|
+
React__namespace.createElement(SelectScrollDownButton, null))));
|
|
554
|
+
}
|
|
555
|
+
function SelectItem(_a) {
|
|
556
|
+
var { className, children } = _a, props = __rest(_a, ["className", "children"]);
|
|
557
|
+
return (React__namespace.createElement(SelectPrimitive__namespace.Item, Object.assign({ "data-slot": "select-item", className: cn("focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", className) }, props),
|
|
558
|
+
React__namespace.createElement("span", { className: "absolute right-2 flex size-3.5 items-center justify-center" },
|
|
559
|
+
React__namespace.createElement(SelectPrimitive__namespace.ItemIndicator, null,
|
|
560
|
+
React__namespace.createElement(lucideReact.CheckIcon, { className: "size-4" }))),
|
|
561
|
+
React__namespace.createElement(SelectPrimitive__namespace.ItemText, null, children)));
|
|
562
|
+
}
|
|
563
|
+
function SelectScrollUpButton(_a) {
|
|
564
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
565
|
+
return (React__namespace.createElement(SelectPrimitive__namespace.ScrollUpButton, Object.assign({ "data-slot": "select-scroll-up-button", className: cn("flex cursor-default items-center justify-center py-1", className) }, props),
|
|
566
|
+
React__namespace.createElement(lucideReact.ChevronUpIcon, { className: "size-4" })));
|
|
567
|
+
}
|
|
568
|
+
function SelectScrollDownButton(_a) {
|
|
569
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
570
|
+
return (React__namespace.createElement(SelectPrimitive__namespace.ScrollDownButton, Object.assign({ "data-slot": "select-scroll-down-button", className: cn("flex cursor-default items-center justify-center py-1", className) }, props),
|
|
571
|
+
React__namespace.createElement(lucideReact.ChevronDownIcon, { className: "size-4" })));
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
function n(r,e){for(var n={};r.length;){var s=r[0],t=s.code,i=s.message,a=s.path.join(".");if(!n[a])if("unionErrors"in s){var u=s.unionErrors[0].errors[0];n[a]={message:u.message,type:u.code};}else n[a]={message:i,type:t};if("unionErrors"in s&&s.unionErrors.forEach(function(e){return e.errors.forEach(function(e){return r.push(e)})}),e){var c=n[a].types,f=c&&c[s.code];n[a]=reactHookForm.appendErrors(a,e,n,t,f?[].concat(f,s.message):s.message);}r.shift();}return n}function s(o,s,t){return void 0===t&&(t={}),function(i,a,u){try{return Promise.resolve(function(e,n){try{var a=Promise.resolve(o["sync"===t.mode?"parse":"parseAsync"](i,s)).then(function(e){return u.shouldUseNativeValidation&&resolvers.validateFieldsNatively({},u),{errors:{},values:t.raw?Object.assign({},i):e}});}catch(r){return n(r)}return a&&a.then?a.then(void 0,n):a}(0,function(r){if(function(r){return Array.isArray(null==r?void 0:r.errors)}(r))return {values:{},errors:resolvers.toNestErrors(n(r.errors,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)};throw r}))}catch(r){return Promise.reject(r)}}}
|
|
575
|
+
|
|
576
|
+
// Shipping address schema
|
|
577
|
+
const customerSchema = zod.z.object({
|
|
578
|
+
email: zod.z.string().email("Please enter a valid email address"),
|
|
579
|
+
marketingConsent: zod.z.boolean().optional(),
|
|
580
|
+
firstName: zod.z.string().optional(),
|
|
581
|
+
lastName: zod.z.string().min(1, "Last name is required"),
|
|
582
|
+
address: zod.z.string().min(1, "Address is required"),
|
|
583
|
+
apartment: zod.z.string().optional(),
|
|
584
|
+
city: zod.z.string().min(1, "City is required"),
|
|
585
|
+
state: zod.z.string().min(1, "State is required"),
|
|
586
|
+
zipCode: zod.z.string().min(5, "ZIP code is required"),
|
|
587
|
+
country: zod.z.string().min(1, "Country is required"),
|
|
588
|
+
saveInfo: zod.z.boolean().optional(),
|
|
589
|
+
});
|
|
590
|
+
// Shipping method schema
|
|
591
|
+
const shippingMethodSchema = zod.z.object({
|
|
592
|
+
method: zod.z.enum(["economy", "standard"]),
|
|
593
|
+
});
|
|
594
|
+
// Payment method schema
|
|
595
|
+
const paymentMethodSchema = zod.z.object({
|
|
596
|
+
cardNumber: zod.z.string().min(1, "Card number is required"),
|
|
597
|
+
expiryDate: zod.z.string().min(1, "Expiry date is required"),
|
|
598
|
+
cvv: zod.z.string().min(1, "CVV is required"),
|
|
599
|
+
nameOnCard: zod.z.string().min(1, "Name is required"),
|
|
600
|
+
});
|
|
601
|
+
// Combined checkout schema
|
|
602
|
+
zod.z.object({
|
|
603
|
+
customer: customerSchema,
|
|
604
|
+
shipping: shippingMethodSchema,
|
|
605
|
+
payment: paymentMethodSchema,
|
|
606
|
+
});
|
|
607
|
+
|
|
608
|
+
function CustomerForm({ initialData, onSubmit, onBack, }) {
|
|
609
|
+
const form = reactHookForm.useForm({
|
|
610
|
+
resolver: s(customerSchema),
|
|
611
|
+
defaultValues: initialData || {
|
|
612
|
+
email: "",
|
|
613
|
+
marketingConsent: false,
|
|
614
|
+
firstName: "",
|
|
615
|
+
lastName: "",
|
|
616
|
+
apartment: "",
|
|
617
|
+
city: "",
|
|
618
|
+
state: "",
|
|
619
|
+
zipCode: "",
|
|
620
|
+
country: "United States",
|
|
621
|
+
saveInfo: false,
|
|
622
|
+
},
|
|
623
|
+
});
|
|
624
|
+
return (React.createElement("div", { className: "space-y-6" },
|
|
625
|
+
React.createElement("div", { className: "space-y-2" },
|
|
626
|
+
React.createElement("div", { className: "flex items-center justify-between" },
|
|
627
|
+
React.createElement("h2", { className: "text-2xl font-bold text-white" }, "Contact")),
|
|
628
|
+
React.createElement(FormField, { control: form.control, name: "email", render: ({ field }) => (React.createElement(FormItem, null,
|
|
629
|
+
React.createElement(FormLabel, { className: "text-white" }, "Email or mobile phone number"),
|
|
630
|
+
React.createElement(FormControl, null,
|
|
631
|
+
React.createElement(Input, Object.assign({ placeholder: "email@example.com", className: "bg-black border-gray-700 text-white" }, field))),
|
|
632
|
+
React.createElement(FormMessage, null))) }),
|
|
633
|
+
React.createElement(FormField, { control: form.control, name: "marketingConsent", render: ({ field }) => (React.createElement(FormItem, { className: "flex flex-row items-start space-x-2 space-y-0" },
|
|
634
|
+
React.createElement(FormControl, null,
|
|
635
|
+
React.createElement(Checkbox, { checked: field.value, onCheckedChange: field.onChange, className: "data-[state=checked]:bg-blue-600" })),
|
|
636
|
+
React.createElement(FormLabel, { className: "text-sm font-normal text-gray-400" }, "Email me with news and offers"))) }),
|
|
637
|
+
React.createElement("div", { className: "flex items-center justify-between" },
|
|
638
|
+
React.createElement("h2", { className: "text-2xl font-bold text-white" }, "Shipping customer")),
|
|
639
|
+
React.createElement("div", { className: "flex items-center justify-between text-sm" },
|
|
640
|
+
React.createElement("div", { className: "text-white" },
|
|
641
|
+
React.createElement("span", null, "Contact"),
|
|
642
|
+
React.createElement("span", { className: "ml-2 text-gray-400" }, "contactemail")),
|
|
643
|
+
React.createElement(Button, { variant: "link", className: "text-blue-500 p-0 h-auto", onClick: onBack }, "Change"))),
|
|
644
|
+
React.createElement(Form, Object.assign({}, form),
|
|
645
|
+
React.createElement("form", { onSubmit: form.handleSubmit(onSubmit), className: "space-y-4" },
|
|
646
|
+
React.createElement(FormField, { control: form.control, name: "country", render: ({ field }) => (React.createElement(FormItem, null,
|
|
647
|
+
React.createElement(FormLabel, { className: "text-white" }, "Country/Region"),
|
|
648
|
+
React.createElement(Select, { onValueChange: field.onChange, defaultValue: field.value },
|
|
649
|
+
React.createElement(FormControl, null,
|
|
650
|
+
React.createElement(SelectTrigger, { className: "bg-black border-gray-700 text-white" },
|
|
651
|
+
React.createElement(SelectValue, { placeholder: "Select a country" }))),
|
|
652
|
+
React.createElement(SelectContent, { className: "bg-gray-900 text-white border-gray-700" },
|
|
653
|
+
React.createElement(SelectItem, { value: "United States" }, "United States"),
|
|
654
|
+
React.createElement(SelectItem, { value: "Canada" }, "Canada"),
|
|
655
|
+
React.createElement(SelectItem, { value: "United Kingdom" }, "United Kingdom"))),
|
|
656
|
+
React.createElement(FormMessage, null))) }),
|
|
657
|
+
React.createElement("div", { className: "grid grid-cols-2 gap-4" },
|
|
658
|
+
React.createElement(FormField, { control: form.control, name: "firstName", render: ({ field }) => (React.createElement(FormItem, null,
|
|
659
|
+
React.createElement(FormLabel, { className: "text-white" }, "First name (optional)"),
|
|
660
|
+
React.createElement(FormControl, null,
|
|
661
|
+
React.createElement(Input, Object.assign({ className: "bg-black border-gray-700 text-white" }, field))),
|
|
662
|
+
React.createElement(FormMessage, null))) }),
|
|
663
|
+
React.createElement(FormField, { control: form.control, name: "lastName", render: ({ field }) => (React.createElement(FormItem, null,
|
|
664
|
+
React.createElement(FormLabel, { className: "text-white" }, "Last name"),
|
|
665
|
+
React.createElement(FormControl, null,
|
|
666
|
+
React.createElement(Input, Object.assign({ className: "bg-black border-gray-700 text-white" }, field))),
|
|
667
|
+
React.createElement(FormMessage, null))) })),
|
|
668
|
+
React.createElement(FormField, { control: form.control, name: "apartment", render: ({ field }) => (React.createElement(FormItem, null,
|
|
669
|
+
React.createElement(FormLabel, { className: "text-white" }, "Apartment, suite, etc. (optional)"),
|
|
670
|
+
React.createElement(FormControl, null,
|
|
671
|
+
React.createElement(Input, Object.assign({ className: "bg-black border-gray-700 text-white" }, field))),
|
|
672
|
+
React.createElement(FormMessage, null))) }),
|
|
673
|
+
React.createElement("div", { className: "grid grid-cols-3 gap-4" },
|
|
674
|
+
React.createElement(FormField, { control: form.control, name: "city", render: ({ field }) => (React.createElement(FormItem, null,
|
|
675
|
+
React.createElement(FormLabel, { className: "text-white" }, "City"),
|
|
676
|
+
React.createElement(FormControl, null,
|
|
677
|
+
React.createElement(Input, Object.assign({ className: "bg-black border-gray-700 text-white" }, field))),
|
|
678
|
+
React.createElement(FormMessage, null))) }),
|
|
679
|
+
React.createElement(FormField, { control: form.control, name: "state", render: ({ field }) => (React.createElement(FormItem, null,
|
|
680
|
+
React.createElement(FormLabel, { className: "text-white" }, "State"),
|
|
681
|
+
React.createElement(Select, { onValueChange: field.onChange, defaultValue: field.value },
|
|
682
|
+
React.createElement(FormControl, null,
|
|
683
|
+
React.createElement(SelectTrigger, { className: "bg-black border-gray-700 text-white" },
|
|
684
|
+
React.createElement(SelectValue, { placeholder: "State" }))),
|
|
685
|
+
React.createElement(SelectContent, { className: "bg-gray-900 text-white border-gray-700" },
|
|
686
|
+
React.createElement(SelectItem, { value: "Illinois" }, "Illinois"),
|
|
687
|
+
React.createElement(SelectItem, { value: "California" }, "California"),
|
|
688
|
+
React.createElement(SelectItem, { value: "New York" }, "New York"),
|
|
689
|
+
React.createElement(SelectItem, { value: "Texas" }, "Texas"))),
|
|
690
|
+
React.createElement(FormMessage, null))) }),
|
|
691
|
+
React.createElement(FormField, { control: form.control, name: "zipCode", render: ({ field }) => (React.createElement(FormItem, null,
|
|
692
|
+
React.createElement(FormLabel, { className: "text-white" }, "ZIP code"),
|
|
693
|
+
React.createElement(FormControl, null,
|
|
694
|
+
React.createElement(Input, Object.assign({ className: "bg-black border-gray-700 text-white" }, field))),
|
|
695
|
+
React.createElement(FormMessage, null))) })),
|
|
696
|
+
React.createElement(FormField, { control: form.control, name: "saveInfo", render: ({ field }) => (React.createElement(FormItem, { className: "flex flex-row items-start space-x-2 space-y-0" },
|
|
697
|
+
React.createElement(FormControl, null,
|
|
698
|
+
React.createElement(Checkbox, { checked: field.value, onCheckedChange: field.onChange, className: "data-[state=checked]:bg-blue-600" })),
|
|
699
|
+
React.createElement(FormLabel, { className: "text-sm font-normal text-gray-400" }, "Save this information for next time"))) }),
|
|
700
|
+
React.createElement("div", { className: "flex justify-between items-center pt-4" },
|
|
701
|
+
React.createElement(Button, { type: "button", variant: "link", className: "text-blue-500 p-0 h-auto flex items-center gap-1", onClick: onBack },
|
|
702
|
+
React.createElement(lucideReact.ChevronLeft, { className: "h-4 w-4" }),
|
|
703
|
+
"Return to information"),
|
|
704
|
+
React.createElement(Button, { type: "submit", className: "bg-blue-600 hover:bg-blue-700 text-white" }, "Continue to shipping"))))));
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
function PaymentForm({ initialData, onSubmit, onBack, contactEmail, shippingAddress, shippingMethod, shippingPrice, }) {
|
|
708
|
+
const form = reactHookForm.useForm({
|
|
709
|
+
resolver: s(paymentMethodSchema),
|
|
710
|
+
defaultValues: initialData || {
|
|
711
|
+
cardNumber: "",
|
|
712
|
+
expiryDate: "",
|
|
713
|
+
cvv: "",
|
|
714
|
+
nameOnCard: "",
|
|
715
|
+
},
|
|
716
|
+
});
|
|
717
|
+
return (React.createElement("div", { className: "space-y-6" },
|
|
718
|
+
React.createElement("div", { className: "space-y-2" },
|
|
719
|
+
React.createElement("div", { className: "flex items-center justify-between" },
|
|
720
|
+
React.createElement("h2", { className: "text-2xl font-bold text-white" }, "Payment"),
|
|
721
|
+
React.createElement("p", { className: "text-sm text-gray-400" }, "All transactions are secure and encrypted.")),
|
|
722
|
+
React.createElement("div", { className: "flex items-center justify-between text-sm" },
|
|
723
|
+
React.createElement("div", { className: "text-white" },
|
|
724
|
+
React.createElement("span", null, "Contact"),
|
|
725
|
+
React.createElement("span", { className: "ml-2 text-gray-400" }, contactEmail)),
|
|
726
|
+
React.createElement(Button, { variant: "link", className: "text-blue-500 p-0 h-auto", onClick: onBack }, "Change")),
|
|
727
|
+
React.createElement("div", { className: "flex items-center justify-between text-sm" },
|
|
728
|
+
React.createElement("div", { className: "text-white" },
|
|
729
|
+
React.createElement("span", null, "Ship to"),
|
|
730
|
+
React.createElement("span", { className: "ml-2 text-gray-400" }, shippingAddress)),
|
|
731
|
+
React.createElement(Button, { variant: "link", className: "text-blue-500 p-0 h-auto", onClick: onBack }, "Change")),
|
|
732
|
+
React.createElement("div", { className: "flex items-center justify-between text-sm" },
|
|
733
|
+
React.createElement("div", { className: "text-white" },
|
|
734
|
+
React.createElement("span", null, "Shipping method"),
|
|
735
|
+
React.createElement("span", { className: "ml-2 text-gray-400" },
|
|
736
|
+
shippingMethod,
|
|
737
|
+
" \u00B7 ",
|
|
738
|
+
shippingPrice)),
|
|
739
|
+
React.createElement(Button, { variant: "link", className: "text-blue-500 p-0 h-auto", onClick: onBack }, "Change"))),
|
|
740
|
+
React.createElement("div", { className: "space-y-4 bg-gray-900 p-4 rounded-md" },
|
|
741
|
+
React.createElement("div", { className: "text-white font-medium" }, "Payment method"),
|
|
742
|
+
React.createElement(Form, Object.assign({}, form),
|
|
743
|
+
React.createElement("form", { onSubmit: form.handleSubmit(onSubmit), className: "space-y-4" },
|
|
744
|
+
React.createElement(FormField, { control: form.control, name: "cardNumber", render: ({ field }) => (React.createElement(FormItem, null,
|
|
745
|
+
React.createElement(FormLabel, { className: "text-white" }, "Card number"),
|
|
746
|
+
React.createElement(FormControl, null,
|
|
747
|
+
React.createElement(Input, Object.assign({ placeholder: "1234 5678 9012 3456", className: "bg-black border-gray-700 text-white" }, field))),
|
|
748
|
+
React.createElement(FormMessage, null))) }),
|
|
749
|
+
React.createElement("div", { className: "grid grid-cols-2 gap-4" },
|
|
750
|
+
React.createElement(FormField, { control: form.control, name: "expiryDate", render: ({ field }) => (React.createElement(FormItem, null,
|
|
751
|
+
React.createElement(FormLabel, { className: "text-white" }, "Expiration date (MM/YY)"),
|
|
752
|
+
React.createElement(FormControl, null,
|
|
753
|
+
React.createElement(Input, Object.assign({ placeholder: "MM/YY", className: "bg-black border-gray-700 text-white" }, field))),
|
|
754
|
+
React.createElement(FormMessage, null))) }),
|
|
755
|
+
React.createElement(FormField, { control: form.control, name: "cvv", render: ({ field }) => (React.createElement(FormItem, null,
|
|
756
|
+
React.createElement(FormLabel, { className: "text-white" }, "Security code"),
|
|
757
|
+
React.createElement(FormControl, null,
|
|
758
|
+
React.createElement(Input, Object.assign({ placeholder: "CVV", className: "bg-black border-gray-700 text-white" }, field))),
|
|
759
|
+
React.createElement(FormMessage, null))) })),
|
|
760
|
+
React.createElement(FormField, { control: form.control, name: "nameOnCard", render: ({ field }) => (React.createElement(FormItem, null,
|
|
761
|
+
React.createElement(FormLabel, { className: "text-white" }, "Name on card"),
|
|
762
|
+
React.createElement(FormControl, null,
|
|
763
|
+
React.createElement(Input, Object.assign({ placeholder: "Name as it appears on card", className: "bg-black border-gray-700 text-white" }, field))),
|
|
764
|
+
React.createElement(FormMessage, null))) }),
|
|
765
|
+
React.createElement("div", { className: "flex justify-between items-center pt-4" },
|
|
766
|
+
React.createElement(Button, { type: "button", variant: "link", className: "text-blue-500 p-0 h-auto flex items-center gap-1", onClick: onBack },
|
|
767
|
+
React.createElement(lucideReact.ChevronLeft, { className: "h-4 w-4" }),
|
|
768
|
+
"Return to shipping"),
|
|
769
|
+
React.createElement(Button, { type: "submit", className: "bg-blue-600 hover:bg-blue-700 text-white" }, "Pay now")))))));
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
function RadioGroup(_a) {
|
|
773
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
774
|
+
return (React__namespace.createElement(RadioGroupPrimitive__namespace.Root, Object.assign({ "data-slot": "radio-group", className: cn("grid gap-3", className) }, props)));
|
|
775
|
+
}
|
|
776
|
+
function RadioGroupItem(_a) {
|
|
777
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
778
|
+
return (React__namespace.createElement(RadioGroupPrimitive__namespace.Item, Object.assign({ "data-slot": "radio-group-item", className: cn("border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className) }, props),
|
|
779
|
+
React__namespace.createElement(RadioGroupPrimitive__namespace.Indicator, { "data-slot": "radio-group-indicator", className: "relative flex items-center justify-center" },
|
|
780
|
+
React__namespace.createElement(lucideReact.CircleIcon, { className: "fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2" }))));
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
function ShippingMethodForm({ initialData, onSubmit, onBack, contactEmail, shippingAddress, }) {
|
|
784
|
+
const form = reactHookForm.useForm({
|
|
785
|
+
resolver: s(shippingMethodSchema),
|
|
786
|
+
defaultValues: initialData || {
|
|
787
|
+
method: "economy",
|
|
788
|
+
},
|
|
789
|
+
});
|
|
790
|
+
return (React.createElement("div", { className: "space-y-6" },
|
|
791
|
+
React.createElement("div", { className: "space-y-2" },
|
|
792
|
+
React.createElement("div", { className: "flex items-center justify-between" },
|
|
793
|
+
React.createElement("h2", { className: "text-2xl font-bold text-white" }, "Shipping method")),
|
|
794
|
+
React.createElement("div", { className: "flex items-center justify-between text-sm" },
|
|
795
|
+
React.createElement("div", { className: "text-white" },
|
|
796
|
+
React.createElement("span", null, "Contact"),
|
|
797
|
+
React.createElement("span", { className: "ml-2 text-gray-400" }, contactEmail)),
|
|
798
|
+
React.createElement(Button, { variant: "link", className: "text-blue-500 p-0 h-auto", onClick: onBack }, "Change")),
|
|
799
|
+
React.createElement("div", { className: "flex items-center justify-between text-sm" },
|
|
800
|
+
React.createElement("div", { className: "text-white" },
|
|
801
|
+
React.createElement("span", null, "Ship to"),
|
|
802
|
+
React.createElement("span", { className: "ml-2 text-gray-400" }, shippingAddress)),
|
|
803
|
+
React.createElement(Button, { variant: "link", className: "text-blue-500 p-0 h-auto", onClick: onBack }, "Change"))),
|
|
804
|
+
React.createElement(Form, Object.assign({}, form),
|
|
805
|
+
React.createElement("form", { onSubmit: form.handleSubmit(onSubmit), className: "space-y-4" },
|
|
806
|
+
React.createElement(FormField, { control: form.control, name: "method", render: ({ field }) => (React.createElement(FormItem, null,
|
|
807
|
+
React.createElement(FormControl, null,
|
|
808
|
+
React.createElement(RadioGroup, { onValueChange: field.onChange, defaultValue: field.value, className: "space-y-3" },
|
|
809
|
+
React.createElement(FormItem, { className: "flex items-center justify-between space-x-3 space-y-0 rounded-md border border-gray-700 p-4 cursor-pointer data-[state=checked]:border-blue-600" },
|
|
810
|
+
React.createElement("div", { className: "flex items-center space-x-3" },
|
|
811
|
+
React.createElement(FormControl, null,
|
|
812
|
+
React.createElement(RadioGroupItem, { value: "economy", className: "data-[state=checked]:border-blue-600 data-[state=checked]:text-blue-600" })),
|
|
813
|
+
React.createElement("div", { className: "space-y-1" },
|
|
814
|
+
React.createElement(FormLabel, { className: "text-white" }, "Economy"),
|
|
815
|
+
React.createElement("div", { className: "text-sm text-gray-400" }, "5 to 8 business days"))),
|
|
816
|
+
React.createElement("div", { className: "text-white font-medium" }, "$4.90")),
|
|
817
|
+
React.createElement(FormItem, { className: "flex items-center justify-between space-x-3 space-y-0 rounded-md border border-gray-700 p-4 cursor-pointer data-[state=checked]:border-blue-600" },
|
|
818
|
+
React.createElement("div", { className: "flex items-center space-x-3" },
|
|
819
|
+
React.createElement(FormControl, null,
|
|
820
|
+
React.createElement(RadioGroupItem, { value: "standard", className: "data-[state=checked]:border-blue-600 data-[state=checked]:text-blue-600" })),
|
|
821
|
+
React.createElement("div", { className: "space-y-1" },
|
|
822
|
+
React.createElement(FormLabel, { className: "text-white" }, "Standard"),
|
|
823
|
+
React.createElement("div", { className: "text-sm text-gray-400" }, "3 to 4 business days"))),
|
|
824
|
+
React.createElement("div", { className: "text-white font-medium" }, "$6.90")))),
|
|
825
|
+
React.createElement(FormMessage, null))) }),
|
|
826
|
+
React.createElement("div", { className: "flex justify-between items-center pt-4" },
|
|
827
|
+
React.createElement(Button, { type: "button", variant: "link", className: "text-blue-500 p-0 h-auto flex items-center gap-1", onClick: onBack },
|
|
828
|
+
React.createElement(lucideReact.ChevronLeft, { className: "h-4 w-4" }),
|
|
829
|
+
"Return to information"),
|
|
830
|
+
React.createElement(Button, { type: "submit", className: "bg-blue-600 hover:bg-blue-700 text-white" }, "Continue to payment"))))));
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
function useLocalStorage(key, initialValue) {
|
|
834
|
+
// Create state to store our value
|
|
835
|
+
const [storedValue, setStoredValue] = React.useState(initialValue);
|
|
836
|
+
// Initialize state on client-side only
|
|
837
|
+
React.useEffect(() => {
|
|
838
|
+
try {
|
|
839
|
+
// Get from local storage by key
|
|
840
|
+
const item = window.localStorage.getItem(key);
|
|
841
|
+
// Parse stored json or if none return initialValue
|
|
842
|
+
setStoredValue(item ? JSON.parse(item) : initialValue);
|
|
843
|
+
}
|
|
844
|
+
catch (error) {
|
|
845
|
+
// If error, just use the initialValue
|
|
846
|
+
console.error(error);
|
|
847
|
+
setStoredValue(initialValue);
|
|
848
|
+
}
|
|
849
|
+
}, [initialValue, key]);
|
|
850
|
+
// Return a wrapped version of useState's setter function that
|
|
851
|
+
// persists the new value to localStorage.
|
|
852
|
+
const setValue = (value) => {
|
|
853
|
+
try {
|
|
854
|
+
// Allow value to be a function so we have the same API as useState
|
|
855
|
+
const valueToStore = value instanceof Function ? value(storedValue) : value;
|
|
856
|
+
// Save state
|
|
857
|
+
setStoredValue(valueToStore);
|
|
858
|
+
// Save to local storage
|
|
859
|
+
if (typeof window !== "undefined") {
|
|
860
|
+
window.localStorage.setItem(key, JSON.stringify(valueToStore));
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
catch (error) {
|
|
864
|
+
// A more advanced implementation would handle the error case
|
|
865
|
+
console.error(error);
|
|
866
|
+
}
|
|
867
|
+
};
|
|
868
|
+
return [storedValue, setValue];
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
function CheckoutForm$2({ checkoutId, onComplete, }) {
|
|
872
|
+
const [step, setStep] = React.useState("contact");
|
|
873
|
+
const [formData, setFormData] = useLocalStorage(`checkout-${checkoutId}`, {});
|
|
874
|
+
// Helper function to format address for display
|
|
875
|
+
const formatAddress = (address) => {
|
|
876
|
+
return `${address.address}, ${address.city} ${address.state} ${address.zipCode}, ${address.country}`;
|
|
877
|
+
};
|
|
878
|
+
// Format shipping method for display
|
|
879
|
+
const formatShippingMethod = (method) => {
|
|
880
|
+
switch (method) {
|
|
881
|
+
case "economy":
|
|
882
|
+
return { name: "Economy", price: "$4.90" };
|
|
883
|
+
case "standard":
|
|
884
|
+
return { name: "Standard", price: "$6.90" };
|
|
885
|
+
default:
|
|
886
|
+
return { name: "Economy", price: "$4.90" };
|
|
887
|
+
}
|
|
888
|
+
};
|
|
889
|
+
// Handle address form submission
|
|
890
|
+
const handleCustomerSubmit = (data) => {
|
|
891
|
+
setFormData(Object.assign(Object.assign({}, formData), { customer: data }));
|
|
892
|
+
setStep("shipping");
|
|
893
|
+
};
|
|
894
|
+
// Handle shipping method form submission
|
|
895
|
+
const handleShippingSubmit = (data) => {
|
|
896
|
+
setFormData(Object.assign(Object.assign({}, formData), { shipping: data }));
|
|
897
|
+
setStep("payment");
|
|
898
|
+
};
|
|
899
|
+
// Handle payment form submission
|
|
900
|
+
const handlePaymentSubmit = (data) => {
|
|
901
|
+
const completeFormData = Object.assign(Object.assign({}, formData), { payment: data });
|
|
902
|
+
setFormData(completeFormData);
|
|
903
|
+
if (onComplete) {
|
|
904
|
+
onComplete(completeFormData);
|
|
905
|
+
}
|
|
906
|
+
};
|
|
907
|
+
// Navigate back to previous step
|
|
908
|
+
const handleBack = () => {
|
|
909
|
+
if (step === "customer")
|
|
910
|
+
setStep("customer");
|
|
911
|
+
if (step === "shipping")
|
|
912
|
+
setStep("customer");
|
|
913
|
+
if (step === "payment")
|
|
914
|
+
setStep("shipping");
|
|
915
|
+
};
|
|
916
|
+
return (React.createElement("div", { className: "space-y-6" },
|
|
917
|
+
step === "customer" && (React.createElement(CustomerForm, { initialData: formData.customer, onSubmit: handleCustomerSubmit, onBack: handleBack })),
|
|
918
|
+
step === "shipping" && formData.customer && (React.createElement(ShippingMethodForm, { initialData: formData.shipping, onSubmit: handleShippingSubmit, onBack: handleBack, contactEmail: formData.customer.email, shippingAddress: formatAddress(formData.customer) })),
|
|
919
|
+
step === "payment" &&
|
|
920
|
+
formData.customer &&
|
|
921
|
+
formData.customer &&
|
|
922
|
+
formData.shipping && (React.createElement(PaymentForm, { initialData: formData.payment, onSubmit: handlePaymentSubmit, onBack: handleBack, contactEmail: formData.customer.email, shippingAddress: formatAddress(formData.customer), shippingMethod: formatShippingMethod(formData.shipping.method).name, shippingPrice: formatShippingMethod(formData.shipping.method).price }))));
|
|
923
|
+
}
|
|
924
|
+
|
|
276
925
|
function CheckoutSummary({ lineItems, shipping, tax, currency, }) {
|
|
277
926
|
const subtotal = lineItems.reduce((acc, item) => {
|
|
278
927
|
var _a, _b;
|
|
@@ -287,8 +936,7 @@ function CheckoutSummary({ lineItems, shipping, tax, currency, }) {
|
|
|
287
936
|
var _a, _b, _c, _d, _e;
|
|
288
937
|
return (React.createElement("div", { key: index, className: "flex items-center mb-6" },
|
|
289
938
|
React.createElement("div", { className: "relative" },
|
|
290
|
-
React.createElement("div", { className: "w-16 h-16 bg-zinc-900 rounded-lg overflow-hidden relative" }, ((_a = item.product) === null || _a === void 0 ? void 0 : _a.images[0])
|
|
291
|
-
React.createElement("span", { className: "text-zinc-500" }, "No image")))),
|
|
939
|
+
React.createElement("div", { className: "w-16 h-16 bg-zinc-900 rounded-lg overflow-hidden relative" }, ((_a = item.product) === null || _a === void 0 ? void 0 : _a.images[0]) && (React.createElement("img", { src: item.product.images[0] || "/placeholder.svg", alt: ((_b = item.product) === null || _b === void 0 ? void 0 : _b.title) || "Product image", className: "object-cover" }))),
|
|
292
940
|
React.createElement("div", { className: "absolute -top-2 -right-2 w-6 h-6 bg-zinc-700 rounded-full flex items-center justify-center text-sm" }, item.quantity)),
|
|
293
941
|
React.createElement("div", { className: "ml-4 flex-1" },
|
|
294
942
|
React.createElement("h3", { className: "text-lg font-medium" }, ((_c = item.product) === null || _c === void 0 ? void 0 : _c.title) || "Product"),
|
|
@@ -336,16 +984,16 @@ function CheckoutEmbed({ checkoutId }) {
|
|
|
336
984
|
}
|
|
337
985
|
fetchCheckout();
|
|
338
986
|
}, [checkoutId]);
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
987
|
+
const handleComplete = (formData) => {
|
|
988
|
+
console.log("Checkout complete:", formData);
|
|
989
|
+
// Here you would typically send the completed form data to your API
|
|
990
|
+
};
|
|
991
|
+
if (!checkout && !loading) {
|
|
343
992
|
return React.createElement("div", null, "Checkout not found");
|
|
344
993
|
}
|
|
345
994
|
return (React.createElement("div", { className: "grid md:grid-cols-2 gap-4" },
|
|
346
|
-
React.createElement("div", null, "
|
|
347
|
-
React.createElement("div", null,
|
|
348
|
-
React.createElement(CheckoutSummary, { currency: checkout.currency, lineItems: checkout.lineItems, shipping: checkout === null || checkout === void 0 ? void 0 : checkout.shipping, tax: checkout === null || checkout === void 0 ? void 0 : checkout.tax }))));
|
|
995
|
+
React.createElement("div", null, loading ? (React.createElement("div", { className: "text-white" }, "Loading...")) : (React.createElement(CheckoutForm$2, { checkoutId: checkoutId, onComplete: handleComplete }))),
|
|
996
|
+
React.createElement("div", null, loading ? (React.createElement("div", null, "Loading...")) : (React.createElement(CheckoutSummary, { currency: checkout.currency, lineItems: checkout.lineItems, shipping: checkout === null || checkout === void 0 ? void 0 : checkout.shipping, tax: checkout === null || checkout === void 0 ? void 0 : checkout.tax })))));
|
|
349
997
|
}
|
|
350
998
|
var index$1 = React.memo(CheckoutEmbed);
|
|
351
999
|
|
|
@@ -399,6 +1047,36 @@ function PaymentElement({ paymentSecret, checkoutAppearance, onSuccess, onError,
|
|
|
399
1047
|
}
|
|
400
1048
|
var index = React.memo(PaymentElement);
|
|
401
1049
|
|
|
1050
|
+
function styleInject(css, ref) {
|
|
1051
|
+
if ( ref === void 0 ) ref = {};
|
|
1052
|
+
var insertAt = ref.insertAt;
|
|
1053
|
+
|
|
1054
|
+
if (typeof document === 'undefined') { return; }
|
|
1055
|
+
|
|
1056
|
+
var head = document.head || document.getElementsByTagName('head')[0];
|
|
1057
|
+
var style = document.createElement('style');
|
|
1058
|
+
style.type = 'text/css';
|
|
1059
|
+
|
|
1060
|
+
if (insertAt === 'top') {
|
|
1061
|
+
if (head.firstChild) {
|
|
1062
|
+
head.insertBefore(style, head.firstChild);
|
|
1063
|
+
} else {
|
|
1064
|
+
head.appendChild(style);
|
|
1065
|
+
}
|
|
1066
|
+
} else {
|
|
1067
|
+
head.appendChild(style);
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
if (style.styleSheet) {
|
|
1071
|
+
style.styleSheet.cssText = css;
|
|
1072
|
+
} else {
|
|
1073
|
+
style.appendChild(document.createTextNode(css));
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
var css_248z = "/*! tailwindcss v4.0.12 | MIT License | https://tailwindcss.com */@layer theme, base, components, utilities;@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;--color-red-500:oklch(0.637 0.237 25.331);--color-blue-500:oklch(0.623 0.214 259.815);--color-blue-600:oklch(0.546 0.245 262.881);--color-blue-700:oklch(0.488 0.243 264.376);--color-gray-400:oklch(0.707 0.022 261.325);--color-gray-700:oklch(0.373 0.034 259.733);--color-gray-900:oklch(0.21 0.034 264.665);--color-zinc-400:oklch(0.705 0.015 286.067);--color-zinc-700:oklch(0.37 0.013 285.805);--color-zinc-800:oklch(0.274 0.006 286.033);--color-zinc-900:oklch(0.21 0.006 285.885);--color-black:#000;--color-white:#fff;--spacing:0.25rem;--text-sm:0.875rem;--text-sm--line-height:1.42857;--text-base:1rem;--text-base--line-height:1.5;--text-lg:1.125rem;--text-lg--line-height:1.55556;--text-2xl:1.5rem;--text-2xl--line-height:1.33333;--font-weight-normal:400;--font-weight-medium:500;--font-weight-bold:700;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4,0,0.2,1);--default-font-family:var(--font-sans);--default-font-feature-settings:var(--font-sans--font-feature-settings);--default-font-variation-settings:var(\n --font-sans--font-variation-settings\n );--default-mono-font-family:var(--font-mono);--default-mono-font-feature-settings:var(\n --font-mono--font-feature-settings\n );--default-mono-font-variation-settings:var(\n --font-mono--font-variation-settings\n )}}@layer base{*,::backdrop,::file-selector-button,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:var(--default-font-feature-settings,normal);-webkit-tap-highlight-color:transparent;font-family:var( --default-font-family,ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\" );font-variation-settings:var( --default-font-variation-settings,normal );line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:var( --default-mono-font-feature-settings,normal );font-family:var( --default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace );font-size:1em;font-variation-settings:var( --default-mono-font-variation-settings,normal )}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}::file-selector-button,button,input,optgroup,select,textarea{font-feature-settings:inherit;background-color:transparent;border-radius:0;color:inherit;font:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{color:color-mix(in oklab,currentColor 50%,transparent);opacity:1}::placeholder{color:color-mix(in oklab,currentColor 50%,transparent);opacity:1}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}::file-selector-button,button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.-top-2{top:calc(var(--spacing)*-2)}.top-1\\/2{top:50%}.-right-2{right:calc(var(--spacing)*-2)}.right-2{right:calc(var(--spacing)*2)}.left-1\\/2{left:50%}.z-50{z-index:50}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.my-1{margin-block:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.aspect-square{aspect-ratio:1/1}.size-2{height:calc(var(--spacing)*2);width:calc(var(--spacing)*2)}.size-3\\.5{height:calc(var(--spacing)*3.5);width:calc(var(--spacing)*3.5)}.size-4{height:calc(var(--spacing)*4);width:calc(var(--spacing)*4)}.size-9{height:calc(var(--spacing)*9);width:calc(var(--spacing)*9)}.h-4{height:calc(var(--spacing)*4)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-16{height:calc(var(--spacing)*16)}.h-\\[var\\(--radix-select-trigger-height\\)\\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-px{height:1px}.max-h-96{max-height:calc(var(--spacing)*96)}.w-4{width:calc(var(--spacing)*4)}.w-6{width:calc(var(--spacing)*6)}.w-16{width:calc(var(--spacing)*16)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\\[8rem\\]{min-width:8rem}.min-w-\\[var\\(--radix-select-trigger-width\\)\\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\\/2{--tw-translate-x:-50%}.-translate-x-1\\/2,.-translate-y-1\\/2{translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\\/2{--tw-translate-y:-50%}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.scroll-my-1{scroll-margin-block:calc(var(--spacing)*1)}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-row{flex-direction:row}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.space-y-0{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*0*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*0*var(--tw-space-y-reverse))}}.space-y-1{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*1*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*1*var(--tw-space-y-reverse))}}.space-y-2{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*2*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*2*var(--tw-space-y-reverse))}}.space-y-3{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*3*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*3*var(--tw-space-y-reverse))}}.space-y-4{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*4*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*4*var(--tw-space-y-reverse))}}.space-y-6{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*6*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*6*var(--tw-space-y-reverse))}}.space-x-2{:where(&>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*2*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*2*var(--tw-space-x-reverse))}}.space-x-3{:where(&>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*3*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*3*var(--tw-space-x-reverse))}}.overflow-hidden{overflow:hidden}.rounded-\\[4px\\]{border-radius:4px}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-gray-700{border-color:var(--color-gray-700)}.border-input{border-color:var(--input)}.border-zinc-800{border-color:var(--color-zinc-800)}.bg-background{background-color:var(--background)}.bg-black{background-color:var(--color-black)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-border{background-color:var(--border)}.bg-destructive{background-color:var(--destructive)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:transparent}.bg-zinc-700{background-color:var(--color-zinc-700)}.bg-zinc-900{background-color:var(--color-zinc-900)}.fill-primary{fill:var(--primary)}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-4{padding-block:calc(var(--spacing)*4)}.pt-4{padding-top:calc(var(--spacing)*4)}.pr-8{padding-right:calc(var(--spacing)*8)}.pl-2{padding-left:calc(var(--spacing)*2)}.text-right{text-align:right}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.whitespace-nowrap{white-space:nowrap}.text-blue-500{color:var(--color-blue-500)}.text-current{color:currentColor}.text-destructive-foreground{color:var(--destructive-foreground)}.text-gray-400{color:var(--color-gray-400)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.text-zinc-400{color:var(--color-zinc-400)}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:50%}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,rgba(0,0,0,.1)),0 2px 4px -2px var(--tw-shadow-color,rgba(0,0,0,.1))}.shadow-md,.shadow-xs{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,rgba(0,0,0,.05))}.outline-hidden{--tw-outline-style:none;outline-style:none;@media (forced-colors:active){outline:2px solid transparent;outline-offset:2px}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-\\[color\\,box-shadow\\]{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-shadow{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-none{transition-property:none}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.group-data-\\[disabled\\=true\\]\\:pointer-events-none{&:is(:where(.group)[data-disabled=true] *){pointer-events:none}}.group-data-\\[disabled\\=true\\]\\:opacity-50{&:is(:where(.group)[data-disabled=true] *){opacity:50%}}.peer-disabled\\:cursor-not-allowed{&:is(:where(.peer):disabled~*){cursor:not-allowed}}.peer-disabled\\:opacity-50{&:is(:where(.peer):disabled~*){opacity:50%}}.selection\\:bg-primary{& ::-moz-selection{background-color:var(--primary)}& ::selection{background-color:var(--primary)}&::-moz-selection{background-color:var(--primary)}&::selection{background-color:var(--primary)}}.selection\\:text-primary-foreground{& ::-moz-selection{color:var(--primary-foreground)}& ::selection{color:var(--primary-foreground)}&::-moz-selection{color:var(--primary-foreground)}&::selection{color:var(--primary-foreground)}}.file\\:inline-flex{&::file-selector-button{display:inline-flex}}.file\\:h-7{&::file-selector-button{height:calc(var(--spacing)*7)}}.file\\:border-0{&::file-selector-button{border-style:var(--tw-border-style);border-width:0}}.file\\:bg-transparent{&::file-selector-button{background-color:transparent}}.file\\:text-sm{&::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.file\\:font-medium{&::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}}.file\\:text-foreground{&::file-selector-button{color:var(--foreground)}}.placeholder\\:text-muted-foreground{&::-moz-placeholder{color:var(--muted-foreground)}&::placeholder{color:var(--muted-foreground)}}.hover\\:bg-accent{&:hover{@media (hover:hover){background-color:var(--accent)}}}.hover\\:bg-blue-700{&:hover{@media (hover:hover){background-color:var(--color-blue-700)}}}.hover\\:bg-destructive\\/90{&:hover{@media (hover:hover){background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}}.hover\\:bg-primary\\/90{&:hover{@media (hover:hover){background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}}.hover\\:bg-secondary\\/80{&:hover{@media (hover:hover){background-color:color-mix(in oklab,var(--secondary) 80%,transparent)}}}.hover\\:text-accent-foreground{&:hover{@media (hover:hover){color:var(--accent-foreground)}}}.hover\\:underline{&:hover{@media (hover:hover){text-decoration-line:underline}}}.focus\\:bg-accent{&:focus{background-color:var(--accent)}}.focus\\:text-accent-foreground{&:focus{color:var(--accent-foreground)}}.focus-visible\\:border-ring{&:focus-visible{border-color:var(--ring)}}.focus-visible\\:ring-\\[3px\\]{&:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentColor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus-visible\\:ring-destructive\\/20{&:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.focus-visible\\:ring-ring\\/50{&:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring) 50%,transparent)}}.disabled\\:pointer-events-none{&:disabled{pointer-events:none}}.disabled\\:cursor-not-allowed{&:disabled{cursor:not-allowed}}.disabled\\:opacity-50{&:disabled{opacity:50%}}.has-\\[\\>svg\\]\\:px-2\\.5{&:has(>svg){padding-inline:calc(var(--spacing)*2.5)}}.has-\\[\\>svg\\]\\:px-3{&:has(>svg){padding-inline:calc(var(--spacing)*3)}}.has-\\[\\>svg\\]\\:px-4{&:has(>svg){padding-inline:calc(var(--spacing)*4)}}.aria-invalid\\:border-destructive{&[aria-invalid=true]{border-color:var(--destructive)}}.aria-invalid\\:ring-destructive\\/20{&[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.data-\\[disabled\\]\\:pointer-events-none{&[data-disabled]{pointer-events:none}}.data-\\[disabled\\]\\:opacity-50{&[data-disabled]{opacity:50%}}.data-\\[error\\=true\\]\\:text-destructive-foreground{&[data-error=true]{color:var(--destructive-foreground)}}.data-\\[placeholder\\]\\:text-muted-foreground{&[data-placeholder]{color:var(--muted-foreground)}}.data-\\[side\\=bottom\\]\\:translate-y-1{&[data-side=bottom]{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x) var(--tw-translate-y)}}.data-\\[side\\=bottom\\]\\:slide-in-from-top-2{&[data-side=bottom]{--tw-enter-translate-y:-0.5rem}}.data-\\[side\\=left\\]\\:-translate-x-1{&[data-side=left]{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x) var(--tw-translate-y)}}.data-\\[side\\=left\\]\\:slide-in-from-right-2{&[data-side=left]{--tw-enter-translate-x:0.5rem}}.data-\\[side\\=right\\]\\:translate-x-1{&[data-side=right]{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x) var(--tw-translate-y)}}.data-\\[side\\=right\\]\\:slide-in-from-left-2{&[data-side=right]{--tw-enter-translate-x:-0.5rem}}.data-\\[side\\=top\\]\\:-translate-y-1{&[data-side=top]{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x) var(--tw-translate-y)}}.data-\\[side\\=top\\]\\:slide-in-from-bottom-2{&[data-side=top]{--tw-enter-translate-y:0.5rem}}.\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1{:is(&>*){&[data-slot=select-value]{-webkit-box-orient:vertical;-webkit-line-clamp:1;display:-webkit-box;overflow:hidden}}}.\\*\\:data-\\[slot\\=select-value\\]\\:flex{:is(&>*){&[data-slot=select-value]{display:flex}}}.\\*\\:data-\\[slot\\=select-value\\]\\:items-center{:is(&>*){&[data-slot=select-value]{align-items:center}}}.\\*\\:data-\\[slot\\=select-value\\]\\:gap-2{:is(&>*){&[data-slot=select-value]{gap:calc(var(--spacing)*2)}}}.data-\\[state\\=checked\\]\\:border-blue-600{&[data-state=checked]{border-color:var(--color-blue-600)}}.data-\\[state\\=checked\\]\\:border-primary{&[data-state=checked]{border-color:var(--primary)}}.data-\\[state\\=checked\\]\\:bg-blue-600{&[data-state=checked]{background-color:var(--color-blue-600)}}.data-\\[state\\=checked\\]\\:bg-primary{&[data-state=checked]{background-color:var(--primary)}}.data-\\[state\\=checked\\]\\:text-blue-600{&[data-state=checked]{color:var(--color-blue-600)}}.data-\\[state\\=checked\\]\\:text-primary-foreground{&[data-state=checked]{color:var(--primary-foreground)}}.data-\\[state\\=closed\\]\\:animate-out{&[data-state=closed]{--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial;animation-duration:.15s;animation-name:exit}}.data-\\[state\\=closed\\]\\:fade-out-0{&[data-state=closed]{--tw-exit-opacity:0}}.data-\\[state\\=closed\\]\\:zoom-out-95{&[data-state=closed]{--tw-exit-scale:.95}}.data-\\[state\\=open\\]\\:animate-in{&[data-state=open]{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-duration:.15s;animation-name:enter}}.data-\\[state\\=open\\]\\:fade-in-0{&[data-state=open]{--tw-enter-opacity:0}}.data-\\[state\\=open\\]\\:zoom-in-95{&[data-state=open]{--tw-enter-scale:.95}}.dark\\:focus-visible\\:ring-destructive\\/40,.md\\:grid-cols-2,.md\\:text-sm{&:is(.dark *){&:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive) 40%,transparent)}}}.dark\\:aria-invalid\\:ring-destructive\\/40{&:is(.dark *){&[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive) 40%,transparent)}}}.\\[\\&_svg\\]\\:pointer-events-none{& svg{pointer-events:none}}.\\[\\&_svg\\]\\:shrink-0{& svg{flex-shrink:0}}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4{& svg:not([class*=size-]){height:calc(var(--spacing)*4);width:calc(var(--spacing)*4)}}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'text-\\'\\]\\)\\]\\:text-muted-foreground{& svg:not([class*=text-]){color:var(--muted-foreground)}}.\\*\\:\\[span\\]\\:last\\:flex{:is(&>*){&:is(span){&:last-child{display:flex}}}}.\\*\\:\\[span\\]\\:last\\:items-center{:is(&>*){&:is(span){&:last-child{align-items:center}}}}.\\*\\:\\[span\\]\\:last\\:gap-2{:is(&>*){&:is(span){&:last-child{gap:calc(var(--spacing)*2)}}}}}:root{--background:oklch(1 0 0);--foreground:oklch(0.145 0 0);--card:oklch(1 0 0);--card-foreground:oklch(0.145 0 0);--popover:oklch(1 0 0);--popover-foreground:oklch(0.145 0 0);--primary:oklch(0.205 0 0);--primary-foreground:oklch(0.985 0 0);--secondary:oklch(0.97 0 0);--secondary-foreground:oklch(0.205 0 0);--muted:oklch(0.97 0 0);--muted-foreground:oklch(0.556 0 0);--accent:oklch(0.97 0 0);--accent-foreground:oklch(0.205 0 0);--destructive:oklch(0.577 0.245 27.325);--destructive-foreground:oklch(0.577 0.245 27.325);--border:oklch(0.922 0 0);--input:oklch(0.922 0 0);--ring:oklch(0.708 0 0);--chart-1:oklch(0.646 0.222 41.116);--chart-2:oklch(0.6 0.118 184.704);--chart-3:oklch(0.398 0.07 227.392);--chart-4:oklch(0.828 0.189 84.429);--chart-5:oklch(0.769 0.188 70.08);--radius:0.625rem;--sidebar:oklch(0.985 0 0);--sidebar-foreground:oklch(0.145 0 0);--sidebar-primary:oklch(0.205 0 0);--sidebar-primary-foreground:oklch(0.985 0 0);--sidebar-accent:oklch(0.97 0 0);--sidebar-accent-foreground:oklch(0.205 0 0);--sidebar-border:oklch(0.922 0 0);--sidebar-ring:oklch(0.708 0 0)}.dark{--background:oklch(0.145 0 0);--foreground:oklch(0.985 0 0);--card:oklch(0.145 0 0);--card-foreground:oklch(0.985 0 0);--popover:oklch(0.145 0 0);--popover-foreground:oklch(0.985 0 0);--primary:oklch(0.985 0 0);--primary-foreground:oklch(0.205 0 0);--secondary:oklch(0.269 0 0);--secondary-foreground:oklch(0.985 0 0);--muted:oklch(0.269 0 0);--muted-foreground:oklch(0.708 0 0);--accent:oklch(0.269 0 0);--accent-foreground:oklch(0.985 0 0);--destructive:oklch(0.396 0.141 25.723);--destructive-foreground:oklch(0.637 0.237 25.331);--border:oklch(0.269 0 0);--input:oklch(0.269 0 0);--ring:oklch(0.439 0 0);--chart-1:oklch(0.488 0.243 264.376);--chart-2:oklch(0.696 0.17 162.48);--chart-3:oklch(0.769 0.188 70.08);--chart-4:oklch(0.627 0.265 303.9);--chart-5:oklch(0.645 0.246 16.439);--sidebar:oklch(0.205 0 0);--sidebar-foreground:oklch(0.985 0 0);--sidebar-primary:oklch(0.488 0.243 264.376);--sidebar-primary-foreground:oklch(0.985 0 0);--sidebar-accent:oklch(0.269 0 0);--sidebar-accent-foreground:oklch(0.985 0 0);--sidebar-border:oklch(0.269 0 0);--sidebar-ring:oklch(0.439 0 0)}@layer base{*{border-color:var(--border);outline-color:color-mix(in oklab,var(--ring) 50%,transparent)}body{background-color:var(--background);color:var(--foreground)}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);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))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);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))}}@property --tw-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-y{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-z{syntax:\"*\";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:\"*\";inherits:false;initial-value:solid}";
|
|
1078
|
+
styleInject(css_248z);
|
|
1079
|
+
|
|
402
1080
|
exports.CheckoutEmbed = index$1;
|
|
403
1081
|
exports.PaymentElement = index;
|
|
404
1082
|
exports.useCart = useCart;
|