@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.mjs
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import { create } from 'zustand';
|
|
2
|
-
import
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import React__default, { useState, useEffect, memo } from 'react';
|
|
4
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
import { clsx } from 'clsx';
|
|
7
|
+
import { twMerge } from 'tailwind-merge';
|
|
8
|
+
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
|
|
9
|
+
import { CheckIcon, ChevronDownIcon, ChevronUpIcon, ChevronLeft, CircleIcon } from 'lucide-react';
|
|
10
|
+
import { FormProvider, Controller, useFormContext, useFormState, appendErrors, useForm } from 'react-hook-form';
|
|
11
|
+
import * as LabelPrimitive from '@radix-ui/react-label';
|
|
12
|
+
import * as SelectPrimitive from '@radix-ui/react-select';
|
|
13
|
+
import { validateFieldsNatively, toNestErrors } from '@hookform/resolvers';
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
|
|
3
16
|
import { useStripe, useElements, PaymentElement as PaymentElement$1, Elements } from '@stripe/react-stripe-js';
|
|
4
17
|
import { loadStripe } from '@stripe/stripe-js';
|
|
5
18
|
|
|
@@ -256,6 +269,18 @@ PERFORMANCE OF THIS SOFTWARE.
|
|
|
256
269
|
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
257
270
|
|
|
258
271
|
|
|
272
|
+
function __rest(s, e) {
|
|
273
|
+
var t = {};
|
|
274
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
275
|
+
t[p] = s[p];
|
|
276
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
277
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
278
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
279
|
+
t[p[i]] = s[p[i]];
|
|
280
|
+
}
|
|
281
|
+
return t;
|
|
282
|
+
}
|
|
283
|
+
|
|
259
284
|
function __awaiter(thisArg, _arguments, P, generator) {
|
|
260
285
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
261
286
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -271,6 +296,608 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
|
|
|
271
296
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
272
297
|
};
|
|
273
298
|
|
|
299
|
+
// packages/react/compose-refs/src/composeRefs.tsx
|
|
300
|
+
function setRef(ref, value) {
|
|
301
|
+
if (typeof ref === "function") {
|
|
302
|
+
return ref(value);
|
|
303
|
+
} else if (ref !== null && ref !== void 0) {
|
|
304
|
+
ref.current = value;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
function composeRefs(...refs) {
|
|
308
|
+
return (node) => {
|
|
309
|
+
let hasCleanup = false;
|
|
310
|
+
const cleanups = refs.map((ref) => {
|
|
311
|
+
const cleanup = setRef(ref, node);
|
|
312
|
+
if (!hasCleanup && typeof cleanup == "function") {
|
|
313
|
+
hasCleanup = true;
|
|
314
|
+
}
|
|
315
|
+
return cleanup;
|
|
316
|
+
});
|
|
317
|
+
if (hasCleanup) {
|
|
318
|
+
return () => {
|
|
319
|
+
for (let i = 0; i < cleanups.length; i++) {
|
|
320
|
+
const cleanup = cleanups[i];
|
|
321
|
+
if (typeof cleanup == "function") {
|
|
322
|
+
cleanup();
|
|
323
|
+
} else {
|
|
324
|
+
setRef(refs[i], null);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// packages/react/slot/src/slot.tsx
|
|
333
|
+
var Slot = React.forwardRef((props, forwardedRef) => {
|
|
334
|
+
const { children, ...slotProps } = props;
|
|
335
|
+
const childrenArray = React.Children.toArray(children);
|
|
336
|
+
const slottable = childrenArray.find(isSlottable);
|
|
337
|
+
if (slottable) {
|
|
338
|
+
const newElement = slottable.props.children;
|
|
339
|
+
const newChildren = childrenArray.map((child) => {
|
|
340
|
+
if (child === slottable) {
|
|
341
|
+
if (React.Children.count(newElement) > 1) return React.Children.only(null);
|
|
342
|
+
return React.isValidElement(newElement) ? newElement.props.children : null;
|
|
343
|
+
} else {
|
|
344
|
+
return child;
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children: React.isValidElement(newElement) ? React.cloneElement(newElement, void 0, newChildren) : null });
|
|
348
|
+
}
|
|
349
|
+
return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children });
|
|
350
|
+
});
|
|
351
|
+
Slot.displayName = "Slot";
|
|
352
|
+
var SlotClone = React.forwardRef((props, forwardedRef) => {
|
|
353
|
+
const { children, ...slotProps } = props;
|
|
354
|
+
if (React.isValidElement(children)) {
|
|
355
|
+
const childrenRef = getElementRef(children);
|
|
356
|
+
const props2 = mergeProps(slotProps, children.props);
|
|
357
|
+
if (children.type !== React.Fragment) {
|
|
358
|
+
props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;
|
|
359
|
+
}
|
|
360
|
+
return React.cloneElement(children, props2);
|
|
361
|
+
}
|
|
362
|
+
return React.Children.count(children) > 1 ? React.Children.only(null) : null;
|
|
363
|
+
});
|
|
364
|
+
SlotClone.displayName = "SlotClone";
|
|
365
|
+
var Slottable = ({ children }) => {
|
|
366
|
+
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
367
|
+
};
|
|
368
|
+
function isSlottable(child) {
|
|
369
|
+
return React.isValidElement(child) && child.type === Slottable;
|
|
370
|
+
}
|
|
371
|
+
function mergeProps(slotProps, childProps) {
|
|
372
|
+
const overrideProps = { ...childProps };
|
|
373
|
+
for (const propName in childProps) {
|
|
374
|
+
const slotPropValue = slotProps[propName];
|
|
375
|
+
const childPropValue = childProps[propName];
|
|
376
|
+
const isHandler = /^on[A-Z]/.test(propName);
|
|
377
|
+
if (isHandler) {
|
|
378
|
+
if (slotPropValue && childPropValue) {
|
|
379
|
+
overrideProps[propName] = (...args) => {
|
|
380
|
+
childPropValue(...args);
|
|
381
|
+
slotPropValue(...args);
|
|
382
|
+
};
|
|
383
|
+
} else if (slotPropValue) {
|
|
384
|
+
overrideProps[propName] = slotPropValue;
|
|
385
|
+
}
|
|
386
|
+
} else if (propName === "style") {
|
|
387
|
+
overrideProps[propName] = { ...slotPropValue, ...childPropValue };
|
|
388
|
+
} else if (propName === "className") {
|
|
389
|
+
overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(" ");
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return { ...slotProps, ...overrideProps };
|
|
393
|
+
}
|
|
394
|
+
function getElementRef(element) {
|
|
395
|
+
let getter = Object.getOwnPropertyDescriptor(element.props, "ref")?.get;
|
|
396
|
+
let mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
|
|
397
|
+
if (mayWarn) {
|
|
398
|
+
return element.ref;
|
|
399
|
+
}
|
|
400
|
+
getter = Object.getOwnPropertyDescriptor(element, "ref")?.get;
|
|
401
|
+
mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
|
|
402
|
+
if (mayWarn) {
|
|
403
|
+
return element.props.ref;
|
|
404
|
+
}
|
|
405
|
+
return element.props.ref || element.ref;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
function cn(...inputs) {
|
|
409
|
+
return twMerge(clsx(inputs));
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
const buttonVariants = 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", {
|
|
413
|
+
variants: {
|
|
414
|
+
variant: {
|
|
415
|
+
default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
|
|
416
|
+
destructive: "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",
|
|
417
|
+
outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground",
|
|
418
|
+
secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
|
|
419
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
420
|
+
link: "text-primary underline-offset-4 hover:underline",
|
|
421
|
+
},
|
|
422
|
+
size: {
|
|
423
|
+
default: "h-9 px-4 py-2 has-[>svg]:px-3",
|
|
424
|
+
sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
|
|
425
|
+
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
|
|
426
|
+
icon: "size-9",
|
|
427
|
+
},
|
|
428
|
+
},
|
|
429
|
+
defaultVariants: {
|
|
430
|
+
variant: "default",
|
|
431
|
+
size: "default",
|
|
432
|
+
},
|
|
433
|
+
});
|
|
434
|
+
function Button(_a) {
|
|
435
|
+
var { className, variant, size, asChild = false } = _a, props = __rest(_a, ["className", "variant", "size", "asChild"]);
|
|
436
|
+
const Comp = asChild ? Slot : "button";
|
|
437
|
+
return (React.createElement(Comp, Object.assign({ "data-slot": "button", className: cn(buttonVariants({ variant, size, className })) }, props)));
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
function Checkbox(_a) {
|
|
441
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
442
|
+
return (React.createElement(CheckboxPrimitive.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),
|
|
443
|
+
React.createElement(CheckboxPrimitive.Indicator, { "data-slot": "checkbox-indicator", className: "flex items-center justify-center text-current transition-none" },
|
|
444
|
+
React.createElement(CheckIcon, { className: "size-3.5" }))));
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
function Label(_a) {
|
|
448
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
449
|
+
return (React.createElement(LabelPrimitive.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)));
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
const Form = FormProvider;
|
|
453
|
+
const FormFieldContext = React.createContext({});
|
|
454
|
+
const FormField = (_a) => {
|
|
455
|
+
var props = __rest(_a, []);
|
|
456
|
+
return (React.createElement(FormFieldContext.Provider, { value: { name: props.name } },
|
|
457
|
+
React.createElement(Controller, Object.assign({}, props))));
|
|
458
|
+
};
|
|
459
|
+
const useFormField = () => {
|
|
460
|
+
const fieldContext = React.useContext(FormFieldContext);
|
|
461
|
+
const itemContext = React.useContext(FormItemContext);
|
|
462
|
+
const { getFieldState } = useFormContext();
|
|
463
|
+
const formState = useFormState({ name: fieldContext.name });
|
|
464
|
+
const fieldState = getFieldState(fieldContext.name, formState);
|
|
465
|
+
if (!fieldContext) {
|
|
466
|
+
throw new Error("useFormField should be used within <FormField>");
|
|
467
|
+
}
|
|
468
|
+
const { id } = itemContext;
|
|
469
|
+
return Object.assign({ id, name: fieldContext.name, formItemId: `${id}-form-item`, formDescriptionId: `${id}-form-item-description`, formMessageId: `${id}-form-item-message` }, fieldState);
|
|
470
|
+
};
|
|
471
|
+
const FormItemContext = React.createContext({});
|
|
472
|
+
function FormItem(_a) {
|
|
473
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
474
|
+
const id = React.useId();
|
|
475
|
+
return (React.createElement(FormItemContext.Provider, { value: { id } },
|
|
476
|
+
React.createElement("div", Object.assign({ "data-slot": "form-item", className: cn("grid gap-2", className) }, props))));
|
|
477
|
+
}
|
|
478
|
+
function FormLabel(_a) {
|
|
479
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
480
|
+
const { error, formItemId } = useFormField();
|
|
481
|
+
return (React.createElement(Label, Object.assign({ "data-slot": "form-label", "data-error": !!error, className: cn("data-[error=true]:text-destructive-foreground", className), htmlFor: formItemId }, props)));
|
|
482
|
+
}
|
|
483
|
+
function FormControl(_a) {
|
|
484
|
+
var props = __rest(_a, []);
|
|
485
|
+
const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
|
|
486
|
+
return (React.createElement(Slot, Object.assign({ "data-slot": "form-control", id: formItemId, "aria-describedby": !error
|
|
487
|
+
? `${formDescriptionId}`
|
|
488
|
+
: `${formDescriptionId} ${formMessageId}`, "aria-invalid": !!error }, props)));
|
|
489
|
+
}
|
|
490
|
+
function FormMessage(_a) {
|
|
491
|
+
var _b;
|
|
492
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
493
|
+
const { error, formMessageId } = useFormField();
|
|
494
|
+
const body = error ? String((_b = error === null || error === void 0 ? void 0 : error.message) !== null && _b !== void 0 ? _b : "") : props.children;
|
|
495
|
+
if (!body) {
|
|
496
|
+
return null;
|
|
497
|
+
}
|
|
498
|
+
return (React.createElement("p", Object.assign({ "data-slot": "form-message", id: formMessageId, className: cn("text-destructive-foreground text-sm", className) }, props), body));
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
function Input(_a) {
|
|
502
|
+
var { className, type } = _a, props = __rest(_a, ["className", "type"]);
|
|
503
|
+
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-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)));
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
function Select(_a) {
|
|
507
|
+
var props = __rest(_a, []);
|
|
508
|
+
return React.createElement(SelectPrimitive.Root, Object.assign({ "data-slot": "select" }, props));
|
|
509
|
+
}
|
|
510
|
+
function SelectValue(_a) {
|
|
511
|
+
var props = __rest(_a, []);
|
|
512
|
+
return React.createElement(SelectPrimitive.Value, Object.assign({ "data-slot": "select-value" }, props));
|
|
513
|
+
}
|
|
514
|
+
function SelectTrigger(_a) {
|
|
515
|
+
var { className, children } = _a, props = __rest(_a, ["className", "children"]);
|
|
516
|
+
return (React.createElement(SelectPrimitive.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),
|
|
517
|
+
children,
|
|
518
|
+
React.createElement(SelectPrimitive.Icon, { asChild: true },
|
|
519
|
+
React.createElement(ChevronDownIcon, { className: "size-4 opacity-50" }))));
|
|
520
|
+
}
|
|
521
|
+
function SelectContent(_a) {
|
|
522
|
+
var { className, children, position = "popper" } = _a, props = __rest(_a, ["className", "children", "position"]);
|
|
523
|
+
return (React.createElement(SelectPrimitive.Portal, null,
|
|
524
|
+
React.createElement(SelectPrimitive.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" &&
|
|
525
|
+
"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),
|
|
526
|
+
React.createElement(SelectScrollUpButton, null),
|
|
527
|
+
React.createElement(SelectPrimitive.Viewport, { className: cn("p-1", position === "popper" &&
|
|
528
|
+
"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1") }, children),
|
|
529
|
+
React.createElement(SelectScrollDownButton, null))));
|
|
530
|
+
}
|
|
531
|
+
function SelectItem(_a) {
|
|
532
|
+
var { className, children } = _a, props = __rest(_a, ["className", "children"]);
|
|
533
|
+
return (React.createElement(SelectPrimitive.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),
|
|
534
|
+
React.createElement("span", { className: "absolute right-2 flex size-3.5 items-center justify-center" },
|
|
535
|
+
React.createElement(SelectPrimitive.ItemIndicator, null,
|
|
536
|
+
React.createElement(CheckIcon, { className: "size-4" }))),
|
|
537
|
+
React.createElement(SelectPrimitive.ItemText, null, children)));
|
|
538
|
+
}
|
|
539
|
+
function SelectScrollUpButton(_a) {
|
|
540
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
541
|
+
return (React.createElement(SelectPrimitive.ScrollUpButton, Object.assign({ "data-slot": "select-scroll-up-button", className: cn("flex cursor-default items-center justify-center py-1", className) }, props),
|
|
542
|
+
React.createElement(ChevronUpIcon, { className: "size-4" })));
|
|
543
|
+
}
|
|
544
|
+
function SelectScrollDownButton(_a) {
|
|
545
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
546
|
+
return (React.createElement(SelectPrimitive.ScrollDownButton, Object.assign({ "data-slot": "select-scroll-down-button", className: cn("flex cursor-default items-center justify-center py-1", className) }, props),
|
|
547
|
+
React.createElement(ChevronDownIcon, { className: "size-4" })));
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
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]=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&&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:toNestErrors(n(r.errors,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)};throw r}))}catch(r){return Promise.reject(r)}}}
|
|
551
|
+
|
|
552
|
+
// Shipping address schema
|
|
553
|
+
const customerSchema = z.object({
|
|
554
|
+
email: z.string().email("Please enter a valid email address"),
|
|
555
|
+
marketingConsent: z.boolean().optional(),
|
|
556
|
+
firstName: z.string().optional(),
|
|
557
|
+
lastName: z.string().min(1, "Last name is required"),
|
|
558
|
+
address: z.string().min(1, "Address is required"),
|
|
559
|
+
apartment: z.string().optional(),
|
|
560
|
+
city: z.string().min(1, "City is required"),
|
|
561
|
+
state: z.string().min(1, "State is required"),
|
|
562
|
+
zipCode: z.string().min(5, "ZIP code is required"),
|
|
563
|
+
country: z.string().min(1, "Country is required"),
|
|
564
|
+
saveInfo: z.boolean().optional(),
|
|
565
|
+
});
|
|
566
|
+
// Shipping method schema
|
|
567
|
+
const shippingMethodSchema = z.object({
|
|
568
|
+
method: z.enum(["economy", "standard"]),
|
|
569
|
+
});
|
|
570
|
+
// Payment method schema
|
|
571
|
+
const paymentMethodSchema = z.object({
|
|
572
|
+
cardNumber: z.string().min(1, "Card number is required"),
|
|
573
|
+
expiryDate: z.string().min(1, "Expiry date is required"),
|
|
574
|
+
cvv: z.string().min(1, "CVV is required"),
|
|
575
|
+
nameOnCard: z.string().min(1, "Name is required"),
|
|
576
|
+
});
|
|
577
|
+
// Combined checkout schema
|
|
578
|
+
z.object({
|
|
579
|
+
customer: customerSchema,
|
|
580
|
+
shipping: shippingMethodSchema,
|
|
581
|
+
payment: paymentMethodSchema,
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
function CustomerForm({ initialData, onSubmit, onBack, }) {
|
|
585
|
+
const form = useForm({
|
|
586
|
+
resolver: s(customerSchema),
|
|
587
|
+
defaultValues: initialData || {
|
|
588
|
+
email: "",
|
|
589
|
+
marketingConsent: false,
|
|
590
|
+
firstName: "",
|
|
591
|
+
lastName: "",
|
|
592
|
+
apartment: "",
|
|
593
|
+
city: "",
|
|
594
|
+
state: "",
|
|
595
|
+
zipCode: "",
|
|
596
|
+
country: "United States",
|
|
597
|
+
saveInfo: false,
|
|
598
|
+
},
|
|
599
|
+
});
|
|
600
|
+
return (React__default.createElement("div", { className: "space-y-6" },
|
|
601
|
+
React__default.createElement("div", { className: "space-y-2" },
|
|
602
|
+
React__default.createElement("div", { className: "flex items-center justify-between" },
|
|
603
|
+
React__default.createElement("h2", { className: "text-2xl font-bold text-white" }, "Contact")),
|
|
604
|
+
React__default.createElement(FormField, { control: form.control, name: "email", render: ({ field }) => (React__default.createElement(FormItem, null,
|
|
605
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "Email or mobile phone number"),
|
|
606
|
+
React__default.createElement(FormControl, null,
|
|
607
|
+
React__default.createElement(Input, Object.assign({ placeholder: "email@example.com", className: "bg-black border-gray-700 text-white" }, field))),
|
|
608
|
+
React__default.createElement(FormMessage, null))) }),
|
|
609
|
+
React__default.createElement(FormField, { control: form.control, name: "marketingConsent", render: ({ field }) => (React__default.createElement(FormItem, { className: "flex flex-row items-start space-x-2 space-y-0" },
|
|
610
|
+
React__default.createElement(FormControl, null,
|
|
611
|
+
React__default.createElement(Checkbox, { checked: field.value, onCheckedChange: field.onChange, className: "data-[state=checked]:bg-blue-600" })),
|
|
612
|
+
React__default.createElement(FormLabel, { className: "text-sm font-normal text-gray-400" }, "Email me with news and offers"))) }),
|
|
613
|
+
React__default.createElement("div", { className: "flex items-center justify-between" },
|
|
614
|
+
React__default.createElement("h2", { className: "text-2xl font-bold text-white" }, "Shipping customer")),
|
|
615
|
+
React__default.createElement("div", { className: "flex items-center justify-between text-sm" },
|
|
616
|
+
React__default.createElement("div", { className: "text-white" },
|
|
617
|
+
React__default.createElement("span", null, "Contact"),
|
|
618
|
+
React__default.createElement("span", { className: "ml-2 text-gray-400" }, "contactemail")),
|
|
619
|
+
React__default.createElement(Button, { variant: "link", className: "text-blue-500 p-0 h-auto", onClick: onBack }, "Change"))),
|
|
620
|
+
React__default.createElement(Form, Object.assign({}, form),
|
|
621
|
+
React__default.createElement("form", { onSubmit: form.handleSubmit(onSubmit), className: "space-y-4" },
|
|
622
|
+
React__default.createElement(FormField, { control: form.control, name: "country", render: ({ field }) => (React__default.createElement(FormItem, null,
|
|
623
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "Country/Region"),
|
|
624
|
+
React__default.createElement(Select, { onValueChange: field.onChange, defaultValue: field.value },
|
|
625
|
+
React__default.createElement(FormControl, null,
|
|
626
|
+
React__default.createElement(SelectTrigger, { className: "bg-black border-gray-700 text-white" },
|
|
627
|
+
React__default.createElement(SelectValue, { placeholder: "Select a country" }))),
|
|
628
|
+
React__default.createElement(SelectContent, { className: "bg-gray-900 text-white border-gray-700" },
|
|
629
|
+
React__default.createElement(SelectItem, { value: "United States" }, "United States"),
|
|
630
|
+
React__default.createElement(SelectItem, { value: "Canada" }, "Canada"),
|
|
631
|
+
React__default.createElement(SelectItem, { value: "United Kingdom" }, "United Kingdom"))),
|
|
632
|
+
React__default.createElement(FormMessage, null))) }),
|
|
633
|
+
React__default.createElement("div", { className: "grid grid-cols-2 gap-4" },
|
|
634
|
+
React__default.createElement(FormField, { control: form.control, name: "firstName", render: ({ field }) => (React__default.createElement(FormItem, null,
|
|
635
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "First name (optional)"),
|
|
636
|
+
React__default.createElement(FormControl, null,
|
|
637
|
+
React__default.createElement(Input, Object.assign({ className: "bg-black border-gray-700 text-white" }, field))),
|
|
638
|
+
React__default.createElement(FormMessage, null))) }),
|
|
639
|
+
React__default.createElement(FormField, { control: form.control, name: "lastName", render: ({ field }) => (React__default.createElement(FormItem, null,
|
|
640
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "Last name"),
|
|
641
|
+
React__default.createElement(FormControl, null,
|
|
642
|
+
React__default.createElement(Input, Object.assign({ className: "bg-black border-gray-700 text-white" }, field))),
|
|
643
|
+
React__default.createElement(FormMessage, null))) })),
|
|
644
|
+
React__default.createElement(FormField, { control: form.control, name: "apartment", render: ({ field }) => (React__default.createElement(FormItem, null,
|
|
645
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "Apartment, suite, etc. (optional)"),
|
|
646
|
+
React__default.createElement(FormControl, null,
|
|
647
|
+
React__default.createElement(Input, Object.assign({ className: "bg-black border-gray-700 text-white" }, field))),
|
|
648
|
+
React__default.createElement(FormMessage, null))) }),
|
|
649
|
+
React__default.createElement("div", { className: "grid grid-cols-3 gap-4" },
|
|
650
|
+
React__default.createElement(FormField, { control: form.control, name: "city", render: ({ field }) => (React__default.createElement(FormItem, null,
|
|
651
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "City"),
|
|
652
|
+
React__default.createElement(FormControl, null,
|
|
653
|
+
React__default.createElement(Input, Object.assign({ className: "bg-black border-gray-700 text-white" }, field))),
|
|
654
|
+
React__default.createElement(FormMessage, null))) }),
|
|
655
|
+
React__default.createElement(FormField, { control: form.control, name: "state", render: ({ field }) => (React__default.createElement(FormItem, null,
|
|
656
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "State"),
|
|
657
|
+
React__default.createElement(Select, { onValueChange: field.onChange, defaultValue: field.value },
|
|
658
|
+
React__default.createElement(FormControl, null,
|
|
659
|
+
React__default.createElement(SelectTrigger, { className: "bg-black border-gray-700 text-white" },
|
|
660
|
+
React__default.createElement(SelectValue, { placeholder: "State" }))),
|
|
661
|
+
React__default.createElement(SelectContent, { className: "bg-gray-900 text-white border-gray-700" },
|
|
662
|
+
React__default.createElement(SelectItem, { value: "Illinois" }, "Illinois"),
|
|
663
|
+
React__default.createElement(SelectItem, { value: "California" }, "California"),
|
|
664
|
+
React__default.createElement(SelectItem, { value: "New York" }, "New York"),
|
|
665
|
+
React__default.createElement(SelectItem, { value: "Texas" }, "Texas"))),
|
|
666
|
+
React__default.createElement(FormMessage, null))) }),
|
|
667
|
+
React__default.createElement(FormField, { control: form.control, name: "zipCode", render: ({ field }) => (React__default.createElement(FormItem, null,
|
|
668
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "ZIP code"),
|
|
669
|
+
React__default.createElement(FormControl, null,
|
|
670
|
+
React__default.createElement(Input, Object.assign({ className: "bg-black border-gray-700 text-white" }, field))),
|
|
671
|
+
React__default.createElement(FormMessage, null))) })),
|
|
672
|
+
React__default.createElement(FormField, { control: form.control, name: "saveInfo", render: ({ field }) => (React__default.createElement(FormItem, { className: "flex flex-row items-start space-x-2 space-y-0" },
|
|
673
|
+
React__default.createElement(FormControl, null,
|
|
674
|
+
React__default.createElement(Checkbox, { checked: field.value, onCheckedChange: field.onChange, className: "data-[state=checked]:bg-blue-600" })),
|
|
675
|
+
React__default.createElement(FormLabel, { className: "text-sm font-normal text-gray-400" }, "Save this information for next time"))) }),
|
|
676
|
+
React__default.createElement("div", { className: "flex justify-between items-center pt-4" },
|
|
677
|
+
React__default.createElement(Button, { type: "button", variant: "link", className: "text-blue-500 p-0 h-auto flex items-center gap-1", onClick: onBack },
|
|
678
|
+
React__default.createElement(ChevronLeft, { className: "h-4 w-4" }),
|
|
679
|
+
"Return to information"),
|
|
680
|
+
React__default.createElement(Button, { type: "submit", className: "bg-blue-600 hover:bg-blue-700 text-white" }, "Continue to shipping"))))));
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
function PaymentForm({ initialData, onSubmit, onBack, contactEmail, shippingAddress, shippingMethod, shippingPrice, }) {
|
|
684
|
+
const form = useForm({
|
|
685
|
+
resolver: s(paymentMethodSchema),
|
|
686
|
+
defaultValues: initialData || {
|
|
687
|
+
cardNumber: "",
|
|
688
|
+
expiryDate: "",
|
|
689
|
+
cvv: "",
|
|
690
|
+
nameOnCard: "",
|
|
691
|
+
},
|
|
692
|
+
});
|
|
693
|
+
return (React__default.createElement("div", { className: "space-y-6" },
|
|
694
|
+
React__default.createElement("div", { className: "space-y-2" },
|
|
695
|
+
React__default.createElement("div", { className: "flex items-center justify-between" },
|
|
696
|
+
React__default.createElement("h2", { className: "text-2xl font-bold text-white" }, "Payment"),
|
|
697
|
+
React__default.createElement("p", { className: "text-sm text-gray-400" }, "All transactions are secure and encrypted.")),
|
|
698
|
+
React__default.createElement("div", { className: "flex items-center justify-between text-sm" },
|
|
699
|
+
React__default.createElement("div", { className: "text-white" },
|
|
700
|
+
React__default.createElement("span", null, "Contact"),
|
|
701
|
+
React__default.createElement("span", { className: "ml-2 text-gray-400" }, contactEmail)),
|
|
702
|
+
React__default.createElement(Button, { variant: "link", className: "text-blue-500 p-0 h-auto", onClick: onBack }, "Change")),
|
|
703
|
+
React__default.createElement("div", { className: "flex items-center justify-between text-sm" },
|
|
704
|
+
React__default.createElement("div", { className: "text-white" },
|
|
705
|
+
React__default.createElement("span", null, "Ship to"),
|
|
706
|
+
React__default.createElement("span", { className: "ml-2 text-gray-400" }, shippingAddress)),
|
|
707
|
+
React__default.createElement(Button, { variant: "link", className: "text-blue-500 p-0 h-auto", onClick: onBack }, "Change")),
|
|
708
|
+
React__default.createElement("div", { className: "flex items-center justify-between text-sm" },
|
|
709
|
+
React__default.createElement("div", { className: "text-white" },
|
|
710
|
+
React__default.createElement("span", null, "Shipping method"),
|
|
711
|
+
React__default.createElement("span", { className: "ml-2 text-gray-400" },
|
|
712
|
+
shippingMethod,
|
|
713
|
+
" \u00B7 ",
|
|
714
|
+
shippingPrice)),
|
|
715
|
+
React__default.createElement(Button, { variant: "link", className: "text-blue-500 p-0 h-auto", onClick: onBack }, "Change"))),
|
|
716
|
+
React__default.createElement("div", { className: "space-y-4 bg-gray-900 p-4 rounded-md" },
|
|
717
|
+
React__default.createElement("div", { className: "text-white font-medium" }, "Payment method"),
|
|
718
|
+
React__default.createElement(Form, Object.assign({}, form),
|
|
719
|
+
React__default.createElement("form", { onSubmit: form.handleSubmit(onSubmit), className: "space-y-4" },
|
|
720
|
+
React__default.createElement(FormField, { control: form.control, name: "cardNumber", render: ({ field }) => (React__default.createElement(FormItem, null,
|
|
721
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "Card number"),
|
|
722
|
+
React__default.createElement(FormControl, null,
|
|
723
|
+
React__default.createElement(Input, Object.assign({ placeholder: "1234 5678 9012 3456", className: "bg-black border-gray-700 text-white" }, field))),
|
|
724
|
+
React__default.createElement(FormMessage, null))) }),
|
|
725
|
+
React__default.createElement("div", { className: "grid grid-cols-2 gap-4" },
|
|
726
|
+
React__default.createElement(FormField, { control: form.control, name: "expiryDate", render: ({ field }) => (React__default.createElement(FormItem, null,
|
|
727
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "Expiration date (MM/YY)"),
|
|
728
|
+
React__default.createElement(FormControl, null,
|
|
729
|
+
React__default.createElement(Input, Object.assign({ placeholder: "MM/YY", className: "bg-black border-gray-700 text-white" }, field))),
|
|
730
|
+
React__default.createElement(FormMessage, null))) }),
|
|
731
|
+
React__default.createElement(FormField, { control: form.control, name: "cvv", render: ({ field }) => (React__default.createElement(FormItem, null,
|
|
732
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "Security code"),
|
|
733
|
+
React__default.createElement(FormControl, null,
|
|
734
|
+
React__default.createElement(Input, Object.assign({ placeholder: "CVV", className: "bg-black border-gray-700 text-white" }, field))),
|
|
735
|
+
React__default.createElement(FormMessage, null))) })),
|
|
736
|
+
React__default.createElement(FormField, { control: form.control, name: "nameOnCard", render: ({ field }) => (React__default.createElement(FormItem, null,
|
|
737
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "Name on card"),
|
|
738
|
+
React__default.createElement(FormControl, null,
|
|
739
|
+
React__default.createElement(Input, Object.assign({ placeholder: "Name as it appears on card", className: "bg-black border-gray-700 text-white" }, field))),
|
|
740
|
+
React__default.createElement(FormMessage, null))) }),
|
|
741
|
+
React__default.createElement("div", { className: "flex justify-between items-center pt-4" },
|
|
742
|
+
React__default.createElement(Button, { type: "button", variant: "link", className: "text-blue-500 p-0 h-auto flex items-center gap-1", onClick: onBack },
|
|
743
|
+
React__default.createElement(ChevronLeft, { className: "h-4 w-4" }),
|
|
744
|
+
"Return to shipping"),
|
|
745
|
+
React__default.createElement(Button, { type: "submit", className: "bg-blue-600 hover:bg-blue-700 text-white" }, "Pay now")))))));
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
function RadioGroup(_a) {
|
|
749
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
750
|
+
return (React.createElement(RadioGroupPrimitive.Root, Object.assign({ "data-slot": "radio-group", className: cn("grid gap-3", className) }, props)));
|
|
751
|
+
}
|
|
752
|
+
function RadioGroupItem(_a) {
|
|
753
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
754
|
+
return (React.createElement(RadioGroupPrimitive.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),
|
|
755
|
+
React.createElement(RadioGroupPrimitive.Indicator, { "data-slot": "radio-group-indicator", className: "relative flex items-center justify-center" },
|
|
756
|
+
React.createElement(CircleIcon, { className: "fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2" }))));
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
function ShippingMethodForm({ initialData, onSubmit, onBack, contactEmail, shippingAddress, }) {
|
|
760
|
+
const form = useForm({
|
|
761
|
+
resolver: s(shippingMethodSchema),
|
|
762
|
+
defaultValues: initialData || {
|
|
763
|
+
method: "economy",
|
|
764
|
+
},
|
|
765
|
+
});
|
|
766
|
+
return (React__default.createElement("div", { className: "space-y-6" },
|
|
767
|
+
React__default.createElement("div", { className: "space-y-2" },
|
|
768
|
+
React__default.createElement("div", { className: "flex items-center justify-between" },
|
|
769
|
+
React__default.createElement("h2", { className: "text-2xl font-bold text-white" }, "Shipping method")),
|
|
770
|
+
React__default.createElement("div", { className: "flex items-center justify-between text-sm" },
|
|
771
|
+
React__default.createElement("div", { className: "text-white" },
|
|
772
|
+
React__default.createElement("span", null, "Contact"),
|
|
773
|
+
React__default.createElement("span", { className: "ml-2 text-gray-400" }, contactEmail)),
|
|
774
|
+
React__default.createElement(Button, { variant: "link", className: "text-blue-500 p-0 h-auto", onClick: onBack }, "Change")),
|
|
775
|
+
React__default.createElement("div", { className: "flex items-center justify-between text-sm" },
|
|
776
|
+
React__default.createElement("div", { className: "text-white" },
|
|
777
|
+
React__default.createElement("span", null, "Ship to"),
|
|
778
|
+
React__default.createElement("span", { className: "ml-2 text-gray-400" }, shippingAddress)),
|
|
779
|
+
React__default.createElement(Button, { variant: "link", className: "text-blue-500 p-0 h-auto", onClick: onBack }, "Change"))),
|
|
780
|
+
React__default.createElement(Form, Object.assign({}, form),
|
|
781
|
+
React__default.createElement("form", { onSubmit: form.handleSubmit(onSubmit), className: "space-y-4" },
|
|
782
|
+
React__default.createElement(FormField, { control: form.control, name: "method", render: ({ field }) => (React__default.createElement(FormItem, null,
|
|
783
|
+
React__default.createElement(FormControl, null,
|
|
784
|
+
React__default.createElement(RadioGroup, { onValueChange: field.onChange, defaultValue: field.value, className: "space-y-3" },
|
|
785
|
+
React__default.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" },
|
|
786
|
+
React__default.createElement("div", { className: "flex items-center space-x-3" },
|
|
787
|
+
React__default.createElement(FormControl, null,
|
|
788
|
+
React__default.createElement(RadioGroupItem, { value: "economy", className: "data-[state=checked]:border-blue-600 data-[state=checked]:text-blue-600" })),
|
|
789
|
+
React__default.createElement("div", { className: "space-y-1" },
|
|
790
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "Economy"),
|
|
791
|
+
React__default.createElement("div", { className: "text-sm text-gray-400" }, "5 to 8 business days"))),
|
|
792
|
+
React__default.createElement("div", { className: "text-white font-medium" }, "$4.90")),
|
|
793
|
+
React__default.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" },
|
|
794
|
+
React__default.createElement("div", { className: "flex items-center space-x-3" },
|
|
795
|
+
React__default.createElement(FormControl, null,
|
|
796
|
+
React__default.createElement(RadioGroupItem, { value: "standard", className: "data-[state=checked]:border-blue-600 data-[state=checked]:text-blue-600" })),
|
|
797
|
+
React__default.createElement("div", { className: "space-y-1" },
|
|
798
|
+
React__default.createElement(FormLabel, { className: "text-white" }, "Standard"),
|
|
799
|
+
React__default.createElement("div", { className: "text-sm text-gray-400" }, "3 to 4 business days"))),
|
|
800
|
+
React__default.createElement("div", { className: "text-white font-medium" }, "$6.90")))),
|
|
801
|
+
React__default.createElement(FormMessage, null))) }),
|
|
802
|
+
React__default.createElement("div", { className: "flex justify-between items-center pt-4" },
|
|
803
|
+
React__default.createElement(Button, { type: "button", variant: "link", className: "text-blue-500 p-0 h-auto flex items-center gap-1", onClick: onBack },
|
|
804
|
+
React__default.createElement(ChevronLeft, { className: "h-4 w-4" }),
|
|
805
|
+
"Return to information"),
|
|
806
|
+
React__default.createElement(Button, { type: "submit", className: "bg-blue-600 hover:bg-blue-700 text-white" }, "Continue to payment"))))));
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
function useLocalStorage(key, initialValue) {
|
|
810
|
+
// Create state to store our value
|
|
811
|
+
const [storedValue, setStoredValue] = useState(initialValue);
|
|
812
|
+
// Initialize state on client-side only
|
|
813
|
+
useEffect(() => {
|
|
814
|
+
try {
|
|
815
|
+
// Get from local storage by key
|
|
816
|
+
const item = window.localStorage.getItem(key);
|
|
817
|
+
// Parse stored json or if none return initialValue
|
|
818
|
+
setStoredValue(item ? JSON.parse(item) : initialValue);
|
|
819
|
+
}
|
|
820
|
+
catch (error) {
|
|
821
|
+
// If error, just use the initialValue
|
|
822
|
+
console.error(error);
|
|
823
|
+
setStoredValue(initialValue);
|
|
824
|
+
}
|
|
825
|
+
}, [initialValue, key]);
|
|
826
|
+
// Return a wrapped version of useState's setter function that
|
|
827
|
+
// persists the new value to localStorage.
|
|
828
|
+
const setValue = (value) => {
|
|
829
|
+
try {
|
|
830
|
+
// Allow value to be a function so we have the same API as useState
|
|
831
|
+
const valueToStore = value instanceof Function ? value(storedValue) : value;
|
|
832
|
+
// Save state
|
|
833
|
+
setStoredValue(valueToStore);
|
|
834
|
+
// Save to local storage
|
|
835
|
+
if (typeof window !== "undefined") {
|
|
836
|
+
window.localStorage.setItem(key, JSON.stringify(valueToStore));
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
catch (error) {
|
|
840
|
+
// A more advanced implementation would handle the error case
|
|
841
|
+
console.error(error);
|
|
842
|
+
}
|
|
843
|
+
};
|
|
844
|
+
return [storedValue, setValue];
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
function CheckoutForm$2({ checkoutId, onComplete, }) {
|
|
848
|
+
const [step, setStep] = useState("contact");
|
|
849
|
+
const [formData, setFormData] = useLocalStorage(`checkout-${checkoutId}`, {});
|
|
850
|
+
// Helper function to format address for display
|
|
851
|
+
const formatAddress = (address) => {
|
|
852
|
+
return `${address.address}, ${address.city} ${address.state} ${address.zipCode}, ${address.country}`;
|
|
853
|
+
};
|
|
854
|
+
// Format shipping method for display
|
|
855
|
+
const formatShippingMethod = (method) => {
|
|
856
|
+
switch (method) {
|
|
857
|
+
case "economy":
|
|
858
|
+
return { name: "Economy", price: "$4.90" };
|
|
859
|
+
case "standard":
|
|
860
|
+
return { name: "Standard", price: "$6.90" };
|
|
861
|
+
default:
|
|
862
|
+
return { name: "Economy", price: "$4.90" };
|
|
863
|
+
}
|
|
864
|
+
};
|
|
865
|
+
// Handle address form submission
|
|
866
|
+
const handleCustomerSubmit = (data) => {
|
|
867
|
+
setFormData(Object.assign(Object.assign({}, formData), { customer: data }));
|
|
868
|
+
setStep("shipping");
|
|
869
|
+
};
|
|
870
|
+
// Handle shipping method form submission
|
|
871
|
+
const handleShippingSubmit = (data) => {
|
|
872
|
+
setFormData(Object.assign(Object.assign({}, formData), { shipping: data }));
|
|
873
|
+
setStep("payment");
|
|
874
|
+
};
|
|
875
|
+
// Handle payment form submission
|
|
876
|
+
const handlePaymentSubmit = (data) => {
|
|
877
|
+
const completeFormData = Object.assign(Object.assign({}, formData), { payment: data });
|
|
878
|
+
setFormData(completeFormData);
|
|
879
|
+
if (onComplete) {
|
|
880
|
+
onComplete(completeFormData);
|
|
881
|
+
}
|
|
882
|
+
};
|
|
883
|
+
// Navigate back to previous step
|
|
884
|
+
const handleBack = () => {
|
|
885
|
+
if (step === "customer")
|
|
886
|
+
setStep("customer");
|
|
887
|
+
if (step === "shipping")
|
|
888
|
+
setStep("customer");
|
|
889
|
+
if (step === "payment")
|
|
890
|
+
setStep("shipping");
|
|
891
|
+
};
|
|
892
|
+
return (React__default.createElement("div", { className: "space-y-6" },
|
|
893
|
+
step === "customer" && (React__default.createElement(CustomerForm, { initialData: formData.customer, onSubmit: handleCustomerSubmit, onBack: handleBack })),
|
|
894
|
+
step === "shipping" && formData.customer && (React__default.createElement(ShippingMethodForm, { initialData: formData.shipping, onSubmit: handleShippingSubmit, onBack: handleBack, contactEmail: formData.customer.email, shippingAddress: formatAddress(formData.customer) })),
|
|
895
|
+
step === "payment" &&
|
|
896
|
+
formData.customer &&
|
|
897
|
+
formData.customer &&
|
|
898
|
+
formData.shipping && (React__default.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 }))));
|
|
899
|
+
}
|
|
900
|
+
|
|
274
901
|
function CheckoutSummary({ lineItems, shipping, tax, currency, }) {
|
|
275
902
|
const subtotal = lineItems.reduce((acc, item) => {
|
|
276
903
|
var _a, _b;
|
|
@@ -280,37 +907,36 @@ function CheckoutSummary({ lineItems, shipping, tax, currency, }) {
|
|
|
280
907
|
const formatPrice = (cents) => {
|
|
281
908
|
return `${(cents / 100).toFixed(2)} ${currency}`;
|
|
282
909
|
};
|
|
283
|
-
return (
|
|
910
|
+
return (React__default.createElement("div", { className: "bg-black text-white p-6 rounded-lg" },
|
|
284
911
|
lineItems.map((item, index) => {
|
|
285
912
|
var _a, _b, _c, _d, _e;
|
|
286
|
-
return (
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
React.createElement("p", { className: "text-lg font-medium" }, formatPrice((_e = (_d = item.product) === null || _d === void 0 ? void 0 : _d.priceInCents) !== null && _e !== void 0 ? _e : 0)))));
|
|
913
|
+
return (React__default.createElement("div", { key: index, className: "flex items-center mb-6" },
|
|
914
|
+
React__default.createElement("div", { className: "relative" },
|
|
915
|
+
React__default.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__default.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" }))),
|
|
916
|
+
React__default.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)),
|
|
917
|
+
React__default.createElement("div", { className: "ml-4 flex-1" },
|
|
918
|
+
React__default.createElement("h3", { className: "text-lg font-medium" }, ((_c = item.product) === null || _c === void 0 ? void 0 : _c.title) || "Product"),
|
|
919
|
+
React__default.createElement("p", { className: "text-zinc-400 text-sm" }, item.variantOptions.map((option) => option.name).join(" / "))),
|
|
920
|
+
React__default.createElement("div", { className: "text-right" },
|
|
921
|
+
React__default.createElement("p", { className: "text-lg font-medium" }, formatPrice((_e = (_d = item.product) === null || _d === void 0 ? void 0 : _d.priceInCents) !== null && _e !== void 0 ? _e : 0)))));
|
|
296
922
|
}),
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
923
|
+
React__default.createElement("div", { className: "border-t border-zinc-800 pt-4 mt-2" },
|
|
924
|
+
React__default.createElement("div", { className: "flex justify-between py-2" },
|
|
925
|
+
React__default.createElement("span", { className: "text-lg" }, "Subtotal"),
|
|
926
|
+
React__default.createElement("span", { className: "text-lg" }, formatPrice(subtotal))),
|
|
927
|
+
React__default.createElement("div", { className: "flex justify-between py-2" },
|
|
928
|
+
React__default.createElement("span", { className: "text-lg" }, "Shipping"),
|
|
929
|
+
React__default.createElement("span", { className: "text-zinc-400" }, shipping !== undefined
|
|
304
930
|
? formatPrice(shipping)
|
|
305
931
|
: "Calculated at next step")),
|
|
306
|
-
tax !== undefined && (
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
932
|
+
tax !== undefined && (React__default.createElement("div", { className: "flex justify-between py-2" },
|
|
933
|
+
React__default.createElement("span", { className: "text-lg" }, "Tax"),
|
|
934
|
+
React__default.createElement("span", { className: "text-lg" }, formatPrice(tax)))),
|
|
935
|
+
React__default.createElement("div", { className: "flex justify-between py-4 mt-2 border-t border-zinc-800 items-center" },
|
|
936
|
+
React__default.createElement("span", { className: "text-2xl font-bold" }, "Total"),
|
|
937
|
+
React__default.createElement("div", { className: "text-right" },
|
|
938
|
+
React__default.createElement("span", { className: "text-zinc-400 text-sm mr-2" }, currency),
|
|
939
|
+
React__default.createElement("span", { className: "text-2xl font-bold" }, formatPrice(total)))))));
|
|
314
940
|
}
|
|
315
941
|
|
|
316
942
|
function CheckoutEmbed({ checkoutId }) {
|
|
@@ -334,16 +960,16 @@ function CheckoutEmbed({ checkoutId }) {
|
|
|
334
960
|
}
|
|
335
961
|
fetchCheckout();
|
|
336
962
|
}, [checkoutId]);
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
963
|
+
const handleComplete = (formData) => {
|
|
964
|
+
console.log("Checkout complete:", formData);
|
|
965
|
+
// Here you would typically send the completed form data to your API
|
|
966
|
+
};
|
|
967
|
+
if (!checkout && !loading) {
|
|
968
|
+
return React__default.createElement("div", null, "Checkout not found");
|
|
342
969
|
}
|
|
343
|
-
return (
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
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 }))));
|
|
970
|
+
return (React__default.createElement("div", { className: "grid md:grid-cols-2 gap-4" },
|
|
971
|
+
React__default.createElement("div", null, loading ? (React__default.createElement("div", { className: "text-white" }, "Loading...")) : (React__default.createElement(CheckoutForm$2, { checkoutId: checkoutId, onComplete: handleComplete }))),
|
|
972
|
+
React__default.createElement("div", null, loading ? (React__default.createElement("div", null, "Loading...")) : (React__default.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 })))));
|
|
347
973
|
}
|
|
348
974
|
var index$1 = memo(CheckoutEmbed);
|
|
349
975
|
|
|
@@ -380,10 +1006,10 @@ const CheckoutForm = ({ onSuccess, onError, children, }) => {
|
|
|
380
1006
|
setErrorMessage(undefined);
|
|
381
1007
|
setIsSubmitting(false);
|
|
382
1008
|
});
|
|
383
|
-
return (
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
1009
|
+
return (React__default.createElement("form", { onSubmit: handleSubmit },
|
|
1010
|
+
React__default.createElement("div", null,
|
|
1011
|
+
React__default.createElement(PaymentElement$1, null),
|
|
1012
|
+
React__default.createElement("p", { className: "text-red-500" }, errorMessage)),
|
|
387
1013
|
children));
|
|
388
1014
|
};
|
|
389
1015
|
var CheckoutForm$1 = memo(CheckoutForm);
|
|
@@ -392,9 +1018,39 @@ const publicStripeKey = "pk_test_51OjSZ2JoDmiuDQz4Vub296KIgTCy4y8NJos59h93bq3sLe
|
|
|
392
1018
|
const stripePromise = loadStripe(publicStripeKey);
|
|
393
1019
|
function PaymentElement({ paymentSecret, checkoutAppearance, onSuccess, onError, children, }) {
|
|
394
1020
|
const options = Object.assign(Object.assign({ locale: "en" }, (checkoutAppearance ? checkoutAppearance : {})), { clientSecret: paymentSecret });
|
|
395
|
-
return (
|
|
396
|
-
|
|
1021
|
+
return (React__default.createElement(Elements, { stripe: stripePromise, options: options },
|
|
1022
|
+
React__default.createElement(CheckoutForm$1, { onSuccess: onSuccess, onError: onError, children: children })));
|
|
397
1023
|
}
|
|
398
1024
|
var index = memo(PaymentElement);
|
|
399
1025
|
|
|
1026
|
+
function styleInject(css, ref) {
|
|
1027
|
+
if ( ref === void 0 ) ref = {};
|
|
1028
|
+
var insertAt = ref.insertAt;
|
|
1029
|
+
|
|
1030
|
+
if (typeof document === 'undefined') { return; }
|
|
1031
|
+
|
|
1032
|
+
var head = document.head || document.getElementsByTagName('head')[0];
|
|
1033
|
+
var style = document.createElement('style');
|
|
1034
|
+
style.type = 'text/css';
|
|
1035
|
+
|
|
1036
|
+
if (insertAt === 'top') {
|
|
1037
|
+
if (head.firstChild) {
|
|
1038
|
+
head.insertBefore(style, head.firstChild);
|
|
1039
|
+
} else {
|
|
1040
|
+
head.appendChild(style);
|
|
1041
|
+
}
|
|
1042
|
+
} else {
|
|
1043
|
+
head.appendChild(style);
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
if (style.styleSheet) {
|
|
1047
|
+
style.styleSheet.cssText = css;
|
|
1048
|
+
} else {
|
|
1049
|
+
style.appendChild(document.createTextNode(css));
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
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}";
|
|
1054
|
+
styleInject(css_248z);
|
|
1055
|
+
|
|
400
1056
|
export { index$1 as CheckoutEmbed, index as PaymentElement, useCart, useCheckout };
|