@burdenoff/microfe-ggnomad 2026.825.1 → 2026.828.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 (98) hide show
  1. package/dist/ggnomad/components/AvailabilityPanel.d.ts +15 -0
  2. package/dist/ggnomad/components/AvailabilityPanel.d.ts.map +1 -0
  3. package/dist/ggnomad/components/AvailabilityPanel.js +91 -0
  4. package/dist/ggnomad/components/AvailabilityPanel.js.map +1 -0
  5. package/dist/ggnomad/components/BookingPanel.d.ts +1 -3
  6. package/dist/ggnomad/components/BookingPanel.d.ts.map +1 -1
  7. package/dist/ggnomad/components/BookingPanel.js +91 -82
  8. package/dist/ggnomad/components/BookingPanel.js.map +1 -1
  9. package/dist/ggnomad/components/EcoAccessPanel.d.ts +17 -0
  10. package/dist/ggnomad/components/EcoAccessPanel.d.ts.map +1 -0
  11. package/dist/ggnomad/components/EcoAccessPanel.js +68 -0
  12. package/dist/ggnomad/components/EcoAccessPanel.js.map +1 -0
  13. package/dist/ggnomad/components/FactGrid.d.ts +18 -0
  14. package/dist/ggnomad/components/FactGrid.d.ts.map +1 -0
  15. package/dist/ggnomad/components/FactGrid.js +29 -0
  16. package/dist/ggnomad/components/FactGrid.js.map +1 -0
  17. package/dist/ggnomad/components/GroupTripPanel.d.ts +22 -0
  18. package/dist/ggnomad/components/GroupTripPanel.d.ts.map +1 -0
  19. package/dist/ggnomad/components/GroupTripPanel.js +350 -0
  20. package/dist/ggnomad/components/GroupTripPanel.js.map +1 -0
  21. package/dist/ggnomad/components/ListingFilters.d.ts +29 -0
  22. package/dist/ggnomad/components/ListingFilters.d.ts.map +1 -0
  23. package/dist/ggnomad/components/ListingFilters.js +164 -0
  24. package/dist/ggnomad/components/ListingFilters.js.map +1 -0
  25. package/dist/ggnomad/components/PhotoGallery.d.ts +15 -0
  26. package/dist/ggnomad/components/PhotoGallery.d.ts.map +1 -0
  27. package/dist/ggnomad/components/PhotoGallery.js +54 -0
  28. package/dist/ggnomad/components/PhotoGallery.js.map +1 -0
  29. package/dist/ggnomad/components/ProviderCard.d.ts +19 -0
  30. package/dist/ggnomad/components/ProviderCard.d.ts.map +1 -0
  31. package/dist/ggnomad/components/ProviderCard.js +66 -0
  32. package/dist/ggnomad/components/ProviderCard.js.map +1 -0
  33. package/dist/ggnomad/components/RatingSummary.d.ts +14 -0
  34. package/dist/ggnomad/components/RatingSummary.d.ts.map +1 -0
  35. package/dist/ggnomad/components/RatingSummary.js +32 -0
  36. package/dist/ggnomad/components/RatingSummary.js.map +1 -0
  37. package/dist/ggnomad/components/TagChips.d.ts +16 -0
  38. package/dist/ggnomad/components/TagChips.d.ts.map +1 -0
  39. package/dist/ggnomad/components/TagChips.js +20 -0
  40. package/dist/ggnomad/components/TagChips.js.map +1 -0
  41. package/dist/ggnomad/components/index.d.ts +13 -0
  42. package/dist/ggnomad/components/index.d.ts.map +1 -1
  43. package/dist/ggnomad/components/index.js +9 -0
  44. package/dist/ggnomad/graphql.d.ts +10 -0
  45. package/dist/ggnomad/graphql.d.ts.map +1 -1
  46. package/dist/ggnomad/graphql.js +308 -20
  47. package/dist/ggnomad/graphql.js.map +1 -1
  48. package/dist/ggnomad/pages/ActivityDetailsPage.d.ts.map +1 -1
  49. package/dist/ggnomad/pages/ActivityDetailsPage.js +174 -86
  50. package/dist/ggnomad/pages/ActivityDetailsPage.js.map +1 -1
  51. package/dist/ggnomad/pages/AnalyticsPage.d.ts.map +1 -1
  52. package/dist/ggnomad/pages/AnalyticsPage.js +109 -77
  53. package/dist/ggnomad/pages/AnalyticsPage.js.map +1 -1
  54. package/dist/ggnomad/pages/BookingsPage.d.ts.map +1 -1
  55. package/dist/ggnomad/pages/BookingsPage.js +188 -137
  56. package/dist/ggnomad/pages/BookingsPage.js.map +1 -1
  57. package/dist/ggnomad/pages/DashboardPage.d.ts.map +1 -1
  58. package/dist/ggnomad/pages/DashboardPage.js +245 -128
  59. package/dist/ggnomad/pages/DashboardPage.js.map +1 -1
  60. package/dist/ggnomad/pages/EntertainmentPage.d.ts.map +1 -1
  61. package/dist/ggnomad/pages/EntertainmentPage.js +115 -53
  62. package/dist/ggnomad/pages/EntertainmentPage.js.map +1 -1
  63. package/dist/ggnomad/pages/EventDetailsPage.d.ts.map +1 -1
  64. package/dist/ggnomad/pages/EventDetailsPage.js +170 -87
  65. package/dist/ggnomad/pages/EventDetailsPage.js.map +1 -1
  66. package/dist/ggnomad/pages/FavoritesPage.d.ts.map +1 -1
  67. package/dist/ggnomad/pages/FavoritesPage.js +201 -84
  68. package/dist/ggnomad/pages/FavoritesPage.js.map +1 -1
  69. package/dist/ggnomad/pages/HospitalityPage.d.ts.map +1 -1
  70. package/dist/ggnomad/pages/HospitalityPage.js +99 -56
  71. package/dist/ggnomad/pages/HospitalityPage.js.map +1 -1
  72. package/dist/ggnomad/pages/PropertyDetailsPage.d.ts.map +1 -1
  73. package/dist/ggnomad/pages/PropertyDetailsPage.js +177 -93
  74. package/dist/ggnomad/pages/PropertyDetailsPage.js.map +1 -1
  75. package/dist/ggnomad/pages/ProviderPage.d.ts.map +1 -1
  76. package/dist/ggnomad/pages/ProviderPage.js +112 -63
  77. package/dist/ggnomad/pages/ProviderPage.js.map +1 -1
  78. package/dist/ggnomad/pages/SearchPage.d.ts.map +1 -1
  79. package/dist/ggnomad/pages/SearchPage.js +236 -65
  80. package/dist/ggnomad/pages/SearchPage.js.map +1 -1
  81. package/dist/ggnomad/pages/TourDetailsPage.d.ts.map +1 -1
  82. package/dist/ggnomad/pages/TourDetailsPage.js +171 -86
  83. package/dist/ggnomad/pages/TourDetailsPage.js.map +1 -1
  84. package/dist/ggnomad/pages/TourismPage.d.ts.map +1 -1
  85. package/dist/ggnomad/pages/TourismPage.js +108 -54
  86. package/dist/ggnomad/pages/TourismPage.js.map +1 -1
  87. package/dist/ggnomad/pages/TravelPage.d.ts.map +1 -1
  88. package/dist/ggnomad/pages/TravelPage.js +406 -43
  89. package/dist/ggnomad/pages/TravelPage.js.map +1 -1
  90. package/dist/ggnomad/pages/TripPlanDetailPage.d.ts.map +1 -1
  91. package/dist/ggnomad/pages/TripPlanDetailPage.js +93 -70
  92. package/dist/ggnomad/pages/TripPlanDetailPage.js.map +1 -1
  93. package/dist/ggnomad/utils/format.d.ts +47 -0
  94. package/dist/ggnomad/utils/format.d.ts.map +1 -0
  95. package/dist/ggnomad/utils/format.js +125 -0
  96. package/dist/ggnomad/utils/format.js.map +1 -0
  97. package/dist/stories/BookingPanel.stories.d.ts.map +1 -1
  98. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TravelPage.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/pages/TravelPage.tsx"],"names":[],"mappings":"AAUA,wBAAgB,UAAU,gCAgEzB"}
