@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
@@ -0,0 +1,18 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ //#region src/ggnomad/components/DetailRow.tsx
3
+ function n({ label: n, value: r }) {
4
+ return /* @__PURE__ */ t("div", {
5
+ className: "flex items-center justify-between gap-3",
6
+ children: [/* @__PURE__ */ e("dt", {
7
+ className: "text-text-secondary",
8
+ children: n
9
+ }), /* @__PURE__ */ e("dd", {
10
+ className: "font-medium tabular-nums text-text-primary",
11
+ children: r
12
+ })]
13
+ });
14
+ }
15
+ //#endregion
16
+ export { n as DetailRow };
17
+
18
+ //# sourceMappingURL=DetailRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetailRow.js","names":[],"sources":["../../../src/ggnomad/components/DetailRow.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\n/** A single label/value pair inside a details list (low-contrast, tabular). */\nexport function DetailRow({ label, value }: { label: string; value: ReactNode }) {\n return (\n <div className=\"flex items-center justify-between gap-3\">\n <dt className=\"text-text-secondary\">{label}</dt>\n <dd className=\"font-medium tabular-nums text-text-primary\">{value}</dd>\n </div>\n );\n}\n"],"mappings":";;AAGA,SAAgB,EAAU,EAAE,UAAO,YAA8C;AAC/E,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,MAAD;GAAI,WAAU;aAAuB;GAAW,CAAA,EAChD,kBAAC,MAAD;GAAI,WAAU;aAA8C;GAAW,CAAA,CACnE"}
@@ -0,0 +1,50 @@
1
+ import { cn as e } from "../utils/cn.js";
2
+ import { Link as t } from "react-router-dom";
3
+ import { GlassCard as n } from "@burdenoff/fe-libs/ui";
4
+ import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
5
+ //#region src/ggnomad/components/EntityCard.tsx
6
+ function o({ title: o, meta: s, price: c, badge: l, footer: u, to: d, className: f }) {
7
+ let p = /* @__PURE__ */ a(r, { children: [
8
+ /* @__PURE__ */ a("div", {
9
+ className: "flex items-start justify-between gap-3",
10
+ children: [/* @__PURE__ */ a("div", {
11
+ className: "min-w-0",
12
+ children: [/* @__PURE__ */ i("p", {
13
+ className: "truncate font-medium text-text-primary",
14
+ children: o
15
+ }), s ? /* @__PURE__ */ i("p", {
16
+ className: "mt-0.5 text-sm text-text-secondary",
17
+ children: s
18
+ }) : null]
19
+ }), l ? /* @__PURE__ */ i("div", {
20
+ className: "flex-shrink-0",
21
+ children: l
22
+ }) : null]
23
+ }),
24
+ c ? /* @__PURE__ */ i("p", {
25
+ className: "mt-2 text-sm font-medium tabular-nums text-text-primary",
26
+ children: c
27
+ }) : null,
28
+ u ? /* @__PURE__ */ i("div", {
29
+ className: "mt-2 text-sm text-text-secondary",
30
+ children: u
31
+ }) : null
32
+ ] });
33
+ return d ? /* @__PURE__ */ i(t, {
34
+ to: d,
35
+ className: "block rounded-card focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus focus-visible:ring-offset-2 focus-visible:ring-offset-bg-canvas",
36
+ children: /* @__PURE__ */ i(n, {
37
+ treatment: "plain",
38
+ className: e("border-border-seam p-4", f),
39
+ children: p
40
+ })
41
+ }) : /* @__PURE__ */ i(n, {
42
+ treatment: "plain",
43
+ className: e("border-border-seam p-4", f),
44
+ children: p
45
+ });
46
+ }
47
+ //#endregion
48
+ export { o as EntityCard };
49
+
50
+ //# sourceMappingURL=EntityCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityCard.js","names":[],"sources":["../../../src/ggnomad/components/EntityCard.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Link } from 'react-router-dom';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ntype EntityCardProps = {\n title: ReactNode;\n /** Optional secondary line (category / type / duration). */\n meta?: ReactNode;\n /** Right-aligned price or primary figure. */\n price?: ReactNode;\n badge?: ReactNode;\n footer?: ReactNode;\n /** When provided, the whole card becomes a router Link. */\n to?: string;\n className?: string;\n};\n\n/**\n * A calm, low-contrast tile for an inventory item (property, tour, event,\n * provider). Hover only lifts the shadow / seam — never moves. When `to` is set\n * the entire surface is a single accessible link.\n */\nexport function EntityCard({ title, meta, price, badge, footer, to, className }: EntityCardProps) {\n const body = (\n <>\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{title}</p>\n {meta ? <p className=\"mt-0.5 text-sm text-text-secondary\">{meta}</p> : null}\n </div>\n {badge ? <div className=\"flex-shrink-0\">{badge}</div> : null}\n </div>\n {price ? (\n <p className=\"mt-2 text-sm font-medium tabular-nums text-text-primary\">{price}</p>\n ) : null}\n {footer ? <div className=\"mt-2 text-sm text-text-secondary\">{footer}</div> : null}\n </>\n );\n\n if (to) {\n return (\n <Link\n to={to}\n className=\"block rounded-card focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus focus-visible:ring-offset-2 focus-visible:ring-offset-bg-canvas\"\n >\n <GlassCard treatment=\"plain\" className={cn('border-border-seam p-4', className)}>\n {body}\n </GlassCard>\n </Link>\n );\n }\n\n return (\n <GlassCard treatment=\"plain\" className={cn('border-border-seam p-4', className)}>\n {body}\n </GlassCard>\n );\n}\n"],"mappings":";;;;;AAuBA,SAAgB,EAAW,EAAE,UAAO,SAAM,UAAO,UAAO,WAAQ,OAAI,gBAA8B;CAChG,IAAM,IACJ,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAU;eAA0C;KAAU,CAAA,EAChE,IAAO,kBAAC,KAAD;KAAG,WAAU;eAAsC;KAAS,CAAA,GAAG,KACnE;OACL,IAAQ,kBAAC,OAAD;IAAK,WAAU;cAAiB;IAAY,CAAA,GAAG,KACpD;;EACL,IACC,kBAAC,KAAD;GAAG,WAAU;aAA2D;GAAU,CAAA,GAChF;EACH,IAAS,kBAAC,OAAD;GAAK,WAAU;aAAoC;GAAa,CAAA,GAAG;EAC5E,EAAA,CAAA;AAgBL,QAbI,IAEA,kBAAC,GAAD;EACM;EACJ,WAAU;YAEV,kBAAC,GAAD;GAAW,WAAU;GAAQ,WAAW,EAAG,0BAA0B,EAAU;aAC5E;GACS,CAAA;EACP,CAAA,GAKT,kBAAC,GAAD;EAAW,WAAU;EAAQ,WAAW,EAAG,0BAA0B,EAAU;YAC5E;EACS,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { cn as e } from "../utils/cn.js";
2
+ import { GlassCard as t } from "@burdenoff/fe-libs/ui";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ //#region src/ggnomad/components/SectionCard.tsx
5
+ function i({ title: i, action: a, className: o, treatment: s = "plain", children: c }) {
6
+ return /* @__PURE__ */ r(t, {
7
+ treatment: s,
8
+ className: e("border-border-seam p-5", o),
9
+ children: [i || a ? /* @__PURE__ */ r("div", {
10
+ className: "mb-4 flex items-center justify-between gap-3",
11
+ children: [i ? /* @__PURE__ */ n("h2", {
12
+ className: "text-lg font-medium tracking-tight text-text-primary",
13
+ children: i
14
+ }) : /* @__PURE__ */ n("span", {}), a]
15
+ }) : null, c]
16
+ });
17
+ }
18
+ //#endregion
19
+ export { i as SectionCard };
20
+
21
+ //# sourceMappingURL=SectionCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionCard.js","names":[],"sources":["../../../src/ggnomad/components/SectionCard.tsx"],"sourcesContent":["import type { PropsWithChildren, ReactNode } from 'react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ntype SectionCardProps = PropsWithChildren<{\n title?: ReactNode;\n action?: ReactNode;\n className?: string;\n treatment?: 'plain' | 'glass' | 'metric' | 'insight';\n}>;\n\n/** A titled glass surface used for grouped content blocks. */\nexport function SectionCard({\n title,\n action,\n className,\n treatment = 'plain',\n children,\n}: SectionCardProps) {\n return (\n <GlassCard treatment={treatment} className={cn('border-border-seam p-5', className)}>\n {title || action ? (\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n {title ? (\n <h2 className=\"text-lg font-medium tracking-tight text-text-primary\">{title}</h2>\n ) : (\n <span />\n )}\n {action}\n </div>\n ) : null}\n {children}\n </GlassCard>\n );\n}\n"],"mappings":";;;;AAYA,SAAgB,EAAY,EAC1B,UACA,WACA,cACA,eAAY,SACZ,eACmB;AACnB,QACE,kBAAC,GAAD;EAAsB;EAAW,WAAW,EAAG,0BAA0B,EAAU;YAAnF,CACG,KAAS,IACR,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,IACC,kBAAC,MAAD;IAAI,WAAU;cAAwD;IAAW,CAAA,GAEjF,kBAAC,QAAD,EAAQ,CAAA,EAET,EACG;OACJ,MACH,EACS"}
@@ -0,0 +1,27 @@
1
+ import { GlassCard as e, GradientText as t } from "@burdenoff/fe-libs/ui";
2
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
+ //#region src/ggnomad/components/StatCard.tsx
4
+ function i({ label: i, value: a, icon: o, hero: s = !1 }) {
5
+ return /* @__PURE__ */ r(e, {
6
+ treatment: s ? "glass" : "metric",
7
+ glow: s,
8
+ className: "border-border-seam p-4",
9
+ children: [/* @__PURE__ */ r("div", {
10
+ className: "flex items-start justify-between gap-3",
11
+ children: [/* @__PURE__ */ n("p", {
12
+ className: "text-sm font-medium text-text-secondary",
13
+ children: i
14
+ }), o ? /* @__PURE__ */ n("span", {
15
+ className: "flex size-9 flex-shrink-0 items-center justify-center rounded-lg bg-[var(--color-accent-soft)] text-text-primary [&>svg]:size-4",
16
+ children: o
17
+ }) : null]
18
+ }), /* @__PURE__ */ n("p", {
19
+ className: "mt-2 text-2xl font-semibold tabular-nums text-text-primary",
20
+ children: s ? /* @__PURE__ */ n(t, { children: a }) : a
21
+ })]
22
+ });
23
+ }
24
+ //#endregion
25
+ export { i as StatCard };
26
+
27
+ //# sourceMappingURL=StatCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatCard.js","names":[],"sources":["../../../src/ggnomad/components/StatCard.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { GlassCard, GradientText } from '@burdenoff/fe-libs/ui';\n\ntype StatCardProps = {\n label: string;\n value: ReactNode;\n icon?: ReactNode;\n /** The single most important metric on a page reads as the glass hero tile. */\n hero?: boolean;\n};\n\n/**\n * KPI / metric tile. Neutral metric tiles use the GlassCard \"metric\" treatment;\n * the page's hero metric uses the \"glass\" treatment with a soft accent glow and\n * a gradient numeral. Numbers are tabular for calm vertical alignment.\n */\nexport function StatCard({ label, value, icon, hero = false }: StatCardProps) {\n return (\n <GlassCard treatment={hero ? 'glass' : 'metric'} glow={hero} className=\"border-border-seam p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <p className=\"text-sm font-medium text-text-secondary\">{label}</p>\n {icon ? (\n <span className=\"flex size-9 flex-shrink-0 items-center justify-center rounded-lg bg-[var(--color-accent-soft)] text-text-primary [&>svg]:size-4\">\n {icon}\n </span>\n ) : null}\n </div>\n <p className=\"mt-2 text-2xl font-semibold tabular-nums text-text-primary\">\n {hero ? <GradientText>{value}</GradientText> : value}\n </p>\n </GlassCard>\n );\n}\n"],"mappings":";;;AAgBA,SAAgB,EAAS,EAAE,UAAO,UAAO,SAAM,UAAO,MAAwB;AAC5E,QACE,kBAAC,GAAD;EAAW,WAAW,IAAO,UAAU;EAAU,MAAM;EAAM,WAAU;YAAvE,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAA2C;IAAU,CAAA,EACjE,IACC,kBAAC,QAAD;IAAM,WAAU;cACb;IACI,CAAA,GACL,KACA;MACN,kBAAC,KAAD;GAAG,WAAU;aACV,IAAO,kBAAC,GAAD,EAAA,UAAe,GAAqB,CAAA,GAAG;GAC7C,CAAA,CACM"}
@@ -0,0 +1,65 @@
1
+ import { cn as e } from "../utils/cn.js";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ //#region src/ggnomad/components/StatusBadge.tsx
4
+ var r = {
5
+ success: {
6
+ dot: "bg-status-success-text",
7
+ text: "text-status-success-text",
8
+ bg: "bg-status-success-bg-subtle"
9
+ },
10
+ warning: {
11
+ dot: "bg-status-warning-text",
12
+ text: "text-status-warning-text",
13
+ bg: "bg-status-warning-bg-subtle"
14
+ },
15
+ danger: {
16
+ dot: "bg-status-error-text",
17
+ text: "text-status-error-text",
18
+ bg: "bg-status-error-bg-subtle"
19
+ },
20
+ info: {
21
+ dot: "bg-status-info-text",
22
+ text: "text-status-info-text",
23
+ bg: "bg-status-info-bg-subtle"
24
+ },
25
+ neutral: {
26
+ dot: "bg-text-secondary",
27
+ text: "text-text-secondary",
28
+ bg: "bg-bg-sunken"
29
+ }
30
+ };
31
+ function i(e) {
32
+ let t = e.toUpperCase();
33
+ return [
34
+ "CONFIRMED",
35
+ "ACTIVE",
36
+ "COMPLETED",
37
+ "PAID",
38
+ "APPROVED"
39
+ ].includes(t) ? "success" : [
40
+ "PENDING",
41
+ "PROCESSING",
42
+ "AWAITING",
43
+ "IN_PROGRESS",
44
+ "ONBOARDING"
45
+ ].includes(t) ? "warning" : [
46
+ "CANCELLED",
47
+ "FAILED",
48
+ "REJECTED",
49
+ "SUSPENDED"
50
+ ].includes(t) ? "danger" : "info";
51
+ }
52
+ function a({ status: a, live: o = !1, className: s }) {
53
+ let c = r[i(a)];
54
+ return /* @__PURE__ */ n("span", {
55
+ className: e("inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium", c.bg, c.text, s),
56
+ children: [/* @__PURE__ */ t("span", {
57
+ className: e("size-1.5 rounded-full", c.dot, o ? "motion-safe:animate-vc-glow-pulse" : ""),
58
+ "aria-hidden": "true"
59
+ }), a]
60
+ });
61
+ }
62
+ //#endregion
63
+ export { a as StatusBadge, i as toneForStatus };
64
+
65
+ //# sourceMappingURL=StatusBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/ggnomad/components/StatusBadge.tsx"],"sourcesContent":["import { cn } from '../utils/cn';\n\ntype Tone = 'success' | 'warning' | 'danger' | 'info' | 'neutral';\n\nconst TONE: Record<Tone, { dot: string; text: string; bg: string }> = {\n success: {\n dot: 'bg-status-success-text',\n text: 'text-status-success-text',\n bg: 'bg-status-success-bg-subtle',\n },\n warning: {\n dot: 'bg-status-warning-text',\n text: 'text-status-warning-text',\n bg: 'bg-status-warning-bg-subtle',\n },\n danger: {\n dot: 'bg-status-error-text',\n text: 'text-status-error-text',\n bg: 'bg-status-error-bg-subtle',\n },\n info: {\n dot: 'bg-status-info-text',\n text: 'text-status-info-text',\n bg: 'bg-status-info-bg-subtle',\n },\n neutral: {\n dot: 'bg-text-secondary',\n text: 'text-text-secondary',\n bg: 'bg-bg-sunken',\n },\n};\n\n/** Maps a free-form status string to a semantic tone. */\nexport function toneForStatus(status: string): Tone {\n const s = status.toUpperCase();\n if (['CONFIRMED', 'ACTIVE', 'COMPLETED', 'PAID', 'APPROVED'].includes(s)) {\n return 'success';\n }\n if (['PENDING', 'PROCESSING', 'AWAITING', 'IN_PROGRESS', 'ONBOARDING'].includes(s)) {\n return 'warning';\n }\n if (['CANCELLED', 'FAILED', 'REJECTED', 'SUSPENDED'].includes(s)) {\n return 'danger';\n }\n return 'info';\n}\n\ntype StatusBadgeProps = {\n status: string;\n /** Pulses the dot for live/active states (opacity only, reduced-motion-safe). */\n live?: boolean;\n className?: string;\n};\n\nexport function StatusBadge({ status, live = false, className }: StatusBadgeProps) {\n const tone = TONE[toneForStatus(status)];\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium',\n tone.bg,\n tone.text,\n className\n )}\n >\n <span\n className={cn(\n 'size-1.5 rounded-full',\n tone.dot,\n live ? 'motion-safe:animate-vc-glow-pulse' : ''\n )}\n aria-hidden=\"true\"\n />\n {status}\n </span>\n );\n}\n"],"mappings":";;;AAIA,IAAM,IAAgE;CACpE,SAAS;EACP,KAAK;EACL,MAAM;EACN,IAAI;EACL;CACD,SAAS;EACP,KAAK;EACL,MAAM;EACN,IAAI;EACL;CACD,QAAQ;EACN,KAAK;EACL,MAAM;EACN,IAAI;EACL;CACD,MAAM;EACJ,KAAK;EACL,MAAM;EACN,IAAI;EACL;CACD,SAAS;EACP,KAAK;EACL,MAAM;EACN,IAAI;EACL;CACF;AAGD,SAAgB,EAAc,GAAsB;CAClD,IAAM,IAAI,EAAO,aAAa;AAU9B,QATI;EAAC;EAAa;EAAU;EAAa;EAAQ;EAAW,CAAC,SAAS,EAAE,GAC/D,YAEL;EAAC;EAAW;EAAc;EAAY;EAAe;EAAa,CAAC,SAAS,EAAE,GACzE,YAEL;EAAC;EAAa;EAAU;EAAY;EAAY,CAAC,SAAS,EAAE,GACvD,WAEF;;AAUT,SAAgB,EAAY,EAAE,WAAQ,UAAO,IAAO,gBAA+B;CACjF,IAAM,IAAO,EAAK,EAAc,EAAO;AACvC,QACE,kBAAC,QAAD;EACE,WAAW,EACT,mFACA,EAAK,IACL,EAAK,MACL,EACD;YANH,CAQE,kBAAC,QAAD;GACE,WAAW,EACT,yBACA,EAAK,KACL,IAAO,sCAAsC,GAC9C;GACD,eAAY;GACZ,CAAA,EACD,EACI"}
@@ -0,0 +1,5 @@
1
+ import "./StatCard.js";
2
+ import "./StatusBadge.js";
3
+ import "./SectionCard.js";
4
+ import "./EntityCard.js";
5
+ import "./DetailRow.js";
@@ -14,11 +14,55 @@ var t = e`
14
14
  totalUsers
15
15
  conversionRate
16
16
  revenueByCategory
17
- monthlyTrends
18
- topDestinations
19
17
  }
20
18
  }
21
19
  `, n = e`
20
+ query GGNomadBookableSample {
21
+ ggnomadProperties(pagination: { first: 1, skip: 0 }) {
22
+ id
23
+ name
24
+ pricePerNight
25
+ currency
26
+ }
27
+ ggnomadTours(pagination: { first: 1, skip: 0 }) {
28
+ id
29
+ name
30
+ price
31
+ currency
32
+ }
33
+ ggnomadEvents(pagination: { first: 1, skip: 0 }) {
34
+ id
35
+ name
36
+ price
37
+ currency
38
+ }
39
+ ggnomadActivities(pagination: { first: 1, skip: 0 }) {
40
+ id
41
+ name
42
+ price
43
+ currency
44
+ }
45
+ }
46
+ `, r = e`
47
+ query GGNomadFavoriteTargets {
48
+ ggnomadProperties(pagination: { first: 100, skip: 0 }) {
49
+ id
50
+ name
51
+ }
52
+ ggnomadTours(pagination: { first: 100, skip: 0 }) {
53
+ id
54
+ name
55
+ }
56
+ ggnomadEvents(pagination: { first: 100, skip: 0 }) {
57
+ id
58
+ name
59
+ }
60
+ ggnomadActivities(pagination: { first: 100, skip: 0 }) {
61
+ id
62
+ name
63
+ }
64
+ }
65
+ `, i = e`
22
66
  query GGNomadProviders($first: Int, $skip: Int) {
23
67
  ggnomadProviders(pagination: { first: $first, skip: $skip }) {
24
68
  id
@@ -33,7 +77,7 @@ var t = e`
33
77
  website
