@burdenoff/microfe-ggnomad 2026.624.1 → 2026.704.1

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.
Files changed (48) hide show
  1. package/dist/ggnomad/components/DetailRow.js +18 -0
  2. package/dist/ggnomad/components/DetailRow.js.map +1 -0
  3. package/dist/ggnomad/components/EntityCard.js +50 -0
  4. package/dist/ggnomad/components/EntityCard.js.map +1 -0
  5. package/dist/ggnomad/components/SectionCard.js +21 -0
  6. package/dist/ggnomad/components/SectionCard.js.map +1 -0
  7. package/dist/ggnomad/components/StatCard.js +27 -0
  8. package/dist/ggnomad/components/StatCard.js.map +1 -0
  9. package/dist/ggnomad/components/StatusBadge.js +65 -0
  10. package/dist/ggnomad/components/StatusBadge.js.map +1 -0
  11. package/dist/ggnomad/components/index.js +5 -0
  12. package/dist/ggnomad/graphql.js +61 -17
  13. package/dist/ggnomad/graphql.js.map +1 -1
  14. package/dist/ggnomad/pages/ActivityDetailsPage.js +84 -37
  15. package/dist/ggnomad/pages/ActivityDetailsPage.js.map +1 -1
  16. package/dist/ggnomad/pages/AnalyticsPage.js +111 -55
  17. package/dist/ggnomad/pages/AnalyticsPage.js.map +1 -1
  18. package/dist/ggnomad/pages/BookingsPage.js +183 -61
  19. package/dist/ggnomad/pages/BookingsPage.js.map +1 -1
  20. package/dist/ggnomad/pages/DashboardPage.js +132 -107
  21. package/dist/ggnomad/pages/DashboardPage.js.map +1 -1
  22. package/dist/ggnomad/pages/EntertainmentPage.js +40 -33
  23. package/dist/ggnomad/pages/EntertainmentPage.js.map +1 -1
  24. package/dist/ggnomad/pages/EventDetailsPage.js +86 -39
  25. package/dist/ggnomad/pages/EventDetailsPage.js.map +1 -1
  26. package/dist/ggnomad/pages/FavoritesPage.js +110 -33
  27. package/dist/ggnomad/pages/FavoritesPage.js.map +1 -1
  28. package/dist/ggnomad/pages/HospitalityPage.js +45 -42
  29. package/dist/ggnomad/pages/HospitalityPage.js.map +1 -1
  30. package/dist/ggnomad/pages/PageShell.js +33 -11
  31. package/dist/ggnomad/pages/PageShell.js.map +1 -1
  32. package/dist/ggnomad/pages/PropertyDetailsPage.js +95 -45
  33. package/dist/ggnomad/pages/PropertyDetailsPage.js.map +1 -1
  34. package/dist/ggnomad/pages/ProviderPage.js +65 -29
  35. package/dist/ggnomad/pages/ProviderPage.js.map +1 -1
  36. package/dist/ggnomad/pages/SearchPage.js +57 -48
  37. package/dist/ggnomad/pages/SearchPage.js.map +1 -1
  38. package/dist/ggnomad/pages/TourDetailsPage.js +86 -39
  39. package/dist/ggnomad/pages/TourDetailsPage.js.map +1 -1
  40. package/dist/ggnomad/pages/TourismPage.js +64 -63
  41. package/dist/ggnomad/pages/TourismPage.js.map +1 -1
  42. package/dist/ggnomad/pages/TravelPage.js +43 -27
  43. package/dist/ggnomad/pages/TravelPage.js.map +1 -1
  44. package/dist/ggnomad/utils/cn.js +10 -0
  45. package/dist/ggnomad/utils/cn.js.map +1 -0
  46. package/dist/ggnomad/utils/notify.js +36 -0
  47. package/dist/ggnomad/utils/notify.js.map +1 -0
  48. package/package.json +3 -2
@@ -1,42 +1,78 @@
1
1
  import { GGNOMAD_PROVIDERS_QUERY as e } from "../graphql.js";
2
2
  import { PageShell as t } from "./PageShell.js";
3
- import { useQuery as n } from "@apollo/client/react";
4
- import { jsx as r, jsxs as i } from "react/jsx-runtime";
3
+ import { StatusBadge as n } from "../components/StatusBadge.js";
4
+ import { EntityCard as r } from "../components/EntityCard.js";
5
+ import "../components/index.js";
6
+ import { Briefcase as i } from "lucide-react";
7
+ import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
+ import { useQuery as o } from "@apollo/client/react";
9
+ import { GlassCard as s, IllustratedEmptyState as c, PagePurpose as l } from "@burdenoff/fe-libs/ui";
10
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
5
11
  //#region src/ggnomad/pages/ProviderPage.tsx
6
- function a() {
7
- let { data: a } = n(e, { variables: {
12
+ function f() {
13
+ let { t: f } = a(), { data: p } = o(e, { variables: {
8
14
  first: 20,
9
15
  skip: 0
10
- } });
11
- return /* @__PURE__ */ r(t, {
12
- title: "Provider Dashboard",
13
- subtitle: "B2B provider operations and onboarding metrics",
14
- children: /* @__PURE__ */ r("div", {
15
- className: "grid gap-3 md:grid-cols-2",
16
- children: (a?.ggnomadProviders ?? []).map((e) => /* @__PURE__ */ i("div", {
17
- className: "rounded-lg border p-4 text-sm",
18
- children: [
19
- /* @__PURE__ */ r("p", {
20
- className: "font-medium",
21
- children: e.name
16
+ } }), m = p?.ggnomadProviders ?? [];
17
+ return /* @__PURE__ */ d(t, {
18
+ title: f("ggnomad.provider.title", "Provider Dashboard"),
19
+ titleAccent: f("ggnomad.provider.title.accent", "Provider"),
20
+ subtitle: f("ggnomad.provider.subtitle", "B2B provider operations and onboarding metrics"),
21
+ children: [/* @__PURE__ */ u(l, {
22
+ icon: /* @__PURE__ */ u(i, { className: "size-4" }),
23
+ children: f("ggnomad.provider.purpose", "Track the supply side of the marketplace — the hotels, tour operators and venues that publish inventory. Use it to monitor each provider’s status, listing count, revenue and rating, and to spot who needs onboarding attention.")
24
+ }), m.length === 0 ? /* @__PURE__ */ u(c, {
25
+ illustration: "empty-people",
26
+ title: f("ggnomad.provider.emptyTitle", "No providers onboarded"),
27
+ description: f("ggnomad.provider.emptyDescription", "Onboarded B2B providers and their performance will be tracked here.")
28
+ }) : /* @__PURE__ */ d(s, {
29
+ treatment: "glass",
30
+ glow: !0,
31
+ className: "border-border-seam p-5",
32
+ children: [/* @__PURE__ */ u("h2", {
33
+ className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
34
+ children: f("ggnomad.provider.onboardedProviders", "Onboarded providers")
35
+ }), /* @__PURE__ */ u("div", {
36
+ className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3",
37
+ children: m.map((e) => /* @__PURE__ */ u(r, {
38
+ title: e.name,
39
+ meta: e.type,
40
+ badge: /* @__PURE__ */ u(n, {
41
+ status: e.status,
42
+ live: e.status === "ACTIVE"
22
43
  }),
23
- /* @__PURE__ */ i("p", {
24
- className: "text-text-secondary",
44
+ footer: /* @__PURE__ */ d("dl", {
45
+ className: "grid grid-cols-3 gap-2 text-xs",
25
46
  children: [
26
- e.type,
27
- " - ",
28
- e.status
47
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("dt", {
48
+ className: "text-text-secondary",
49
+ children: f("ggnomad.provider.listings", "Listings")
50
+ }), /* @__PURE__ */ u("dd", {
51
+ className: "mt-0.5 font-medium tabular-nums text-text-primary",
52
+ children: e.listingCount
53
+ })] }),
54
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("dt", {
55
+ className: "text-text-secondary",
56
+ children: f("ggnomad.provider.revenue", "Revenue")
57
+ }), /* @__PURE__ */ d("dd", {
58
+ className: "mt-0.5 font-medium tabular-nums text-text-primary",
59
+ children: ["$", Number(e.totalRevenue).toLocaleString()]
60
+ })] }),
61
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("dt", {
62
+ className: "text-text-secondary",
63
+ children: f("ggnomad.provider.rating", "Rating")
64
+ }), /* @__PURE__ */ u("dd", {
65
+ className: "mt-0.5 font-medium tabular-nums text-text-primary",
66
+ children: e.rating ?? f("ggnomad.provider.noRating", "N/A")
67
+ })] })
29
68
  ]
30
- }),
31
- /* @__PURE__ */ i("p", { children: ["Listings: ", e.listingCount] }),
32
- /* @__PURE__ */ i("p", { children: ["Revenue: $", Number(e.totalRevenue).toLocaleString()] }),
33
- /* @__PURE__ */ i("p", { children: ["Rating: ", e.rating ?? "N/A"] })
34
- ]
35
- }, e.id))
36
- })
69
+ })
70
+ }, e.id))
71
+ })]
72
+ })]
37
73
  });
