@burdenoff/microfe-ggnomad 2026.705.2 → 2026.705.4
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/dist/ggnomad/GGNomadRoot.js +60 -53
- package/dist/ggnomad/GGNomadRoot.js.map +1 -1
- package/dist/ggnomad/GGNomadRoutes.js +13 -5
- package/dist/ggnomad/GGNomadRoutes.js.map +1 -1
- package/dist/ggnomad/components/BookingPanel.js +219 -0
- package/dist/ggnomad/components/BookingPanel.js.map +1 -0
- package/dist/ggnomad/components/index.js +1 -0
- package/dist/ggnomad/graphql.js +109 -2
- package/dist/ggnomad/graphql.js.map +1 -1
- package/dist/ggnomad/pages/ActivityDetailsPage.js +51 -47
- package/dist/ggnomad/pages/ActivityDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/BookingsPage.js +1 -1
- package/dist/ggnomad/pages/EventDetailsPage.js +54 -49
- package/dist/ggnomad/pages/EventDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/FavoritesPage.js +1 -1
- package/dist/ggnomad/pages/PropertyDetailsPage.js +56 -51
- package/dist/ggnomad/pages/PropertyDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/TourDetailsPage.js +53 -49
- package/dist/ggnomad/pages/TourDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/TripPlanDetailPage.js +605 -0
- package/dist/ggnomad/pages/TripPlanDetailPage.js.map +1 -0
- package/dist/ggnomad/pages/TripsPage.js +181 -0
- package/dist/ggnomad/pages/TripsPage.js.map +1 -0
- package/package.json +1 -1
|
@@ -3,10 +3,11 @@ import { PageShell as t } from "./PageShell.js";
|
|
|
3
3
|
import { SectionCard as n } from "../components/SectionCard.js";
|
|
4
4
|
import { DetailRow as r } from "../components/DetailRow.js";
|
|
5
5
|
import { DetailHero as i } from "../components/DetailHero.js";
|
|
6
|
-
import "../components/index.js";
|
|
7
6
|
import { useGGNomad as a } from "../providers/GGNomadProvider.js";
|
|
8
7
|
import { joinPath as o } from "../utils/navigation.js";
|
|
9
|
-
import {
|
|
8
|
+
import { BookingPanel as s } from "../components/BookingPanel.js";
|
|
9
|
+
import "../components/index.js";
|
|
10
|
+
import { Hotel as c } from "lucide-react";
|
|
10
11
|
import { useI18n as l } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
11
12
|
import { useNavigate as u, useParams as d } from "react-router-dom";
|
|
12
13
|
import { useQuery as f } from "@apollo/client/react";
|
|
@@ -33,12 +34,6 @@ function b() {
|
|
|
33
34
|
/* @__PURE__ */ v(h, {
|
|
34
35
|
storageKey: "ggnomad-property-detail",
|
|
35
36
|
steps: [{
|
|
36
|
-
id: "book",
|
|
37
|
-
label: b("ggnomad.property.next.book", "Book this stay"),
|
|
38
|
-
description: b("ggnomad.property.next.bookDesc", "Reserve these dates and track it under Bookings."),
|
|
39
|
-
icon: /* @__PURE__ */ v(s, { className: "size-4" }),
|
|
40
|
-
onClick: () => x(o(S, "bookings"))
|
|
41
|
-
}, {
|
|
42
37
|
id: "browse",
|
|
43
38
|
label: b("ggnomad.property.next.browse", "Compare other stays"),
|
|
44
39
|
description: b("ggnomad.property.next.browseDesc", "Go back to hospitality listings to compare options."),
|
|
@@ -47,56 +42,66 @@ function b() {
|
|
|
47
42
|
}]
|
|
48
43
|
}),
|
|
49
44
|
/* @__PURE__ */ y("div", {
|
|
50
|
-
className: "grid gap-4 lg:grid-cols-
|
|
51
|
-
children: [/* @__PURE__ */ y(
|
|
52
|
-
|
|
53
|
-
children: [
|
|
54
|
-
|
|
55
|
-
className: "text-sm text-text-secondary",
|
|
56
|
-
children: b("ggnomad.property.type", "Type")
|
|
57
|
-
}),
|
|
58
|
-
/* @__PURE__ */ v("p", {
|
|
59
|
-
className: "text-text-primary",
|
|
60
|
-
children: T.type
|
|
61
|
-
}),
|
|
62
|
-
/* @__PURE__ */ v("p", {
|
|
63
|
-
className: "mt-3 text-sm text-text-secondary",
|
|
64
|
-
children: b("ggnomad.property.description", "Description")
|
|
65
|
-
}),
|
|
66
|
-
/* @__PURE__ */ v("p", {
|
|
67
|
-
className: "text-text-primary",
|
|
68
|
-
children: T.description ?? b("ggnomad.property.noDescription", "No description")
|
|
69
|
-
})
|
|
70
|
-
]
|
|
71
|
-
}), /* @__PURE__ */ y(p, {
|
|
72
|
-
treatment: "glass",
|
|
73
|
-
glow: !0,
|
|
74
|
-
className: "border-border-seam p-5",
|
|
75
|
-
children: [/* @__PURE__ */ v("h2", {
|
|
76
|
-
className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
|
|
77
|
-
children: b("ggnomad.property.details", "Details")
|
|
78
|
-
}), /* @__PURE__ */ y("dl", {
|
|
79
|
-
className: "space-y-2 text-sm",
|
|
45
|
+
className: "grid gap-4 lg:grid-cols-3",
|
|
46
|
+
children: [/* @__PURE__ */ y("div", {
|
|
47
|
+
className: "lg:col-span-2 space-y-4",
|
|
48
|
+
children: [/* @__PURE__ */ y(n, {
|
|
49
|
+
title: b("ggnomad.property.about", "About"),
|
|
80
50
|
children: [
|
|
81
|
-
/* @__PURE__ */ v(
|
|
82
|
-
|
|
83
|
-
|
|
51
|
+
/* @__PURE__ */ v("p", {
|
|
52
|
+
className: "text-sm text-text-secondary",
|
|
53
|
+
children: b("ggnomad.property.type", "Type")
|
|
84
54
|
}),
|
|
85
|
-
/* @__PURE__ */ v(
|
|
86
|
-
|
|
87
|
-
|
|
55
|
+
/* @__PURE__ */ v("p", {
|
|
56
|
+
className: "text-text-primary",
|
|
57
|
+
children: T.type
|
|
88
58
|
}),
|
|
89
|
-
/* @__PURE__ */ v(
|
|
90
|
-
|
|
91
|
-
|
|
59
|
+
/* @__PURE__ */ v("p", {
|
|
60
|
+
className: "mt-3 text-sm text-text-secondary",
|
|
61
|
+
children: b("ggnomad.property.description", "Description")
|
|
92
62
|
}),
|
|
93
|
-
/* @__PURE__ */ v(
|
|
94
|
-
|
|
95
|
-
|
|
63
|
+
/* @__PURE__ */ v("p", {
|
|
64
|
+
className: "text-text-primary",
|
|
65
|
+
children: T.description ?? b("ggnomad.property.noDescription", "No description")
|
|
96
66
|
})
|
|
97
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",
|
|
77
|
+
children: [
|
|
78
|
+
/* @__PURE__ */ v(r, {
|
|
79
|
+
label: b("ggnomad.property.price", "Price"),
|
|
80
|
+
value: `${T.currency} ${Number(T.pricePerNight).toFixed(2)}`
|
|
81
|
+
}),
|
|
82
|
+
/* @__PURE__ */ v(r, {
|
|
83
|
+
label: b("ggnomad.property.guests", "Guests"),
|
|
84
|
+
value: String(T.maxGuests)
|
|
85
|
+
}),
|
|
86
|
+
/* @__PURE__ */ v(r, {
|
|
87
|
+
label: b("ggnomad.property.rating", "Rating"),
|
|
88
|
+
value: String(T.rating ?? b("ggnomad.property.noRating", "N/A"))
|
|
89
|
+
}),
|
|
90
|
+
/* @__PURE__ */ v(r, {
|
|
91
|
+
label: b("ggnomad.property.provider", "Provider"),
|
|
92
|
+
value: T.provider?.name ?? b("ggnomad.property.unassigned", "Unassigned")
|
|
93
|
+
})
|
|
94
|
+
]
|
|
95
|
+
})]
|
|
98
96
|
})]
|
|
99
|
-
})
|
|
97
|
+
}), /* @__PURE__ */ v("div", { children: /* @__PURE__ */ v(s, {
|
|
98
|
+
bookingType: "PROPERTY",
|
|
99
|
+
itemId: T.id ?? C,
|
|
100
|
+
itemName: T.name,
|
|
101
|
+
unitPrice: T.pricePerNight ?? 0,
|
|
102
|
+
currency: T.currency ?? "USD",
|
|
103
|
+
nights: 1
|
|
104
|
+
}) })]
|
|
100
105
|
})
|
|
101
106
|
] }) : /* @__PURE__ */ v(m, {
|
|
102
107
|
illustration: "empty-data",
|
|
@@ -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 {
|
|
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"}
|
|
@@ -3,10 +3,11 @@ import { PageShell as t } from "./PageShell.js";
|
|
|
3
3
|
import { SectionCard as n } from "../components/SectionCard.js";
|
|
4
4
|
import { DetailRow as r } from "../components/DetailRow.js";
|
|
5
5
|
import { DetailHero as i } from "../components/DetailHero.js";
|
|
6
|
-
import "../components/index.js";
|
|
7
6
|
import { useGGNomad as a } from "../providers/GGNomadProvider.js";
|
|
8
7
|
import { joinPath as o } from "../utils/navigation.js";
|
|
9
|
-
import {
|
|
8
|
+
import { BookingPanel as s } from "../components/BookingPanel.js";
|
|
9
|
+
import "../components/index.js";
|
|
10
|
+
import { CheckCircle2 as c, Compass as l } from "lucide-react";
|
|
10
11
|
import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
11
12
|
import { useNavigate as d, useParams as f } from "react-router-dom";
|
|
12
13
|
import { useQuery as p } from "@apollo/client/react";
|
|
@@ -33,12 +34,6 @@ function x() {
|
|
|
33
34
|
/* @__PURE__ */ y(g, {
|
|
34
35
|
storageKey: "ggnomad-tour-detail",
|
|
35
36
|
steps: [{
|
|
36
|
-
id: "book",
|
|
37
|
-
label: x("ggnomad.tour.next.book", "Book this tour"),
|
|
38
|
-
description: x("ggnomad.tour.next.bookDesc", "Add it to your itinerary and track it under Bookings."),
|
|
39
|
-
icon: /* @__PURE__ */ y(s, { className: "size-4" }),
|
|
40
|
-
onClick: () => S(o(C, "bookings"))
|
|
41
|
-
}, {
|
|
42
37
|
id: "browse",
|
|
43
38
|
label: x("ggnomad.tour.next.browse", "Explore more experiences"),
|
|
44
39
|
description: x("ggnomad.tour.next.browseDesc", "Return to Tourism to compare tours and activities."),
|
|
@@ -47,48 +42,57 @@ function x() {
|
|
|
47
42
|
}]
|
|
48
43
|
}),
|
|
49
44
|
/* @__PURE__ */ b("div", {
|
|
50
|
-
className: "grid gap-4 lg:grid-cols-
|
|
51
|
-
children: [/* @__PURE__ */ b(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
className: "
|
|
57
|
-
children:
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
45
|
+
className: "grid gap-4 lg:grid-cols-3",
|
|
46
|
+
children: [/* @__PURE__ */ b("div", {
|
|
47
|
+
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))
|
|
87
|
+
})
|
|
78
88
|
})]
|
|
79
|
-
}), /* @__PURE__ */ y(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
className: "mt-0.5 size-4 flex-shrink-0 text-status-success-text",
|
|
87
|
-
"aria-hidden": "true"
|
|
88
|
-
}), e]
|
|
89
|
-
}, e))
|
|
90
|
-
})
|
|
91
|
-
})]
|
|
89
|
+
}), /* @__PURE__ */ y("div", { children: /* @__PURE__ */ y(s, {
|
|
90
|
+
bookingType: "TOUR",
|
|
91
|
+
itemId: E.id ?? w,
|
|
92
|
+
itemName: E.name,
|
|
93
|
+
unitPrice: E.price ?? 0,
|
|
94
|
+
currency: E.currency ?? "USD"
|
|
95
|
+
}) })]
|
|
92
96
|
})
|
|
93
97
|
] }) : /* @__PURE__ */ y(h, {
|
|
94
98
|
illustration: "empty-data",
|
|
@@ -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 {
|
|
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"}
|