34
78
  }
35
79
  }
36
- `, r = e`
80
+ `, a = e`
37
81
  query GGNomadProperties($first: Int, $skip: Int) {
38
82
  ggnomadProperties(pagination: { first: $first, skip: $skip }) {
39
83
  id
@@ -51,7 +95,7 @@ var t = e`
51
95
  providerId
52
96
  }
53
97
  }
54
- `, i = e`
98
+ `, o = e`
55
99
  query GGNomadProperty($id: ID!) {
56
100
  ggnomadProperty(id: $id) {
57
101
  id
@@ -79,7 +123,7 @@ var t = e`
79
123
  }
80
124
  }
81
125
  }
82
- `, a = e`
126
+ `, s = e`
83
127
  query GGNomadTours($first: Int, $skip: Int) {
84
128
  ggnomadTours(pagination: { first: $first, skip: $skip }) {
85
129
  id
@@ -97,7 +141,7 @@ var t = e`
97
141
  images
98
142
  }
99
143
  }
100
- `, o = e`
144
+ `, c = e`
101
145
  query GGNomadTour($id: ID!) {
102
146
  ggnomadTour(id: $id) {
103
147
  id
@@ -121,7 +165,7 @@ var t = e`
121
165
  }
122
166
  }
123
167
  }
124
- `, s = e`
168
+ `, l = e`
125
169
  query GGNomadEvents($first: Int, $skip: Int) {
126
170
  ggnomadEvents(pagination: { first: $first, skip: $skip }) {
127
171
  id
@@ -138,7 +182,7 @@ var t = e`
138
182
  images
139
183
  }
140
184
  }
141
- `, c = e`
185
+ `, u = e`
142
186
  query GGNomadEvent($id: ID!) {
143
187
  ggnomadEvent(id: $id) {
144
188
  id
@@ -161,7 +205,7 @@ var t = e`
161
205
  }
162
206
  }
