@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.
- package/dist/ggnomad/components/AvailabilityPanel.d.ts +15 -0
- package/dist/ggnomad/components/AvailabilityPanel.d.ts.map +1 -0
- package/dist/ggnomad/components/AvailabilityPanel.js +91 -0
- package/dist/ggnomad/components/AvailabilityPanel.js.map +1 -0
- package/dist/ggnomad/components/BookingPanel.d.ts +1 -3
- package/dist/ggnomad/components/BookingPanel.d.ts.map +1 -1
- package/dist/ggnomad/components/BookingPanel.js +91 -82
- package/dist/ggnomad/components/BookingPanel.js.map +1 -1
- package/dist/ggnomad/components/EcoAccessPanel.d.ts +17 -0
- package/dist/ggnomad/components/EcoAccessPanel.d.ts.map +1 -0
- package/dist/ggnomad/components/EcoAccessPanel.js +68 -0
- package/dist/ggnomad/components/EcoAccessPanel.js.map +1 -0
- package/dist/ggnomad/components/FactGrid.d.ts +18 -0
- package/dist/ggnomad/components/FactGrid.d.ts.map +1 -0
- package/dist/ggnomad/components/FactGrid.js +29 -0
- package/dist/ggnomad/components/FactGrid.js.map +1 -0
- package/dist/ggnomad/components/GroupTripPanel.d.ts +22 -0
- package/dist/ggnomad/components/GroupTripPanel.d.ts.map +1 -0
- package/dist/ggnomad/components/GroupTripPanel.js +350 -0
- package/dist/ggnomad/components/GroupTripPanel.js.map +1 -0
- package/dist/ggnomad/components/ListingFilters.d.ts +29 -0
- package/dist/ggnomad/components/ListingFilters.d.ts.map +1 -0
- package/dist/ggnomad/components/ListingFilters.js +164 -0
- package/dist/ggnomad/components/ListingFilters.js.map +1 -0
- package/dist/ggnomad/components/PhotoGallery.d.ts +15 -0
- package/dist/ggnomad/components/PhotoGallery.d.ts.map +1 -0
- package/dist/ggnomad/components/PhotoGallery.js +54 -0
- package/dist/ggnomad/components/PhotoGallery.js.map +1 -0
- package/dist/ggnomad/components/ProviderCard.d.ts +19 -0
- package/dist/ggnomad/components/ProviderCard.d.ts.map +1 -0
- package/dist/ggnomad/components/ProviderCard.js +66 -0
- package/dist/ggnomad/components/ProviderCard.js.map +1 -0
- package/dist/ggnomad/components/RatingSummary.d.ts +14 -0
- package/dist/ggnomad/components/RatingSummary.d.ts.map +1 -0
- package/dist/ggnomad/components/RatingSummary.js +32 -0
- package/dist/ggnomad/components/RatingSummary.js.map +1 -0
- package/dist/ggnomad/components/TagChips.d.ts +16 -0
- package/dist/ggnomad/components/TagChips.d.ts.map +1 -0
- package/dist/ggnomad/components/TagChips.js +20 -0
- package/dist/ggnomad/components/TagChips.js.map +1 -0
- package/dist/ggnomad/components/index.d.ts +13 -0
- package/dist/ggnomad/components/index.d.ts.map +1 -1
- package/dist/ggnomad/components/index.js +9 -0
- package/dist/ggnomad/graphql.d.ts +10 -0
- package/dist/ggnomad/graphql.d.ts.map +1 -1
- package/dist/ggnomad/graphql.js +308 -20
- package/dist/ggnomad/graphql.js.map +1 -1
- package/dist/ggnomad/pages/ActivityDetailsPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/ActivityDetailsPage.js +174 -86
- package/dist/ggnomad/pages/ActivityDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/AnalyticsPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/AnalyticsPage.js +109 -77
- package/dist/ggnomad/pages/AnalyticsPage.js.map +1 -1
- package/dist/ggnomad/pages/BookingsPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/BookingsPage.js +188 -137
- package/dist/ggnomad/pages/BookingsPage.js.map +1 -1
- package/dist/ggnomad/pages/DashboardPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/DashboardPage.js +245 -128
- package/dist/ggnomad/pages/DashboardPage.js.map +1 -1
- package/dist/ggnomad/pages/EntertainmentPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/EntertainmentPage.js +115 -53
- package/dist/ggnomad/pages/EntertainmentPage.js.map +1 -1
- package/dist/ggnomad/pages/EventDetailsPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/EventDetailsPage.js +170 -87
- package/dist/ggnomad/pages/EventDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/FavoritesPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/FavoritesPage.js +201 -84
- package/dist/ggnomad/pages/FavoritesPage.js.map +1 -1
- package/dist/ggnomad/pages/HospitalityPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/HospitalityPage.js +99 -56
- package/dist/ggnomad/pages/HospitalityPage.js.map +1 -1
- package/dist/ggnomad/pages/PropertyDetailsPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/PropertyDetailsPage.js +177 -93
- package/dist/ggnomad/pages/PropertyDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/ProviderPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/ProviderPage.js +112 -63
- package/dist/ggnomad/pages/ProviderPage.js.map +1 -1
- package/dist/ggnomad/pages/SearchPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/SearchPage.js +236 -65
- package/dist/ggnomad/pages/SearchPage.js.map +1 -1
- package/dist/ggnomad/pages/TourDetailsPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/TourDetailsPage.js +171 -86
- package/dist/ggnomad/pages/TourDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/TourismPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/TourismPage.js +108 -54
- package/dist/ggnomad/pages/TourismPage.js.map +1 -1
- package/dist/ggnomad/pages/TravelPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/TravelPage.js +406 -43
- package/dist/ggnomad/pages/TravelPage.js.map +1 -1
- package/dist/ggnomad/pages/TripPlanDetailPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/TripPlanDetailPage.js +93 -70
- package/dist/ggnomad/pages/TripPlanDetailPage.js.map +1 -1
- package/dist/ggnomad/utils/format.d.ts +47 -0
- package/dist/ggnomad/utils/format.d.ts.map +1 -0
- package/dist/ggnomad/utils/format.js +125 -0
- package/dist/ggnomad/utils/format.js.map +1 -0
- package/dist/stories/BookingPanel.stories.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { humanizeEnum as e } from "../utils/format.js";
|
|
2
|
+
import { cn as t } from "../utils/cn.js";
|
|
3
|
+
import { useState as n } from "react";
|
|
4
|
+
import { Accessibility as r, ChevronDown as i, RotateCcw as a, SlidersHorizontal as o } from "lucide-react";
|
|
5
|
+
import { useI18n as s } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
6
|
+
import { GlassCard as c } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
8
|
+
//#region src/ggnomad/components/ListingFilters.tsx
|
|
9
|
+
var d = [
|
|
10
|
+
"WHEELCHAIR_ACCESSIBLE",
|
|
11
|
+
"STEP_FREE_ENTRANCE",
|
|
12
|
+
"ELEVATOR_OR_LIFT",
|
|
13
|
+
"ACCESSIBLE_BEDROOM",
|
|
14
|
+
"ACCESSIBLE_RESTROOM",
|
|
15
|
+
"ROLL_IN_SHOWER",
|
|
16
|
+
"ACCESSIBLE_PARKING",
|
|
17
|
+
"SERVICE_ANIMAL_FRIENDLY",
|
|
18
|
+
"HEARING_AIDS",
|
|
19
|
+
"VISUAL_AIDS"
|
|
20
|
+
], f = [
|
|
21
|
+
"ACTIVE",
|
|
22
|
+
"PENDING_REVIEW",
|
|
23
|
+
"DRAFT",
|
|
24
|
+
"PAUSED",
|
|
25
|
+
"ARCHIVED"
|
|
26
|
+
], p = [
|
|
27
|
+
25,
|
|
28
|
+
50,
|
|
29
|
+
75
|
|
30
|
+
], m = { accessibilityFeatures: [] };
|
|
31
|
+
function h(e) {
|
|
32
|
+
return e.status !== void 0 || e.minSustainabilityScore !== void 0 || e.accessibilityFeatures.length > 0;
|
|
33
|
+
}
|
|
34
|
+
var g = "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";
|
|
35
|
+
function _({ idPrefix: _, value: v, onChange: y, resultCount: b }) {
|
|
36
|
+
let { t: x } = s(), [S, C] = n(v.accessibilityFeatures.length > 0), w = (e) => {
|
|
37
|
+
let t = v.accessibilityFeatures.includes(e) ? v.accessibilityFeatures.filter((t) => t !== e) : [...v.accessibilityFeatures, e];
|
|
38
|
+
y({
|
|
39
|
+
...v,
|
|
40
|
+
accessibilityFeatures: t
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
return /* @__PURE__ */ u(c, {
|
|
44
|
+
treatment: "plain",
|
|
45
|
+
className: "border-border-seam p-4",
|
|
46
|
+
children: [
|
|
47
|
+
/* @__PURE__ */ u("div", {
|
|
48
|
+
className: "flex flex-wrap items-center justify-between gap-3",
|
|
49
|
+
children: [/* @__PURE__ */ u("p", {
|
|
50
|
+
className: "inline-flex items-center gap-2 text-sm font-medium text-text-primary",
|
|
51
|
+
children: [
|
|
52
|
+
/* @__PURE__ */ l(o, {
|
|
53
|
+
className: "size-4 text-text-secondary",
|
|
54
|
+
"aria-hidden": "true"
|
|
55
|
+
}),
|
|
56
|
+
x("ggnomad.filters.title", "Filters"),
|
|
57
|
+
/* @__PURE__ */ l("span", {
|
|
58
|
+
className: "font-normal tabular-nums text-text-secondary",
|
|
59
|
+
children: x("ggnomad.filters.showing", "· {{n}} shown").replace("{{n}}", b.toLocaleString())
|
|
60
|
+
})
|
|
61
|
+
]
|
|
62
|
+
}), h(v) ? /* @__PURE__ */ u("button", {
|
|
63
|
+
type: "button",
|
|
64
|
+
onClick: () => y(m),
|
|
65
|
+
className: "inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-sm font-medium text-action-primary-bg hover:underline focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-action-primary-bg",
|
|
66
|
+
children: [/* @__PURE__ */ l(a, {
|
|
67
|
+
className: "size-3.5",
|
|
68
|
+
"aria-hidden": "true"
|
|
69
|
+
}), x("ggnomad.filters.clearAll", "Clear all")]
|
|
70
|
+
}) : null]
|
|
71
|
+
}),
|
|
72
|
+
/* @__PURE__ */ u("div", {
|
|
73
|
+
className: "mt-3 grid gap-3 sm:grid-cols-2 lg:grid-cols-3",
|
|
74
|
+
children: [
|
|
75
|
+
/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
|
|
76
|
+
htmlFor: `${_}-status`,
|
|
77
|
+
className: "block text-sm font-medium text-text-primary",
|
|
78
|
+
children: x("ggnomad.filters.status", "Listing status")
|
|
79
|
+
}), /* @__PURE__ */ u("select", {
|
|
80
|
+
id: `${_}-status`,
|
|
81
|
+
value: v.status ?? "",
|
|
82
|
+
onChange: (e) => y({
|
|
83
|
+
...v,
|
|
84
|
+
status: e.target.value ? e.target.value : void 0
|
|
85
|
+
}),
|
|
86
|
+
className: g,
|
|
87
|
+
children: [/* @__PURE__ */ l("option", {
|
|
88
|
+
value: "",
|
|
89
|
+
children: x("ggnomad.filters.anyStatus", "Any status")
|
|
90
|
+
}), f.map((t) => /* @__PURE__ */ l("option", {
|
|
91
|
+
value: t,
|
|
92
|
+
children: e(t)
|
|
93
|
+
}, t))]
|
|
94
|
+
})] }),
|
|
95
|
+
/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
|
|
96
|
+
htmlFor: `${_}-eco`,
|
|
97
|
+
className: "block text-sm font-medium text-text-primary",
|
|
98
|
+
children: x("ggnomad.filters.sustainability", "Min. sustainability score")
|
|
99
|
+
}), /* @__PURE__ */ u("select", {
|
|
100
|
+
id: `${_}-eco`,
|
|
101
|
+
value: v.minSustainabilityScore ?? "",
|
|
102
|
+
onChange: (e) => y({
|
|
103
|
+
...v,
|
|
104
|
+
minSustainabilityScore: e.target.value ? Number(e.target.value) : void 0
|
|
105
|
+
}),
|
|
106
|
+
className: g,
|
|
107
|
+
children: [/* @__PURE__ */ l("option", {
|
|
108
|
+
value: "",
|
|
109
|
+
children: x("ggnomad.filters.anyScore", "Any score")
|
|
110
|
+
}), p.map((e) => /* @__PURE__ */ l("option", {
|
|
111
|
+
value: e,
|
|
112
|
+
children: x("ggnomad.filters.scoreAtLeast", "{{n}}+").replace("{{n}}", String(e))
|
|
113
|
+
}, e))]
|
|
114
|
+
})] }),
|
|
115
|
+
/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("span", {
|
|
116
|
+
className: "block text-sm font-medium text-text-primary",
|
|
117
|
+
children: x("ggnomad.filters.accessibility", "Accessibility")
|
|
118
|
+
}), /* @__PURE__ */ u("button", {
|
|
119
|
+
type: "button",
|
|
120
|
+
onClick: () => C((e) => !e),
|
|
121
|
+
"aria-expanded": S,
|
|
122
|
+
className: t(g, "flex items-center justify-between gap-2 text-left hover:bg-bg-sunken"),
|
|
123
|
+
children: [/* @__PURE__ */ u("span", {
|
|
124
|
+
className: "inline-flex min-w-0 items-center gap-2",
|
|
125
|
+
children: [/* @__PURE__ */ l(r, {
|
|
126
|
+
className: "size-4 flex-shrink-0 text-text-secondary",
|
|
127
|
+
"aria-hidden": "true"
|
|
128
|
+
}), /* @__PURE__ */ l("span", {
|
|
129
|
+
className: "truncate",
|
|
130
|
+
children: v.accessibilityFeatures.length === 0 ? x("ggnomad.filters.anyAccessibility", "Any") : x("ggnomad.filters.accessibilitySelected", "{{n}} required").replace("{{n}}", String(v.accessibilityFeatures.length))
|
|
131
|
+
})]
|
|
132
|
+
}), /* @__PURE__ */ l(i, {
|
|
133
|
+
className: t("size-4 flex-shrink-0 transition-transform", S && "rotate-180"),
|
|
134
|
+
"aria-hidden": "true"
|
|
135
|
+
})]
|
|
136
|
+
})] })
|
|
137
|
+
]
|
|
138
|
+
}),
|
|
139
|
+
S ? /* @__PURE__ */ u("div", {
|
|
140
|
+
className: "mt-3 border-t border-border-seam pt-3",
|
|
141
|
+
children: [/* @__PURE__ */ l("p", {
|
|
142
|
+
className: "mb-2 text-xs text-text-secondary",
|
|
143
|
+
children: x("ggnomad.filters.accessibilityHint", "Only listings that declare every selected feature are returned. Features are self-reported by the provider.")
|
|
144
|
+
}), /* @__PURE__ */ l("ul", {
|
|
145
|
+
className: "flex flex-wrap gap-2",
|
|
146
|
+
children: d.map((n) => {
|
|
147
|
+
let r = v.accessibilityFeatures.includes(n);
|
|
148
|
+
return /* @__PURE__ */ l("li", { children: /* @__PURE__ */ l("button", {
|
|
149
|
+
type: "button",
|
|
150
|
+
"aria-pressed": r,
|
|
151
|
+
onClick: () => w(n),
|
|
152
|
+
className: t("rounded-full border px-3 py-1 text-sm transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-action-primary-bg", r ? "border-action-primary-bg bg-action-primary-bg text-action-primary-text" : "border-border-seam bg-bg-sunken text-text-primary hover:border-border-default"),
|
|
153
|
+
children: e(n)
|
|
154
|
+
}) }, n);
|
|
155
|
+
})
|
|
156
|
+
})]
|
|
157
|
+
}) : null
|
|
158
|
+
]
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
//#endregion
|
|
162
|
+
export { d as ACCESSIBILITY_FEATURES, m as EMPTY_LISTING_FILTERS, _ as ListingFilters, h as hasActiveListingFilters };
|
|
163
|
+
|
|
164
|
+
//# sourceMappingURL=ListingFilters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListingFilters.js","names":[],"sources":["../../../src/ggnomad/components/ListingFilters.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Accessibility, ChevronDown, RotateCcw, SlidersHorizontal } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\n\nimport { humanizeEnum } from '../utils/format';\nimport { cn } from '../utils/cn';\n\nexport type ListingStatusFilter = 'ACTIVE' | 'PENDING_REVIEW' | 'DRAFT' | 'PAUSED' | 'ARCHIVED';\n\n/** Every value of `GgnomadAccessibilityFeature` on the service schema (BOFF-4379). */\nexport const ACCESSIBILITY_FEATURES = [\n 'WHEELCHAIR_ACCESSIBLE',\n 'STEP_FREE_ENTRANCE',\n 'ELEVATOR_OR_LIFT',\n 'ACCESSIBLE_BEDROOM',\n 'ACCESSIBLE_RESTROOM',\n 'ROLL_IN_SHOWER',\n 'ACCESSIBLE_PARKING',\n 'SERVICE_ANIMAL_FRIENDLY',\n 'HEARING_AIDS',\n 'VISUAL_AIDS',\n] as const;\n\nconst STATUSES: ListingStatusFilter[] = ['ACTIVE', 'PENDING_REVIEW', 'DRAFT', 'PAUSED', 'ARCHIVED'];\n\nconst SUSTAINABILITY_THRESHOLDS = [25, 50, 75];\n\nexport interface ListingFilterState {\n /** `status` argument — undefined means \"every status\". */\n status?: ListingStatusFilter;\n /** `minSustainabilityScore` argument (0-100). */\n minSustainabilityScore?: number;\n /** `hasAccessibilityFeatures` argument — a listing must declare ALL of them. */\n accessibilityFeatures: string[];\n}\n\nexport const EMPTY_LISTING_FILTERS: ListingFilterState = { accessibilityFeatures: [] };\n\nexport function hasActiveListingFilters(value: ListingFilterState): boolean {\n return (\n value.status !== undefined ||\n value.minSustainabilityScore !== undefined ||\n value.accessibilityFeatures.length > 0\n );\n}\n\nconst SELECT_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\ninterface ListingFiltersProps {\n idPrefix: string;\n value: ListingFilterState;\n onChange: (next: ListingFilterState) => void;\n /** Number of rows currently rendered, shown next to the filter summary. */\n resultCount: number;\n}\n\n/**\n * Catalogue filter bar wired to the three filter arguments `ggnomadProperties`,\n * `ggnomadTours`, `ggnomadEvents` and `ggnomadActivities` actually accept —\n * `status`, `minSustainabilityScore` and `hasAccessibilityFeatures`. Every control\n * re-runs the query server-side; nothing here filters a page-local slice.\n */\nexport function ListingFilters({ idPrefix, value, onChange, resultCount }: ListingFiltersProps) {\n const { t } = useI18n();\n const [accessibilityOpen, setAccessibilityOpen] = useState(\n value.accessibilityFeatures.length > 0\n );\n\n const toggleFeature = (feature: string) => {\n const next = value.accessibilityFeatures.includes(feature)\n ? value.accessibilityFeatures.filter((item) => item !== feature)\n : [...value.accessibilityFeatures, feature];\n onChange({ ...value, accessibilityFeatures: next });\n };\n\n return (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <p className=\"inline-flex items-center gap-2 text-sm font-medium text-text-primary\">\n <SlidersHorizontal className=\"size-4 text-text-secondary\" aria-hidden=\"true\" />\n {t('ggnomad.filters.title', 'Filters')}\n <span className=\"font-normal tabular-nums text-text-secondary\">\n {t('ggnomad.filters.showing', '· {{n}} shown').replace(\n '{{n}}',\n resultCount.toLocaleString()\n )}\n </span>\n </p>\n {hasActiveListingFilters(value) ? (\n <button\n type=\"button\"\n onClick={() => onChange(EMPTY_LISTING_FILTERS)}\n className=\"inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-sm font-medium text-action-primary-bg hover:underline focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-action-primary-bg\"\n >\n <RotateCcw className=\"size-3.5\" aria-hidden=\"true\" />\n {t('ggnomad.filters.clearAll', 'Clear all')}\n </button>\n ) : null}\n </div>\n\n <div className=\"mt-3 grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n <div>\n <label\n htmlFor={`${idPrefix}-status`}\n className=\"block text-sm font-medium text-text-primary\"\n >\n {t('ggnomad.filters.status', 'Listing status')}\n </label>\n <select\n id={`${idPrefix}-status`}\n value={value.status ?? ''}\n onChange={(event) =>\n onChange({\n ...value,\n status: event.target.value\n ? (event.target.value as ListingStatusFilter)\n : undefined,\n })\n }\n className={SELECT_CLASSES}\n >\n <option value=\"\">{t('ggnomad.filters.anyStatus', 'Any status')}</option>\n {STATUSES.map((status) => (\n <option key={status} value={status}>\n {humanizeEnum(status)}\n </option>\n ))}\n </select>\n </div>\n\n <div>\n <label\n htmlFor={`${idPrefix}-eco`}\n className=\"block text-sm font-medium text-text-primary\"\n >\n {t('ggnomad.filters.sustainability', 'Min. sustainability score')}\n </label>\n <select\n id={`${idPrefix}-eco`}\n value={value.minSustainabilityScore ?? ''}\n onChange={(event) =>\n onChange({\n ...value,\n minSustainabilityScore: event.target.value ? Number(event.target.value) : undefined,\n })\n }\n className={SELECT_CLASSES}\n >\n <option value=\"\">{t('ggnomad.filters.anyScore', 'Any score')}</option>\n {SUSTAINABILITY_THRESHOLDS.map((threshold) => (\n <option key={threshold} value={threshold}>\n {t('ggnomad.filters.scoreAtLeast', '{{n}}+').replace('{{n}}', String(threshold))}\n </option>\n ))}\n </select>\n </div>\n\n <div>\n <span className=\"block text-sm font-medium text-text-primary\">\n {t('ggnomad.filters.accessibility', 'Accessibility')}\n </span>\n <button\n type=\"button\"\n onClick={() => setAccessibilityOpen((open) => !open)}\n aria-expanded={accessibilityOpen}\n className={cn(\n SELECT_CLASSES,\n 'flex items-center justify-between gap-2 text-left hover:bg-bg-sunken'\n )}\n >\n <span className=\"inline-flex min-w-0 items-center gap-2\">\n <Accessibility\n className=\"size-4 flex-shrink-0 text-text-secondary\"\n aria-hidden=\"true\"\n />\n <span className=\"truncate\">\n {value.accessibilityFeatures.length === 0\n ? t('ggnomad.filters.anyAccessibility', 'Any')\n : t('ggnomad.filters.accessibilitySelected', '{{n}} required').replace(\n '{{n}}',\n String(value.accessibilityFeatures.length)\n )}\n </span>\n </span>\n <ChevronDown\n className={cn(\n 'size-4 flex-shrink-0 transition-transform',\n accessibilityOpen && 'rotate-180'\n )}\n aria-hidden=\"true\"\n />\n </button>\n </div>\n </div>\n\n {accessibilityOpen ? (\n <div className=\"mt-3 border-t border-border-seam pt-3\">\n <p className=\"mb-2 text-xs text-text-secondary\">\n {t(\n 'ggnomad.filters.accessibilityHint',\n 'Only listings that declare every selected feature are returned. Features are self-reported by the provider.'\n )}\n </p>\n <ul className=\"flex flex-wrap gap-2\">\n {ACCESSIBILITY_FEATURES.map((feature) => {\n const selected = value.accessibilityFeatures.includes(feature);\n return (\n <li key={feature}>\n <button\n type=\"button\"\n aria-pressed={selected}\n onClick={() => toggleFeature(feature)}\n className={cn(\n 'rounded-full border px-3 py-1 text-sm transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-action-primary-bg',\n selected\n ? 'border-action-primary-bg bg-action-primary-bg text-action-primary-text'\n : 'border-border-seam bg-bg-sunken text-text-primary hover:border-border-default'\n )}\n >\n {humanizeEnum(feature)}\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n ) : null}\n </GlassCard>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface PhotoGalleryProps {
|
|
2
|
+
/** Every photo the listing publishes (`images: [String!]!` on the service schema). */
|
|
3
|
+
images: string[];
|
|
4
|
+
alt: string;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Listing hero + thumbnail strip. Detail pages used to render `images[0]` only and
|
|
9
|
+
* silently drop the rest of the array the query already returns; this shows the whole
|
|
10
|
+
* set and lets the reader page through it. Renders nothing when the listing published
|
|
11
|
+
* no photos — the caller falls back to `DetailHero`'s branded gradient.
|
|
12
|
+
*/
|
|
13
|
+
export declare function PhotoGallery({ images, alt, className }: PhotoGalleryProps): import("react").JSX.Element | null;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=PhotoGallery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhotoGallery.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/components/PhotoGallery.tsx"],"names":[],"mappings":"AAKA,UAAU,iBAAiB;IACzB,sFAAsF;IACtF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,iBAAiB,sCAwEzE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { useState as t } from "react";
|
|
3
|
+
import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
4
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
+
//#region src/ggnomad/components/PhotoGallery.tsx
|
|
6
|
+
function a({ images: a, alt: o, className: s }) {
|
|
7
|
+
let { t: c } = n(), l = a.join("|"), [u, d] = t({
|
|
8
|
+
index: 0,
|
|
9
|
+
signature: l
|
|
10
|
+
});
|
|
11
|
+
if (u.signature !== l && d({
|
|
12
|
+
index: 0,
|
|
13
|
+
signature: l
|
|
14
|
+
}), a.length === 0) return null;
|
|
15
|
+
let f = Math.min(u.index, a.length - 1);
|
|
16
|
+
return /* @__PURE__ */ i("div", {
|
|
17
|
+
className: e("mb-5 space-y-2", s),
|
|
18
|
+
children: [/* @__PURE__ */ i("div", {
|
|
19
|
+
className: "relative aspect-[21/9] w-full overflow-hidden rounded-card border border-border-seam",
|
|
20
|
+
children: [/* @__PURE__ */ r("img", {
|
|
21
|
+
src: a[f],
|
|
22
|
+
alt: a.length > 1 ? c("ggnomad.gallery.photoAlt", "{{name}} — photo {{n}} of {{total}}").replace("{{name}}", o).replace("{{n}}", String(f + 1)).replace("{{total}}", String(a.length)) : o,
|
|
23
|
+
loading: "eager",
|
|
24
|
+
decoding: "async",
|
|
25
|
+
className: "size-full object-cover"
|
|
26
|
+
}), /* @__PURE__ */ r("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/50 via-transparent to-transparent" })]
|
|
27
|
+
}), a.length > 1 ? /* @__PURE__ */ r("div", {
|
|
28
|
+
className: "flex gap-2 overflow-x-auto pb-1",
|
|
29
|
+
role: "group",
|
|
30
|
+
"aria-label": c("ggnomad.gallery.thumbnails", "Listing photos"),
|
|
31
|
+
children: a.map((t, n) => /* @__PURE__ */ r("button", {
|
|
32
|
+
type: "button",
|
|
33
|
+
onClick: () => d({
|
|
34
|
+
index: n,
|
|
35
|
+
signature: l
|
|
36
|
+
}),
|
|
37
|
+
"aria-current": n === f,
|
|
38
|
+
"aria-label": c("ggnomad.gallery.showPhoto", "Show photo {{n}}").replace("{{n}}", String(n + 1)),
|
|
39
|
+
className: e("h-16 w-24 flex-shrink-0 overflow-hidden rounded-md border transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-action-primary-bg", n === f ? "border-action-primary-bg" : "border-border-seam hover:border-border-default"),
|
|
40
|
+
children: /* @__PURE__ */ r("img", {
|
|
41
|
+
src: t,
|
|
42
|
+
alt: "",
|
|
43
|
+
loading: "lazy",
|
|
44
|
+
decoding: "async",
|
|
45
|
+
className: "size-full object-cover"
|
|
46
|
+
})
|
|
47
|
+
}, `${t}-${n}`))
|
|
48
|
+
}) : null]
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
export { a as PhotoGallery };
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=PhotoGallery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhotoGallery.js","names":[],"sources":["../../../src/ggnomad/components/PhotoGallery.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nimport { cn } from '../utils/cn';\n\ninterface PhotoGalleryProps {\n /** Every photo the listing publishes (`images: [String!]!` on the service schema). */\n images: string[];\n alt: string;\n className?: string;\n}\n\n/**\n * Listing hero + thumbnail strip. Detail pages used to render `images[0]` only and\n * silently drop the rest of the array the query already returns; this shows the whole\n * set and lets the reader page through it. Renders nothing when the listing published\n * no photos — the caller falls back to `DetailHero`'s branded gradient.\n */\nexport function PhotoGallery({ images, alt, className }: PhotoGalleryProps) {\n const { t } = useI18n();\n const signature = images.join('|');\n const [selection, setSelection] = useState({ index: 0, signature });\n\n // Navigating between two listings reuses this component instance, so the\n // selection is reset during render when the photo set itself changes rather\n // than in an effect (which would paint the previous listing's photo first).\n if (selection.signature !== signature) {\n setSelection({ index: 0, signature });\n }\n\n if (images.length === 0) return null;\n\n const safeIndex = Math.min(selection.index, images.length - 1);\n\n return (\n <div className={cn('mb-5 space-y-2', className)}>\n <div className=\"relative aspect-[21/9] w-full overflow-hidden rounded-card border border-border-seam\">\n <img\n src={images[safeIndex]}\n alt={\n images.length > 1\n ? t('ggnomad.gallery.photoAlt', '{{name}} — photo {{n}} of {{total}}')\n .replace('{{name}}', alt)\n .replace('{{n}}', String(safeIndex + 1))\n .replace('{{total}}', String(images.length))\n : alt\n }\n loading=\"eager\"\n decoding=\"async\"\n className=\"size-full object-cover\"\n />\n <div className=\"pointer-events-none absolute inset-0 bg-gradient-to-t from-black/50 via-transparent to-transparent\" />\n </div>\n\n {images.length > 1 ? (\n <div\n className=\"flex gap-2 overflow-x-auto pb-1\"\n role=\"group\"\n aria-label={t('ggnomad.gallery.thumbnails', 'Listing photos')}\n >\n {images.map((image, index) => (\n <button\n key={`${image}-${index}`}\n type=\"button\"\n onClick={() => setSelection({ index, signature })}\n aria-current={index === safeIndex}\n aria-label={t('ggnomad.gallery.showPhoto', 'Show photo {{n}}').replace(\n '{{n}}',\n String(index + 1)\n )}\n className={cn(\n 'h-16 w-24 flex-shrink-0 overflow-hidden rounded-md border transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-action-primary-bg',\n index === safeIndex\n ? 'border-action-primary-bg'\n : 'border-border-seam hover:border-border-default'\n )}\n >\n <img\n src={image}\n alt=\"\"\n loading=\"lazy\"\n decoding=\"async\"\n className=\"size-full object-cover\"\n />\n </button>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;AAkBA,SAAgB,EAAa,EAAE,WAAQ,QAAK,gBAAgC;CAC1E,IAAM,EAAE,SAAM,EAAQ,GAChB,IAAY,EAAO,KAAK,GAAG,GAC3B,CAAC,GAAW,KAAgB,EAAS;EAAE,OAAO;EAAG;CAAU,CAAC;CASlE,IAJI,EAAU,cAAc,KAC1B,EAAa;EAAE,OAAO;EAAG;CAAU,CAAC,GAGlC,EAAO,WAAW,GAAG,OAAO;CAEhC,IAAM,IAAY,KAAK,IAAI,EAAU,OAAO,EAAO,SAAS,CAAC;CAE7D,OACE,kBAAC,OAAD;EAAK,WAAW,EAAG,kBAAkB,CAAS;YAA9C,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IACE,KAAK,EAAO;IACZ,KACE,EAAO,SAAS,IACZ,EAAE,4BAA4B,qCAAqC,EAChE,QAAQ,YAAY,CAAG,EACvB,QAAQ,SAAS,OAAO,IAAY,CAAC,CAAC,EACtC,QAAQ,aAAa,OAAO,EAAO,MAAM,CAAC,IAC7C;IAEN,SAAQ;IACR,UAAS;IACT,WAAU;GACX,CAAA,GACD,kBAAC,OAAD,EAAK,WAAU,qGAAsG,CAAA,CAClH;MAEJ,EAAO,SAAS,IACf,kBAAC,OAAD;GACE,WAAU;GACV,MAAK;GACL,cAAY,EAAE,8BAA8B,gBAAgB;aAE3D,EAAO,KAAK,GAAO,MAClB,kBAAC,UAAD;IAEE,MAAK;IACL,eAAe,EAAa;KAAE;KAAO;IAAU,CAAC;IAChD,gBAAc,MAAU;IACxB,cAAY,EAAE,6BAA6B,kBAAkB,EAAE,QAC7D,SACA,OAAO,IAAQ,CAAC,CAClB;IACA,WAAW,EACT,oMACA,MAAU,IACN,6BACA,gDACN;cAEA,kBAAC,OAAD;KACE,KAAK;KACL,KAAI;KACJ,SAAQ;KACR,UAAS;KACT,WAAU;IACX,CAAA;GACK,GAtBD,GAAG,EAAM,GAAG,GAsBX,CACT;EACE,CAAA,IACH,IACD;;AAET"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface ListingProvider {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
type?: string | null;
|
|
5
|
+
rating?: number | null;
|
|
6
|
+
reviewCount?: number | null;
|
|
7
|
+
listingCount?: number | null;
|
|
8
|
+
contactEmail?: string | null;
|
|
9
|
+
website?: string | null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* "Hosted by" panel for a listing detail page. Every field comes from the
|
|
13
|
+
* `GgnomadProvider` the listing already resolves through its `provider` edge; each
|
|
14
|
+
* line is omitted when the provider record does not carry it.
|
|
15
|
+
*/
|
|
16
|
+
export declare function ProviderCard({ provider }: {
|
|
17
|
+
provider: ListingProvider;
|
|
18
|
+
}): import("react").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=ProviderCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderCard.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/components/ProviderCard.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,eAAe,CAAA;CAAE,+BAwDvE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { SectionCard as e } from "./SectionCard.js";
|
|
2
|
+
import { RatingSummary as t } from "./RatingSummary.js";
|
|
3
|
+
import { Building2 as n, Globe as r, Mail as i } from "lucide-react";
|
|
4
|
+
import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
5
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
6
|
+
//#region src/ggnomad/components/ProviderCard.tsx
|
|
7
|
+
function c({ provider: c }) {
|
|
8
|
+
let { t: l } = a();
|
|
9
|
+
return /* @__PURE__ */ o(e, {
|
|
10
|
+
title: l("ggnomad.providerCard.title", "Hosted by"),
|
|
11
|
+
children: /* @__PURE__ */ s("div", {
|
|
12
|
+
className: "flex items-start gap-3",
|
|
13
|
+
children: [/* @__PURE__ */ o("span", {
|
|
14
|
+
className: "flex size-11 flex-shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-text-primary",
|
|
15
|
+
"aria-hidden": "true",
|
|
16
|
+
children: /* @__PURE__ */ o(n, { className: "size-5" })
|
|
17
|
+
}), /* @__PURE__ */ s("div", {
|
|
18
|
+
className: "min-w-0 space-y-1",
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ o("p", {
|
|
21
|
+
className: "truncate font-medium text-text-primary",
|
|
22
|
+
children: c.name
|
|
23
|
+
}),
|
|
24
|
+
/* @__PURE__ */ s("div", {
|
|
25
|
+
className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-text-secondary",
|
|
26
|
+
children: [
|
|
27
|
+
c.type ? /* @__PURE__ */ o("span", { children: c.type }) : null,
|
|
28
|
+
c.listingCount !== null && c.listingCount !== void 0 ? /* @__PURE__ */ o("span", {
|
|
29
|
+
className: "tabular-nums",
|
|
30
|
+
children: c.listingCount === 1 ? l("ggnomad.providerCard.oneListing", "1 listing") : l("ggnomad.providerCard.listings", "{{n}} listings").replace("{{n}}", c.listingCount.toLocaleString())
|
|
31
|
+
}) : null,
|
|
32
|
+
/* @__PURE__ */ o(t, {
|
|
33
|
+
rating: c.rating,
|
|
34
|
+
reviewCount: c.reviewCount
|
|
35
|
+
})
|
|
36
|
+
]
|
|
37
|
+
}),
|
|
38
|
+
c.contactEmail || c.website ? /* @__PURE__ */ s("div", {
|
|
39
|
+
className: "flex flex-wrap items-center gap-x-4 gap-y-1 pt-1 text-sm",
|
|
40
|
+
children: [c.contactEmail ? /* @__PURE__ */ s("a", {
|
|
41
|
+
href: `mailto:${c.contactEmail}`,
|
|
42
|
+
className: "inline-flex items-center gap-1.5 text-action-primary-bg hover:underline",
|
|
43
|
+
children: [/* @__PURE__ */ o(i, {
|
|
44
|
+
className: "size-3.5",
|
|
45
|
+
"aria-hidden": "true"
|
|
46
|
+
}), c.contactEmail]
|
|
47
|
+
}) : null, c.website ? /* @__PURE__ */ s("a", {
|
|
48
|
+
href: c.website,
|
|
49
|
+
target: "_blank",
|
|
50
|
+
rel: "noreferrer noopener",
|
|
51
|
+
className: "inline-flex items-center gap-1.5 text-action-primary-bg hover:underline",
|
|
52
|
+
children: [/* @__PURE__ */ o(r, {
|
|
53
|
+
className: "size-3.5",
|
|
54
|
+
"aria-hidden": "true"
|
|
55
|
+
}), l("ggnomad.providerCard.website", "Website")]
|
|
56
|
+
}) : null]
|
|
57
|
+
}) : null
|
|
58
|
+
]
|
|
59
|
+
})]
|
|
60
|
+
})
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
export { c as ProviderCard };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=ProviderCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderCard.js","names":[],"sources":["../../../src/ggnomad/components/ProviderCard.tsx"],"sourcesContent":["import { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Building2, Globe, Mail } from 'lucide-react';\n\nimport { RatingSummary } from './RatingSummary';\nimport { SectionCard } from './SectionCard';\n\nexport interface ListingProvider {\n id: string;\n name: string;\n type?: string | null;\n rating?: number | null;\n reviewCount?: number | null;\n listingCount?: number | null;\n contactEmail?: string | null;\n website?: string | null;\n}\n\n/**\n * \"Hosted by\" panel for a listing detail page. Every field comes from the\n * `GgnomadProvider` the listing already resolves through its `provider` edge; each\n * line is omitted when the provider record does not carry it.\n */\nexport function ProviderCard({ provider }: { provider: ListingProvider }) {\n const { t } = useI18n();\n\n return (\n <SectionCard title={t('ggnomad.providerCard.title', 'Hosted by')}>\n <div className=\"flex items-start gap-3\">\n <span\n className=\"flex size-11 flex-shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-text-primary\"\n aria-hidden=\"true\"\n >\n <Building2 className=\"size-5\" />\n </span>\n <div className=\"min-w-0 space-y-1\">\n <p className=\"truncate font-medium text-text-primary\">{provider.name}</p>\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-text-secondary\">\n {provider.type ? <span>{provider.type}</span> : null}\n {provider.listingCount !== null && provider.listingCount !== undefined ? (\n <span className=\"tabular-nums\">\n {provider.listingCount === 1\n ? t('ggnomad.providerCard.oneListing', '1 listing')\n : t('ggnomad.providerCard.listings', '{{n}} listings').replace(\n '{{n}}',\n provider.listingCount.toLocaleString()\n )}\n </span>\n ) : null}\n <RatingSummary rating={provider.rating} reviewCount={provider.reviewCount} />\n </div>\n {provider.contactEmail || provider.website ? (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 pt-1 text-sm\">\n {provider.contactEmail ? (\n <a\n href={`mailto:${provider.contactEmail}`}\n className=\"inline-flex items-center gap-1.5 text-action-primary-bg hover:underline\"\n >\n <Mail className=\"size-3.5\" aria-hidden=\"true\" />\n {provider.contactEmail}\n </a>\n ) : null}\n {provider.website ? (\n <a\n href={provider.website}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex items-center gap-1.5 text-action-primary-bg hover:underline\"\n >\n <Globe className=\"size-3.5\" aria-hidden=\"true\" />\n {t('ggnomad.providerCard.website', 'Website')}\n </a>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n </SectionCard>\n );\n}\n"],"mappings":";;;;;;AAsBA,SAAgB,EAAa,EAAE,eAA2C;CACxE,IAAM,EAAE,SAAM,EAAQ;CAEtB,OACE,kBAAC,GAAD;EAAa,OAAO,EAAE,8BAA8B,WAAW;YAC7D,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,QAAD;IACE,WAAU;IACV,eAAY;cAEZ,kBAAC,GAAD,EAAW,WAAU,SAAU,CAAA;GAC3B,CAAA,GACN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,KAAD;MAAG,WAAU;gBAA0C,EAAS;KAAQ,CAAA;KACxE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACG,EAAS,OAAO,kBAAC,QAAD,EAAA,UAAO,EAAS,KAAW,CAAA,IAAI;OAC/C,EAAS,iBAAiB,QAAQ,EAAS,iBAAiB,KAAA,IAC3D,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAS,iBAAiB,IACvB,EAAE,mCAAmC,WAAW,IAChD,EAAE,iCAAiC,gBAAgB,EAAE,QACnD,SACA,EAAS,aAAa,eAAe,CACvC;OACA,CAAA,IACJ;OACJ,kBAAC,GAAD;QAAe,QAAQ,EAAS;QAAQ,aAAa,EAAS;OAAc,CAAA;MACzE;;KACJ,EAAS,gBAAgB,EAAS,UACjC,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACG,EAAS,eACR,kBAAC,KAAD;OACE,MAAM,UAAU,EAAS;OACzB,WAAU;iBAFZ,CAIE,kBAAC,GAAD;QAAM,WAAU;QAAW,eAAY;OAAQ,CAAA,GAC9C,EAAS,YACT;WACD,MACH,EAAS,UACR,kBAAC,KAAD;OACE,MAAM,EAAS;OACf,QAAO;OACP,KAAI;OACJ,WAAU;iBAJZ,CAME,kBAAC,GAAD;QAAO,WAAU;QAAW,eAAY;OAAQ,CAAA,GAC/C,EAAE,gCAAgC,SAAS,CAC3C;WACD,IACD;UACH;IACD;KACF;;CACM,CAAA;AAEjB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface RatingSummaryProps {
|
|
2
|
+
/** `rating` is nullable on every GGNomad listing type — null means "not rated yet". */
|
|
3
|
+
rating?: number | null;
|
|
4
|
+
reviewCount?: number | null;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Rating + review count, the pair every listing type carries (`rating: Float`,
|
|
9
|
+
* `reviewCount: Int!`). Shows the unrated state explicitly instead of printing a
|
|
10
|
+
* misleading zero.
|
|
11
|
+
*/
|
|
12
|
+
export declare function RatingSummary({ rating, reviewCount, className }: RatingSummaryProps): import("react").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=RatingSummary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RatingSummary.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/components/RatingSummary.tsx"],"names":[],"mappings":"AAKA,UAAU,kBAAkB;IAC1B,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,kBAAkB,+BA0BnF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { Star as t } from "lucide-react";
|
|
3
|
+
import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
4
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
+
//#region src/ggnomad/components/RatingSummary.tsx
|
|
6
|
+
function a({ rating: a, reviewCount: o, className: s }) {
|
|
7
|
+
let { t: c } = n(), l = o ?? 0;
|
|
8
|
+
return a == null ? /* @__PURE__ */ r("span", {
|
|
9
|
+
className: e("text-sm text-text-secondary", s),
|
|
10
|
+
children: c("ggnomad.rating.none", "Not rated yet")
|
|
11
|
+
}) : /* @__PURE__ */ i("span", {
|
|
12
|
+
className: e("inline-flex items-center gap-1.5 text-sm", s),
|
|
13
|
+
children: [
|
|
14
|
+
/* @__PURE__ */ r(t, {
|
|
15
|
+
className: "size-3.5 fill-status-warning-text text-status-warning-text",
|
|
16
|
+
"aria-hidden": "true"
|
|
17
|
+
}),
|
|
18
|
+
/* @__PURE__ */ r("span", {
|
|
19
|
+
className: "font-medium tabular-nums text-text-primary",
|
|
20
|
+
children: a.toFixed(1)
|
|
21
|
+
}),
|
|
22
|
+
/* @__PURE__ */ r("span", {
|
|
23
|
+
className: "tabular-nums text-text-secondary",
|
|
24
|
+
children: l === 1 ? c("ggnomad.rating.oneReview", "(1 review)") : c("ggnomad.rating.reviews", "({{n}} reviews)").replace("{{n}}", l.toLocaleString())
|
|
25
|
+
})
|
|
26
|
+
]
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
30
|
+
export { a as RatingSummary };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=RatingSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RatingSummary.js","names":[],"sources":["../../../src/ggnomad/components/RatingSummary.tsx"],"sourcesContent":["import { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Star } from 'lucide-react';\n\nimport { cn } from '../utils/cn';\n\ninterface RatingSummaryProps {\n /** `rating` is nullable on every GGNomad listing type — null means \"not rated yet\". */\n rating?: number | null;\n reviewCount?: number | null;\n className?: string;\n}\n\n/**\n * Rating + review count, the pair every listing type carries (`rating: Float`,\n * `reviewCount: Int!`). Shows the unrated state explicitly instead of printing a\n * misleading zero.\n */\nexport function RatingSummary({ rating, reviewCount, className }: RatingSummaryProps) {\n const { t } = useI18n();\n const count = reviewCount ?? 0;\n\n if (rating === null || rating === undefined) {\n return (\n <span className={cn('text-sm text-text-secondary', className)}>\n {t('ggnomad.rating.none', 'Not rated yet')}\n </span>\n );\n }\n\n return (\n <span className={cn('inline-flex items-center gap-1.5 text-sm', className)}>\n <Star\n className=\"size-3.5 fill-status-warning-text text-status-warning-text\"\n aria-hidden=\"true\"\n />\n <span className=\"font-medium tabular-nums text-text-primary\">{rating.toFixed(1)}</span>\n <span className=\"tabular-nums text-text-secondary\">\n {count === 1\n ? t('ggnomad.rating.oneReview', '(1 review)')\n : t('ggnomad.rating.reviews', '({{n}} reviews)').replace('{{n}}', count.toLocaleString())}\n </span>\n </span>\n );\n}\n"],"mappings":";;;;;AAiBA,SAAgB,EAAc,EAAE,WAAQ,gBAAa,gBAAiC;CACpF,IAAM,EAAE,SAAM,EAAQ,GAChB,IAAQ,KAAe;CAU7B,OARI,KAAW,OAEX,kBAAC,QAAD;EAAM,WAAW,EAAG,+BAA+B,CAAS;YACzD,EAAE,uBAAuB,eAAe;CACrC,CAAA,IAKR,kBAAC,QAAD;EAAM,WAAW,EAAG,4CAA4C,CAAS;YAAzE;GACE,kBAAC,GAAD;IACE,WAAU;IACV,eAAY;GACb,CAAA;GACD,kBAAC,QAAD;IAAM,WAAU;cAA8C,EAAO,QAAQ,CAAC;GAAQ,CAAA;GACtF,kBAAC,QAAD;IAAM,WAAU;cACb,MAAU,IACP,EAAE,4BAA4B,YAAY,IAC1C,EAAE,0BAA0B,iBAAiB,EAAE,QAAQ,SAAS,EAAM,eAAe,CAAC;GACtF,CAAA;EACF;;AAEV"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
interface TagChipsProps {
|
|
4
|
+
items: string[];
|
|
5
|
+
/** Optional leading glyph repeated on every chip. */
|
|
6
|
+
icon?: ReactNode;
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Flat chip row for a listing's string list fields — amenities, inclusions,
|
|
11
|
+
* requirements, languages, accessibility features, sustainability practices.
|
|
12
|
+
* Renders nothing for an empty list so callers can skip the surrounding section.
|
|
13
|
+
*/
|
|
14
|
+
export declare function TagChips({ items, icon, className }: TagChipsProps): import("react").JSX.Element | null;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=TagChips.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TagChips.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/components/TagChips.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qDAAqD;IACrD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,aAAa,sCAmBjE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
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/TagChips.tsx
|
|
4
|
+
function r({ items: r, icon: i, className: a }) {
|
|
5
|
+
return r.length === 0 ? null : /* @__PURE__ */ t("ul", {
|
|
6
|
+
className: e("flex flex-wrap gap-2", a),
|
|
7
|
+
children: r.map((e) => /* @__PURE__ */ n("li", {
|
|
8
|
+
className: "inline-flex items-center gap-1.5 rounded-full border border-border-seam bg-bg-sunken px-3 py-1 text-sm text-text-primary",
|
|
9
|
+
children: [i ? /* @__PURE__ */ t("span", {
|
|
10
|
+
className: "flex-shrink-0 text-text-secondary [&>svg]:size-3.5",
|
|
11
|
+
"aria-hidden": "true",
|
|
12
|
+
children: i
|
|
13
|
+
}) : null, e]
|
|
14
|
+
}, e))
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { r as TagChips };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=TagChips.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TagChips.js","names":[],"sources":["../../../src/ggnomad/components/TagChips.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { cn } from '../utils/cn';\n\ninterface TagChipsProps {\n items: string[];\n /** Optional leading glyph repeated on every chip. */\n icon?: ReactNode;\n className?: string;\n}\n\n/**\n * Flat chip row for a listing's string list fields — amenities, inclusions,\n * requirements, languages, accessibility features, sustainability practices.\n * Renders nothing for an empty list so callers can skip the surrounding section.\n */\nexport function TagChips({ items, icon, className }: TagChipsProps) {\n if (items.length === 0) return null;\n return (\n <ul className={cn('flex flex-wrap gap-2', className)}>\n {items.map((item) => (\n <li\n key={item}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-border-seam bg-bg-sunken px-3 py-1 text-sm text-text-primary\"\n >\n {icon ? (\n <span className=\"flex-shrink-0 text-text-secondary [&>svg]:size-3.5\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n {item}\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":";;;AAgBA,SAAgB,EAAS,EAAE,UAAO,SAAM,gBAA4B;CAElE,OADI,EAAM,WAAW,IAAU,OAE7B,kBAAC,MAAD;EAAI,WAAW,EAAG,wBAAwB,CAAS;YAChD,EAAM,KAAK,MACV,kBAAC,MAAD;GAEE,WAAU;aAFZ,CAIG,IACC,kBAAC,QAAD;IAAM,WAAU;IAAqD,eAAY;cAC9E;GACG,CAAA,IACJ,MACH,CACC;KATG,CASH,CACL;CACC,CAAA;AAER"}
|
|
@@ -13,4 +13,17 @@ export { TicketDialog } from './TicketDialog';
|
|
|
13
13
|
export type { GgnomadTicket } from './TicketDialog';
|
|
14
14
|
export { RedeemTicketPanel } from './RedeemTicketPanel';
|
|
15
15
|
export { AuditTrailDialog } from './AuditTrailDialog';
|
|
16
|
+
export { PhotoGallery } from './PhotoGallery';
|
|
17
|
+
export { TagChips } from './TagChips';
|
|
18
|
+
export { FactGrid } from './FactGrid';
|
|
19
|
+
export type { Fact } from './FactGrid';
|
|
20
|
+
export { RatingSummary } from './RatingSummary';
|
|
21
|
+
export { EcoAccessPanel } from './EcoAccessPanel';
|
|
22
|
+
export { ProviderCard } from './ProviderCard';
|
|
23
|
+
export type { ListingProvider } from './ProviderCard';
|
|
24
|
+
export { AvailabilityPanel } from './AvailabilityPanel';
|
|
25
|
+
export { ListingFilters, ACCESSIBILITY_FEATURES, EMPTY_LISTING_FILTERS, hasActiveListingFilters, } from './ListingFilters';
|
|
26
|
+
export type { ListingFilterState, ListingStatusFilter } from './ListingFilters';
|
|
27
|
+
export { GroupTripPanel } from './GroupTripPanel';
|
|
28
|
+
export type { GroupTripItem } from './GroupTripPanel';
|
|
16
29
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -12,3 +12,12 @@ import "./CreateTravelPolicyDialog.js";
|
|
|
12
12
|
import "./TicketDialog.js";
|
|
13
13
|
import "./RedeemTicketPanel.js";
|
|
14
14
|
import "./AuditTrailDialog.js";
|
|
15
|
+
import "./PhotoGallery.js";
|
|
16
|
+
import "./TagChips.js";
|
|
17
|
+
import "./FactGrid.js";
|
|
18
|
+
import "./RatingSummary.js";
|
|
19
|
+
import "./EcoAccessPanel.js";
|
|
20
|
+
import "./ProviderCard.js";
|
|
21
|
+
import "./AvailabilityPanel.js";
|
|
22
|
+
import "./ListingFilters.js";
|
|
23
|
+
import "./GroupTripPanel.js";
|
|
@@ -76,4 +76,14 @@ export declare const CREATE_GGNOMAD_OPERATOR_STOREFRONT_MUTATION: import('graphq
|
|
|
76
76
|
export declare const UPDATE_GGNOMAD_OPERATOR_STOREFRONT_MUTATION: import('graphql').DocumentNode;
|
|
77
77
|
export declare const PUBLISH_GGNOMAD_OPERATOR_STOREFRONT_MUTATION: import('graphql').DocumentNode;
|
|
78
78
|
export declare const UNPUBLISH_GGNOMAD_OPERATOR_STOREFRONT_MUTATION: import('graphql').DocumentNode;
|
|
79
|
+
export declare const GGNOMAD_BOOKING_SLOTS_QUERY: import('graphql').DocumentNode;
|
|
80
|
+
export declare const GGNOMAD_TRANSPORT_SEARCH_QUERY: import('graphql').DocumentNode;
|
|
81
|
+
export declare const CREATE_GGNOMAD_TRIP_MUTATION: import('graphql').DocumentNode;
|
|
82
|
+
export declare const GGNOMAD_MY_GROUP_TRIPS_QUERY: import('graphql').DocumentNode;
|
|
83
|
+
export declare const GGNOMAD_GROUP_TRIP_COST_SPLIT_QUERY: import('graphql').DocumentNode;
|
|
84
|
+
export declare const GGNOMAD_GROUP_TRIP_VOTES_QUERY: import('graphql').DocumentNode;
|
|
85
|
+
export declare const CREATE_GGNOMAD_GROUP_TRIP_MUTATION: import('graphql').DocumentNode;
|
|
86
|
+
export declare const ADD_GGNOMAD_GROUP_TRIP_MEMBER_MUTATION: import('graphql').DocumentNode;
|
|
87
|
+
export declare const REMOVE_GGNOMAD_GROUP_TRIP_MEMBER_MUTATION: import('graphql').DocumentNode;
|
|
88
|
+
export declare const VOTE_GGNOMAD_TRIP_PLAN_ITEM_MUTATION: import('graphql').DocumentNode;
|
|
79
89
|
//# sourceMappingURL=graphql.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../src/ggnomad/graphql.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../src/ggnomad/graphql.ts"],"names":[],"mappings":"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"}
|