@burdenoff/microfe-ggnomad 2026.704.1 → 2026.705.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.
@@ -1,56 +1,65 @@
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 { Hotel as r, Star as i } from "lucide-react";
6
- import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
7
- import { useQuery as o } from "@apollo/client/react";
8
- import { GlassCard as s, IllustratedEmptyState as c, PagePurpose as l } from "@burdenoff/fe-libs/ui";
9
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
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 f() {
12
- let { t: f } = a(), { data: p } = o(e, { variables: {
13
- first: 20,
13
+ function m() {
14
+ let { t: m } = s(), [h, g] = i(12), { data: _ } = c(e, { variables: {
15
+ first: h,
14
16
  skip: 0
15
- } }), m = p?.ggnomadProperties ?? [];
16
- return /* @__PURE__ */ d(t, {
17
- title: f("ggnomad.hospitality.title", "Hospitality"),
18
- titleAccent: f("ggnomad.hospitality.title.accent", "Hospitality"),
19
- subtitle: f("ggnomad.hospitality.subtitle", "Property discovery powered by live GraphQL data"),
20
- children: [/* @__PURE__ */ u(l, {
21
- icon: /* @__PURE__ */ u(r, { className: "size-4" }),
22
- children: f("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.")
23
- }), m.length === 0 ? /* @__PURE__ */ u(c, {
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: f("ggnomad.hospitality.emptyTitle", "No properties available"),
26
- description: f("ggnomad.hospitality.emptyDescription", "Properties published by providers will be discoverable here.")
27
- }) : /* @__PURE__ */ d(s, {
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: [/* @__PURE__ */ u("h2", {
32
- className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
33
- children: f("ggnomad.hospitality.featuredStays", "Featured stays")
34
- }), /* @__PURE__ */ u("div", {
35
- className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3",
36
- children: m.map((e) => /* @__PURE__ */ u(n, {
37
- to: e.id,
38
- title: e.name,
39
- meta: e.type,
40
- price: `${e.currency} ${Number(e.pricePerNight).toFixed(2)} ${f("ggnomad.hospitality.card.perNight", "per night")}`,
41
- footer: /* @__PURE__ */ d("span", {
42
- className: "inline-flex items-center gap-1 tabular-nums",
43
- children: [/* @__PURE__ */ u(i, {
44
- className: "size-3.5 text-status-warning-text",
45
- "aria-hidden": "true"
46
- }), e.rating ?? f("ggnomad.hospitality.card.noRating", "N/A")]
47
- })
48
- }, e.id))
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
+ title: e.name,
43
+ meta: e.type,
44
+ price: `${e.currency} ${Number(e.pricePerNight).toFixed(2)} ${m("ggnomad.hospitality.card.perNight", "per night")}`,
45
+ footer: /* @__PURE__ */ p("span", {
46
+ className: "inline-flex items-center gap-1 tabular-nums",
47
+ children: [/* @__PURE__ */ f(o, {
48
+ className: "size-3.5 text-status-warning-text",
49
+ "aria-hidden": "true"
50
+ }), e.rating ?? m("ggnomad.hospitality.card.noRating", "N/A")]
51
+ })
52
+ }, e.id))
53
+ }),
54
+ /* @__PURE__ */ f(r, {
55
+ visible: v.length >= h,
56
+ onLoadMore: () => g((e) => e + 12)
57
+ })
58
+ ]
50
59
  })]
51
60
  });
52
61
  }
53
62
  //#endregion
54
- export { f as HospitalityPage };
63
+ export { m as HospitalityPage };
55
64
 
56
65
  //# 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: 20, 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 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 </GlassCard>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;AAUA,SAAgB,IAAkB;CAChC,IAAM,EAAE,SAAM,GAAS,EACjB,EAAE,YAAS,EACf,GAaA,EAAE,WAAW;EAAE,OAAO;EAAI,MAAM;EAAG,EAAE,CACtC,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,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAE,qCAAqC,iBAAiB;IACtD,CAAA,EACL,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAW,KAAK,MACf,kBAAC,GAAD;KAEE,IAAI,EAAS;KACb,OAAO,EAAS;KAChB,MAAM,EAAS;KACf,OAAO,GAAG,EAAS,SAAS,GAAG,OAAO,EAAS,cAAc,CAAC,QAAQ,EAAE,CAAC,GAAG,EAC1E,qCACA,YACD;KACD,QACE,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD;OAAM,WAAU;OAAoC,eAAY;OAAS,CAAA,EACxE,EAAS,UAAU,EAAE,qCAAqC,MAAM,CAC5D;;KAET,EAdK,EAAS,GAcd,CACF;IACE,CAAA,CACI;KAEJ"}
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 }>;\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 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,GAaA,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;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,EAdK,EAAS,GAcd,CACF;KACE,CAAA;IACN,kBAAC,GAAD;KACE,SAAS,EAAW,UAAU;KAC9B,kBAAkB,GAAU,MAAM,IAAI,GAAG;KACzC,CAAA;IACQ;KAEJ"}
@@ -3,102 +3,104 @@ import { PageShell as t } from "./PageShell.js";
3
3
  import { SectionCard as n } from "../components/SectionCard.js";