163
207
  }
164
- `, l = e`
208
+ `, d = e`
165
209
  query GGNomadActivities($first: Int, $skip: Int) {
166
210
  ggnomadActivities(pagination: { first: $first, skip: $skip }) {
167
211
  id
@@ -181,7 +225,7 @@ var t = e`
181
225
  images
182
226
  }
183
227
  }
184
- `, u = e`
228
+ `, f = e`
185
229
  query GGNomadActivity($id: ID!) {
186
230
  ggnomadActivity(id: $id) {
187
231
  id
@@ -207,7 +251,7 @@ var t = e`
207
251
  }
208
252
  }
209
253
  }
210
- `, d = e`
254
+ `, p = e`
211
255
  query GGNomadTrips($first: Int, $skip: Int) {
212
256
  ggnomadTrips(pagination: { first: $first, skip: $skip }) {
213
257
  id
@@ -227,7 +271,7 @@ var t = e`
227
271
  ecoFriendly
228
272
  }
229
273
  }
230
- `, f = e`
274
+ `, m = e`
231
275
  query GGNomadBookings($first: Int, $skip: Int) {
232
276
  ggnomadBookings(pagination: { first: $first, skip: $skip }) {
233
277
  id
@@ -251,11 +295,11 @@ var t = e`
251
295
  createdAt
252
296
  }
253
297
  }
