@burdenoff/microfe-ggnomad 2026.705.6 → 2026.705.7

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.
@@ -7,110 +7,135 @@ 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
9
  import { ReviewsSection as c } from "../components/ReviewsSection.js";
10
+ import { ListingEditDialog as l } from "../components/ListingEditDialog.js";
10
11
  import "../components/index.js";
11
- import { Mic2 as l, Ticket 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";
12
+ import { useState as u } from "react";
13
+ import { Mic2 as d, Pencil as f, Ticket as p } from "lucide-react";
14
+ import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
15
+ import { useNavigate as h, useParams as g } from "react-router-dom";
16
+ import { useQuery as _ } from "@apollo/client/react";
17
+ import { GlassCard as v, IllustratedEmptyState as y, NextSteps as b, PagePurpose as x } from "@burdenoff/fe-libs/ui";
18
+ import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
17
19
  //#region src/ggnomad/pages/EventDetailsPage.tsx
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?.ggnomadEvent;
23
- return /* @__PURE__ */ b(t, {
24
- title: D?.name ?? S("ggnomad.event.fallbackTitle", "Event details"),
25
- subtitle: S("ggnomad.event.subtitle", "Live event details, venue and lineup"),
26
- children: D ? /* @__PURE__ */ x(y, { children: [
27
- /* @__PURE__ */ b(i, {
28
- image: D.images?.[0],
29
- alt: D.name
20
+ function T() {
21
+ let { t: T } = m(), E = h(), { basePath: D = "/" } = a(), { id: O = "" } = g(), [k, A] = u(!1), { data: j, refetch: M } = _(e, {
22
+ variables: { id: O },
23
+ skip: !O
24
+ }), N = j?.ggnomadEvent;
25
+ return /* @__PURE__ */ C(t, {
26
+ title: N?.name ?? T("ggnomad.event.fallbackTitle", "Event details"),
27
+ subtitle: T("ggnomad.event.subtitle", "Live event details, venue and lineup"),
28
+ children: N ? /* @__PURE__ */ w(S, { children: [
29
+ /* @__PURE__ */ C(i, {
30
+ image: N.images?.[0],
31
+ alt: N.name
30
32
  }),
31
- /* @__PURE__ */ b(v, {
32
- icon: /* @__PURE__ */ b(u, { className: "size-4" }),
33
- children: S("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.")
33
+ /* @__PURE__ */ C(x, {
34
+ icon: /* @__PURE__ */ C(p, { className: "size-4" }),
35
+ children: T("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.")
34
36
  }),
35
- /* @__PURE__ */ b(_, {
37
+ /* @__PURE__ */ C(b, {
36
38
  storageKey: "ggnomad-event-detail",
37
39
  steps: [{
38
40
  id: "browse",
39
- label: S("ggnomad.event.next.browse", "See more events"),
40
- description: S("ggnomad.event.next.browseDesc", "Return to Entertainment for other live experiences."),
41
- icon: /* @__PURE__ */ b(u, { className: "size-4" }),
42
- onClick: () => C(o(w, "entertainment"))
41
+ label: T("ggnomad.event.next.browse", "See more events"),
42
+ description: T("ggnomad.event.next.browseDesc", "Return to Entertainment for other live experiences."),
43
+ icon: /* @__PURE__ */ C(p, { className: "size-4" }),
44
+ onClick: () => E(o(D, "entertainment"))
43
45
  }]
44
46
  }),
45
- /* @__PURE__ */ x("div", {
47
+ /* @__PURE__ */ w("div", {
46
48
  className: "grid gap-4 lg:grid-cols-3",
47
- children: [/* @__PURE__ */ x("div", {
49
+ children: [/* @__PURE__ */ w("div", {
48
50
  className: "lg:col-span-2 space-y-4",
49
51
  children: [
50
- /* @__PURE__ */ x(h, {
52
+ /* @__PURE__ */ w(v, {
51
53
  treatment: "glass",
52
54
  glow: !0,
53
55
  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.event.details", "Details")
57
- }), /* @__PURE__ */ x("dl", {
56
+ children: [/* @__PURE__ */ w("div", {
57
+ className: "mb-4 flex items-center justify-between gap-3",
58
+ children: [/* @__PURE__ */ C("h2", {
59
+ className: "text-lg font-medium tracking-tight text-text-primary",
60
+ children: T("ggnomad.event.details", "Details")
61
+ }), /* @__PURE__ */ C("button", {
62
+ onClick: () => A(!0),
63
+ className: "rounded-md p-2 text-text-secondary hover:bg-action-primary-bg hover:text-action-primary-text",
64
+ "aria-label": T("ggnomad.event.editListing", "Edit listing"),
65
+ title: T("ggnomad.event.editListing", "Edit listing"),
66
+ children: /* @__PURE__ */ C(f, { className: "size-4" })
67
+ })]
68
+ }), /* @__PURE__ */ w("dl", {
58
69
  className: "space-y-2 text-sm",
59
70
  children: [
60
- /* @__PURE__ */ b(r, {
61
- label: S("ggnomad.event.category", "Category"),
62
- value: D.category
71
+ /* @__PURE__ */ C(r, {
72
+ label: T("ggnomad.event.category", "Category"),
73
+ value: N.category
63
74
  }),
64
- /* @__PURE__ */ b(r, {
65
- label: S("ggnomad.event.starts", "Starts"),
66
- value: new Date(D.startsAt).toLocaleString()
75
+ /* @__PURE__ */ C(r, {
76
+ label: T("ggnomad.event.starts", "Starts"),
77
+ value: new Date(N.startsAt).toLocaleString()
67
78
  }),
68
- /* @__PURE__ */ b(r, {
69
- label: S("ggnomad.event.ends", "Ends"),
70
- value: D.endsAt ? new Date(D.endsAt).toLocaleString() : S("ggnomad.event.na", "N/A")
79
+ /* @__PURE__ */ C(r, {
80
+ label: T("ggnomad.event.ends", "Ends"),
81
+ value: N.endsAt ? new Date(N.endsAt).toLocaleString() : T("ggnomad.event.na", "N/A")
71
82
  }),
72
- /* @__PURE__ */ b(r, {
73
- label: S("ggnomad.event.price", "Price"),
74
- value: `${D.currency} ${Number(D.price).toFixed(2)}`
83
+ /* @__PURE__ */ C(r, {
84
+ label: T("ggnomad.event.price", "Price"),
85
+ value: `${N.currency} ${Number(N.price).toFixed(2)}`
75
86
  })
76
87
  ]
77
88
  })]
78
89
  }),
79
- /* @__PURE__ */ b(n, {
80
- title: S("ggnomad.event.performers", "Performers"),
81
- children: /* @__PURE__ */ b("ul", {
90
+ /* @__PURE__ */ C(n, {
91
+ title: T("ggnomad.event.performers", "Performers"),
92
+ children: /* @__PURE__ */ C("ul", {
82
93
  className: "space-y-2 text-sm",
83
- children: (D.performers ?? []).map((e) => /* @__PURE__ */ x("li", {
94
+ children: (N.performers ?? []).map((e) => /* @__PURE__ */ w("li", {
84
95
  className: "flex items-start gap-2 text-text-primary",
85
- children: [/* @__PURE__ */ b(l, {
96
+ children: [/* @__PURE__ */ C(d, {
86
97
  className: "mt-0.5 size-4 flex-shrink-0 text-action-primary-bg",
87
98
  "aria-hidden": "true"
88
99
  }), e]
89
100
  }, e))
90
101
  })
91
102
  }),
92
- /* @__PURE__ */ b(c, {
103
+ /* @__PURE__ */ C(c, {
93
104
  targetType: "EVENT",
94
- targetId: D.id ?? T
105
+ targetId: N.id ?? O
95
106
  })
96
107
  ]
97
- }), /* @__PURE__ */ b("div", { children: /* @__PURE__ */ b(s, {
108
+ }), /* @__PURE__ */ C("div", { children: /* @__PURE__ */ C(s, {
98
109
  bookingType: "EVENT",
99
- itemId: D.id ?? T,
100
- itemName: D.name,
101
- unitPrice: D.price ?? 0,
102
- currency: D.currency ?? "USD",
103
- eventDate: D.startsAt
110
+ itemId: N.id ?? O,
111
+ itemName: N.name,
112
+ unitPrice: N.price ?? 0,
113
+ currency: N.currency ?? "USD",
114
+ eventDate: N.startsAt
104
115
  }) })]
116
+ }),
117
+ /* @__PURE__ */ C(l, {
118
+ open: k,
119
+ onOpenChange: A,
120
+ targetType: "EVENT",
121
+ id: N.id ?? O,
122
+ initial: {
123
+ name: N.name,
124
+ description: N.description,
125
+ price: N.price,
126
+ status: N.status,
127
+ images: N.images
128
+ },
129
+ onSaved: () => M()
105
130
  })
106
- ] }) : /* @__PURE__ */ b(g, {
131
+ ] }) : /* @__PURE__ */ C(y, {
107
132
  illustration: "empty-data",
108
- title: S("ggnomad.event.notFoundTitle", "No event found"),
109
- description: S("ggnomad.event.notFoundDescription", "This event is unavailable or may have been removed.")
133
+ title: T("ggnomad.event.notFoundTitle", "No event found"),
134
+ description: T("ggnomad.event.notFoundDescription", "This event is unavailable or may have been removed.")
110
135
  })
111
136
  });
112
137
  }
113
138
  //#endregion
114
- export { S as EventDetailsPage };
139
+ export { T as EventDetailsPage };
115
140
 
116
141
  //# 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 { 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, BookingPanel, ReviewsSection } 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 id: string;\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: '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-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.event.details', 'Details')}\n </h2>\n <dl className=\"space-y-2 text-sm\">\n <DetailRow\n label={t('ggnomad.event.category', 'Category')}\n value={event.category}\n />\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 <ReviewsSection targetType=\"EVENT\" targetId={event.id ?? id} />\n </div>\n <div>\n <BookingPanel\n bookingType=\"EVENT\"\n itemId={event.id ?? id}\n itemName={event.name}\n unitPrice={event.price ?? 0}\n currency={event.currency ?? 'USD'}\n eventDate={event.startsAt}\n />\n </div>\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,GAgBA;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,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,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OAAW,WAAU;OAAQ,MAAA;OAAK,WAAU;iBAA5C,CACE,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAE,yBAAyB,UAAU;QACnC,CAAA,EACL,kBAAC,MAAD;QAAI,WAAU;kBAAd;SACE,kBAAC,GAAD;UACE,OAAO,EAAE,0BAA0B,WAAW;UAC9C,OAAO,EAAM;UACb,CAAA;SACF,kBAAC,GAAD;UACE,OAAO,EAAE,wBAAwB,SAAS;UAC1C,OAAO,IAAI,KAAK,EAAM,SAAS,CAAC,gBAAgB;UAChD,CAAA;SACF,kBAAC,GAAD;UACE,OAAO,EAAE,sBAAsB,OAAO;UACtC,OACE,EAAM,SACF,IAAI,KAAK,EAAM,OAAO,CAAC,gBAAgB,GACvC,EAAE,oBAAoB,MAAM;UAElC,CAAA;SACF,kBAAC,GAAD;UACE,OAAO,EAAE,uBAAuB,QAAQ;UACxC,OAAO,GAAG,EAAM,SAAS,GAAG,OAAO,EAAM,MAAM,CAAC,QAAQ,EAAE;UAC1D,CAAA;SACC;UACK;;MACZ,kBAAC,GAAD;OAAa,OAAO,EAAE,4BAA4B,aAAa;iBAC7D,kBAAC,MAAD;QAAI,WAAU;mBACV,EAAM,cAAc,EAAE,EAAE,KAAK,MAC7B,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;OAAQ,UAAU,EAAM,MAAM;OAAM,CAAA;MAC3D;QACN,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;KACE,aAAY;KACZ,QAAQ,EAAM,MAAM;KACpB,UAAU,EAAM;KAChB,WAAW,EAAM,SAAS;KAC1B,UAAU,EAAM,YAAY;KAC5B,WAAW,EAAM;KACjB,CAAA,EACE,CAAA,CACF;;GACL,EAAA,CAAA,GAzFH,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,+BAA+B,iBAAiB;GACzD,aAAa,EACX,qCACA,sDACD;GACD,CAAA;EAoFM,CAAA"}
1
+ {"version":3,"file":"EventDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/EventDetailsPage.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 { useNavigate, useParams } from 'react-router-dom';\nimport { Mic2, Pencil, 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 {\n DetailRow,\n SectionCard,\n DetailHero,\n BookingPanel,\n ReviewsSection,\n ListingEditDialog,\n} from '../components';\n\nexport function EventDetailsPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { basePath = '/' } = useGGNomad();\n const { id = '' } = useParams();\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const { data, refetch } = useQuery(\n GGNOMAD_EVENT_QUERY as TypedDocumentNode<\n {\n ggnomadEvent: {\n id: string;\n name: string;\n description?: string;\n category: string;\n startsAt: string;\n endsAt?: string;\n currency: string;\n price: number;\n status?: string;\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: '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-3\">\n <div className=\"lg:col-span-2 space-y-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam p-5\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-medium tracking-tight text-text-primary\">\n {t('ggnomad.event.details', 'Details')}\n </h2>\n <button\n onClick={() => setEditDialogOpen(true)}\n className=\"rounded-md p-2 text-text-secondary hover:bg-action-primary-bg hover:text-action-primary-text\"\n aria-label={t('ggnomad.event.editListing', 'Edit listing')}\n title={t('ggnomad.event.editListing', 'Edit listing')}\n >\n <Pencil className=\"size-4\" />\n </button>\n </div>\n <dl className=\"space-y-2 text-sm\">\n <DetailRow\n label={t('ggnomad.event.category', 'Category')}\n value={event.category}\n />\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 <ReviewsSection targetType=\"EVENT\" targetId={event.id ?? id} />\n </div>\n <div>\n <BookingPanel\n bookingType=\"EVENT\"\n itemId={event.id ?? id}\n itemName={event.name}\n unitPrice={event.price ?? 0}\n currency={event.currency ?? 'USD'}\n eventDate={event.startsAt}\n />\n </div>\n </div>\n\n <ListingEditDialog\n open={editDialogOpen}\n onOpenChange={setEditDialogOpen}\n targetType=\"EVENT\"\n id={event.id ?? id}\n initial={{\n name: event.name,\n description: event.description,\n price: event.price,\n status: event.status,\n images: event.images,\n }}\n onSaved={() => refetch()}\n />\n </>\n )}\n </PageShell>\n );\n}\n"],"mappings":"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"}
@@ -7,118 +7,143 @@ 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
9
  import { ReviewsSection as c } from "../components/ReviewsSection.js";
10
+ import { ListingEditDialog as l } from "../components/ListingEditDialog.js";
10
11
  import "../components/index.js";
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";
12
+ import { useState as u } from "react";
13
+ import { Hotel as d, Pencil as f } from "lucide-react";
14
+ import { useI18n as p } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
15
+ import { useNavigate as m, useParams as h } from "react-router-dom";
16
+ import { useQuery as g } from "@apollo/client/react";
17
+ import { GlassCard as _, IllustratedEmptyState as v, NextSteps as y, PagePurpose as b } from "@burdenoff/fe-libs/ui";
18
+ import { Fragment as x, jsx as S, jsxs as C } from "react/jsx-runtime";
17
19
  //#region src/ggnomad/pages/PropertyDetailsPage.tsx
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
20
+ function w() {
21
+ let { t: w } = p(), T = m(), { basePath: E = "/" } = a(), { id: D = "" } = h(), [O, k] = u(!1), { data: A, refetch: j } = g(e, {
22
+ variables: { id: D },
23
+ skip: !D
24
+ }), M = A?.ggnomadProperty;
25
+ return /* @__PURE__ */ S(t, {
26
+ title: M?.name ?? w("ggnomad.property.fallbackTitle", "Property details"),
27
+ subtitle: w("ggnomad.property.subtitle", "Detailed hospitality listing view"),
28
+ children: M ? /* @__PURE__ */ C(x, { children: [
29
+ /* @__PURE__ */ S(i, {
30
+ image: M.images?.[0],
31
+ alt: M.name
30
32
  }),
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
+ /* @__PURE__ */ S(b, {
34
+ icon: /* @__PURE__ */ S(d, { className: "size-4" }),
35
+ children: w("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.")
34
36
  }),
35
- /* @__PURE__ */ y(g, {
37
+ /* @__PURE__ */ S(y, {
36
38
  storageKey: "ggnomad-property-detail",
37
39
  steps: [{
38
40
  id: "browse",
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"))
41
+ label: w("ggnomad.property.next.browse", "Compare other stays"),
42
+ description: w("ggnomad.property.next.browseDesc", "Go back to hospitality listings to compare options."),
43
+ icon: /* @__PURE__ */ S(d, { className: "size-4" }),
44
+ onClick: () => T(o(E, "hospitality"))
43
45
  }]
44
46
  }),
45
- /* @__PURE__ */ b("div", {
47
+ /* @__PURE__ */ C("div", {
46
48
  className: "grid gap-4 lg:grid-cols-3",
47
- children: [/* @__PURE__ */ b("div", {
49
+ children: [/* @__PURE__ */ C("div", {
48
50
  className: "lg:col-span-2 space-y-4",
49
51
  children: [
50
- /* @__PURE__ */ b(n, {
51
- title: x("ggnomad.property.about", "About"),
52
+ /* @__PURE__ */ C(n, {
53
+ title: w("ggnomad.property.about", "About"),
52
54
  children: [
53
- /* @__PURE__ */ y("p", {
55
+ /* @__PURE__ */ S("p", {
54
56
  className: "text-sm text-text-secondary",
55
- children: x("ggnomad.property.type", "Type")
57
+ children: w("ggnomad.property.type", "Type")
56
58
  }),
57
- /* @__PURE__ */ y("p", {
59
+ /* @__PURE__ */ S("p", {
58
60
  className: "text-text-primary",
59
- children: E.type
61
+ children: M.type
60
62
  }),
61
- /* @__PURE__ */ y("p", {
63
+ /* @__PURE__ */ S("p", {
62
64
  className: "mt-3 text-sm text-text-secondary",
63
- children: x("ggnomad.property.description", "Description")
65
+ children: w("ggnomad.property.description", "Description")
64
66
  }),
65
- /* @__PURE__ */ y("p", {
67
+ /* @__PURE__ */ S("p", {
66
68
  className: "text-text-primary",
67
- children: E.description ?? x("ggnomad.property.noDescription", "No description")
69
+ children: M.description ?? w("ggnomad.property.noDescription", "No description")
68
70
  })
69
71
  ]
70
72
  }),
71
- /* @__PURE__ */ b(m, {
73
+ /* @__PURE__ */ C(_, {
72
74
  treatment: "glass",
73
75
  glow: !0,
74
76
  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", {
77
+ children: [/* @__PURE__ */ C("div", {
78
+ className: "mb-4 flex items-center justify-between gap-3",
79
+ children: [/* @__PURE__ */ S("h2", {
80
+ className: "text-lg font-medium tracking-tight text-text-primary",
81
+ children: w("ggnomad.property.details", "Details")
82
+ }), /* @__PURE__ */ S("button", {
83
+ onClick: () => k(!0),
84
+ className: "rounded-md p-2 text-text-secondary hover:bg-action-primary-bg hover:text-action-primary-text",
85
+ "aria-label": w("ggnomad.property.editListing", "Edit listing"),
86
+ title: w("ggnomad.property.editListing", "Edit listing"),
87
+ children: /* @__PURE__ */ S(f, { className: "size-4" })
88
+ })]
89
+ }), /* @__PURE__ */ C("dl", {
79
90
  className: "space-y-2 text-sm",
80
91
  children: [
81
- /* @__PURE__ */ y(r, {
82
- label: x("ggnomad.property.price", "Price"),
83
- value: `${E.currency} ${Number(E.pricePerNight).toFixed(2)}`
92
+ /* @__PURE__ */ S(r, {
93
+ label: w("ggnomad.property.price", "Price"),
94
+ value: `${M.currency} ${Number(M.pricePerNight).toFixed(2)}`
84
95
  }),
85
- /* @__PURE__ */ y(r, {
86
- label: x("ggnomad.property.guests", "Guests"),
87
- value: String(E.maxGuests)
96
+ /* @__PURE__ */ S(r, {
97
+ label: w("ggnomad.property.guests", "Guests"),
98
+ value: String(M.maxGuests)
88
99
  }),
89
- /* @__PURE__ */ y(r, {
90
- label: x("ggnomad.property.rating", "Rating"),
91
- value: String(E.rating ?? x("ggnomad.property.noRating", "N/A"))
100
+ /* @__PURE__ */ S(r, {
101
+ label: w("ggnomad.property.rating", "Rating"),
102
+ value: String(M.rating ?? w("ggnomad.property.noRating", "N/A"))
92
103
  }),
93
- /* @__PURE__ */ y(r, {
94
- label: x("ggnomad.property.provider", "Provider"),
95
- value: E.provider?.name ?? x("ggnomad.property.unassigned", "Unassigned")
104
+ /* @__PURE__ */ S(r, {
105
+ label: w("ggnomad.property.provider", "Provider"),
106
+ value: M.provider?.name ?? w("ggnomad.property.unassigned", "Unassigned")
96
107
  })
97
108
  ]
98
109
  })]
99
110
  }),
100
- /* @__PURE__ */ y(c, {
111
+ /* @__PURE__ */ S(c, {
101
112
  targetType: "PROPERTY",
102
- targetId: E.id ?? w
113
+ targetId: M.id ?? D
103
114
  })
104
115
  ]
105
- }), /* @__PURE__ */ y("div", { children: /* @__PURE__ */ y(s, {
116
+ }), /* @__PURE__ */ S("div", { children: /* @__PURE__ */ S(s, {
106
117
  bookingType: "PROPERTY",
107
- itemId: E.id ?? w,
108
- itemName: E.name,
109
- unitPrice: E.pricePerNight ?? 0,
110
- currency: E.currency ?? "USD",
118
+ itemId: M.id ?? D,
119
+ itemName: M.name,
120
+ unitPrice: M.pricePerNight ?? 0,
121
+ currency: M.currency ?? "USD",
111
122
  nights: 1
112
123
  }) })]
124
+ }),
125
+ /* @__PURE__ */ S(l, {
126
+ open: O,
127
+ onOpenChange: k,
128
+ targetType: "PROPERTY",
129
+ id: M.id ?? D,
130
+ initial: {
131
+ name: M.name,
132
+ description: M.description,
133
+ pricePerNight: M.pricePerNight,
134
+ status: M.status,
135
+ images: M.images
136
+ },
137
+ onSaved: () => j()
113
138
  })
114
- ] }) : /* @__PURE__ */ y(h, {
139
+ ] }) : /* @__PURE__ */ S(v, {
115
140
  illustration: "empty-data",
116
- title: x("ggnomad.property.notFoundTitle", "No property found"),
117
- description: x("ggnomad.property.notFoundDescription", "This property is unavailable or may have been removed.")
141
+ title: w("ggnomad.property.notFoundTitle", "No property found"),
142
+ description: w("ggnomad.property.notFoundDescription", "This property is unavailable or may have been removed.")
118
143
  })
119
144
  });
120
145
  }
121
146
  //#endregion
122
- export { x as PropertyDetailsPage };
147
+ export { w as PropertyDetailsPage };
123
148
 
124
149
  //# 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, 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"}
1
+ {"version":3,"file":"PropertyDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/PropertyDetailsPage.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 { useNavigate, useParams } from 'react-router-dom';\nimport { Hotel, Pencil } 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 {\n DetailRow,\n SectionCard,\n DetailHero,\n BookingPanel,\n ReviewsSection,\n ListingEditDialog,\n} from '../components';\n\nexport function PropertyDetailsPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { basePath = '/' } = useGGNomad();\n const { id = '' } = useParams();\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const { data, refetch } = 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 status?: string;\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 <div className=\"mb-4 flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-medium tracking-tight text-text-primary\">\n {t('ggnomad.property.details', 'Details')}\n </h2>\n <button\n onClick={() => setEditDialogOpen(true)}\n className=\"rounded-md p-2 text-text-secondary hover:bg-action-primary-bg hover:text-action-primary-text\"\n aria-label={t('ggnomad.property.editListing', 'Edit listing')}\n title={t('ggnomad.property.editListing', 'Edit listing')}\n >\n <Pencil className=\"size-4\" />\n </button>\n </div>\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 <ListingEditDialog\n open={editDialogOpen}\n onOpenChange={setEditDialogOpen}\n targetType=\"PROPERTY\"\n id={property.id ?? id}\n initial={{\n name: property.name,\n description: property.description,\n pricePerNight: property.pricePerNight,\n status: property.status,\n images: property.images,\n }}\n onSaved={() => refetch()}\n />\n </>\n )}\n </PageShell>\n );\n}\n"],"mappings":"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"}