@burdenoff/microfe-ggnomad 2026.704.1 → 2026.705.2
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/components/DetailHero.js +22 -0
- package/dist/ggnomad/components/DetailHero.js.map +1 -0
- package/dist/ggnomad/components/EntityCard.js +36 -22
- package/dist/ggnomad/components/EntityCard.js.map +1 -1
- package/dist/ggnomad/components/LoadMoreButton.js +19 -0
- package/dist/ggnomad/components/LoadMoreButton.js.map +1 -0
- package/dist/ggnomad/components/index.js +2 -0
- package/dist/ggnomad/pages/ActivityDetailsPage.js +60 -53
- package/dist/ggnomad/pages/ActivityDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/EntertainmentPage.js +45 -34
- package/dist/ggnomad/pages/EntertainmentPage.js.map +1 -1
- package/dist/ggnomad/pages/EventDetailsPage.js +60 -53
- package/dist/ggnomad/pages/EventDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/HospitalityPage.js +51 -40
- package/dist/ggnomad/pages/HospitalityPage.js.map +1 -1
- package/dist/ggnomad/pages/PropertyDetailsPage.js +65 -58
- package/dist/ggnomad/pages/PropertyDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/ProviderPage.js +70 -61
- package/dist/ggnomad/pages/ProviderPage.js.map +1 -1
- package/dist/ggnomad/pages/TourDetailsPage.js +60 -53
- package/dist/ggnomad/pages/TourDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/TourismPage.js +50 -40
- package/dist/ggnomad/pages/TourismPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,80 +2,87 @@ import { GGNOMAD_EVENT_QUERY as e } from "../graphql.js";
|
|
|
2
2
|
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
|
+
import { DetailHero as i } from "../components/DetailHero.js";
|
|
5
6
|
import "../components/index.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
7
|
+
import { useGGNomad as a } from "../providers/GGNomadProvider.js";
|
|
8
|
+
import { joinPath as o } from "../utils/navigation.js";
|
|
9
|
+
import { CalendarCheck as s, Mic2 as c, Ticket as l } from "lucide-react";
|
|
10
|
+
import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
11
|
+
import { useNavigate as d, useParams as f } from "react-router-dom";
|
|
12
|
+
import { useQuery as p } from "@apollo/client/react";
|
|
13
|
+
import { GlassCard as m, IllustratedEmptyState as h, NextSteps as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
|
|
14
|
+
import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
12
15
|
//#region src/ggnomad/pages/EventDetailsPage.tsx
|
|
13
|
-
function
|
|
14
|
-
let { t:
|
|
15
|
-
variables: { id:
|
|
16
|
-
skip: !
|
|
17
|
-
}),
|
|
18
|
-
return /* @__PURE__ */
|
|
19
|
-
title:
|
|
20
|
-
subtitle:
|
|
21
|
-
children:
|
|
22
|
-
/* @__PURE__ */
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
function x() {
|
|
17
|
+
let { t: x } = u(), S = d(), { basePath: C = "/" } = a(), { id: w = "" } = f(), { data: T } = p(e, {
|
|
18
|
+
variables: { id: w },
|
|
19
|
+
skip: !w
|
|
20
|
+
}), E = T?.ggnomadEvent;
|
|
21
|
+
return /* @__PURE__ */ y(t, {
|
|
22
|
+
title: E?.name ?? x("ggnomad.event.fallbackTitle", "Event details"),
|
|
23
|
+
subtitle: x("ggnomad.event.subtitle", "Live event details, venue and lineup"),
|
|
24
|
+
children: E ? /* @__PURE__ */ b(v, { children: [
|
|
25
|
+
/* @__PURE__ */ y(i, {
|
|
26
|
+
image: E.images?.[0],
|
|
27
|
+
alt: E.name
|
|
25
28
|
}),
|
|
26
|
-
/* @__PURE__ */
|
|
29
|
+
/* @__PURE__ */ y(_, {
|
|
30
|
+
icon: /* @__PURE__ */ y(l, { className: "size-4" }),
|
|
31
|
+
children: x("ggnomad.event.purpose", "All the details for this live event in one place — category, start and end times, ticket price and the full lineup — so you can decide and book tickets before they sell out.")
|
|
32
|
+
}),
|
|
33
|
+
/* @__PURE__ */ y(g, {
|
|
27
34
|
storageKey: "ggnomad-event-detail",
|
|
28
35
|
steps: [{
|
|
29
36
|
id: "book",
|
|
30
|
-
label:
|
|
31
|
-
description:
|
|
32
|
-
icon: /* @__PURE__ */
|
|
33
|
-
onClick: () =>
|
|
37
|
+
label: x("ggnomad.event.next.book", "Book tickets"),
|
|
38
|
+
description: x("ggnomad.event.next.bookDesc", "Reserve seats and track them under Bookings."),
|
|
39
|
+
icon: /* @__PURE__ */ y(s, { className: "size-4" }),
|
|
40
|
+
onClick: () => S(o(C, "bookings"))
|
|
34
41
|
}, {
|
|
35
42
|
id: "browse",
|
|
36
|
-
label:
|
|
37
|
-
description:
|
|
38
|
-
icon: /* @__PURE__ */
|
|
39
|
-
onClick: () =>
|
|
43
|
+
label: x("ggnomad.event.next.browse", "See more events"),
|
|
44
|
+
description: x("ggnomad.event.next.browseDesc", "Return to Entertainment for other live experiences."),
|
|
45
|
+
icon: /* @__PURE__ */ y(l, { className: "size-4" }),
|
|
46
|
+
onClick: () => S(o(C, "entertainment"))
|
|
40
47
|
}]
|
|
41
48
|
}),
|
|
42
|
-
/* @__PURE__ */
|
|
49
|
+
/* @__PURE__ */ b("div", {
|
|
43
50
|
className: "grid gap-4 lg:grid-cols-2",
|
|
44
|
-
children: [/* @__PURE__ */
|
|
51
|
+
children: [/* @__PURE__ */ b(m, {
|
|
45
52
|
treatment: "glass",
|
|
46
53
|
glow: !0,
|
|
47
54
|
className: "border-border-seam p-5",
|
|
48
|
-
children: [/* @__PURE__ */
|
|
55
|
+
children: [/* @__PURE__ */ y("h2", {
|
|
49
56
|
className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
|
|
50
|
-
children:
|
|
51
|
-
}), /* @__PURE__ */
|
|
57
|
+
children: x("ggnomad.event.details", "Details")
|
|
58
|
+
}), /* @__PURE__ */ b("dl", {
|
|
52
59
|
className: "space-y-2 text-sm",
|
|
53
60
|
children: [
|
|
54
|
-
/* @__PURE__ */
|
|
55
|
-
label:
|
|
56
|
-
value:
|
|
61
|
+
/* @__PURE__ */ y(r, {
|
|
62
|
+
label: x("ggnomad.event.category", "Category"),
|
|
63
|
+
value: E.category
|
|
57
64
|
}),
|
|
58
|
-
/* @__PURE__ */
|
|
59
|
-
label:
|
|
60
|
-
value: new Date(
|
|
65
|
+
/* @__PURE__ */ y(r, {
|
|
66
|
+
label: x("ggnomad.event.starts", "Starts"),
|
|
67
|
+
value: new Date(E.startsAt).toLocaleString()
|
|
61
68
|
}),
|
|
62
|
-
/* @__PURE__ */
|
|
63
|
-
label:
|
|
64
|
-
value:
|
|
69
|
+
/* @__PURE__ */ y(r, {
|
|
70
|
+
label: x("ggnomad.event.ends", "Ends"),
|
|
71
|
+
value: E.endsAt ? new Date(E.endsAt).toLocaleString() : x("ggnomad.event.na", "N/A")
|
|
65
72
|
}),
|
|
66
|
-
/* @__PURE__ */
|
|
67
|
-
label:
|
|
68
|
-
value: `${
|
|
73
|
+
/* @__PURE__ */ y(r, {
|
|
74
|
+
label: x("ggnomad.event.price", "Price"),
|
|
75
|
+
value: `${E.currency} ${Number(E.price).toFixed(2)}`
|
|
69
76
|
})
|
|
70
77
|
]
|
|
71
78
|
})]
|
|
72
|
-
}), /* @__PURE__ */
|
|
73
|
-
title:
|
|
74
|
-
children: /* @__PURE__ */
|
|
79
|
+
}), /* @__PURE__ */ y(n, {
|
|
80
|
+
title: x("ggnomad.event.performers", "Performers"),
|
|
81
|
+
children: /* @__PURE__ */ y("ul", {
|
|
75
82
|
className: "space-y-2 text-sm",
|
|
76
|
-
children: (
|
|
83
|
+
children: (E.performers ?? []).map((e) => /* @__PURE__ */ b("li", {
|
|
77
84
|
className: "flex items-start gap-2 text-text-primary",
|
|
78
|
-
children: [/* @__PURE__ */
|
|
85
|
+
children: [/* @__PURE__ */ y(c, {
|
|
79
86
|
className: "mt-0.5 size-4 flex-shrink-0 text-action-primary-bg",
|
|
80
87
|
"aria-hidden": "true"
|
|
81
88
|
}), e]
|
|
@@ -83,14 +90,14 @@ function v() {
|
|
|
83
90
|
})
|
|
84
91
|
})]
|
|
85
92
|
})
|
|
86
|
-
] }) : /* @__PURE__ */
|
|
93
|
+
] }) : /* @__PURE__ */ y(h, {
|
|
87
94
|
illustration: "empty-data",
|
|
88
|
-
title:
|
|
89
|
-
description:
|
|
95
|
+
title: x("ggnomad.event.notFoundTitle", "No event found"),
|
|
96
|
+
description: x("ggnomad.event.notFoundDescription", "This event is unavailable or may have been removed.")
|
|
90
97
|
})
|
|
91
98
|
});
|
|
92
99
|
}
|
|
93
100
|
//#endregion
|
|
94
|
-
export {
|
|
101
|
+
export { x as EventDetailsPage };
|
|
95
102
|
|
|
96
103
|
//# sourceMappingURL=EventDetailsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/EventDetailsPage.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 { CalendarCheck, Mic2, Ticket } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_EVENT_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\nimport { DetailRow, SectionCard } from '../components';\n\nexport function EventDetailsPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { id = '' } = useParams();\n const { data } = useQuery(\n GGNOMAD_EVENT_QUERY as TypedDocumentNode<\n {\n ggnomadEvent: {\n name: string;\n category: string;\n startsAt: string;\n endsAt?: string;\n currency: string;\n price: number;\n performers: string[];\n } | null;\n },\n { id: string }\n >,\n { variables: { id }, skip: !id }\n );\n const event = data?.ggnomadEvent;\n\n return (\n <PageShell\n title={event?.name ?? t('ggnomad.event.fallbackTitle', 'Event details')}\n subtitle={t('ggnomad.event.subtitle', 'Live event details, venue and lineup')}\n >\n {!event ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.event.notFoundTitle', 'No event found')}\n description={t(\n 'ggnomad.event.notFoundDescription',\n 'This event is unavailable or may have been removed.'\n )}\n />\n ) : (\n <>\n <PagePurpose icon={<Ticket className=\"size-4\" />}>\n {t(\n 'ggnomad.event.purpose',\n 'All the details for this live event in one place — category, start and end times, ticket price and the full lineup — so you can decide and book tickets before they sell out.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"ggnomad-event-detail\"\n steps={[\n {\n id: 'book',\n label: t('ggnomad.event.next.book', 'Book tickets'),\n description: t(\n 'ggnomad.event.next.bookDesc',\n 'Reserve seats and track them under Bookings.'\n ),\n icon: <CalendarCheck className=\"size-4\" />,\n onClick: () => navigate('
|
|
1
|
+
{"version":3,"file":"EventDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/EventDetailsPage.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 { CalendarCheck, Mic2, Ticket } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_EVENT_QUERY } from '../graphql';\nimport { useGGNomad } from '../providers/GGNomadProvider';\nimport { joinPath } from '../utils/navigation';\nimport { PageShell } from './PageShell';\nimport { DetailRow, SectionCard, DetailHero } from '../components';\n\nexport function EventDetailsPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { basePath = '/' } = useGGNomad();\n const { id = '' } = useParams();\n const { data } = useQuery(\n GGNOMAD_EVENT_QUERY as TypedDocumentNode<\n {\n ggnomadEvent: {\n name: string;\n category: string;\n startsAt: string;\n endsAt?: string;\n currency: string;\n price: number;\n performers: string[];\n images?: string[];\n } | null;\n },\n { id: string }\n >,\n { variables: { id }, skip: !id }\n );\n const event = data?.ggnomadEvent;\n\n return (\n <PageShell\n title={event?.name ?? t('ggnomad.event.fallbackTitle', 'Event details')}\n subtitle={t('ggnomad.event.subtitle', 'Live event details, venue and lineup')}\n >\n {!event ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.event.notFoundTitle', 'No event found')}\n description={t(\n 'ggnomad.event.notFoundDescription',\n 'This event is unavailable or may have been removed.'\n )}\n />\n ) : (\n <>\n <DetailHero image={event.images?.[0]} alt={event.name} />\n <PagePurpose icon={<Ticket className=\"size-4\" />}>\n {t(\n 'ggnomad.event.purpose',\n 'All the details for this live event in one place — category, start and end times, ticket price and the full lineup — so you can decide and book tickets before they sell out.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"ggnomad-event-detail\"\n steps={[\n {\n id: 'book',\n label: t('ggnomad.event.next.book', 'Book tickets'),\n description: t(\n 'ggnomad.event.next.bookDesc',\n 'Reserve seats and track them under Bookings.'\n ),\n icon: <CalendarCheck className=\"size-4\" />,\n onClick: () => navigate(joinPath(basePath, 'bookings')),\n },\n {\n id: 'browse',\n label: t('ggnomad.event.next.browse', 'See more events'),\n description: t(\n 'ggnomad.event.next.browseDesc',\n 'Return to Entertainment for other live experiences.'\n ),\n icon: <Ticket className=\"size-4\" />,\n onClick: () => navigate(joinPath(basePath, 'entertainment')),\n },\n ]}\n />\n\n <div className=\"grid gap-4 lg:grid-cols-2\">\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.event.details', 'Details')}\n </h2>\n <dl className=\"space-y-2 text-sm\">\n <DetailRow label={t('ggnomad.event.category', 'Category')} value={event.category} />\n <DetailRow\n label={t('ggnomad.event.starts', 'Starts')}\n value={new Date(event.startsAt).toLocaleString()}\n />\n <DetailRow\n label={t('ggnomad.event.ends', 'Ends')}\n value={\n event.endsAt\n ? new Date(event.endsAt).toLocaleString()\n : t('ggnomad.event.na', 'N/A')\n }\n />\n <DetailRow\n label={t('ggnomad.event.price', 'Price')}\n value={`${event.currency} ${Number(event.price).toFixed(2)}`}\n />\n </dl>\n </GlassCard>\n <SectionCard title={t('ggnomad.event.performers', 'Performers')}>\n <ul className=\"space-y-2 text-sm\">\n {(event.performers ?? []).map((performer) => (\n <li key={performer} className=\"flex items-start gap-2 text-text-primary\">\n <Mic2\n className=\"mt-0.5 size-4 flex-shrink-0 text-action-primary-bg\"\n aria-hidden=\"true\"\n />\n {performer}\n </li>\n ))}\n </ul>\n </SectionCard>\n </div>\n </>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAaA,SAAgB,IAAmB;CACjC,IAAM,EAAE,SAAM,GAAS,EACjB,IAAW,GAAa,EACxB,EAAE,cAAW,QAAQ,GAAY,EACjC,EAAE,QAAK,OAAO,GAAW,EACzB,EAAE,YAAS,EACf,GAeA;EAAE,WAAW,EAAE,OAAI;EAAE,MAAM,CAAC;EAAI,CACjC,EACK,IAAQ,GAAM;AAEpB,QACE,kBAAC,GAAD;EACE,OAAO,GAAO,QAAQ,EAAE,+BAA+B,gBAAgB;EACvE,UAAU,EAAE,0BAA0B,uCAAuC;YAE3E,IAUA,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,GAAD;IAAY,OAAO,EAAM,SAAS;IAAI,KAAK,EAAM;IAAQ,CAAA;GACzD,kBAAC,GAAD;IAAa,MAAM,kBAAC,GAAD,EAAQ,WAAU,UAAW,CAAA;cAC7C,EACC,yBACA,gLACD;IACW,CAAA;GAEd,kBAAC,GAAD;IACE,YAAW;IACX,OAAO,CACL;KACE,IAAI;KACJ,OAAO,EAAE,2BAA2B,eAAe;KACnD,aAAa,EACX,+BACA,+CACD;KACD,MAAM,kBAAC,GAAD,EAAe,WAAU,UAAW,CAAA;KAC1C,eAAe,EAAS,EAAS,GAAU,WAAW,CAAC;KACxD,EACD;KACE,IAAI;KACJ,OAAO,EAAE,6BAA6B,kBAAkB;KACxD,aAAa,EACX,iCACA,sDACD;KACD,MAAM,kBAAC,GAAD,EAAQ,WAAU,UAAW,CAAA;KACnC,eAAe,EAAS,EAAS,GAAU,gBAAgB,CAAC;KAC7D,CACF;IACD,CAAA;GAEF,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAW,WAAU;KAAQ,MAAA;KAAK,WAAU;eAA5C,CACE,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAE,yBAAyB,UAAU;MACnC,CAAA,EACL,kBAAC,MAAD;MAAI,WAAU;gBAAd;OACE,kBAAC,GAAD;QAAW,OAAO,EAAE,0BAA0B,WAAW;QAAE,OAAO,EAAM;QAAY,CAAA;OACpF,kBAAC,GAAD;QACE,OAAO,EAAE,wBAAwB,SAAS;QAC1C,OAAO,IAAI,KAAK,EAAM,SAAS,CAAC,gBAAgB;QAChD,CAAA;OACF,kBAAC,GAAD;QACE,OAAO,EAAE,sBAAsB,OAAO;QACtC,OACE,EAAM,SACF,IAAI,KAAK,EAAM,OAAO,CAAC,gBAAgB,GACvC,EAAE,oBAAoB,MAAM;QAElC,CAAA;OACF,kBAAC,GAAD;QACE,OAAO,EAAE,uBAAuB,QAAQ;QACxC,OAAO,GAAG,EAAM,SAAS,GAAG,OAAO,EAAM,MAAM,CAAC,QAAQ,EAAE;QAC1D,CAAA;OACC;QACK;QACZ,kBAAC,GAAD;KAAa,OAAO,EAAE,4BAA4B,aAAa;eAC7D,kBAAC,MAAD;MAAI,WAAU;iBACV,EAAM,cAAc,EAAE,EAAE,KAAK,MAC7B,kBAAC,MAAD;OAAoB,WAAU;iBAA9B,CACE,kBAAC,GAAD;QACE,WAAU;QACV,eAAY;QACZ,CAAA,EACD,EACE;SANI,EAMJ,CACL;MACC,CAAA;KACO,CAAA,CACV;;GACL,EAAA,CAAA,GAnFH,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,+BAA+B,iBAAiB;GACzD,aAAa,EACX,qCACA,sDACD;GACD,CAAA;EA8EM,CAAA"}
|
|
@@ -1,56 +1,67 @@
|
|
|
1
1
|
import { GGNOMAD_PROPERTIES_QUERY as e } from "../graphql.js";
|
|
2
2
|
import { PageShell as t } from "./PageShell.js";
|
|
3
3
|
import { EntityCard as n } from "../components/EntityCard.js";
|
|
4
|
+
import { LoadMoreButton as r } from "../components/LoadMoreButton.js";
|
|
4
5
|
import "../components/index.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
6
|
+
import { useState as i } from "react";
|
|
7
|
+
import { Hotel as a, Star as o } from "lucide-react";
|
|
8
|
+
import { useI18n as s } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
9
|
+
import { useQuery as c } from "@apollo/client/react";
|
|
10
|
+
import { GlassCard as l, IllustratedEmptyState as u, PagePurpose as d } from "@burdenoff/fe-libs/ui";
|
|
11
|
+
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
10
12
|
//#region src/ggnomad/pages/HospitalityPage.tsx
|
|
11
|
-
function
|
|
12
|
-
let { t:
|
|
13
|
-
first:
|
|
13
|
+
function m() {
|
|
14
|
+
let { t: m } = s(), [h, g] = i(12), { data: _ } = c(e, { variables: {
|
|
15
|
+
first: h,
|
|
14
16
|
skip: 0
|
|
15
|
-
} }),
|
|
16
|
-
return /* @__PURE__ */
|
|
17
|
-
title:
|
|
18
|
-
titleAccent:
|
|
19
|
-
subtitle:
|
|
20
|
-
children: [/* @__PURE__ */
|
|
21
|
-
icon: /* @__PURE__ */
|
|
22
|
-
children:
|
|
23
|
-
}),
|
|
17
|
+
} }), v = _?.ggnomadProperties ?? [];
|
|
18
|
+
return /* @__PURE__ */ p(t, {
|
|
19
|
+
title: m("ggnomad.hospitality.title", "Hospitality"),
|
|
20
|
+
titleAccent: m("ggnomad.hospitality.title.accent", "Hospitality"),
|
|
21
|
+
subtitle: m("ggnomad.hospitality.subtitle", "Property discovery powered by live GraphQL data"),
|
|
22
|
+
children: [/* @__PURE__ */ f(d, {
|
|
23
|
+
icon: /* @__PURE__ */ f(a, { className: "size-4" }),
|
|
24
|
+
children: m("ggnomad.hospitality.purpose", "Discover places to stay — hotels, homestays and short-stay rentals. Open any property to review its nightly price, guest capacity and rating, then create a booking for the dates you need.")
|
|
25
|
+
}), v.length === 0 ? /* @__PURE__ */ f(u, {
|
|
24
26
|
illustration: "empty-data",
|
|
25
|
-
title:
|
|
26
|
-
description:
|
|
27
|
-
}) : /* @__PURE__ */
|
|
27
|
+
title: m("ggnomad.hospitality.emptyTitle", "No properties available"),
|
|
28
|
+
description: m("ggnomad.hospitality.emptyDescription", "Properties published by providers will be discoverable here.")
|
|
29
|
+
}) : /* @__PURE__ */ p(l, {
|
|
28
30
|
treatment: "glass",
|
|
29
31
|
glow: !0,
|
|
30
32
|
className: "border-border-seam p-5",
|
|
31
|
-
children: [
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ f("h2", {
|
|
35
|
+
className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
|
|
36
|
+
children: m("ggnomad.hospitality.featuredStays", "Featured stays")
|
|
37
|
+
}),
|
|
38
|
+
/* @__PURE__ */ f("div", {
|
|
39
|
+
className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3",
|
|
40
|
+
children: v.map((e) => /* @__PURE__ */ f(n, {
|
|
41
|
+
to: e.id,
|
|
42
|
+
image: e.images?.[0],
|
|
43
|
+
imageAlt: e.name,
|
|
44
|
+
title: e.name,
|
|
45
|
+
meta: e.type,
|
|
46
|
+
price: `${e.currency} ${Number(e.pricePerNight).toFixed(2)} ${m("ggnomad.hospitality.card.perNight", "per night")}`,
|
|
47
|
+
footer: /* @__PURE__ */ p("span", {
|
|
48
|
+
className: "inline-flex items-center gap-1 tabular-nums",
|
|
49
|
+
children: [/* @__PURE__ */ f(o, {
|
|
50
|
+
className: "size-3.5 text-status-warning-text",
|
|
51
|
+
"aria-hidden": "true"
|
|
52
|
+
}), e.rating ?? m("ggnomad.hospitality.card.noRating", "N/A")]
|
|
53
|
+
})
|
|
54
|
+
}, e.id))
|
|
55
|
+
}),
|
|
56
|
+
/* @__PURE__ */ f(r, {
|
|
57
|
+
visible: v.length >= h,
|
|
58
|
+
onLoadMore: () => g((e) => e + 12)
|
|
59
|
+
})
|
|
60
|
+
]
|
|
50
61
|
})]
|
|
51
62
|
});
|
|
52
63
|
}
|
|
53
64
|
//#endregion
|
|
54
|
-
export {
|
|
65
|
+
export { m as HospitalityPage };
|
|
55
66
|
|
|
56
67
|
//# sourceMappingURL=HospitalityPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HospitalityPage.js","names":[],"sources":["../../../src/ggnomad/pages/HospitalityPage.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 { Hotel, Star } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_PROPERTIES_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\nimport { EntityCard } from '../components';\n\nexport function HospitalityPage() {\n const { t } = useI18n();\n const { data } = useQuery(\n GGNOMAD_PROPERTIES_QUERY as TypedDocumentNode<\n {\n ggnomadProperties: Array<{\n id: string;\n name: string;\n type: string;\n pricePerNight: number;\n currency: string;\n rating?: number;\n }>;\n },\n { first: number; skip: number }\n >,\n { variables: { first:
|
|
1
|
+
{"version":3,"file":"HospitalityPage.js","names":[],"sources":["../../../src/ggnomad/pages/HospitalityPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useQuery } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Hotel, Star } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_PROPERTIES_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\nimport { EntityCard, LoadMoreButton } from '../components';\n\nexport function HospitalityPage() {\n const { t } = useI18n();\n const [limit, setLimit] = useState(12);\n const { data } = useQuery(\n GGNOMAD_PROPERTIES_QUERY as TypedDocumentNode<\n {\n ggnomadProperties: Array<{\n id: string;\n name: string;\n type: string;\n pricePerNight: number;\n currency: string;\n rating?: number;\n images?: string[];\n }>;\n },\n { first: number; skip: number }\n >,\n { variables: { first: limit, skip: 0 } }\n );\n const properties = data?.ggnomadProperties ?? [];\n\n return (\n <PageShell\n title={t('ggnomad.hospitality.title', 'Hospitality')}\n titleAccent={t('ggnomad.hospitality.title.accent', 'Hospitality')}\n subtitle={t(\n 'ggnomad.hospitality.subtitle',\n 'Property discovery powered by live GraphQL data'\n )}\n >\n <PagePurpose icon={<Hotel className=\"size-4\" />}>\n {t(\n 'ggnomad.hospitality.purpose',\n 'Discover places to stay — hotels, homestays and short-stay rentals. Open any property to review its nightly price, guest capacity and rating, then create a booking for the dates you need.'\n )}\n </PagePurpose>\n\n {properties.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.hospitality.emptyTitle', 'No properties available')}\n description={t(\n 'ggnomad.hospitality.emptyDescription',\n 'Properties published by providers will be discoverable here.'\n )}\n />\n ) : (\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.hospitality.featuredStays', 'Featured stays')}\n </h2>\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {properties.map((property) => (\n <EntityCard\n key={property.id}\n to={property.id}\n image={property.images?.[0]}\n imageAlt={property.name}\n title={property.name}\n meta={property.type}\n price={`${property.currency} ${Number(property.pricePerNight).toFixed(2)} ${t(\n 'ggnomad.hospitality.card.perNight',\n 'per night'\n )}`}\n footer={\n <span className=\"inline-flex items-center gap-1 tabular-nums\">\n <Star className=\"size-3.5 text-status-warning-text\" aria-hidden=\"true\" />\n {property.rating ?? t('ggnomad.hospitality.card.noRating', 'N/A')}\n </span>\n }\n />\n ))}\n </div>\n <LoadMoreButton\n visible={properties.length >= limit}\n onLoadMore={() => setLimit((l) => l + 12)}\n />\n </GlassCard>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,IAAkB;CAChC,IAAM,EAAE,SAAM,GAAS,EACjB,CAAC,GAAO,KAAY,EAAS,GAAG,EAChC,EAAE,YAAS,EACf,GAcA,EAAE,WAAW;EAAE,OAAO;EAAO,MAAM;EAAG,EAAE,CACzC,EACK,IAAa,GAAM,qBAAqB,EAAE;AAEhD,QACE,kBAAC,GAAD;EACE,OAAO,EAAE,6BAA6B,cAAc;EACpD,aAAa,EAAE,oCAAoC,cAAc;EACjE,UAAU,EACR,gCACA,kDACD;YANH,CAQE,kBAAC,GAAD;GAAa,MAAM,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;aAC5C,EACC,+BACA,8LACD;GACW,CAAA,EAEb,EAAW,WAAW,IACrB,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,kCAAkC,0BAA0B;GACrE,aAAa,EACX,wCACA,+DACD;GACD,CAAA,GAEF,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAA5C;IACE,kBAAC,MAAD;KAAI,WAAU;eACX,EAAE,qCAAqC,iBAAiB;KACtD,CAAA;IACL,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAW,KAAK,MACf,kBAAC,GAAD;MAEE,IAAI,EAAS;MACb,OAAO,EAAS,SAAS;MACzB,UAAU,EAAS;MACnB,OAAO,EAAS;MAChB,MAAM,EAAS;MACf,OAAO,GAAG,EAAS,SAAS,GAAG,OAAO,EAAS,cAAc,CAAC,QAAQ,EAAE,CAAC,GAAG,EAC1E,qCACA,YACD;MACD,QACE,kBAAC,QAAD;OAAM,WAAU;iBAAhB,CACE,kBAAC,GAAD;QAAM,WAAU;QAAoC,eAAY;QAAS,CAAA,EACxE,EAAS,UAAU,EAAE,qCAAqC,MAAM,CAC5D;;MAET,EAhBK,EAAS,GAgBd,CACF;KACE,CAAA;IACN,kBAAC,GAAD;KACE,SAAS,EAAW,UAAU;KAC9B,kBAAkB,GAAU,MAAM,IAAI,GAAG;KACzC,CAAA;IACQ;KAEJ"}
|
|
@@ -2,103 +2,110 @@ import { GGNOMAD_PROPERTY_QUERY as e } from "../graphql.js";
|
|
|
2
2
|
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
|
+
import { DetailHero as i } from "../components/DetailHero.js";
|
|
5
6
|
import "../components/index.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
7
|
+
import { useGGNomad as a } from "../providers/GGNomadProvider.js";
|
|
8
|
+
import { joinPath as o } from "../utils/navigation.js";
|
|
9
|
+
import { CalendarCheck as s, Hotel as c } from "lucide-react";
|
|
10
|
+
import { useI18n as l } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
11
|
+
import { useNavigate as u, useParams as d } from "react-router-dom";
|
|
12
|
+
import { useQuery as f } from "@apollo/client/react";
|
|
13
|
+
import { GlassCard as p, IllustratedEmptyState as m, NextSteps as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
|
|
14
|
+
import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
12
15
|
//#region src/ggnomad/pages/PropertyDetailsPage.tsx
|
|
13
|
-
function
|
|
14
|
-
let { t:
|
|
15
|
-
variables: { id:
|
|
16
|
-
skip: !
|
|
17
|
-
}),
|
|
18
|
-
return /* @__PURE__ */
|
|
19
|
-
title:
|
|
20
|
-
subtitle:
|
|
21
|
-
children:
|
|
22
|
-
/* @__PURE__ */
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
function b() {
|
|
17
|
+
let { t: b } = l(), x = u(), { basePath: S = "/" } = a(), { id: C = "" } = d(), { data: w } = f(e, {
|
|
18
|
+
variables: { id: C },
|
|
19
|
+
skip: !C
|
|
20
|
+
}), T = w?.ggnomadProperty;
|
|
21
|
+
return /* @__PURE__ */ v(t, {
|
|
22
|
+
title: T?.name ?? b("ggnomad.property.fallbackTitle", "Property details"),
|
|
23
|
+
subtitle: b("ggnomad.property.subtitle", "Detailed hospitality listing view"),
|
|
24
|
+
children: T ? /* @__PURE__ */ y(_, { children: [
|
|
25
|
+
/* @__PURE__ */ v(i, {
|
|
26
|
+
image: T.images?.[0],
|
|
27
|
+
alt: T.name
|
|
25
28
|
}),
|
|
26
|
-
/* @__PURE__ */
|
|
29
|
+
/* @__PURE__ */ v(g, {
|
|
30
|
+
icon: /* @__PURE__ */ v(c, { className: "size-4" }),
|
|
31
|
+
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.")
|
|
32
|
+
}),
|
|
33
|
+
/* @__PURE__ */ v(h, {
|
|
27
34
|
storageKey: "ggnomad-property-detail",
|
|
28
35
|
steps: [{
|
|
29
36
|
id: "book",
|
|
30
|
-
label:
|
|
31
|
-
description:
|
|
32
|
-
icon: /* @__PURE__ */
|
|
33
|
-
onClick: () =>
|
|
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"))
|
|
34
41
|
}, {
|
|
35
42
|
id: "browse",
|
|
36
|
-
label:
|
|
37
|
-
description:
|
|
38
|
-
icon: /* @__PURE__ */
|
|
39
|
-
onClick: () =>
|
|
43
|
+
label: b("ggnomad.property.next.browse", "Compare other stays"),
|
|
44
|
+
description: b("ggnomad.property.next.browseDesc", "Go back to hospitality listings to compare options."),
|
|
45
|
+
icon: /* @__PURE__ */ v(c, { className: "size-4" }),
|
|
46
|
+
onClick: () => x(o(S, "hospitality"))
|
|
40
47
|
}]
|
|
41
48
|
}),
|
|
42
|
-
/* @__PURE__ */
|
|
49
|
+
/* @__PURE__ */ y("div", {
|
|
43
50
|
className: "grid gap-4 lg:grid-cols-2",
|
|
44
|
-
children: [/* @__PURE__ */
|
|
45
|
-
title:
|
|
51
|
+
children: [/* @__PURE__ */ y(n, {
|
|
52
|
+
title: b("ggnomad.property.about", "About"),
|
|
46
53
|
children: [
|
|
47
|
-
/* @__PURE__ */
|
|
54
|
+
/* @__PURE__ */ v("p", {
|
|
48
55
|
className: "text-sm text-text-secondary",
|
|
49
|
-
children:
|
|
56
|
+
children: b("ggnomad.property.type", "Type")
|
|
50
57
|
}),
|
|
51
|
-
/* @__PURE__ */
|
|
58
|
+
/* @__PURE__ */ v("p", {
|
|
52
59
|
className: "text-text-primary",
|
|
53
|
-
children:
|
|
60
|
+
children: T.type
|
|
54
61
|
}),
|
|
55
|
-
/* @__PURE__ */
|
|
62
|
+
/* @__PURE__ */ v("p", {
|
|
56
63
|
className: "mt-3 text-sm text-text-secondary",
|
|
57
|
-
children:
|
|
64
|
+
children: b("ggnomad.property.description", "Description")
|
|
58
65
|
}),
|
|
59
|
-
/* @__PURE__ */
|
|
66
|
+
/* @__PURE__ */ v("p", {
|
|
60
67
|
className: "text-text-primary",
|
|
61
|
-
children:
|
|
68
|
+
children: T.description ?? b("ggnomad.property.noDescription", "No description")
|
|
62
69
|
})
|
|
63
70
|
]
|
|
64
|
-
}), /* @__PURE__ */
|
|
71
|
+
}), /* @__PURE__ */ y(p, {
|
|
65
72
|
treatment: "glass",
|
|
66
73
|
glow: !0,
|
|
67
74
|
className: "border-border-seam p-5",
|
|
68
|
-
children: [/* @__PURE__ */
|
|
75
|
+
children: [/* @__PURE__ */ v("h2", {
|
|
69
76
|
className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
|
|
70
|
-
children:
|
|
71
|
-
}), /* @__PURE__ */
|
|
77
|
+
children: b("ggnomad.property.details", "Details")
|
|
78
|
+
}), /* @__PURE__ */ y("dl", {
|
|
72
79
|
className: "space-y-2 text-sm",
|
|
73
80
|
children: [
|
|
74
|
-
/* @__PURE__ */
|
|
75
|
-
label:
|
|
76
|
-
value: `${
|
|
81
|
+
/* @__PURE__ */ v(r, {
|
|
82
|
+
label: b("ggnomad.property.price", "Price"),
|
|
83
|
+
value: `${T.currency} ${Number(T.pricePerNight).toFixed(2)}`
|
|
77
84
|
}),
|
|
78
|
-
/* @__PURE__ */
|
|
79
|
-
label:
|
|
80
|
-
value: String(
|
|
85
|
+
/* @__PURE__ */ v(r, {
|
|
86
|
+
label: b("ggnomad.property.guests", "Guests"),
|
|
87
|
+
value: String(T.maxGuests)
|
|
81
88
|
}),
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
-
label:
|
|
84
|
-
value: String(
|
|
89
|
+
/* @__PURE__ */ v(r, {
|
|
90
|
+
label: b("ggnomad.property.rating", "Rating"),
|
|
91
|
+
value: String(T.rating ?? b("ggnomad.property.noRating", "N/A"))
|
|
85
92
|
}),
|
|
86
|
-
/* @__PURE__ */
|
|
87
|
-
label:
|
|
88
|
-
value:
|
|
93
|
+
/* @__PURE__ */ v(r, {
|
|
94
|
+
label: b("ggnomad.property.provider", "Provider"),
|
|
95
|
+
value: T.provider?.name ?? b("ggnomad.property.unassigned", "Unassigned")
|
|
89
96
|
})
|
|
90
97
|
]
|
|
91
98
|
})]
|
|
92
99
|
})]
|
|
93
100
|
})
|
|
94
|
-
] }) : /* @__PURE__ */
|
|
101
|
+
] }) : /* @__PURE__ */ v(m, {
|
|
95
102
|
illustration: "empty-data",
|
|
96
|
-
title:
|
|
97
|
-
description:
|
|
103
|
+
title: b("ggnomad.property.notFoundTitle", "No property found"),
|
|
104
|
+
description: b("ggnomad.property.notFoundDescription", "This property is unavailable or may have been removed.")
|
|
98
105
|
})
|
|
99
106
|
});
|
|
100
107
|
}
|
|
101
108
|
//#endregion
|
|
102
|
-
export {
|
|
109
|
+
export { b as PropertyDetailsPage };
|
|
103
110
|
|
|
104
111
|
//# 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 { CalendarCheck, Hotel } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_PROPERTY_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\nimport { DetailRow, SectionCard } from '../components';\n\nexport function PropertyDetailsPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { id = '' } = useParams();\n const { data } = useQuery(\n GGNOMAD_PROPERTY_QUERY as TypedDocumentNode<\n {\n ggnomadProperty: {\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 } | 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 <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: 'book',\n label: t('ggnomad.property.next.book', 'Book this stay'),\n description: t(\n 'ggnomad.property.next.bookDesc',\n 'Reserve these dates and track it under Bookings.'\n ),\n icon: <CalendarCheck className=\"size-4\" />,\n onClick: () => navigate('
|
|
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 { CalendarCheck, 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 } 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 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: 'book',\n label: t('ggnomad.property.next.book', 'Book this stay'),\n description: t(\n 'ggnomad.property.next.bookDesc',\n 'Reserve these dates and track it under Bookings.'\n ),\n icon: <CalendarCheck className=\"size-4\" />,\n onClick: () => navigate(joinPath(basePath, 'bookings')),\n },\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-2\">\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={property.provider?.name ?? t('ggnomad.property.unassigned', 'Unassigned')}\n />\n </dl>\n </GlassCard>\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,GAgBA;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,8BAA8B,iBAAiB;KACxD,aAAa,EACX,kCACA,mDACD;KACD,MAAM,kBAAC,GAAD,EAAe,WAAU,UAAW,CAAA;KAC1C,eAAe,EAAS,EAAS,GAAU,WAAW,CAAC;KACxD,EACD;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,GAAD;KAAa,OAAO,EAAE,0BAA0B,QAAQ;eAAxD;MACE,kBAAC,KAAD;OAAG,WAAU;iBAA+B,EAAE,yBAAyB,OAAO;OAAK,CAAA;MACnF,kBAAC,KAAD;OAAG,WAAU;iBAAqB,EAAS;OAAS,CAAA;MACpD,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAE,gCAAgC,cAAc;OAC/C,CAAA;MACJ,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAS,eAAe,EAAE,kCAAkC,iBAAiB;OAC5E,CAAA;MACQ;QACd,kBAAC,GAAD;KAAW,WAAU;KAAQ,MAAA;KAAK,WAAU;eAA5C,CACE,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAE,4BAA4B,UAAU;MACtC,CAAA,EACL,kBAAC,MAAD;MAAI,WAAU;gBAAd;OACE,kBAAC,GAAD;QACE,OAAO,EAAE,0BAA0B,QAAQ;QAC3C,OAAO,GAAG,EAAS,SAAS,GAAG,OAAO,EAAS,cAAc,CAAC,QAAQ,EAAE;QACxE,CAAA;OACF,kBAAC,GAAD;QACE,OAAO,EAAE,2BAA2B,SAAS;QAC7C,OAAO,OAAO,EAAS,UAAU;QACjC,CAAA;OACF,kBAAC,GAAD;QACE,OAAO,EAAE,2BAA2B,SAAS;QAC7C,OAAO,OAAO,EAAS,UAAU,EAAE,6BAA6B,MAAM,CAAC;QACvE,CAAA;OACF,kBAAC,GAAD;QACE,OAAO,EAAE,6BAA6B,WAAW;QACjD,OAAO,EAAS,UAAU,QAAQ,EAAE,+BAA+B,aAAa;QAChF,CAAA;OACC;QACK;OACR;;GACL,EAAA,CAAA,GA/EH,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,kCAAkC,oBAAoB;GAC/D,aAAa,EACX,wCACA,yDACD;GACD,CAAA;EA0EM,CAAA"}
|