254
- `, p = e`
298
+ `, h = e`
255
299
  query GGNomadFavorites {
256
300
  ggnomadFavorites
257
301
  }
258
- `, m = e`
302
+ `, g = e`
259
303
  mutation CreateGGNomadBooking($input: CreateGgnomadBookingInput!) {
260
304
  createGgnomadBooking(input: $input) {
261
305
  id
@@ -270,11 +314,11 @@ var t = e`
270
314
  createdAt
271
315
  }
272
316
  }
273
- `, h = e`
317
+ `, _ = e`
274
318
  mutation ToggleGGNomadFavorite($input: ToggleGgnomadFavoriteInput!) {
275
319
  toggleGgnomadFavorite(input: $input)
276
320
  }
277
- `, g = e`
321
+ `, v = e`
278
322
  mutation CancelGGNomadBooking($id: ID!, $reason: String) {
279
323
  cancelGgnomadBooking(id: $id, reason: $reason) {
280
324
  id
@@ -283,6 +327,6 @@ var t = e`
283
327
  }
284
328
  `;
285
329
  //#endregion
286
- export { g as CANCEL_GGNOMAD_BOOKING_MUTATION, m as CREATE_GGNOMAD_BOOKING_MUTATION, l as GGNOMAD_ACTIVITIES_QUERY, u as GGNOMAD_ACTIVITY_QUERY, f as GGNOMAD_BOOKINGS_QUERY, s as GGNOMAD_EVENTS_QUERY, c as GGNOMAD_EVENT_QUERY, p as GGNOMAD_FAVORITES_QUERY, t as GGNOMAD_OVERVIEW_QUERY, r as GGNOMAD_PROPERTIES_QUERY, i as GGNOMAD_PROPERTY_QUERY, n as GGNOMAD_PROVIDERS_QUERY, a as GGNOMAD_TOURS_QUERY, o as GGNOMAD_TOUR_QUERY, d as GGNOMAD_TRIPS_QUERY, h as TOGGLE_GGNOMAD_FAVORITE_MUTATION };
330
+ export { v as CANCEL_GGNOMAD_BOOKING_MUTATION, g as CREATE_GGNOMAD_BOOKING_MUTATION, d as GGNOMAD_ACTIVITIES_QUERY, f as GGNOMAD_ACTIVITY_QUERY, n as GGNOMAD_BOOKABLE_SAMPLE_QUERY, m as GGNOMAD_BOOKINGS_QUERY, l as GGNOMAD_EVENTS_QUERY, u as GGNOMAD_EVENT_QUERY, h as GGNOMAD_FAVORITES_QUERY, r as GGNOMAD_FAVORITE_TARGETS_QUERY, t as GGNOMAD_OVERVIEW_QUERY, a as GGNOMAD_PROPERTIES_QUERY, o as GGNOMAD_PROPERTY_QUERY, i as GGNOMAD_PROVIDERS_QUERY, s as GGNOMAD_TOURS_QUERY, c as GGNOMAD_TOUR_QUERY, p as GGNOMAD_TRIPS_QUERY, _ as TOGGLE_GGNOMAD_FAVORITE_MUTATION };
287
331
 
288
332
  //# sourceMappingURL=graphql.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"graphql.js","names":[],"sources":["../../src/ggnomad/graphql.ts"],"sourcesContent":["import { gql } from '@apollo/client/core';\n\nexport const GGNOMAD_OVERVIEW_QUERY = gql`\n query GGNomadOverview {\n ggnomadOverviewStats {\n users\n listings\n bookings\n monthlyRevenue\n }\n ggnomadAnalytics {\n totalRevenue\n totalBookings\n totalUsers\n conversionRate\n revenueByCategory\n monthlyTrends\n topDestinations\n }\n }\n`;\n\nexport const GGNOMAD_PROVIDERS_QUERY = gql`\n query GGNomadProviders($first: Int, $skip: Int) {\n ggnomadProviders(pagination: { first: $first, skip: $skip }) {\n id\n name\n type\n status\n listingCount\n totalRevenue\n rating\n reviewCount\n contactEmail\n website\n }\n }\n`;\n\nexport const GGNOMAD_PROPERTIES_QUERY = gql`\n query GGNomadProperties($first: Int, $skip: Int) {\n ggnomadProperties(pagination: { first: $first, skip: $skip }) {\n id\n name\n type\n status\n description\n pricePerNight\n currency\n rating\n reviewCount\n maxGuests\n amenities\n images\n providerId\n }\n }\n`;\n\nexport const GGNOMAD_PROPERTY_QUERY = gql`\n query GGNomadProperty($id: ID!) {\n ggnomadProperty(id: $id) {\n id\n name\n type\n status\n description\n address\n pricePerNight\n currency\n rating\n reviewCount\n bedrooms\n bathrooms\n maxGuests\n checkInTime\n checkOutTime\n amenities\n images\n provider {\n id\n name\n type\n rating\n }\n }\n }\n`;\n\nexport const GGNOMAD_TOURS_QUERY = gql`\n query GGNomadTours($first: Int, $skip: Int) {\n ggnomadTours(pagination: { first: $first, skip: $skip }) {\n id\n name\n description\n type\n status\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n highlights\n images\n }\n }\n`;\n\nexport const GGNOMAD_TOUR_QUERY = gql`\n query GGNomadTour($id: ID!) {\n ggnomadTour(id: $id) {\n id\n name\n description\n type\n status\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n highlights\n images\n languages\n guideName\n provider {\n id\n name\n }\n }\n }\n`;\n\nexport const GGNOMAD_EVENTS_QUERY = gql`\n query GGNomadEvents($first: Int, $skip: Int) {\n ggnomadEvents(pagination: { first: $first, skip: $skip }) {\n id\n name\n description\n category\n status\n startsAt\n price\n currency\n rating\n reviewCount\n performers\n images\n }\n }\n`;\n\nexport const GGNOMAD_EVENT_QUERY = gql`\n query GGNomadEvent($id: ID!) {\n ggnomadEvent(id: $id) {\n id\n name\n description\n category\n status\n startsAt\n endsAt\n venue\n price\n currency\n rating\n reviewCount\n performers\n images\n provider {\n id\n name\n }\n }\n }\n`;\n\nexport const GGNOMAD_ACTIVITIES_QUERY = gql`\n query GGNomadActivities($first: Int, $skip: Int) {\n ggnomadActivities(pagination: { first: $first, skip: $skip }) {\n id\n name\n description\n category\n status\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n maxParticipants\n includes\n requirements\n images\n }\n }\n`;\n\nexport const GGNOMAD_ACTIVITY_QUERY = gql`\n query GGNomadActivity($id: ID!) {\n ggnomadActivity(id: $id) {\n id\n name\n description\n category\n status\n location\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n maxParticipants\n includes\n requirements\n safetyInfo\n images\n provider {\n id\n name\n }\n }\n }\n`;\n\nexport const GGNOMAD_TRIPS_QUERY = gql`\n query GGNomadTrips($first: Int, $skip: Int) {\n ggnomadTrips(pagination: { first: $first, skip: $skip }) {\n id\n name\n transportMode\n status\n origin\n destination\n departureAt\n arrivalAt\n isRoundTrip\n carrier\n class\n price\n currency\n passengers\n ecoFriendly\n }\n }\n`;\n\nexport const GGNOMAD_BOOKINGS_QUERY = gql`\n query GGNomadBookings($first: Int, $skip: Int) {\n ggnomadBookings(pagination: { first: $first, skip: $skip }) {\n id\n referenceCode\n bookingType\n status\n itemId\n itemName\n guestName\n guestEmail\n guestPhone\n guests\n checkIn\n checkOut\n eventDate\n totalPrice\n currency\n paymentStatus\n paymentMethod\n specialRequests\n createdAt\n }\n }\n`;\n\nexport const GGNOMAD_FAVORITES_QUERY = gql`\n query GGNomadFavorites {\n ggnomadFavorites\n }\n`;\n\nexport const CREATE_GGNOMAD_BOOKING_MUTATION = gql`\n mutation CreateGGNomadBooking($input: CreateGgnomadBookingInput!) {\n createGgnomadBooking(input: $input) {\n id\n referenceCode\n bookingType\n status\n itemId\n itemName\n guestName\n totalPrice\n currency\n createdAt\n }\n }\n`;\n\nexport const TOGGLE_GGNOMAD_FAVORITE_MUTATION = gql`\n mutation ToggleGGNomadFavorite($input: ToggleGgnomadFavoriteInput!) {\n toggleGgnomadFavorite(input: $input)\n }\n`;\n\nexport const CANCEL_GGNOMAD_BOOKING_MUTATION = gql`\n mutation CancelGGNomadBooking($id: ID!, $reason: String) {\n cancelGgnomadBooking(id: $id, reason: $reason) {\n id\n status\n }\n }\n`;\n"],"mappings":";;AAEA,IAAa,IAAyB,CAAG;;;;;;;;;;;;;;;;;;GAoB5B,IAA0B,CAAG;;;;;;;;;;;;;;;GAiB7B,IAA2B,CAAG;;;;;;;;;;;;;;;;;;GAoB9B,IAAyB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8B5B,IAAsB,CAAG;;;;;;;;;;;;;;;;;;GAoBzB,IAAqB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;GA0BxB,IAAuB,CAAG;;;;;;;;;;;;;;;;;GAmB1B,IAAsB,CAAG;;;;;;;;;;;;;;;;;;;;;;;GAyBzB,IAA2B,CAAG;;;;;;;;;;;;;;;;;;;;GAsB9B,IAAyB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;GA4B5B,IAAsB,CAAG;;;;;;;;;;;;;;;;;;;;GAsBzB,IAAyB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;GA0B5B,IAA0B,CAAG;;;;GAM7B,IAAkC,CAAG;;;;;;;;;;;;;;;GAiBrC,IAAmC,CAAG;;;;GAMtC,IAAkC,CAAG"}
1
+ {"version":3,"file":"graphql.js","names":[],"sources":["../../src/ggnomad/graphql.ts"],"sourcesContent":["import { gql } from '@apollo/client/core';\n\nexport const GGNOMAD_OVERVIEW_QUERY = gql`\n query GGNomadOverview {\n ggnomadOverviewStats {\n users\n listings\n bookings\n monthlyRevenue\n }\n ggnomadAnalytics {\n totalRevenue\n totalBookings\n totalUsers\n conversionRate\n revenueByCategory\n }\n }\n`;\n\n/**\n * One bookable item of each type (properties are priced per night, the rest\n * carry a flat price). Used to seed the Bookings \"create demo booking\" action\n * with a REAL listing id so the mutation passes the backend's\n * assertTargetInWorkspace check instead of failing on a synthetic id.\n */\nexport const GGNOMAD_BOOKABLE_SAMPLE_QUERY = gql`\n query GGNomadBookableSample {\n ggnomadProperties(pagination: { first: 1, skip: 0 }) {\n id\n name\n pricePerNight\n currency\n }\n ggnomadTours(pagination: { first: 1, skip: 0 }) {\n id\n name\n price\n currency\n }\n ggnomadEvents(pagination: { first: 1, skip: 0 }) {\n id\n name\n price\n currency\n }\n ggnomadActivities(pagination: { first: 1, skip: 0 }) {\n id\n name\n price\n currency\n }\n }\n`;\n\n/**\n * id + name for every favouritable listing type, used to (a) resolve the real\n * entity name for a saved favorite (which the backend only exposes as\n * targetType + targetId) and (b) seed the \"toggle demo favorite\" action with a\n * real target id.\n */\nexport const GGNOMAD_FAVORITE_TARGETS_QUERY = gql`\n query GGNomadFavoriteTargets {\n ggnomadProperties(pagination: { first: 100, skip: 0 }) {\n id\n name\n }\n ggnomadTours(pagination: { first: 100, skip: 0 }) {\n id\n name\n }\n ggnomadEvents(pagination: { first: 100, skip: 0 }) {\n id\n name\n }\n ggnomadActivities(pagination: { first: 100, skip: 0 }) {\n id\n name\n }\n }\n`;\n\nexport const GGNOMAD_PROVIDERS_QUERY = gql`\n query GGNomadProviders($first: Int, $skip: Int) {\n ggnomadProviders(pagination: { first: $first, skip: $skip }) {\n id\n name\n type\n status\n listingCount\n totalRevenue\n rating\n reviewCount\n contactEmail\n website\n }\n }\n`;\n\nexport const GGNOMAD_PROPERTIES_QUERY = gql`\n query GGNomadProperties($first: Int, $skip: Int) {\n ggnomadProperties(pagination: { first: $first, skip: $skip }) {\n id\n name\n type\n status\n description\n pricePerNight\n currency\n rating\n reviewCount\n maxGuests\n amenities\n images\n providerId\n }\n }\n`;\n\nexport const GGNOMAD_PROPERTY_QUERY = gql`\n query GGNomadProperty($id: ID!) {\n ggnomadProperty(id: $id) {\n id\n name\n type\n status\n description\n address\n pricePerNight\n currency\n rating\n reviewCount\n bedrooms\n bathrooms\n maxGuests\n checkInTime\n checkOutTime\n amenities\n images\n provider {\n id\n name\n type\n rating\n }\n }\n }\n`;\n\nexport const GGNOMAD_TOURS_QUERY = gql`\n query GGNomadTours($first: Int, $skip: Int) {\n ggnomadTours(pagination: { first: $first, skip: $skip }) {\n id\n name\n description\n type\n status\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n highlights\n images\n }\n }\n`;\n\nexport const GGNOMAD_TOUR_QUERY = gql`\n query GGNomadTour($id: ID!) {\n ggnomadTour(id: $id) {\n id\n name\n description\n type\n status\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n highlights\n images\n languages\n guideName\n provider {\n id\n name\n }\n }\n }\n`;\n\nexport const GGNOMAD_EVENTS_QUERY = gql`\n query GGNomadEvents($first: Int, $skip: Int) {\n ggnomadEvents(pagination: { first: $first, skip: $skip }) {\n id\n name\n description\n category\n status\n startsAt\n price\n currency\n rating\n reviewCount\n performers\n images\n }\n }\n`;\n\nexport const GGNOMAD_EVENT_QUERY = gql`\n query GGNomadEvent($id: ID!) {\n ggnomadEvent(id: $id) {\n id\n name\n description\n category\n status\n startsAt\n endsAt\n venue\n price\n currency\n rating\n reviewCount\n performers\n images\n provider {\n id\n name\n }\n }\n }\n`;\n\nexport const GGNOMAD_ACTIVITIES_QUERY = gql`\n query GGNomadActivities($first: Int, $skip: Int) {\n ggnomadActivities(pagination: { first: $first, skip: $skip }) {\n id\n name\n description\n category\n status\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n maxParticipants\n includes\n requirements\n images\n }\n }\n`;\n\nexport const GGNOMAD_ACTIVITY_QUERY = gql`\n query GGNomadActivity($id: ID!) {\n ggnomadActivity(id: $id) {\n id\n name\n description\n category\n status\n location\n duration\n difficulty\n price\n currency\n rating\n reviewCount\n maxParticipants\n includes\n requirements\n safetyInfo\n images\n provider {\n id\n name\n }\n }\n }\n`;\n\nexport const GGNOMAD_TRIPS_QUERY = gql`\n query GGNomadTrips($first: Int, $skip: Int) {\n ggnomadTrips(pagination: { first: $first, skip: $skip }) {\n id\n name\n transportMode\n status\n origin\n destination\n departureAt\n arrivalAt\n isRoundTrip\n carrier\n class\n price\n currency\n passengers\n ecoFriendly\n }\n }\n`;\n\nexport const GGNOMAD_BOOKINGS_QUERY = gql`\n query GGNomadBookings($first: Int, $skip: Int) {\n ggnomadBookings(pagination: { first: $first, skip: $skip }) {\n id\n referenceCode\n bookingType\n status\n itemId\n itemName\n guestName\n guestEmail\n guestPhone\n guests\n checkIn\n checkOut\n eventDate\n totalPrice\n currency\n paymentStatus\n paymentMethod\n specialRequests\n createdAt\n }\n }\n`;\n\nexport const GGNOMAD_FAVORITES_QUERY = gql`\n query GGNomadFavorites {\n ggnomadFavorites\n }\n`;\n\nexport const CREATE_GGNOMAD_BOOKING_MUTATION = gql`\n mutation CreateGGNomadBooking($input: CreateGgnomadBookingInput!) {\n createGgnomadBooking(input: $input) {\n id\n referenceCode\n bookingType\n status\n itemId\n itemName\n guestName\n totalPrice\n currency\n createdAt\n }\n }\n`;\n\nexport const TOGGLE_GGNOMAD_FAVORITE_MUTATION = gql`\n mutation ToggleGGNomadFavorite($input: ToggleGgnomadFavoriteInput!) {\n toggleGgnomadFavorite(input: $input)\n }\n`;\n\nexport const CANCEL_GGNOMAD_BOOKING_MUTATION = gql`\n mutation CancelGGNomadBooking($id: ID!, $reason: String) {\n cancelGgnomadBooking(id: $id, reason: $reason) {\n id\n status\n }\n }\n`;\n"],"mappings":";;AAEA,IAAa,IAAyB,CAAG;;;;;;;;;;;;;;;;GAwB5B,IAAgC,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCnC,IAAiC,CAAG;;;;;;;;;;;;;;;;;;;GAqBpC,IAA0B,CAAG;;;;;;;;;;;;;;;GAiB7B,IAA2B,CAAG;;;;;;;;;;;;;;;;;;GAoB9B,IAAyB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8B5B,IAAsB,CAAG;;;;;;;;;;;;;;;;;;GAoBzB,IAAqB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;GA0BxB,IAAuB,CAAG;;;;;;;;;;;;;;;;;GAmB1B,IAAsB,CAAG;;;;;;;;;;;;;;;;;;;;;;;GAyBzB,IAA2B,CAAG;;;;;;;;;;;;;;;;;;;;GAsB9B,IAAyB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;GA4B5B,IAAsB,CAAG;;;;;;;;;;;;;;;;;;;;GAsBzB,IAAyB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;GA0B5B,IAA0B,CAAG;;;;GAM7B,IAAkC,CAAG;;;;;;;;;;;;;;;GAiBrC,IAAmC,CAAG;;;;GAMtC,IAAkC,CAAG"}
@@ -1,46 +1,93 @@
1
1
  import { GGNOMAD_ACTIVITY_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 { Activity as i, CalendarCheck as a, Compass as o, ShieldCheck as s } from "lucide-react";
7
+ import { useI18n as c } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
+ import { useNavigate as l, useParams as u } from "react-router-dom";
9
+ import { useQuery as d } from "@apollo/client/react";
10
+ import { GlassCard as f, IllustratedEmptyState as p, NextSteps as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
11
+ import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
6
12
  //#region src/ggnomad/pages/ActivityDetailsPage.tsx
7
- function o() {
8
- let { id: o = "" } = n(), { data: s } = r(e, {
9
- variables: { id: o },
10
- skip: !o
11
- }), c = s?.ggnomadActivity;
12
- return /* @__PURE__ */ i(t, {
13
- title: c?.name ?? "Activity details",
14
- subtitle: "Safety, inclusions and participation details",
15
- children: c ? /* @__PURE__ */ a("div", {
16
- className: "space-y-3 text-sm",
17
- children: [/* @__PURE__ */ a("div", {
18
- className: "rounded-lg border p-4",
19
- children: [
20
- /* @__PURE__ */ a("p", { children: ["Category: ", c.category] }),
21
- /* @__PURE__ */ a("p", { children: ["Duration: ", c.duration] }),
22
- /* @__PURE__ */ a("p", { children: ["Max participants: ", c.maxParticipants] }),
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: "font-medium",
34
- children: "Safety information"
35
- }), /* @__PURE__ */ i("p", { children: c.safetyInfo ?? "Standard provider safety policy applies." })]
36
- })]
37
- }) : /* @__PURE__ */ i("div", {
38
- className: "rounded-lg border p-4 text-text-secondary",
39
- children: "No activity found."
13
+ function y() {
14
+ let { t: y } = c(), b = l(), { id: x = "" } = u(), { data: S } = d(e, {
15
+ variables: { id: x },
16
+ skip: !x
17
+ }), C = S?.ggnomadActivity;
18
+ return /* @__PURE__ */ _(t, {
19
+ title: C?.name ?? y("ggnomad.activity.fallbackTitle", "Activity details"),
20
+ subtitle: y("ggnomad.activity.subtitle", "Safety, inclusions and participation details"),
21
+ children: C ? /* @__PURE__ */ v(g, { children: [
22
+ /* @__PURE__ */ _(h, {
23
+ icon: /* @__PURE__ */ _(i, { className: "size-4" }),
24
+ children: y("ggnomad.activity.purpose", "Everything you need to know before joining this activity — its category, duration, group size, price and the safety policy that applies — so you can be confident it fits your group before you book.")
25
+ }),
26
+ /* @__PURE__ */ _(m, {
27
+ storageKey: "ggnomad-activity-detail",
28
+ steps: [{
29
+ id: "book",
30
+ label: y("ggnomad.activity.next.book", "Book this activity"),
31
+ description: y("ggnomad.activity.next.bookDesc", "Add it to your itinerary and track it under Bookings."),
32
+ icon: /* @__PURE__ */ _(a, { className: "size-4" }),
33
+ onClick: () => b("../../../bookings")
34
+ }, {
35
+ id: "browse",
36
+ label: y("ggnomad.activity.next.browse", "Explore more experiences"),
37
+ description: y("ggnomad.activity.next.browseDesc", "Return to Tourism to compare tours and activities."),
38
+ icon: /* @__PURE__ */ _(o, { className: "size-4" }),
39
+ onClick: () => b("../..")
40
+ }]
41
+ }),
42
+ /* @__PURE__ */ v("div", {
43
+ className: "grid gap-4 lg:grid-cols-2",
44
+ children: [/* @__PURE__ */ v(f, {
45
+ treatment: "glass",
46
+ glow: !0,
47
+ className: "border-border-seam p-5",
48
+ children: [/* @__PURE__ */ _("h2", {
49
+ className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
50
+ children: y("ggnomad.activity.details", "Details")
51
+ }), /* @__PURE__ */ v("dl", {
52
+ className: "space-y-2 text-sm",
53
+ children: [
54
+ /* @__PURE__ */ _(r, {
55
+ label: y("ggnomad.activity.category", "Category"),
56
+ value: C.category
57
+ }),
58
+ /* @__PURE__ */ _(r, {
59
+ label: y("ggnomad.activity.duration", "Duration"),
60
+ value: C.duration
61
+ }),
62
+ /* @__PURE__ */ _(r, {
63
+ label: y("ggnomad.activity.maxParticipants", "Max participants"),
64
+ value: String(C.maxParticipants)
65
+ }),
66
+ /* @__PURE__ */ _(r, {
67
+ label: y("ggnomad.activity.price", "Price"),
68
+ value: `${C.currency} ${Number(C.price).toFixed(2)}`
69
+ })
70
+ ]
71
+ })]
72
+ }), /* @__PURE__ */ _(n, {
73
+ title: y("ggnomad.activity.safety", "Safety information"),
74
+ children: /* @__PURE__ */ v("div", {
75
+ className: "flex items-start gap-2 text-sm text-text-primary",
76
+ children: [/* @__PURE__ */ _(s, {
77
+ className: "mt-0.5 size-4 flex-shrink-0 text-status-success-text",
78
+ "aria-hidden": "true"
79
+ }), /* @__PURE__ */ _("p", { children: C.safetyInfo ?? y("ggnomad.activity.defaultSafety", "Standard provider safety policy applies.") })]
80
+ })
81
+ })]
82
+ })
83
+ ] }) : /* @__PURE__ */ _(p, {
84
+ illustration: "empty-data",
85
+ title: y("ggnomad.activity.notFoundTitle", "No activity found"),
86
+ description: y("ggnomad.activity.notFoundDescription", "This activity is unavailable or may have been removed.")
40
87
  })
41
88
  });
42
89
  }
43
90
  //#endregion
44
- export { o as ActivityDetailsPage };
91
+ export { y as ActivityDetailsPage };
45
92
 
46
93
  //# sourceMappingURL=ActivityDetailsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/ActivityDetailsPage.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport { useParams } from 'react-router-dom';\n\nimport { GGNOMAD_ACTIVITY_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\n\nexport function ActivityDetailsPage() {\n const { id = '' } = useParams();\n const { data } = useQuery<{\n ggnomadActivity: {\n name: string;\n category: string;\n duration: string;\n maxParticipants: number;\n currency: string;\n price: number;\n safetyInfo?: string;\n } | null;\n }>(GGNOMAD_ACTIVITY_QUERY, { variables: { id }, skip: !id });\n const activity = data?.ggnomadActivity;\n\n return (\n <PageShell\n title={activity?.name ?? 'Activity details'}\n subtitle=\"Safety, inclusions and participation details\"\n >\n {!activity ? (\n <div className=\"rounded-lg border p-4 text-text-secondary\">No activity found.</div>\n ) : (\n <div className=\"space-y-3 text-sm\">\n <div className=\"rounded-lg border p-4\">\n <p>Category: {activity.category}</p>\n <p>Duration: {activity.duration}</p>\n <p>Max participants: {activity.maxParticipants}</p>\n <p>\n Price: {activity.currency} {Number(activity.price).toFixed(2)}\n </p>\n </div>\n <div className=\"rounded-lg border p-4\">\n <p className=\"font-medium\">Safety information</p>\n <p>{activity.safetyInfo ?? 'Standard provider safety policy applies.'}</p>\n </div>\n </div>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;AAMA,SAAgB,IAAsB;CACpC,IAAM,EAAE,QAAK,OAAO,GAAW,EACzB,EAAE,YAAS,EAUd,GAAwB;EAAE,WAAW,EAAE,OAAI;EAAE,MAAM,CAAC;EAAI,CAAC,EACtD,IAAW,GAAM;AAEvB,QACE,kBAAC,GAAD;EACE,OAAO,GAAU,QAAQ;EACzB,UAAS;YAEP,IAGA,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,KAAD,EAAA,UAAA,CAAG,cAAW,EAAS,SAAa,EAAA,CAAA;KACpC,kBAAC,KAAD,EAAA,UAAA,CAAG,cAAW,EAAS,SAAa,EAAA,CAAA;KACpC,kBAAC,KAAD,EAAA,UAAA,CAAG,sBAAmB,EAAS,gBAAoB,EAAA,CAAA;KACnD,kBAAC,KAAD,EAAA,UAAA;MAAG;MACO,EAAS;MAAS;MAAE,OAAO,EAAS,MAAM,CAAC,QAAQ,EAAE;MAC3D,EAAA,CAAA;KACA;OACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAU;eAAc;KAAsB,CAAA,EACjD,kBAAC,KAAD,EAAA,UAAI,EAAS,cAAc,4CAA+C,CAAA,CACtE;MACF;OAfN,kBAAC,OAAD;GAAK,WAAU;aAA4C;GAAwB,CAAA;EAiB3E,CAAA"}
1
+ {"version":3,"file":"ActivityDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/ActivityDetailsPage.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 { Activity, CalendarCheck, Compass, ShieldCheck } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_ACTIVITY_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\nimport { DetailRow, SectionCard } from '../components';\n\nexport function ActivityDetailsPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { id = '' } = useParams();\n const { data } = useQuery(\n GGNOMAD_ACTIVITY_QUERY as TypedDocumentNode<\n {\n ggnomadActivity: {\n name: string;\n category: string;\n duration: string;\n maxParticipants: number;\n currency: string;\n price: number;\n safetyInfo?: string;\n } | null;\n },\n { id: string }\n >,\n { variables: { id }, skip: !id }\n );\n const activity = data?.ggnomadActivity;\n\n return (\n <PageShell\n title={activity?.name ?? t('ggnomad.activity.fallbackTitle', 'Activity details')}\n subtitle={t('ggnomad.activity.subtitle', 'Safety, inclusions and participation details')}\n >\n {!activity ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.activity.notFoundTitle', 'No activity found')}\n description={t(\n 'ggnomad.activity.notFoundDescription',\n 'This activity is unavailable or may have been removed.'\n )}\n />\n ) : (\n <>\n <PagePurpose icon={<Activity className=\"size-4\" />}>\n {t(\n 'ggnomad.activity.purpose',\n 'Everything you need to know before joining this activity — its category, duration, group size, price and the safety policy that applies — so you can be confident it fits your group before you book.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"ggnomad-activity-detail\"\n steps={[\n {\n id: 'book',\n label: t('ggnomad.activity.next.book', 'Book this activity'),\n description: t(\n 'ggnomad.activity.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.activity.next.browse', 'Explore more experiences'),\n description: t(\n 'ggnomad.activity.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.activity.details', 'Details')}\n </h2>\n <dl className=\"space-y-2 text-sm\">\n <DetailRow\n label={t('ggnomad.activity.category', 'Category')}\n value={activity.category}\n />\n <DetailRow\n label={t('ggnomad.activity.duration', 'Duration')}\n value={activity.duration}\n />\n <DetailRow\n label={t('ggnomad.activity.maxParticipants', 'Max participants')}\n value={String(activity.maxParticipants)}\n />\n <DetailRow\n label={t('ggnomad.activity.price', 'Price')}\n value={`${activity.currency} ${Number(activity.price).toFixed(2)}`}\n />\n </dl>\n </GlassCard>\n <SectionCard title={t('ggnomad.activity.safety', 'Safety information')}>\n <div className=\"flex items-start gap-2 text-sm text-text-primary\">\n <ShieldCheck\n className=\"mt-0.5 size-4 flex-shrink-0 text-status-success-text\"\n aria-hidden=\"true\"\n />\n <p>\n {activity.safetyInfo ??\n t('ggnomad.activity.defaultSafety', 'Standard provider safety policy applies.')}\n </p>\n </div>\n </SectionCard>\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,GAcA;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,+CAA+C;YAEtF,IAUA,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,GAAD;IAAa,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;cAC/C,EACC,4BACA,wMACD;IACW,CAAA;GAEd,kBAAC,GAAD;IACE,YAAW;IACX,OAAO,CACL;KACE,IAAI;KACJ,OAAO,EAAE,8BAA8B,qBAAqB;KAC5D,aAAa,EACX,kCACA,wDACD;KACD,MAAM,kBAAC,GAAD,EAAe,WAAU,UAAW,CAAA;KAC1C,eAAe,EAAS,oBAAoB;KAC7C,EACD;KACE,IAAI;KACJ,OAAO,EAAE,gCAAgC,2BAA2B;KACpE,aAAa,EACX,oCACA,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,4BAA4B,UAAU;MACtC,CAAA,EACL,kBAAC,MAAD;MAAI,WAAU;gBAAd;OACE,kBAAC,GAAD;QACE,OAAO,EAAE,6BAA6B,WAAW;QACjD,OAAO,EAAS;QAChB,CAAA;OACF,kBAAC,GAAD;QACE,OAAO,EAAE,6BAA6B,WAAW;QACjD,OAAO,EAAS;QAChB,CAAA;OACF,kBAAC,GAAD;QACE,OAAO,EAAE,oCAAoC,mBAAmB;QAChE,OAAO,OAAO,EAAS,gBAAgB;QACvC,CAAA;OACF,kBAAC,GAAD;QACE,OAAO,EAAE,0BAA0B,QAAQ;QAC3C,OAAO,GAAG,EAAS,SAAS,GAAG,OAAO,EAAS,MAAM,CAAC,QAAQ,EAAE;QAChE,CAAA;OACC;QACK;QACZ,kBAAC,GAAD;KAAa,OAAO,EAAE,2BAA2B,qBAAqB;eACpE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,WAAU;OACV,eAAY;OACZ,CAAA,EACF,kBAAC,KAAD,EAAA,UACG,EAAS,cACR,EAAE,kCAAkC,2CAA2C,EAC/E,CAAA,CACA;;KACM,CAAA,CACV;;GACL,EAAA,CAAA,GAhFH,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,kCAAkC,oBAAoB;GAC/D,aAAa,EACX,wCACA,yDACD;GACD,CAAA;EA2EM,CAAA"}