@burdenoff/microfe-ggnomad 2026.608.1 → 2026.626.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.
- package/dist/ggnomad/components/DetailRow.js +18 -0
- package/dist/ggnomad/components/DetailRow.js.map +1 -0
- package/dist/ggnomad/components/EntityCard.js +50 -0
- package/dist/ggnomad/components/EntityCard.js.map +1 -0
- package/dist/ggnomad/components/SectionCard.js +21 -0
- package/dist/ggnomad/components/SectionCard.js.map +1 -0
- package/dist/ggnomad/components/StatCard.js +27 -0
- package/dist/ggnomad/components/StatCard.js.map +1 -0
- package/dist/ggnomad/components/StatusBadge.js +65 -0
- package/dist/ggnomad/components/StatusBadge.js.map +1 -0
- package/dist/ggnomad/components/index.js +5 -0
- package/dist/ggnomad/pages/ActivityDetailsPage.js +84 -37
- package/dist/ggnomad/pages/ActivityDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/AnalyticsPage.js +64 -55
- package/dist/ggnomad/pages/AnalyticsPage.js.map +1 -1
- package/dist/ggnomad/pages/BookingsPage.js +108 -60
- package/dist/ggnomad/pages/BookingsPage.js.map +1 -1
- package/dist/ggnomad/pages/DashboardPage.js +135 -110
- package/dist/ggnomad/pages/DashboardPage.js.map +1 -1
- package/dist/ggnomad/pages/EntertainmentPage.js +40 -33
- package/dist/ggnomad/pages/EntertainmentPage.js.map +1 -1
- package/dist/ggnomad/pages/EventDetailsPage.js +86 -39
- package/dist/ggnomad/pages/EventDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/FavoritesPage.js +44 -27
- package/dist/ggnomad/pages/FavoritesPage.js.map +1 -1
- package/dist/ggnomad/pages/HospitalityPage.js +45 -42
- package/dist/ggnomad/pages/HospitalityPage.js.map +1 -1
- package/dist/ggnomad/pages/PageShell.js +33 -11
- package/dist/ggnomad/pages/PageShell.js.map +1 -1
- package/dist/ggnomad/pages/PropertyDetailsPage.js +95 -45
- package/dist/ggnomad/pages/PropertyDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/ProviderPage.js +65 -29
- package/dist/ggnomad/pages/ProviderPage.js.map +1 -1
- package/dist/ggnomad/pages/SearchPage.js +57 -48
- package/dist/ggnomad/pages/SearchPage.js.map +1 -1
- package/dist/ggnomad/pages/TourDetailsPage.js +86 -39
- package/dist/ggnomad/pages/TourDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/TourismPage.js +64 -63
- package/dist/ggnomad/pages/TourismPage.js.map +1 -1
- package/dist/ggnomad/pages/TravelPage.js +43 -27
- package/dist/ggnomad/pages/TravelPage.js.map +1 -1
- package/dist/ggnomad/utils/cn.js +10 -0
- package/dist/ggnomad/utils/cn.js.map +1 -0
- package/package.json +2 -2
|
@@ -1,43 +1,50 @@
|
|
|
1
1
|
import { GGNOMAD_EVENTS_QUERY as e } from "../graphql.js";
|
|
2
2
|
import { PageShell as t } from "./PageShell.js";
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
3
|
+
import { EntityCard as n } from "../components/EntityCard.js";
|
|
4
|
+
import "../components/index.js";
|
|
5
|
+
import { Ticket as r } from "lucide-react";
|
|
6
|
+
import { useI18n as i } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
7
|
+
import { useQuery as a } from "@apollo/client/react";
|
|
8
|
+
import { GlassCard as o, IllustratedEmptyState as s, PagePurpose as c } from "@burdenoff/fe-libs/ui";
|
|
9
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
6
10
|
//#region src/ggnomad/pages/EntertainmentPage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { data:
|
|
11
|
+
function d() {
|
|
12
|
+
let { t: d } = i(), { data: f } = a(e, { variables: {
|
|
9
13
|
first: 20,
|
|
10
14
|
skip: 0
|
|
11
|
-
} });
|
|
12
|
-
return /* @__PURE__ */
|
|
13
|
-
title: "Entertainment",
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
15
|
+
} }), p = f?.ggnomadEvents ?? [];
|
|
16
|
+
return /* @__PURE__ */ u(t, {
|
|
17
|
+
title: d("ggnomad.entertainment.title", "Entertainment"),
|
|
18
|
+
titleAccent: d("ggnomad.entertainment.title.accent", "Entertainment"),
|
|
19
|
+
subtitle: d("ggnomad.entertainment.subtitle", "Events and live experiences"),
|
|
20
|
+
children: [/* @__PURE__ */ l(c, {
|
|
21
|
+
icon: /* @__PURE__ */ l(r, { className: "size-4" }),
|
|
22
|
+
children: d("ggnomad.entertainment.purpose", "Find live events and experiences — concerts, shows and local happenings. Open an event to see its lineup, venue and timing, then book tickets for your trip dates.")
|
|
23
|
+
}), p.length === 0 ? /* @__PURE__ */ l(s, {
|
|
24
|
+
illustration: "empty-data",
|
|
25
|
+
title: d("ggnomad.entertainment.emptyTitle", "No events scheduled"),
|
|
26
|
+
description: d("ggnomad.entertainment.emptyDescription", "Upcoming events and live experiences will be listed here.")
|
|
27
|
+
}) : /* @__PURE__ */ u(o, {
|
|
28
|
+
treatment: "glass",
|
|
29
|
+
glow: !0,
|
|
30
|
+
className: "border-border-seam p-5",
|
|
31
|
+
children: [/* @__PURE__ */ l("h2", {
|
|
32
|
+
className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
|
|
33
|
+
children: d("ggnomad.entertainment.upcomingEvents", "Upcoming events")
|
|
34
|
+
}), /* @__PURE__ */ l("div", {
|
|
35
|
+
className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3",
|
|
36
|
+
children: p.map((e) => /* @__PURE__ */ l(n, {
|
|
37
|
+
to: e.id,
|
|
38
|
+
title: e.name,
|
|
39
|
+
meta: e.category,
|
|
40
|
+
price: `${e.currency} ${Number(e.price).toFixed(2)}`,
|
|
41
|
+
footer: new Date(e.startsAt).toLocaleString()
|
|
42
|
+
}, e.id))
|
|
43
|
+
})]
|
|
44
|
+
})]
|
|
38
45
|
});
|
|
39
46
|
}
|
|
40
47
|
//#endregion
|
|
41
|
-
export {
|
|
48
|
+
export { d as EntertainmentPage };
|
|
42
49
|
|
|
43
50
|
//# sourceMappingURL=EntertainmentPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntertainmentPage.js","names":[],"sources":["../../../src/ggnomad/pages/EntertainmentPage.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport {
|
|
1
|
+
{"version":3,"file":"EntertainmentPage.js","names":[],"sources":["../../../src/ggnomad/pages/EntertainmentPage.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 { Ticket } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_EVENTS_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\nimport { EntityCard } from '../components';\n\nexport function EntertainmentPage() {\n const { t } = useI18n();\n const { data } = useQuery(\n GGNOMAD_EVENTS_QUERY as TypedDocumentNode<\n {\n ggnomadEvents: Array<{\n id: string;\n name: string;\n category: string;\n startsAt: string;\n price: number;\n currency: string;\n }>;\n },\n { first: number; skip: number }\n >,\n { variables: { first: 20, skip: 0 } }\n );\n const events = data?.ggnomadEvents ?? [];\n\n return (\n <PageShell\n title={t('ggnomad.entertainment.title', 'Entertainment')}\n titleAccent={t('ggnomad.entertainment.title.accent', 'Entertainment')}\n subtitle={t('ggnomad.entertainment.subtitle', 'Events and live experiences')}\n >\n <PagePurpose icon={<Ticket className=\"size-4\" />}>\n {t(\n 'ggnomad.entertainment.purpose',\n 'Find live events and experiences — concerts, shows and local happenings. Open an event to see its lineup, venue and timing, then book tickets for your trip dates.'\n )}\n </PagePurpose>\n\n {events.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.entertainment.emptyTitle', 'No events scheduled')}\n description={t(\n 'ggnomad.entertainment.emptyDescription',\n 'Upcoming events and live experiences will be listed 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.entertainment.upcomingEvents', 'Upcoming events')}\n </h2>\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {events.map((event) => (\n <EntityCard\n key={event.id}\n to={event.id}\n title={event.name}\n meta={event.category}\n price={`${event.currency} ${Number(event.price).toFixed(2)}`}\n footer={new Date(event.startsAt).toLocaleString()}\n />\n ))}\n </div>\n </GlassCard>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;AAUA,SAAgB,IAAoB;CAClC,IAAM,EAAE,SAAM,GAAS,EACjB,EAAE,YAAS,EACf,GAaA,EAAE,WAAW;EAAE,OAAO;EAAI,MAAM;EAAG,EAAE,CACtC,EACK,IAAS,GAAM,iBAAiB,EAAE;AAExC,QACE,kBAAC,GAAD;EACE,OAAO,EAAE,+BAA+B,gBAAgB;EACxD,aAAa,EAAE,sCAAsC,gBAAgB;EACrE,UAAU,EAAE,kCAAkC,8BAA8B;YAH9E,CAKE,kBAAC,GAAD;GAAa,MAAM,kBAAC,GAAD,EAAQ,WAAU,UAAW,CAAA;aAC7C,EACC,iCACA,qKACD;GACW,CAAA,EAEb,EAAO,WAAW,IACjB,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,oCAAoC,sBAAsB;GACnE,aAAa,EACX,0CACA,4DACD;GACD,CAAA,GAEF,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAA5C,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAE,wCAAwC,kBAAkB;IAC1D,CAAA,EACL,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAO,KAAK,MACX,kBAAC,GAAD;KAEE,IAAI,EAAM;KACV,OAAO,EAAM;KACb,MAAM,EAAM;KACZ,OAAO,GAAG,EAAM,SAAS,GAAG,OAAO,EAAM,MAAM,CAAC,QAAQ,EAAE;KAC1D,QAAQ,IAAI,KAAK,EAAM,SAAS,CAAC,gBAAgB;KACjD,EANK,EAAM,GAMX,CACF;IACE,CAAA,CACI;KAEJ"}
|
|
@@ -1,49 +1,96 @@
|
|
|
1
1
|
import { GGNOMAD_EVENT_QUERY as e } from "../graphql.js";
|
|
2
2
|
import { PageShell as t } from "./PageShell.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
3
|
+
import { SectionCard as n } from "../components/SectionCard.js";
|
|
4
|
+
import { DetailRow as r } from "../components/DetailRow.js";
|
|
5
|
+
import "../components/index.js";
|
|
6
|
+
import { CalendarCheck as i, Mic2 as a, Ticket as o } from "lucide-react";
|
|
7
|
+
import { useI18n as s } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
8
|
+
import { useNavigate as c, useParams as l } from "react-router-dom";
|
|
9
|
+
import { useQuery as u } from "@apollo/client/react";
|
|
10
|
+
import { GlassCard as d, IllustratedEmptyState as f, NextSteps as p, PagePurpose as m } from "@burdenoff/fe-libs/ui";
|
|
11
|
+
import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
6
12
|
//#region src/ggnomad/pages/EventDetailsPage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { id:
|
|
9
|
-
variables: { id:
|
|
10
|
-
skip: !
|
|
11
|
-
}),
|
|
12
|
-
return /* @__PURE__ */
|
|
13
|
-
title:
|
|
14
|
-
subtitle: "Live event details, venue and lineup",
|
|
15
|
-
children:
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
13
|
+
function v() {
|
|
14
|
+
let { t: v } = s(), y = c(), { id: b = "" } = l(), { data: x } = u(e, {
|
|
15
|
+
variables: { id: b },
|
|
16
|
+
skip: !b
|
|
17
|
+
}), S = x?.ggnomadEvent;
|
|
18
|
+
return /* @__PURE__ */ g(t, {
|
|
19
|
+
title: S?.name ?? v("ggnomad.event.fallbackTitle", "Event details"),
|
|
20
|
+
subtitle: v("ggnomad.event.subtitle", "Live event details, venue and lineup"),
|
|
21
|
+
children: S ? /* @__PURE__ */ _(h, { children: [
|
|
22
|
+
/* @__PURE__ */ g(m, {
|
|
23
|
+
icon: /* @__PURE__ */ g(o, { className: "size-4" }),
|
|
24
|
+
children: v("ggnomad.event.purpose", "All the details for this live event in one place — category, start and end times, ticket price and the full lineup — so you can decide and book tickets before they sell out.")
|
|
25
|
+
}),
|
|
26
|
+
/* @__PURE__ */ g(p, {
|
|
27
|
+
storageKey: "ggnomad-event-detail",
|
|
28
|
+
steps: [{
|
|
29
|
+
id: "book",
|
|
30
|
+
label: v("ggnomad.event.next.book", "Book tickets"),
|
|
31
|
+
description: v("ggnomad.event.next.bookDesc", "Reserve seats and track them under Bookings."),
|
|
32
|
+
icon: /* @__PURE__ */ g(i, { className: "size-4" }),
|
|
33
|
+
onClick: () => y("../../bookings")
|
|
34
|
+
}, {
|
|
35
|
+
id: "browse",
|
|
36
|
+
label: v("ggnomad.event.next.browse", "See more events"),
|
|
37
|
+
description: v("ggnomad.event.next.browseDesc", "Return to Entertainment for other live experiences."),
|
|
38
|
+
icon: /* @__PURE__ */ g(o, { className: "size-4" }),
|
|
39
|
+
onClick: () => y("..")
|
|
40
|
+
}]
|
|
41
|
+
}),
|
|
42
|
+
/* @__PURE__ */ _("div", {
|
|
43
|
+
className: "grid gap-4 lg:grid-cols-2",
|
|
44
|
+
children: [/* @__PURE__ */ _(d, {
|
|
45
|
+
treatment: "glass",
|
|
46
|
+
glow: !0,
|
|
47
|
+
className: "border-border-seam p-5",
|
|
48
|
+
children: [/* @__PURE__ */ g("h2", {
|
|
49
|
+
className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
|
|
50
|
+
children: v("ggnomad.event.details", "Details")
|
|
51
|
+
}), /* @__PURE__ */ _("dl", {
|
|
52
|
+
className: "space-y-2 text-sm",
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ g(r, {
|
|
55
|
+
label: v("ggnomad.event.category", "Category"),
|
|
56
|
+
value: S.category
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ g(r, {
|
|
59
|
+
label: v("ggnomad.event.starts", "Starts"),
|
|
60
|
+
value: new Date(S.startsAt).toLocaleString()
|
|
61
|
+
}),
|
|
62
|
+
/* @__PURE__ */ g(r, {
|
|
63
|
+
label: v("ggnomad.event.ends", "Ends"),
|
|
64
|
+
value: S.endsAt ? new Date(S.endsAt).toLocaleString() : v("ggnomad.event.na", "N/A")
|
|
65
|
+
}),
|
|
66
|
+
/* @__PURE__ */ g(r, {
|
|
67
|
+
label: v("ggnomad.event.price", "Price"),
|
|
68
|
+
value: `${S.currency} ${Number(S.price).toFixed(2)}`
|
|
69
|
+
})
|
|
70
|
+
]
|
|
71
|
+
})]
|
|
72
|
+
}), /* @__PURE__ */ g(n, {
|
|
73
|
+
title: v("ggnomad.event.performers", "Performers"),
|
|
74
|
+
children: /* @__PURE__ */ g("ul", {
|
|
75
|
+
className: "space-y-2 text-sm",
|
|
76
|
+
children: (S.performers ?? []).map((e) => /* @__PURE__ */ _("li", {
|
|
77
|
+
className: "flex items-start gap-2 text-text-primary",
|
|
78
|
+
children: [/* @__PURE__ */ g(a, {
|
|
79
|
+
className: "mt-0.5 size-4 flex-shrink-0 text-action-primary-bg",
|
|
80
|
+
"aria-hidden": "true"
|
|
81
|
+
}), e]
|
|
82
|
+
}, e))
|
|
83
|
+
})
|
|
38
84
|
})]
|
|
39
|
-
})
|
|
40
|
-
}) : /* @__PURE__ */
|
|
41
|
-
|
|
42
|
-
|
|
85
|
+
})
|
|
86
|
+
] }) : /* @__PURE__ */ g(f, {
|
|
87
|
+
illustration: "empty-data",
|
|
88
|
+
title: v("ggnomad.event.notFoundTitle", "No event found"),
|
|
89
|
+
description: v("ggnomad.event.notFoundDescription", "This event is unavailable or may have been removed.")
|
|
43
90
|
})
|
|
44
91
|
});
|
|
45
92
|
}
|
|
46
93
|
//#endregion
|
|
47
|
-
export {
|
|
94
|
+
export { v as EventDetailsPage };
|
|
48
95
|
|
|
49
96
|
//# sourceMappingURL=EventDetailsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/EventDetailsPage.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport { useParams } from 'react-router-dom';\n\nimport { GGNOMAD_EVENT_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\n\nexport function EventDetailsPage() {\n const { id = '' } = useParams();\n const { data } = useQuery
|
|
1
|
+
{"version":3,"file":"EventDetailsPage.js","names":[],"sources":["../../../src/ggnomad/pages/EventDetailsPage.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { CalendarCheck, Mic2, Ticket } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_EVENT_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\nimport { DetailRow, SectionCard } from '../components';\n\nexport function EventDetailsPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { id = '' } = useParams();\n const { data } = useQuery(\n GGNOMAD_EVENT_QUERY as TypedDocumentNode<\n {\n ggnomadEvent: {\n name: string;\n category: string;\n startsAt: string;\n endsAt?: string;\n currency: string;\n price: number;\n performers: string[];\n } | null;\n },\n { id: string }\n >,\n { variables: { id }, skip: !id }\n );\n const event = data?.ggnomadEvent;\n\n return (\n <PageShell\n title={event?.name ?? t('ggnomad.event.fallbackTitle', 'Event details')}\n subtitle={t('ggnomad.event.subtitle', 'Live event details, venue and lineup')}\n >\n {!event ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.event.notFoundTitle', 'No event found')}\n description={t(\n 'ggnomad.event.notFoundDescription',\n 'This event is unavailable or may have been removed.'\n )}\n />\n ) : (\n <>\n <PagePurpose icon={<Ticket className=\"size-4\" />}>\n {t(\n 'ggnomad.event.purpose',\n 'All the details for this live event in one place — category, start and end times, ticket price and the full lineup — so you can decide and book tickets before they sell out.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"ggnomad-event-detail\"\n steps={[\n {\n id: 'book',\n label: t('ggnomad.event.next.book', 'Book tickets'),\n description: t(\n 'ggnomad.event.next.bookDesc',\n 'Reserve seats and track them under Bookings.'\n ),\n icon: <CalendarCheck className=\"size-4\" />,\n onClick: () => navigate('../../bookings'),\n },\n {\n id: 'browse',\n label: t('ggnomad.event.next.browse', 'See more events'),\n description: t(\n 'ggnomad.event.next.browseDesc',\n 'Return to Entertainment for other live experiences.'\n ),\n icon: <Ticket className=\"size-4\" />,\n onClick: () => navigate('..'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam p-5\">\n <h2 className=\"mb-4 text-lg font-medium tracking-tight text-text-primary\">\n {t('ggnomad.event.details', 'Details')}\n </h2>\n <dl className=\"space-y-2 text-sm\">\n <DetailRow label={t('ggnomad.event.category', 'Category')} value={event.category} />\n <DetailRow\n label={t('ggnomad.event.starts', 'Starts')}\n value={new Date(event.startsAt).toLocaleString()}\n />\n <DetailRow\n label={t('ggnomad.event.ends', 'Ends')}\n value={\n event.endsAt\n ? new Date(event.endsAt).toLocaleString()\n : t('ggnomad.event.na', 'N/A')\n }\n />\n <DetailRow\n label={t('ggnomad.event.price', 'Price')}\n value={`${event.currency} ${Number(event.price).toFixed(2)}`}\n />\n </dl>\n </GlassCard>\n <SectionCard title={t('ggnomad.event.performers', 'Performers')}>\n <ul className=\"space-y-2 text-sm\">\n {(event.performers ?? []).map((performer) => (\n <li key={performer} className=\"flex items-start gap-2 text-text-primary\">\n <Mic2\n className=\"mt-0.5 size-4 flex-shrink-0 text-action-primary-bg\"\n aria-hidden=\"true\"\n />\n {performer}\n </li>\n ))}\n </ul>\n </SectionCard>\n </div>\n </>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,IAAmB;CACjC,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,IAAQ,GAAM;AAEpB,QACE,kBAAC,GAAD;EACE,OAAO,GAAO,QAAQ,EAAE,+BAA+B,gBAAgB;EACvE,UAAU,EAAE,0BAA0B,uCAAuC;YAE3E,IAUA,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,GAAD;IAAa,MAAM,kBAAC,GAAD,EAAQ,WAAU,UAAW,CAAA;cAC7C,EACC,yBACA,gLACD;IACW,CAAA;GAEd,kBAAC,GAAD;IACE,YAAW;IACX,OAAO,CACL;KACE,IAAI;KACJ,OAAO,EAAE,2BAA2B,eAAe;KACnD,aAAa,EACX,+BACA,+CACD;KACD,MAAM,kBAAC,GAAD,EAAe,WAAU,UAAW,CAAA;KAC1C,eAAe,EAAS,iBAAiB;KAC1C,EACD;KACE,IAAI;KACJ,OAAO,EAAE,6BAA6B,kBAAkB;KACxD,aAAa,EACX,iCACA,sDACD;KACD,MAAM,kBAAC,GAAD,EAAQ,WAAU,UAAW,CAAA;KACnC,eAAe,EAAS,KAAK;KAC9B,CACF;IACD,CAAA;GAEF,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAW,WAAU;KAAQ,MAAA;KAAK,WAAU;eAA5C,CACE,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAE,yBAAyB,UAAU;MACnC,CAAA,EACL,kBAAC,MAAD;MAAI,WAAU;gBAAd;OACE,kBAAC,GAAD;QAAW,OAAO,EAAE,0BAA0B,WAAW;QAAE,OAAO,EAAM;QAAY,CAAA;OACpF,kBAAC,GAAD;QACE,OAAO,EAAE,wBAAwB,SAAS;QAC1C,OAAO,IAAI,KAAK,EAAM,SAAS,CAAC,gBAAgB;QAChD,CAAA;OACF,kBAAC,GAAD;QACE,OAAO,EAAE,sBAAsB,OAAO;QACtC,OACE,EAAM,SACF,IAAI,KAAK,EAAM,OAAO,CAAC,gBAAgB,GACvC,EAAE,oBAAoB,MAAM;QAElC,CAAA;OACF,kBAAC,GAAD;QACE,OAAO,EAAE,uBAAuB,QAAQ;QACxC,OAAO,GAAG,EAAM,SAAS,GAAG,OAAO,EAAM,MAAM,CAAC,QAAQ,EAAE;QAC1D,CAAA;OACC;QACK;QACZ,kBAAC,GAAD;KAAa,OAAO,EAAE,4BAA4B,aAAa;eAC7D,kBAAC,MAAD;MAAI,WAAU;iBACV,EAAM,cAAc,EAAE,EAAE,KAAK,MAC7B,kBAAC,MAAD;OAAoB,WAAU;iBAA9B,CACE,kBAAC,GAAD;QACE,WAAU;QACV,eAAY;QACZ,CAAA,EACD,EACE;SANI,EAMJ,CACL;MACC,CAAA;KACO,CAAA,CACV;;GACL,EAAA,CAAA,GAlFH,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,+BAA+B,iBAAiB;GACzD,aAAa,EACX,qCACA,sDACD;GACD,CAAA;EA6EM,CAAA"}
|
|
@@ -1,40 +1,57 @@
|
|
|
1
1
|
import { GGNOMAD_FAVORITES_QUERY as e, TOGGLE_GGNOMAD_FAVORITE_MUTATION as t } from "../graphql.js";
|
|
2
2
|
import { PageShell as n } from "./PageShell.js";
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
3
|
+
import { EntityCard as r } from "../components/EntityCard.js";
|
|
4
|
+
import "../components/index.js";
|
|
5
|
+
import { Heart as i } from "lucide-react";
|
|
6
|
+
import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
7
|
+
import { useMutation as o, useQuery as s } from "@apollo/client/react";
|
|
8
|
+
import { CTAOverflowMenu as c, GlassCard as l, IllustratedEmptyState as u, PagePurpose as d } from "@burdenoff/fe-libs/ui";
|
|
9
|
+
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
5
10
|
//#region src/ggnomad/pages/FavoritesPage.tsx
|
|
6
|
-
function
|
|
7
|
-
let { data:
|
|
8
|
-
return /* @__PURE__ */
|
|
9
|
-
title: "Favorites",
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
function m() {
|
|
12
|
+
let { t: m } = a(), { data: h, refetch: g } = s(e), [_] = o(t, { onCompleted: () => void g() }), v = h?.ggnomadFavorites ?? [];
|
|
13
|
+
return /* @__PURE__ */ p(n, {
|
|
14
|
+
title: m("ggnomad.favorites.title", "Favorites"),
|
|
15
|
+
titleAccent: m("ggnomad.favorites.title.accent", "Favorites"),
|
|
16
|
+
subtitle: m("ggnomad.favorites.subtitle", "Social ecosystem: saved entities across GGNomad domains"),
|
|
17
|
+
actions: /* @__PURE__ */ f(c, {
|
|
18
|
+
primary: {
|
|
19
|
+
label: m("ggnomad.favorites.actions.toggleDemo", "Toggle demo favorite"),
|
|
20
|
+
onSelect: () => {
|
|
21
|
+
_({ variables: { input: {
|
|
17
22
|
targetType: "PROPERTY",
|
|
18
23
|
targetId: "demo-property"
|
|
19
24
|
} } });
|
|
20
25
|
},
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}),
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
icon: /* @__PURE__ */ f(i, {})
|
|
27
|
+
},
|
|
28
|
+
actions: []
|
|
29
|
+
}),
|
|
30
|
+
children: [/* @__PURE__ */ f(d, {
|
|
31
|
+
icon: /* @__PURE__ */ f(i, { className: "size-4" }),
|
|
32
|
+
children: m("ggnomad.favorites.purpose", "A personal shortlist that spans every GGNomad domain — save properties, tours, events and trips you’re considering so you can compare and come back to them before you book.")
|
|
33
|
+
}), v.length === 0 ? /* @__PURE__ */ f(u, {
|
|
34
|
+
illustration: "empty-notifications",
|
|
35
|
+
title: m("ggnomad.favorites.emptyTitle", "No favorites saved"),
|
|
36
|
+
description: m("ggnomad.favorites.emptyDescription", "Items you save across travel, hospitality and tourism will collect here.")
|
|
37
|
+
}) : /* @__PURE__ */ p(l, {
|
|
38
|
+
treatment: "glass",
|
|
39
|
+
glow: !0,
|
|
40
|
+
className: "border-border-seam p-5",
|
|
41
|
+
children: [/* @__PURE__ */ f("h2", {
|
|
42
|
+
className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
|
|
43
|
+
children: m("ggnomad.favorites.savedItems", "Saved items")
|
|
44
|
+
}), /* @__PURE__ */ f("div", {
|
|
45
|
+
className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3",
|
|
46
|
+
children: v.map((e) => /* @__PURE__ */ f(r, {
|
|
47
|
+
title: e.targetType,
|
|
48
|
+
meta: e.targetId
|
|
49
|
+
}, e.id))
|
|
50
|
+
})]
|
|
34
51
|
})]
|
|
35
52
|
});
|
|
36
53
|
}
|
|
37
54
|
//#endregion
|
|
38
|
-
export {
|
|
55
|
+
export { m as FavoritesPage };
|
|
39
56
|
|
|
40
57
|
//# sourceMappingURL=FavoritesPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FavoritesPage.js","names":[],"sources":["../../../src/ggnomad/pages/FavoritesPage.tsx"],"sourcesContent":["import { useMutation, useQuery } from '@apollo/client/react';\n\nimport { GGNOMAD_FAVORITES_QUERY, TOGGLE_GGNOMAD_FAVORITE_MUTATION } from '../graphql';\nimport { PageShell } from './PageShell';\n\nexport function FavoritesPage() {\n const { data, refetch } = useQuery
|
|
1
|
+
{"version":3,"file":"FavoritesPage.js","names":[],"sources":["../../../src/ggnomad/pages/FavoritesPage.tsx"],"sourcesContent":["import { useMutation, useQuery } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Heart } from 'lucide-react';\nimport {\n CTAOverflowMenu,\n GlassCard,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_FAVORITES_QUERY, TOGGLE_GGNOMAD_FAVORITE_MUTATION } from '../graphql';\nimport { PageShell } from './PageShell';\nimport { EntityCard } from '../components';\n\nexport function FavoritesPage() {\n const { t } = useI18n();\n const { data, refetch } = useQuery(\n GGNOMAD_FAVORITES_QUERY as TypedDocumentNode<\n { ggnomadFavorites: Array<{ id: string; targetType: string; targetId: string }> },\n Record<string, never>\n >\n );\n const [toggleFavorite] = useMutation(TOGGLE_GGNOMAD_FAVORITE_MUTATION, {\n onCompleted: () => void refetch(),\n });\n const favorites = (data?.ggnomadFavorites ?? []) as Array<{\n id: string;\n targetType: string;\n targetId: string;\n }>;\n\n const handleToggleDemo = () => {\n void toggleFavorite({\n variables: { input: { targetType: 'PROPERTY', targetId: 'demo-property' } },\n });\n };\n\n return (\n <PageShell\n title={t('ggnomad.favorites.title', 'Favorites')}\n titleAccent={t('ggnomad.favorites.title.accent', 'Favorites')}\n subtitle={t(\n 'ggnomad.favorites.subtitle',\n 'Social ecosystem: saved entities across GGNomad domains'\n )}\n actions={\n <CTAOverflowMenu\n primary={{\n label: t('ggnomad.favorites.actions.toggleDemo', 'Toggle demo favorite'),\n onSelect: handleToggleDemo,\n icon: <Heart />,\n }}\n actions={[]}\n />\n }\n >\n <PagePurpose icon={<Heart className=\"size-4\" />}>\n {t(\n 'ggnomad.favorites.purpose',\n 'A personal shortlist that spans every GGNomad domain — save properties, tours, events and trips you’re considering so you can compare and come back to them before you book.'\n )}\n </PagePurpose>\n\n {favorites.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-notifications\"\n title={t('ggnomad.favorites.emptyTitle', 'No favorites saved')}\n description={t(\n 'ggnomad.favorites.emptyDescription',\n 'Items you save across travel, hospitality and tourism will collect 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.favorites.savedItems', 'Saved items')}\n </h2>\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {favorites.map((favorite) => (\n <EntityCard key={favorite.id} title={favorite.targetType} meta={favorite.targetId} />\n ))}\n </div>\n </GlassCard>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;AAeA,SAAgB,IAAgB;CAC9B,IAAM,EAAE,SAAM,GAAS,EACjB,EAAE,SAAM,eAAY,EACxB,EAID,EACK,CAAC,KAAkB,EAAY,GAAkC,EACrE,mBAAmB,KAAK,GAAS,EAClC,CAAC,EACI,IAAa,GAAM,oBAAoB,EAAE;AAY/C,QACE,kBAAC,GAAD;EACE,OAAO,EAAE,2BAA2B,YAAY;EAChD,aAAa,EAAE,kCAAkC,YAAY;EAC7D,UAAU,EACR,8BACA,0DACD;EACD,SACE,kBAAC,GAAD;GACE,SAAS;IACP,OAAO,EAAE,wCAAwC,uBAAuB;IACxE,gBAlBqB;AACxB,OAAe,EAClB,WAAW,EAAE,OAAO;MAAE,YAAY;MAAY,UAAU;MAAiB,EAAE,EAC5E,CAAC;;IAgBM,MAAM,kBAAC,GAAD,EAAS,CAAA;IAChB;GACD,SAAS,EAAE;GACX,CAAA;YAfN,CAkBE,kBAAC,GAAD;GAAa,MAAM,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;aAC5C,EACC,6BACA,+KACD;GACW,CAAA,EAEb,EAAU,WAAW,IACpB,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,gCAAgC,qBAAqB;GAC9D,aAAa,EACX,sCACA,2EACD;GACD,CAAA,GAEF,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAA5C,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAE,gCAAgC,cAAc;IAC9C,CAAA,EACL,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAU,KAAK,MACd,kBAAC,GAAD;KAA8B,OAAO,EAAS;KAAY,MAAM,EAAS;KAAY,EAApE,EAAS,GAA2D,CACrF;IACE,CAAA,CACI;KAEJ"}
|
|
@@ -1,53 +1,56 @@
|
|
|
1
1
|
import { GGNOMAD_PROPERTIES_QUERY as e } from "../graphql.js";
|
|
2
2
|
import { PageShell as t } from "./PageShell.js";
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { EntityCard as n } from "../components/EntityCard.js";
|
|
4
|
+
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";
|
|
7
10
|
//#region src/ggnomad/pages/HospitalityPage.tsx
|
|
8
|
-
function
|
|
9
|
-
let { t:
|
|
11
|
+
function f() {
|
|
12
|
+
let { t: f } = a(), { data: p } = o(e, { variables: {
|
|
10
13
|
first: 20,
|
|
11
14
|
skip: 0
|
|
12
|
-
} }),
|
|
13
|
-
return /* @__PURE__ */
|
|
14
|
-
title:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
]
|
|
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, {
|
|
24
|
+
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, {
|
|
28
|
+
treatment: "glass",
|
|
29
|
+
glow: !0,
|
|
30
|
+
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")]
|
|
44
47
|
})
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
})
|
|
48
|
+
}, e.id))
|
|
49
|
+
})]
|
|
50
|
+
})]
|
|
48
51
|
});
|
|
49
52
|
}
|
|
50
53
|
//#endregion
|
|
51
|
-
export {
|
|
54
|
+
export { f as HospitalityPage };
|
|
52
55
|
|
|
53
56
|
//# 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 { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {
|
|
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,18 +1,40 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AuroraBackground as e, GradientText as t } from "@burdenoff/fe-libs/ui";
|
|
2
|
+
import { Fragment as n, jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
2
3
|
//#region src/ggnomad/pages/PageShell.tsx
|
|
3
|
-
function
|
|
4
|
-
return /* @__PURE__ */
|
|
4
|
+
function a({ title: a, subtitle: o, titleAccent: s, actions: c, hero: l = !1, children: u }) {
|
|
5
|
+
return /* @__PURE__ */ i("div", {
|
|
5
6
|
className: "space-y-6 p-6",
|
|
6
|
-
children: [/* @__PURE__ */
|
|
7
|
-
className: "
|
|
8
|
-
children:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
children: [/* @__PURE__ */ i("header", {
|
|
8
|
+
className: l ? "relative overflow-hidden rounded-card border border-border-seam bg-gloss-card p-6 shadow-pop" : "flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",
|
|
9
|
+
children: [
|
|
10
|
+
l ? /* @__PURE__ */ r(e, { intensity: "subtle" }) : null,
|
|
11
|
+
/* @__PURE__ */ i("div", {
|
|
12
|
+
className: l ? "relative" : "min-w-0",
|
|
13
|
+
children: [/* @__PURE__ */ r("h1", {
|
|
14
|
+
className: "text-3xl font-semibold tracking-tight text-text-primary",
|
|
15
|
+
children: (() => {
|
|
16
|
+
if (!s || !a.includes(s)) return a;
|
|
17
|
+
let [e, o] = a.split(s);
|
|
18
|
+
return /* @__PURE__ */ i(n, { children: [
|
|
19
|
+
e,
|
|
20
|
+
/* @__PURE__ */ r(t, { children: s }),
|
|
21
|
+
o
|
|
22
|
+
] });
|
|
23
|
+
})()
|
|
24
|
+
}), /* @__PURE__ */ r("p", {
|
|
25
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
26
|
+
children: o
|
|
27
|
+
})]
|
|
28
|
+
}),
|
|
29
|
+
c ? /* @__PURE__ */ r("div", {
|
|
30
|
+
className: l ? "relative mt-4 sm:mt-0" : "flex-shrink-0",
|
|
31
|
+
children: c
|
|
32
|
+
}) : null
|
|
33
|
+
]
|
|
34
|
+
}), u]
|
|
13
35
|
});
|
|
14
36
|
}
|
|
15
37
|
//#endregion
|
|
16
|
-
export {
|
|
38
|
+
export { a as PageShell };
|
|
17
39
|
|
|
18
40
|
//# sourceMappingURL=PageShell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageShell.js","names":[],"sources":["../../../src/ggnomad/pages/PageShell.tsx"],"sourcesContent":["import type { PropsWithChildren } from 'react';\n\nexport function PageShell({\n title,\n subtitle,\n children,\n}:
|
|
1
|
+
{"version":3,"file":"PageShell.js","names":[],"sources":["../../../src/ggnomad/pages/PageShell.tsx"],"sourcesContent":["import type { PropsWithChildren, ReactNode } from 'react';\nimport { AuroraBackground, GradientText } from '@burdenoff/fe-libs/ui';\n\ntype PageShellProps = PropsWithChildren<{\n title: string;\n subtitle: string;\n /** Highlighted key noun rendered as a GradientText accent inside the H1. */\n titleAccent?: string;\n /** Single primary action / overflow menu cluster rendered at the header end. */\n actions?: ReactNode;\n /**\n * When true, the header becomes the MFE hero zone with a subtle aurora\n * backdrop. Use on exactly one page per MFE (the Dashboard).\n */\n hero?: boolean;\n}>;\n\n/**\n * Boff UI 2.0 page scaffold. The header is a seamless glass band; an optional\n * aurora backdrop turns it into the MFE hero. Content keeps its existing\n * vertical rhythm. The accent noun in the H1 is rendered via GradientText.\n */\nexport function PageShell({\n title,\n subtitle,\n titleAccent,\n actions,\n hero = false,\n children,\n}: PageShellProps) {\n const renderTitle = () => {\n if (!titleAccent || !title.includes(titleAccent)) {\n return title;\n }\n const [before, after] = title.split(titleAccent);\n return (\n <>\n {before}\n <GradientText>{titleAccent}</GradientText>\n {after}\n </>\n );\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <header\n className={\n hero\n ? 'relative overflow-hidden rounded-card border border-border-seam bg-gloss-card p-6 shadow-pop'\n : 'flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between'\n }\n >\n {hero ? <AuroraBackground intensity=\"subtle\" /> : null}\n <div className={hero ? 'relative' : 'min-w-0'}>\n <h1 className=\"text-3xl font-semibold tracking-tight text-text-primary\">\n {renderTitle()}\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">{subtitle}</p>\n </div>\n {actions ? (\n <div className={hero ? 'relative mt-4 sm:mt-0' : 'flex-shrink-0'}>{actions}</div>\n ) : null}\n </header>\n {children}\n </div>\n );\n}\n"],"mappings":";;;AAsBA,SAAgB,EAAU,EACxB,UACA,aACA,gBACA,YACA,UAAO,IACP,eACiB;AAejB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,UAAD;GACE,WACE,IACI,iGACA;aAJR;IAOG,IAAO,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA,GAAG;IAClD,kBAAC,OAAD;KAAK,WAAW,IAAO,aAAa;eAApC,CACE,kBAAC,MAAD;MAAI,WAAU;uBAzBI;AACxB,WAAI,CAAC,KAAe,CAAC,EAAM,SAAS,EAAY,CAC9C,QAAO;OAET,IAAM,CAAC,GAAQ,KAAS,EAAM,MAAM,EAAY;AAChD,cACE,kBAAA,GAAA,EAAA,UAAA;QACG;QACD,kBAAC,GAAD,EAAA,UAAe,GAA2B,CAAA;QACzC;QACA,EAAA,CAAA;UAgBiB;MACX,CAAA,EACL,kBAAC,KAAD;MAAG,WAAU;gBAAoC;MAAa,CAAA,CAC1D;;IACL,IACC,kBAAC,OAAD;KAAK,WAAW,IAAO,0BAA0B;eAAkB;KAAc,CAAA,GAC/E;IACG;MACR,EACG"}
|