1
+ {"version":3,"file":"TravelPage.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/pages/TravelPage.tsx"],"names":[],"mappings":"AA6FA,wBAAgB,UAAU,gCAodzB"}
@@ -1,53 +1,416 @@
1
- import { GGNOMAD_TRIPS_QUERY as e } from "../graphql.js";
2
- import { PageShell as t } from "./PageShell.js";
3
- import { StatusBadge as n } from "../components/StatusBadge.js";
4
- import { EntityCard as r } from "../components/EntityCard.js";
1
+ import { CREATE_GGNOMAD_TRIP_MUTATION as e, GGNOMAD_TRANSPORT_SEARCH_QUERY as t, GGNOMAD_TRIPS_QUERY as n } from "../graphql.js";
2
+ import { formatDateTime as r, formatDurationMinutes as i, humanizeEnum as a, jsonArrayLength as o, jsonLabel as s } from "../utils/format.js";
3
+ import { PageShell as c } from "./PageShell.js";
4
+ import { StatusBadge as l } from "../components/StatusBadge.js";
5
+ import { SectionCard as u } from "../components/SectionCard.js";
6
+ import { notify as d } from "../utils/notify.js";
5
7
  import "../components/index.js";
6
- import { Plane 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";
8
+ import { useState as f } from "react";
9
+ import { ArrowRight as p, CalendarClock as m, Clock as h, Leaf as g, Plane as _, Plus as v, Search as y, Users as b } from "lucide-react";
10
+ import { useI18n as x } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
11
+ import { useMutation as S, useQuery as C } from "@apollo/client/react";
12
+ import { Button as w, GlassCard as T, IllustratedEmptyState as E, PagePurpose as D } from "@burdenoff/fe-libs/ui";
13
+ import { jsx as O, jsxs as k } from "react/jsx-runtime";
11
14
  //#region src/ggnomad/pages/TravelPage.tsx
12
- function f() {
13
- let { t: f } = a(), { data: p } = o(e, { variables: {
15
+ var A = "mt-1 w-full rounded-md border border-border-seam bg-bg-canvas px-3 py-2 text-sm text-text-primary focus:border-action-primary-bg focus:outline-none focus:ring-1 focus:ring-action-primary-bg", j = [
16
+ "FLIGHT",
17
+ "TRAIN",
18
+ "BUS",
19
+ "FERRY"
20
+ ], M = new Set([
21
+ "SEARCHING",
22
+ "BOOKED",
23
+ "CONFIRMED",
24
+ "IN_PROGRESS"
25
+ ]);
26
+ function N(e, t, n) {
27
+ let r = s(e), i = s(t);
28
+ return r && i ? `${r} → ${i}` : n;
29
+ }
30
+ function P() {
31
+ let { t: P } = x(), [F, I] = f({
32
+ origin: "",
33
+ destination: "",
34
+ departureDate: "",
35
+ returnDate: "",
36
+ passengers: 1,
37
+ transportMode: ""
38
+ }), [L, R] = f(null), { data: z, refetch: B } = C(n, { variables: {
14
39
  limit: 20,
15
40
  offset: 0
16
- } }), m = p?.ggnomadTrips ?? [];
17
- return /* @__PURE__ */ d(t, {
18
- title: f("ggnomad.travel.title", "Travel"),
19
- titleAccent: f("ggnomad.travel.title.accent", "Travel"),
20
- subtitle: f("ggnomad.travel.subtitle", "Live trip inventory and route management"),
21
- children: [/* @__PURE__ */ u(l, {
22
- icon: /* @__PURE__ */ u(i, { className: "size-4" }),
23
- children: f("ggnomad.travel.purpose", "Browse the live trip catalogue — flights, rail and road routes published by providers — to compare transport modes, prices and availability before turning a trip into a booking.")
24
- }), m.length === 0 ? /* @__PURE__ */ u(c, {
25
- illustration: "empty-data",
26
- title: f("ggnomad.travel.emptyTitle", "No trips in inventory"),
27
- description: f("ggnomad.travel.emptyDescription", "Routes and trips added by providers will appear here.")
28
- }) : /* @__PURE__ */ d(s, {
29
- treatment: "glass",
30
- glow: !0,
31
- className: "border-border-seam p-5",
32
- children: [/* @__PURE__ */ u("h2", {
33
- className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
34
- children: f("ggnomad.travel.availableTrips", "Available trips")
35
- }), /* @__PURE__ */ u("div", {
36
- className: "grid gap-3 sm:grid-cols-2",
37
- children: m.map((e) => /* @__PURE__ */ u(r, {
38
- title: e.name,
39
- meta: e.transportMode,
40
- price: `${e.currency} ${Number(e.price).toFixed(2)}`,
41
- badge: /* @__PURE__ */ u(n, {
42
- status: e.status,
43
- live: e.status === "ACTIVE"
41
+ } }), V = z?.ggnomadTrips ?? [], H = C(t, {
42
+ variables: { input: L ?? {
43
+ origin: "",
44
+ destination: "",
45
+ departureDate: ""
46
+ } },
47
+ skip: L === null
48
+ }), U = H.data?.searchGgnomadTransport ?? [], [W, { loading: G }] = S(e), K = () => {
49
+ if (!F.origin.trim() || !F.destination.trim() || !F.departureDate) {
50
+ d.warning(P("ggnomad.travel.search.missingTitle", "Route and date required"), P("ggnomad.travel.search.missingBody", "Enter an origin, a destination and a departure date to search transport inventory."));
51
+ return;
52
+ }
53
+ R({
54
+ origin: F.origin.trim(),
55
+ destination: F.destination.trim(),
56
+ departureDate: new Date(F.departureDate).toISOString(),
57
+ returnDate: F.returnDate ? new Date(F.returnDate).toISOString() : void 0,
58
+ passengers: Math.max(1, F.passengers),
59
+ transportMode: F.transportMode || void 0
60
+ });
61
+ }, q = async (e) => {
62
+ let t = N(e.origin, e.destination, e.carrier);
63
+ try {
64
+ let n = await W({ variables: { input: {
65
+ name: t,
66
+ transportMode: e.transportMode,
67
+ origin: e.origin ?? {},
68
+ destination: e.destination ?? {},
69
+ departureAt: e.departureAt,
70
+ arrivalAt: e.arrivalAt,
71
+ returnDepartureAt: e.returnDepartureAt ?? void 0,
72
+ returnArrivalAt: e.returnArrivalAt ?? void 0,
73
+ isRoundTrip: e.isRoundTrip,
74
+ carrier: e.carrier,
75
+ carrierCode: e.carrierCode ?? void 0,
76
+ class: e.class ?? void 0,
77
+ price: e.price,
78
+ currency: e.currency,
79
+ passengers: e.passengers,
80
+ stops: e.stops ?? void 0,
81
+ co2Emissions: e.co2Emissions ?? void 0,
82
+ ecoFriendly: e.ecoFriendly
83
+ } } });
84
+ if (n.error) {
85
+ d.error(P("ggnomad.travel.toast.addErrorTitle", "Could not add this route"), n.error.message);
86
+ return;
87
+ }
88
+ d.success(P("ggnomad.travel.toast.addSuccessTitle", "Route added to trip inventory"), t), await B();
89
+ } catch (e) {
90
+ d.error(P("ggnomad.travel.toast.addErrorTitle", "Could not add this route"), e instanceof Error ? e.message : String(e));
91
+ }
92
+ };
93
+ return /* @__PURE__ */ k(c, {
94
+ title: P("ggnomad.travel.title", "Travel"),
95
+ titleAccent: P("ggnomad.travel.title.accent", "Travel"),
96
+ subtitle: P("ggnomad.travel.subtitle", "Live trip inventory and route management"),
97
+ children: [
98
+ /* @__PURE__ */ O(D, {
99
+ icon: /* @__PURE__ */ O(_, { className: "size-4" }),
100
+ children: P("ggnomad.travel.purpose", "Browse the live trip catalogue — flights, rail and road routes published by providers — to compare transport modes, prices and availability before turning a trip into a booking.")
101
+ }),
102
+ /* @__PURE__ */ k(u, {
103
+ title: P("ggnomad.travel.search.title", "Search transport"),
104
+ children: [/* @__PURE__ */ k("div", {
105
+ className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-6",
106
+ children: [
107
+ /* @__PURE__ */ k("div", {
108
+ className: "xl:col-span-1",
109
+ children: [/* @__PURE__ */ O("label", {
110
+ htmlFor: "ggnomad-travel-origin",
111
+ className: "block text-sm font-medium text-text-primary",
112
+ children: P("ggnomad.travel.search.origin", "Origin")
113
+ }), /* @__PURE__ */ O("input", {
114
+ id: "ggnomad-travel-origin",
115
+ type: "text",
116
+ value: F.origin,
117
+ onChange: (e) => I({
118
+ ...F,
119
+ origin: e.target.value
120
+ }),
121
+ placeholder: P("ggnomad.travel.search.originPlaceholder", "City or station"),
122
+ className: A
123
+ })]
124
+ }),
125
+ /* @__PURE__ */ k("div", {
126
+ className: "xl:col-span-1",
127
+ children: [/* @__PURE__ */ O("label", {
128
+ htmlFor: "ggnomad-travel-destination",
129
+ className: "block text-sm font-medium text-text-primary",
130
+ children: P("ggnomad.travel.search.destination", "Destination")
131
+ }), /* @__PURE__ */ O("input", {
132
+ id: "ggnomad-travel-destination",
133
+ type: "text",
134
+ value: F.destination,
135
+ onChange: (e) => I({
136
+ ...F,
137
+ destination: e.target.value
138
+ }),
139
+ placeholder: P("ggnomad.travel.search.destinationPlaceholder", "City or station"),
140
+ className: A
141
+ })]
142
+ }),
143
+ /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("label", {
144
+ htmlFor: "ggnomad-travel-departure",
145
+ className: "block text-sm font-medium text-text-primary",
146
+ children: P("ggnomad.travel.search.departure", "Departure")
147
+ }), /* @__PURE__ */ O("input", {
148
+ id: "ggnomad-travel-departure",
149
+ type: "date",
150
+ value: F.departureDate,
151
+ onChange: (e) => I({
152
+ ...F,
153
+ departureDate: e.target.value
154
+ }),
155
+ className: A
156
+ })] }),
157
+ /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("label", {
158
+ htmlFor: "ggnomad-travel-return",
159
+ className: "block text-sm font-medium text-text-primary",
160
+ children: P("ggnomad.travel.search.return", "Return (optional)")
161
+ }), /* @__PURE__ */ O("input", {
162
+ id: "ggnomad-travel-return",
163
+ type: "date",
164
+ min: F.departureDate || void 0,
165
+ value: F.returnDate,
166
+ onChange: (e) => I({
167
+ ...F,
168
+ returnDate: e.target.value
169
+ }),
170
+ className: A
171
+ })] }),
172
+ /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("label", {
173
+ htmlFor: "ggnomad-travel-passengers",
174
+ className: "block text-sm font-medium text-text-primary",
175
+ children: P("ggnomad.travel.search.passengers", "Travellers")
176
+ }), /* @__PURE__ */ O("input", {
177
+ id: "ggnomad-travel-passengers",
178
+ type: "number",
179
+ min: 1,
180
+ value: F.passengers,
181
+ onChange: (e) => I({
182
+ ...F,
183
+ passengers: Math.max(1, Number(e.target.value) || 1)
184
+ }),
185
+ className: A
186
+ })] }),
187
+ /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("label", {
188
+ htmlFor: "ggnomad-travel-mode",
189
+ className: "block text-sm font-medium text-text-primary",
190
+ children: P("ggnomad.travel.search.mode", "Mode")
191
+ }), /* @__PURE__ */ k("select", {
192
+ id: "ggnomad-travel-mode",
193
+ value: F.transportMode,
194
+ onChange: (e) => I({
195
+ ...F,
196
+ transportMode: e.target.value
197
+ }),
198
+ className: A,
199
+ children: [/* @__PURE__ */ O("option", {
200
+ value: "",
201
+ children: P("ggnomad.travel.search.anyMode", "Any")
202
+ }), j.map((e) => /* @__PURE__ */ O("option", {
203
+ value: e,
204
+ children: a(e)
205
+ }, e))]
206
+ })] })
207
+ ]
208
+ }), /* @__PURE__ */ k("div", {
209
+ className: "mt-4 flex flex-wrap items-center gap-3",
210
+ children: [/* @__PURE__ */ k(w, {
211
+ onClick: K,
212
+ disabled: H.loading,
213
+ children: [/* @__PURE__ */ O(y, {
214
+ className: "size-4",
215
+ "aria-hidden": "true"
216
+ }), H.loading ? P("ggnomad.travel.search.searching", "Searching…") : P("ggnomad.travel.search.submit", "Search routes")]
217
+ }), /* @__PURE__ */ O("p", {
218
+ className: "text-xs text-text-secondary",
219
+ children: P("ggnomad.travel.search.note", "Returns live offers from the configured transport provider. Adding a route creates a trip in your inventory.")
220
+ })]
221
+ })]
222
+ }),
223
+ L === null ? null : /* @__PURE__ */ O(u, {
224
+ title: P("ggnomad.travel.offers.title", "Search results"),
225
+ children: H.error ? /* @__PURE__ */ O("p", {
226
+ className: "text-sm text-status-error-text",
227
+ children: P("ggnomad.travel.offers.error", "Could not search transport: {{message}}").replace("{{message}}", H.error.message)
228
+ }) : H.loading ? /* @__PURE__ */ O("p", {
229
+ className: "text-sm text-text-secondary",
230
+ children: P("ggnomad.travel.offers.loading", "Searching transport inventory…")
231
+ }) : U.length === 0 ? /* @__PURE__ */ O("p", {
232
+ className: "text-sm text-text-secondary",
233
+ children: P("ggnomad.travel.offers.empty", "No routes came back for that origin, destination and date.")
234
+ }) : /* @__PURE__ */ O("ul", {
235
+ className: "space-y-3",
236
+ children: U.map((e) => {
237
+ let t = o(e.stops);
238
+ return /* @__PURE__ */ k("li", {
239
+ className: "flex flex-wrap items-center justify-between gap-4 rounded-lg border border-border-seam bg-bg-surface/40 p-4",
240
+ children: [/* @__PURE__ */ k("div", {
241
+ className: "min-w-0 space-y-1",
242
+ children: [/* @__PURE__ */ k("p", {
243
+ className: "flex flex-wrap items-center gap-2 font-medium text-text-primary",
244
+ children: [
245
+ /* @__PURE__ */ O("span", { children: s(e.origin) ?? "—" }),
246
+ /* @__PURE__ */ O(p, {
247
+ className: "size-4 text-text-secondary",
248
+ "aria-hidden": "true"
249
+ }),
250
+ /* @__PURE__ */ O("span", { children: s(e.destination) ?? "—" })
251
+ ]
252
+ }), /* @__PURE__ */ k("div", {
253
+ className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-text-secondary",
254
+ children: [
255
+ /* @__PURE__ */ O("span", { children: a(e.transportMode) }),
256
+ /* @__PURE__ */ k("span", {
257
+ className: "inline-flex items-center gap-1",
258
+ children: [/* @__PURE__ */ O(h, {
259
+ className: "size-3.5",
260
+ "aria-hidden": "true"
261
+ }), i(e.durationMinutes)]
262
+ }),
263
+ /* @__PURE__ */ k("span", {
264
+ className: "inline-flex items-center gap-1",
265
+ children: [/* @__PURE__ */ O(m, {
266
+ className: "size-3.5",
267
+ "aria-hidden": "true"
268
+ }), r(e.departureAt) ?? e.departureAt]
269
+ }),
270
+ /* @__PURE__ */ O("span", { children: e.carrierCode ? `${e.carrier} · ${e.carrierCode}` : e.carrier }),
271
+ e.class ? /* @__PURE__ */ O("span", { children: a(e.class) }) : null,
272
+ t === null ? null : /* @__PURE__ */ O("span", { children: t === 0 ? P("ggnomad.travel.offers.nonStop", "Non-stop") : P("ggnomad.travel.offers.stops", "{{n}} stops").replace("{{n}}", String(t)) }),
273
+ /* @__PURE__ */ k("span", {
274
+ className: "inline-flex items-center gap-1",
275
+ children: [/* @__PURE__ */ O(b, {
276
+ className: "size-3.5",
277
+ "aria-hidden": "true"
278
+ }), e.passengers]
279
+ }),
280
+ e.ecoFriendly ? /* @__PURE__ */ k("span", {
281
+ className: "inline-flex items-center gap-1 text-status-success-text",
282
+ children: [/* @__PURE__ */ O(g, {
283
+ className: "size-3.5",
284
+ "aria-hidden": "true"
285
+ }), P("ggnomad.travel.ecoFriendly", "Lower-emission mode")]
286
+ }) : null,
287
+ e.co2Emissions !== null && e.co2Emissions !== void 0 ? /* @__PURE__ */ O("span", {
288
+ className: "tabular-nums",
289
+ children: P("ggnomad.travel.co2", "≈{{kg}} kg CO₂e").replace("{{kg}}", e.co2Emissions.toLocaleString())
290
+ }) : null
291
+ ]
292
+ })]
293
+ }), /* @__PURE__ */ k("div", {
294
+ className: "flex items-center gap-3",
295
+ children: [/* @__PURE__ */ k("span", {
296
+ className: "text-lg font-semibold tabular-nums text-text-primary",
297
+ children: [
298
+ e.currency,
299
+ " ",
300
+ Number(e.price).toFixed(2)
301
+ ]
302
+ }), /* @__PURE__ */ k(w, {
303
+ variant: "outline",
304
+ size: "sm",
305
+ disabled: G,
306
+ onClick: () => void q(e),
307
+ children: [/* @__PURE__ */ O(v, {
308
+ className: "size-4",
309
+ "aria-hidden": "true"
310
+ }), P("ggnomad.travel.offers.add", "Add to trips")]
311
+ })]
312
+ })]
313
+ }, e.offerId);
314
+ })
315
+ })
316
+ }),
317
+ V.length === 0 ? /* @__PURE__ */ O(E, {
318
+ illustration: "empty-data",
319
+ title: P("ggnomad.travel.emptyTitle", "No trips in inventory"),
320
+ description: P("ggnomad.travel.emptyDescription", "Routes and trips added by providers will appear here.")
321
+ }) : /* @__PURE__ */ k(T, {
322
+ treatment: "glass",
323
+ glow: !0,
324
+ className: "border-border-seam p-5",
325
+ children: [/* @__PURE__ */ O("h2", {
326
+ className: "mb-4 text-lg font-medium tracking-tight text-text-primary",
327
+ children: P("ggnomad.travel.availableTrips", "Available trips")
328
+ }), /* @__PURE__ */ O("ul", {
329
+ className: "grid gap-3",
330
+ children: V.map((e) => {
331
+ let t = o(e.stops);
332
+ return /* @__PURE__ */ k("li", {
333
+ className: "flex flex-wrap items-start justify-between gap-4 rounded-lg border border-border-seam bg-bg-surface/40 p-4",
334
+ children: [/* @__PURE__ */ k("div", {
335
+ className: "min-w-0 space-y-1",
336
+ children: [
337
+ /* @__PURE__ */ k("div", {
338
+ className: "flex flex-wrap items-center gap-2",
339
+ children: [
340
+ /* @__PURE__ */ O("p", {
341
+ className: "font-medium text-text-primary",
342
+ children: N(e.origin, e.destination, e.name)
343
+ }),
344
+ /* @__PURE__ */ O(l, {
345
+ status: e.status,
346
+ live: M.has(e.status.toUpperCase())
347
+ }),
348
+ e.isRoundTrip ? /* @__PURE__ */ O("span", {
349
+ className: "rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary",
350
+ children: P("ggnomad.travel.roundTrip", "Round trip")
351
+ }) : null
352
+ ]
353
+ }),
354
+ /* @__PURE__ */ k("div", {
355
+ className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-text-secondary",
356
+ children: [
357
+ /* @__PURE__ */ O("span", { children: a(e.transportMode) }),
358
+ /* @__PURE__ */ k("span", {
359
+ className: "inline-flex items-center gap-1",
360
+ children: [
361
+ /* @__PURE__ */ O(m, {
362
+ className: "size-3.5",
363
+ "aria-hidden": "true"
364
+ }),
365
+ r(e.departureAt) ?? e.departureAt,
366
+ " → ",
367
+ r(e.arrivalAt) ?? e.arrivalAt
368
+ ]
369
+ }),
370
+ e.carrier ? /* @__PURE__ */ O("span", { children: e.carrierCode ? `${e.carrier} · ${e.carrierCode}` : e.carrier }) : null,
371
+ e.class ? /* @__PURE__ */ O("span", { children: a(e.class) }) : null,
372
+ t !== null && t > 0 ? /* @__PURE__ */ O("span", { children: P("ggnomad.travel.offers.stops", "{{n}} stops").replace("{{n}}", String(t)) }) : null,
373
+ /* @__PURE__ */ k("span", {
374
+ className: "inline-flex items-center gap-1",
375
+ children: [/* @__PURE__ */ O(b, {
376
+ className: "size-3.5",
377
+ "aria-hidden": "true"
378
+ }), e.passengers]
379
+ }),
380
+ e.ecoFriendly ? /* @__PURE__ */ k("span", {
381
+ className: "inline-flex items-center gap-1 text-status-success-text",
382
+ children: [/* @__PURE__ */ O(g, {
383
+ className: "size-3.5",
384
+ "aria-hidden": "true"
385
+ }), P("ggnomad.travel.ecoFriendly", "Lower-emission mode")]
386
+ }) : null,
387
+ e.co2Emissions !== null && e.co2Emissions !== void 0 ? /* @__PURE__ */ O("span", {
388
+ className: "tabular-nums",
389
+ children: P("ggnomad.travel.co2", "≈{{kg}} kg CO₂e").replace("{{kg}}", e.co2Emissions.toLocaleString())
390
+ }) : null
391
+ ]
392
+ }),
393
+ e.returnDepartureAt ? /* @__PURE__ */ O("p", {
394
+ className: "text-sm text-text-secondary",
395
+ children: P("ggnomad.travel.returnLeg", "Return: {{depart}} → {{arrive}}").replace("{{depart}}", r(e.returnDepartureAt) ?? e.returnDepartureAt).replace("{{arrive}}", r(e.returnArrivalAt) ?? "—")
396
+ }) : null
397
+ ]
398
+ }), /* @__PURE__ */ k("span", {
399
+ className: "text-lg font-semibold tabular-nums text-text-primary",
400
+ children: [
401
+ e.currency,
402
+ " ",
403
+ Number(e.price).toFixed(2)
404
+ ]
405
+ })]
406
+ }, e.id);
44
407
  })
45
- }, e.id))
46
- })]
47
- })]
408
+ })]
409
+ })
410
+ ]
48
411
  });
