@burdenoff/microfe-ggnomad 2026.705.5 → 2026.705.6

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.
@@ -6,111 +6,119 @@ import { DetailHero as i } from "../components/DetailHero.js";
6
6
  import { useGGNomad as a } from "../providers/GGNomadProvider.js";
7
7
  import { joinPath as o } from "../utils/navigation.js";
8
8
  import { BookingPanel as s } from "../components/BookingPanel.js";
9
+ import { ReviewsSection as c } from "../components/ReviewsSection.js";
9
10
  import "../components/index.js";
10
- import { Hotel as c } from "lucide-react";
11
- import { useI18n as l } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
- import { useNavigate as u, useParams as d } from "react-router-dom";
13
- import { useQuery as f } from "@apollo/client/react";
14
- import { GlassCard as p, IllustratedEmptyState as m, NextSteps as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
15
- import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
11
+ import { Hotel as l } from "lucide-react";
12
+ import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
13
+ import { useNavigate as d, useParams as f } from "react-router-dom";
14
+ import { useQuery as p } from "@apollo/client/react";
15
+ import { GlassCard as m, IllustratedEmptyState as h, NextSteps as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
16
+ import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
16
17
  //#region src/ggnomad/pages/PropertyDetailsPage.tsx
17
- function b() {
18
- let { t: b } = l(), x = u(), { basePath: S = "/" } = a(), { id: C = "" } = d(), { data: w } = f(e, {
19
- variables: { id: C },
20
- skip: !C
21
- }), T = w?.ggnomadProperty;
22
- return /* @__PURE__ */ v(t, {
23
- title: T?.name ?? b("ggnomad.property.fallbackTitle", "Property details"),
24
- subtitle: b("ggnomad.property.subtitle", "Detailed hospitality listing view"),
25
- children: T ? /* @__PURE__ */ y(_, { children: [
26
- /* @__PURE__ */ v(i, {
27
- image: T.images?.[0],
28
- alt: T.name
18
+ function x() {
19
+ let { t: x } = u(), S = d(), { basePath: C = "/" } = a(), { id: w = "" } = f(), { data: T } = p(e, {
20
+ variables: { id: w },
21
+ skip: !w
22
+ }), E = T?.ggnomadProperty;
23
+ return /* @__PURE__ */ y(t, {
24
+ title: E?.name ?? x("ggnomad.property.fallbackTitle", "Property details"),
25
+ subtitle: x("ggnomad.property.subtitle", "Detailed hospitality listing view"),
26
+ children: E ? /* @__PURE__ */ b(v, { children: [
27
+ /* @__PURE__ */ y(i, {
28
+ image: E.images?.[0],
29
+ alt: E.name
29
30
  }),
30
- /* @__PURE__ */ v(g, {
31
- icon: /* @__PURE__ */ v(c, { className: "size-4" }),
32
- children: b("ggnomad.property.purpose", "Everything you need to decide on this stay — its type, description, nightly price, guest capacity, rating and the provider behind it — before you reserve it.")
31
+ /* @__PURE__ */ y(_, {
32
+ icon: /* @__PURE__ */ y(l, { className: "size-4" }),
33
+ children: x("ggnomad.property.purpose", "Everything you need to decide on this stay — its type, description, nightly price, guest capacity, rating and the provider behind it — before you reserve it.")
33
34
  }),
34
- /* @__PURE__ */ v(h, {
35
+ /* @__PURE__ */ y(g, {
35
36
  storageKey: "ggnomad-property-detail",
36
37
  steps: [{
37
38
  id: "browse",
38
- label: b("ggnomad.property.next.browse", "Compare other stays"),
39
- description: b("ggnomad.property.next.browseDesc", "Go back to hospitality listings to compare options."),
40
- icon: /* @__PURE__ */ v(c, { className: "size-4" }),
41
- onClick: () => x(o(S, "hospitality"))
39
+ label: x("ggnomad.property.next.browse", "Compare other stays"),
40
+ description: x("ggnomad.property.next.browseDesc", "Go back to hospitality listings to compare options."),
41
+ icon: /* @__PURE__ */ y(l, { className: "size-4" }),
42
+ onClick: () => S(o(C, "hospitality"))
42
43
  }]
43
44
  }),
44
- /* @__PURE__ */ y("div", {
45
+ /* @__PURE__ */ b("div", {
45
46
  className: "grid gap-4 lg:grid-cols-3",
46
- children: [/* @__PURE__ */ y("div", {
47
+ children: [/* @__PURE__ */ b("div", {
47
48
  className: "lg:col-span-2 space-y-4",
48
- children: [/* @__PURE__ */ y(n, {
49
- title: b("ggnomad.property.about", "About"),
50
- children: [
51
- /* @__PURE__ */ v("p", {
52
- className: "text-sm text-text-secondary",
53
- children: b("ggnomad.property.type", "Type")
54
- }),
55
- /* @__PURE__ */ v("p", {
56
- className: "text-text-primary",
57
- children: T.type
58
- }),
59
- /* @__PURE__ */ v("p", {
60
- className: "mt-3 text-sm text-text-secondary",
61
- children: b("ggnomad.property.description", "Description")
62
- }),
63
- /* @__PURE__ */ v("p", {
64
- className: "text-text-primary",
65
- children: T.description ?? b("ggnomad.property.noDescription", "No description")
66
- })
67
- ]
68
- }), /* @__PURE__ */ y(p, {
69
- treatment: "glass",
70
- glow: !0,
71
- className: "border-border-seam p-5",
72
- children: [/* @__PURE__ */ v("h2", {
73
- className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
74
- children: b("ggnomad.property.details", "Details")
75
- }), /* @__PURE__ */ y("dl", {
76
- className: "space-y-2 text-sm",
49
+ children: [
50
+ /* @__PURE__ */ b(n, {
51
+ title: x("ggnomad.property.about", "About"),
77
52
  children: [
78
- /* @__PURE__ */ v(r, {
79
- label: b("ggnomad.property.price", "Price"),
80
- value: `${T.currency} ${Number(T.pricePerNight).toFixed(2)}`
53
+ /* @__PURE__ */ y("p", {
54
+ className: "text-sm text-text-secondary",
55
+ children: x("ggnomad.property.type", "Type")
81
56
  }),
82
- /* @__PURE__ */ v(r, {
83
- label: b("ggnomad.property.guests", "Guests"),
84
- value: String(T.maxGuests)
57
+ /* @__PURE__ */ y("p", {
58
+ className: "text-text-primary",
59
+ children: E.type
85
60
  }),
86
- /* @__PURE__ */ v(r, {
87
- label: b("ggnomad.property.rating", "Rating"),
88
- value: String(T.rating ?? b("ggnomad.property.noRating", "N/A"))
61
+ /* @__PURE__ */ y("p", {
62
+ className: "mt-3 text-sm text-text-secondary",
63
+ children: x("ggnomad.property.description", "Description")
89
64
  }),
90
- /* @__PURE__ */ v(r, {
91
- label: b("ggnomad.property.provider", "Provider"),
92
- value: T.provider?.name ?? b("ggnomad.property.unassigned", "Unassigned")
65
+ /* @__PURE__ */ y("p", {
66
+ className: "text-text-primary",
67
+ children: E.description ?? x("ggnomad.property.noDescription", "No description")
93
68
  })
94
69
  ]
95
- })]
96
- })]
97
- }), /* @__PURE__ */ v("div", { children: /* @__PURE__ */ v(s, {
70
+ }),
71
+ /* @__PURE__ */ b(m, {
72
+ treatment: "glass",
73
+ glow: !0,
74
+ className: "border-border-seam p-5",
75
+ children: [/* @__PURE__ */ y("h2", {
76
+ className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
77
+ children: x("ggnomad.property.details", "Details")
78
+ }), /* @__PURE__ */ b("dl", {
79
+ className: "space-y-2 text-sm",
80
+ children: [
81
+ /* @__PURE__ */ y(r, {
82
+ label: x("ggnomad.property.price", "Price"),
83
+ value: `${E.currency} ${Number(E.pricePerNight).toFixed(2)}`
84
+ }),
85
+ /* @__PURE__ */ y(r, {
86
+ label: x("ggnomad.property.guests", "Guests"),
87
+ value: String(E.maxGuests)
88
+ }),
89
+ /* @__PURE__ */ y(r, {
90
+ label: x("ggnomad.property.rating", "Rating"),
91
+ value: String(E.rating ?? x("ggnomad.property.noRating", "N/A"))
92
+ }),
93
+ /* @__PURE__ */ y(r, {
94
+ label: x("ggnomad.property.provider", "Provider"),
95
+ value: E.provider?.name ?? x("ggnomad.property.unassigned", "Unassigned")
96
+ })
97
+ ]
98
+ })]
99
+ }),
100
+ /* @__PURE__ */ y(c, {
101
+ targetType: "PROPERTY",
102
+ targetId: E.id ?? w
103
+ })
104
+ ]
105
+ }), /* @__PURE__ */ y("div", { children: /* @__PURE__ */ y(s, {
98
106
  bookingType: "PROPERTY",
99
- itemId: T.id ?? C,
100
- itemName: T.name,
101
- unitPrice: T.pricePerNight ?? 0,
102
- currency: T.currency ?? "USD",
107
+ itemId: E.id ?? w,
108
+ itemName: E.name,
109
+ unitPrice: E.pricePerNight ?? 0,
110
+ currency: E.currency ?? "USD",
103
111
  nights: 1
104
112
  }) })]
105
113
  })
106
- ] }) : /* @__PURE__ */ v(m, {
114
+ ] }) : /* @__PURE__ */ y(h, {
107
115
  illustration: "empty-data",
108
- title: b("ggnomad.property.notFoundTitle", "No property found"),
109
- description: b("ggnomad.property.notFoundDescription", "This property is unavailable or may have been removed.")
116
+ title: x("ggnomad.property.notFoundTitle", "No property found"),
117
+ description: x("ggnomad.property.notFoundDescription", "This property is unavailable or may have been removed.")
110
118
  })
111
119
  });
112
120
  }
113
121
  //#endregion
114
- export { b as PropertyDetailsPage };
122
+ export { x as PropertyDetailsPage };
115
123
 
116
124
  //# sourceMappingURL=PropertyDetailsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PropertyDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/PropertyDetailsPage.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { Hotel } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_PROPERTY_QUERY } from '../graphql';\nimport { useGGNomad } from '../providers/GGNomadProvider';\nimport { joinPath } from '../utils/navigation';\nimport { PageShell } from './PageShell';\nimport { DetailRow, SectionCard, DetailHero, BookingPanel } from '../components';\n\nexport function PropertyDetailsPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { basePath = '/' } = useGGNomad();\n const { id = '' } = useParams();\n const { data } = useQuery(\n GGNOMAD_PROPERTY_QUERY as TypedDocumentNode<\n {\n ggnomadProperty: {\n id: string;\n name: string;\n type: string;\n description?: string;\n currency: string;\n pricePerNight: number;\n maxGuests: number;\n rating?: number;\n provider?: { name: string };\n images?: string[];\n } | null;\n },\n { id: string }\n >,\n { variables: { id }, skip: !id }\n );\n const property = data?.ggnomadProperty;\n\n return (\n <PageShell\n title={property?.name ?? t('ggnomad.property.fallbackTitle', 'Property details')}\n subtitle={t('ggnomad.property.subtitle', 'Detailed hospitality listing view')}\n >\n {!property ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.property.notFoundTitle', 'No property found')}\n description={t(\n 'ggnomad.property.notFoundDescription',\n 'This property is unavailable or may have been removed.'\n )}\n />\n ) : (\n <>\n <DetailHero image={property.images?.[0]} alt={property.name} />\n <PagePurpose icon={<Hotel className=\"size-4\" />}>\n {t(\n 'ggnomad.property.purpose',\n 'Everything you need to decide on this stay — its type, description, nightly price, guest capacity, rating and the provider behind it — before you reserve it.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"ggnomad-property-detail\"\n steps={[\n {\n id: 'browse',\n label: t('ggnomad.property.next.browse', 'Compare other stays'),\n description: t(\n 'ggnomad.property.next.browseDesc',\n 'Go back to hospitality listings to compare options.'\n ),\n icon: <Hotel className=\"size-4\" />,\n onClick: () => navigate(joinPath(basePath, 'hospitality')),\n },\n ]}\n />\n\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <div className=\"lg:col-span-2 space-y-4\">\n <SectionCard title={t('ggnomad.property.about', 'About')}>\n <p className=\"text-sm text-text-secondary\">{t('ggnomad.property.type', 'Type')}</p>\n <p className=\"text-text-primary\">{property.type}</p>\n <p className=\"mt-3 text-sm text-text-secondary\">\n {t('ggnomad.property.description', 'Description')}\n </p>\n <p className=\"text-text-primary\">\n {property.description ?? t('ggnomad.property.noDescription', 'No description')}\n </p>\n </SectionCard>\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam p-5\">\n <h2 className=\"mb-4 text-lg font-medium tracking-tight text-text-primary\">\n {t('ggnomad.property.details', 'Details')}\n </h2>\n <dl className=\"space-y-2 text-sm\">\n <DetailRow\n label={t('ggnomad.property.price', 'Price')}\n value={`${property.currency} ${Number(property.pricePerNight).toFixed(2)}`}\n />\n <DetailRow\n label={t('ggnomad.property.guests', 'Guests')}\n value={String(property.maxGuests)}\n />\n <DetailRow\n label={t('ggnomad.property.rating', 'Rating')}\n value={String(property.rating ?? t('ggnomad.property.noRating', 'N/A'))}\n />\n <DetailRow\n label={t('ggnomad.property.provider', 'Provider')}\n value={\n property.provider?.name ?? t('ggnomad.property.unassigned', 'Unassigned')\n }\n />\n </dl>\n </GlassCard>\n </div>\n <div>\n <BookingPanel\n bookingType=\"PROPERTY\"\n itemId={property.id ?? id}\n itemName={property.name}\n unitPrice={property.pricePerNight ?? 0}\n currency={property.currency ?? 'USD'}\n nights={1}\n />\n </div>\n </div>\n </>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAaA,SAAgB,IAAsB;CACpC,IAAM,EAAE,SAAM,GAAS,EACjB,IAAW,GAAa,EACxB,EAAE,cAAW,QAAQ,GAAY,EACjC,EAAE,QAAK,OAAO,GAAW,EACzB,EAAE,YAAS,EACf,GAiBA;EAAE,WAAW,EAAE,OAAI;EAAE,MAAM,CAAC;EAAI,CACjC,EACK,IAAW,GAAM;AAEvB,QACE,kBAAC,GAAD;EACE,OAAO,GAAU,QAAQ,EAAE,kCAAkC,mBAAmB;EAChF,UAAU,EAAE,6BAA6B,oCAAoC;YAE3E,IAUA,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,GAAD;IAAY,OAAO,EAAS,SAAS;IAAI,KAAK,EAAS;IAAQ,CAAA;GAC/D,kBAAC,GAAD;IAAa,MAAM,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;cAC5C,EACC,4BACA,gKACD;IACW,CAAA;GAEd,kBAAC,GAAD;IACE,YAAW;IACX,OAAO,CACL;KACE,IAAI;KACJ,OAAO,EAAE,gCAAgC,sBAAsB;KAC/D,aAAa,EACX,oCACA,sDACD;KACD,MAAM,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;KAClC,eAAe,EAAS,EAAS,GAAU,cAAc,CAAC;KAC3D,CACF;IACD,CAAA;GAEF,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAa,OAAO,EAAE,0BAA0B,QAAQ;gBAAxD;OACE,kBAAC,KAAD;QAAG,WAAU;kBAA+B,EAAE,yBAAyB,OAAO;QAAK,CAAA;OACnF,kBAAC,KAAD;QAAG,WAAU;kBAAqB,EAAS;QAAS,CAAA;OACpD,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAE,gCAAgC,cAAc;QAC/C,CAAA;OACJ,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAS,eAAe,EAAE,kCAAkC,iBAAiB;QAC5E,CAAA;OACQ;SACd,kBAAC,GAAD;MAAW,WAAU;MAAQ,MAAA;MAAK,WAAU;gBAA5C,CACE,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAE,4BAA4B,UAAU;OACtC,CAAA,EACL,kBAAC,MAAD;OAAI,WAAU;iBAAd;QACE,kBAAC,GAAD;SACE,OAAO,EAAE,0BAA0B,QAAQ;SAC3C,OAAO,GAAG,EAAS,SAAS,GAAG,OAAO,EAAS,cAAc,CAAC,QAAQ,EAAE;SACxE,CAAA;QACF,kBAAC,GAAD;SACE,OAAO,EAAE,2BAA2B,SAAS;SAC7C,OAAO,OAAO,EAAS,UAAU;SACjC,CAAA;QACF,kBAAC,GAAD;SACE,OAAO,EAAE,2BAA2B,SAAS;SAC7C,OAAO,OAAO,EAAS,UAAU,EAAE,6BAA6B,MAAM,CAAC;SACvE,CAAA;QACF,kBAAC,GAAD;SACE,OAAO,EAAE,6BAA6B,WAAW;SACjD,OACE,EAAS,UAAU,QAAQ,EAAE,+BAA+B,aAAa;SAE3E,CAAA;QACC;SACK;QACR;QACN,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;KACE,aAAY;KACZ,QAAQ,EAAS,MAAM;KACvB,UAAU,EAAS;KACnB,WAAW,EAAS,iBAAiB;KACrC,UAAU,EAAS,YAAY;KAC/B,QAAQ;KACR,CAAA,EACE,CAAA,CACF;;GACL,EAAA,CAAA,GAnFH,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,kCAAkC,oBAAoB;GAC/D,aAAa,EACX,wCACA,yDACD;GACD,CAAA;EA8EM,CAAA"}
1
+ {"version":3,"file":"PropertyDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/PropertyDetailsPage.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { Hotel } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_PROPERTY_QUERY } from '../graphql';\nimport { useGGNomad } from '../providers/GGNomadProvider';\nimport { joinPath } from '../utils/navigation';\nimport { PageShell } from './PageShell';\nimport { DetailRow, SectionCard, DetailHero, BookingPanel, ReviewsSection } from '../components';\n\nexport function PropertyDetailsPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { basePath = '/' } = useGGNomad();\n const { id = '' } = useParams();\n const { data } = useQuery(\n GGNOMAD_PROPERTY_QUERY as TypedDocumentNode<\n {\n ggnomadProperty: {\n id: string;\n name: string;\n type: string;\n description?: string;\n currency: string;\n pricePerNight: number;\n maxGuests: number;\n rating?: number;\n provider?: { name: string };\n images?: string[];\n } | null;\n },\n { id: string }\n >,\n { variables: { id }, skip: !id }\n );\n const property = data?.ggnomadProperty;\n\n return (\n <PageShell\n title={property?.name ?? t('ggnomad.property.fallbackTitle', 'Property details')}\n subtitle={t('ggnomad.property.subtitle', 'Detailed hospitality listing view')}\n >\n {!property ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.property.notFoundTitle', 'No property found')}\n description={t(\n 'ggnomad.property.notFoundDescription',\n 'This property is unavailable or may have been removed.'\n )}\n />\n ) : (\n <>\n <DetailHero image={property.images?.[0]} alt={property.name} />\n <PagePurpose icon={<Hotel className=\"size-4\" />}>\n {t(\n 'ggnomad.property.purpose',\n 'Everything you need to decide on this stay — its type, description, nightly price, guest capacity, rating and the provider behind it — before you reserve it.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"ggnomad-property-detail\"\n steps={[\n {\n id: 'browse',\n label: t('ggnomad.property.next.browse', 'Compare other stays'),\n description: t(\n 'ggnomad.property.next.browseDesc',\n 'Go back to hospitality listings to compare options.'\n ),\n icon: <Hotel className=\"size-4\" />,\n onClick: () => navigate(joinPath(basePath, 'hospitality')),\n },\n ]}\n />\n\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <div className=\"lg:col-span-2 space-y-4\">\n <SectionCard title={t('ggnomad.property.about', 'About')}>\n <p className=\"text-sm text-text-secondary\">{t('ggnomad.property.type', 'Type')}</p>\n <p className=\"text-text-primary\">{property.type}</p>\n <p className=\"mt-3 text-sm text-text-secondary\">\n {t('ggnomad.property.description', 'Description')}\n </p>\n <p className=\"text-text-primary\">\n {property.description ?? t('ggnomad.property.noDescription', 'No description')}\n </p>\n </SectionCard>\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam p-5\">\n <h2 className=\"mb-4 text-lg font-medium tracking-tight text-text-primary\">\n {t('ggnomad.property.details', 'Details')}\n </h2>\n <dl className=\"space-y-2 text-sm\">\n <DetailRow\n label={t('ggnomad.property.price', 'Price')}\n value={`${property.currency} ${Number(property.pricePerNight).toFixed(2)}`}\n />\n <DetailRow\n label={t('ggnomad.property.guests', 'Guests')}\n value={String(property.maxGuests)}\n />\n <DetailRow\n label={t('ggnomad.property.rating', 'Rating')}\n value={String(property.rating ?? t('ggnomad.property.noRating', 'N/A'))}\n />\n <DetailRow\n label={t('ggnomad.property.provider', 'Provider')}\n value={\n property.provider?.name ?? t('ggnomad.property.unassigned', 'Unassigned')\n }\n />\n </dl>\n </GlassCard>\n <ReviewsSection targetType=\"PROPERTY\" targetId={property.id ?? id} />\n </div>\n <div>\n <BookingPanel\n bookingType=\"PROPERTY\"\n itemId={property.id ?? id}\n itemName={property.name}\n unitPrice={property.pricePerNight ?? 0}\n currency={property.currency ?? 'USD'}\n nights={1}\n />\n </div>\n </div>\n </>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAaA,SAAgB,IAAsB;CACpC,IAAM,EAAE,SAAM,GAAS,EACjB,IAAW,GAAa,EACxB,EAAE,cAAW,QAAQ,GAAY,EACjC,EAAE,QAAK,OAAO,GAAW,EACzB,EAAE,YAAS,EACf,GAiBA;EAAE,WAAW,EAAE,OAAI;EAAE,MAAM,CAAC;EAAI,CACjC,EACK,IAAW,GAAM;AAEvB,QACE,kBAAC,GAAD;EACE,OAAO,GAAU,QAAQ,EAAE,kCAAkC,mBAAmB;EAChF,UAAU,EAAE,6BAA6B,oCAAoC;YAE3E,IAUA,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,GAAD;IAAY,OAAO,EAAS,SAAS;IAAI,KAAK,EAAS;IAAQ,CAAA;GAC/D,kBAAC,GAAD;IAAa,MAAM,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;cAC5C,EACC,4BACA,gKACD;IACW,CAAA;GAEd,kBAAC,GAAD;IACE,YAAW;IACX,OAAO,CACL;KACE,IAAI;KACJ,OAAO,EAAE,gCAAgC,sBAAsB;KAC/D,aAAa,EACX,oCACA,sDACD;KACD,MAAM,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;KAClC,eAAe,EAAS,EAAS,GAAU,cAAc,CAAC;KAC3D,CACF;IACD,CAAA;GAEF,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OAAa,OAAO,EAAE,0BAA0B,QAAQ;iBAAxD;QACE,kBAAC,KAAD;SAAG,WAAU;mBAA+B,EAAE,yBAAyB,OAAO;SAAK,CAAA;QACnF,kBAAC,KAAD;SAAG,WAAU;mBAAqB,EAAS;SAAS,CAAA;QACpD,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAE,gCAAgC,cAAc;SAC/C,CAAA;QACJ,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAS,eAAe,EAAE,kCAAkC,iBAAiB;SAC5E,CAAA;QACQ;;MACd,kBAAC,GAAD;OAAW,WAAU;OAAQ,MAAA;OAAK,WAAU;iBAA5C,CACE,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAE,4BAA4B,UAAU;QACtC,CAAA,EACL,kBAAC,MAAD;QAAI,WAAU;kBAAd;SACE,kBAAC,GAAD;UACE,OAAO,EAAE,0BAA0B,QAAQ;UAC3C,OAAO,GAAG,EAAS,SAAS,GAAG,OAAO,EAAS,cAAc,CAAC,QAAQ,EAAE;UACxE,CAAA;SACF,kBAAC,GAAD;UACE,OAAO,EAAE,2BAA2B,SAAS;UAC7C,OAAO,OAAO,EAAS,UAAU;UACjC,CAAA;SACF,kBAAC,GAAD;UACE,OAAO,EAAE,2BAA2B,SAAS;UAC7C,OAAO,OAAO,EAAS,UAAU,EAAE,6BAA6B,MAAM,CAAC;UACvE,CAAA;SACF,kBAAC,GAAD;UACE,OAAO,EAAE,6BAA6B,WAAW;UACjD,OACE,EAAS,UAAU,QAAQ,EAAE,+BAA+B,aAAa;UAE3E,CAAA;SACC;UACK;;MACZ,kBAAC,GAAD;OAAgB,YAAW;OAAW,UAAU,EAAS,MAAM;OAAM,CAAA;MACjE;QACN,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;KACE,aAAY;KACZ,QAAQ,EAAS,MAAM;KACvB,UAAU,EAAS;KACnB,WAAW,EAAS,iBAAiB;KACrC,UAAU,EAAS,YAAY;KAC/B,QAAQ;KACR,CAAA,EACE,CAAA,CACF;;GACL,EAAA,CAAA,GApFH,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,kCAAkC,oBAAoB;GAC/D,aAAa,EACX,wCACA,yDACD;GACD,CAAA;EA+EM,CAAA"}
@@ -6,102 +6,110 @@ import { DetailHero as i } from "../components/DetailHero.js";
6
6
  import { useGGNomad as a } from "../providers/GGNomadProvider.js";
7
7
  import { joinPath as o } from "../utils/navigation.js";
8
8
  import { BookingPanel as s } from "../components/BookingPanel.js";
9
+ import { ReviewsSection as c } from "../components/ReviewsSection.js";
9
10
  import "../components/index.js";
10
- import { CheckCircle2 as c, Compass as l } from "lucide-react";
11
- import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
- import { useNavigate as d, useParams as f } from "react-router-dom";
13
- import { useQuery as p } from "@apollo/client/react";
14
- import { GlassCard as m, IllustratedEmptyState as h, NextSteps as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
15
- import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
11
+ import { CheckCircle2 as l, Compass as u } from "lucide-react";
12
+ import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
13
+ import { useNavigate as f, useParams as p } from "react-router-dom";
14
+ import { useQuery as m } from "@apollo/client/react";
15
+ import { GlassCard as h, IllustratedEmptyState as g, NextSteps as _, PagePurpose as v } from "@burdenoff/fe-libs/ui";
16
+ import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
16
17
  //#region src/ggnomad/pages/TourDetailsPage.tsx
17
- function x() {
18
- let { t: x } = u(), S = d(), { basePath: C = "/" } = a(), { id: w = "" } = f(), { data: T } = p(e, {
19
- variables: { id: w },
20
- skip: !w
21
- }), E = T?.ggnomadTour;
22
- return /* @__PURE__ */ y(t, {
23
- title: E?.name ?? x("ggnomad.tour.fallbackTitle", "Tour details"),
24
- subtitle: x("ggnomad.tour.subtitle", "Tour package details and booking context"),
25
- children: E ? /* @__PURE__ */ b(v, { children: [
26
- /* @__PURE__ */ y(i, {
27
- image: E.images?.[0],
28
- alt: E.name
18
+ function S() {
19
+ let { t: S } = d(), C = f(), { basePath: w = "/" } = a(), { id: T = "" } = p(), { data: E } = m(e, {
20
+ variables: { id: T },
21
+ skip: !T
22
+ }), D = E?.ggnomadTour;
23
+ return /* @__PURE__ */ b(t, {
24
+ title: D?.name ?? S("ggnomad.tour.fallbackTitle", "Tour details"),
25
+ subtitle: S("ggnomad.tour.subtitle", "Tour package details and booking context"),
26
+ children: D ? /* @__PURE__ */ x(y, { children: [
27
+ /* @__PURE__ */ b(i, {
28
+ image: D.images?.[0],
29
+ alt: D.name
29
30
  }),
30
- /* @__PURE__ */ y(_, {
31
- icon: /* @__PURE__ */ y(l, { className: "size-4" }),
32
- children: x("ggnomad.tour.purpose", "See exactly what this tour involves — duration, difficulty, your guide, price and the highlights you’ll experience — so you can confirm it fits your trip before booking.")
31
+ /* @__PURE__ */ b(v, {
32
+ icon: /* @__PURE__ */ b(u, { className: "size-4" }),
33
+ children: S("ggnomad.tour.purpose", "See exactly what this tour involves — duration, difficulty, your guide, price and the highlights you’ll experience — so you can confirm it fits your trip before booking.")
33
34
  }),
34
- /* @__PURE__ */ y(g, {
35
+ /* @__PURE__ */ b(_, {
35
36
  storageKey: "ggnomad-tour-detail",
36
37
  steps: [{
37
38
  id: "browse",
38
- label: x("ggnomad.tour.next.browse", "Explore more experiences"),
39
- description: x("ggnomad.tour.next.browseDesc", "Return to Tourism to compare tours and activities."),
40
- icon: /* @__PURE__ */ y(l, { className: "size-4" }),
41
- onClick: () => S(o(C, "tourism"))
39
+ label: S("ggnomad.tour.next.browse", "Explore more experiences"),
40
+ description: S("ggnomad.tour.next.browseDesc", "Return to Tourism to compare tours and activities."),
41
+ icon: /* @__PURE__ */ b(u, { className: "size-4" }),
42
+ onClick: () => C(o(w, "tourism"))
42
43
  }]
43
44
  }),
44
- /* @__PURE__ */ b("div", {
45
+ /* @__PURE__ */ x("div", {
45
46
  className: "grid gap-4 lg:grid-cols-3",
46
- children: [/* @__PURE__ */ b("div", {
47
+ children: [/* @__PURE__ */ x("div", {
47
48
  className: "lg:col-span-2 space-y-4",
48
- children: [/* @__PURE__ */ b(m, {
49
- treatment: "glass",
50
- glow: !0,
51
- className: "border-border-seam p-5",
52
- children: [/* @__PURE__ */ y("h2", {
53
- className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
54
- children: x("ggnomad.tour.details", "Details")
55
- }), /* @__PURE__ */ b("dl", {
56
- className: "space-y-2 text-sm",
57
- children: [
58
- /* @__PURE__ */ y(r, {
59
- label: x("ggnomad.tour.duration", "Duration"),
60
- value: E.duration
61
- }),
62
- /* @__PURE__ */ y(r, {
63
- label: x("ggnomad.tour.difficulty", "Difficulty"),
64
- value: E.difficulty ?? x("ggnomad.tour.na", "N/A")
65
- }),
66
- /* @__PURE__ */ y(r, {
67
- label: x("ggnomad.tour.guide", "Guide"),
68
- value: E.guideName ?? x("ggnomad.tour.na", "N/A")
69
- }),
70
- /* @__PURE__ */ y(r, {
71
- label: x("ggnomad.tour.price", "Price"),
72
- value: `${E.currency} ${Number(E.price).toFixed(2)}`
73
- })
74
- ]
75
- })]
76
- }), /* @__PURE__ */ y(n, {
77
- title: x("ggnomad.tour.highlights", "Highlights"),
78
- children: /* @__PURE__ */ y("ul", {
79
- className: "space-y-2 text-sm",
80
- children: (E.highlights ?? []).map((e) => /* @__PURE__ */ b("li", {
81
- className: "flex items-start gap-2 text-text-primary",
82
- children: [/* @__PURE__ */ y(c, {
83
- className: "mt-0.5 size-4 flex-shrink-0 text-status-success-text",
84
- "aria-hidden": "true"
85
- }), e]
86
- }, e))
49
+ children: [
50
+ /* @__PURE__ */ x(h, {
51
+ treatment: "glass",
52
+ glow: !0,
53
+ className: "border-border-seam p-5",
54
+ children: [/* @__PURE__ */ b("h2", {
55
+ className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
56
+ children: S("ggnomad.tour.details", "Details")
57
+ }), /* @__PURE__ */ x("dl", {
58
+ className: "space-y-2 text-sm",
59
+ children: [
60
+ /* @__PURE__ */ b(r, {
61
+ label: S("ggnomad.tour.duration", "Duration"),
62
+ value: D.duration
63
+ }),
64
+ /* @__PURE__ */ b(r, {
65
+ label: S("ggnomad.tour.difficulty", "Difficulty"),
66
+ value: D.difficulty ?? S("ggnomad.tour.na", "N/A")
67
+ }),
68
+ /* @__PURE__ */ b(r, {
69
+ label: S("ggnomad.tour.guide", "Guide"),
70
+ value: D.guideName ?? S("ggnomad.tour.na", "N/A")
71
+ }),
72
+ /* @__PURE__ */ b(r, {
73
+ label: S("ggnomad.tour.price", "Price"),
74
+ value: `${D.currency} ${Number(D.price).toFixed(2)}`
75
+ })
76
+ ]
77
+ })]
78
+ }),
79
+ /* @__PURE__ */ b(n, {
80
+ title: S("ggnomad.tour.highlights", "Highlights"),
81
+ children: /* @__PURE__ */ b("ul", {
82
+ className: "space-y-2 text-sm",
83
+ children: (D.highlights ?? []).map((e) => /* @__PURE__ */ x("li", {
84
+ className: "flex items-start gap-2 text-text-primary",
85
+ children: [/* @__PURE__ */ b(l, {
86
+ className: "mt-0.5 size-4 flex-shrink-0 text-status-success-text",
87
+ "aria-hidden": "true"
88
+ }), e]
89
+ }, e))
90
+ })
91
+ }),
92
+ /* @__PURE__ */ b(c, {
93
+ targetType: "TOUR",
94
+ targetId: D.id ?? T
87
95
  })
88
- })]
89
- }), /* @__PURE__ */ y("div", { children: /* @__PURE__ */ y(s, {
96
+ ]
97
+ }), /* @__PURE__ */ b("div", { children: /* @__PURE__ */ b(s, {
90
98
  bookingType: "TOUR",
91
- itemId: E.id ?? w,
92
- itemName: E.name,
93
- unitPrice: E.price ?? 0,
94
- currency: E.currency ?? "USD"
99
+ itemId: D.id ?? T,
100
+ itemName: D.name,
101
+ unitPrice: D.price ?? 0,
102
+ currency: D.currency ?? "USD"
95
103
  }) })]
96
104
  })
97
- ] }) : /* @__PURE__ */ y(h, {
105
+ ] }) : /* @__PURE__ */ b(g, {
98
106
  illustration: "empty-data",
99
- title: x("ggnomad.tour.notFoundTitle", "No tour found"),
100
- description: x("ggnomad.tour.notFoundDescription", "This tour is unavailable or may have been removed.")
107
+ title: S("ggnomad.tour.notFoundTitle", "No tour found"),
108
+ description: S("ggnomad.tour.notFoundDescription", "This tour is unavailable or may have been removed.")
101
109
  })
102
110
  });
103
111
  }
104
112
  //#endregion
105
- export { x as TourDetailsPage };
113
+ export { S as TourDetailsPage };
106
114
 
107
115
  //# sourceMappingURL=TourDetailsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TourDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/TourDetailsPage.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { CheckCircle2, Compass } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_TOUR_QUERY } from '../graphql';\nimport { useGGNomad } from '../providers/GGNomadProvider';\nimport { joinPath } from '../utils/navigation';\nimport { PageShell } from './PageShell';\nimport { DetailRow, SectionCard, DetailHero, BookingPanel } from '../components';\n\nexport function TourDetailsPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { basePath = '/' } = useGGNomad();\n const { id = '' } = useParams();\n const { data } = useQuery(\n GGNOMAD_TOUR_QUERY as TypedDocumentNode<\n {\n ggnomadTour: {\n id: string;\n name: string;\n duration: string;\n difficulty?: string;\n guideName?: string;\n currency: string;\n price: number;\n highlights: string[];\n images?: string[];\n } | null;\n },\n { id: string }\n >,\n { variables: { id }, skip: !id }\n );\n const tour = data?.ggnomadTour;\n\n return (\n <PageShell\n title={tour?.name ?? t('ggnomad.tour.fallbackTitle', 'Tour details')}\n subtitle={t('ggnomad.tour.subtitle', 'Tour package details and booking context')}\n >\n {!tour ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.tour.notFoundTitle', 'No tour found')}\n description={t(\n 'ggnomad.tour.notFoundDescription',\n 'This tour is unavailable or may have been removed.'\n )}\n />\n ) : (\n <>\n <DetailHero image={tour.images?.[0]} alt={tour.name} />\n <PagePurpose icon={<Compass className=\"size-4\" />}>\n {t(\n 'ggnomad.tour.purpose',\n 'See exactly what this tour involves — duration, difficulty, your guide, price and the highlights you’ll experience — so you can confirm it fits your trip before booking.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"ggnomad-tour-detail\"\n steps={[\n {\n id: 'browse',\n label: t('ggnomad.tour.next.browse', 'Explore more experiences'),\n description: t(\n 'ggnomad.tour.next.browseDesc',\n 'Return to Tourism to compare tours and activities.'\n ),\n icon: <Compass className=\"size-4\" />,\n onClick: () => navigate(joinPath(basePath, 'tourism')),\n },\n ]}\n />\n\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <div className=\"lg:col-span-2 space-y-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam p-5\">\n <h2 className=\"mb-4 text-lg font-medium tracking-tight text-text-primary\">\n {t('ggnomad.tour.details', 'Details')}\n </h2>\n <dl className=\"space-y-2 text-sm\">\n <DetailRow label={t('ggnomad.tour.duration', 'Duration')} value={tour.duration} />\n <DetailRow\n label={t('ggnomad.tour.difficulty', 'Difficulty')}\n value={tour.difficulty ?? t('ggnomad.tour.na', 'N/A')}\n />\n <DetailRow\n label={t('ggnomad.tour.guide', 'Guide')}\n value={tour.guideName ?? t('ggnomad.tour.na', 'N/A')}\n />\n <DetailRow\n label={t('ggnomad.tour.price', 'Price')}\n value={`${tour.currency} ${Number(tour.price).toFixed(2)}`}\n />\n </dl>\n </GlassCard>\n <SectionCard title={t('ggnomad.tour.highlights', 'Highlights')}>\n <ul className=\"space-y-2 text-sm\">\n {(tour.highlights ?? []).map((highlight) => (\n <li key={highlight} className=\"flex items-start gap-2 text-text-primary\">\n <CheckCircle2\n className=\"mt-0.5 size-4 flex-shrink-0 text-status-success-text\"\n aria-hidden=\"true\"\n />\n {highlight}\n </li>\n ))}\n </ul>\n </SectionCard>\n </div>\n <div>\n <BookingPanel\n bookingType=\"TOUR\"\n itemId={tour.id ?? id}\n itemName={tour.name}\n unitPrice={tour.price ?? 0}\n currency={tour.currency ?? 'USD'}\n />\n </div>\n </div>\n </>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAaA,SAAgB,IAAkB;CAChC,IAAM,EAAE,SAAM,GAAS,EACjB,IAAW,GAAa,EACxB,EAAE,cAAW,QAAQ,GAAY,EACjC,EAAE,QAAK,OAAO,GAAW,EACzB,EAAE,YAAS,EACf,GAgBA;EAAE,WAAW,EAAE,OAAI;EAAE,MAAM,CAAC;EAAI,CACjC,EACK,IAAO,GAAM;AAEnB,QACE,kBAAC,GAAD;EACE,OAAO,GAAM,QAAQ,EAAE,8BAA8B,eAAe;EACpE,UAAU,EAAE,yBAAyB,2CAA2C;YAE9E,IAUA,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,GAAD;IAAY,OAAO,EAAK,SAAS;IAAI,KAAK,EAAK;IAAQ,CAAA;GACvD,kBAAC,GAAD;IAAa,MAAM,kBAAC,GAAD,EAAS,WAAU,UAAW,CAAA;cAC9C,EACC,wBACA,4KACD;IACW,CAAA;GAEd,kBAAC,GAAD;IACE,YAAW;IACX,OAAO,CACL;KACE,IAAI;KACJ,OAAO,EAAE,4BAA4B,2BAA2B;KAChE,aAAa,EACX,gCACA,qDACD;KACD,MAAM,kBAAC,GAAD,EAAS,WAAU,UAAW,CAAA;KACpC,eAAe,EAAS,EAAS,GAAU,UAAU,CAAC;KACvD,CACF;IACD,CAAA;GAEF,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAW,WAAU;MAAQ,MAAA;MAAK,WAAU;gBAA5C,CACE,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAE,wBAAwB,UAAU;OAClC,CAAA,EACL,kBAAC,MAAD;OAAI,WAAU;iBAAd;QACE,kBAAC,GAAD;SAAW,OAAO,EAAE,yBAAyB,WAAW;SAAE,OAAO,EAAK;SAAY,CAAA;QAClF,kBAAC,GAAD;SACE,OAAO,EAAE,2BAA2B,aAAa;SACjD,OAAO,EAAK,cAAc,EAAE,mBAAmB,MAAM;SACrD,CAAA;QACF,kBAAC,GAAD;SACE,OAAO,EAAE,sBAAsB,QAAQ;SACvC,OAAO,EAAK,aAAa,EAAE,mBAAmB,MAAM;SACpD,CAAA;QACF,kBAAC,GAAD;SACE,OAAO,EAAE,sBAAsB,QAAQ;SACvC,OAAO,GAAG,EAAK,SAAS,GAAG,OAAO,EAAK,MAAM,CAAC,QAAQ,EAAE;SACxD,CAAA;QACC;SACK;SACZ,kBAAC,GAAD;MAAa,OAAO,EAAE,2BAA2B,aAAa;gBAC5D,kBAAC,MAAD;OAAI,WAAU;kBACV,EAAK,cAAc,EAAE,EAAE,KAAK,MAC5B,kBAAC,MAAD;QAAoB,WAAU;kBAA9B,CACE,kBAAC,GAAD;SACE,WAAU;SACV,eAAY;SACZ,CAAA,EACD,EACE;UANI,EAMJ,CACL;OACC,CAAA;MACO,CAAA,CACV;QACN,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;KACE,aAAY;KACZ,QAAQ,EAAK,MAAM;KACnB,UAAU,EAAK;KACf,WAAW,EAAK,SAAS;KACzB,UAAU,EAAK,YAAY;KAC3B,CAAA,EACE,CAAA,CACF;;GACL,EAAA,CAAA,GAhFH,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,8BAA8B,gBAAgB;GACvD,aAAa,EACX,oCACA,qDACD;GACD,CAAA;EA2EM,CAAA"}
1
+ {"version":3,"file":"TourDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/TourDetailsPage.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { CheckCircle2, Compass } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_TOUR_QUERY } from '../graphql';\nimport { useGGNomad } from '../providers/GGNomadProvider';\nimport { joinPath } from '../utils/navigation';\nimport { PageShell } from './PageShell';\nimport { DetailRow, SectionCard, DetailHero, BookingPanel, ReviewsSection } from '../components';\n\nexport function TourDetailsPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { basePath = '/' } = useGGNomad();\n const { id = '' } = useParams();\n const { data } = useQuery(\n GGNOMAD_TOUR_QUERY as TypedDocumentNode<\n {\n ggnomadTour: {\n id: string;\n name: string;\n duration: string;\n difficulty?: string;\n guideName?: string;\n currency: string;\n price: number;\n highlights: string[];\n images?: string[];\n } | null;\n },\n { id: string }\n >,\n { variables: { id }, skip: !id }\n );\n const tour = data?.ggnomadTour;\n\n return (\n <PageShell\n title={tour?.name ?? t('ggnomad.tour.fallbackTitle', 'Tour details')}\n subtitle={t('ggnomad.tour.subtitle', 'Tour package details and booking context')}\n >\n {!tour ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.tour.notFoundTitle', 'No tour found')}\n description={t(\n 'ggnomad.tour.notFoundDescription',\n 'This tour is unavailable or may have been removed.'\n )}\n />\n ) : (\n <>\n <DetailHero image={tour.images?.[0]} alt={tour.name} />\n <PagePurpose icon={<Compass className=\"size-4\" />}>\n {t(\n 'ggnomad.tour.purpose',\n 'See exactly what this tour involves — duration, difficulty, your guide, price and the highlights you’ll experience — so you can confirm it fits your trip before booking.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"ggnomad-tour-detail\"\n steps={[\n {\n id: 'browse',\n label: t('ggnomad.tour.next.browse', 'Explore more experiences'),\n description: t(\n 'ggnomad.tour.next.browseDesc',\n 'Return to Tourism to compare tours and activities.'\n ),\n icon: <Compass className=\"size-4\" />,\n onClick: () => navigate(joinPath(basePath, 'tourism')),\n },\n ]}\n />\n\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <div className=\"lg:col-span-2 space-y-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam p-5\">\n <h2 className=\"mb-4 text-lg font-medium tracking-tight text-text-primary\">\n {t('ggnomad.tour.details', 'Details')}\n </h2>\n <dl className=\"space-y-2 text-sm\">\n <DetailRow label={t('ggnomad.tour.duration', 'Duration')} value={tour.duration} />\n <DetailRow\n label={t('ggnomad.tour.difficulty', 'Difficulty')}\n value={tour.difficulty ?? t('ggnomad.tour.na', 'N/A')}\n />\n <DetailRow\n label={t('ggnomad.tour.guide', 'Guide')}\n value={tour.guideName ?? t('ggnomad.tour.na', 'N/A')}\n />\n <DetailRow\n label={t('ggnomad.tour.price', 'Price')}\n value={`${tour.currency} ${Number(tour.price).toFixed(2)}`}\n />\n </dl>\n </GlassCard>\n <SectionCard title={t('ggnomad.tour.highlights', 'Highlights')}>\n <ul className=\"space-y-2 text-sm\">\n {(tour.highlights ?? []).map((highlight) => (\n <li key={highlight} className=\"flex items-start gap-2 text-text-primary\">\n <CheckCircle2\n className=\"mt-0.5 size-4 flex-shrink-0 text-status-success-text\"\n aria-hidden=\"true\"\n />\n {highlight}\n </li>\n ))}\n </ul>\n </SectionCard>\n <ReviewsSection targetType=\"TOUR\" targetId={tour.id ?? id} />\n </div>\n <div>\n <BookingPanel\n bookingType=\"TOUR\"\n itemId={tour.id ?? id}\n itemName={tour.name}\n unitPrice={tour.price ?? 0}\n currency={tour.currency ?? 'USD'}\n />\n </div>\n </div>\n </>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAaA,SAAgB,IAAkB;CAChC,IAAM,EAAE,SAAM,GAAS,EACjB,IAAW,GAAa,EACxB,EAAE,cAAW,QAAQ,GAAY,EACjC,EAAE,QAAK,OAAO,GAAW,EACzB,EAAE,YAAS,EACf,GAgBA;EAAE,WAAW,EAAE,OAAI;EAAE,MAAM,CAAC;EAAI,CACjC,EACK,IAAO,GAAM;AAEnB,QACE,kBAAC,GAAD;EACE,OAAO,GAAM,QAAQ,EAAE,8BAA8B,eAAe;EACpE,UAAU,EAAE,yBAAyB,2CAA2C;YAE9E,IAUA,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,GAAD;IAAY,OAAO,EAAK,SAAS;IAAI,KAAK,EAAK;IAAQ,CAAA;GACvD,kBAAC,GAAD;IAAa,MAAM,kBAAC,GAAD,EAAS,WAAU,UAAW,CAAA;cAC9C,EACC,wBACA,4KACD;IACW,CAAA;GAEd,kBAAC,GAAD;IACE,YAAW;IACX,OAAO,CACL;KACE,IAAI;KACJ,OAAO,EAAE,4BAA4B,2BAA2B;KAChE,aAAa,EACX,gCACA,qDACD;KACD,MAAM,kBAAC,GAAD,EAAS,WAAU,UAAW,CAAA;KACpC,eAAe,EAAS,EAAS,GAAU,UAAU,CAAC;KACvD,CACF;IACD,CAAA;GAEF,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OAAW,WAAU;OAAQ,MAAA;OAAK,WAAU;iBAA5C,CACE,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAE,wBAAwB,UAAU;QAClC,CAAA,EACL,kBAAC,MAAD;QAAI,WAAU;kBAAd;SACE,kBAAC,GAAD;UAAW,OAAO,EAAE,yBAAyB,WAAW;UAAE,OAAO,EAAK;UAAY,CAAA;SAClF,kBAAC,GAAD;UACE,OAAO,EAAE,2BAA2B,aAAa;UACjD,OAAO,EAAK,cAAc,EAAE,mBAAmB,MAAM;UACrD,CAAA;SACF,kBAAC,GAAD;UACE,OAAO,EAAE,sBAAsB,QAAQ;UACvC,OAAO,EAAK,aAAa,EAAE,mBAAmB,MAAM;UACpD,CAAA;SACF,kBAAC,GAAD;UACE,OAAO,EAAE,sBAAsB,QAAQ;UACvC,OAAO,GAAG,EAAK,SAAS,GAAG,OAAO,EAAK,MAAM,CAAC,QAAQ,EAAE;UACxD,CAAA;SACC;UACK;;MACZ,kBAAC,GAAD;OAAa,OAAO,EAAE,2BAA2B,aAAa;iBAC5D,kBAAC,MAAD;QAAI,WAAU;mBACV,EAAK,cAAc,EAAE,EAAE,KAAK,MAC5B,kBAAC,MAAD;SAAoB,WAAU;mBAA9B,CACE,kBAAC,GAAD;UACE,WAAU;UACV,eAAY;UACZ,CAAA,EACD,EACE;WANI,EAMJ,CACL;QACC,CAAA;OACO,CAAA;MACd,kBAAC,GAAD;OAAgB,YAAW;OAAO,UAAU,EAAK,MAAM;OAAM,CAAA;MACzD;QACN,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;KACE,aAAY;KACZ,QAAQ,EAAK,MAAM;KACnB,UAAU,EAAK;KACf,WAAW,EAAK,SAAS;KACzB,UAAU,EAAK,YAAY;KAC3B,CAAA,EACE,CAAA,CACF;;GACL,EAAA,CAAA,GAjFH,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,8BAA8B,gBAAgB;GACvD,aAAa,EACX,oCACA,qDACD;GACD,CAAA;EA4EM,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-ggnomad",
3
- "version": "2026.705.5",
3
+ "version": "2026.705.6",
4
4
  "description": "Burdenoff GGNomad Microfrontend",
5
5
  "type": "module",
6
6
  "files": [