38
74
  }
39
75
  //#endregion
40
- export { a as ProviderPage };
76
+ export { f as ProviderPage };
41
77
 
42
78
  //# sourceMappingURL=ProviderPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderPage.js","names":[],"sources":["../../../src/ggnomad/pages/ProviderPage.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\n\nimport { GGNOMAD_PROVIDERS_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\n\nexport function ProviderPage() {\n const { data } = useQuery<{\n ggnomadProviders: Array<{\n id: string;\n name: string;\n type: string;\n status: string;\n listingCount: number;\n totalRevenue: number;\n rating?: number;\n }>;\n }>(GGNOMAD_PROVIDERS_QUERY, { variables: { first: 20, skip: 0 } });\n const providers = data?.ggnomadProviders ?? [];\n\n return (\n <PageShell title=\"Provider Dashboard\" subtitle=\"B2B provider operations and onboarding metrics\">\n <div className=\"grid gap-3 md:grid-cols-2\">\n {providers.map(\n (provider: {\n id: string;\n name: string;\n type: string;\n status: string;\n listingCount: number;\n totalRevenue: number;\n rating?: number;\n }) => (\n <div key={provider.id} className=\"rounded-lg border p-4 text-sm\">\n <p className=\"font-medium\">{provider.name}</p>\n <p className=\"text-text-secondary\">\n {provider.type} - {provider.status}\n </p>\n <p>Listings: {provider.listingCount}</p>\n <p>Revenue: ${Number(provider.totalRevenue).toLocaleString()}</p>\n <p>Rating: {provider.rating ?? 'N/A'}</p>\n </div>\n )\n )}\n </div>\n </PageShell>\n );\n}\n"],"mappings":";;;;;AAKA,SAAgB,IAAe;CAC7B,IAAM,EAAE,YAAS,EAUd,GAAyB,EAAE,WAAW;EAAE,OAAO;EAAI,MAAM;EAAG,EAAE,CAAC;AAGlE,QACE,kBAAC,GAAD;EAAW,OAAM;EAAqB,UAAS;YAC7C,kBAAC,OAAD;GAAK,WAAU;cAJD,GAAM,oBAAoB,EAAE,EAK7B,KACR,MASC,kBAAC,OAAD;IAAuB,WAAU;cAAjC;KACE,kBAAC,KAAD;MAAG,WAAU;gBAAe,EAAS;MAAS,CAAA;KAC9C,kBAAC,KAAD;MAAG,WAAU;gBAAb;OACG,EAAS;OAAK;OAAI,EAAS;OAC1B;;KACJ,kBAAC,KAAD,EAAA,UAAA,CAAG,cAAW,EAAS,aAAiB,EAAA,CAAA;KACxC,kBAAC,KAAD,EAAA,UAAA,CAAG,cAAW,OAAO,EAAS,aAAa,CAAC,gBAAgB,CAAK,EAAA,CAAA;KACjE,kBAAC,KAAD,EAAA,UAAA,CAAG,YAAS,EAAS,UAAU,MAAU,EAAA,CAAA;KACrC;MARI,EAAS,GAQb,CAET;GACG,CAAA;EACI,CAAA"}