4
4
  import { DetailRow as r } from "../components/DetailRow.js";
5
5
  import "../components/index.js";
6
- import { CalendarCheck as i, Hotel as a } from "lucide-react";
7
- import { useI18n as o } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
- import { useNavigate as s, useParams as c } from "react-router-dom";
9
- import { useQuery as l } from "@apollo/client/react";
10
- import { GlassCard as u, IllustratedEmptyState as d, NextSteps as f, PagePurpose as p } from "@burdenoff/fe-libs/ui";
11
- import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
6
+ import { useGGNomad as i } from "../providers/GGNomadProvider.js";
7
+ import { joinPath as a } from "../utils/navigation.js";
8
+ import { CalendarCheck as o, Hotel as s } from "lucide-react";
9
+ import { useI18n as c } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
10
+ import { useNavigate as l, useParams as u } from "react-router-dom";
11
+ import { useQuery as d } from "@apollo/client/react";
12
+ import { GlassCard as f, IllustratedEmptyState as p, NextSteps as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
13
+ import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
12
14
  //#region src/ggnomad/pages/PropertyDetailsPage.tsx
13
- function _() {
14
- let { t: _ } = o(), v = s(), { id: y = "" } = c(), { data: b } = l(e, {
15
- variables: { id: y },
16
- skip: !y
17
- }), x = b?.ggnomadProperty;
18
- return /* @__PURE__ */ h(t, {
19
- title: x?.name ?? _("ggnomad.property.fallbackTitle", "Property details"),
20
- subtitle: _("ggnomad.property.subtitle", "Detailed hospitality listing view"),
21
- children: x ? /* @__PURE__ */ g(m, { children: [
22
- /* @__PURE__ */ h(p, {
23
- icon: /* @__PURE__ */ h(a, { className: "size-4" }),
24
- children: _("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.")
15
+ function y() {
16
+ let { t: y } = c(), b = l(), { basePath: x = "/" } = i(), { id: S = "" } = u(), { data: C } = d(e, {
17
+ variables: { id: S },
18
+ skip: !S
19
+ }), w = C?.ggnomadProperty;
20
+ return /* @__PURE__ */ _(t, {
21
+ title: w?.name ?? y("ggnomad.property.fallbackTitle", "Property details"),
22
+ subtitle: y("ggnomad.property.subtitle", "Detailed hospitality listing view"),
23
+ children: w ? /* @__PURE__ */ v(g, { children: [
24
+ /* @__PURE__ */ _(h, {
25
+ icon: /* @__PURE__ */ _(s, { className: "size-4" }),
26
+ children: y("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.")
25
27
  }),
26
- /* @__PURE__ */ h(f, {
28
+ /* @__PURE__ */ _(m, {
27
29
  storageKey: "ggnomad-property-detail",
28
30
  steps: [{
29
31
  id: "book",
30
- label: _("ggnomad.property.next.book", "Book this stay"),
31
- description: _("ggnomad.property.next.bookDesc", "Reserve these dates and track it under Bookings."),
32
- icon: /* @__PURE__ */ h(i, { className: "size-4" }),
33
- onClick: () => v("../../bookings")
32
+ label: y("ggnomad.property.next.book", "Book this stay"),
33
+ description: y("ggnomad.property.next.bookDesc", "Reserve these dates and track it under Bookings."),
34
+ icon: /* @__PURE__ */ _(o, { className: "size-4" }),
35
+ onClick: () => b(a(x, "bookings"))
34
36
  }, {
35
37
  id: "browse",
36
- label: _("ggnomad.property.next.browse", "Compare other stays"),
37
- description: _("ggnomad.property.next.browseDesc", "Go back to hospitality listings to compare options."),
38
- icon: /* @__PURE__ */ h(a, { className: "size-4" }),
39
- onClick: () => v("..")
38
+ label: y("ggnomad.property.next.browse", "Compare other stays"),
39
+ description: y("ggnomad.property.next.browseDesc", "Go back to hospitality listings to compare options."),
40
+ icon: /* @__PURE__ */ _(s, { className: "size-4" }),
41
+ onClick: () => b(a(x, "hospitality"))
40
42
  }]
41
43
  }),
42
- /* @__PURE__ */ g("div", {
44
+ /* @__PURE__ */ v("div", {
43
45
  className: "grid gap-4 lg:grid-cols-2",
44
- children: [/* @__PURE__ */ g(n, {
45
- title: _("ggnomad.property.about", "About"),
46
+ children: [/* @__PURE__ */ v(n, {
47
+ title: y("ggnomad.property.about", "About"),
46
48
  children: [
47
- /* @__PURE__ */ h("p", {
49
+ /* @__PURE__ */ _("p", {
48
50
  className: "text-sm text-text-secondary",
49
- children: _("ggnomad.property.type", "Type")
51
+ children: y("ggnomad.property.type", "Type")
50
52
  }),
51
- /* @__PURE__ */ h("p", {
53
+ /* @__PURE__ */ _("p", {
52
54
  className: "text-text-primary",
53
- children: x.type
55
+ children: w.type
54
56
  }),
55
- /* @__PURE__ */ h("p", {
57
+ /* @__PURE__ */ _("p", {
56
58
  className: "mt-3 text-sm text-text-secondary",
57
- children: _("ggnomad.property.description", "Description")
59
+ children: y("ggnomad.property.description", "Description")
58
60
  }),
59
- /* @__PURE__ */ h("p", {
61
+ /* @__PURE__ */ _("p", {
60
62
  className: "text-text-primary",
61
- children: x.description ?? _("ggnomad.property.noDescription", "No description")
63
+ children: w.description ?? y("ggnomad.property.noDescription", "No description")
62
64
  })
63
65
  ]
64
- }), /* @__PURE__ */ g(u, {
66
+ }), /* @__PURE__ */ v(f, {
65
67
  treatment: "glass",
66
68
  glow: !0,
67
69
  className: "border-border-seam p-5",
68
- children: [/* @__PURE__ */ h("h2", {
70
+ children: [/* @__PURE__ */ _("h2", {
69
71
  className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
70
- children: _("ggnomad.property.details", "Details")
71
- }), /* @__PURE__ */ g("dl", {
72
+ children: y("ggnomad.property.details", "Details")
73
+ }), /* @__PURE__ */ v("dl", {
72
74
  className: "space-y-2 text-sm",
73
75
  children: [
74
- /* @__PURE__ */ h(r, {
75
- label: _("ggnomad.property.price", "Price"),
76
- value: `${x.currency} ${Number(x.pricePerNight).toFixed(2)}`
76
+ /* @__PURE__ */ _(r, {
77
+ label: y("ggnomad.property.price", "Price"),
78
+ value: `${w.currency} ${Number(w.pricePerNight).toFixed(2)}`
77
79
  }),
78
- /* @__PURE__ */ h(r, {
79
- label: _("ggnomad.property.guests", "Guests"),
80
- value: String(x.maxGuests)
80
+ /* @__PURE__ */ _(r, {
81
+ label: y("ggnomad.property.guests", "Guests"),
82
+ value: String(w.maxGuests)
81
83
  }),
82
- /* @__PURE__ */ h(r, {
83
- label: _("ggnomad.property.rating", "Rating"),
84
- value: String(x.rating ?? _("ggnomad.property.noRating", "N/A"))
84
+ /* @__PURE__ */ _(r, {
85
+ label: y("ggnomad.property.rating", "Rating"),
86
+ value: String(w.rating ?? y("ggnomad.property.noRating", "N/A"))
85
87
  }),
86
- /* @__PURE__ */ h(r, {
87
- label: _("ggnomad.property.provider", "Provider"),
88
- value: x.provider?.name ?? _("ggnomad.property.unassigned", "Unassigned")
88
+ /* @__PURE__ */ _(r, {
89
+ label: y("ggnomad.property.provider", "Provider"),
90
+ value: w.provider?.name ?? y("ggnomad.property.unassigned", "Unassigned")
89
91
  })
90
92
  ]
91
93
  })]
92
94
  })]
93
95
  })
94
- ] }) : /* @__PURE__ */ h(d, {
96
+ ] }) : /* @__PURE__ */ _(p, {
95
97
  illustration: "empty-data",
96
- title: _("ggnomad.property.notFoundTitle", "No property found"),
97
- description: _("ggnomad.property.notFoundDescription", "This property is unavailable or may have been removed.")
98
+ title: y("ggnomad.property.notFoundTitle", "No property found"),
99
+ description: y("ggnomad.property.notFoundDescription", "This property is unavailable or may have been removed.")
98
100
  })
99
101
  });
100
102
  }
101
103
  //#endregion
102
- export { _ as PropertyDetailsPage };
104
+ export { y as PropertyDetailsPage };
103
105
 
104
106
  //# 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('../../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('..'),\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":";;;;;;;;;;;;AAWA,SAAgB,IAAsB;CACpC,IAAM,EAAE,SAAM,GAAS,EACjB,IAAW,GAAa,EACxB,EAAE,QAAK,OAAO,GAAW,EACzB,EAAE,YAAS,EACf,GAeA;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;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,iBAAiB;KAC1C,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,KAAK;KAC9B,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,GA9EH,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,kCAAkC,oBAAoB;GAC/D,aAAa,EACX,wCACA,yDACD;GACD,CAAA;EAyEM,CAAA"}
1
+ {"version":3,"file":"PropertyDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/PropertyDetailsPage.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { 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 } 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 } | 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(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,GAeA;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;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,GA9EH,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,kCAAkC,oBAAoB;GAC/D,aAAa,EACX,wCACA,yDACD;GACD,CAAA;EAyEM,CAAA"}
@@ -2,77 +2,86 @@ import { GGNOMAD_PROVIDERS_QUERY as e } from "../graphql.js";
2
2
  import { PageShell as t } from "./PageShell.js";
3
3
  import { StatusBadge as n } from "../components/StatusBadge.js";
4
4
  import { EntityCard as r } from "../components/EntityCard.js";
5
+ import { LoadMoreButton as i } from "../components/LoadMoreButton.js";
5
6
  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";
7
+ import { useState as a } from "react";
8
+ import { Briefcase as o } from "lucide-react";
9
+ import { useI18n as s } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
10
+ import { useQuery as c } from "@apollo/client/react";
11
+ import { GlassCard as l, IllustratedEmptyState as u, PagePurpose as d } from "@burdenoff/fe-libs/ui";
12
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
11
13
  //#region src/ggnomad/pages/ProviderPage.tsx
12
- function f() {
13
- let { t: f } = a(), { data: p } = o(e, { variables: {
14
- first: 20,
14
+ function m() {
15
+ let { t: m } = s(), [h, g] = a(12), { data: _ } = c(e, { variables: {
16
+ first: h,
15
17
  skip: 0
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, {
18
+ } }), v = _?.ggnomadProviders ?? [];
19
+ return /* @__PURE__ */ p(t, {
20
+ title: m("ggnomad.provider.title", "Provider Dashboard"),
21
+ titleAccent: m("ggnomad.provider.title.accent", "Provider"),
22
+ subtitle: m("ggnomad.provider.subtitle", "B2B provider operations and onboarding metrics"),
23
+ children: [/* @__PURE__ */ f(d, {
24
+ icon: /* @__PURE__ */ f(o, { className: "size-4" }),
25
+ children: m("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.")
26
+ }), v.length === 0 ? /* @__PURE__ */ f(u, {
25
27
  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, {
28
+ title: m("ggnomad.provider.emptyTitle", "No providers onboarded"),
29
+ description: m("ggnomad.provider.emptyDescription", "Onboarded B2B providers and their performance will be tracked here.")
30
+ }) : /* @__PURE__ */ p(l, {
29
31
  treatment: "glass",
30
32
  glow: !0,
31
33
  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"
43
- }),
44
- footer: /* @__PURE__ */ d("dl", {
45
- className: "grid grid-cols-3 gap-2 text-xs",
46
- children: [
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
- })] })
68
- ]
69
- })
70
- }, e.id))
71
- })]
34
+ children: [
35
+ /* @__PURE__ */ f("h2", {
36
+ className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
37
+ children: m("ggnomad.provider.onboardedProviders", "Onboarded providers")
38
+ }),
39
+ /* @__PURE__ */ f("div", {
40
+ className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3",
41
+ children: v.map((e) => /* @__PURE__ */ f(r, {
42
+ title: e.name,
43
+ meta: e.type,
44
+ badge: /* @__PURE__ */ f(n, {
45
+ status: e.status,
46
+ live: e.status === "ACTIVE"
47
+ }),
48
+ footer: /* @__PURE__ */ p("dl", {
49
+ className: "grid grid-cols-3 gap-2 text-xs",
50
+ children: [
51
+ /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("dt", {
52
+ className: "text-text-secondary",
53
+ children: m("ggnomad.provider.listings", "Listings")
54
+ }), /* @__PURE__ */ f("dd", {
55
+ className: "mt-0.5 font-medium tabular-nums text-text-primary",
56
+ children: e.listingCount
57
+ })] }),
58
+ /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("dt", {
59
+ className: "text-text-secondary",
60
+ children: m("ggnomad.provider.revenue", "Revenue")
61
+ }), /* @__PURE__ */ p("dd", {
62
+ className: "mt-0.5 font-medium tabular-nums text-text-primary",
63
+ children: ["$", Number(e.totalRevenue).toLocaleString()]
64
+ })] }),
65
+ /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("dt", {
66
+ className: "text-text-secondary",
67
+ children: m("ggnomad.provider.rating", "Rating")
68
+ }), /* @__PURE__ */ f("dd", {
69
+ className: "mt-0.5 font-medium tabular-nums text-text-primary",
70
+ children: e.rating ?? m("ggnomad.provider.noRating", "N/A")
71
+ })] })
72
+ ]
73
+ })
74
+ }, e.id))
75
+ }),
76
+ /* @__PURE__ */ f(i, {
77
+ visible: v.length >= h,
78
+ onLoadMore: () => g((e) => e + 12)
79
+ })
80
+ ]
72
81
  })]
73
82
  });
74
83
  }
75
84
  //#endregion
76
- export { f as ProviderPage };
85
+ export { m as ProviderPage };
77
86
 
78
87
  //# 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';\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
+ {"version":3,"file":"ProviderPage.js","names":[],"sources":["../../../src/ggnomad/pages/ProviderPage.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 { 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, LoadMoreButton, StatusBadge } from '../components';\n\nexport function ProviderPage() {\n const { t } = useI18n();\n const [limit, setLimit] = useState(12);\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: limit, 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 <LoadMoreButton\n visible={providers.length >= limit}\n onLoadMore={() => setLimit((l) => l + 12)}\n />\n </GlassCard>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAWA,SAAgB,IAAe;CAC7B,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,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;IACE,kBAAC,MAAD;KAAI,WAAU;eACX,EAAE,uCAAuC,sBAAsB;KAC7D,CAAA;IACL,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAU,KAAK,MACd,kBAAC,GAAD;MAEE,OAAO,EAAS;MAChB,MAAM,EAAS;MACf,OAAO,kBAAC,GAAD;OAAa,QAAQ,EAAS;OAAQ,MAAM,EAAS,WAAW;OAAY,CAAA;MACnF,QACE,kBAAC,MAAD;OAAI,WAAU;iBAAd;QACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAE,6BAA6B,WAAW;SACxC,CAAA,EACL,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAS;SACP,CAAA,CACD,EAAA,CAAA;QACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAE,4BAA4B,UAAU;SACtC,CAAA,EACL,kBAAC,MAAD;SAAI,WAAU;mBAAd,CAAkE,KAC9D,OAAO,EAAS,aAAa,CAAC,gBAAgB,CAC7C;WACD,EAAA,CAAA;QACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAE,2BAA2B,SAAS;SACpC,CAAA,EACL,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAS,UAAU,EAAE,6BAA6B,MAAM;SACtD,CAAA,CACD,EAAA,CAAA;QACH;;MAEP,EAhCK,EAAS,GAgCd,CACF;KACE,CAAA;IACN,kBAAC,GAAD;KACE,SAAS,EAAU,UAAU;KAC7B,kBAAkB,GAAU,MAAM,IAAI,GAAG;KACzC,CAAA;IACQ;KAEJ"}