49
412
  }
50
413
  //#endregion
51
- export { f as TravelPage };
414
+ export { P as TravelPage };
52
415
 
53
416
  //# sourceMappingURL=TravelPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TravelPage.js","names":[],"sources":["../../../src/ggnomad/pages/TravelPage.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 { Plane } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_TRIPS_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\nimport { EntityCard, StatusBadge } from '../components';\n\nexport function TravelPage() {\n const { t } = useI18n();\n const { data } = useQuery(\n GGNOMAD_TRIPS_QUERY as TypedDocumentNode<\n {\n ggnomadTrips: Array<{\n id: string;\n name: string;\n transportMode: string;\n status: string;\n price: number;\n currency: string;\n }>;\n },\n { limit: number; offset: number }\n >,\n {\n variables: { limit: 20, offset: 0 },\n }\n );\n const trips = data?.ggnomadTrips ?? [];\n\n return (\n <PageShell\n title={t('ggnomad.travel.title', 'Travel')}\n titleAccent={t('ggnomad.travel.title.accent', 'Travel')}\n subtitle={t('ggnomad.travel.subtitle', 'Live trip inventory and route management')}\n >\n <PagePurpose icon={<Plane className=\"size-4\" />}>\n {t(\n 'ggnomad.travel.purpose',\n 'Browse the live trip catalogue — flights, rail and road routes published by providers — to compare transport modes, prices and availability before turning a trip into a booking.'\n )}\n </PagePurpose>\n\n {trips.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.travel.emptyTitle', 'No trips in inventory')}\n description={t(\n 'ggnomad.travel.emptyDescription',\n 'Routes and trips added by providers will appear 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.travel.availableTrips', 'Available trips')}\n </h2>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {trips.map((trip) => (\n <EntityCard\n key={trip.id}\n title={trip.name}\n meta={trip.transportMode}\n price={`${trip.currency} ${Number(trip.price).toFixed(2)}`}\n badge={<StatusBadge status={trip.status} live={trip.status === 'ACTIVE'} />}\n />\n ))}\n </div>\n </GlassCard>\n )}\n </PageShell>\n );\n}\n"],"mappings":";;;;;;;;;;;AAUA,SAAgB,IAAa;CAC3B,IAAM,EAAE,SAAM,EAAQ,GAChB,EAAE,YAAS,EACf,GAaA,EACE,WAAW;EAAE,OAAO;EAAI,QAAQ;CAAE,EACpC,CACF,GACM,IAAQ,GAAM,gBAAgB,CAAC;CAErC,OACE,kBAAC,GAAD;EACE,OAAO,EAAE,wBAAwB,QAAQ;EACzC,aAAa,EAAE,+BAA+B,QAAQ;EACtD,UAAU,EAAE,2BAA2B,0CAA0C;YAHnF,CAKE,kBAAC,GAAD;GAAa,MAAM,kBAAC,GAAD,EAAO,WAAU,SAAU,CAAA;aAC3C,EACC,0BACA,mLACF;EACW,CAAA,GAEZ,EAAM,WAAW,IAChB,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAE,6BAA6B,uBAAuB;GAC7D,aAAa,EACX,mCACA,uDACF;EACD,CAAA,IAED,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAA5C,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAE,iCAAiC,iBAAiB;GACnD,CAAA,GACJ,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAM,KAAK,MACV,kBAAC,GAAD;KAEE,OAAO,EAAK;KACZ,MAAM,EAAK;KACX,OAAO,GAAG,EAAK,SAAS,GAAG,OAAO,EAAK,KAAK,EAAE,QAAQ,CAAC;KACvD,OAAO,kBAAC,GAAD;MAAa,QAAQ,EAAK;MAAQ,MAAM,EAAK,WAAW;KAAW,CAAA;IAC3E,GALM,EAAK,EAKX,CACF;GACE,CAAA,CACI;IAEJ;;AAEf"}
