@voyantjs/products-ui 0.81.21 → 0.82.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,23 @@
1
+ import { type ProductRecord } from "@voyantjs/products-react";
2
+ export interface ProductQuickViewSheetProps {
3
+ productId: string | null | undefined;
4
+ open: boolean;
5
+ onOpenChange: (open: boolean) => void;
6
+ /**
7
+ * Wired to the "View full product" footer button. Receives the product
8
+ * so the host can route to its detail page. When omitted, the footer
9
+ * action is suppressed.
10
+ */
11
+ onViewFull?: (product: ProductRecord) => void;
12
+ /** Optional locale override; defaults to the active i18n locale. */
13
+ locale?: string;
14
+ }
15
+ /**
16
+ * Right-side sheet that previews the core info for a product without
17
+ * navigating away. Mirrors `BookingQuickViewSheet` shape (header with
18
+ * status badge + total, sectioned body, "View full" footer) so the
19
+ * pair feels native on the slot detail / allocation views where both
20
+ * sheets coexist.
21
+ */
22
+ export declare function ProductQuickViewSheet({ productId, open, onOpenChange, onViewFull, locale, }: ProductQuickViewSheetProps): import("react/jsx-runtime").JSX.Element;
23
+ //# sourceMappingURL=product-quick-view-sheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-quick-view-sheet.d.ts","sourceRoot":"","sources":["../../src/components/product-quick-view-sheet.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,aAAa,EAKnB,MAAM,0BAA0B,CAAA;AAgBjC,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACpC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;IAC7C,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,MAAM,GACP,EAAE,0BAA0B,2CA0D5B"}
@@ -0,0 +1,65 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useProduct, useProductDays, useProductMedia, useProductOptions, } from "@voyantjs/products-react";
4
+ import { Badge, Button, Sheet, SheetBody, SheetContent, SheetFooter, SheetHeader, SheetTitle, } from "@voyantjs/ui/components";
5
+ import { ArrowRight, Calendar, ImageIcon, Layers, MapPin, Route, Tag } from "lucide-react";
6
+ import { useProductsUiI18nOrDefault, useProductsUiMessagesOrDefault } from "../i18n/provider.js";
7
+ /**
8
+ * Right-side sheet that previews the core info for a product without
9
+ * navigating away. Mirrors `BookingQuickViewSheet` shape (header with
10
+ * status badge + total, sectioned body, "View full" footer) so the
11
+ * pair feels native on the slot detail / allocation views where both
12
+ * sheets coexist.
13
+ */
14
+ export function ProductQuickViewSheet({ productId, open, onOpenChange, onViewFull, locale, }) {
15
+ const i18n = useProductsUiI18nOrDefault();
16
+ const messages = useProductsUiMessagesOrDefault();
17
+ const detail = messages.productDetailPage;
18
+ const resolvedLocale = locale ?? i18n.locale;
19
+ const query = useProduct(productId ?? undefined, {
20
+ enabled: open && Boolean(productId),
21
+ });
22
+ const product = query.data ?? null;
23
+ const isLoading = Boolean(productId) && query.fetchStatus === "fetching" && !product;
24
+ return (_jsx(Sheet, { open: open, onOpenChange: onOpenChange, children: _jsxs(SheetContent, { side: "right", className: "sm:max-w-md", children: [_jsx(SheetHeader, { className: "border-b", children: product ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsx(SheetTitle, { className: "text-base font-semibold", children: product.name }), _jsx(Badge, { variant: "outline", className: "shrink-0 capitalize", children: messages.common.productStatusLabels[product.status] ?? product.status })] }), _jsx("div", { className: "text-2xl font-semibold tabular-nums", children: formatAmount(product.sellAmountCents, product.sellCurrency, resolvedLocale, detail.states.noDescription) })] })) : (_jsx(SheetTitle, { children: detail.states.loading })) }), _jsx(SheetBody, { className: "flex flex-col gap-5", children: isLoading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: messages.common.loading })) : !product ? (_jsx("p", { className: "text-sm text-muted-foreground", children: detail.states.notFoundDescription })) : (_jsx(QuickViewBody, { product: product, locale: resolvedLocale })) }), onViewFull && product ? (_jsx(SheetFooter, { children: _jsxs(Button, { type: "button", className: "w-full", onClick: () => onViewFull(product), children: ["View full product", _jsx(ArrowRight, { className: "ml-1 h-4 w-4", "aria-hidden": "true" })] }) })) : null] }) }));
25
+ }
26
+ function QuickViewBody({ product, locale }) {
27
+ const messages = useProductsUiMessagesOrDefault();
28
+ const detail = messages.productDetailPage;
29
+ const mediaQuery = useProductMedia(product.id, { limit: 1 });
30
+ const cover = (mediaQuery.data?.data ?? []).find((m) => m.isCover) ?? mediaQuery.data?.data?.[0] ?? null;
31
+ const daysQuery = useProductDays(product.id);
32
+ const days = (daysQuery.data?.data ?? []).slice().sort((a, b) => a.dayNumber - b.dayNumber);
33
+ const optionsQuery = useProductOptions({ productId: product.id, limit: 25 });
34
+ const options = (optionsQuery.data?.data ?? []).slice().sort((a, b) => a.sortOrder - b.sortOrder);
35
+ const dateRange = product.startDate
36
+ ? product.endDate && product.endDate !== product.startDate
37
+ ? `${formatDate(product.startDate, locale, detail.states.noDescription)} - ${formatDate(product.endDate, locale, detail.states.noDescription)}`
38
+ : formatDate(product.startDate, locale, detail.states.noDescription)
39
+ : null;
40
+ return (_jsxs("div", { className: "flex flex-col gap-5", children: [cover ? (_jsx("div", { className: "overflow-hidden rounded-md border bg-muted", children: _jsx("img", { src: cover.url, alt: product.name, className: "aspect-video w-full object-cover" }) })) : (_jsx("div", { className: "flex aspect-video w-full items-center justify-center rounded-md border bg-muted text-muted-foreground", children: _jsx(ImageIcon, { className: "size-6", "aria-hidden": "true" }) })), _jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [_jsx(Badge, { variant: "outline", className: "capitalize", children: messages.common.productBookingModeLabels[product.bookingMode] ?? product.bookingMode }), _jsx(Badge, { variant: "outline", className: "capitalize", children: messages.common.productCapacityModeLabels[product.capacityMode] ?? product.capacityMode })] }), product.description ? (_jsx("p", { className: "whitespace-pre-wrap text-sm text-muted-foreground", children: product.description })) : null, _jsx("div", { className: "flex flex-col gap-1.5", children: dateRange ? (_jsxs("div", { className: "flex items-center gap-2 text-sm", children: [_jsx(Calendar, { className: "h-4 w-4 text-muted-foreground", "aria-hidden": "true" }), _jsx("span", { children: dateRange })] })) : null }), options.length > 0 ? (_jsx(Section, { icon: _jsx(Layers, { className: "h-3.5 w-3.5" }),
41
+ /* i18n-literal-ok scoped section heading */
42
+ label: "Options", count: String(options.length), children: _jsx("ul", { className: "flex flex-col gap-2", children: options.map((option) => (_jsxs("li", { className: "flex items-start justify-between gap-3 border-l-2 border-border pl-3", children: [_jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [_jsx("span", { className: "truncate text-sm font-medium", children: option.name }), option.description ? (_jsx("span", { className: "line-clamp-2 text-xs text-muted-foreground", children: option.description })) : null] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1.5", children: [option.isDefault ? (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Default" })) : null, _jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: messages.common.optionStatusLabels[option.status] ?? option.status })] })] }, option.id))) }) })) : null, days.length > 0 ? (_jsx(Section, { icon: _jsx(Route, { className: "h-3.5 w-3.5" }), label: detail.sections.itinerary.title, count: String(days.length), children: _jsx("ol", { className: "flex flex-col gap-3", children: days.map((day) => (_jsxs("li", { className: "flex flex-col gap-1 border-l-2 border-border pl-3", children: [_jsxs("div", { className: "flex items-baseline gap-2 text-sm font-medium", children: [_jsx("span", { className: "text-muted-foreground", children: `Day ${day.dayNumber}` }), day.title ? _jsx("span", { className: "truncate", children: day.title }) : null] }), day.location ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [_jsx(MapPin, { className: "h-3 w-3 shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "truncate", children: day.location })] })) : null, day.description ? (_jsx("p", { className: "whitespace-pre-wrap text-xs text-muted-foreground", children: day.description })) : null] }, day.id))) }) })) : null, product.tags.length > 0 ? (_jsx(Section, { icon: _jsx(Tag, { className: "h-3.5 w-3.5" }), label: detail.fields.tags, children: _jsx("div", { className: "flex flex-wrap items-center gap-1.5", children: product.tags.map((tag) => (_jsx(Badge, { variant: "outline", children: tag }, tag))) }) })) : null] }));
43
+ }
44
+ function Section({ icon, label, count, children, }) {
45
+ return (_jsxs("section", { className: "flex flex-col gap-2 border-t pt-4", children: [_jsxs("header", { className: "flex items-center justify-between gap-2 text-xs font-medium uppercase tracking-wide text-muted-foreground", children: [_jsxs("span", { className: "flex items-center gap-1.5", children: [icon, label] }), count ? _jsx("span", { className: "font-mono normal-case", children: count }) : null] }), children] }));
46
+ }
47
+ function formatAmount(cents, currency, locale, empty) {
48
+ if (cents == null)
49
+ return empty;
50
+ return new Intl.NumberFormat(locale, {
51
+ style: "currency",
52
+ currency,
53
+ minimumFractionDigits: 2,
54
+ maximumFractionDigits: 2,
55
+ }).format(cents / 100);
56
+ }
57
+ function formatDate(iso, locale, empty) {
58
+ if (!iso)
59
+ return empty;
60
+ return new Date(iso).toLocaleDateString(locale, {
61
+ month: "short",
62
+ day: "numeric",
63
+ year: "numeric",
64
+ });
65
+ }
package/dist/index.d.ts CHANGED
@@ -27,6 +27,7 @@ export { ProductMediaSection, type ProductMediaSectionProps, type ProductMediaUp
27
27
  export { ProductOptionDialog, type ProductOptionDialogProps, } from "./components/product-option-dialog.js";
28
28
  export { ProductOptionForm, type ProductOptionFormProps } from "./components/product-option-form.js";
29
29
  export { ProductOptionsSection, type ProductOptionsSectionProps, } from "./components/product-options-section.js";
30
+ export { ProductQuickViewSheet, type ProductQuickViewSheetProps, } from "./components/product-quick-view-sheet.js";
30
31
  export { ProductTagDialog, type ProductTagDialogProps } from "./components/product-tag-dialog.js";
31
32
  export { ProductTagForm, type ProductTagFormProps } from "./components/product-tag-form.js";
32
33
  export { ProductTagList, type ProductTagListProps } from "./components/product-tag-list.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -27,6 +27,7 @@ export { ProductMediaSection, } from "./components/product-media-section.js";
27
27
  export { ProductOptionDialog, } from "./components/product-option-dialog.js";
28
28
  export { ProductOptionForm } from "./components/product-option-form.js";
29
29
  export { ProductOptionsSection, } from "./components/product-options-section.js";
30
+ export { ProductQuickViewSheet, } from "./components/product-quick-view-sheet.js";
30
31
  export { ProductTagDialog } from "./components/product-tag-dialog.js";
31
32
  export { ProductTagForm } from "./components/product-tag-form.js";
32
33
  export { ProductTagList } from "./components/product-tag-list.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyantjs/products-ui",
3
- "version": "0.81.21",
3
+ "version": "0.82.0",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -45,17 +45,17 @@
45
45
  "react-dom": "^19.0.0",
46
46
  "react-hook-form": "^7.60.0",
47
47
  "zod": "^4.3.6",
48
- "@voyantjs/availability-react": "0.81.21",
49
- "@voyantjs/catalog-react": "0.81.21",
50
- "@voyantjs/finance": "0.81.21",
51
- "@voyantjs/finance-ui": "0.81.21",
52
- "@voyantjs/pricing-react": "0.81.21",
53
- "@voyantjs/products-react": "0.81.21",
54
- "@voyantjs/suppliers-react": "0.81.21",
55
- "@voyantjs/ui": "0.81.21"
48
+ "@voyantjs/availability-react": "0.82.0",
49
+ "@voyantjs/catalog-react": "0.82.0",
50
+ "@voyantjs/finance": "0.82.0",
51
+ "@voyantjs/finance-ui": "0.82.0",
52
+ "@voyantjs/pricing-react": "0.82.0",
53
+ "@voyantjs/products-react": "0.82.0",
54
+ "@voyantjs/suppliers-react": "0.82.0",
55
+ "@voyantjs/ui": "0.82.0"
56
56
  },
57
57
  "dependencies": {
58
- "@voyantjs/i18n": "0.81.21"
58
+ "@voyantjs/i18n": "0.82.0"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@tanstack/react-query": "^5.100.11",
@@ -68,15 +68,15 @@
68
68
  "typescript": "^6.0.2",
69
69
  "vitest": "^4.1.2",
70
70
  "zod": "^4.3.6",
71
- "@voyantjs/availability-react": "0.81.21",
72
- "@voyantjs/catalog-react": "0.81.21",
73
- "@voyantjs/finance": "0.81.21",
74
- "@voyantjs/finance-ui": "0.81.21",
75
- "@voyantjs/i18n": "0.81.21",
76
- "@voyantjs/pricing-react": "0.81.21",
77
- "@voyantjs/products-react": "0.81.21",
78
- "@voyantjs/suppliers-react": "0.81.21",
79
- "@voyantjs/ui": "0.81.21",
71
+ "@voyantjs/availability-react": "0.82.0",
72
+ "@voyantjs/catalog-react": "0.82.0",
73
+ "@voyantjs/finance": "0.82.0",
74
+ "@voyantjs/finance-ui": "0.82.0",
75
+ "@voyantjs/i18n": "0.82.0",
76
+ "@voyantjs/pricing-react": "0.82.0",
77
+ "@voyantjs/products-react": "0.82.0",
78
+ "@voyantjs/suppliers-react": "0.82.0",
79
+ "@voyantjs/ui": "0.82.0",
80
80
  "@voyantjs/voyant-typescript-config": "0.1.0"
81
81
  },
82
82
  "files": [