1
+ {"version":3,"file":"ProviderPage.js","names":[],"sources":["../../../src/ggnomad/pages/ProviderPage.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 { Briefcase } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_PROVIDERS_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\nimport { EntityCard, StatusBadge } from '../components';\n\nexport function ProviderPage() {\n const { t } = useI18n();\n const { data } = useQuery(\n GGNOMAD_PROVIDERS_QUERY as TypedDocumentNode<\n {\n ggnomadProviders: Array<{\n id: string;\n name: string;\n type: string;\n status: string;\n listingCount: number;\n totalRevenue: number;\n rating?: number;\n }>;\n },\n { first: number; skip: number }\n >,\n { variables: { first: 20, skip: 0 } }\n );\n const providers = data?.ggnomadProviders ?? [];\n\n return (\n <PageShell\n title={t('ggnomad.provider.title', 'Provider Dashboard')}\n titleAccent={t('ggnomad.provider.title.accent', 'Provider')}\n subtitle={t('ggnomad.provider.subtitle', 'B2B provider operations and onboarding metrics')}\n >\n <PagePurpose icon={<Briefcase className=\"size-4\" />}>\n {t(\n 'ggnomad.provider.purpose',\n 'Track the supply side of the marketplace — the hotels, tour operators and venues that publish inventory. Use it to monitor each provider’s status, listing count, revenue and rating, and to spot who needs onboarding attention.'\n )}\n </PagePurpose>\n\n {providers.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title={t('ggnomad.provider.emptyTitle', 'No providers onboarded')}\n description={t(\n 'ggnomad.provider.emptyDescription',\n 'Onboarded B2B providers and their performance will be tracked 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.provider.onboardedProviders', 'Onboarded providers')}\n </h2>\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {providers.map((provider) => (\n <EntityCard\n key={provider.id}\n title={provider.name}\n meta={provider.type}\n badge={<StatusBadge status={provider.status} live={provider.status === 'ACTIVE'} />}\n footer={\n <dl className=\"grid grid-cols-3 gap-2 text-xs\">\n <div>\n <dt className=\"text-text-secondary\">\n {t('ggnomad.provider.listings', 'Listings')}\n </dt>\n <dd className=\"mt-0.5 font-medium tabular-nums text-text-primary\">\n {provider.listingCount}\n </dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">\n {t('ggnomad.provider.revenue', 'Revenue')}\n </dt>\n <dd className=\"mt-0.5 font-medium tabular-nums text-text-primary\">\n ${Number(provider.totalRevenue).toLocaleString()}\n </dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">\n {t('ggnomad.provider.rating', 'Rating')}\n </dt>\n <dd className=\"mt-0.5 font-medium tabular-nums text-text-primary\">\n {provider.rating ?? t('ggnomad.provider.noRating', 'N/A')}\n </dd>\n </div>\n </dl>\n }\n />\n ))}\n </div>\n </GlassCard>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;;AAUA,SAAgB,IAAe;CAC7B,IAAM,EAAE,SAAM,GAAS,EACjB,EAAE,YAAS,EACf,GAcA,EAAE,WAAW;EAAE,OAAO;EAAI,MAAM;EAAG,EAAE,CACtC,EACK,IAAY,GAAM,oBAAoB,EAAE;AAE9C,QACE,kBAAC,GAAD;EACE,OAAO,EAAE,0BAA0B,qBAAqB;EACxD,aAAa,EAAE,iCAAiC,WAAW;EAC3D,UAAU,EAAE,6BAA6B,iDAAiD;YAH5F,CAKE,kBAAC,GAAD;GAAa,MAAM,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;aAChD,EACC,4BACA,oOACD;GACW,CAAA,EAEb,EAAU,WAAW,IACpB,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,+BAA+B,yBAAyB;GACjE,aAAa,EACX,qCACA,sEACD;GACD,CAAA,GAEF,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAA5C,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAE,uCAAuC,sBAAsB;IAC7D,CAAA,EACL,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAU,KAAK,MACd,kBAAC,GAAD;KAEE,OAAO,EAAS;KAChB,MAAM,EAAS;KACf,OAAO,kBAAC,GAAD;MAAa,QAAQ,EAAS;MAAQ,MAAM,EAAS,WAAW;MAAY,CAAA;KACnF,QACE,kBAAC,MAAD;MAAI,WAAU;gBAAd;OACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAE,6BAA6B,WAAW;QACxC,CAAA,EACL,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAS;QACP,CAAA,CACD,EAAA,CAAA;OACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAE,4BAA4B,UAAU;QACtC,CAAA,EACL,kBAAC,MAAD;QAAI,WAAU;kBAAd,CAAkE,KAC9D,OAAO,EAAS,aAAa,CAAC,gBAAgB,CAC7C;UACD,EAAA,CAAA;OACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAE,2BAA2B,SAAS;QACpC,CAAA,EACL,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAS,UAAU,EAAE,6BAA6B,MAAM;QACtD,CAAA,CACD,EAAA,CAAA;OACH;;KAEP,EAhCK,EAAS,GAgCd,CACF;IACE,CAAA,CACI;KAEJ"}
@@ -1,70 +1,79 @@
1
1
  import { GGNOMAD_ACTIVITIES_QUERY as e, GGNOMAD_EVENTS_QUERY as t, GGNOMAD_PROPERTIES_QUERY as n, GGNOMAD_TOURS_QUERY as r } from "../graphql.js";
2
2
  import { PageShell as i } from "./PageShell.js";
3
- import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
4
- import { useQuery as o } from "@apollo/client/react";
5
- import { jsx as s, jsxs as c } from "react/jsx-runtime";
3
+ import { StatCard as a } from "../components/StatCard.js";
4
+ import "../components/index.js";
5
+ import { Activity as o, Building as s, Compass as c, Search as l, Ticket as u } from "lucide-react";
6
+ import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
7
+ import { useQuery as f } from "@apollo/client/react";
8
+ import { EmphasisPanel as p, IllustratedEmptyState as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
9
+ import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
6
10
  //#region src/ggnomad/pages/SearchPage.tsx
7
- function l() {
8
- let { t: l } = a(), u = o(n, { variables: {
11
+ function y() {
12
+ let { t: y } = d(), b = f(n, { variables: {
9
13
  first: 5,
10
14
  skip: 0
11
- } }), d = o(r, { variables: {
15
+ } }), x = f(r, { variables: {
12
16
  first: 5,
13
17
  skip: 0
14
- } }), f = o(t, { variables: {
18
+ } }), S = f(t, { variables: {
15
19
  first: 5,
16
20
  skip: 0
17
- } }), p = o(e, { variables: {
21
+ } }), C = f(e, { variables: {
18
22
  first: 5,
19
23
  skip: 0
20
- } });
21
- return /* @__PURE__ */ s(i, {
22
- title: l("ggnomad.search.title", "Global Search"),
23
- subtitle: l("ggnomad.search.subtitle", "Cross-domain search across all GGNomad inventory"),
24
- children: /* @__PURE__ */ c("div", {
25
- className: "grid gap-4 md:grid-cols-2",
24
+ } }), w = b.data?.ggnomadProperties?.length ?? 0, T = x.data?.ggnomadTours?.length ?? 0, E = S.data?.ggnomadEvents?.length ?? 0, D = C.data?.ggnomadActivities?.length ?? 0, O = w + T + E + D;
25
+ return /* @__PURE__ */ v(i, {
26
+ title: y("ggnomad.search.title", "Global Search"),
27
+ titleAccent: y("ggnomad.search.title.accent", "Search"),
28
+ subtitle: y("ggnomad.search.subtitle", "Cross-domain search across all GGNomad inventory"),
29
+ children: [/* @__PURE__ */ _(h, {
30
+ icon: /* @__PURE__ */ _(l, { className: "size-4" }),
31
+ children: y("ggnomad.search.purpose", "One search across the entire GGNomad catalogue — properties, tours, events and activities at once — so you can see everything available for a destination in a single view instead of checking each domain separately.")
32
+ }), O === 0 ? /* @__PURE__ */ _(m, {
33
+ illustration: "empty-search",
34
+ title: y("ggnomad.search.emptyTitle", "No matching inventory"),
35
+ description: y("ggnomad.search.emptyDescription", "Nothing matched across properties, tours, events and activities yet.")
36
+ }) : /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ v(p, { children: [
37
+ /* @__PURE__ */ _("p", {
38
+ className: "text-sm text-text-secondary",
39
+ children: y("ggnomad.search.totalMatches", "Total matches across all domains")
40
+ }),
41
+ /* @__PURE__ */ _("p", {
42
+ className: "mt-1 text-3xl font-semibold tabular-nums text-text-primary",
43
+ children: O.toLocaleString()
44
+ }),
45
+ /* @__PURE__ */ _("p", {
46
+ className: "mt-2 text-sm text-text-secondary",
47
+ children: y("ggnomad.search.totalMatchesNote", "Combined inventory from properties, tours, events and activities — open a domain below to drill in.")
48
+ })
49
+ ] }), /* @__PURE__ */ v("section", {
50
+ className: "grid gap-4 sm:grid-cols-2 xl:grid-cols-4",
26
51
  children: [
27
- /* @__PURE__ */ c("div", {
28
- className: "rounded-lg border p-4",
29
- children: [
30
- l("ggnomad.search.results.propertiesFound", "Properties found"),
31
- ":",
32
- " ",
33
- u.data?.ggnomadProperties?.length ?? 0
34
- ]
52
+ /* @__PURE__ */ _(a, {
53
+ label: y("ggnomad.search.results.propertiesFound", "Properties found"),
54
+ value: w,
55
+ icon: /* @__PURE__ */ _(s, {})
35
56
  }),
36
- /* @__PURE__ */ c("div", {
37
- className: "rounded-lg border p-4",
38
- children: [
39
- l("ggnomad.search.results.toursFound", "Tours found"),
40
- ":",
41
- " ",
42
- d.data?.ggnomadTours?.length ?? 0
43
- ]
57
+ /* @__PURE__ */ _(a, {
58
+ label: y("ggnomad.search.results.toursFound", "Tours found"),
59
+ value: T,
60
+ icon: /* @__PURE__ */ _(c, {})
44
61
  }),
45
- /* @__PURE__ */ c("div", {
46
- className: "rounded-lg border p-4",
47
- children: [
48
- l("ggnomad.search.results.eventsFound", "Events found"),
49
- ":",
50
- " ",
51
- f.data?.ggnomadEvents?.length ?? 0
52
- ]
62
+ /* @__PURE__ */ _(a, {
63
+ label: y("ggnomad.search.results.eventsFound", "Events found"),
64
+ value: E,
65
+ icon: /* @__PURE__ */ _(u, {})
53
66
  }),
54
- /* @__PURE__ */ c("div", {
55
- className: "rounded-lg border p-4",
56
- children: [
57
- l("ggnomad.search.results.activitiesFound", "Activities found"),
58
- ":",
59
- " ",
60
- p.data?.ggnomadActivities?.length ?? 0
61
- ]
67
+ /* @__PURE__ */ _(a, {
68
+ label: y("ggnomad.search.results.activitiesFound", "Activities found"),
69
+ value: D,
70
+ icon: /* @__PURE__ */ _(o, {})
62
71
  })
63
72
  ]
64
- })
73
+ })] })]
65
74
  });
66
75
  }
67
76
  //#endregion
68
- export { l as SearchPage };
77
+ export { y as SearchPage };
69
78
 
70
79
  //# sourceMappingURL=SearchPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SearchPage.js","names":[],"sources":["../../../src/ggnomad/pages/SearchPage.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nimport {\n GGNOMAD_PROPERTIES_QUERY,\n GGNOMAD_TOURS_QUERY,\n GGNOMAD_EVENTS_QUERY,\n GGNOMAD_ACTIVITIES_QUERY,\n} from '../graphql';\nimport { PageShell } from './PageShell';\n\nexport function SearchPage() {\n const { t } = useI18n();\n const properties = useQuery<{ ggnomadProperties: Array<{ id: string }> }>(\n GGNOMAD_PROPERTIES_QUERY,\n { variables: { first: 5, skip: 0 } }\n );\n const tours = useQuery<{ ggnomadTours: Array<{ id: string }> }>(GGNOMAD_TOURS_QUERY, {\n variables: { first: 5, skip: 0 },\n });\n const events = useQuery<{ ggnomadEvents: Array<{ id: string }> }>(GGNOMAD_EVENTS_QUERY, {\n variables: { first: 5, skip: 0 },\n });\n const activities = useQuery<{ ggnomadActivities: Array<{ id: string }> }>(\n GGNOMAD_ACTIVITIES_QUERY,\n { variables: { first: 5, skip: 0 } }\n );\n\n return (\n <PageShell\n title={t('ggnomad.search.title', 'Global Search')}\n subtitle={t('ggnomad.search.subtitle', 'Cross-domain search across all GGNomad inventory')}\n >\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"rounded-lg border p-4\">\n {t('ggnomad.search.results.propertiesFound', 'Properties found')}:{' '}\n {properties.data?.ggnomadProperties?.length ?? 0}\n </div>\n <div className=\"rounded-lg border p-4\">\n {t('ggnomad.search.results.toursFound', 'Tours found')}:{' '}\n {tours.data?.ggnomadTours?.length ?? 0}\n </div>\n <div className=\"rounded-lg border p-4\">\n {t('ggnomad.search.results.eventsFound', 'Events found')}:{' '}\n {events.data?.ggnomadEvents?.length ?? 0}\n </div>\n <div className=\"rounded-lg border p-4\">\n {t('ggnomad.search.results.activitiesFound', 'Activities found')}:{' '}\n {activities.data?.ggnomadActivities?.length ?? 0}\n </div>\n </div>\n </PageShell>\n );\n}\n"],"mappings":";;;;;;AAWA,SAAgB,IAAa;CAC3B,IAAM,EAAE,SAAM,GAAS,EACjB,IAAa,EACjB,GACA,EAAE,WAAW;EAAE,OAAO;EAAG,MAAM;EAAG,EAAE,CACrC,EACK,IAAQ,EAAkD,GAAqB,EACnF,WAAW;EAAE,OAAO;EAAG,MAAM;EAAG,EACjC,CAAC,EACI,IAAS,EAAmD,GAAsB,EACtF,WAAW;EAAE,OAAO;EAAG,MAAM;EAAG,EACjC,CAAC,EACI,IAAa,EACjB,GACA,EAAE,WAAW;EAAE,OAAO;EAAG,MAAM;EAAG,EAAE,CACrC;AAED,QACE,kBAAC,GAAD;EACE,OAAO,EAAE,wBAAwB,gBAAgB;EACjD,UAAU,EAAE,2BAA2B,mDAAmD;YAE1F,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,EAAE,0CAA0C,mBAAmB;MAAC;MAAE;MAClE,EAAW,MAAM,mBAAmB,UAAU;MAC3C;;IACN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,EAAE,qCAAqC,cAAc;MAAC;MAAE;MACxD,EAAM,MAAM,cAAc,UAAU;MACjC;;IACN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,EAAE,sCAAsC,eAAe;MAAC;MAAE;MAC1D,EAAO,MAAM,eAAe,UAAU;MACnC;;IACN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,EAAE,0CAA0C,mBAAmB;MAAC;MAAE;MAClE,EAAW,MAAM,mBAAmB,UAAU;MAC3C;;IACF;;EACI,CAAA"}
1
+ {"version":3,"file":"SearchPage.js","names":[],"sources":["../../../src/ggnomad/pages/SearchPage.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 { Activity, Building, Compass, Search, Ticket } from 'lucide-react';\nimport { EmphasisPanel, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport {\n GGNOMAD_PROPERTIES_QUERY,\n GGNOMAD_TOURS_QUERY,\n GGNOMAD_EVENTS_QUERY,\n GGNOMAD_ACTIVITIES_QUERY,\n} from '../graphql';\nimport { PageShell } from './PageShell';\nimport { StatCard } from '../components';\n\nexport function SearchPage() {\n const { t } = useI18n();\n const properties = useQuery(\n GGNOMAD_PROPERTIES_QUERY as TypedDocumentNode<\n { ggnomadProperties: Array<{ id: string }> },\n { first: number; skip: number }\n >,\n { variables: { first: 5, skip: 0 } }\n );\n const tours = useQuery(\n GGNOMAD_TOURS_QUERY as TypedDocumentNode<\n { ggnomadTours: Array<{ id: string }> },\n { first: number; skip: number }\n >,\n {\n variables: { first: 5, skip: 0 },\n }\n );\n const events = useQuery(\n GGNOMAD_EVENTS_QUERY as TypedDocumentNode<\n { ggnomadEvents: Array<{ id: string }> },\n { first: number; skip: number }\n >,\n {\n variables: { first: 5, skip: 0 },\n }\n );\n const activities = useQuery(\n GGNOMAD_ACTIVITIES_QUERY as TypedDocumentNode<\n { ggnomadActivities: Array<{ id: string }> },\n { first: number; skip: number }\n >,\n { variables: { first: 5, skip: 0 } }\n );\n\n const propertyCount = properties.data?.ggnomadProperties?.length ?? 0;\n const tourCount = tours.data?.ggnomadTours?.length ?? 0;\n const eventCount = events.data?.ggnomadEvents?.length ?? 0;\n const activityCount = activities.data?.ggnomadActivities?.length ?? 0;\n const total = propertyCount + tourCount + eventCount + activityCount;\n\n return (\n <PageShell\n title={t('ggnomad.search.title', 'Global Search')}\n titleAccent={t('ggnomad.search.title.accent', 'Search')}\n subtitle={t('ggnomad.search.subtitle', 'Cross-domain search across all GGNomad inventory')}\n >\n <PagePurpose icon={<Search className=\"size-4\" />}>\n {t(\n 'ggnomad.search.purpose',\n 'One search across the entire GGNomad catalogue — properties, tours, events and activities at once — so you can see everything available for a destination in a single view instead of checking each domain separately.'\n )}\n </PagePurpose>\n\n {total === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title={t('ggnomad.search.emptyTitle', 'No matching inventory')}\n description={t(\n 'ggnomad.search.emptyDescription',\n 'Nothing matched across properties, tours, events and activities yet.'\n )}\n />\n ) : (\n <>\n <EmphasisPanel>\n <p className=\"text-sm text-text-secondary\">\n {t('ggnomad.search.totalMatches', 'Total matches across all domains')}\n </p>\n <p className=\"mt-1 text-3xl font-semibold tabular-nums text-text-primary\">\n {total.toLocaleString()}\n </p>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {t(\n 'ggnomad.search.totalMatchesNote',\n 'Combined inventory from properties, tours, events and activities — open a domain below to drill in.'\n )}\n </p>\n </EmphasisPanel>\n\n <section className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <StatCard\n label={t('ggnomad.search.results.propertiesFound', 'Properties found')}\n value={propertyCount}\n icon={<Building />}\n />\n <StatCard\n label={t('ggnomad.search.results.toursFound', 'Tours found')}\n value={tourCount}\n icon={<Compass />}\n />\n <StatCard\n label={t('ggnomad.search.results.eventsFound', 'Events found')}\n value={eventCount}\n icon={<Ticket />}\n />\n <StatCard\n label={t('ggnomad.search.results.activitiesFound', 'Activities found')}\n value={activityCount}\n icon={<Activity />}\n />\n </section>\n </>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;AAeA,SAAgB,IAAa;CAC3B,IAAM,EAAE,SAAM,GAAS,EACjB,IAAa,EACjB,GAIA,EAAE,WAAW;EAAE,OAAO;EAAG,MAAM;EAAG,EAAE,CACrC,EACK,IAAQ,EACZ,GAIA,EACE,WAAW;EAAE,OAAO;EAAG,MAAM;EAAG,EACjC,CACF,EACK,IAAS,EACb,GAIA,EACE,WAAW;EAAE,OAAO;EAAG,MAAM;EAAG,EACjC,CACF,EACK,IAAa,EACjB,GAIA,EAAE,WAAW;EAAE,OAAO;EAAG,MAAM;EAAG,EAAE,CACrC,EAEK,IAAgB,EAAW,MAAM,mBAAmB,UAAU,GAC9D,IAAY,EAAM,MAAM,cAAc,UAAU,GAChD,IAAa,EAAO,MAAM,eAAe,UAAU,GACnD,IAAgB,EAAW,MAAM,mBAAmB,UAAU,GAC9D,IAAQ,IAAgB,IAAY,IAAa;AAEvD,QACE,kBAAC,GAAD;EACE,OAAO,EAAE,wBAAwB,gBAAgB;EACjD,aAAa,EAAE,+BAA+B,SAAS;EACvD,UAAU,EAAE,2BAA2B,mDAAmD;YAH5F,CAKE,kBAAC,GAAD;GAAa,MAAM,kBAAC,GAAD,EAAQ,WAAU,UAAW,CAAA;aAC7C,EACC,0BACA,yNACD;GACW,CAAA,EAEb,MAAU,IACT,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,6BAA6B,wBAAwB;GAC9D,aAAa,EACX,mCACA,uEACD;GACD,CAAA,GAEF,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,KAAD;IAAG,WAAU;cACV,EAAE,+BAA+B,mCAAmC;IACnE,CAAA;GACJ,kBAAC,KAAD;IAAG,WAAU;cACV,EAAM,gBAAgB;IACrB,CAAA;GACJ,kBAAC,KAAD;IAAG,WAAU;cACV,EACC,mCACA,sGACD;IACC,CAAA;GACU,EAAA,CAAA,EAEhB,kBAAC,WAAD;GAAS,WAAU;aAAnB;IACE,kBAAC,GAAD;KACE,OAAO,EAAE,0CAA0C,mBAAmB;KACtE,OAAO;KACP,MAAM,kBAAC,GAAD,EAAY,CAAA;KAClB,CAAA;IACF,kBAAC,GAAD;KACE,OAAO,EAAE,qCAAqC,cAAc;KAC5D,OAAO;KACP,MAAM,kBAAC,GAAD,EAAW,CAAA;KACjB,CAAA;IACF,kBAAC,GAAD;KACE,OAAO,EAAE,sCAAsC,eAAe;KAC9D,OAAO;KACP,MAAM,kBAAC,GAAD,EAAU,CAAA;KAChB,CAAA;IACF,kBAAC,GAAD;KACE,OAAO,EAAE,0CAA0C,mBAAmB;KACtE,OAAO;KACP,MAAM,kBAAC,GAAD,EAAY,CAAA;KAClB,CAAA;IACM;KACT,EAAA,CAAA,CAEK"}
@@ -1,49 +1,96 @@
1
1
  import { GGNOMAD_TOUR_QUERY as e } from "../graphql.js";
2
2
  import { PageShell as t } from "./PageShell.js";
3
- import { useParams as n } from "react-router-dom";
4
- import { useQuery as r } from "@apollo/client/react";
5
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
3
+ import { SectionCard as n } from "../components/SectionCard.js";
4
+ import { DetailRow as r } from "../components/DetailRow.js";
5
+ import "../components/index.js";
6
+ import { CalendarCheck as i, CheckCircle2 as a, Compass as o } from "lucide-react";
7
+ import { useI18n as s } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
+ import { useNavigate as c, useParams as l } from "react-router-dom";
9
+ import { useQuery as u } from "@apollo/client/react";
10
+ import { GlassCard as d, IllustratedEmptyState as f, NextSteps as p, PagePurpose as m } from "@burdenoff/fe-libs/ui";
11
+ import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
6
12
  //#region src/ggnomad/pages/TourDetailsPage.tsx
7
- function o() {
8
- let { id: o = "" } = n(), { data: s } = r(e, {
9
- variables: { id: o },
10
- skip: !o
11
- }), c = s?.ggnomadTour;
12
- return /* @__PURE__ */ i(t, {
13
- title: c?.name ?? "Tour details",
14
- subtitle: "Tour package details and booking context",
15
- children: c ? /* @__PURE__ */ a("div", {
16
- className: "grid gap-4 md:grid-cols-2 text-sm",
17
- children: [/* @__PURE__ */ a("div", {
18
- className: "rounded-lg border p-4",
19
- children: [
20
- /* @__PURE__ */ a("p", { children: ["Duration: ", c.duration] }),
21
- /* @__PURE__ */ a("p", { children: ["Difficulty: ", c.difficulty ?? "N/A"] }),
22
- /* @__PURE__ */ a("p", { children: ["Guide: ", c.guideName ?? "N/A"] }),
23
- /* @__PURE__ */ a("p", { children: [
24
- "Price: ",
25
- c.currency,
26
- " ",
27
- Number(c.price).toFixed(2)
28
- ] })
29
- ]
30
- }), /* @__PURE__ */ a("div", {
31
- className: "rounded-lg border p-4",
32
- children: [/* @__PURE__ */ i("p", {
33
- className: "mb-2 font-medium",
34
- children: "Highlights"
35
- }), /* @__PURE__ */ i("ul", {
36
- className: "list-inside list-disc",
37
- children: (c.highlights ?? []).map((e) => /* @__PURE__ */ i("li", { children: e }, e))
13
+ function v() {
14
+ let { t: v } = s(), y = c(), { id: b = "" } = l(), { data: x } = u(e, {
15
+ variables: { id: b },
16
+ skip: !b
17
+ }), S = x?.ggnomadTour;
18
+ return /* @__PURE__ */ g(t, {
19
+ title: S?.name ?? v("ggnomad.tour.fallbackTitle", "Tour details"),
20
+ subtitle: v("ggnomad.tour.subtitle", "Tour package details and booking context"),
21
+ children: S ? /* @__PURE__ */ _(h, { children: [
22
+ /* @__PURE__ */ g(m, {
23
+ icon: /* @__PURE__ */ g(o, { className: "size-4" }),
24
+ children: v("ggnomad.tour.purpose", "See exactly what this tour involves — duration, difficulty, your guide, price and the highlights you’ll experience — so you can confirm it fits your trip before booking.")
25
+ }),
26
+ /* @__PURE__ */ g(p, {
27
+ storageKey: "ggnomad-tour-detail",
28
+ steps: [{
29
+ id: "book",
30
+ label: v("ggnomad.tour.next.book", "Book this tour"),
31
+ description: v("ggnomad.tour.next.bookDesc", "Add it to your itinerary and track it under Bookings."),
32
+ icon: /* @__PURE__ */ g(i, { className: "size-4" }),
33
+ onClick: () => y("../../../bookings")
34
+ }, {
35
+ id: "browse",
36
+ label: v("ggnomad.tour.next.browse", "Explore more experiences"),
37
+ description: v("ggnomad.tour.next.browseDesc", "Return to Tourism to compare tours and activities."),
38
+ icon: /* @__PURE__ */ g(o, { className: "size-4" }),
39
+ onClick: () => y("../..")
40
+ }]
41
+ }),
42
+ /* @__PURE__ */ _("div", {
43
+ className: "grid gap-4 lg:grid-cols-2",
44
+ children: [/* @__PURE__ */ _(d, {
45
+ treatment: "glass",
46
+ glow: !0,
47
+ className: "border-border-seam p-5",
48
+ children: [/* @__PURE__ */ g("h2", {
49
+ className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
50
+ children: v("ggnomad.tour.details", "Details")
51
+ }), /* @__PURE__ */ _("dl", {
52
+ className: "space-y-2 text-sm",
53
+ children: [
54
+ /* @__PURE__ */ g(r, {
55
+ label: v("ggnomad.tour.duration", "Duration"),
56
+ value: S.duration
57
+ }),
58
+ /* @__PURE__ */ g(r, {
59
+ label: v("ggnomad.tour.difficulty", "Difficulty"),
60
+ value: S.difficulty ?? v("ggnomad.tour.na", "N/A")
61
+ }),
62
+ /* @__PURE__ */ g(r, {
63
+ label: v("ggnomad.tour.guide", "Guide"),
64
+ value: S.guideName ?? v("ggnomad.tour.na", "N/A")
65
+ }),
66
+ /* @__PURE__ */ g(r, {
67
+ label: v("ggnomad.tour.price", "Price"),
68
+ value: `${S.currency} ${Number(S.price).toFixed(2)}`
69
+ })
70
+ ]
71
+ })]
72
+ }), /* @__PURE__ */ g(n, {
73
+ title: v("ggnomad.tour.highlights", "Highlights"),
74
+ children: /* @__PURE__ */ g("ul", {
75
+ className: "space-y-2 text-sm",
76
+ children: (S.highlights ?? []).map((e) => /* @__PURE__ */ _("li", {
77
+ className: "flex items-start gap-2 text-text-primary",
78
+ children: [/* @__PURE__ */ g(a, {
79
+ className: "mt-0.5 size-4 flex-shrink-0 text-status-success-text",
80
+ "aria-hidden": "true"
81
+ }), e]
82
+ }, e))
83
+ })
38
84
  })]
39
- })]
40
- }) : /* @__PURE__ */ i("div", {
41
- className: "rounded-lg border p-4 text-text-secondary",
42
- children: "No tour found."
85
+ })
86
+ ] }) : /* @__PURE__ */ g(f, {
87
+ illustration: "empty-data",
88
+ title: v("ggnomad.tour.notFoundTitle", "No tour found"),
89
+ description: v("ggnomad.tour.notFoundDescription", "This tour is unavailable or may have been removed.")
43
90
  })
44
91
  });
45
92
  }
46
93
  //#endregion
47
- export { o as TourDetailsPage };
94
+ export { v as TourDetailsPage };
48
95
 
49
96
  //# sourceMappingURL=TourDetailsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TourDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/TourDetailsPage.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport { useParams } from 'react-router-dom';\n\nimport { GGNOMAD_TOUR_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\n\nexport function TourDetailsPage() {\n const { id = '' } = useParams();\n const { data } = useQuery<{\n ggnomadTour: {\n name: string;\n duration: string;\n difficulty?: string;\n guideName?: string;\n currency: string;\n price: number;\n highlights: string[];\n } | null;\n }>(GGNOMAD_TOUR_QUERY, { variables: { id }, skip: !id });\n const tour = data?.ggnomadTour;\n\n return (\n <PageShell\n title={tour?.name ?? 'Tour details'}\n subtitle=\"Tour package details and booking context\"\n >\n {!tour ? (\n <div className=\"rounded-lg border p-4 text-text-secondary\">No tour found.</div>\n ) : (\n <div className=\"grid gap-4 md:grid-cols-2 text-sm\">\n <div className=\"rounded-lg border p-4\">\n <p>Duration: {tour.duration}</p>\n <p>Difficulty: {tour.difficulty ?? 'N/A'}</p>\n <p>Guide: {tour.guideName ?? 'N/A'}</p>\n <p>\n Price: {tour.currency} {Number(tour.price).toFixed(2)}\n </p>\n </div>\n <div className=\"rounded-lg border p-4\">\n <p className=\"mb-2 font-medium\">Highlights</p>\n <ul className=\"list-inside list-disc\">\n {(tour.highlights ?? []).map((highlight: string) => (\n <li key={highlight}>{highlight}</li>\n ))}\n </ul>\n </div>\n </div>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;AAMA,SAAgB,IAAkB;CAChC,IAAM,EAAE,QAAK,OAAO,GAAW,EACzB,EAAE,YAAS,EAUd,GAAoB;EAAE,WAAW,EAAE,OAAI;EAAE,MAAM,CAAC;EAAI,CAAC,EAClD,IAAO,GAAM;AAEnB,QACE,kBAAC,GAAD;EACE,OAAO,GAAM,QAAQ;EACrB,UAAS;YAEP,IAGA,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,KAAD,EAAA,UAAA,CAAG,cAAW,EAAK,SAAa,EAAA,CAAA;KAChC,kBAAC,KAAD,EAAA,UAAA,CAAG,gBAAa,EAAK,cAAc,MAAU,EAAA,CAAA;KAC7C,kBAAC,KAAD,EAAA,UAAA,CAAG,WAAQ,EAAK,aAAa,MAAU,EAAA,CAAA;KACvC,kBAAC,KAAD,EAAA,UAAA;MAAG;MACO,EAAK;MAAS;MAAE,OAAO,EAAK,MAAM,CAAC,QAAQ,EAAE;MACnD,EAAA,CAAA;KACA;OACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAU;eAAmB;KAAc,CAAA,EAC9C,kBAAC,MAAD;KAAI,WAAU;gBACV,EAAK,cAAc,EAAE,EAAE,KAAK,MAC5B,kBAAC,MAAD,EAAA,UAAqB,GAAe,EAA3B,EAA2B,CACpC;KACC,CAAA,CACD;MACF;OAnBN,kBAAC,OAAD;GAAK,WAAU;aAA4C;GAAoB,CAAA;EAqBvE,CAAA"}
1
+ {"version":3,"file":"TourDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/TourDetailsPage.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { CalendarCheck, CheckCircle2, Compass } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_TOUR_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\nimport { DetailRow, SectionCard } from '../components';\n\nexport function TourDetailsPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { id = '' } = useParams();\n const { data } = useQuery(\n GGNOMAD_TOUR_QUERY as TypedDocumentNode<\n {\n ggnomadTour: {\n name: string;\n duration: string;\n difficulty?: string;\n guideName?: string;\n currency: string;\n price: number;\n highlights: 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 <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: 'book',\n label: t('ggnomad.tour.next.book', 'Book this tour'),\n description: t(\n 'ggnomad.tour.next.bookDesc',\n 'Add it to your itinerary and track it under Bookings.'\n ),\n icon: <CalendarCheck className=\"size-4\" />,\n onClick: () => navigate('../../../bookings'),\n },\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('../..'),\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.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 </>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,IAAkB;CAChC,IAAM,EAAE,SAAM,GAAS,EACjB,IAAW,GAAa,EACxB,EAAE,QAAK,OAAO,GAAW,EACzB,EAAE,YAAS,EACf,GAcA;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;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,0BAA0B,iBAAiB;KACpD,aAAa,EACX,8BACA,wDACD;KACD,MAAM,kBAAC,GAAD,EAAe,WAAU,UAAW,CAAA;KAC1C,eAAe,EAAS,oBAAoB;KAC7C,EACD;KACE,IAAI;KACJ,OAAO,EAAE,4BAA4B,2BAA2B;KAChE,aAAa,EACX,gCACA,qDACD;KACD,MAAM,kBAAC,GAAD,EAAS,WAAU,UAAW,CAAA;KACpC,eAAe,EAAS,QAAQ;KACjC,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,wBAAwB,UAAU;MAClC,CAAA,EACL,kBAAC,MAAD;MAAI,WAAU;gBAAd;OACE,kBAAC,GAAD;QAAW,OAAO,EAAE,yBAAyB,WAAW;QAAE,OAAO,EAAK;QAAY,CAAA;OAClF,kBAAC,GAAD;QACE,OAAO,EAAE,2BAA2B,aAAa;QACjD,OAAO,EAAK,cAAc,EAAE,mBAAmB,MAAM;QACrD,CAAA;OACF,kBAAC,GAAD;QACE,OAAO,EAAE,sBAAsB,QAAQ;QACvC,OAAO,EAAK,aAAa,EAAE,mBAAmB,MAAM;QACpD,CAAA;OACF,kBAAC,GAAD;QACE,OAAO,EAAE,sBAAsB,QAAQ;QACvC,OAAO,GAAG,EAAK,SAAS,GAAG,OAAO,EAAK,MAAM,CAAC,QAAQ,EAAE;QACxD,CAAA;OACC;QACK;QACZ,kBAAC,GAAD;KAAa,OAAO,EAAE,2BAA2B,aAAa;eAC5D,kBAAC,MAAD;MAAI,WAAU;iBACV,EAAK,cAAc,EAAE,EAAE,KAAK,MAC5B,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,GA9EH,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,8BAA8B,gBAAgB;GACvD,aAAa,EACX,oCACA,qDACD;GACD,CAAA;EAyEM,CAAA"}
@@ -1,75 +1,76 @@
1
1
  import { GGNOMAD_ACTIVITIES_QUERY as e, GGNOMAD_TOURS_QUERY as t } from "../graphql.js";
2
2
  import { PageShell as n } from "./PageShell.js";
3
- import { Link as r } from "react-router-dom";
4
- import { useQuery as i } from "@apollo/client/react";
5
- import { jsx as a, jsxs as o } from "react/jsx-runtime";
3
+ import { SectionCard as r } from "../components/SectionCard.js";
4
+ import { EntityCard as i } from "../components/EntityCard.js";
5
+ import "../components/index.js";
6
+ import { Compass as a } from "lucide-react";
7
+ import { useI18n as o } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
+ import { useQuery as s } from "@apollo/client/react";
9
+ import { EmphasisPanel as c, IllustratedEmptyState as l, PagePurpose as u } from "@burdenoff/fe-libs/ui";
10
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
6
11
  //#region src/ggnomad/pages/TourismPage.tsx
7
- function s() {
8
- let { data: s } = i(t, { variables: {
12
+ function p() {
13
+ let { t: p } = o(), { data: m } = s(t, { variables: {
9
14
  first: 12,
10
15
  skip: 0
11
- } }), { data: c } = i(e, { variables: {
16
+ } }), { data: h } = s(e, { variables: {
12
17
  first: 12,
13
18
  skip: 0
14
- } }), l = s?.ggnomadTours ?? [], u = c?.ggnomadActivities ?? [];
15
- return /* @__PURE__ */ a(n, {
16
- title: "Tourism",
17
- subtitle: "Tours and curated activity experiences",
18
- children: /* @__PURE__ */ o("div", {
19
- className: "grid gap-6 md:grid-cols-2",
20
- children: [/* @__PURE__ */ o("div", {
21
- className: "space-y-2",
22
- children: [/* @__PURE__ */ a("h2", {
23
- className: "text-lg font-medium",
24
- children: "Tours"
25
- }), l.map((e) => /* @__PURE__ */ o(r, {
26
- to: `tours/${e.id}`,
27
- className: "block rounded-lg border p-3 text-sm hover:bg-bg-sunken/30",
28
- children: [
29
- /* @__PURE__ */ a("p", {
30
- className: "font-medium",
31
- children: e.name
32
- }),
33
- /* @__PURE__ */ a("p", {
34
- className: "text-text-secondary",
35
- children: e.duration
36
- }),
37
- /* @__PURE__ */ o("p", { children: [
38
- e.currency,
39
- " ",
40
- Number(e.price).toFixed(2)
41
- ] })
42
- ]
43
- }, e.id))]
44
- }), /* @__PURE__ */ o("div", {
45
- className: "space-y-2",
46
- children: [/* @__PURE__ */ a("h2", {
47
- className: "text-lg font-medium",
48
- children: "Activities"
49
- }), u.map((e) => /* @__PURE__ */ o(r, {
50
- to: `activities/${e.id}`,
51
- className: "block rounded-lg border p-3 text-sm hover:bg-bg-sunken/30",
52
- children: [
53
- /* @__PURE__ */ a("p", {
54
- className: "font-medium",
55
- children: e.name
56
- }),
57
- /* @__PURE__ */ a("p", {
58
- className: "text-text-secondary",
59
- children: e.duration
60
- }),
61
- /* @__PURE__ */ o("p", { children: [
62
- e.currency,
63
- " ",
64
- Number(e.price).toFixed(2)
65
- ] })
66
- ]
67
- }, e.id))]
68
- })]
69
- })
19
+ } }), g = m?.ggnomadTours ?? [], _ = h?.ggnomadActivities ?? [], v = (e, t, n) => e.length === 0 ? /* @__PURE__ */ d(l, {
20
+ illustration: "empty-data",
21
+ title: n,
22
+ description: p("ggnomad.tourism.emptyDescription", "Curated experiences will appear here once published.")
23
+ }) : /* @__PURE__ */ d("div", {
24
+ className: "grid gap-3",
25
+ children: e.map((e) => /* @__PURE__ */ d(i, {
26
+ to: `${t}/${e.id}`,
27
+ title: e.name,
28
+ meta: e.duration,
29
+ price: `${e.currency} ${Number(e.price).toFixed(2)}`
30
+ }, e.id))
31
+ });
32
+ return /* @__PURE__ */ f(n, {
33
+ title: p("ggnomad.tourism.title", "Tourism"),
34
+ titleAccent: p("ggnomad.tourism.title.accent", "Tourism"),
35
+ subtitle: p("ggnomad.tourism.subtitle", "Tours and curated activity experiences"),
36
+ children: [
37
+ /* @__PURE__ */ d(u, {
38
+ icon: /* @__PURE__ */ d(a, { className: "size-4" }),
39
+ children: p("ggnomad.tourism.purpose", "Plan what you’ll actually do at a destination — guided tours and bookable activities curated by local operators. Open any experience to review duration, price and what’s included, then add it to a booking.")
40
+ }),
41
+ /* @__PURE__ */ f(c, { children: [/* @__PURE__ */ f("div", {
42
+ className: "grid gap-4 sm:grid-cols-2",
43
+ children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("p", {
44
+ className: "text-sm text-text-secondary",
45
+ children: p("ggnomad.tourism.tours", "Tours")
46
+ }), /* @__PURE__ */ d("p", {
47
+ className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
48
+ children: g.length
49
+ })] }), /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("p", {
50
+ className: "text-sm text-text-secondary",
51
+ children: p("ggnomad.tourism.activities", "Activities")
52
+ }), /* @__PURE__ */ d("p", {
53
+ className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
54
+ children: _.length
55
+ })] })]
56
+ }), /* @__PURE__ */ d("p", {
57
+ className: "mt-4 text-sm text-text-secondary",
58
+ children: p("ggnomad.tourism.emphasisNote", "Curated, bookable experiences across your destinations — pick a tour or activity below to see full details.")
59
+ })] }),
60
+ /* @__PURE__ */ f("div", {
61
+ className: "grid gap-6 lg:grid-cols-2",
62
+ children: [/* @__PURE__ */ d(r, {
63
+ title: p("ggnomad.tourism.tours", "Tours"),
64
+ children: v(g, "tours", p("ggnomad.tourism.toursEmpty", "No tours yet"))
65
+ }), /* @__PURE__ */ d(r, {
66
+ title: p("ggnomad.tourism.activities", "Activities"),
67
+ children: v(_, "activities", p("ggnomad.tourism.activitiesEmpty", "No activities yet"))
68
+ })]
69
+ })
70
+ ]
70
71
  });
71
72
  }
72
73
  //#endregion
73
- export { s as TourismPage };
74
+ export { p as TourismPage };
74
75
 
75
76
  //# sourceMappingURL=TourismPage.js.map