1
+ {"version":3,"file":"TravelPage.js","names":[],"sources":["../../../src/ggnomad/pages/TravelPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { ArrowRight, CalendarClock, Clock, Leaf, Plane, Plus, Search, Users } from 'lucide-react';\nimport { Button, GlassCard, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport {\n CREATE_GGNOMAD_TRIP_MUTATION,\n GGNOMAD_TRANSPORT_SEARCH_QUERY,\n GGNOMAD_TRIPS_QUERY,\n} from '../graphql';\nimport {\n formatDateTime,\n formatDurationMinutes,\n humanizeEnum,\n jsonArrayLength,\n jsonLabel,\n} from '../utils/format';\nimport { notify } from '../utils/notify';\nimport { PageShell } from './PageShell';\nimport { SectionCard, StatusBadge } from '../components';\n\ntype TripRow = {\n id: string;\n name: string;\n transportMode: string;\n status: string;\n origin?: unknown;\n destination?: unknown;\n departureAt: string;\n arrivalAt: string;\n isRoundTrip: boolean;\n carrier?: string | null;\n carrierCode?: string | null;\n class?: string | null;\n price: number;\n currency: string;\n passengers: number;\n ecoFriendly: boolean;\n co2Emissions?: number | null;\n stops?: unknown;\n returnDepartureAt?: string | null;\n returnArrivalAt?: string | null;\n};\n\ntype TransportOffer = {\n offerId: string;\n origin?: unknown;\n destination?: unknown;\n transportMode: string;\n departureAt: string;\n arrivalAt: string;\n returnDepartureAt?: string | null;\n returnArrivalAt?: string | null;\n isRoundTrip: boolean;\n carrier: string;\n carrierCode?: string | null;\n class?: string | null;\n price: number;\n currency: string;\n passengers: number;\n stops?: unknown;\n durationMinutes: number;\n ecoFriendly: boolean;\n co2Emissions?: number | null;\n providerName: string;\n};\n\ntype SearchCriteria = {\n origin: string;\n destination: string;\n departureDate: string;\n returnDate?: string;\n passengers?: number;\n transportMode?: string;\n};\n\nconst INPUT_CLASSES =\n 'mt-1 w-full rounded-md border border-border-seam bg-bg-canvas px-3 py-2 text-sm text-text-primary focus:border-action-primary-bg focus:outline-none focus:ring-1 focus:ring-action-primary-bg';\n\n/** `transportMode` on the search input is free-text; these are the modes the service resolves. */\nconst TRANSPORT_MODES = ['FLIGHT', 'TRAIN', 'BUS', 'FERRY'];\n\nconst ACTIVE_TRIP_STATUSES = new Set(['SEARCHING', 'BOOKED', 'CONFIRMED', 'IN_PROGRESS']);\n\nfunction routeLabel(origin: unknown, destination: unknown, fallback: string): string {\n const from = jsonLabel(origin);\n const to = jsonLabel(destination);\n if (from && to) return `${from} → ${to}`;\n return fallback;\n}\n\nexport function TravelPage() {\n const { t } = useI18n();\n const [form, setForm] = useState({\n origin: '',\n destination: '',\n departureDate: '',\n returnDate: '',\n passengers: 1,\n transportMode: '',\n });\n const [criteria, setCriteria] = useState<SearchCriteria | null>(null);\n\n const { data, refetch } = useQuery(\n GGNOMAD_TRIPS_QUERY as TypedDocumentNode<\n { ggnomadTrips: TripRow[] },\n { limit: number; offset: number }\n >,\n { variables: { limit: 20, offset: 0 } }\n );\n const trips = data?.ggnomadTrips ?? [];\n\n const offersQuery = useQuery(\n GGNOMAD_TRANSPORT_SEARCH_QUERY as TypedDocumentNode<\n { searchGgnomadTransport: TransportOffer[] },\n { input: SearchCriteria }\n >,\n {\n variables: { input: criteria ?? { origin: '', destination: '', departureDate: '' } },\n skip: criteria === null,\n }\n );\n const offers = offersQuery.data?.searchGgnomadTransport ?? [];\n\n const [createTrip, { loading: adding }] = useMutation(\n CREATE_GGNOMAD_TRIP_MUTATION as TypedDocumentNode<\n { createGgnomadTrip: { id: string; name: string; status: string } },\n {\n input: {\n name: string;\n transportMode: string;\n origin: unknown;\n destination: unknown;\n departureAt: string;\n arrivalAt: string;\n returnDepartureAt?: string | null;\n returnArrivalAt?: string | null;\n isRoundTrip?: boolean;\n carrier?: string | null;\n carrierCode?: string | null;\n class?: string | null;\n price: number;\n currency?: string;\n passengers?: number;\n stops?: unknown;\n co2Emissions?: number | null;\n ecoFriendly?: boolean;\n };\n }\n >\n );\n\n const handleSearch = () => {\n if (!form.origin.trim() || !form.destination.trim() || !form.departureDate) {\n notify.warning(\n t('ggnomad.travel.search.missingTitle', 'Route and date required'),\n t(\n 'ggnomad.travel.search.missingBody',\n 'Enter an origin, a destination and a departure date to search transport inventory.'\n )\n );\n return;\n }\n setCriteria({\n origin: form.origin.trim(),\n destination: form.destination.trim(),\n departureDate: new Date(form.departureDate).toISOString(),\n returnDate: form.returnDate ? new Date(form.returnDate).toISOString() : undefined,\n passengers: Math.max(1, form.passengers),\n transportMode: form.transportMode || undefined,\n });\n };\n\n const handleAddOffer = async (offer: TransportOffer) => {\n const name = routeLabel(offer.origin, offer.destination, offer.carrier);\n try {\n const result = await createTrip({\n variables: {\n input: {\n name,\n transportMode: offer.transportMode,\n origin: offer.origin ?? {},\n destination: offer.destination ?? {},\n departureAt: offer.departureAt,\n arrivalAt: offer.arrivalAt,\n returnDepartureAt: offer.returnDepartureAt ?? undefined,\n returnArrivalAt: offer.returnArrivalAt ?? undefined,\n isRoundTrip: offer.isRoundTrip,\n carrier: offer.carrier,\n carrierCode: offer.carrierCode ?? undefined,\n class: offer.class ?? undefined,\n price: offer.price,\n currency: offer.currency,\n passengers: offer.passengers,\n stops: offer.stops ?? undefined,\n co2Emissions: offer.co2Emissions ?? undefined,\n ecoFriendly: offer.ecoFriendly,\n },\n },\n });\n if (result.error) {\n notify.error(\n t('ggnomad.travel.toast.addErrorTitle', 'Could not add this route'),\n result.error.message\n );\n return;\n }\n notify.success(\n t('ggnomad.travel.toast.addSuccessTitle', 'Route added to trip inventory'),\n name\n );\n await refetch();\n } catch (err) {\n notify.error(\n t('ggnomad.travel.toast.addErrorTitle', 'Could not add this route'),\n err instanceof Error ? err.message : String(err)\n );\n }\n };\n\n return (\n <PageShell\n title={t('ggnomad.travel.title', 'Travel')}\n titleAccent={t('ggnomad.travel.title.accent', 'Travel')}\n subtitle={t('ggnomad.travel.subtitle', 'Live trip inventory and route management')}\n >\n <PagePurpose icon={<Plane className=\"size-4\" />}>\n {t(\n 'ggnomad.travel.purpose',\n 'Browse the live trip catalogue — flights, rail and road routes published by providers — to compare transport modes, prices and availability before turning a trip into a booking.'\n )}\n </PagePurpose>\n\n <SectionCard title={t('ggnomad.travel.search.title', 'Search transport')}>\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-6\">\n <div className=\"xl:col-span-1\">\n <label\n htmlFor=\"ggnomad-travel-origin\"\n className=\"block text-sm font-medium text-text-primary\"\n >\n {t('ggnomad.travel.search.origin', 'Origin')}\n </label>\n <input\n id=\"ggnomad-travel-origin\"\n type=\"text\"\n value={form.origin}\n onChange={(event) => setForm({ ...form, origin: event.target.value })}\n placeholder={t('ggnomad.travel.search.originPlaceholder', 'City or station')}\n className={INPUT_CLASSES}\n />\n </div>\n <div className=\"xl:col-span-1\">\n <label\n htmlFor=\"ggnomad-travel-destination\"\n className=\"block text-sm font-medium text-text-primary\"\n >\n {t('ggnomad.travel.search.destination', 'Destination')}\n </label>\n <input\n id=\"ggnomad-travel-destination\"\n type=\"text\"\n value={form.destination}\n onChange={(event) => setForm({ ...form, destination: event.target.value })}\n placeholder={t('ggnomad.travel.search.destinationPlaceholder', 'City or station')}\n className={INPUT_CLASSES}\n />\n </div>\n <div>\n <label\n htmlFor=\"ggnomad-travel-departure\"\n className=\"block text-sm font-medium text-text-primary\"\n >\n {t('ggnomad.travel.search.departure', 'Departure')}\n </label>\n <input\n id=\"ggnomad-travel-departure\"\n type=\"date\"\n value={form.departureDate}\n onChange={(event) => setForm({ ...form, departureDate: event.target.value })}\n className={INPUT_CLASSES}\n />\n </div>\n <div>\n <label\n htmlFor=\"ggnomad-travel-return\"\n className=\"block text-sm font-medium text-text-primary\"\n >\n {t('ggnomad.travel.search.return', 'Return (optional)')}\n </label>\n <input\n id=\"ggnomad-travel-return\"\n type=\"date\"\n min={form.departureDate || undefined}\n value={form.returnDate}\n onChange={(event) => setForm({ ...form, returnDate: event.target.value })}\n className={INPUT_CLASSES}\n />\n </div>\n <div>\n <label\n htmlFor=\"ggnomad-travel-passengers\"\n className=\"block text-sm font-medium text-text-primary\"\n >\n {t('ggnomad.travel.search.passengers', 'Travellers')}\n </label>\n <input\n id=\"ggnomad-travel-passengers\"\n type=\"number\"\n min={1}\n value={form.passengers}\n onChange={(event) =>\n setForm({ ...form, passengers: Math.max(1, Number(event.target.value) || 1) })\n }\n className={INPUT_CLASSES}\n />\n </div>\n <div>\n <label\n htmlFor=\"ggnomad-travel-mode\"\n className=\"block text-sm font-medium text-text-primary\"\n >\n {t('ggnomad.travel.search.mode', 'Mode')}\n </label>\n <select\n id=\"ggnomad-travel-mode\"\n value={form.transportMode}\n onChange={(event) => setForm({ ...form, transportMode: event.target.value })}\n className={INPUT_CLASSES}\n >\n <option value=\"\">{t('ggnomad.travel.search.anyMode', 'Any')}</option>\n {TRANSPORT_MODES.map((mode) => (\n <option key={mode} value={mode}>\n {humanizeEnum(mode)}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"mt-4 flex flex-wrap items-center gap-3\">\n <Button onClick={handleSearch} disabled={offersQuery.loading}>\n <Search className=\"size-4\" aria-hidden=\"true\" />\n {offersQuery.loading\n ? t('ggnomad.travel.search.searching', 'Searching…')\n : t('ggnomad.travel.search.submit', 'Search routes')}\n </Button>\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'ggnomad.travel.search.note',\n 'Returns live offers from the configured transport provider. Adding a route creates a trip in your inventory.'\n )}\n </p>\n </div>\n </SectionCard>\n\n {criteria !== null ? (\n <SectionCard title={t('ggnomad.travel.offers.title', 'Search results')}>\n {offersQuery.error ? (\n <p className=\"text-sm text-status-error-text\">\n {t('ggnomad.travel.offers.error', 'Could not search transport: {{message}}').replace(\n '{{message}}',\n offersQuery.error.message\n )}\n </p>\n ) : offersQuery.loading ? (\n <p className=\"text-sm text-text-secondary\">\n {t('ggnomad.travel.offers.loading', 'Searching transport inventory…')}\n </p>\n ) : offers.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n {t(\n 'ggnomad.travel.offers.empty',\n 'No routes came back for that origin, destination and date.'\n )}\n </p>\n ) : (\n <ul className=\"space-y-3\">\n {offers.map((offer) => {\n const stopCount = jsonArrayLength(offer.stops);\n return (\n <li\n key={offer.offerId}\n className=\"flex flex-wrap items-center justify-between gap-4 rounded-lg border border-border-seam bg-bg-surface/40 p-4\"\n >\n <div className=\"min-w-0 space-y-1\">\n <p className=\"flex flex-wrap items-center gap-2 font-medium text-text-primary\">\n <span>{jsonLabel(offer.origin) ?? '—'}</span>\n <ArrowRight className=\"size-4 text-text-secondary\" aria-hidden=\"true\" />\n <span>{jsonLabel(offer.destination) ?? '—'}</span>\n </p>\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-text-secondary\">\n <span>{humanizeEnum(offer.transportMode)}</span>\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"size-3.5\" aria-hidden=\"true\" />\n {formatDurationMinutes(offer.durationMinutes)}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <CalendarClock className=\"size-3.5\" aria-hidden=\"true\" />\n {formatDateTime(offer.departureAt) ?? offer.departureAt}\n </span>\n <span>\n {offer.carrierCode\n ? `${offer.carrier} · ${offer.carrierCode}`\n : offer.carrier}\n </span>\n {offer.class ? <span>{humanizeEnum(offer.class)}</span> : null}\n {stopCount !== null ? (\n <span>\n {stopCount === 0\n ? t('ggnomad.travel.offers.nonStop', 'Non-stop')\n : t('ggnomad.travel.offers.stops', '{{n}} stops').replace(\n '{{n}}',\n String(stopCount)\n )}\n </span>\n ) : null}\n <span className=\"inline-flex items-center gap-1\">\n <Users className=\"size-3.5\" aria-hidden=\"true\" />\n {offer.passengers}\n </span>\n {offer.ecoFriendly ? (\n <span className=\"inline-flex items-center gap-1 text-status-success-text\">\n <Leaf className=\"size-3.5\" aria-hidden=\"true\" />\n {t('ggnomad.travel.ecoFriendly', 'Lower-emission mode')}\n </span>\n ) : null}\n {offer.co2Emissions !== null && offer.co2Emissions !== undefined ? (\n <span className=\"tabular-nums\">\n {t('ggnomad.travel.co2', '≈{{kg}} kg CO₂e').replace(\n '{{kg}}',\n offer.co2Emissions.toLocaleString()\n )}\n </span>\n ) : null}\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-lg font-semibold tabular-nums text-text-primary\">\n {offer.currency} {Number(offer.price).toFixed(2)}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={adding}\n onClick={() => void handleAddOffer(offer)}\n >\n <Plus className=\"size-4\" aria-hidden=\"true\" />\n {t('ggnomad.travel.offers.add', 'Add to trips')}\n </Button>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </SectionCard>\n ) : null}\n\n {trips.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('ggnomad.travel.emptyTitle', 'No trips in inventory')}\n description={t(\n 'ggnomad.travel.emptyDescription',\n 'Routes and trips added by providers will appear 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.travel.availableTrips', 'Available trips')}\n </h2>\n <ul className=\"grid gap-3\">\n {trips.map((trip) => {\n const stopCount = jsonArrayLength(trip.stops);\n return (\n <li\n key={trip.id}\n className=\"flex flex-wrap items-start justify-between gap-4 rounded-lg border border-border-seam bg-bg-surface/40 p-4\"\n >\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"font-medium text-text-primary\">\n {routeLabel(trip.origin, trip.destination, trip.name)}\n </p>\n <StatusBadge\n status={trip.status}\n live={ACTIVE_TRIP_STATUSES.has(trip.status.toUpperCase())}\n />\n {trip.isRoundTrip ? (\n <span className=\"rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary\">\n {t('ggnomad.travel.roundTrip', 'Round trip')}\n </span>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-text-secondary\">\n <span>{humanizeEnum(trip.transportMode)}</span>\n <span className=\"inline-flex items-center gap-1\">\n <CalendarClock className=\"size-3.5\" aria-hidden=\"true\" />\n {formatDateTime(trip.departureAt) ?? trip.departureAt}\n {' → '}\n {formatDateTime(trip.arrivalAt) ?? trip.arrivalAt}\n </span>\n {trip.carrier ? (\n <span>\n {trip.carrierCode\n ? `${trip.carrier} · ${trip.carrierCode}`\n : trip.carrier}\n </span>\n ) : null}\n {trip.class ? <span>{humanizeEnum(trip.class)}</span> : null}\n {stopCount !== null && stopCount > 0 ? (\n <span>\n {t('ggnomad.travel.offers.stops', '{{n}} stops').replace(\n '{{n}}',\n String(stopCount)\n )}\n </span>\n ) : null}\n <span className=\"inline-flex items-center gap-1\">\n <Users className=\"size-3.5\" aria-hidden=\"true\" />\n {trip.passengers}\n </span>\n {trip.ecoFriendly ? (\n <span className=\"inline-flex items-center gap-1 text-status-success-text\">\n <Leaf className=\"size-3.5\" aria-hidden=\"true\" />\n {t('ggnomad.travel.ecoFriendly', 'Lower-emission mode')}\n </span>\n ) : null}\n {trip.co2Emissions !== null && trip.co2Emissions !== undefined ? (\n <span className=\"tabular-nums\">\n {t('ggnomad.travel.co2', '≈{{kg}} kg CO₂e').replace(\n '{{kg}}',\n trip.co2Emissions.toLocaleString()\n )}\n </span>\n ) : null}\n </div>\n {trip.returnDepartureAt ? (\n <p className=\"text-sm text-text-secondary\">\n {t('ggnomad.travel.returnLeg', 'Return: {{depart}} → {{arrive}}')\n .replace(\n '{{depart}}',\n formatDateTime(trip.returnDepartureAt) ?? trip.returnDepartureAt\n )\n .replace('{{arrive}}', formatDateTime(trip.returnArrivalAt) ?? '—')}\n </p>\n ) : null}\n </div>\n <span className=\"text-lg font-semibold tabular-nums text-text-primary\">\n {trip.currency} {Number(trip.price).toFixed(2)}\n </span>\n </li>\n );\n })}\n </ul>\n </GlassCard>\n )}\n </PageShell>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TripPlanDetailPage.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/pages/TripPlanDetailPage.tsx"],"names":[],"mappings":"AA6DA,wBAAgB,kBAAkB,gCAo2BjC"}
1
+ {"version":3,"file":"TripPlanDetailPage.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/pages/TripPlanDetailPage.tsx"],"names":[],"mappings":"AA8DA,wBAAgB,kBAAkB,gCAk3BjC"}